Linux权限提升指南(翻译)
0x0 介绍
应用或者进程获取的权限应该按照最小权限原则赋予,只授予执行各自功能最小权限。授予不需要的权限可能回导致权限滥用,同时权限提升也是检测恶意代码的一个重要指标。
0x01 什么是权限提升?
大多数计算机系统被设计为供多个用户使用。权限是指允许用户做什么。常见权限包括查看和编辑文件、修改系统文件等。权限提升是指用户获得他们无权获得的权限。这些权限可用于删除文件、查看隐私信息或安装恶意程序(如病毒)。它通常发生在系统存在允许绕过系统安全机制漏洞时,或者系统设计假设存在缺陷时。
权限提升是利用操作系统或软件应用程序中的错误、设计缺陷或配置疏忽来获得应用程序或用户保护的资源的更高访问权限的行为。结果是应用程序拥有比执行未经授权操作的开发人员或系统管理员预期更多的权限。
虽然根据统计大部分公司使用的更多的是 Windows 客户端程序,但在考虑到公司的网络安全时,Linux 特权升级攻击则是需要应对的更大的威胁。公司的关键基础设施,例如 Web 服务器、数据库、防火墙等,很可能运行在 Linux 操作系统。对这些关键基础设施的损害有可能严重破坏组织的运营。此外,物联网 (IoT) 和嵌入式系统在工作场所变得无处不在,从而增加了恶意黑客的潜在目标数量。鉴于 Linux 设备在工作场所的流行,公司应该加强和保护这些设备。
0x02 目的
在本文中,我们将详细讨论任何可能对基于 Linux 的系统成功进行权限提升攻击的安全问题。我们还将讨论攻击者如何使用已知技术提升在远程主机上的权限,以及如何保护我们的系统免受任何此类攻击。最后,我们将举例说明如何在不同的 Linux 系统上在不同的条件下实现权限提升。
本文旨在通过示例帮助初学者了解 Linux 权限提升的基础知识。它不是列举 Linux 提权方法的备忘单。权限提升与使用正确的方法有关。有多种方法可以执行示例中相同任务。如果你想要一个对 Linux 进行提权的备忘单,那么你一定要看看 g0tmi1k 的文章 – https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
0x03 Linux权限模型

Linux 从 UNIX 继承了文件所有权和权限的概念。文件权限是系统保护自己免受恶意篡改的一种方式。在 UNIX 网络服务器上,存储在硬盘驱动器上的每个文件和文件夹都有一组与之相关的权限,这说明了谁可以对文件执行什么操作。

在上面的两个截图中,我们可以看到文件“docker-compose.yml”只有所有者“root”具有读取权限。如果任何其他用户尝试读取此文件,他将无法读取它。当我不是超级用户时尝试读取文件时,我们可以看到权限被拒绝。
我们不会在这里详细介绍权限模型,因为这是另一个大话题。这只是为了理解用户无法访问(read/write/execute)他不被允许访问的文件的事实。但是,超级用户(root)可以访问系统上存在的所有文件。为了修改任何重要的配置或执行任何进一步的攻击,首先我们需要在任何基于 Linux 的系统上获得 root 访问权限。
0x04 为什么需要提权
- 读/写任何敏感文件
- 即使重启也能持久化
- 植入永久后门
0x05 提权主要使用的技术
我们假设现在我们在远程系统上有 shell。但我们可能没有“root”权限。下面提到的技术可用于在系统上获得“root”权限。
1.内核漏洞利用代码
内核漏洞利用代码是利用内核漏洞以提升权限执行任意代码的程序。成功的内核漏洞利用通常会以 root 命令提示符的形式为攻击者提供对目标系统的超级用户访问权限。在许多情况下,在 Linux 系统上提升到 root 权限就像将内核漏洞下载到目标文件系统、编译漏洞然后执行它一样简单。
假设我们可以以非特权用户身份运行代码,这就是内核漏洞利用的通用工作流程。
1 | 1. 欺骗内核在内核模式下运行我们的payload |
内核漏洞攻击要成功,攻击者需要四个条件:
1 | 1. 有漏洞的内核 |
防御内核漏洞的最简单方法是对内核进行打补丁和更新。在没有补丁的情况下,管理员需要截断向目标上传和执行漏洞利用程序的过程。考虑到这些因素,如果管理员可以阻止将漏洞利用引入或执行到 Linux 文件系统,则内核漏洞利用攻击不再可行。因此,管理员应重点限制或删除启用文件传输的程序,例如 FTP、TFTP、SCP、wget 和 curl。当需要这些程序时,它们的使用应限于特定用户、目录、应用程序(例如 SCP)和特定 IP 地址或域。
臭名昭著的 DirtyCow 漏洞——Linux 内核 <= 3.19.0-73.8
在 Linux 内核的内存子系统处理私有只读内存映射的写时复制 (COW) 的方式中存在竞争条件漏洞。无特权的本地用户可以利用此漏洞获得对其他只读内存映射的写访问权限,从而增加他们在系统上的特权。这是有史以来发现的最严重的提权漏洞之一,几乎影响了所有主要的 Linux 发行版。
通过dirtycow漏洞实现利用
1 | $ whoami – 告诉我们当前用户是 john(非 root 用户) |

