本文首发安全客,未经容许禁止转载。原文连接php
随着CTF的普及,比赛的形式也有了愈来愈多的花样,对于线下赛来讲,开始出现了安全加固或者防护战之类的环节,亦或者由于拿下靶机后不但愿其余攻击者进入而进行“争夺”,不管什么形式,这些都须要咱们对于服务器的防御工做有所了解。对于线下赛,笔者虽然说没有什么很高超的攻防技巧,但也是有着一些本身的心得。本文总结了一些CTF线下赛中经常使用的服务器加固姿式,但愿能对各位CTF朋友们有所帮助。环境针对目前常见线下赛常见的linux Web服务器,可是由于CTF毕竟与真实网络环境有很大区别,本文的涉及的大部分姿式不具备广泛适用性。本文涉及到的相关代码github下载地址:CTFDefense。html
在开始正文以前,须要先提一下提权,这个要根据本身的比胜过程中的须要而定。有些比赛就有专门的防护加固环节,但安全加固的不少操做都会涉及到root权限,若是直接给root权限最好,但通常一开始会给一个普通权限帐号,或者干脆什么都不给,须要咱们本身经过漏洞拿下服务器,这样每每就须要提权了。关于提权,一般咱们要根据kernel版本号找到对应的poc,平时咱们能够收集测试一些比较新的提权poc,以备不时之需。这里有一个网站:http://exploit.linuxnote.org/,里面有许多linux本地提权的poc。github上有一个挺全的提权exp项目:https://github.com/SecWiki/linux-kernel-exploits。网上也有人分享的一些打包搜集的poc,好比这个,有兴趣的朋友能够多下载看看。python
下面分享几个最近两年而且影响范围比较大的:mysql
CVE-2017-6074 (DCCP双重释放漏洞 > 2.6.18 )
描述:DCCP双重释放漏洞可容许本地低权限用户修改Linux内核内存,致使拒绝服务(系统崩溃)或者提高权限,得到系统的管理访问权限
用法:./pwn
CVE-2016-5195(脏牛,kernel 2.6.22 < 3.9 (x86/x64))
描述:低权限用户可修改root用户建立的文件内容,如修改 /etc/passwd,把当前用户的 uid 改为 0 便可提高为root权限
用法: ./dirtyc0w file content
CVE-2016-8655(Ubuntu 12.0四、14.04,Debian 七、8)
描述:条件竞争漏洞,可让低权限的进程得到内核代码执行权限
用法:./chocobo_root
POC: https://www.seebug.org/vuldb/ssvid-92567
CVE-2017-1000367(sudo本地提权漏洞 )
CVE-2017-1000364
描述:Linux Kernel Stack Clash安全漏洞。该漏洞是因为操做系统内存管理中的一个堆栈冲突漏洞,它影响Linux,FreeBSD和OpenBSD,NetBSD,Solaris,i386和AMD64,攻击者能够利用它破坏内存并执行任意代码 。linux
CVE-2016-1247(Nginx权限提高漏洞)nginx
描述:Nginx服务在建立log目录时使用了不安全的权限设置,可形成本地权限提高,恶意攻击者可以借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提高。git
POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.htmlgithub
提权相关代码在GetRoot目录,POC中是上面提到的几个本地提权源代码,release中分别是编译好的32位和64位程序。 web
实用脚本sql
Linux_Exploit_Suggester.pl ,它能够根据系统内核版本号返回一个包含了可能exploits的列表。还有一个检查linux安全情况的脚本:原文连接
还有几个详见:Linux提权?这四个脚本能够帮助你
linux操做有不少命令,可是线下赛的防御工做中经常使用的也就那么一些,咱们平时能够留意并总结起来,便于咱们比赛使用。
ssh操做 ssh <-p 端口> 用户名@IP //登陆 scp 文件路径 用户名@IP:存放路径 //向ssh服务器上传输文件 备份web目录 tar -zcvf web.tar.gz /var/www/html/ 用户管理 w //查看当前用户 pkill -kill -t <用户tty> //踢掉当前登陆用户 进程管理 ps aux | grep pid或者进程名 //查看进程信息 查看已创建的网络链接及进程
netstat -antulp | grep EST
查看指定端口被哪一个进程占用 lsof -i:端口号 或者 netstat -tunlp|grep 端口号 结束进程命令 kill PID killall <进程名> kill -9 <PID> iptables命令 封杀某个IP或者ip段,如:123.4.5.6 iptables -I INPUT -s 123.4.5.6 -j DROP iptables -I INPUT -s 123.4.5.1/24 -j DROP 禁止从某个主机ssh远程访问登录到本机,如123.4.5.6 iptable -t filter -A INPUT -s 123.4.5.6 -p tcp --dport 22 -j DROP Mysql数据库操做 备份mysql数据库 mysqldump -u 用户名 -p 密码 数据库名 > back.sql //备份指定数据库 mysqldump --all-databases > bak.sql //备份全部数据库 还原mysql数据库 mysql -u 用户名 -p 密码 数据库名 < bak.sql 安全检查 find / *.php -perm 4777 //查找777的权限的php文件 awk -F: '{if($3==0)print $1}' /etc/passwd //查看root权限的帐号 crontab -l //查看计划任务 检测全部的tcp链接数量及状态 netstat -ant|awk '{print $5 "\t" $6}' |grep "[1-9][0-9]*\."|sed -e 's/::ffff://' -e 's/:[0-9]*//'|sort|uniq -c|sort -rn 查看页面访问排名前十的IP cat /var/log/apache2/access.log | cut -f1 -d " " | sort | uniq -c | sort -k 1 -r | head -10 查看页面访问排名前十的URL cat /var/log/apache2/access.log | cut -f4 -d " " | sort | uniq -c | sort -k 1 -r | head -10
再推荐两篇篇安全应急排查手册:应急排查手册 ,Linux应急响应姿式浅谈
防护webshell,咱们能够监控咱们的web目录,对文件的增长或修改等操做进行限制等,粗暴一点的话,就禁止任何文件产生变化,杜绝被传webshell的可能性。
(1)使用系统 chattr +i 命令
linux下的文件有着隐藏属性,能够用lsattr命令查看。其中有一个i属性,表示不得更动任意文件或目录。若是你已经有root或者sudo权限了,那么你可使用"chattr +i 命令"修改文件隐藏属性,这样全部用户都不能对该文件或者目录进行修改删除等操做(包括root),若是想进行修改,必须用命令"chattr -i"取消隐藏属性。
Linux文件保护禁止修改、删除、移动文件等,使用chattr +i保护
例子:
用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/profile
将/var/www/html目录下的文件设置为不容许任何人修改:
chattr -R +i /var/www/html
(2)本身动手丰衣足食
python的第三方库pyinotify可让咱们很方便地实现这些功能。可是因为是第三方库,线下赛中一般无法联网安装库,因此咱们能够手工把库文件传到靶机里python库中: /usr/lib/pythonXXX/site-packages,可是更方便的作法是借用pyinstaller等工具将其打包成linux可执行文件。
安装了pyinotify库以后,咱们仅仅运行在机器上: "python -m pyinotify 监控目录路径" 这条简单的命令,就能够看到对这个目录以及该目录下全部进行任何操做的的监控日志。
但因为监控事件太过杂,不少并非咱们关注的,而且咱们不只仅要监控,还须要对某些操做进行自动处理,所以咱们能够本身编程,针对性地实现咱们须要的功能,下面是一段代码示例。
#!/usr/bin/env python # -*- coding: utf-8 -*- # ** Author: ssooking import os import argparse from pyinotify import WatchManager, Notifier,ProcessEvent from pyinotify import IN_DELETE, IN_CREATE,IN_MOVED_TO,IN_ATTRIB class EventHandler(ProcessEvent): """事件处理""" #建立 def process_IN_CREATE(self, event): print "[!] Create : " + event.pathname DeleteFileOrDir(event.pathname) #删除 def process_IN_DELETE(self, event): print "[!] Delete : " + event.pathname #文件属性被修改,如chmod、chown命令 def process_IN_ATTRIB(self, event): print "[!] Attribute been modified:" + event.pathname #文件被移来,如mv、cp命令 def process_IN_MOVED_TO(self, event): print "[!] File or dir been moved to here: " + event.pathname DeleteFileOrDir(event.pathname) def DeleteFileOrDir(target): if os.path.isdir(target): fileslist = os.listdir(target) for files in fileslist: DeleteFileOrDir(target + "/" + files) try: os.rmdir(target) print " >>> Delete directory successfully: " + target except: print " [-] Delete directory failed: " + target if os.path.isfile(target): try: os.remove(target) print " >>> Delete file successfully" + target except: print " [-] Delete file filed: " + target def Monitor(path): wm = WatchManager() mask = IN_DELETE | IN_CREATE | IN_MOVED_TO | IN_ATTRIB notifier = Notifier(wm, EventHandler()) wm.add_watch(path, mask,rec=True) print '[+] Now Starting Monitor: %s'%(path) while True: try: notifier.process_events() if notifier.check_events(): notifier.read_events() except KeyboardInterrupt: notifier.stop() break if __name__ == "__main__": parser = argparse.ArgumentParser( usage="%(prog)s -w [path]", description=(''' Introduce:Simple Directory Monitor! by ssooking''') ) parser.add_argument('-w','--watch',action="store",dest="path",default="/var/www/html/",help="directory to watch,default is /var/www/html") args=parser.parse_args() Monitor(args.path)
关于pyinotify 库的用法再也不赘述,能够看到我在上述代码中建立了一个事件监控处理的类EventHandler,在这个示例中,咱们仅仅关注建立、删除、修改属性、移动操做事件,而且我定义了一个DeleteFileOrDir方法用于自动删除增长的目录或者文件。运行测试截图:
咱们能够编写功能更加细化的程序,实现如监控文件变动,禁止建立、修改、删除任何文件或目录,自动删除新增文件,把被修改的文件改回去, 删除畸形隐藏文件等功能。咱们使用pyinstaller把我代码打包为linux的elf可执行文件。-F参数表示打包为独立可运行文件,命令执行完以后自动生成:build、dist文件夹和SimpleMonitor.spec文件,你能够在dist目录里找到生成的elf程序。
打包的文件在CTFDefense项目的Monitor目录下
linux安全防御必定少不了 iptables了,使用iptables须要有管理员权限。对于比赛环境,咱们彻底能够配置一个近乎苛刻的配置防火墙策略。
具体咱们能够作哪些工做呢,举一些例子:
(1)关闭全部网络端口,只开放一些比赛的必要端口,也能够防止后门的链接
#开放ssh iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT #打开80端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT #开启多端口简单用法 #iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT
#容许外部访问本地多个端口 如8080,8081,8082,且只容许是新链接、已经链接的和已经链接的延伸出新链接的会话
iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082,12345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082,12345 -m state --state ESTABLISHED -j ACCEPT
(2)限制ssh登录,进行访问控制
iptable -t filter -A INPUT -s 123.4.5.6 -p tcp --dport 22 -j DROP //禁止从123.4.5.6远程登录到本机 iptables -A INPUT -s 123.4.5.6/24 -p tcp --dport 22 -j ACCEPT //容许123.4.5.6网段远程登录访问ssh
(3)限制IP链接数和链接速率
咱们能够限制IP的网络链接数和速度等,限制过快的链接频率,这样能够在必定程度上限制对方的扫描器。狠一点的话,甚至可让对方只能以手工点网页的速度与访问+_+
单个IP的最大链接数为 30
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
单个IP在60秒内只容许最多新建15个链接
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
容许外部访问本机80端口,且本机初始只容许有10个链接,每秒新增长2个链接,若是访问超过此限制则拒接 (此方式能够限制一些攻击)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 2/s --limit-burst 10 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
再猥琐一点,能够定时断开已经创建的链接,让对方只能断断续续的访问~~
(4)数据包简单识别,防止端口复用类的后门或者shell
假设病毒木马程序经过22,80端口像服务器外传送数据,这种方式发向外发的数据不是咱们经过访问网页请求而回应的数据包。咱们能够禁止这些没有经过请求回应的数据包。
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEP
(5)限制访问
若是对方来势太凶,咱们能够限制或者封杀他们的ip段。
iptable -t filter -A FORWARD -s 123.4.5.6 -d 123.4.5.7 -j DROP //禁止从客户机123.4.5.6访问123.4.5.7上的任何服务
封杀123.4.5.6这个IP或者某个ip段
iptables -I INPUT -s 123.4.5.6 -j DROP
iptables -I INPUT -s 123.4.5.1/24 -j DROP
(6)过滤异常报文
iptables有一个TCP匹配扩展协议--tcp-flags,功能是过滤TCP中的一些包,好比SYN包,ACK包,FIN包,RST包等等。举个例子,咱们知道SYN是创建链接,RST是重置链接,若是这两个同时出现,就知道这样的包是有问题的,应该丢弃。下面的例子是利用--tcp-flags参数,对一些包进行标识过滤,扔掉异常的数据包。
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN #表示 SYN,FIN,ACK,RST的标识都检查,但只匹配SYN标识 iptables -A INPUT -p tcp --syn #匹配SYN标识位 iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP #检查全部的标识位,匹配到FIN URG PSH的丢弃 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #丢弃没标志位的包 iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP #匹配到SYN ACK FIN URG的丢弃 iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP #匹配到SYN ACK FIN RST的丢弃 iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP #匹配到SYN FIN PSH的丢弃 iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP #匹配到SYN FIN RST PSH的丢弃 iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP #匹配到 SYN,RST的丢弃 iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #匹配到 SYN,FIN的丢弃
(7)防DDOS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
-m limit: 启用limit扩展
–limit 20/minute: 容许最多每分钟10个链接
–limit-burst 100: 当达到100个链接后,才启用上述20/minute限制
丢弃陌生的TCP响应包,防止反弹式攻击
iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --syn -j DROP
更多的姿式,须要打开咱们的脑洞了,下面是一个通用的firewall脚本,咱们能够传到服务器上一键执行,相关参数能够查阅资料详细了解:
#!/bin/bash #Allow youself Ping other hosts , prohibit others Ping you iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP iptables -A OUTPUT -p icmp --icmp-type 8 -s 0/0 -j ACCEPT #Close all INPUT FORWARD OUTPUT, just open some ports iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP #Open ssh iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT #Open port 80 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT #Open multiport #iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT #Control IP connection #The maximum number of connections for a single IP is 30 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT #A single IP allows up to 15 new connections in 60 seconds iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT #Prevent port reuse iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT #Filter abnormal packets iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j DROP iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #Prevent DoS attacks iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT #Discard unfamiliar TCP response packs to prevent rebound attacks iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP iptables -A FORWARD -m state --state NEW -p tcp --syn -j DROP
注意,对于不一样的iptables版本,一些参数的用法能够会有略微的差别,使用时咱们可能要根据须要进行修改。
关于溢出类攻击,我尚未总结出一些很实用的姿式,这里提供一些思路。
通常来讲,溢出攻击成功后,会创建shell通道和网络链接,咱们能够配合前面提到的命令,从这两方面入手进行检测和阻隔:
(1)检测高权限的进程
(2)检测sh,bash等进程
(3)检测创建的网络链接
(4)检查开放的端口
例子:经过端口和bash发现可疑进程
若是咱们怀疑某个进程正在是受到溢出攻击后建立的shell进程,咱们能够分析这个进程是否有socket链接,linux中查看指定进程socket链接数的命令为:
ls /proc/<进程pid>/fd -l | grep socket: | wc -l
好比咱们查看ssh进程的socket链接。若是咱们检测的程序有socket链接,说明它正在进行网络通讯,咱们就须要进行进一步判断。
咱们还能够检测可疑进程开启的管道。linux下查看进程管道数的命令相似:
ls /proc/<进程pid>/fd -l | grep pipe: | wc -l
典型的一个例子是:Apache模块后门mod_rootme,它复用了webserver的80端口,mod_rootme经过管道和bash交互数据,可是因为开启了额外的管道,咱们从这个变化上便能察觉到。
详细内容能够参考:http://t.qq.com/p/t/330573116082464。
整体来讲,咱们主要能够关注进程状况和网络链接状况,综合分析进程,阻断溢出攻击建立的shel的。
CTF比赛中修复漏洞主要就是为了防止其余队伍的入侵了。
1. 删站:若是赛组没有明确禁止,这是最粗暴的姿式,只留本身的webshell,参加过几场比赛确实遇到了这种尴尬的事情,web攻防最后都演变成了拼手速的“GetShell+留后门+删站”。
2. 删漏洞页面:大部分举办方仍是会明确禁止删除网站的,一般赛组会按期访问网站主页(通常来讲),从而肯定网站是否正常运行。其实咱们不必删除整个网站,只要删掉有漏洞的页面就好了,好比删后台登陆页面、注册页面、上传页面等等。
3. 破坏正常功能:若是明确不能删除任何页面,能够选择让这些漏洞点的功能函数(或者其依赖的功能函数)失效。好比上传点,若是考虑过滤挺麻烦,又不能删页面,那么咱们能够找到这个漏洞网页,改掉或者删掉文件里对应的相似upload等这种功能调用函数。
上面这三种其实都算不上修补漏洞了,真实环境下哪能这么干。
4. 采用正常修补手段:规则限定很严的状况下,咱们仍是采用正常手法吧,修改服务配置、安装补丁、下载更新的软件版本、加过滤等等。
>>>>>_<<<<<<
谈到那个删站,我忍不住想吐槽几句,我我的是不同意这种作法的,由于这种操做在比赛中很容易拉仇恨而且产生连锁反应,也不利于我的的进步。有些人认为:我先拿下这台服务器说明我有能力,你没进去就说明你没本事,因此我先进去删了站不让其余人进也无可厚非,有能耐你就先拿下它,那你删了我也没意见。也有人说,真正的对抗里,敌人不会对你仁慈~~没错,挺有道理的,并且强者也应该拥有发言权。可是咱们不能只从一个角度考虑问题,换个角度去考虑,CTF竞赛虽然是向着真实的网络环境靠拢,可是它的根本目的是提升竞技者的安全技能和知识水平。对于大部分切磋竞技的玩家来讲,参加比赛也都是为了让本身得到提升,你们在同一个平台上进行进行切磋对抗,认识到本身和对手身上的优势与不足,这才是竞技。可是这种行为其实从某种意义上来讲已经破坏了比赛的公平性,毕竟若是是由于技术不到位,那固然没什么话说,可是若是网站删了,让别人发挥的地方都没有,这种切磋也没有意义。举个不太恰当的例子,这就像两我的打架,你说你比我强,我们比比再说,可是你都不让我跟你打,这算什么。再换个角度,其实我一直坚信真正具备强者姿态的人,不畏惧挑战、不怕被人超越,不屑于经过这种手段巩固本身的地位。相反,咱们只有将本身至于狂风大浪中,才能成长和蜕变,最终成为一个强者。
不管从什么角度考虑,咱们应该勇于挑战自身、挑战别人,不断强大本身,不断去征服,无畏无惧、步履铿锵!
可使用第三方软件的话,装个WAF,安全狗之类的吧。这个我没什么话要说,附个linux安全狗的连接吧:
安全狗linux版:http://www.safedog.cn/website_safedog.html
咱们平时也能够搜集或者本身实现一些脚本或者工具有用。
这里有waf一枚:http://hackblog.cn/post/75.html
若是咱们想给web目录文件添加自定义waf脚本,其实能够用一条命令解决,以php为例:
find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?php\nrequire_once('\/tmp\/waf.php');\n/g"
命令的意思就是查找/var/www/html目录下全部php文件,在头部添加一句,用require函数引入/tmp/waf.php文件。由于sed命令利用 / 区分文件中的原字符串和修改的字符串,因此咱们要对 / 进行转义。相似于在单引号中再次使用单引号时咱们也要用反斜杠转义:\',命令转换过来就是这样:
find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?php\nrequire_once('/tmp/waf.php');\n/g"
这样,再次打开时咱们就会发现已经引入了自定义waf文件。
若是说很不幸,咱们前面的关卡都被突破了(实际上我都感受前面那些设置都有点“搅屎”的味道了,不过仍是但愿师傅们能一块儿来讨论讨论有没有什么骚姿式,以及绕过它们的方法)。假设真的被突破了,对于CTF线下赛来讲,咱们最终的目的都是拿到flag。一般咱们会在服务器上执行相似于"getflag"命令,或者"curl"访问某个url获取flag,而后获取到一个字符串,而后在答题平台上提交这段字符串便可获取分数。就拿前以前的ISCC来讲,这个也是我赛后想到的。这个getflag是一个elf的程序,在/usr/bin/下,顺手给下载了,有兴趣的同窗能够去逆向一波。重点在这,有几回我getflag的时候由于webshell丢了,服务器显示了Error。后来想一想,咱们是否是能够故意利用这种报错来欺骗不细心的竞争对手呢,固然我不知道是否是已经有师傅们用了这个手法。这是模拟的效果:
怎样实现?好比咱们能够添加alias别名,或者咱们能够把这些命令更改或者替换掉,换成一些假装命令程序。再换一层想一想,接着上面的思路,若是咱们替换或者假装了系统命令,对方getshell以后,进来发现cd,ls等命令都无法用,会怎么样呢?然而这样会不会不太好~~
最后推荐一个感受挺实用功能很强的远程链接管理工具,能够极大方便咱们的工做:MobaXterm。(不是打广告~)
它支持多种链接方式,能够拖拽进行文件管理。支持在打开的会话一键批量执行命令
还有一个很是方便的ssh端口转发功能,支持本地、远程、动态转发。
还有不少其余功能貌似很厉害,不过我没用过,就不说了...
真不是打广告。
现在CTF愈来愈火,对于这些比赛的举办方,我有着一些不成熟想法和小建议,若是您以为有什么不合适的地方,纯当娱乐:
(1)扩展竞技形式:目前线下赛web攻防占绝大多数,有些小比赛甚至只有若干web服务器,上面放几个不一样类型的站点,形式有些单一了,其实能够增长多种对抗模式,甚至可让参赛选手走出比赛场地。去年曾有幸聆听了诸葛建伟博士关于打破XCTF现有格局的讲座,他提出了体系化攻防演练,认为CTF能够引入实地wifi渗透、门禁系统突破、无人机攻防、GPS信号对抗等,增长比赛多样性与趣味性,让线下赛再也不只是局限于小小的机房~~
(2)重视安全分析与防御。安全不只仅只是网络攻防对抗,数据分析、取证分析、应急响应、追踪溯源等技能也至关重要,而且在安全人才圈里这方面缺口也比较大。今年六月份,启明星辰主办的2017”信息安全铁人三项赛"(分为”我的逆向赛“、”数据分析赛“、”企业攻防赛“三个赛事),其中”数据分析赛“即是一个典型表明,参赛选手须要分析真实企业网络环境下受网络攻击的流量数据,从中找出攻击者、分析其网络攻击行为,如欺骗劫持、爆破、webshell链接操做等,找到并分析攻击者的后门或者恶意软件。这种模式,有助于参赛者接触到相对更加真实的网络攻击流量的对抗与防护。
(3)完善竞技模式的具体细节,尽可能避免取巧或者粗暴姿式。好比拿修补漏洞举例子,如今CTF线下赛中绝大部分参赛者为了维持加固本身的shell,每每都会采用删除部分页面的方法,好比登录、注册页面,由于采用正常打补丁、修改配置等操做都比较费时费事。但在比赛中这种方式是对于学习真正的安全加固、漏洞修补知识没有太多提升。玩CTF不该该仅仅为了比赛而比赛,或者只是为了拿个奖、拿几张证书,仍是要注重从中学到点东西,不过有证书对之后就业仍是有些帮助的。
虽说这些会增长举办方的负担,给选手增长难度,可是这也是一种趋势。CTF必然要经历从普及到提升的转变,而且随着参赛选手水平的提升,咱们确实须要一些更有意思的玩法,这是一个相互促进的关系。固然,对于入门级的CTF选手来讲,题目难度过大反而会下降比赛体验,对于不一样级别的玩家,能够设置不一样级别的赛事。从形式上奖,像引入门禁系统突破、无人机攻防等,对于大部分CTF举办方来讲实现起来有些难度,毕竟涉及到不一样的环境、设备、人员维护等问题,因此这个不该该强求,可是对网络攻防来讲增长如windows 服务器、邮件服务器、路由设备等仍是可行的。之后的CTF规格和水平会愈来愈高,对于参赛选手的挑战难度也会愈来愈大,这对于举办方和选手来讲都是挑战,可是挑战亦是机遇,咱们应时刻准备好投入战斗!
虽然说上面提到的这些姿式不可能让咱们的靶机变得无懈可击,可是至少能在某种程度上提升它的防护值,但愿能对你们有所帮助。最后,祝愿各位CTF参赛选手在比赛中勇创佳绩,同时也祝愿各单位的大佬们都能把CTF筹办的愈来愈好!