Password Filter DLL 在渗透测试中的应用

发布于 2024-11-14 15:59:52 字数 6626 浏览 2 评论 0

0x00 前言

在之前的文章《域渗透——Hook PasswordChangeNotify》介绍了通过 dll 注入 Hook PasswordChangeNotify 来记录新密码的方法,相当于是对 API PasswordChangeNotify 的利用。 我们知道,API PasswordChangeNotify 是 Password Filter DLL 的一个功能函数,那么,对于 Password Filter DLL 本身,能否直接开发一个可供利用的 DLL 呢?

0x01 简介

本文将要介绍以下内容:

  • Password Filter DLL 简介
  • 利用 Password Filter DLL 记录明文密码
  • 利用 Password Filter DLL 实现的后门
  • 非 Windows Server 系统下的应用

0x02 Password Filter DLL 简介

现实中使用 Windows 系统时,为了提高系统安全性,防止用户密码被暴力破解,系统管理员往往会对用户密码的复杂度提出要求,可通过配置组策略开启

位置如下:

gpedit.msc -> 本地计算机策略 -> 计算机配置 -> Windows 设置 -> 安全设置 -> 帐户策略 -> 密码策略 -> 密码必须符合复杂性要求

启用后,密码必须符合下列最低要求:

  • 不能包含用户的帐户名,不能包含用户姓名中超过两个连续字符的部分
  • 至少有六个字符长
  • 包含以下四类字符中的三类字符:
  • 英文大写字母(A 到 Z)
  • 英文小写字母(a 到 z)
  • 10 个基本数字(0 到 9)
  • 非字母字符(例如 !、$、#、%)

默认值:

  • 在域控制器上启用
  • 在独立服务器上禁用

如果该策略仍无法满足对密码复杂度的要求,可以使用 Password Filter DLL 进一步提高密码的复杂度

实现思路:

  1. 通过修改注册表的方式安装 Password Filter DLL
  2. 用户修改密码时,自动加载 Password Filter DLL,导入明文密码
  3. 在 Password Filter DLL 中开发者可以自定义密码复杂度,同明文密码的复杂度进行比较,如果明文密码不满足复杂度条件,弹框提醒用户,密码修改失败

具体使用方法可参考官方文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ms721766(v=vs.85).aspx

0x03 Password Filter DLL 的开发

支持以下三个函数:

  • BOOLEAN InitializeChangeNotify(void);
  • NTSTATUS PasswordChangeNotify(In PUNICODESTRING UserName,_In ULONG RelativeId,In PUNICODE_STRING NewPassword);
  • BOOLEAN PasswordFilter(In PUNICODESTRING AccountName,_In PUNICODESTRING FullName,_In PUNICODESTRING Password,_In BOOLEAN SetOperation);

参考资料:https://msdn.microsoft.com/en-us/library/windows/desktop/ms721849(v=vs.85).aspx

值得注意的地方:

  • API PasswordChangeNotify 和 PasswordFilter 的传入参数均包括用户的明文密码
  • API PasswordFilter 的返回值为 TRUE 表示密码符合要求,返回 FALSE 表示密码不符合复杂度要求,弹框提示用户修改
  • 在编写 Password Filter DLL 时,需要声明导出函数

提供一个可供参考的 POC,地址如下:https://github.com/3gstudent/PasswordFilter

该工程声明了导出函数 InitializeChangeNotifyPasswordChangeNotifyPasswordFilter

分别使用 PasswordChangeNotifyPasswordFilter 记录明文密码,保存在 c:\logFile1c:\logFile2

在编译时需要同目标系统的平台对应

%wZ 表示输出 PUNICODE_STRING,unicode 的字符串指针类型

0x04 Password Filter DLL 的安装

1、注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下的 Notification Packages ,添加 Password Filter DLL 的名称,不包括后缀名.dll

2、将 Password Filter DLL 保存在%windir%\system32\下

3、组策略开启组策略密码必须符合复杂性要求

4、重启系统(注销当前用户不会生效)

5、修改任一用户密码,加载 Password Filter DLL

实际测试:

测试系统: Windows Server 2008 R2 x64

将 Password Filter DLL 工程编译生成 64 位的 Win32Project3.dll

  1. 将 Win32Project3.dll 保存在%windir%\system32\下
  2. 修改注册表键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下的 Notification Packages ,添加 Win32Project3

如下图

Alt text

通过命令行实现的方式如下:

读取键值:

REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v "Notification Packages"

获得键值内容:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
    Notification Packages    REG_MULTI_SZ    scecli\0rassfm

添加 Win32Project3:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v "Notification Packages" /t REG_MULTI_SZ /d "scecli\0rassfm\0Win32Project3" /f

注:

\0 表示换行

3、Windows Server 系统的组策略默认开启密码必须符合复杂性要求

4、重启系统

5、修改用户密码

6、记录明文密码

如下图

Alt text

注:

能够记录所有用户,包括未登录用户

0x05 域环境下的应用

1、记录明文密码

针对域控服务器,需要获得域控服务器权限,在%windir%\system32\下放置 Password Filter DLL,修改注册表键值

2、后门

将 Password Filter DLL 改为启动后门,例如弹回 Meterpreter 的 shell,域内任一用户在修改密码时均会加载 Password Filter DLL,弹回高权限的 shell

0x06 非 Windows Server 系统的应用

目前大部分资料均认为 Password Filter DLL 仅适用 Windows Server 系统,对于非 Windows Server 系统来说,同样可以使用,只是组策略默认禁用 组策略密码必须符合复杂性要求

因此需要注意以下问题:

1、命令行查看当前系统的组策略配置

组策略配置存储在数据库中,位于 %windir%\security\database\secedit.sdb

读取命令如下(管理员权限):

secedit /export /cfg gp.inf /quiet

参数说明:

  • 没有设置/db 参数,表示数据库采用默认 %windir%\security\database\secedit.sdb
  • /quiet 表示不生成日志,否则生成的日志默认保存在 %windir%\security\logs\scesrv.log

命令执行后生成文件 gp.inf,查看 gp.inf 中的 PasswordComplexity 项,1 代表开启,0 代表关闭

注:gp.inf 中的内容不完整,想要获得完整的组策略配置还需要读取注册表

2、修改组策略配置,开启组策略密码必须符合复杂性要求

首先导出配置文件 gp.inf,将 PasswordComplexity 项设为 1,保存

导入数据库:

secedit /configure /db gp.sdb /cfg gp.inf /quiet

刷新组策略,立即生效(否则,重启后生效):

 gpupdate/force

0x07 防御检测

根据利用思路,攻击者首先需要获得当前系统的管理员权限

检测思路如下:

  1. 查看 %windir%\system32\ 下有无可疑 dll
  2. 查看注册表键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下的 Notification Packages
  3. 查看进程 lsass.exe 加载的 dll

如下图

Alt text

0x08 小结

Password Filter DLL 本是系统提供的正常功能,但如果获得了系统的管理员权限,利用这项功能不仅能够记录明文密码,还能用作后门。

本文结合具体的利用思路,介绍了检测方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
24 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文