您可以在这里查看dirtycow漏洞利用的其他版本 – https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
有许多不同的本地提权漏洞可用于不同的内核和操作系统。是否可以使用内核漏洞在 Linux 主机上获得 root 访问权限取决于内核是否有漏洞。 Kali Linux 有一个exploit-db 漏洞的本地副本,可以更容易地搜索本地root 漏洞。虽然我不建议在搜索 Linux 内核漏洞时完全依赖这个数据库。
1 | $ searchsploit Linux Kernel 2.6.24 – 它向我们展示了 kali Linux 中已经存在的特定 Linux 内核的所有可用漏洞。 |

为什么应该首先避免运行任何本地提权漏洞利用程序呢?
虽然,运行漏洞利用程序并获得 root 访问权限感觉很诱人,但您应该始终将此作为最后的选择。
1 | 1. 远程主机可能会崩溃,因为许多公开可用的 root 漏洞都不是很稳定。 |
在运行内核提权漏洞之前,您应该始终尝试使用下面讨论的其他技术来获取 root。
对策:
经常对内核打补丁和更新。
2.利用以 root 身份运行的服务
利用以 root 身份运行的任何服务都会为您提供 Root 权限!
著名的 EternalBlue 和 SambaCry 漏洞利用,利用了通常以 root 身份运行的 smb 服务。
只需一个漏洞,攻击者就可以获得远程代码执行和本地权限提升。
由于它的致命组合,它被大量用于在全球范围内传播勒索软件。
您应该经常检查 Web 服务器、邮件服务器、数据库服务器等是否以 root 身份运行。很多时候,Web 管理员以 root 身份运行这些服务而忘记了它可能导致的安全问题。可能存在在本地运行且未公开的服务也可以被利用。
$ netstat -antup – 它会显示所有打开并正在侦听的端口。我们可以检查本地运行的服务是否可以被利用。
利用以 root 身份运行的易受攻击的 MySQL 版本来获取 root 访问权限
MySQL UDF 动态库漏洞利用允许您从 mysql shell 执行任意命令。如果 mysql 以 root 权限运行,则命令将以 root 身份执行。
1 | $ ps -aux | grep root - 它向我们展示了以 root 身份运行的服务。 |


Web 管理员犯的最大错误之一就是以 root 权限运行 Web 服务器。 Web 应用程序上的命令注入漏洞可将攻击者引导至 root shell。这是一个典型的例子,说明为什么除非真的需要,否则不应以 root 身份运行任何服务。
对拥有 root 权限的程序进行二进制漏洞利用远没有内核漏洞利用那么危险,因为即使服务崩溃,主机也不会崩溃,服务可能会自动重启。
对策:
除非确实需要,否则切勿以 root 身份运行任何服务,尤其是 Web、数据库和文件服务器。
3.利用 SUID 可执行文件
SUID 代表 set user ID,是 Linux 的一项功能,允许用户以指定用户的权限执行文件。例如,Linux ping 命令通常需要 root 权限才能打开原始网络套接字。通过将 ping 程序标记为 SUID,所有者为 root,只要低权限用户执行程序,ping 就会以 root 权限执行。
> -rwsr-xr-x——“s”字符而不是“x”表示设置了 SUID 位。

