Linux Privilege Escalation
系统信息
操作系统信息
让我们开始获取运行中操作系统的一些信息。
路径
如果您对PATH
变量中的任何文件夹具有写权限,则可能能够劫持一些库或二进制文件:
环境信息
环境变量中是否包含有趣的信息、密码或 API 密钥?
内核漏洞利用
检查内核版本,看是否存在可用于提升权限的漏洞利用。
您可以在此处找到一份良好的易受攻击内核列表以及一些已经编译好的利用程序:https://github.com/lucyoa/kernel-exploits 和 exploitdb sploits。 其他一些可以找到一些编译好的利用程序的网站:https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
要从该网站提取所有易受攻击的内核版本,您可以执行以下操作:
以下是一些可以帮助搜索内核漏洞利用的工具:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py(在受害者中执行,仅检查内核 2.x 的漏洞利用)
始终在 Google 中搜索内核版本,也许你的内核版本已经写在某个内核漏洞利用中,这样你就可以确保这个漏洞利用是有效的。
CVE-2016-5195(DirtyCow)
Linux 特权提升 - Linux 内核 <= 3.19.0-73.8
Sudo版本
基于出现在以下漏洞sudo版本:
您可以使用以下 grep 命令检查 sudo 版本是否存在漏洞。
sudo < v1.28
来自 @sickrov
Dmesg签名验证失败
检查HTB的smasher2盒子,了解如何利用此漏洞的示例
更多系统枚举
枚举可能的防御措施
AppArmor
Grsecurity
Grsecurity
PaX
Execshield
Execshield
SElinux
SElinux
ASLR
地址空间布局随机化
Docker逃逸
如果你在一个Docker容器内部,你可以尝试从中逃脱:
Docker Security磁盘
检查已挂载和未挂载的内容,在哪里以及为什么。如果有任何未挂载的内容,你可以尝试挂载它并检查是否有私人信息。
有用的软件
枚举有用的可执行文件
另外,检查是否已安装任何编译器。如果您需要使用某个内核利用程序,这将非常有用,因为建议在您将要使用它的机器上(或类似的机器上)编译它。
已安装的易受攻击软件
检查已安装软件包和服务的版本。也许有一些旧的 Nagios 版本(例如)可能被利用来提升权限... 建议手动检查更可疑的已安装软件的版本。
如果您可以访问机器的SSH,还可以使用openVAS来检查机器内安装的过时和有漏洞的软件。
请注意,这些命令将显示大量大多数情况下无用的信息,因此建议使用一些类似OpenVAS的应用程序,以检查安装的软件版本是否容易受到已知漏洞的影响
进程
查看正在执行的进程,并检查是否有任何进程具有比应有的更多权限(也许是由root执行的tomcat?)
始终检查可能正在运行的electron/cef/chromium调试器,您可以滥用它来提升权限。Linpeas通过检查进程的命令行中的--inspect
参数来检测这些内容。
还要检查您对进程二进制文件的权限,也许您可以覆盖某人的权限。
进程监控
您可以使用pspy等工具来监视进程。这对于识别频繁执行的易受攻击的进程或在满足一组要求时执行的进程非常有用。
进程内存
服务器的一些服务会在内存中以明文保存凭据。 通常,您需要root权限才能读取属于其他用户的进程的内存,因此当您已经是root并希望发现更多凭据时,这通常更有用。 但是,请记住作为普通用户,您可以读取自己拥有的进程的内存。
请注意,如今大多数机器默认不允许ptrace,这意味着您无法转储属于您非特权用户的其他进程。
文件 /proc/sys/kernel/yama/ptrace_scope 控制ptrace的可访问性:
kernel.yama.ptrace_scope = 0:只要它们具有相同的uid,所有进程都可以被调试。这是ptracing的经典方式。
kernel.yama.ptrace_scope = 1:只有父进程可以被调试。
kernel.yama.ptrace_scope = 2:只有管理员可以使用ptrace,因为它需要CAP_SYS_PTRACE功能。
kernel.yama.ptrace_scope = 3:不允许使用ptrace跟踪任何进程。设置后,需要重新启动才能再次启用ptracing。
GDB
如果您可以访问FTP服务的内存(例如),您可以获取Heap并在其中搜索凭据。
GDB 脚本
/proc/$pid/maps & /proc/$pid/mem
对于给定的进程ID,maps 显示了内存在该进程的虚拟地址空间中是如何映射的;它还显示了每个映射区域的权限。mem 伪文件暴露了进程的内存本身。从 maps 文件中,我们知道哪些内存区域是可读的以及它们的偏移量。我们利用这些信息定位到 mem 文件并将所有可读区域转储到一个文件中。
/dev/mem
/dev/mem
提供对系统的物理内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用 /dev/kmem
访问。
通常,/dev/mem
只能被 root 和 kmem 组读取。
ProcDump for Linux
ProcDump是Sysinternals工具套件中经典ProcDump工具的Linux重新设计版本。在https://github.com/Sysinternals/ProcDump-for-Linux获取。
工具
要转储进程内存,您可以使用:
https://github.com/hajzer/bash-memory-dump(root)- _您可以手动删除root要求并转储您拥有的进程
https://www.delaat.net/rp/2016-2017/p97/report.pdf中的脚本 A.5(需要root权限)
从进程内存中获取凭据
手动示例
如果您发现认证进程正在运行:
您可以转储进程(查看前面的部分以找到转储进程内存的不同方法),并在内存中搜索凭据:
mimipenguin
该工具https://github.com/huntergregal/mimipenguin将从内存和一些知名文件中窃取明文凭据。它需要 root 权限才能正常工作。
功能 | 进程名称 |
---|---|
GDM 密码 (Kali 桌面, Debian 桌面) | gdm-password |
Gnome Keyring (Ubuntu 桌面, ArchLinux 桌面) | gnome-keyring-daemon |
LightDM (Ubuntu 桌面) | lightdm |
VSFTPd (活动 FTP 连接) | vsftpd |
Apache2 (活动 HTTP 基本认证会话) | apache2 |
OpenSSH (活动 SSH 会话 - Sudo 使用) | sshd: |
Search Regexes/truffleproc
计划任务/Cron 作业
检查是否有任何计划任务存在漏洞。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。
Cron路径
例如,在 /etc/crontab 文件中,您可以找到路径:PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(请注意用户"user"对/home/user具有写入权限)
如果在这个crontab文件中,root用户尝试执行一些命令或脚本而没有设置路径。例如:* * * * root overwrite.sh 然后,您可以通过以下方式获得root shell:
使用带通配符的脚本执行 Cron 任务(通配符注入)
如果一个由 root 执行的脚本中的命令包含“*”,你可以利用这一点执行意外操作(比如权限提升)。示例:
如果通配符前面有路径,比如 /some/path/* ,它就不会有漏洞(即使 ./* 也不会有漏洞)。
阅读以下页面以了解更多通配符利用技巧:
Wildcards Spare tricksCron脚本覆盖和符号链接
如果你可以修改由root执行的cron脚本,你可以非常容易地获得一个shell:
如果由root执行的脚本使用了你拥有完全访问权限的目录,也许删除该文件夹并创建一个符号链接文件夹到另一个,以便运行你控制的脚本可能会很有用。
频繁的 cron 作业
您可以监视进程,以搜索每隔 1、2 或 5 分钟执行的进程。也许您可以利用它来提升权限。
例如,要在 1 分钟内每 0.1 秒监视,按最少执行命令排序并删除已执行最多次的命令,您可以执行:
你也可以使用 pspy (这将监视并列出每个启动的进程)。
隐形的定时任务
可以创建一个定时任务在注释后加一个回车符(没有换行符),这样定时任务就会生效。示例(注意回车符):
服务
可写的 .service 文件
检查是否可以写入任何 .service
文件,如果可以,您可以修改它,以便在服务启动、重新启动或停止时执行您的后门(也许您需要等到机器重新启动)。
例如,在 .service 文件中创建您的后门,使用**ExecStart=/tmp/script.sh
**
可写的服务二进制文件
请记住,如果您对服务执行的二进制文件具有写入权限,您可以将它们更改为后门,这样当服务被重新执行时,后门将被执行。
systemd 路径 - 相对路径
您可以查看systemd使用的路径:
如果发现可以在路径中的任何文件夹中写入,可能可以提升权限。您需要搜索服务配置文件中使用的相对路径,例如:
然后,在您可以编写的systemd PATH文件夹中创建一个与相对路径二进制文件同名的可执行文件,当服务被要求执行易受攻击的操作(启动,停止,重新加载)时,将执行您的后门(通常非特权用户无法启动/停止服务,但请检查是否可以使用 sudo -l
)。
了解有关服务的更多信息,请使用 man systemd.service
。
定时器
定时器是以**.timer**
结尾的systemd单元文件,用于控制**.service**
文件或事件。定时器可用作cron的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
您可以使用以下命令枚举所有定时器:
可写定时器
如果您可以修改一个定时器,您可以让它执行一些 systemd.unit
中存在的内容(比如 .service
或 .target
)。
在文档中,您可以阅读有关 Unit 的内容:
当此计时器到期时要激活的单元。参数是一个单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与计时器单元同名的服务,除了后缀。建议激活的单元名称和计时器单元的单元名称相同,除了后缀。
因此,要滥用此权限,您需要:
找到一些 systemd 单元(如
.service
),其中执行可写二进制文件找到一些 systemd 单元,其中执行相对路径,并且您对 systemd PATH 具有可写权限(以冒充该可执行文件)
通过 man systemd.timer
了解更多关于计时器的信息。
启用计时器
要启用计时器,您需要 root 权限并执行:
注意计时器是通过在/etc/systemd/system/<WantedBy_section>.wants/<name>.timer
上创建符号链接来激活的。
套接字
Unix 域套接字 (UDS) 在客户端-服务器模型中允许进程通信,可以在同一台或不同的计算机上进行通信。它们利用标准的 Unix 描述符文件进行计算机间通信,并通过.socket
文件进行设置。
套接字可以使用.socket
文件进行配置。
通过 man systemd.socket
了解更多关于套接字的信息。 在这个文件中,可以配置几个有趣的参数:
ListenStream
、ListenDatagram
、ListenSequentialPacket
、ListenFIFO
、ListenSpecial
、ListenNetlink
、ListenMessageQueue
、ListenUSBFunction
:这些选项不同,但总结用于指示它将在哪里监听套接字(AF_UNIX 套接字文件的路径,要监听的 IPv4/6 和/或端口号等)。Accept
:接受一个布尔参数。如果为true,则为每个传入连接生成一个服务实例,并且只传递连接套接字给它。如果为false,则所有监听套接字本身都会传递给启动的服务单元,并且只为所有连接生成一个服务单元。对于数据报套接字和 FIFO,在那里一个单一服务单元无条件地处理所有传入流量,此值将被忽略。默认为 false。出于性能原因,建议仅以适合Accept=no
的方式编写新的守护程序。ExecStartPre
、ExecStartPost
:接受一个或多个命令行,这些命令行在创建和绑定监听套接字/FIFO 之前或之后执行。命令行的第一个标记必须是绝对文件名,然后是进程的参数。ExecStopPre
、ExecStopPost
:额外的命令,在关闭和移除监听套接字/FIFO 之前或之后执行。Service
:指定要在传入流量上激活的服务单元名称。此设置仅允许用于Accept=no
的套接字。默认为与套接字同名的服务(后缀替换)。在大多数情况下,不应该需要使用此选项。
可写的 .socket 文件
如果找到一个可写的.socket
文件,你可以在[Socket]
部分的开头添加类似于:ExecStartPre=/home/kali/sys/backdoor
,那么在创建套接字之前将执行后门。因此,你可能需要等待机器重启。
请注意系统必须使用该套接字文件配置,否则后门将不会被执行
可写套接字
如果你识别出任何可写套接字(现在我们谈论的是 Unix 套接字,而不是配置.socket
文件),那么你可以与该套接字通信,也许利用一个漏洞。
枚举 Unix 套接字
原始连接
利用示例:
Socket Command InjectionHTTP sockets
请注意,可能有一些用于监听HTTP请求的套接字(我指的不是 .socket 文件,而是充当 Unix 套接字的文件)。您可以使用以下命令检查:
可写的Docker套接字
Docker套接字通常位于/var/run/docker.sock
,是一个关键文件,应该得到保护。默认情况下,它可被root
用户和docker
组的成员写入。拥有对此套接字的写入访问权限可能导致特权升级。以下是如何实现此操作的详细步骤,以及在无法使用Docker CLI时的替代方法。
使用Docker CLI进行特权升级
如果您对Docker套接字具有写入访问权限,可以使用以下命令升级特权:
这些命令允许您以根级访问主机文件系统来运行一个容器。
直接使用 Docker API
在 Docker CLI 不可用的情况下,仍然可以使用 Docker API 和 curl
命令来操作 Docker 套接字。
列出 Docker 镜像: 检索可用镜像列表。
创建一个容器: 发送一个请求来创建一个容器,挂载主机系统的根目录。
启动新创建的容器:
连接到容器: 使用
socat
建立与容器的连接,从而在其中启用命令执行。
建立 socat
连接后,您可以直接在容器中执行命令,以根级访问主机文件系统。
其他
请注意,如果您对 Docker 套接字拥有写权限,因为您在 docker
组内,您有更多提升权限的方法。如果 docker API 在某个端口上监听,您也可以可能对其进行妥协。
在以下位置检查更多从 Docker 中突破或滥用以提升权限的方法:
Docker SecurityContainerd (ctr) 特权升级
如果您发现可以使用 ctr
命令,请阅读以下页面,因为您可能可以滥用它来提升权限:
RunC 特权升级
如果您发现可以使用 runc
命令,请阅读以下页面,因为您可能可以滥用它来提升权限:
D-Bus
D-Bus 是一个复杂的进程间通信(IPC)系统,使应用程序能够高效地交互和共享数据。设计时考虑到现代 Linux 系统,它为不同形式的应用程序通信提供了一个强大的框架。
该系统功能强大,支持增强数据交换的基本 IPC,类似于增强的 UNIX 域套接字。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,来自蓝牙守护程序的来电信号可以提示音乐播放器静音,增强用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的流程。
D-Bus 采用允许/拒绝模型运行,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能允许通过利用这些权限来提升权限。
在 /etc/dbus-1/system.d/wpa_supplicant.conf
中提供了一个这样的策略示例,详细说明了根用户拥有、发送到和接收来自 fi.w1.wpa_supplicant1
的消息的权限。
未指定用户或组的策略适用于所有情况,而“默认”上下文策略适用于所有未被其他特定策略覆盖的情况。
学习如何枚举和利用 D-Bus 通信:
D-Bus Enumeration & Command Injection Privilege Escalation网络
枚举网络并确定机器位置总是很有趣。
通用枚举
开放端口
在访问之前,始终检查在机器上运行的网络服务,这些服务可能是您无法与之交互的。
嗅探
检查是否可以嗅探流量。如果可以的话,你可能能够获取一些凭据。
用户
通用枚举
检查您是谁,您拥有哪些特权,系统中有哪些用户,哪些可以登录,哪些拥有root特权:
大 UID
一些 Linux 版本受到一个允许具有 UID > INT_MAX 的用户提升权限的漏洞影响。更多信息: here, here 和 here.
利用方法:使用 systemd-run -t /bin/bash
用户组
检查是否是一些用户组的成员,这些用户组可能授予您 root 权限:
Interesting Groups - Linux Privesc剪贴板
检查剪贴板中是否有任何有趣的内容(如果可能)