파이썬으로 Packet 분석하기. #1

0

디지털포렌식

목록 보기
96/115

CTF - D 문제를 풀 던 도중, [우리 정말 근사하다고 생각하지 않니?] 파이썬의 도움이 필요하다고 느꼈다. 그래서 scapy를 사용하는 방법에 대해 공부해보려고 한다. 한 번의 게시물로는 부족할 거 같고, 여러 번 작성해야할 것 같다.

우선 "문제" 먼제 풀어보고, Scapy에 대한 추가적인 사용법을 더 알아보자.

Q. 우리 정말 근사하다고 생각하지 않니?

요렇게 Base 64로 인코딩되어있는 패킷들이 잔 뜩 있었다. 가장 처음에는, 그냥 수동으로만 분석을 해봤으니까, 100여개 패킷 Stream을 일일히 혹은 전체를 봐야할 것이라고 생각하지 못했다. 근데 그래야 했다. 그래서 수동으로 이 모든 패킷을 열고 복사하고 붙여넣을 수는 없으니, 도구를 사용해서 붙여넣는 방법을 알아야 했다. 그 해답이 바로 scapy였던 것이다.

그리고 파일 이름 scapy.py 로 하면 실행오류난다. 하지말자.

Content range가 오류가 나..는데 해결했다. 이게 해답은 googling을 해도 찾을 수 없었는데, 내가 내린 답은 개행문자 [\r, \n]때문에 Dictionary가 제대로 입력되지 않았고, 그래서 User-Agent라는 Key가 정상적으로 작성되지 않아 인식을 못하는 것으로 판단했다.

그래서 패킷 자체를 문자열로 바꾸었고, sctf-app이라는 공통된 문자열을 기준으로 Data를 Carving했다. 또, Content-range에 있는 zip파일은 다행히도 NetworkMiner가 자동으로 Carving을 진행해주었기에 한번만 활용하면 되었다.

from scapy.layers import http
import base64
pcap = rdpcap('ragent.pcap')
req = [p for p in pcap if p.haslayer(http.HTTPRequest)]
txt = open('flag.txt', 'w+b')
saved = []
for p in req:
	if p['TCP'].seq in saved:
	    continue
	saved.append(p['TCP'].seq)
	r = p.getlayer(http.HTTPRequest)
	print(r)
	pos = str(r).index('sctf-app')
	temp = str(r).index('DNT')
	txt.write(base64.b64decode(str(r)[pos+9:temp-5]))
	
txt.close()

많은 우여곡절이 있었다. 어제 밤부터 오늘 낮까지 계속 이것만 풀라고 그냥,, 일단 풀었으니까 다행.

이렇게 하면 png파일을 얻어낼 수 있는데, 이건 답이 아니다.
사실 가장 처음에는 Zip파일은 자동화도구를 통해서 얻어낼 수 있었고, 비밀번호가 문제였기에 그냥 이거 보자마자 비밀번호인 것을 알아낼 수 있었다.

이 문제 때문에 Protocol 구조에 대해서 공부할 필요성을 느꼈다. 꽤 오랜시간 잡고 있었는데도 "어디"에 정보가 숨어있는지를 알아야하는데 부족했다.

아무튼 풀어냈다.


ctf-d.com

0개의 댓글