이번에 작성할 문제는 Baby write-only password manager로 현재 참가하고 있는 Pwn2Win CTF의 pwn 카테고리에 있는 문제다. 한 문제라도 풀어보려고 노력했지만 대회 자체가 수준이 좀 높아.. 결국 풀지 못했다. 따라서 접근 방법이라도 정리해보려 한다.
일단 처음부터 실수를 했다. 솔브 수가 높은 다른 pwn 문제들은 nc 서버가 주어져 있지 않았는데(pwn 문제인데 web 서버가 등장했다..), 해당 문제는 nc 서버가 있어 너무 기쁜 나머지 문제 파일은 보지도 않고 무작정 서버에 접속해보며 삽질을 시작했다.
서버에 접속하면 "Hello there. Send me your ELF."라는 문구가 나온다. ELF 파일을 전송하라는 뜻이다. ELF 전송 방법에 대해서는 다음 줄에 나와 있는데, elf의 byte 크기를 지정하고 elf의 byte(hex)를 전송하면 되는 것 같다.
tmp.c 파일을 생성하고 "Hello Test!"를 출력하는 간단한 c언어 코드를 작성 후 gcc로 elf 파일로 빌드했다.
위와 같은 python 코드를 짜봤다. 서버에 접속한 후 만든 temp(elf)의 byte를 읽어, 길이 및 byte를 전송해주는 동작을 한다.
python 코드를 작성하고 접속해봤지만 쿨타임이 존재하는 것을 알 수 있었다. 테스트 해보니 접속한 후 1분 이내에 재접속은 불가능한 것을 알 수 있다. (brute force를 막기 위함인 것 같다.)
쿨타임이 끝난 후 파이썬을 실행해보니 elf 전송까지 막힘 없이 진행된 것을 알 수 있다.
전송 후에 Position in queue: <n>가 출력된 후 "Runing your task, please wait"을 출력한 다음 전송한 elf 파일을 빌드한 후 실행시킨 결과를 출력해주는 것 같다.
될 리는 없겠지만 시험삼아 system("cat flag.txt");를 temp.c에 넣어 빌드해보니 Permission denied가 출력됐다. 전송한 프로그램은 권한이 낮은 사용자의 계정으로 실행되는 것 같다.
서버 폴더 구조를 파악하기 위해 ls 명령어도 넣어봤지만 권한에 걸린 것을 볼 수 있었다.
지금까지 알아낸 과정을 정리해보면 다음과 같다.
1. 서버에 접속하면 "Hello there. Send me your ELF." 문구가 나온다. ELF hex code를 전달하는 것이다.
2. 그 다음 문구로 Give me how many bytes (max: 30000) 라는 문구가 나오고 입력을 받는다.
3. "Send 'em!"이라는 문구가 출력되면서 입력한 바이트만큼 elf 형식의 hex 코드를 입력 받는다.
4. "Position in queue: <n>"이라는 문구가 출력되는데, 입력한 byte가 queue의 어느 위치에 저장되는지를 의미하는 것 같다.
5. Running you task, plaease wait 문구가 출력되고 입력한 elf hex code가 빌드되서 실행되는걸로 보인다. (실행은 권한이 낮은 계정으로 해주는 걸로 보인다.)
6. 실행 결과를 출력해준다.
파일 빌드 관련 취약점을 찾다가 문제 파일이 주어져 있다는 것을 깨닫고 뒤늦게 문제파일을 분석해봤다.
문제 파일은 64bit elf 파일이며 서버 동작 프로그램으로 보인다. 문제 파일을 통해 password를 인증한 후 flag를 얻는 것으로 추측되나 서버에 접속했을 때 나오는 문구는 이 프로그램을 통해 나오진 않는다. 서버와 프로그램 사이의 연결 고리를 찾으려고 시도했지만 내 지식으로는 도저히 찾을 수 없어서 결국 패스워드 입력 부분도 찾지 못한체 실패했다.
'CTF' 카테고리의 다른 글
wtfCTF 2021 - k3Y (0) | 2021.06.05 |
---|---|
wtfCTF 2021 - MoM5m4g1c (0) | 2021.06.05 |
[DawgCTF 2021] Pwn - Bofit (0) | 2021.05.08 |
[DawgCTF 2021] Misc - Two Truths and a Fib (0) | 2021.05.08 |
[DawgCTF 2021] Misc - DawgCTF Discord (0) | 2021.05.08 |