《IOT废物学习之路》(11)CVE-2024-39226 GL-iNet 路由器RPC漏洞分析
GL-iNet路由器介绍
GL-iNet使用的是基于OpenWrt的操作系统通过配合OpenResty来增强其web管理界面和API的功能。
OpenWrt是一个基于 Linux 的开源嵌入式操作系统,可拓展性很高。
OpenResty基于NGINX实现,内置lua脚本。
QEMU-system模拟
感觉FirmAE、firmadyne都具有很多局限性,确实不如直接用qemu-system去模拟
固件下载:
https://dl.gl-inet.cn/
启动文件下载:
镜像:vmlinuz-3.2.0-4-vexpress
硬盘镜像:debian_wheezy_armhf_standard.qcow2
初始RAM磁盘文件:initrd.img-3.2.0-4-vexpress
qemu-system模拟
1sudo qemu-system-arm -M vexpress-a9 -cpu cortex-a15 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd, ...
OLLVM初探
OLLVM介绍
是LLVM项目的一个开源分支,目的是通过代码混淆和防篡改来提高软件的安全性。
OLLVM提供了三种经典代码混淆方式:
控制流平坦化 Control Flow Flattening
虚假控制流 Bogus Control Flow
指令替换 Instruction Subsititution
环境配置
1234567891011docker pull nickdiego/ollvm-buildgit clone https://github.com/nickdiego/docker-ollvm.gitgit clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git#切换到docker-ollvm文件夹内#打开ollvm-build.sh文件,在149与150行之间加入DOCKER_CMD+=" -DLLVM_INCLUDE_TESTS=OFF"#运行脚本sudo ./ollvm-build.sh ../obfuscator#配置软链接指向ollvm的clang,防止与ll ...
LLVM环境搭建以及调试配置
在搭建LLVM的环境之前有着一些对编译原理的盲区,以及对gcc、g++、clang、clang++、makefile、make、cmake、cmakelist、ninja这些定义有些模糊不清,所以先补充一下这些前置知识
简单认识编译原理
编译过程分为五个步骤,按照执行流程的话又分为前端、中端、后端
编译器实际上也是一种电脑程序,作用就是把我们输入的某种编程语言写的源代码(原始语言)转换成另一种编程语言(目标语言)
编译各个阶段的展示
词法分析
我们编写的源代码实际上就是一串线性字符流、扫描器通过接收线性字符流,将其组合成一系列类似单词的东西。在编程语言中,每个词都被称作词法单元。有些词法单元是单个字符,也有的是很多字符。(生成的词法单元也被称作token)
源代码中的注释和空格实际上没有任何意义
语法分析
通过将扁平的词法单元序列转化为树形结构,树形结构能更好的反应嵌套本质。这些树被抽象语法树(AST, Abstract Syntax Tree)
语义分析
通过抽象语法树来作上下文相关的分析,获得一些信息(类型信息、引用信息),通过会直接存储到语法树本身的属性中。
...
《IOT废物学习之路》(10)--Linksys_WRT54G路由器溢出漏洞分析
漏洞介绍
https://www.exploit-db.com/exploits/10028
由漏洞报告可知,该漏洞存在于此路由器Web服务器程序HTTPD的apply.cgi处理脚本中,是由于POST发送的数据data超过10000导致的溢出。
前置步骤
固件下载
1https://gitee.com/xj96/router-firmware/raw/master/linksys_wrt54gv2_fw4007.zip
固件解包
1binwalk -Me WRT54GV3.1_4.00.7_US_code.bin
漏洞分析
定位漏洞程序
1find . -name 'httpd*'
查看程序架构
1readelf -h ./usr/sbin/httpd
MIPSEL的32位程序
代码分析
定位到apply_cgi函数,交叉引用到sub_4113A0函数,发现无法再进行向上查看调用函数,说明如果想让程序走到这个函数必须先让httpd服务跑起来,当http处理POST请求的时候则会进入到sub_4113A0函数进而执行apply_cgi函数。
运行环境修复 ...
近期的赛题复现记录
CISCN决赛-anime
漏洞点
一眼格式化字符串漏洞,但是看到只有三次循环,通过变量i控制的循环次数,可以想到如果能利用这个格式化字符串漏洞先泄露栈地址然后再将i修改大则可以多次利用格式化字符串漏洞。
数据的传输需要经过AES解密,也就是说我们需要输入AES加密后的数据经过解密后的才是正常的数据。
有Key没IV,推测是ECB加密模式,写一个发送的数据的AES加密步骤即可处理。
注意大小端问题
利用思路
先泄露栈地址和libc地址然后格式化字符串漏洞写局部变量i构造多次格式化字符串漏洞,然后再写ogg。
EXP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 ...
《IOT废物学习之路》(9)--D-Link-DIR-505路由器越界漏洞分析
漏洞介绍
https://www.exploit-db.com/exploits/34064
根据漏洞报告漏洞存在于/usr/bin/my_cgi.cgi中,POST请求方法中的请求体参数溢出导致的。
前置步骤
固件下载
https://files.dlink.com.au/products/DIR-505/REV_A/Firmware/v1.06b05/DIR505A1_FW106B05.bin
固件提取
提取固件中的文件系统
1binwalk -Me DIR505A1_FW106B05.bin
漏洞分析
查看漏洞程序文件格式
1readelf -h ./usr/bin/my_cgi.cgi
mips架构的大端
代码分析
漏洞程序是my_cgi.cgi,其中导致溢出的参数是storage_path,在IDA中搜索字符串然后交叉引用向上寻找调用函数处。
定位到了get_input_entries函数,再向上交叉引用找到如何才能触发漏洞导致溢出。
此时在main函数当中v7是CONTENT_LENGTH,v41是初始化之后的缓冲区。猜测可能是因为CONTENT_LENGT ...
《IOT废物学习之路》(8)--D-Link-DIR-645路由器溢出漏洞分析
复现的过程实际上更多学习的是漏洞挖掘的思路,站在挖掘者的角度去思考
漏洞介绍
从漏洞报告来看这个漏洞主要是因为authentication.cgi造成的栈溢出导致的。
前置步骤
固件下载
1https://files.dlink.com.au/products/DIR-645/REV_A/Firmware/DIR645_FW103B11/
固件提取
1binwalk -Me DIR645A1_FW103B11.bin
漏洞分析
定位漏洞程序
1find . -name authentication.*
查看authentication.cgi发现重定向的是cgibin
查看漏洞程序文件格式
1readelf -h cgibin
MIPS架构的小端序
确定架构方便我们之后配合qemu模拟进行动态分析
代码分析
首先定位到cgibin中的authentication_main函数部分,对应的是authentication.cgi
因为漏洞是栈溢出,所以如果想先验证此漏洞需要传入能造成溢出的padding来找到溢出的地方,但是一般路由器的数据发包都会验证一些web环境变量,比如 ...
Kernel Pwn第四弹(路径劫持)
基础知识
modprobe_path
modprobe_path指向了一个内核在运行未知文件类型时运行的二进制文件;当内核运行一个错误格式的文件的时候,会调用这个modprobe_path所指向的二进制文件去,如果我们将这个字符串指向我们的自己的恶意二进制文件,那么在发生错误的时候就可以执行我们的恶意文件了。
1cat /proc/kallsyms | grep modprobe_path
可以查看modprobe_path在内核中的地址
mod_tree
mod_tree是一块包含了模块指针的内存地址的内核地址,通过查看这个位置我们可以获取到驱动ko文件的地址,在我们需要泄露模块基地址,但是在堆或栈中没有找到的时候可以查看这块内存区域
1grep mod_tree /proc/kallsyms
题目附件
initramfs.cpio打包的文件系统
bzImage内核镜像
hackme.ko漏洞驱动
start.sh启动脚本
提取出文件系统
1cpio -idmv < initramfs.cpio
提取出vmlinux便于调试
1vmlinux-to-elf bzImage ...
Kernel Pwn第三弹(条件竞争)
double fetch(条件竞争)
条件竞争发生在多线程多进程中,往往是因为没有对全局数据、函数进行加锁,导致多进程同时访问修改,使得数据与理想的不一致而引发漏洞。
kernel中当内核态对用户态的数据或利用指向用户态的指针进行数据复制或其他操作时有两个过程:
对用户态的地址进行检查,判断是否是属于用户态的合法地址
再对用户态的内存数据进行操作
条件竞争就是发生在这两步的中间,当检查通过之后,但是有其他恶意线程对地址就行了修改,那么此时第二步操作时的地址就是被修改的。
题目分析
baby.ko存在漏洞的驱动
start.sh启动脚本
vmlinuz-4.15.0-22-generic内核源码
core.cpio打包的文件系统
start.sh
12345678qemu-system-x86_64 \-m 256M -smp 2,cores=2,threads=1 \-kernel ./vmlinuz-4.15.0-22-generic \-initrd ./core.cpio \-append "root=/dev/ram rw console=ttyS0 oo ...
Kernel Pwn第二弹(内核栈溢出)
再从一道题熟悉一下Kernel ROP的流程
题目分析
附件
给出了四个文件:
bzImage内核镜像
core.cpio打包的文件系统
start.sh启动脚本
vmlinux内核源码
先用file查看core.cpio文件,发现是gzip压缩过的,所以先利用gunzip解压出cpio文件
1gunzip core.cpio.gz
再使用cpio提取出文件系统
1cpio -idmv < rootfs.cpio
其中有一个gen_cpio.sh是打包core.cpio的命令。
init
再看一下init文件中的内容:
123456789101112131415161718192021222324#!/bin/shmount -t proc proc /procmount -t sysfs sysfs /sysmount -t devtmpfs none /dev/sbin/mdev -smkdir -p /dev/ptsmount -vt devpts -o gid=4,mode=620 none /dev/ptschmod 666 /dev/ptmxcat /proc ...