Natas Level 25 입니다.
어떤 발표문, 선언문? 같은 내용이 있고, 언어를 선택하여 볼 수 있습니다.
독일어, 영어가 가능하네요.
여기서 URL창을 보면 파라미터명이 "lang" 이라는 걸 알 수 있습니다.
소스코드 입니다.
가장 위 setLanguage 함수에서, lang 파라미터를 통해 언어를 선택받고 있습니다.
language 디렉터리 밑에서, lang파라미터를 통해 전달받은 파일을 출력하는 것 같은데요.
여기서 safeinclude 함수를 통해 구체적인 필터링을 실시하고 있습니다.
strstr 함수를 통해서,
"../" 문자열이 있다면 str_replace 함수를 통해 지워버립니다.
"natas_webpass" 문자열이 있다면 아예 파일을 불러오지 않습니다.
이렇게 두가지 필터링을 거친 후 파일을 불러오게 되는데, 필터링에 걸렸을 경우..
-> logRequest 함수를 통해 로그를 남기게 됩니다.
여기가 중요합니다. 필터링에 걸렸을 때 오류 메시지와 함께 로그를 남기는데요.
로그파일 내용은, [날짜와 시간 + HTTP Request의 USER_AGENT 헤더 + 오류 메시지] 입니다.
그리고 "/var/www/natas/natas25/logs/natas25_세션값.log" 라는 이름으로 저장되죠.
여기서 우리는, Burp Suite를 통해 USER_AGENT 헤더를 조작할 수 있습니다.
이 헤더에 공격용 php코드를 넣게 된다면? 로그파일에 php코드가 저장됩니다.
그리고 lang 파라미터를 통해서 이 파일을 불러오게 된다면? 코드가 실행되고 패스워드를 획득할 수 있을겁니다.
하지만 lang 파라미터 경로조작에 필요한 ../ 문자열이 필터링 되고 있으니, 이것부터 우회해 보도록 합시다. Burp Suite를 켭니다.
자, Burp Suite로 언어 변경 패킷을 잡았습니다.
맨 위 lang 파라미터에,
"..././logs/natas25_세션값.log" 를 입력했습니다.
"../" 는 필터링 되고 있으니, ..././ 에서 ../가 빠지면 결과적으로 ../가 남게 됩니다.
기본적으로 언어선택은 /var/www/natas/natas25/language/ 위치입니다.
우리는 /var/www/natas/natas25/logs/로그파일 위치로 가야 하니, 한 번만 상위 디렉터리로 이동하고 경로를 작성합니다.
세션값은 맨 아래, PHPSESSID 부분에서 복사하시면 됩니다. 이렇게 경로조작은 끝났습니다. 이제 User-Agent 부분에 php코드를 입력하도록 합시다.
"<? readfile('/etc/natas_webpass/natas26'); ?>" 입력하였습니다.
readfile 함수로 natas26의 password를 출력하도록 하였습니다.
natas_webpass 문자열에 대한 필터링은, lang 파라미터에만 적용되므로 이 부분에서 걸리지 않습니다.
이렇게 Response 패킷에서 password를 획득할 수 있었습니다.
로그 파일명은 세션값이 바뀌지 않는 한 동일하기 때문에, 여러 번 공격을 시도하면 파일에 쌓인 로그들이 모두 출력됩니다.
정리하자면 해당 문제에서는 "../" , "natas_webpass" 문자열 필터링에 걸렸을 경우 User-Agent 내용과 함께 로그 파일을 남기는 특성을 이용해서, User-Agent 값을 조작해 원하는 php코드를 서버에 심을 수 있었고
이후 언어를 선택하는 lang 파라미터를 악용하여 ..././ 경로조작을 통해, 심어둔 php코드를 불러와 password를 획득하였습니다.
'Hacking > [Web]Natas' 카테고리의 다른 글
OverTheWire [Natas Level 24] (3) | 2023.04.11 |
---|---|
OverTheWire [Natas Level 23] (0) | 2023.04.11 |
OverTheWire [Natas Level 22] (0) | 2023.04.05 |
OverTheWire [Natas Level 21] (0) | 2023.04.04 |
OverTheWire [Natas Level 20] (0) | 2023.04.04 |