TraceBash 2026 — The Silent Echo Çözüm Yazısı
DNS gürültüsü, aldatıcı bir ICMP seli ve sahte bir SSH oturumu gibi görünen küçük bir yakalama. Gerçek mesaj kimsenin bakmadığı iki başlık alanında gizli: ICMP yankılarının IP kimlik alanı ve bir HTTP akışının TCP pencere boyutu.
TraceBash 2026 — The Silent Echo
Gizli kanallar üzerine bir ağ adli bilişim sorusu: görünen her şey aldatmaca, bayrak ise normalde göz ardı ettiğiniz başlık alanlarında yaşıyor.
- Etkinlik: TraceBash 2026
- Kategori: Adli Bilişim (Forensics)
- Dosya:
the_silent_echo.zip→challenge.pcap - Bayrak formatı:
TBCTF{...}
1. Üç konuşma, üçü de şüpheli
Yakalama yalnızca 106 paket. Protokole göre ayırdığınızda üç ayrı hikâye çıkıyor:
DNS 25 paket ubuntu.com, github.com, stackoverflow.com, microsoft.com, google.com sorguları
ICMP 32 paket 192.168.1.111 <-> 10.0.0.222, echo istek/yanıt, yük "AAAA..."
TCP 49 paket iki HTTP akışı ve bir "SSH" akışıÜçü de normal trafik kılığına girmiş birer yanıltmaca. ICMP yükü her pakette 32 baytlık A harfi — hiçbir şey taşımayan bir "sessiz yankı". DNS sorguları hiçbir adı çözmüyor ve işlem kimliği olarak 0 kullanıyor. 22 portundaki "SSH" akışı ise SSH değil:
SSH-2.0-OpenSSH_8.2p1\r\nTm90aGluZyBoZXJlLCBrZWVwIGxvb2tpbmcu\nSon satır base64:
>>> base64.b64decode("Tm90aGluZyBoZXJlLCBrZWVwIGxvb2tpbmcu")
b'Nothing here, keep looking.'Sizi tam anlamıyla "bakmaya devam et" diyen bir yanıltmaca. Demek ki yükler boş — veri başlıklarda olmalı.
2. Göründüğü gibi olmayan iki HTTP akışı
GET /api/v1/status HTTP/1.1 -> 10.0.0.80:80
User-Agent: Mozilla/5.0 ID-Check/1.0
X-Window-Trace: enabled
GET /downloads/ubuntu-22.04.iso -> 10.0.0.88:80
(yanıt: 2304 bayt saf sıfır)ubuntu-22.04.iso indirmesi, sıfırlanmış baytlardan oluşan 18 segment — dosya sistemi yok, veri yok, bir yanıltmaca daha. Ama istek akışı öyle değil: istemci 192.168.1.122 ve X-Window-Trace: enabled başlığı ipucunun kendisi. İki özel başlık da gizli kanalları adlandırıyor: IP ID ve TCP window.
3. Birinci kanal — IP kimlik alanı
Her ICMP echo isteğinin rastgele görünen bir IP id alanı var. Rastgele değil. 16 bitlik bu değerin üst baytı bir karakter:
from scapy.all import rdpcap, IP, ICMP
pk = rdpcap("challenge.pcap")
part1 = "".join(chr(p[IP].id >> 8) for p in pk
if ICMP in p and p[ICMP].type == 8)
# 'TBCTF{h1dd3n_1n_'On altı istek, on altı karakter; her biri çoğu aracın yalnızca ondalık bir sayı olarak gösterdiği bir alanın üst baytında gizli.
4. İkinci kanal — TCP pencere boyutu
İkinci akıştaki HTTP istemcisi, duyurduğu pencereyi hiç "normal" bir değerde göndermiyor. Tüm ACK'leri varsayılan 8192'nin biraz üzerinde oturuyor; bu tabanı çıkarınca kalan değer bir ASCII kodu:
part2 = "".join(chr(p[TCP].window - 8192) for p in pk
if IP in p and TCP in p and p[IP].src == "192.168.1.122"
and p[TCP].dport == 80 and p[TCP].window != 8192)
# 'w1nd0w_4nd_1p_1d!}'Sunucu tarafı sabit 65535 penceresiyle yanıtlıyor; dolayısıyla yalnızca istemcinin değişken penceresi önemli. İki kanalı birleştirmek bayrağı tamamlıyor.
5. Mesajı yeniden birleştirmek
print(part1 + part2)
# TBCTF{h1dd3n_1n_w1nd0w_4nd_1p_1d!}6. Bayrak
TBCTF{h1dd3n_1n_w1nd0w_4nd_1p_1d!}Gizli kanalın tüm amacı şu: başlık metadatasıdır, kimse ona bakmaz. Burada paket gövdeleri bilinçli bir gürültü geçit töreniydi ve cevap iki alana bölünmüştü — ICMP yankılarının IP id'si ve HTTP istemcisinin penceresi — ki çoğu yakalama aracı bunları hiç kaydırmadığınız tek bir sütunda özetler.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver