'codegate 2010'에 해당되는 글 3건

  1. 2010.06.22 [ CodeGate 2010 ] Challenge 8
  2. 2010.03.19 [ CodeGate 2010 ] Challenge 11 풀이
  3. 2010.03.17 [ Codegate 2010 ] Chanllenge 1 풀이 (2)

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

2010.03.19 10:06 WarGame


다른 문제에 비해 비교적 간단한 문제인데

문제 설명부터 빵 터져서 올려봅니다 :D



Real Badass ㅋㅋㅋㅋ

아 아무튼 ex-grilfriend에 링크가 되어있고

들어가보면 태연 사진이 걸려있습니다

취약한 구석은 그쪽이 아니라 물론 업로드 쪽이겠죠~

.jpg 파일만 업로드 가능합니다

혹 다른 파일을 업로드 하면

I only take a file that has .jpg extension. Because I'm bad.

라고 하시는군요

문제 풀면서 내내 웃어댔습니다 ㅋㅋ

아무튼 web server 를 파악해보면 IIS 인것을 알 수 있습니다

 



IIS extension vulnerability , IIS 업로드 취약점, IIS webshell

등등을 쳐보면 취약점 정보가 나옵니다

대략 test.php;.jpg 이런식으로 우회가 가능하구요

웹쉘을 올려보면 에러가 뜹니다

흠 일반적인 웹쉘은 막아놓은 모양인데요

문제를 다시 봐보면

 Get a value of HKLM\Software\codegate2010, it's the flag.

목적은 특정 레지스트리 값을 얻어오는 것입니다

아마 레지스트리 값을 얻어오는 코드를 발견하면

답을 뿌려주고 나머지는 모두 막아놓았겠죠

read the registry php 정도로 구글링 해보니

http://www.tek-tips.com/faqs.cfm?fid=5334

에 간단한 예제가 있습니다

살펴보니 COM 으로 WScript.shell을 호출하고

WScript는 local 상에서 프로그램을 구동하거나 registry를 읽는 등의

여러가지 기능을 할 수 있는 거 같더군요

아무튼

이를 살짝 고쳐주면





업로드 하고 경로 확인해주면 답이 출력됩니다

'WarGame' 카테고리의 다른 글

[ CodeGate2010 ] Chanllenge 4 풀이  (0) 2010.03.28
[ Python Challenge ] level6 풀이  (0) 2010.03.25
[ CodeGate 2010 ] Challenge 11 풀이  (0) 2010.03.19
[ Codegate 2010 ] Chanllenge 1 풀이  (2) 2010.03.17
[ Padocon 2010 ] Warmup 100  (0) 2010.03.16
[Python Challenge] level5 풀이  (2) 2010.03.11
Posted by LinkC

2010.03.17 18:51 WarGame


먼제 문제 설명은

beist likes drinking.
feel free to give a shot to him when you meet him.
this challenge doesn't need to give many hints to you guys.
just get to http://ctf7.codegate.org/31337/

YOU NEED TO GET A SHELL AND SEE A FILE THAT CONTAINS A FLAG OF THIS CHALLENGE. GOOD LUCK.

beist 님의 맥주 사랑을 여실히 느낄 수 있게 해 주는군요 :D




전형적인 웹 쪽 문제화면이로군요

메뉴 하나 하나 찔러보고 소스를 봤습니다만

그중에 의심가는건

Beer list 에 계산기 부분이었습니다

You need to pay 450000 KRW, thank you. You drank 150

대략 한병에 3천원씩 계산해서 보여주는데 이 숫자가 overflow 되는 현상이 

발생했기 때문인데요

cgi 파일이라 그쪽 취약점이 있나 싶어

인자를 다르게 집어 넣어봤는데 숫자만 허용합니다 -.-

한참 삽질해보다 다른 부분을 건드려보기로 했습니다

http://ctf7.codegate.org/31337/index.php?page=

page 인자를 공백으로 주니




Local and Remote File Inclusion , LFI 취약점이 있습니다

Wowhacker 의 Bobana 님이 번역 하신 문서를 보심이 좋겠군요

http://wowhacker.com/Translation/289072

일단 요청하는 페이지에 우리가 원하는 명령어를 실행시키도록 조작을 한 다음에

