
eBPFベースのツールキット。ネットワークトラフィックのスニッフィング、OpenSSL TLSキーの抽出、Scapyを使用したリアルタイムでのTLS 1.2接続の傍受・復号化を行います。
peetch は、eBPF のさまざまな側面を実験し、TLS プロトコルの保護をバイパスするためのツールコレクションです。
現在、peetch は3つのサブコマンドを含んでいます。1つ目は dump で、各パケットにソースプロセスの情報を関連付けてネットワークトラフィックをスニッフィングします。2つ目は tls で、OpenSSL を使用しているプロセスを特定し、暗号鍵を抽出します。3つ目は proxy で、OpenSSL を使用するプロセスからの TLS トラフィックを自動的にインターセプトし、メッセージをその場で復号します。
最初の2つのコマンドを組み合わせることで、PCAPng 形式で記録された TLS 交換を復号することが可能になります。
peetch は bcc や Scapy を含むいくつかの依存関係に依存しています。以下のコマンドを使用して Docker イメージを簡単にビルドし、peetch をテストできます:
docker build -t quarkslab/peetch .
以下の例では、次のコマンドを使用して Docker イメージに入り、その中で例を実行したことを前提としています:
docker run --privileged --network host --mount type=bind,source=/sys,target=/sys --mount type=bind,source=/proc,target=/proc --pid host --rm -it quarkslab/peetch
dumpこのサブコマンドを使用すると、eBPF TC 分類子を使用してパケットをスニッフィングし、対応する PID とプロセス名を取得できます:
peetch dump
curl/1289291 - Ether / IP / TCP 10.211.55.10:53052 > 208.97.177.124:https S / Padding
curl/1289291 - Ether / IP / TCP 208.97.177.124:https > 10.211.55.10:53052 SA / Padding
curl/1289291 - Ether / IP / TCP 10.211.55.10:53052 > 208.97.177.124:https A / Padding
curl/1289291 - Ether / IP / TCP 10.211.55.10:53052 > 208.97.177.124:https PA / Raw / Padding
curl/1289291 - Ether / IP / TCP 208.97.177.124:https > 10.211.55.10:53052 A / Padding
現在のところ、dump は IPv4 ベースの TCP セグメントのみをキャプチャすることに注意してください。
便利なように、キャプチャしたパケットは --write を使用してプロセス情報とともに PCAPng に保存できます:
peetch dump --write peetch.pcapng
^C
この PCAPng は Wireshark や Scapy で簡単に操作できます:
scapy
>>> l = rdpcap("peetch.pcapng")
>>> l[0]
<Ether dst=00:1c:42:00:00:18 src=00:1c:42:54:f3:34 type=IPv4 |<IP version=4 ihl=5 tos=0x0 len=60 id=11088 flags=DF frag=0 ttl=64 proto=tcp chksum=0x4bb1 src=10.211.55.10 dst=208.97.177.124 |<TCP sport=53054 dport=https seq=631406526 ack=0 dataofs=10 reserved=0 flags=S window=64240 chksum=0xc3e9 urgptr=0 options=[('MSS', 1460), ('SAckOK', b''), ('Timestamp', (1272423534, 0)), ('NOP', None), ('WScale', 7)] |<Padding load='\x00\x00' |>>>>
>>> l[0].comment
b'curl/1289909'
tlsこのサブコマンドは、OpenSSL を使用するプロセスを特定し、平文や秘密鍵などのいくつかの情報をダンプすることを容易にします。
デフォルトでは、peetch tls はプロセスごとに1行のみ表示します。--directions 引数を使用すると、交換されたメッセージを表示できます:
peetch tls --directions
<- curl (1291078) 208.97.177.124/443 TLS1.2 ECDHE-RSA-AES128-GCM-SHA256
-> curl (1291078) 208.97.177.124/443 TLS1.2 ECDHE-RSA-AES128-GCM-SHA256
OpenSSL バッファの内容を表示するには --content を使用します。
peetch tls --content
<- curl (1290608) 208.97.177.124/443 TLS1.2 ECDHE-RSA-AES128-GCM-SHA256
0000 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET / HTTP/1.1..
0010 48 6F 73 74 3A 20 77 77 77 2E 70 65 72 64 75 2E Host: www.perdu.
0020 63 6F 6D 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A com..User-Agent:
0030 20 63 75 72 6C 2F 37 2E 36 38 2E 30 0D 0A 41 63 curl/7.68.0..Ac
-> curl (1290608) 208.97.177.124/443 TLS1.2 ECDHE-RSA-AES128-GCM-SHA256
0000 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D HTTP/1.1 200 OK.
0010 0A 44 61 74 65 3A 20 54 68 75 2C 20 31 39 20 4D .Date: Thu, 19 M
0020 61 79 20 32 30 32 32 20 31 38 3A 31 36 3A 30 31 ay 2022 18:16:01
0030 20 47 4D 54 0D 0A 53 65 72 76 65 72 3A 20 41 70 GMT..Server: Ap
--secrets 引数は、メモリから抽出された TLS マスターシークレットを表示します。次の例では、--write を使用してマスターシークレットを書き込み、Scapy で TLS メッセージの復号を簡素化します:
(sleep 5; curl https://www.perdu.com/?name=highly%20secret%20information --tls-max 1.2 --http1.1 --tlsv1.2) &
peetch tls --write &
curl (1293232) 208.97.177.124/443 TLS1.2 ECDHE-RSA-AES128-GCM-SHA256
peetch dump --write traffic.pcapng
^C
# Add the master secret to a PCAPng file
editcap --inject-secrets tls,1293232-master_secret.log traffic.pcapng traffic-ms.pcapng
scapy
>>> load_layer("tls")
>>> conf.tls_session_enable = True
>>> l = rdpcap("traffic-ms.pcapng")
>>> l[13][TLS].msg
[<TLSApplicationData data='GET /?name=highly%20secret%20information HTTP/1.1\r\nHost: www.perdu.com\r\nUser-Agent: curl/7.68.0\r\nAccept: */*\r\n\r\n' |>]
proxyこのサブコマンドは、eBPF プログラムを使用して、OpenSSL を使用するプロセスからの TLS トラフィックを自動的にインターセプトし、Scapy を使用してその場でメッセージを復号します。
次の例では、peetch proxy が openssl プロセスによってサーバーに送信された秘密の値を表示します。
peetch proxy
[-] Proxying OpenSSL traffic
[+] Intercepting traffic from openssl/451255 to 172.67.133.176/443 via 127.0.0.1/58039
--> 127.0.0.1:58039 > 172.67.133.176:https tcp
<-- 172.67.133.176:https > 127.0.0.1:58039 tcp
--> 127.0.0.1:58039 > 172.67.133.176:https tcp
<-- 172.67.133.176:https > 127.0.0.1:58039 tcp
--> 127.0.0.1:58039 > 172.67.133.176:https tcp
--> 127.0.0.1:58039 > 172.67.133.176:https tcp
###[ TLS Application Data ]###
data = b'GET /?secret=9590 HTTP/1.1\r\nHost: www.perdu.com\r\n\r\n\n'
設計上、peetch は OpenSSL、IPv4、および TLS 1.2 のみをサポートしています。