Wargame/웹해킹(Webhacking.kr)

[Webhacking.kr] 31번 미해결

2018. 3. 27. 21:43



31번에 들어가면 

$port=rand(10000,10100);
$socket=fsockopen("$_GET[server]","$port",$errno,$errstr,3) or die("error : $errstr");

위와 같이 socket 으로 서버에 접속하는 것이 보이고... 조금 시간이 지나면


Warning과 함께 error : Connection timed out을 출력한다.


포트는 rand함수로 10000~10100의 값중 랜덤하게 설정된다.


...


즉 내 아이피의 포트를 10000~10100들을 열어두면 저 포트들중 랜덤으로 한포트에 데이터를 보내겠다는 거같다.


포트포워딩을 해야할거 같은데... 어케 하지 ㅂㄷ;;





[Webhacking.kr] 11번 정규식

2018. 3. 27. 21:09



preg_match

(PHP 4, PHP 5, PHP 7)

preg_match — 정규표현식 매치를 수행

설명 ¶

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int$offset ]]] )

pattern에 주어진 정규표현식을 subject에서 찾습니다.

preg_match를 통해 get으로 받은 파라미터 val에 $pat에 주어진 정규표현식이 있다면 password를 출력한다.


여기(http://php.net/manual/kr/function.preg-match.php) 가서 정규표현식을 보고 오자...


이제 val을 구성해보자. 



$pat="/[1-3][a-f]{5}_.*(my-ip값).*\tp\ta\ts\ts/";

if(preg_match($pat,$_GET[val])) { echo("Password is ????"); }



[1-3] : 1~3중 아무 값

[a-f]{5} : a~f 중 아무 값 5개

_ : _

.* : 아무거나 0 이상반복

ip 값

.* : 아무거나 0 이상반복

\t :  탭 url 인코딩 %09

pass


val = 1aaaaa_ip%09p%09a%09s%09s






[Webhacking.kr] 36번 VI

2018. 3. 27. 20:39


문제에 들어가면 달랑 저거만 있다.


hint :


vi

blackout



소스코드를 봐도 별게 없다. 


리눅스상에서 vi 에디터를 사용하다가 터미널이 꺼지거나 예상치못한 종료가 일어났을때,

백업을 위해 swap 파일이 남는 경우가 있다. 이 문제는 그것과 관련있을 것 같다.


방금 검색해서 알았는데, 그냥 vi 에디터로 편집하고 있으면 백업파일로 .파일이름.swp 파일이 생성되는 거였네... 뭐 어쨋든


그래서 .index.php.swp를 보면 될 것 같다.



이렇게 나온다... 아 으.. 이게 아닌감 ㅡㅡ;


혹시 다른건가 싶어 여러개 시도해봤지만... 결과는 역시 Not Found...


하도 안되서 다른사람들 라이트업을 검색해보았다.






검색해보니 최근에 저렇게 된듯 하다...(다른 사람들은 잘만 풀었다. 물론 2015~2017년도 글이다. 2018년도 사람들은 나와 같이 Not Found에서 좌절...)


그냥 귀찮으니 풀지 말까 생각하다가... 


예전에 푼 사람들이 저 페이지에 들어갔을 때 나온 것을 풀어보도록하기로 했다. 원래 저 페이지에 들어가면 아래와 같이 나온다고 한다.



$password=md5(~~~)로 되어있다... 저값을 md5값으로 변환시켜서 인증시키면 될거같다.


(dlseprtmvpdlwlfmfquswhgkwkglgl = 인덱스페이지를변조하자히히)


(자신의 ip + "인덱스페이지를변조하자히히"(영문버전))을 md5로 인코딩해서 auth에 인증하면 될것같다... 해보자


webhacking.kr의 memo에서 왠만하면 다 할 수 있다. ip도 알려주고.... md5도 인코딩할수 있다.








[Webhacking.kr] 23번

2018. 3. 27. 17:57


Your mission is to inject <script>alert(1);</script>



라고한다.



일단 잘 모르겠으면 소스를 보자


get방식으로 index.php에 보내는 것을 볼 수 있다.


한번 아무거나 입력해보자.



code=234 로 code값에 넣어져 전송되고 그 값이 그대로 나오는 것을 볼 수 있다.


우리가 해야하는 것은 스크립트 실행이므로 스크립트를 저기 넣으면 되는 것인가?


싶어서 그대로 넣어보았다...



no hack이란다.. 일단 필터가 있나보다 뭐가 필터인지는 잘모르겠다. 시도를 좀 해볼까


... 시도해봤는데 al만 넣어도 핵이란다 ㅂㄷㅂㄷ;


필터가 대단히 잘걸려있다... 이걸 우회해서 alert(1);을 해야한다.




오... 앞부분에 null값을 넣고 시작했더니 alert가 온전히 출력되었다. 이렇게 우회가 되는구나...;


아마 필터하려고 검사하는 부분에서 첫부분이 null값이 들어가 있어서 null에서 끓겨버려서 필터링이 안되는 것같다.


이제 뒷부분에 <script>alert(1);</script>을 넣으면 되나 싶어서 해보았다.



크롬이 막아버렸다... 아래에러 코드를 보니 ERR_BLOCKED_BY_XSS_AUDITOR라고... XSS 공격을 막은거 같다...


찾아보니 롬에서 XSS에 대한 테스트를 하면 발생하는 것으로, 이는 웹브라우저에 탑재된 XSS Auditor가 블랙리스트에 등록된 스크립트를 발견했을 때 발생시키는 에러라고 한다. XSS Auditor는 크롬과 사파리에 탑재되어 있고, 기본 동작하도록 설정되어 있고, XSS Auditor의 동작은 X-XSS-Protection이라는 HTTP Response 헤더에 의해 결정된다. 


그래서 우회하려면 프록시 설정하고 버프슈트같은걸로 저 헤더끄고하면 된다고 한다. (http://xiphiasilver.net/?p=293)


귀찮아서 익스플로러에서 해보기로 했다.


잉... 근데 풀려있다 ㅋㅋ; 아마 스크립트입력시킨 시점에서 서버에서는 클리어로 판정해줫나보다 ㅋㅋ



심지어 익플에서도 안된다 ...



나중에 한번 저 옵션을 끄고한번 해봐야겠다 ㅋ



+ 추가!!!


다른 사람이 푼 라이트업도 보고싶어서 검색해보니 필터링을 우회하려고 문자중간중간에 null값을 넣어서 보내줬다고 한다.


그러니까 이런식으로 보냈다는 건데...


?code=%00<%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(%001%00)%00;%00<%00/%00s%00c%00r%00i%00p%00t%00>%00


<script>alert(1);</script> 중간에 %00값을 하나하나 집어넣어준것이다.


이렇게 보내보니....



이렇게 풀린다... ㅋㅋ; 물론 null값때문에 약간 이상하게 보이긴하다만... 저값도 <옆으 %00들을 없애면 좀 보기좋게 나온다.



신기하네... 물론 스크립트가 실행되진않았지만;; 아까는 크롬에서 에러코드띄우면서 막던거를 여기서는 안막는다...ㅋㅋ



헤더 인젝션 문제이다. 일단 헤더 인젝션이 뭔지 검색해보았다.


헤더인젝션은 공격자가 헤더에 개행문자(%0d%0a)를 삽입하여 그뒤에 헤더를 추가하여 공격하는 수동적인 공격방식이다.


이 공격으로 임의의 HTML을 보여주거나 다른 URL로 리다이텍트시킬수 있고, 쿠키를 임의로 생성할 수 있다.


여기서 원하는 것은 헤더인젝션을 통해 id=sherlock값을 가진 쿠키를 생성하는 것이다.


좋은 예시나 설명이 여기에 있다 (https://www.gracefulsecurity.com/http-header-injection/)


그래서 공격코드는 밑과 같이 작성하면 쿠키가 생성될것 같다.


http://webhacking.kr/challenge/web/web-27/?id=%0d%0aSet-Cookie:%20id=sherlock


%0d%0a를 통해 개행을 하고 Set-Cookie: id=sherlock을 request에 추가해넣는것이다.




그러나 아무일도 일어나지 않았다...


왜 그런가해서 Burp Suit로 분석해보기로 하였다.


먼저 헤더생성을 누르면 id 부분이 request에 추가된다.



get방식으로 id=sherlock이라는 파라미터가 전달된다.



response에서도 헤더에 id: sherlock이 보인다.



이번엔 공격코드를 보냈을 때다




?????


아까는 잘되던 id: ~~ 부분이 날라가버렸다 ;;


아마 필터링을 하던 뭐를 하던해서 없애버리는 것 같다.


그래서 계속 이걸 어떻게하지하고 삽질하다가....;;;


문제가 쿠키생성에서 바뀌었다는것을 알게 되었다 ㅡㅡ;


문제를 다시 읽어보자...




클리어조건이 예전 문제에서는 쿠키생성이였다면... 


지금은 그냥 id: ~~~ 밑에 clear: sherlock 이라고 추가만 하면 클리어하는 것으로 바뀌었다.


그래서 Set-Cookie: sherlock으로 공격하던것을 clear: sherlock으로 바꾸어주기만 하면 된다.








문제를 풀러 들어가면 위와 같은 표가 나오고 누르면 다운로드할수 있게 되어있다.


test.txt를 다운로드를 누르면 아래와 같은 url로 이동한다. 중간에 있는 저 값은 32자로 md5로 사료된다.


물론 아닐수도 있다... 심심해서 디코딩해봣는데 아무것도 안나온다 ㅋㅋ



그리고 ZIP파일을 다운하려했더니 Access Denied가 떴다. 일단은 소스를 보도록하자.



소스파일은 아래와 같고...





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head>
<title>Challenge 42</title>
</head>
<body>
 
<table border=1 align=center width=300>
<tr><td width=50>no</td><td>subject</td><td>file</td></tr>
<tr><td>2</td><td>test</td><td>test.txt [<a href=?down=dGVzdC50eHQ=>download</a>]</tr>
<tr><td>1</td><td>read me</td><td>test.zip [<a href=javascript:alert("Access%20Denied")>download</a>]</td></tr>
</table>
 
<!--
test.zip password is only numbers
-->
 
</body>
</html>
 
cs



주석을 보면 test.zip password is only numbers란다.


숫자로만 패스워드가 설정된 zip파일은 크랙하기 쉬울것으로 보인다. (4자리라면 매우 쉽겠지...)


그리고 위의 test.txt의 다운로드 링크가 걸린것을 보면 [<a href=?down=dGVzdC50eHQ=>download</a>] 이렇게 되있는데


저 중간의 ?down=dGVzdC50eHQ=을 변조하면 test.zip도 다운할수 있을것같다. 모양새를 봐선 base64인코딩같다. 


디코드해보자



오오... test.txt가 맞다. 그럼 저 값을 test.zip으로 인코딩해서 이동해보자.


test.zip의 base64인코딩 값은 dGVzdC56aXA= 이다.


?down=dGVzdC56aXA=로 주소창에 써넣자 test.zip이 다운로드되었다.



패스워드는 숫자로만 구성됬다고 했으니 브루트포싱해보자.



아; 하지만 trial 버전이라.. 패스워드 길이는 최대 4까지만 설정가능하다.


하지만 성공해서 별다른 문제는 없었다.... 실패했으면 Kali Linux에 있는 fcrackzip을 쓰면 좋다ㅇ..



이제 비밀번호를 입력하고 readme.txt를 읽어보면 아래와 같이 url이 나오고 들어가면



패스워드가 나오고 auth에서 입력하면 클리어가 된다.




10번 문제이다. 들어가면 이상하게 생긴 페이지가 하나 나온다.




소스코드를 보자...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Challenge 10</title>
</head>
 
<body>
<hr style=height:100;background:brown;>
<table border=0 width=900 style=background:gray>
<tr><td>
<a id=hackme style="position:relative;left:0;top:0" onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a><br>
<font style="position:relative;left:800;top:0" color=gold>|<br>|<br>|<br>|<br>buy lotto</font>
</td></tr>
</table>
<hr style=height:100;background:brown;>
 
</body>
</html>
cs


이렇다.  중간에 보이는

<a id=hackme style="position:relative;left:0;top:0" onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a><br>
<font style="position:relative;left:800;top:0" color=gold>|<br>|<br>|<br>|<br>buy lotto</font>

이 부분이 중요한것같다. 그럴게 id부터가 hackme이다.


<a>O</a>가 되있는 저 O를 onclick을 통해서 this.style.posLeft를 증가시키고 이 값이 800이면 이동하게 되는것같다.


url에 바로 ?go=800이라 쳐보았지만 no hack이라며 거절당햇다.



아마 go값뿐만 아니라 O의 위치값도 제대로 800값이여야할것같다. 


뭐 이런... 일단 크롬 개발자 도구를 이용해서 수정하고 해보았지만 안된다 ㅜ; 


근데 이상하게 저 코드를 보면 저 O를 클릭하면 위치가 오른쪽으로 이동해야하는데 안한다 ㅡㅡ; 그래서 Internet Explorer로 들어가서 눌러보니 이동하는것을 확인할 수 있었다..(응? 왜 크롬은 안돼 ㅡ;)



저까지 달렸다... 참고로 이게 마우스를 O에 가져다올리면 yOu 로 변하고 다시 내리면 O가 된다. 뭔가 달리기하는거 같다.

열심히 저기까지 달리자 ㅂㄷㅂㄷ;

onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a>


아오... 누르다가 힘들어서 오토마우스써서 해보았다.




오잉 ㅋㅋㅋㅋ 이게 아닌거같은데


일단 나중에 와서 다시 풀어봐야겠다.



수정 + 2018-03-23


크롬으로 수정했을때는 저 posLeft값이 변한다해도 O가 움직이지 않아서 실패했었다.


방금 알았는데 Internet Explorer도 F12를 누르면 개발자 도구가 나온다. 여기서 수정해주자.




풀리긴하지만 이미 풀었다고 클리어표시는 안내준다.





오랜만에 다시 Webhacking.kr 에 들어가 새로 문제를 풀어보았다.


예전 포스팅들과 달리 이번에는 이미지 첨부가 가능하기에 되도록 이미지를 첨부하면서 풀어보도록하겠다.


이번 문제는 들어가면 아래와 같이 보인다.




javascript challenge라고 나온다.


소스보기로 소스코드를 보면 WorkTimeFun이란 곳에 String이 저장되어있는것을 알 수있다. 

그런데 그 스트링은 아스키코드값을 하나하나 분리해놓았다 ㅡㅡ; 





하지만 우리에겐 크롬 개발자도구가 있다!


그대로 콘솔창에 넣어보자.



오호... 위와 같이 출력되었다.


ck값이 Password로 출력되는 것을 보니 ck값을 구하면 될 것 같다.


ck 값은 url에서 =뒤로 출력되는 것들이고.. 이 값이 if문을 통과하게 되면 alert로 띄워주게 되니;


저 if문의 조건에 부합하는 ck 값을 찾아야할 것 같다.


저 코드에서 ck값을 역으로 추출하게 코드를 약간 수정해서 크롬 개발자도구의 콘솔을 이용해 출력해보았다.



=youaregod~~~~~~~! 가 ck값으로 들어가면 되는 값일 것이다. 그대로 url에 붙여넣어 보내보자


사실... 출력해주는게 ck 값이라 딱히 url에 안넣어봐도 된다.



저걸 Auth에 입력하면 인증된다.



클리어 ㅇㅇ



 



BLIND SQL INJECTION

Result :


문제다. Blind sql injection이라고 적혀있다.


일단 소스보기!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>Challenge 21</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body><br><br>
<center>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td colspan=2 align=center><h1>BLIND SQL INJECTION</h1></td></tr>
<tr><td align=center><input name=no type=text size=30></td><td><input type=submit></td>
<input type=hidden name=id>
<input type=hidden name=pw>
</tr><tr><td colspan=2 align=center style=background:silver;color:black;font-size:9pt;>Result : <b>
</b></td></tr></table>
</form>
</center>
</body>
</html>
cs


get방식으로 index.php에 보낸다.

일단 보내보면... 위에 get방식으로 어덯게 보내지는지 보인다.


/index.php?no=hi&id=&pw=


제출되는 것은 no로 넘버인것 같다.


0을 입력하면 Result는 아무것도 뜨지않는다.


1,2 를 입력하면 True가 뜬다.


3,4~ 부터는 False가 뜨는 것 같다.







[Webhacking.kr] 20번

2017. 10. 12. 22:26
time limit : 2
nickname
comment
code

do not programming!
this is javascript challenge


문제다.


소스를 보자.


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
32
33
34
35
36
37
38
39
40
41
<html>
<head>
<title>Challenge 20</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body>
<center><font size=2>time limit : 2</font></center>
<form name=lv5frm method=post>
<table border=0>
<tr><td>nickname</td><td><input type=text name=id size=10 maxlength=10></td></tr>
<tr><td>comment</td><td><input type=text name=cmt size=50 maxlength=50></td></tr>
<tr><td>code</td><td><input type=text name=hack><input type=button name=attackme value="hlajbgotso"
 style=border:0;background=lightgreen onmouseover=this.style.font=size=30 onmouseout=this.style.font=size=15></td></tr>
<tr><td><input type=button value="Submit" onclick=ck()></td><td><input type=reset></td></tr>
</table>
<script>
function ck()
{
 
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }
 
lv5frm.submit();
 
}
</script>
 
<br>
 
do not programming!<br>
 
this is javascript challenge
 
</body>
</html>
 
cs


POST로 nickname comment code를 전송하는 형식같다.


form의 이름은 lv5frm이다. code 라는 부분이 중요해 보인다. name=hack이고 옆에 있는 hlajbgotso값을 가진 버튼은 name=attackme이다.


아... 방금 알았는데 저 옆에 있는 버튼 attackme의 값은 계속해서 바뀐다.(새로고침할때마다 변함)


Submit 버튼을 누르면 ck()가 작동한다.


function ck()
{
 
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }
 
lv5frm.submit();
 
}



nickname, comment, hack 값이 없다면 focus로 커서를 입력칸으로 이동하고 return 되어 함수를 빠져나온다.

또 hack의 값과 attackme의 값이 동일하지않으면 focus후 함수를 빠져나온다.


이제 어떻게 동작하는지 알았으니... 적당히 입력한 후 (물론 code값(hack)과 그 옆에 랜덤으로 변하는 값(attackme)과 같게 해야한다.)


Submit해보았다. Wrong이 떳다.


... 흠... 일단 문제는 do not programming과 javascript challenge라고 한다.


위에 적힌 time limit : 2 가... 2초안에 입력해야한다는 것을 뜻하는 것 같다. 왜냐하면 늦게하면 Wrong이 나온다.

(왜 2초라 생각하였냐면... 그냥 크롬 개발자 열어놓고 Console에 lv5frm.submit();만 보내면 Wrong은 뜨지않는다.)


그래서 아래와 같이 미리 준비해둔 자바스크립트문을 적어서 복사해뒀다가...


새로고침하고 개발자도구 Console을 통해서 보내보았다.


1
2
3
4
lv5frm.id.value="sherlock"
lv5frm.cmt.value="Clear~~~"
lv5frm.hack.value=lv5frm.attackme.value
lv5frm.submit();
cs


결과는 성공~ 2초안에 성공하는게 맞았나 보다.






You have cleared the 20 problems.

Score + 200




+ Recent posts