CVE-2021-3156 sudo heap-based bufoverflow 复现&分析
文章首发于安全客
CVE-2021-3156 sudo heap-based bufoverflow 复现&分析
CVE-2021-3156是sudo的一个堆溢出漏洞,可以用来进行本地提权。在类uninx中非root可以使用sudo来以root的权限执行操作。由于sudo错误的转义了\\导致了一个堆溢出漏洞。
漏洞影响版本为1.8.2-1.8.31sp12, 1.9.0-1.9.5sp1,sudo >=1.9.5sp2的版本则不受影响。
感谢luc师傅带我飞。
环境搭建这里我首先使用的是docker ubuntu 20.04,查看一下sudo版本,这里需要注意的是首先需要创建一个普通权限的用户
123456normal@c957df720fc7:/root/pwn/漏洞/CVE-2021-3156/CVE-2021-3156_blasty$ sudo --versionSudo version 1.8.31Sudoers policy plugin version 1.8.31Sudoers file grammar version 46Sudoers I/O plugi ...
2020 纵横杯线下 WP
异或不在星期天-pwn1推测应该是一个栈溢出。但是encode函数太大,无法反汇编,因此这里不知道该怎么利用。
patch的话将return 0函数patch为exit。直接退出,要保存返回值一致的话还需要将rdi清空。
Babyhttpd-pwn2首先用ida反编译看到这是一个pyinstaller打包的文件
123456789101112.rodata:000000000000639D 0000000F C /proc/self/exe.rodata:00000000000063AC 00000019 C Py_DontWriteBytecodeFlag.rodata:00000000000063C5 0000001D C Py_FileSystemDefaultEncoding.rodata:00000000000063E2 0000000E C Py_FrozenFlag.rodata:00000000000063F0 00000019 C Py_IgnoreEnvironmentFlag.rodata:0000000000006409 0000000E C Py_NoSite ...
2021 AntCTFxD3CTF PWN WriteUp
d3dev这里没有加monitor=/dev/null,所以可以直接通过CRTL_ALT_2进入控制台。
d3dev-revengeqemu逃逸
分析首先看一下启动脚本
123456789101112#!/bin/sh./qemu-system-x86_64 \-L pc-bios/ \-m 128M \-kernel vmlinuz \-initrd rootfs.img \-smp 1 \-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 nokaslr quiet" \-device d3dev \-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \-nographic \-monitor /dev/null
我们看到这里的device的名称是d3dev,ida看一下相关的函数,发现存在mmio/pmio两种方式,分别分析一下,首先看一下pmio_read
12345678910uint64_t __fastcall d3dev_pmio_ ...
CVE-2020-14364 QEMU 越界读写漏洞复现&分析
环境搭建创建usb设备
12qemu-img create -f raw usb.img 32Mmkfs.vfat usb.img
编译qemu
1234567git clone git://git.qemu-project.org/qemu.gitcd qemugit checkout tags/v4.2.1mkdir -p bin/debug/naivecd bin/debug/naive../../../configure --target-list=x86_64-softmmu --enable-debug --disable-werror --enable-spicemake
编译完成的二进制文件位于bin/debug/naive/x86_64-softmmu/qemu-system-x86_64,启动脚本如下
1234567891011qemu-system-x86_64 \ -m 1G -nographic \ -hda ./rootfs.img \ -kernel ./bzImage \ -append "console=ttyS0 ...
CVE-2019-6788-Qemu逃逸漏洞复现-分析
CVE-2019-6788是一个qemu的逃逸漏洞,本文参考xmzyshypnc和raycp的文章
环境搭建首先是创建qemu启动所用的文件系统,需要安装debootstrap,创建完成后的文件系统带有ssh,ssh/id_rsa为私钥。
12345678910111213141516171819202122232425262728293031323334353637mkdir qemusudo debootstrap --include=openssh-server,curl,tar,gcc,\libc6-dev,time,strace,sudo,less,psmisc,\selinux-utils,policycoreutils,checkpolicy,selinux-policy-default \stretch qemuset -eux # Set some defaults and enable promtless ssh to the machine for root.sudo sed -i '/^root/ { s/:x:/::/ } ...
2020 starCTF 部分pwn WriteUp
感谢xmzyshypnc 师傅手把手教学。
babyheap漏洞是一个UAF漏洞,程序实现了6个程序,add,delete,edit,show,leave_name,show_name,其中add函数限制了申请堆块的大小,delete函数中存在UAF漏洞,leave_name函数中申请了一个0x400大小的堆块。
因此这里首先申请4个0x20,fastbin,接着leave_name函数申请一个较大的堆块,使得fastbin堆块合并成0x80大小的small bin,这样就能泄漏出libc基址,由于edit的起始位置是+8开始的,因此再次申请的堆块大小需要覆盖三个fastbin,因此申请一个0x60大小的堆块。这样就可以满足覆写fd指针为free_hook-8和/bin/sh字符串两个要求。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 ...
Adobe漏洞CVE-2018-4490分析
漏洞描述CVE-2018-4490是Adobe在2018年5月修复的一个Adobe Reader DC的0 day漏洞(官方通告为Double Free漏洞,实际为任意地址释放),改漏洞配合Win32k提权漏洞CVE-2018-8120一起使用实现沙箱逃逸,实现任意代码执行。
受影响版本:Adobe Acrobat and Reader versions 2018.011.20038 and earlier, 2017.011.30079 and earlier, and 2015.006.30417 and earlier
环境搭建样本:HASH:bd23ad33accef14684d42c32769092a
Windows7 SP1 x86,Windbgx86
Adobe Acrobat Reader Pro DC 2018.011.20035,JP2Klib.lib版本为1.2.2.39492
这里在Windows7 SP1 X64,Windows10 2004中均可以进行调试,在Windows10中调试时需要注意内存地址0d0e0048可能被占用,需要在安全中心关闭 “验证堆完 ...
2020 ByteCTF 部分PWN WriteUp
gunGLIBC 2.31
程序实现了三个功能add,load,delete,其中add只能分配0x500一下的堆块,总共分配的堆块大小不超过0x1000,分配的基本单位是一个node,第一个值是buf,第二个值表示next_chunk,第三个值是flag。load是创建了一个全局的单项链表,通过node->next_chunk也就是+0x10的位置进行串联。在delete的时候未清空next_chunk的指针。通过delete,load,delete可以制造double free漏洞,并且在第二次delete的时候会泄露出地址。
但是由于2.31对tcache double free进行了检查,这个题目没有办法进行修改其keys,因此采用fastbin attack的方法来做。覆写__free_hook为magic gadget的值,该gadget的作用是将rdi转移到rdx中,并调用setcontext,我们找到下面的gadget
123mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr ...
逃逸初探
2020 TSCTF hellovirtual是一个虚拟化的题目,在2018 hitcon abyss改编的题目。这里给出了三个文件hellovirtual,hellokernel,hellousr,还给出了ld.so.2,libc.so.6。
hellovirtual是一个利用KVM api来做虚拟化的程序,它会加载一个小型的内核hellokernel,这个内核仅仅实现了内存管理和程序中断的功能,提供了loader启动和libc加载的一些syscall。然后解析ELF启动一个用户态的程序,这里直接使用的是ld.so.2来加载hellousr。hellousr是一个用户态的程序可以直接在主机上运行。执行流程就是用户态程序hellousr发生系统调用时,hellokernel对系统调用进行一些检查,将一些与IO相关的比如read,write通过I/O Prot(CPU in/out指令)交给hellovirtual处理。
分析virtual先来看virtual也就是kvm。先放出几个常用的结构体,和操作的十六进制值。
12345678910111213141516171819202122 ...
2020 zer0pts CTF 部分PWN WriteUp
babyof分析很容易发现程序中存在的漏洞,栈溢出,但是程序调用的外部函数仅有read,setbuf,exit这三个函数。此时如果想要泄露libc基址的话就需要覆写stdout结构体中的IO_write_ptr指针的低位为\x00即可,但是当我们更改指针低字节之后还是没有办法输出,因为函数没有任何的输出函数,因此就不会刷新stdout。
这里我们就需要强制缓冲区刷新,即调用_IO_OVERFLOW,这里存在一个exit函数,因此我们可以直接exit,函数会调用_IO_cleanup_all,刷新每一个文件结构体,这是我们就可以泄露出libc的基址,但是泄露地址之后程序就退出了,因此我们还需要修改vtable表中的__overflow指针为main函数地址,以继续执行程序,再次利用溢出修改返回地址getshell。
但是如果我们修改的是stdout的vtable的__overflow指针的话,我们的libc就无法泄露,注意到_IO_list_all的连接顺序为stderr,stdout_stdin,因此我们可以修改stderr的_IO_write_ptr的低字节和stdout的vtabl ...