'bit-flipping attack'에 해당되는 글 1건

  1. 2010.06.22 [ CodeGate 2010 ] Challenge 8

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.

공지사항

Yesterday48
Today15
Total328,657

달력

 « |  » 2019.5
      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  

최근에 받은 트랙백

글 보관함


. .