SUID 是一项功能,如果使用得当,实际上可以增强 Linux 的安全性。问题是管理员在安装第三方应用程序或进行逻辑配置更改时可能会在不知不觉中引入危险的 SUID 配置。
很多系统管理员不明白在哪里设置 SUID 位,在哪里不设置。不应在任何文件编辑器上特别设置 SUID 位,因为攻击者可以覆盖系统上存在的任何文件。
利用易受攻击的 SUID 可执行文件获取 root 访问权限
$ find / -perm -u=s -type f 2>/dev/null – 打印设置了 SUID 位的可执行文件

$ ls -la /usr/local/bin/nmap – 让我们确认 nmap 是否设置了 SUID 位。

1 | > Nmap 设置了 SUID 位。很多时候管理员为nmap设置了SUID,以便它可以用于有效地扫描网络,因为如果您不以 root 权限运行它,所有 nmap 扫描技术都不起作用。 |

对策:
- 不应将 SUID 位设置为任何能够变换为 shell 的程序。
- 永远不要在任何文件编辑器/编译器/解释器上设置 SUID 位,因为攻击者可以轻松读取/覆盖系统上存在的任何文件。
4.利用 SUDO 权限/用户
如果攻击者无法通过任何其他技术直接获得 root 访问权限,他可能会尝试危害任何具有 SUDO 访问权限的用户。一旦他可以访问任何 SUDO 用户,他基本上可以使用 root 权限执行任何命令。
一个典型的例子是为 find 命令分配 SUDO 权限,以便其他用户可以搜索系统中的特定文件/日志。虽然管理员可能不知道“find”命令包含用于命令执行的参数,但攻击者可以使用 root 权限执行命令。
利用错误配置的 SUDO 权限获取 root 访问权限
$ sudo -l – 打印允许我们作为 SUDO 运行的命令

1 | 我们可以使用 SUDO 运行 find、cat 和 python。当使用 SUDO 运行时,所有这些命令都将以 root 身份运行。 |

1 | > 永远不要给任何编程语言编译器、解释器和编辑器的 SUDO 权限。 |
对策:
- 不要向任何可以切换为 shell 的程序授予 sudo 权限。
- 永远不要给 vi、more、less、nmap、perl、ruby、python、gdb 等类型程序 SUDO 权限。
5. 利用配置不当的 cron 任务
Cron 任务,如果配置不当,可以被利用来获得 root 权限。
1 | 1. cron 任务中是否有任何可写的脚本或二进制文件? |
Cron 任务通常以 root 权限运行。如果我们可以成功修改在 cron 任务中定义的任何脚本或二进制文件,那么我们就可以使用 root 权限执行任意代码。
$ ls -la /etc/cron.d – 打印已经存在于 cron.d 中的 cron 任务

1 | $ find / -perm -2 -type f 2>/dev/null – 打印可写文件 |

1 | > cron-lograte.sh 是全局可写的,它由 logrotate cronjob 运行。我们在 cron-lograte.sh 中写入/附加的任何命令都将以“root”身份执行。 |

1 | > rootme 可执行文件将生成一个 shell。 |

1 | $ echo "chown root:root /tmp/rootme; chmod u+s /tmp/rootme;">/usr/local/sbin/cron-logrotate.sh |

对策:
- cron 任务中定义的任何脚本或二进制文件都不应是可写的
- cron 文件不应被除 root 之外的任何人写入。
- cron.d 目录不应被除 root 之外的任何人写入。
6. 在PATH环境变量中使用’.’提权
在您的 PATH 中包含“.”意味着用户能够从当前目录执行二进制文件/脚本。为了避免每次都输入这两个额外的字符,用户在他们的 PATH 中添加了“.”。这可能是攻击者提升其特权的绝佳方法。
假设 Susan 是管理员,她在路径中添加了“.”,这样她就不必再次写入这 2 个字符(./)。
PATH中带有“.” - Program
PATH中没有“.” – ./program
发生这种情况是因为在添加“.”后 Linux 首先在 PATH 开头搜索当前目录中的程序,然后搜索其他任何地方。
1 | > 另一个用户“rashid”知道 susan 在她的路径中添加了“.”,因为她很懒 |

$ PATH=.:${PATH} – 在 PATH 变量中添加“.”

1 | $ ls – 执行 ./ls 文件而不是运行 list 命令。 |

在这里,我们总结了对任何基于 Linux 的系统的成功提权攻击。现在你知道攻击者如何利用某些技术来提升他们的权限,你可以进一步利用这些技术来保护您的系统和应用程序免受入侵和攻击。