'SHA1'에 해당되는 글 2건

  1. 2010.07.06 [ CodeGate 2010 ] Challlenge 15 풀이
  2. 2010.06.22 [ CodeGate 2010 ] Challenge 8

2010.07.06 18:59 WarGame

이 분야 문제는 바이너리로 남아있는 것도 아니고 삽질하면서 풀어보기도 불가능하네요

혼자 삽질해도 풀수 있을지 없을지도 의문이지만..

대회 끝나고 문제소스 등을 공개해주신다면 공부하는데 한결 수월할 것 같은데 말이죠

이번 문제 또한 자력으로 푼게 아니라 , 다른 사이트에 올라온 풀이를 보고 

제가  나름대로 정리하여 올렸음을 알립니다

갈수록 주인장의 잉여력이 묻어나는 군요

또한, 그림은 Wiki 와

http://netifera.com/research/flickr_api_signature_forgery.pdf

 에서 퍼왔음을 명시합니다

이러한 문제를 풀때마다 느끼는 거지만 정말 보안 분야는 넓네요

너무나 다양한 방법이 있고, 그 방법 마저 지속적으로 갱신되고 있으니까요


각설하고, 문제 풀이 들어갑니다

이번 문제는 8번 문제와 비슷합니다

input 값을 주면 그에 해당하는 Cookie 가 생성되고

이 Cookie 를 토대로 웹페이지에서 복호화하여 답인지 아닌지 체크 하는 형식이죠

input 에 aaaa를 넣는다면 다음과 같은 Cookie 가 생성됩니다

web1_auth = YWFhYXwx|8f5c14cc7c1cd461f35b190af57927d1c377997e


그리고 “Welcome back, aaaa! You are not the administrator.”

와 같은 메시지가 출력되죠

Cookie 는 | 를 기준으로 두 파트로 나눌수 있는데

첫번째 파트는 aaaa|1의 Base64 encoding 결과 입니다

두번째는 input 값에 길이가 달라지지도 않고

구성 문자 형식으로 볼때 hash 값이라는 것을 예측할 수 있습니다

길이가 40 이라는 것으로 sha1 으로 좁힐 수 있습니다

sha1 이나 md5 모두 Padding Attack  다른 용어로 length-extention Attack 에 취약합니다

이를 설명하자면.. Key 값인 m\, 자체를 몰라도   h(m)\, 과  len(m)\,  이 주어진다면

