
eBPF 기반 툴킷으로, 네트워크 트래픽 스니핑, OpenSSL TLS 키 추출, Scapy를 사용한 TLS 1.2 연결 실시간 가로채기/복호화를 수행합니다.
peetch는 eBPF의 다양한 측면을 실험하여 TLS 프로토콜 보호를 우회하는 것을 목표로 하는 도구 모음입니다.
현재 peetch는 세 가지 하위 명령을 포함합니다. 첫 번째 dump는 각 패킷에 소스 프로세스 정보를 연결하여 네트워크 트래픽을 스니핑하는 것을 목표로 합니다. 두 번째 tls는 OpenSSL을 사용하는 프로세스를 식별하여 암호화 키를 추출할 수 있게 합니다. 세 번째 proxy는 OpenSSL을 사용하는 프로세스의 TLS 트래픽을 자동으로 가로채고 즉시 메시지를 복호화합니다.
처음 두 명령을 결합하면 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는 프로세스당 한 줄만 표시하며, --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
# 마스터 시크릿을 PCAPng 파일에 추가
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만 지원합니다.