You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# kaili2
apt install gcc gdb python3.7-dev git make electric-fence -y
# pwndbg
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
编译openssl
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0a.tar.gz
tar -xvf OpenSSL_1_1_0a.tar.gz
cd openssl-OpenSSL_1_1_0a
./config --debug
make
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0b.tar.gz
tar -xvf OpenSSL_1_1_0b.tar.gz
cd openssl-OpenSSL_1_1_0b
./config --debug
make
openssl 1.1.0a UAF(CVE-2016-6309)分析
在研究honggfuzz的过程中,发现有人用它找到了openssl的一个洞(CVE-2016-6309),这是一个UAF的洞,为了了解如何fuzzing的,如果要是我写fuzzer,该怎么写,为了这个目的,所以就分析了一下。
环境
环境准备
编译
openssl
将编译的库存放
生成证书
补丁情况
首先为了了解这个洞的大概情况,来看一下openssl做的修补
其实最主要的地方是在
BUF_MEM_grow_clean
之后的这句来看看
BUF_MEM_grow_clean
函数干了什么,需要更新s->init_msg
的值可以看到使用
len
分别和str->length/str->max
做了比较,如果都不满足,会realloc
对应的str->data
的数据,无论哪个realloc
都会执行相似的操作那么将来再用到
str->data
的数据时,就会造成UAF
,现在知道了大概的原因,实际利用gdb
进行验证POC准备
随意点击几个
https
的网站,之后利用利用wireshark
监控具体如下,注意具体长度对应的位置,以后做漏洞
poc
会用到ctrl+shift+x
将字节流数据导出,正常数据是这样的首先利用正常的数据进行测试
监听端口
验证
poc
正常的
poc.raw
漏洞分析
动态调试
在
statem.c:546
设下断点,成功断下来查看一下
s
相关的值经过多次调试,发现在这里
s->init_buf->max
和s->init_buf->length
都是固定的,而s->s3->tmp.message_size
是我们可控的根据前面对
BUF_MEM_grow_clean
的分析,我们只要保证s->s3->tmp.message_size
大于最大值,即s->init_buf->max < s->s3->tmp.message_size
就会成功进行realloc
,而在我们的测试中,s->init_buf->max==0x5558
,所以作如下更改设置为0x5560
执行并查看
跟进
BUF_MEM_grow_clean
可以发现成功执行到达
realloc
,为了观察将来是否利用了str->data
以前的数据,释放前看一下str->data
的情况继续执行,崩溃
可以发现这里的内存是
str->data
中释放的,成功导致了UAF
其中通过多次调试可以发现其实其数据来源于
s->init_msg
,而s->init_msg
中的数据又来源于s->init_buf->data
对比调试
利用
OpenSSL_1_1_0b
对比一下下个断点
继续执行,会发现没有任何的问题,因为在
grow_init_buf
函数中及时更新了s->init_msg
的值至此
CVE-2016-6309
具体形成UAF
的原因也就分析清楚了参考
一次因漏洞修补触发的漏洞—CVE-2016-6309漏洞详细分析
openssl fix UAF
openssl
The text was updated successfully, but these errors were encountered: