Echoed Mysteries
Given a Chall.pcapng file with Echoed Mysteries as task name
ICMP For Sure

Its obvious that the flag is being sent as a single letter in replies
In 43 length packets
from scapy.all import * # pip install scapy
import re # pip install regex
import sys # Import the sys module
def extract_from_pcap(pcap_file, target_ip):
"""
Extracts hidden data from ICMP packets in a PCAP file.
Args:
pcap_file: The path to the PCAP file.
target_ip: The IP address of the source of the packets we care about.
Returns:
The reassembled flag, or None if no flag is found.
"""
extracted_letters = []
def packet_callback(packet):
nonlocal extracted_letters
alphabet = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'{','}','_'
]
if ICMP in packet and packet[ICMP].type == 0 and packet[IP].src == target_ip: # ICMP Echo Reply (type 0)
try:
payload = packet[Raw].load.decode('latin-1', 'ignore')
# Added check for alpha characters / numerical
if len(payload) > 0 and payload.strip() in alphabet:
extracted_letters.append(payload)
print(f"Extracted letter: {payload}") # debug
except UnicodeDecodeError as e:
print(f"UnicodeDecodeError: {e}")
except AttributeError as e:
print(f"AttributeError: No Raw layer in packet. {e}")
except Exception as e:
print(f"Some error {e}")
print(f"Reading packets from PCAP file: {pcap_file}")
try:
packets = rdpcap(pcap_file) # Read the PCAP file
except FileNotFoundError:
print(f"Error: PCAP file '{pcap_file}' not found.")
return None
for packet in packets:
packet_callback(packet)
reassembled_flag = "".join(extracted_letters)
if reassembled_flag:
print(f"Reassembled Flag: {reassembled_flag}")
return reassembled_flag
else:
print("No flag extracted.")
return None
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python icmp.py <pcap_file> <target_ip>")
sys.exit(1)
pcap_file = sys.argv[1] # Get PCAP file from command line
target_ip = sys.argv[2] # Get target IP from command line
flag = extract_from_pcap(pcap_file, target_ip)
if flag:
print(f"Extracted Flag: {flag}")
else:
print("Failed to extract the flag.")And the result is
PS C:\Users\saleh\Desktop\CTFs\FL1TZ\Forensics\Echoed Mysteries> python .\solve.py .\Chall.pcapng 192.168.1.19
Reading packets from PCAP file: .\Chall.pcapng
Extracted letter: F
Extracted letter: L
Extracted letter: 1
Extracted letter: T
Extracted letter: Z
Extracted letter: {
Extracted letter: H
Extracted letter: 1
Extracted letter: D
Extracted letter: D
Extracted letter: 3
Extracted letter: N
Extracted letter: _
Extracted letter: 1
Extracted letter: N
Extracted letter: _
Extracted letter: 1
Extracted letter: C
Extracted letter: M
Extracted letter: P
Extracted letter: _
Extracted letter: P
Extracted letter: 4
Extracted letter: C
Extracted letter: K
Extracted letter: 3
Extracted letter: 7
Extracted letter: S
Extracted letter: }
Reassembled Flag: FL1TZ{H1DD3N_1N_1CMP_P4CK37S}
Extracted Flag: FL1TZ{H1DD3N_1N_1CMP_P4CK37S}Source Code of Task
from scapy.all import *
import time
target_ip = "192.168.1.18"
flag = "FL1TZ{H1DD3N_1N_1CMP_P4CK37S!!!}"
fake_flag = ""
def packet_reply(letter, target_ip):
packet = IP(dst=target_ip) / ICMP(type="echo-reply", id=1234, seq=1) / letter
send(packet)
def packet_request(target_ip):
packet = IP(dst=target_ip) / ICMP(type="echo-request", id=1234, seq=1)
send(packet)
def send_packets(target_ip) :
for letter in flag:
packet_request(target_ip)
print(f"SENT ICMP REQUEST PACKET")
time.sleep(1)
packet_reply(letter, target_ip)
print(f"SENT ICMP REPLY PACKET WITH LETTER: {letter}")
time.sleep(2)
send_packets(target_ip)Last updated
Was this helpful?