본문 바로가기

Dreamhack/Forensic

WarGame - sleepingshark 풀이

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