그 결과값을 서버의 로그 혹은 proc 폴더에서 확인하는 방법이 있습니다

로그 폴더를 찾는데 실패해서 고정 위치인 proc 폴더를 공략하기로 했습니다

proc 폴더는 각종 프로세스의 환경 변수 등을 담고 있는 폴더인데요

가장 쉽게 접근하는 방법은 최근 프로세스에 바로 접근토록 하는 

 /proc/self/environ 을 공략하는 것이죠

먼저 접근을 시도해보면..


퍼.미.션 이 없다는군요

그럼 우리가 실행하는 프로세스 ID , PID를 구해야 하는 작업이 추가되어버렸습니다

현재 실행중인 PID는 proc 폴더 내의 loadavg 를 참조하면 됩니다

그러니까

1. /proc/loadavg 에서 PID를 얻는다

2. /proc/{pid}/environ 의 내용을 얻어낸다

이를 소스로 구현하면




해당 pid 의 환경 변수 값을 얻지 못할 경우에 뜨는 메시지인 'Warning' 을 기준으로

성공/실패 여부를 판단합니다

자, PID를 구하고 그 프로세스에 해당하는 환경변수 값은 얻을 수 있게 되었습니다

그럼 이제 취약한 프로세스를 만들어 볼 차례로군요

pid 값을 지속적으로 출력시켜주도록 위 소스를 구현하여 실행하면

일반적인 요청은 pid 값을 증가시키지 못하는 것을 알 수 있습니다

한페이지씩 요청하면서 pid 값을 확인해보면

Server Side Script 중에서도 cgi 파일의 요청만 pid 값을 증가시키는 것을 볼 수 있고

이는 , ' cgi 요청은 프로세스를 생성한다 ' 라는 결론을 도출하게 합니다

그렇다면 이제 cgi 요청을 변조 하여 원하는 정보를 얻어 내는 일만 남았군요

LFI 문서를 보시면 알겠지만, 보내는 요청에 php 코드를 삽입하는 방식으로 이루어지게 됩니다

php에서 system 명령어가 실행하는 코드 <?php passthru('$cmd');?> 말이죠

이를 헤더에 추가시켜서 요청을 하고 이를 읽어내기만 하면

우리가 원하는 결과가 '쨘' 하고 나올 것이란건 의심할 바 없죠

자, 그럼 헤더를 추가해서 보내는 소스를 간단히 짜봅시다





자 그럼 답이 쨘?

.....

pid 값이 증가되서 프로세스가 생성되는 것을 확인한 것은 좋은데

환경변수 값이 뜨질 않습니다



네. 바로 프로세스가 생성되서 연산을 하고 응답을 하는건 좋은데

그 후엔 프로세스 정보가 삭제되고, 이 시간은 '매우' 짧다는 것입니다

몇번 실험을 해보니 잡아 내긴 합니다만 그게 언제가 될지 모르는 점이 큰 문제입니다

프로세스가 오래 남아있다면 캐치 하기 훨씬 쉽겠죠

계산을 하는 cgi 파일에서 프로세스가 오래 남도록 하고 싶다



숫자를 아주 크게 넣어줍시다

pid를 계속 읽어주면서 다른 창으로 헤더를 변조해서 보내면 됩니다

물론 이 헤더를 변조하는 작업은 proxy 툴이나 파폭을 이용하는 방법도 있겠습니다만..

아무튼

cgi 인자에 크으으으으게 넣어주고 인자를 변조해서 요청을 하고

 loadavg 에서 그 인자를 확인하게 됩니다




답이 뭔지는 다 보이시죠?

항상 좋은 문제 내주시는 beist lab 분들께 감사를!



P.S 소주 150병이면 당신도 엘리트!

'WarGame' 카테고리의 다른 글

[ Python Challenge ] level6 풀이  (0) 2010.03.25
[ CodeGate 2010 ] Challenge 11 풀이  (0) 2010.03.19
[ Codegate 2010 ] Chanllenge 1 풀이  (2) 2010.03.17
[ Padocon 2010 ] Warmup 100  (0) 2010.03.16
[Python Challenge] level5 풀이  (2) 2010.03.11
[Python Challenge] level4 풀이  (0) 2010.03.10
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

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

공지사항

Yesterday49
Today11
Total323,945

달력

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

최근에 받은 트랙백

글 보관함


. .