728x90
반응형
문제 파일 :
문제 파일은 pcap파일이다
pcap파일은 Wireshark로 확인 할 수 있는 네트워크 패킷을 모아논 파일이다
여기서 flag를 찾으란 말이다
필터에 http를 넣으면 보기 편하다
flag가 잔뜩 있는걸 확인 할 수 있다.
URL을 복사해서 URL디코딩을 한번 해보면
Time based sql injection을 하는 payload를 볼 수 있다
Time-based SQL Injection은 서버의 응답 시간을 이용해 데이터베이스의 상태를 알아내는 공격 방법입니다
timestamp를 보면 3초이상 차이나는 패킷들을 확인하면 flag문자열 한글자씩의 아스키코드를 확인 가능하다이 작업은 하나하나 뒤져볼 수 있지만 python라이브러리에 pcap파일을 뒤져주는 라이브러리가 있어 그것을 활용 해주면 된다
from pwn import *
import dpkt
import datetime
from dpkt.compat import compat_ord
import urllib
def analyze_packets(pcap):
"""pcap의 각 패킷에 대한 정보를 출력합니다.
Args:
pcap: dpkt pcap 리더 오브젝트 (dpkt.pcap.Reader)
"""
# 플래그 문자를 저장할 리스트를 초기화합니다.
flag = ['X'] * 39 # 플래그의 길이가 39글자로 가정합니다.
post_sent = False # POST 요청이 전송되었는지 여부를 나타내는 플래그
payload = '' # HTTP 요청 페이로드를 저장할 변수를 초기화합니다.
request_time = 0 # 요청 타임스탬프를 저장할 변수를 초기화합니다.
response_time = 0 # 응답 타임스탬프를 저장할 변수를 초기화합니다.
# pcap의 각 패킷에 대해 내용을 처리합니다.
for timestamp, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
# Ethernet 데이터가 IP 패킷을 포함하는지 확인합니다.
if not isinstance(eth.data, dpkt.ip.IP):
print('지원되지 않는 비 IP 패킷 유형 %s\n' % eth.data.__class__.__name__)
continue
ip = eth.data
tcp = ip.data
if not post_sent and tcp.dport == 80 and len(tcp.data) > 0:
# UTC 타임스탬프를 출력합니다.
time = datetime.datetime.utcfromtimestamp(timestamp)
print('타임스탬프: ', str(time), '(' + str(timestamp) + ')')
request_time = timestamp
# HTTP 요청을 파싱합니다.
http = dpkt.http.Request(tcp.data)
payload = urllib.parse.unquote(http.uri)
print('-- 요청 --\n {0} {1}\n'.format(http.method, payload))
if(http.method == 'POST'):
post_sent = True
elif post_sent and tcp.sport == 80 and len(tcp.data) > 0:
# UTC 타임스탬프를 출력합니다.
time = datetime.datetime.utcfromtimestamp(timestamp)
print('타임스탬프: ', str(time), '(' + str(timestamp) + ')')
response_time = timestamp
# HTTP 응답을 파싱합니다.
http = dpkt.http.Response(tcp.data)
print('-- 응답 --\n{0}'.format(http.status))
# 응답 시간에서 요청 시간을 뺀 값이 2.8초 이상인지 확인합니다.
if(response_time - request_time >= 2.8):
# 페이로드에서 플래그 문자를 추출합니다.
payload = payload[payload.find('LIMIT 1),') + 9:]
idx = int(payload[:payload.find(',')]) - 1
ch = chr(int(payload[payload.find('))=') + 3:payload.find(', SLEEP(3)')]))
flag[idx] = ch
print('\n\n찾았습니다!!\n\n flag[{0}] : {1}\n\n현재 플래그 : {2}'.format(idx, ch, ''.join(flag)))
sleep(0.1)
post_sent = False
# 플래그 문자들을 하나의 문자열로 결합하여 반환합니다.
return ''.join(flag)
def test():
"""테스트 pcap 파일을 열고 패킷을 출력합니다."""
with open('D:\\desktop\\dump.pcap', 'rb') as f: #본인 pcap파일 경로로 해주세요
pcap = dpkt.pcap.Reader(f)
print('플래그 : ' + analyze_packets(pcap))
# 스크립트의 진입점
if __name__ == '__main__':
test()
그냥 실행 하시면 안되고 라이브러리 설치 해주셔야 합니다
728x90
반응형
'Dreamhack > Forensic' 카테고리의 다른 글
WarGame - BMP Recovery 풀이 (0) | 2024.05.19 |
---|---|
WarGame - Snowing! 풀이 (0) | 2024.05.18 |
WarGame - FFFFAAAATTT (0) | 2024.05.17 |
WarGame - Basic_Forensics_1 (0) | 2024.05.17 |
WarGame - lolololologfile (0) | 2024.05.17 |