利用RPCCLIENT进行密码喷洒攻击与内网渗透技巧

本文详细介绍了在仅能访问Linux主机的情况下,如何利用Samba工具套件中的RPCCLIENT进行Windows域用户枚举、密码策略探测及密码喷洒攻击,并探讨了相关防御建议与技术细节。

密码喷洒与RPCCLIENT的其他乐趣

作者:Joff Thyer

注意: 本博文中提到的技术和工具可能已过时,不适用于当前情况。然而,这篇博文仍可作为学习机会,并可能更新或集成到现代工具和技术中。

我们渗透测试社区的许多人都习惯于这样的场景:我们在Windows企业环境中成功实施了一次定向钓鱼活动,并获得了访问Windows命令行网络工具的绝佳权限。你获得了shell,转眼间就准备运行所有喜欢的枚举命令。例如:

1
2
C:\> NET VIEW /DOMAIN
C:\> NET GROUP “Domain Administrators” /DOMAIN

……等等。更不用说,你通常还可以使用Metasploit的后渗透模块和各种PowerShell工具(如Veil和PowerShell Empire)的众多功能。

想象一下,你只有一个Linux主机可用,位于内部网络中,无法通过后门shell访问任何现有的Windows系统。想象一下,你被有效地与网络的其他部分隔离,甚至无法使用Ettercap等拦截技术捕获有用的网络流量。这确实是我最近遇到的情况,我只能SSH到我控制的单个Linux主机。

在有一段时间没有遇到这种情况后,我停顿了一下,才想起了Samba的奇妙世界。特别是,Samba套件中有两个优秀且实用的程序,即“rpcclient”和它的朋友“smbclient”。另外,我们不要忘记我们最喜欢的DNS工具“dig”。

我的第一个任务是利用可用的侦察信息,对内网域名进行有根据的猜测。这里有几个不同的方法可以考虑,但首先是使用dig来确定有用的DNS信息。我可以尝试查找Windows全局目录记录和权威域服务器记录,以确定域控制器的地址。示例如下:

1
2
dig -t SRV _gc._tcp.domain.corp
dig -t SRV _ldap._tcp.dc._msdcs.domain.corp

这只有在预测或确定了正确的“domain.corp”名称后才会给我答案。

幸运的是,我可以访问内部的Nessus漏洞报告数据,并确定某些主机允许SMB空会话。我将数据与dig结果匹配,发现空会话实际上对应于域控制器地址。我的下一个任务是尝试仅使用rpcclient从域控制器枚举用户和组信息。我通过查看“man”页面迅速确定,rpcclient确实可以执行匿名绑定,如下所示:

1
rpcclient -U "" -N 10.10.10.10

其中10.10.10.10是我可以匿名绑定的域控制器的选定地址。运行该命令后,rpcclient会给出极好的“rpcclient>”提示。此时,如果你可以使用匿名会话,那么该工具中有一些非常有用的命令。

  1. 枚举域用户

    1
    
    enumdomusers
    
  2. 枚举域组

    1
    
    enumdomgroups
    
  3. 查询组信息和组成员

    1
    
    querygroupmem <group_rid>
    
  4. 通过RID查询特定用户信息(包括计算机)

    1
    
    queryuser <user_rid>
    

使用这些基本命令,我能够彻底调查Windows域用户和组信息的概况。

渗透测试中常用的另一种技术称为“密码喷洒”。这是一种特别有效的技术,即给定一个域用户列表并了解非常常见的密码使用情况,测试人员尝试对列表中的每个用户执行登录。这种技术非常有效,因为你有意将尝试的密码列表限制在少数几个。事实上,建议每次喷洒尝试只使用一个密码,因为你真的不想锁定账户。

在密码喷洒之前,使用诸如“NET ACCOUNTS /DOMAIN”之类的命令确定Windows域密码策略非常有用。然而,鉴于我们没有可用的Windows shell,rpcclient为我们提供了以下选项:

1
rpcclient> getdompwinfo

至少我们能够确定关于密码长度的关键信息。写完这篇文章后,我可能会研究如何解码密码属性并将其与适当的信息匹配,但我还没有完成这项任务。

为了执行密码喷洒攻击,下一步是选择一个常见密码(例如“Autumn2015”),并找出如何使用rpcclient进行喷洒的技术。方便的是,rpcclient允许我们在命令行中指定一些命令,这非常方便。以下两个示例显示了成功登录与失败登录。(密码“bbb”是正确的登录)。

成功登录:

1
rpcclient -U "user%bbb" -c "getusername;quit" 10.10.10.10

失败登录:

1
rpcclient -U "user%wrongpass" -c "getusername;quit" 10.10.10.10

在这些示例中,我们明确告诉rpcclient运行两个命令,即“getusername”然后“quit”退出客户端。现在我们拥有了执行密码喷洒攻击的所有要素。我们只需要一个bourne/bash shell循环,就可以开始了。假设“enumdomusers”输出在“domain-users.txt”文件中,一个简单的shell脚本或命令行喷洒示例如下:

1
2
3
for user in $(cat domain-users.txt); do
    rpcclient -U "${user}%Autumn2015" -c "getusername;quit" 10.10.10.10
done

当你看到输出中出现“Authority”字符串时,你就知道成功了。每个用户失败的情况将是“NT_STATUS_LOGON_FAILURE”消息。

如果你开始收到“ACCOUNT_LOCKED”失败,你应该立即停止喷洒,因为你可能在短时间内喷洒了太多次。

假设你获得了凭据,你可以做的另一件好事是使用smbclient程序探索SYSVOL。语法如下:

1
smbclient //10.10.10.10/SYSVOL -U "user%password"

我强烈建议熟悉UNIX Samba套件,尤其是这些工具。在过去的一周里,它们确实救了我,将来你可能也需要这些有趣的工具。

评论

Antoine — 2017年1月26日 @ 1:23 am

嗨, 优秀的帖子,一如既往!🙂 我有一个(愚蠢的)问题:假设你通过密码喷洒找到了一些凭据,如何从你的Linux主机生成一个Windows shell?你具体使用什么(命令、工具等)?Windows主机/服务器上需要开放什么才能连接到它?

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