密码喷洒工具调试指南:FOR命令解析与引号处理

本文详细介绍了在Windows环境下使用FOR命令进行密码喷洒测试时遇到的令牌解析问题,通过手动调试和文档查阅,解决了密码文件中空格导致的解析错误,并提供了修正后的完整命令。

检查你的工具

在域渗透测试中,许多人使用一行式密码喷洒脚本来检测域用户是否使用了弱密码(如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

为了更易读,可以分解为:

  • @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

流程是:对password.txt中的每一行设置变量%p,对每个%p从users.txt中设置变量%n,尝试连接到域控制器的IPC$共享并忽略输出。如果连接成功,则输出用户名和密码,然后断开。

为了缩小范围,从读取测试文件并输出到stdout开始,以确保文件读取正确。可能的问题包括行结束序列、字符编码或命令行文件名传递。

快速发现问题是只获取了行的第一个单词,而不是整行。本以为按行读取,但实际是解析成零个或多个令牌,默认分隔符是制表符和空格。

通过指定分隔符(如"delims=")来解决,但需确保密码中不包含所选分隔符。测试了加号和空字符,最终使用空字符串有效。

知道了空格导致的问题后,下一个问题是需要在命令行中引用包含空格的项。懒惰的黑客通常避免在文件名中使用空格以避免引用。测试发现,在脚本中输出%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 设计