'codegate solution'에 해당되는 글 2건

  1. 2010.03.28 [ CodeGate2010 ] Chanllenge 4 풀이
  2. 2010.03.17 [ Codegate 2010 ] Chanllenge 1 풀이 (2)

2010.03.28 11:06 WarGame


문제 설명입니다

credentials: ctf4.codegate.org port - 9000, 9002, 9004, 9005, 9006 (you can choose any port)

BINARY FILE: http://ctf.codegate.org/files____/easy


해당 포트에 접속해보면



매우 간단해 보이네요

바이너리 파일은 위 주소에서 구할 수 있습니다

간단한 오버플로우 문제 같군요

먼저 hex ray로 소스를 보면




약간 꼬아놓긴 했습니다만 오버 플로우 취약점이 있다는 것은

누구나 매의 눈으로 찾아 낼 수 있습니다

일반적인 경우는 아니군요

쉘 코드를 집어넣을 적절한 장소가 필요합니다

마침 func 함수에 적절한 크기의 변수가 할당되어 있군요

할당된 크기를 보면 char형의 264크기의 배열이 할당되었다고 보시면 되구요

저기에 쉘 코드를 넣은 다음 RET을 시작 주소로 바꿔주면 되겠습니다만

요는 저 문제에 적용된 Overflow 방지 기법이겠죠

문제 2번에서 제공된 ID , PW 로 ctf4 서버로 접속해서 확인해보면




힙, 스택 주소가 계속 바뀌는걸 볼 수 있습니다

조금 전에 생각했던 RET 을 dest의 주소로 덮어씌우는 단순 방식은

정확한 stack 주소를 얻어내야 하기 떄문에

좀 어렵게 되었군요  

[ 윈도우에서도 Vista 부터 같은 원리의 기법이 적용된 바 있는데요

ASLR(Address Space Layout Randomization) 으로 불리며

Reversecore님의 잘 정리된 자료는

http://www.reversecore.com/69 에서 참고하실 수 있습니다 ]

이를 우회하는 방식은 발표 자료로 정리한게 있는데

http://linkc.tistory.com/entry/26-kernel-에서의-BOF

를 보셔도 좋구요

ASLR 우회 기법을 샘플 코드와 그림까지 첨부한 문서인

http://www-users.rwth-aachen.de/Tilo.Mueller/ASLRpaper.pdf

을 보시면 됩니다

문제 풀이에는 RTL  기법을 적용하는 방법이 있겠습니다만

이번 문제는 문제 자체 소스의 특성을 이용해 보도록 합시다

memcpy가 func 함수에서 가장 나중에 쓰인 것을 볼 수 있습니다

memcpy가 리턴값으로 Destination address를 준다는 건 혹시 알고 계신가요?

이를 이용해봅시다

그러니까 리턴값을 저장하는 eax는  Dest 의 주소를 가진다는 거겠죠

이 eax를 이용해 볼까요?




이런식으로 Exploit이 진행 될 수 있습니다

이제 전체적인 코드를 짜볼까요

먼저 필요한건

1. shell code

2. shell code와 eax를 채워줄 dummy byte

3. call eax 를 실행하는 text 영역의 주소


*이 3가지는 스택이나 힙 변화에 영향을 받지 않으므로

이 문제를 해결하는데 유효 합니다


먼저 ctf4 서버에 접속해서 reverse shell 이나 bind shell 등

뭐가 좋을까 봤는데

어째 문제 서버에서 외부로 연결이 잘 안되군요 -.-

애초에 문제 포트를 빼고 외부로의 연결을 막아놓은 건지는 잘 모르겠습니다만

저는 reverse shell 을 하되 주소를 127.0.0.1 으로 주어 서버 자신의 포트로 reverse telnet 을 걸었고

서버에 미리 접속해서 그  특정 포트에서 응답을 대기하도록 했습니다

dummy byte는 shell code + dummy byte = 264 byte

로 간단히 쉘코드 길이를 계산해서 넣으면 되겠쬬

그다음은 call eax 를 실행하는 text 영역의 주소가 필요합니다

이는 IDA 를 사용하거나 Metasploit을 이용하면 되겠군요






두 주소 모두 같은 명령어니까 아무거나 집어넣어도 상관 없습니다

0x080484df를 이용해봅시다




문제 서버에 접속해서 미리 포트를 열고 대기하고

공격을 하면...






P.S

http://coma.0x3f.net/uncategorized/codegate2010-ctf-level-4

에서 풀이도 봤습니다

쉘 코드가 264 byte에 충분히 들어가지만

안들어가는 경우를 생각했던건지

다소 복잡하지만 재밌는 방법을 사용했더군요








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.

공지사항

Yesterday57
Today61
Total309,989

달력

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

최근에 받은 트랙백

글 보관함


. .