h (m||m')\,  을 알아낼 수 있다는 것입니다
 
|| 는 그냥 문자열의 연속이라고 보시면 되구요

이때 padding , extention 은 이 암호화 연산이 Block 단위로 이루어지기 때문에 마지막 Block 을 채워 넣는다고 하는데서

유래된걸로 보입니다

이를 나타내면 다음과 같겠죠




Sha1 의 Block Size는 512bit , 그러니까 64byte가 되겠죠



이를 시험해봅시다

위 참조 사이트에 있는 소스를 긁어서 보겠습니다



이때 필요한 sha1 hash를 수행하는 파일은


수행해보시면 아실수 있겠지만

orig_msg 의 길이는 25 이고

extention 이 적용된 msg 의 길이는 55 인것을 알 수 있습니다

여기에 key 의 길이 9를 합하면 64byte죠

즉 한 Block 을 채운것을 볼 수 있습니다





즉 extension 한 뒤에

add 함수를 이용하여 update 를 호출함으로써

새로 블럭을 생성하여 완성한다는 것입니다

물론 sha1, md5 등의 함수는 길이가 고정되어 있기 때문에

단순히 생성된 블럭을 이어 붙인다는게 아니라

완전히 다른 값이 생성되게 됩니다

아무튼 이렇게 생성을 하게 되면

key값을 모르더라도 key+orig_msg+padding+new_msg 의 Hash 함수를 구할 수 있게 되죠

인증 방식이 <name> | <role> 이기 때문에 가능한 방식입니다

만약 <role> | <name> 이었다면 이 공격 방식은 성공하지 않았겠죠


입력값으로 aaaa를  넣은 cookie 를 이용한다고 했을때

여기서 우리가 입력할 name 은  'aaaa|1'+<paddingggggggg>+'|0' 인 것입니다

|0 까지를 입력한 name 으로 인식하게 하려는 것이죠

실제로 나온 base64 Encoding 값인

YWFhYXwxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4fDA= 

을 decoding 시켜보면  

 aaaa|1€                               ?0

가 나오게 됩니다

이렇게 나온 Signal 값인  70f8bf57aa6d7faaa70ef17e763ef2578cb8d839 을 넣으면

인증을 통과하게 됩니다

재밌지 않나요? :D

'WarGame' 카테고리의 다른 글

ISEC 2009 Challenge 12 Solution  (0) 2010.08.23
ISEC 2009 Challenge6 with GOT OverWrite  (0) 2010.08.22
[ CodeGate 2010 ] Challlenge 15 풀이  (0) 2010.07.06
[ CodeGate 2010 ] Challenge 8  (0) 2010.06.22
[ CodeGate 2010 ] Challenge 7 풀이  (2) 2010.06.21
[ Python Challenge ] level 15  (0) 2010.06.08
Posted by LinkC

2010.06.22 18:50 WarGame


요즘 암호화 문제가 눈에 많이 띄네요

글쓴이의 얕은 지식으로는 못푸는 문제가 산더미같이 많군요

게다가 이번 문제는 바이너리가 아니라 웹 기반의 암호화 문제라 나중에 풀어보는 저로써는

답답하기만 했는데 , 이참에 8번 문제 풀이를 보고 정리하여 포스팅 합니다

참조한 풀이는


입니다

문제는 굉장히 심플했던 걸로 기억합니다

이 문제와 다른 한문제가 비슷한 유형이었던걸로 기억하는데요

아이디를 입력하고 로그인을 누르면 , 일정한 방법으로 쿠키가 생성되고

해당 페이지에서는 그 쿠키를 복호화 하여 로그인한 유저가 admin 인지 아닌지를 가려냅니다

이 쿠키값을 받은 페이지의 출력 결과는

Welcome back, <input>! Your role is: user.

입니다.

문제의 핵심은 쿠키가 어떤 방식으로 생성되는냐 

이겠죠

대략적인 쿠키의 모습은 다음과 같습니다

web4_auth=1vf2EJ15hKzkIxqB27w0AA==|5X5A0e3r48gXhUXZHEKBa5dpC+Xfd\

== 만 보고도 바로 base64 라는 생각이 듭니다

뒤 숫자 모두 base64 범위내의 문자로군요

일단 복호화 시켜보면 알 수 없는 문자만이 난무합니다

중간에 한번더 암호화 되었다는거겠죠

여기서, 문제 풀이 전에 주어진 힌트를 살펴보자면..

the first part is just an IV“.


IV. 로마숫자로 4를 의미하고 정맥의.. 뭐 이런 저런 뜻을 가지고 있는데

우리가 원하는 의미와는 좀 어긋난거 같네요

좀더 좁혀보고자.. IV crypto  라고 구글링을 해보면

뭔가 제대로 짚은거 같네요

In cryptography, an initialization vector (IV) is a block of bits that is required to allow a stream cipher or a block cipher to be executed in any of several modes of operation to produce a unique stream independent from other streams produced by the same encryption key, without having to go through a (usually lengthy) re-keying process

Block cipher 에서 사용되는 초기화 벡터를 나타내는 것이었군요

Block cipher 의 경우 저번에 포스팅 했었죠

그중에서 IV를 사용하는 방식을 살펴보자면..

CBC, CFB 등 여러가지가 있네요

웹 페이지에서 받아오는 쿠키를 base64 decoding 하는 함수와

그 쿠키를 다시 encoding 시켜서 보내주고 그 결과 값을 얻어오는 함수로 나눌 수 있겠죠

vnsec 은  다음과 같이 함수를 짰네요


이제 쿠키가 어떤 방식으로 이루어졌는지 알아봐야 합니다

Block cipher 니까 길이에 따라 결과 값의 길이 역시 달라지겠죠

어디부터 달라지는지 아는가가 목적입니다

길이를 하나씩 늘려서 getcookie 함수를 호출하면


길이 12는 2block . 13은 3block 입니다

1block 당 16byte 니까

2block 은 32byte죠 

32 - 12 = 20 

약 20 바이트가 입력값 외의 데이터죠

분명 role 이 user라는 데이터도 들어가있겠고

username 임을 표시하는 값도 있을 것입니다

어느 분기점 이후로 role 값이 들어가있을 것이고

그 특정 분기점을 나누는 부분에서는 취약점이 있을 것입니다

php 의 대표적인 문자열 취약점이라고 한다면

Null byte 취약점이 있겠죠

이를 이용해서 대입해보면..


빙고네요

대략 쿠키의 구성은

username=<input>##role=user 

그런데 input 에는 ##role에 대한 필터링이 있는 모양이군요

우리가 인식시키고자 하는 것은 ##role=admin 인데 이게 안된다면

입력 후에 값을 변조시켜서 우회를 해야 할 것입니다

여기서 활용되는 개념이


입니다. 

cipher text를 조작시켜 원하는 plain text를 얻는 기법인데요

여기서 주의 해야 할 점은 Block Cipher 의 특징입니다

Block Cipher 는  1 Block 앞의 Cipher Text 와 Decryption  된 Text  간의 

연산이 추가됩니다

이는  바로 Xor 연산인데, Xor 의 성질을 살펴보면

다음과 같이 결합법칙이 성립하는 것을 볼 수 있습니다

(A \otimes B) \otimes C = A \otimes (B \otimes C)

그러니까 Decryption 된 Text 에 Xor 연산을 하는 앞선 Block 의 Cipher Text 에 Xor 를 하는 것은

Decryption 된 Text에 Xor 연산을 하는 것과 동일한 결과를 가져오게 됩니다

또한, 이를 위해서는 조작하고자 하는 Block 앞에 다른 Block 이 있어야겠죠

Username 이 들어가는 첫번째 Block 을 조작했다간 제대로 된 결과를 낼 수 없을 것이기 때문입니다

두번째 Block 을 조작해서 우리가 원하는 3번째 Block 의 값을 바꿔야 합니다

즉..


이런식으로 이루어지겠죠?

3은 16진수로 33

#은 16진수로 23입니다

33  XOR 10 = 23

이므로 7을 10과 XOR 시키면 Decryption 하는 과정에서 #으로 바뀌게 되고

##ROLE 이 완성되면서 admin 으로 인식하게 되는 겁니다

이를 구현하면..


...

배울게 정말 너무 많군요

직접 이 문제를 마주쳤다면 삽질은 삽질대로 하고 못풀었을거 같네요

씁쓸합니다









'WarGame' 카테고리의 다른 글

ISEC 2009 Challenge6 with GOT OverWrite  (0) 2010.08.22
[ CodeGate 2010 ] Challlenge 15 풀이  (0) 2010.07.06
[ CodeGate 2010 ] Challenge 8  (0) 2010.06.22
[ CodeGate 2010 ] Challenge 7 풀이  (2) 2010.06.21
[ Python Challenge ] level 15  (0) 2010.06.08
[ CodeEnge Malware Analysis ] level 8  (0) 2010.05.30
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday21
Today20
Total330,163

달력

 « |  » 2019.7
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

최근에 받은 트랙백

글 보관함


. .