linux提权-内核提权


linux提权-内核提权

佬的博客

https://yuy0ung.github.io/blog/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87/linux%E6%8F%90%E6%9D%83/linux%E5%86%85%E6%A0%B8%E6%8F%90%E6%9D%83/#linux%E5%86%85%E6%A0%B8%E6%8F%90%E6%9D%83

顾名思义,即利用Linux内核漏洞进行提权,一般包含三个环节:

  • 对目标系统进行信息收集,获取到系统内核信息以及版本信息
  • 根据内核版本获取其对应的漏洞以及EXP
  • 使用找到的EXP对目标系统发起攻击,完成提权操作

内核溢出

漏洞的原理更偏向于pwn,指在操作系统内核空间发生的缓冲区溢出漏洞。即程序没有正确验证输入数据的大小时,多出的数据会覆盖相邻的内存,导致安全问题

信息收集

首先需要对Linux发行版本、内核版本进行信息收集,这里以我的CentOS 7为例,展示以下常用命令的输出内容:

1
uname -a	# 查看系统全部信息
1
cat /etc/issue	# 查看Linux 系统的版本信息

output

1
2
3
4
5
6
7
┌──(root㉿kali)-[~]
└─# cat /etc/issue
Kali GNU/Linux Rolling \n \l


┌──(root㉿kali)-[~]
└─#

不知道什么原因,这里文件中的占位符没有被解析,这些占位符的意思:

  • \S:这表示系统的名称。在许多 Linux 发行版中,这通常会被替换为具体的发行版名称(例如 “Kali Linux”)。
  • \r:这一部分通常表示系统的版本号,这是内核的版本信息。
  • \m:这表示机器的硬件架构。例如,它可能会返回 x86_64 表示 64 位系统,或 i686 表示 32 位系统。
1
cat /etc/*-release	# 查看Linux 系统的详细版本信息

output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root㉿kali)-[~]
└─# cat /etc/*-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
VERSION_ID="2025.4"
VERSION="2025.4"
VERSION_CODENAME=kali-rolling
ID=kali
ID_LIKE=debian
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"
ANSI_COLOR="1;31"

┌──(root㉿kali)-[~]
└─#

1
lsb_release -a	# 获取系统的详细信息,但系统不一定有lsb_release
1
cat /proc/version	# 查看 Linux 内核的版本信息及相关的编译信息

查找exp

使用kali自带的searchsploit即可查找exp,例如查找Ubantu 15.04的漏洞:

1
searchsploit Ubantu 15.04

查到后,比如exp的path为linux/local/37088.c:

  • 查看exp:

    1
    searchsploit -x linux/local/37088.c

    Copy

    有几点需要注意阅读:

    • 源码注释:了解源码编译方式
    • 源码内容:了解工作流程便于优化与修改,且避免存在恶意后门
  • 复制exp到当前目录:

    1
    searchsploit -m linux/local/37088.c

    Copy

使用exp

通常使用wget等办法将exp传到受害主机上,并按照exp使用方法进行提权(借助搜素引擎查阅使用方法),通常来说:

  • 如果是sh脚本文件,赋予权限执行即可
  • 如果是c文件,通常是需要gcc编译,再给编译后的文件赋予权限,最后执行

CVE-2016-5195(Dirty Cow脏牛)

脏牛提权的利用方式不同于其他的内核溢出提权,这里单独记录

脏牛是一个非常经典的内核提权漏洞,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞,在2016年10月18后才得以修复

影响范围:Linux kernel>2.6.22 (released in 2007)的所有Linux系统,且低于以下版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Centos7/RHEL7     3.10.0-327.36.3.el7

Cetnos6/RHEL6 2.6.32-642.6.2.el6

Ubuntu 16.10 4.8.0-26.28

Ubuntu 16.04 4.4.0-45.66

Ubuntu 14.04 3.13.0-100.147

Debian 8 3.16.36-1+deb8u2

Debian 7 3.2.82-1

漏洞成因

linux内核的内存子系统在处理私有映射时的**写时复制(copy on write,COW)**的中断方式里创建了**条件竞争**,该条件竞争可能运行非特权用户获得对只读内存映射的写入权限

写时复制是一种内存管理的优化技术,用于在多个进程共享同一个内存页的情况下避免内存冲突。当一个进程试图修改一个内存页时,操作系统会自动复制这个内存页,而不会受到当前进程修改的影响

利用方式

默认情况下,低权限会话是无法修改高权限文件,比如 /etc/passwd、/etc/shadow、/etc/group 等。脏牛漏洞的利用方式是:首先使用 mmap 函数申请虚拟内存,在虚拟内存上找到一个页面创建私有映射(以 /etc/group 为例)。由于此映射是私有的,因此可以随意对文件写入修改而不会影响原文件,然后向私有映射文件中写入内容,将当前用户添加至 sudo 组,但不是直接向 mmap 申请的虚拟映射中写入内容,而是向 Linux 中的一个特殊文件 /proc/self/mem 中写入。

  • mmap 函数是用来创建内存映射的函数。通过内存映射,可以将一段文件或其他对象映射到进程的地址空间,从而可以直接访问该对象。
  • /proc/self/mem 文件是 Linux 的一个特殊文件,它允许程序直接访问当前进程的虚拟内存空间。通过读写 /proc/self/mem 文件,可以直接在虚拟内存中修改指定内存位置的数据。

写入 /proc/self/mem 完成后,内核需要在物理内存上寻找写入的位置,此时还未开始写入。并行运行两个线程,第一个线程的功能是写入物理内存,它包括两个操作,分别是定位到物理内存和写入物理内存。在定位物理内存位置时,内核发现物理内存中已经有了一个 /etc/group 文件,这时触发写时复制,内核准备在物理内存中找到位置创建私有映射的副本,然后写入。在写入之前,运行第二个线程,其功能是调用 madvise 函数,通知内核不再需要(MADV_DONTNEED)私有映射。这样,内核就有可能会被欺骗,认为程序写入的是原始文件。通过无限循环这两个线程,就有可能完成竞争条件,成功地写入原始文件

漏洞影响

允许在没有足够权限的情况下修改只读文件比如/etc/passwd,导致权限提升

注:主机上需要有gcc,且执行make后的 gcc 版本要较高版本

当然还有其他版本比如:https://github.com/FireFart/dirtycow

漏洞复现我之前博客写的很清楚了,就是把完整脚本啥的还有用到的所有指令都贴出来了

Metasploit

因为msf是一个常用的后渗透模块,这里再记录一下使用其中local_exploit_suggester模块的事项:

该模块会检测系统是否存在漏洞并根据漏洞,回显利用模块路径

依然以上面的ubuntu为例:

  • 首先getshell(我这里直接用msfvenom生成的马子上线)

  • bg挂起会话,再use一下post/multi/recon/local_exploit_suggester模块,设置一下shell的session,即可自动检查:

  • 发现有很多可能的漏洞,直接use填好参数即可利用

如何防御?

感觉没啥可说的,无非就以下这些:

  • 定期检查是否有可用的更新或补丁
  • 使用防火墙阻止攻击者尝试利用内核漏洞进行攻击的网络连接
  • 使用安全软件来检测和阻止恶意软件的运行

文章作者: wuk0Ng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wuk0Ng !
评论
  目录