《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函数。
运行环境修复 ...
《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 ...
近期的赛题复现记录
CISCN决赛-anime
漏洞点
一眼格式化字符串漏洞,但是看到只有三次循环,通过变量i控制的循环次数,可以想到如果能利用这个格式化字符串漏洞先泄露栈地址然后再将i修改大则可以多次利用格式化字符串漏洞。
数据的传输需要经过AES解密,也就是说我们需要输入AES加密后的数据经过解密后的才是正常的数据。
有Key没IV,推测是ECB加密模式,写一个发送的数据的AES加密步骤即可处理。
注意大小端问题
利用思路
先泄露栈地址和libc地址然后格式化字符串漏洞写局部变量i构造多次格式化字符串漏洞,然后再写ogg。
EXP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 ...
《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 ...
Kernel Pwn初探
终于开始入门心心念念的kernel pwn了💘,之前比赛遇到kernel连环境都起不来😭
环境搭建
本人使用的Linux版本如下:
安装依赖
1apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc libelf-dev flex bison
后面如果编译时出现依赖缺少的报错,根据报错再安装对应的依赖
下载Linux源码
123apt install curlcd Desktopcurl -O -L https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.169.tar.xz
下载Linxu源码的地址:https://cdn.kernel.org/pub/linux/kernel/
解压缩后进入到源码目录中
配置编译选项
1make menuconfig
执行此命令会出现以下界面
需要设置几个选项
12Kernel hacking -> Compile-time checks and compiler optio ...
2024春秋杯夏季赛Pwn
CTF-Shuffled_Execution
题目分析
开了这么多沙盒保护,正常的ORW都被ban了,open可以用openat替代,read可以用mmap替代,write可以用writev替代,所以思路就是调用openat、mmap、writev即可
注意这个strlen,用’\x00’截断绕过即可。
EXP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *from pwn import u64,u32,p64,p32from ctypes import *from libcfind import *from LibcSearcher import *import base64import syscontext(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", ...
2024ciscn华中分区赛部分题解
baby_jit
程序禁用了execve,所以需要ORW读
代码分析
程序两个功能,一个add功能,一个exec功能。
add
add功能实际上就是创建一个堆区保存输入的内容,然后复制到dest中。没有发生溢出
exec
exec函数实际上就是mmap出了一个可读可写可执行的区域,然后经过赋值的操作最后跳转跳转过去执行。
注意观察 v7 = ((v2 + 0x100000))();
这一步实际上就是call rdx到mmap申请的区域执行,v2的值是根据上面的 v2 = (atof(s) * 12.0)得来的。通过控制输入的offset值就能控制call rdx的位置。
所以接下来的目的是将shellcode读入到mmap内存中去。
v5 = strtoull(s1 + 4, &endptr, 10);
这一步是处理我们add功能输入的内容。如果我们控制输入的内容为"add 144",那么这个函数就会将字符串形式的144转化为144整数保存到v6区域(mmap申请的可读可写可执行内存)中,也就是会保存为’\x90’,也就是nop。所以同理,如果我们在 ...