ICTSC2023予選　知識問題5  WriteUp

# はじめに
余裕で間違ってるかもしれません。回答見て間違ってたら再走します


# 問題
あるセキュリティコンテストにおいて、パケットキャプチャを取得した。
全部で12チームが参加しており、攻撃の対象は 10.10.11.1 だった。
しかし、それ以外のIPアドレスは全て 0.0.0.0 に書き換えられており、どこから送信されたのかわからなくなっている。
このファイルを解析して、次の問いに答えよ。
## 問1
IPアドレス 10.10.11.1 をもつホストにおいて、動作しているサービスのポート番号はどれか。複数ある場合は、最も通信量が多いものを答えよ。

- 80
- 443
- 33333
- 46345
- 59364

## 問2 
問1で答えたポートで動作しているサービスの説明として、最も適切なものを以下から選べ。

- 標準的なHTTPプロトコルを介したアプリケーションが動作している。

- テキストベースのコマンドでノートを記録し、閲覧することができるアプリケーションが動作している。

- 言語処理系のインタプリタが実装されており、その入力を受け付けるアプリケーションが動作している。

- あるファイル共有プロトコルを介してファイルのやりとりをするアプリケーションが動作している。

## 問3
アプリケーションに対して発生している攻撃はどれか。次のうちから該当するものを全て答えよ。
- パストラバーサル

- バッファオーバーフロー

- レースコンディション

- OSコマンドインジェクション

- HTTPヘッダインジェクション


## 問4
一番最初のパケット（1 2023-08-12 03:25:25.215874 0.0.0.0 10.10.11.1 TCP 78 49681 → 59364 [SYN] Seq=0 Win=65535 Len=0 MSS=1380 WS=64 TSval=3335658758 TSecr=0 SACK_PERM）について、IP層のヘッダーのチェックサムの値は何か。
- (選択肢控えるの忘れた)

## 問5
このキャプチャを取得した環境において、ネットワーク中に参加している端末の本来のIPは 10.0.{1-12}.{100-} の範囲である。
問4のパケットについて、送信元の本来のIPアドレスは何か。

- 10.0.1.100

- 10.0.2.101

- 10.0.3.101

- 10.0.4.100

- 10.0.5.100

- 10.0.6.101

- 10.0.7.101

- 10.0.8.100

- 10.0.9.100

- 10.0.10.101

## 問6
このキャプチャにおいて、10.10.11.1 と最も多くのパケットを送受信したIPアドレスはどれか。

- 10.0.1.100

- 10.0.2.101

- 10.0.3.101

- 10.0.4.100

- 10.0.5.100

- 10.0.6.101

- 10.0.7.101

- 10.0.8.100

- 10.0.9.100

- 10.0.10.101

- 10.0.11.101

# 回答
## 問1
```py
from scapy.all import rdpcap, IP, TCP

packets = rdpcap('test.pcap')
port_traffic = {}

for packet in packets:
    if IP in packet and packet[IP].dst == "10.10.11.1" and TCP in packet:
        port = packet[TCP].dport
        port_traffic[port] = port_traffic.get(port, 0) + len(packet)

most_active_port = max(port_traffic, key=port_traffic.get)
print(most_active_port)
```
- 59364

## 問2
```py
from scapy.all import rdpcap, IP, TCP, Raw

def analyze_payloads(pcap_file, port):
    packets = rdpcap(pcap_file)
    for packet in packets:
        if IP in packet and TCP in packet and packet[TCP].dport == port:
            # ペイロードがある場合、その内容を表示
            if packet.haslayer(Raw):
                payload = packet[Raw].load
                try:
                    # ペイロードをテキストとして解釈
                    text = payload.decode('utf-8', errors='replace')
                    print(text)
                except Exception as e:
                    print(f"Error decoding payload: {e}")

# パケットキャプチャファイルのパスとポート番号を指定
pcap_file = 'test.pcap'
analyze_payloads(pcap_file, 59364)
```
- 言語処理系のインタプリタが実装されており、その入力を受け付けるアプリケーションが動作している。

## 問3
- バッファオーバーフロー
- OSコマンドインジェクション

## 問4
```py
from scapy.all import rdpcap, IP

pcap_file = 'test.pcap'

packets = rdpcap(pcap_file)

# Find the first packet with an IP layer
for packet in packets:
    if IP in packet:
        first_ip_packet = packet
        break

# Extracting the checksum from the IP layer of the first packet
ip_checksum = first_ip_packet[IP].chksum
print(hex(ip_checksum))
print(ip_checksum)
```
- 0x1a4a

## 問5
```py
from scapy.all import *

pkts = rdpcap('test.pcap')

# 送信元IPアドレスが書き換えられたパケットのチェックサムを取得する
original_checksum = pkts[0][IP].chksum

# 可能性のある全てのIPアドレスについて、そのIPアドレスを送信元とした場合のチェックサムを計算する
for i in range(1, 13):
    for j in range(100, 256):
        # 新しいパケットオブジェクトを作成し、送信元IPアドレスを書き換える
        pkt = pkts[0].copy()
        pkt[IP].src = f'10.0.{i}.{j}'
        # チェックサムを再計算する
        pkt[IP].chksum = None
        pkt = pkt.__class__(bytes(pkt))
        # 計算したチェックサムが元のパケットのチェックサムと一致するか確認する
        if pkt[IP].chksum == original_checksum:
            print(f'10.0.{i}.{j}')
            break
```
- 10.0.5.100

## 問6
- 解いてない　(追記するかも)

# おわりに
運営の皆さん, 運営ありがとうございました.全体的に難しかったですが,楽しく問題を解けました.
知識問題全般を対応後に, 実技問題一問に目を通して解けたんだけど,回答が間に合わず...