CTF | wargame

xcz.kr / Rendzvous (패킷 분석, 알수없는 패킷 데이터 찾기)

nopdata 2017. 3. 27. 12:27


pcap파일 하나가 주어진다. 대강 분석을 해 보면 이런저런 사이트들을 왔다갔다거린다. 패킷량이 많지 않아 분석이 크게 어렵진 않다.
분석을 하다 보면 xcz.kr/homepage에 접속을 하고 거기서 Chat.exe라는 파일 하나를 다운로드 받는다.
Chat.exe는 실행시키면 아래와 같이 구성된다.


1:1 채팅을 지원해주는 프로그램인 듯 하였다. 비밀 친구와 대화하기에는 아주 적합한듯한..
일단 위와 같은 파일을 다운로드 받았다는 것을 확인하였으므로 채팅한 내용을 파악해야 한다.
tcp stream 106을 보면 아래와 같이 구성된다.


단 한번밖에 연결하지 않는 ip주소이며 오가는 데이터 또한 위처럼 상당히 수상하다. 따라서, Chat.exe를 통해 오간 데이터라는 가정을 하였다. Chat을 리버싱 해볼까 했는데 생각보다 볼 내용이 많은 것 같아서 vm으로 접속을 하여 오가는 데이터를 확인해 보기로 하였다.


위 패킷은 연결된 양쪽에서 a문자만 보냈을 경우이다. 보낸메시지+1의 길이만큼의 데이터가 전송되는 듯 한데 전송되는 데이터의 형태가 어떻게 구성되는지...
abcd를 보내도 112/112/112.. 이렇게 오갈 때도 있어서 리버싱을 해야 되나... 생각을 해 보니 tcp로 전송되는 데이터 저것 뿐이라면 python으로 소켓을 열어 직접 전송을 하면 연결 확인은 할 수 있을 것이다. 서버를 여는 쪽에서는 5180포트를 고정으로 열어두기 때문에 5180포트를 대상으로 문제 패킷에서 얻은 전송 데이터를 보내보기로 했다.


hi전까지는 테스트한 메시지고 hi부터 문제에서 추출한 데이터이다. 물론 그냥 봐도 답을 얻을 순 있는데 위 처럼 깨지는 이유는 클라이언트 쪽에서 연속연결로 인해 보낸 데이터가 중첩되었기 때문이다. 이 부분을 잘 나누어 주면 아래와 같이 제대로 해석된 메시지를 볼 수 있다.



import socket
import time

message =["102/100/13",
"106/72/94/63/87/105/59/104/58/104/109/126/98/112/52/114/50/125/127/97/105/45/120/98/103/108/38/8",
"92/92/69/17/88/78/88/72/12/82/69/92/8/69/67/64/74/28/35",
"12/99/46/98/45/47/80/85/84/82/92/26/95/87/69/22/84/20/85/94/80/87/1/47",
"89/83/27/67/86/77/23/93/91/91/68/18/87/92/78/73/18/45",
"121/116/106/126/58/116/125/55/98/125/113/51/98/112/99/124/121/98/126/111/42/121/100/125/38/81/42/87/3",
"120/116/58/96/119/98/54/98/117/125/124/112/48/105/98/108/107/52/42/98/99/8",
"31/1/20/15/17/68/23/10/4/64/120/54/41/40/43/96/118/119/47/53/47/122/56/32/126/56/32/35/40/60/42/45/44/103/127/112/119/114/117/39/36/121/12/9/89/5/12/92/1/9/5/87/13/81/6/5/85/2/29/76/27/30/78/79/27/17/9/76/85/67/4/2/74/75/116/31"]

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('192.168.152.129',5180))
for msg in message:
    sock.send(msg+"\n")
    time.sleep(1)

나온 url로 가서 사진을 다운받으면 검은색만 보이는데 배경을 흰색으로 채워주면 flag을 얻을 수 있다.