[BoB CTF] web) 02_old_python_interpreter
이 문제를 처음 접했을 당시에는 문제 이름을 보고서 특정 파이썬 버전에서만 발견되는 취약점을 찾아 이를 활용해야하는 문제로 이해했다.
파이썬 3.4.7 버전에서는 'local_file://' 스키마를 통해 file에 접근할 수 있는 취약점이 존재한다. ( [CVE-2019-9948] )
https://bugs.python.org/issue35907
Issue 35907: [security][CVE-2019-9948] Unnecessary URL scheme exists to allow local_file:// reading file in urllib - Python tra
The Unnecessary scheme exists in urlopen() urllib when people would protect to read file system in HTTP request of urlopen(), they often filter like this against SSRF. # Vulnerability PoC import urllib print urllib.urlopen('local_file:///etc/passwd').read(
bugs.python.org
마침 문항에서 "file://"를 필터링하고 있길래 다 풀었나보다 싶었는데, 사실 브라우저 수준에서 JS를 통해 클라이언트 단에서 필터링하는 거라 필터링하는 코드를 날려버리면 끝이기도 하고, 대회 종료 이후에 알게된건데 아무런 스키마 없이 바로 파일 경로를 파라미터로 전달해도 아래 사진처럼 파일 내용을 긁어서 출력해준다고 하더라..
아무튼 'file://' 필터링을 'local_file://'로 우회할 수 있게 되었으니, 서버 백엔드에 존재하는 코드를 읽어서 flag를 찾으면 되겠다. 게싱을 의도한 문제는 아닐테니 서버로 이런저런 요청을 마구 보내고 있었는데, 자꾸 서버가 다운되니깐 디코로 감자 서버를 그만 괴롭혀달라는 취지에서 힌트가 들어왔다.
홈 디렉토리에 존재하는 .bash_history 아니면 proc/[PID]/에 존재하는 링크들을 참고해야될 것 같은데....
.bash_history는 존재하지 않았다. 그렇다고 해서 명령어를 전달할 수도 없고 오로지 '이미 알고 있는 경로에 존재하는 파일에 대해 파일 내용을 긁어오는 것'만 가능한 상황에서 현재 내 프로세스의 PID를 알 수 있는 방법은 없으므로 괜히 셸 커맨드 히스토리를 저장하는 다른 파일드링 더 있는지 여기저기 쑤시고 다녔다. 만 PID를 몰라도 사용할 수 있는 self 키워드가 있더라..
스키마와 관련된 문제가 역시 맞았다. 정작 문제의 핵심인 local_file:// 스키마 취약점을 찾이 않고도 문제를 풀 수 있는 것은 좀 annoying하긴 하지만.... 😭 아무래도 역시 억울하다.