[Codegate 2018] Misc – Impel Down

문제의 description은 별다른 내용이 없고 nc 호스트와 포트만 존재합니다.

서버에 접속해보면 python이 돌아가고 있으며, 전형적인 python jailbreak 문제인 것으로 예상해 볼 수 있습니다. 해당 스크립트는 약 10초가 지나면 timeout 되어 접속이 종료되며, 해당 시간 내에 flag를 획득해야 하는 형태입니다.


Name에 임의의 문자를 넣은 후 4가지 메뉴 중 하나를 선택하여 입력하면 해당 기능이 수행되며, “dig a”와 같이 untrusted input을 전달하게 되면 에러가 발생하게 됩니다.

에러 내용을 살펴보면 해당 work 변수에 우리가 입력한 명령이 들어가게 되며, 결과적으로 eval 함수를 이용해 “your.[명령]()”와 같은 형태로 명령이 실행됩니다. your은 클래스의 인스턴스라고 예상해 볼 수 있고, dig와 같은 명령들은 이에 속하는 함수들이라고 볼 수 있겠죠. 이 때 eval 함수를 사용하기 때문에 우리가 원하는 명령을 실행시킬 수 있는 가능성이 생겼습니다.

파이썬의 eval 함수에서는 ,(comma)를 이용하여 복수의 명령을 실행할 수 있습니다.

이런식으로 말이죠.

이 특성을 이용해 work 변수에 아래와 같은 명령을 삽입할 수 있습니다.

dig(), [임의 명령], your.dig

이와 같이 입력하게 되면 eval에 들어가는 명령은 “your.dig(), [임의 명령], your.dig()”가 될 것이며 이로 인해 dig 함수는 총 2번 실행되고, 그 사이에 우리가 원하는 명령을 수행할 수 있습니다.

dig,__import__(‘os’).system(‘ls’),your.dig

따라서 위와 같은 명령을 통해 쉘 명령을 내릴 수 있지만, 해당 스크립트에서는 _(underbar)가 들어갈 경우 필터링 후 종료시켜버리기 때문에 다른 방법을 찾아야 했습니다.

여기서 생각할 수 있는 것은 _를 사용하지 않고 os모듈을 import 하거나, 다른 변수에 값을 할당해 이를 eval로 실행하는 것이 될 것입니다. 1번 방법은 대회 중 떠오르지 않아 실패했지만 2번의 경우 스크립트 시작 당시 Name에 변수를 받지만 별다른 필터링이 적용되어있지 않아 이를 이용할 수 있겠다고 생각하였습니다. 따라서 Name에 __import__(‘os’).system(‘ls’)와 같은 쉘 명령을 실행시킬 수 있는 명령어를 입력 후 work에서 eval을 이용해 이를 실행시키는 형태로 진행하였습니다.

해당 writeup은 대회 종료 후 추출한 소스코드를 이용해 로컬에서 돌리고 있는 상황이라 로컬의 ls 결과가 출력되었습니다. 아무튼 이와 같은 형태로 쉘 명령을 실행시킬 수 있으며, “cat Impel_Down.py” 등의 명령을 통해 소스코드를 추출할 수 있습니다.

Impel_Down.py

 

소스코드를 살펴보면 FLAG 파일은 root 경로에 존재하며, 실행 시 FLAG를 얻을 수 있다고 합니다.

name : __import__(‘os’).system(‘/FLAG_FLAG_FLAG_LOLOLOLOLOLOL’)

work : dig,eval(name),your.dig

 

이와 같이 수행하게 되면 플래그를 얻어낼 수 있습니다.

 

FLAG : Pyth0n J@il escape 1s always fun @nd exc1ting ! 🙂

+ Recent posts