初识linux提权
Linux提权
简单来讲,提权就是将一个低权限用户利用系统的漏洞,设计缺陷等提升到一个高权限用户的过程。
枚举
就是进一步的进行信息收集。
hostname
返回目标机器的主机名,在某些情况下,可以提供有关目标系统在公司网络中的角色的信息。
uname -a
打印系统信息,为我们提供有关系统使用的内核的更多详细信息。
/proc/version
提供有关目标系统进程的信息,查看/proc/version
可能会为您提供有关内核版本的信息和其他数据,例如是否安装了编译器(例如 GCC)。
/etc/issue
通过查看/etc/issue
文件来识别系统。
ps Command
PID是进程号 TTY是用户使用的终端类型 TIME是进程使用的CPU时间 CMD是正在运行的命令或可执行文件
ps -A
查看所有正在运行的进程
ps axjf
:查看进程树
ps aux
: aux
选项将显示所有用户的进程(a)、显示启动进程的用户(u)以及显示未附加到终端的进程(x)。
/etc/passwd
查看系统用户。
cat /etc/passwd | cut -d ":" -f 1
ip route
查看网络路由
netstat
netstat -a
显示所有监听端口及已建立的连接。
netstat -au 或 netstat -at
可用于分别列出UDP或TCP协议。
netstat -l
:列出处于“监听”模式的端口。
netstat -s
按协议列出网络使用情况统计信息。
netstat -tp
列出带有服务名称和PID信息的连接。
netstat -i
:显示接口统计信息。
netstat -ano
find
find . -name flag.txt
// 查找当前目录下的flag.txt的文件。
find /home -name flag.txt
// 查找home目录下的flag.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 10
//查找过去1h内更改过的文件
find / -amin 10
//查找过去1h内访问过的文件
find / -size 50M
//查找大小为50MB的文件
有的时候使用find命令会出现错误,这个时候使用-type f 2>dev/null
将错误重定向到/dev/null中
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null
查找linux中所有可写的文件夹
find / -perm -u=s -type f 2>/dev/null
查找具有SUID位的文件
自动枚举工具
- LinPeas:https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum:https://github.com/rebootuser/LinEnum
- LES(Linux漏洞利用建议器):https://github.com/mzet-/linux-exploit-suggester
- Linux智能枚举:https://github.com/diego-treitos/linux-smart-enumeration
- Linux隐私检查器: https://github.com/linted/linuxprivchecker
用于帮助枚举linux的系统信息,帮助发现潜在的权限提升漏洞。
权限提升:内核漏洞
Linux系统上的内核 管理系统内存和应用程序等组件之间的通信。此关键功能需要内核具有特定权限;因此,成功利用此漏洞可能会获得 root 权限。
利用:
1.搜索内核的版本信息。
2.查找目标版本的漏洞信息,进一步利用。
提示&说明:
在启动漏洞代码之前,请务必了解其工作原理。某些漏洞代码可能会对操作系统进行更改,从而导致其在进一步使用时不安全,或对系统进行不可逆转的更改,从而在以后造成问题。当然,这些在实验室或 CTF 环境中可能不是什么大问题,但在真正的渗透测试过程中,这些绝对是禁忌。
演示:
ssh登录进去,查看内核版本的信息。
利用searchsploit进行搜索。
可以先利用这个试一下。
提权成功。
权限提升:Sudo
默认情况下,sudo命令允许以root的身份运行程序,在某些情况下,系统管理员需要对普通用户提供权限,例如一个普通用户以root身份运行nmap,但其他的地方都是普通权限。
1.sudo -l
可以使用sudo -l来查看哪些地方使用了root权限。
https://gtfobins.github.io/是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。
2.利用 LD_PRELOAD
在某些情况下,可能会看到LD_PRELOAD的环境选项。
LD_PRELOAD是一个允许任何程序使用共享库的函数。如果启用了“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载并执行。请注意,如果实际用户 ID 与有效用户 ID 不同,则将忽略 LD_PRELOAD 选项。
步骤如下:
1.检查LD_PRELOAD。
2.编写一个简单的c语言,编译为共享对象文件(.so)。
3.使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行该程序。
简单实例如下:
命名为shell.c
1 |
|
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
// 编译共享代码库 shell.so
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
权限提升:SUID
当一个可执行文件设置了 SUID 位,并且这个文件的所有者是 root(超级用户),普通用户执行这个文件时,操作系统会临时赋予该用户 root 权限来执行文件中的代码。这样,用户就可以执行一些通常需要 root 权限的操作。
查找具有suid标志位文件的命令:
1 |
|
实例:
然后去查看/etc/shadow的内容 发现没权限
然后去查一下具有suid权限的文件
https://gtfobins.github.io/ 在GTFOBins中可以查到base64的suid的提权
可以进行文件的读取。
然后利用john解一下user2的密码。
然后ssh登录user2用户,在home目录下找到flag3.txt 但是这个仍然不是root权限,还利用上面的base64 进行读取文件。
权限提升:功能(Capabilities)
Linux capabilities 将 root 权限划分为更小、更独立的单元,允许进程拥有一部分权限。这通过不必要地授予完整的 root 权限来最小化风险。
这个地方不进行详细的讲解了,就大概说明一下怎么使用,具体参考:https://book.hacktricks.xyz/v/cn/linux-hardening/privilege-escalation/linux-capabilities
利用getcap列出已启用的功能
getcap / -r 2>/dev/null
然后在gtfobins中查看Capabilities
这个地方我们可以使用view
但这个版本好像不太行,就没成功。
权限提升:Cron Jobs
计划任务提权原理简单说一下:如果计划任务中有一个是以root身份运行的,并且我们可以查看该文件的内容,那么我们可以更改这个计划任务要运行的脚本内容,改成我们想要它执行的shell,当它下次执行的时候,就会变成root权限。
计划任务一般存放在/etc/crontab 文件中
如果未定义脚本的完整路径(如对 backup.sh 脚本所做的那样),则 cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。在这种情况下,我们应该能够在用户的主文件夹下创建一个名为“antivirus.sh”的脚本,并且它应该由 cron 作业运行。
可以查看到backup.sh文件的内容
修改文件的内容。
记得对backup.sh加上可执行的权限。
最后监听端口即可得到root权限。
权限提升:PATH 环境变量提权
linux中的PATH是一个环境变量,它告诉操作系统在哪里搜索可执行文件。
像我们平时执行的ls cat find 等命令就是在PATH环境变量中进行查找的。
原理就是修改$PATH变量,当系统在执行某些常用命令时,优先运行攻击者提供的恶意可执行文件,从而进行一个权限的提升。
下面是演示:
首先我们先写一个c语言文件
1 |
|
将其编译为可执行文件,并设置suid位。
然后我们寻找可写的文件夹,将其添加到PATH变量中(如果PATH变量没有的话),然后再向可写的文件夹下创建一个thm文件,将/bin/bash写入其中,将其赋予777权限,最后运行那个具有suid位的二进制文件,即可提权成功。
寻找可写的文件夹:
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
我们将tmp加到PATH变量里面。
然后向tmp下创建一个thm文件,并赋予777权限。
最后运行具有suid位的二进制文件。
权限提升:NFS
有的时候提权,不仅仅可以通过上面那些操作来进行,还可以通过共享文件夹和远程管理接口来进行提权(ssh,telnet等)。例如:在目标系统上找到root的ssh私钥,我们就可以通过ssh来连接目标服务器,从而达到root权限。
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取。
权限提升的关键元素是如上所示的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺任何文件以 root 权限运行的权利。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
1.枚举目标机器上的可挂载共享。
2.把其中一个“no_root_squash”共享安装到我们的攻击机器上并开始构建我们的可执行文件。
3.构造具有suid位的可执行文件
然后在目标系统上执行具有suid位的二进制文件。