CTF線下防護戰 — 讓你的靶機變成「銅牆鐵壁」

本文首發安全客,未經容許禁止轉載。原文連接php

一. 前言

  隨着CTF的普及,比賽的形式也有了愈來愈多的花樣,對於線下賽來講,開始出現了安全加固或者防護戰之類的環節,亦或者由於拿下靶機後不但願其餘攻擊者進入而進行「爭奪」,不管什麼形式,這些都須要咱們對於服務器的防禦工做有所瞭解。對於線下賽,筆者雖然說沒有什麼很高超的攻防技巧,但也是有着一些本身的心得。本文總結了一些CTF線下賽中經常使用的服務器加固姿式,但願能對各位CTF朋友們有所幫助。環境針對目前常見線下賽常見的linux Web服務器,可是由於CTF畢竟與真實網絡環境有很大區別,本文的涉及的大部分姿式不具備廣泛適用性。本文涉及到的相關代碼github下載地址:CTFDefensehtml

二. 經常使用姿式

1. 提權

  在開始正文以前,須要先提一下提權,這個要根據本身的比勝過程中的須要而定。有些比賽就有專門的防護加固環節,但安全加固的不少操做都會涉及到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提權?這四個腳本能夠幫助你

2. 經常使用操做命令

  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應急響應姿式淺談

3. 文件監控防webshell

  防護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目錄下

 

4. 網絡監控斷異常鏈接

  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版本,一些參數的用法能夠會有略微的差別,使用時咱們可能要根據須要進行修改。

5. 綜合分析控阻溢出類攻擊

  關於溢出類攻擊,我尚未總結出一些很實用的姿式,這裏提供一些思路。

  通常來講,溢出攻擊成功後,會創建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的。

6. 漏洞修復簡單粗暴

  CTF比賽中修復漏洞主要就是爲了防止其餘隊伍的入侵了。

  1. 刪站:若是賽組沒有明確禁止,這是最粗暴的姿式,只留本身的webshell,參加過幾場比賽確實遇到了這種尷尬的事情,web攻防最後都演變成了拼手速的「GetShell+留後門+刪站」。
  2. 刪漏洞頁面:大部分舉辦方仍是會明確禁止刪除網站的,一般賽組會按期訪問網站主頁(通常來講),從而肯定網站是否正常運行。其實咱們不必刪除整個網站,只要刪掉有漏洞的頁面就好了,好比刪後臺登陸頁面、註冊頁面、上傳頁面等等。
  3. 破壞正常功能:若是明確不能刪除任何頁面,能夠選擇讓這些漏洞點的功能函數(或者其依賴的功能函數)失效。好比上傳點,若是考慮過濾挺麻煩,又不能刪頁面,那麼咱們能夠找到這個漏洞網頁,改掉或者刪掉文件裏對應的相似upload等這種功能調用函數。

  上面這三種其實都算不上修補漏洞了,真實環境下哪能這麼幹。

  4. 採用正常修補手段:規則限定很嚴的狀況下,咱們仍是採用正常手法吧,修改服務配置、安裝補丁、下載更新的軟件版本、加過濾等等。

 

  >>>>>_<<<<<<

  談到那個刪站,我忍不住想吐槽幾句,我我的是不同意這種作法的,由於這種操做在比賽中很容易拉仇恨而且產生連鎖反應,也不利於我的的進步。有些人認爲:我先拿下這臺服務器說明我有能力,你沒進去就說明你沒本事,因此我先進去刪了站不讓其餘人進也無可厚非,有能耐你就先拿下它,那你刪了我也沒意見。也有人說,真正的對抗裏,敵人不會對你仁慈~~沒錯,挺有道理的,並且強者也應該擁有發言權。可是咱們不能只從一個角度考慮問題,換個角度去考慮,CTF競賽雖然是向着真實的網絡環境靠攏,可是它的根本目的是提升競技者的安全技能和知識水平。對於大部分切磋競技的玩家來講,參加比賽也都是爲了讓本身得到提升,你們在同一個平臺上進行進行切磋對抗,認識到本身和對手身上的優勢與不足,這纔是競技。可是這種行爲其實從某種意義上來講已經破壞了比賽的公平性,畢竟若是是由於技術不到位,那固然沒什麼話說,可是若是網站刪了,讓別人發揮的地方都沒有,這種切磋也沒有意義。舉個不太恰當的例子,這就像兩我的打架,你說你比我強,我們比比再說,可是你都不讓我跟你打,這算什麼。再換個角度,其實我一直堅信真正具備強者姿態的人,不畏懼挑戰、不怕被人超越,不屑於經過這種手段鞏固本身的地位。相反,咱們只有將本身至於狂風大浪中,才能成長和蛻變,最終成爲一個強者。

  不管從什麼角度考慮,咱們應該勇於挑戰自身、挑戰別人,不斷強大本身,不斷去征服,無畏無懼、步履鏗鏘!

7. 安全軟件錦上添花

  可使用第三方軟件的話,裝個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文件。

 

8. 我可能get了假的flag

  若是說很不幸,咱們前面的關卡都被突破了(實際上我都感受前面那些設置都有點「攪屎」的味道了,不過仍是但願師傅們能一塊兒來討論討論有沒有什麼騷姿式,以及繞過它們的方法)。假設真的被突破了,對於CTF線下賽來講,咱們最終的目的都是拿到flag。一般咱們會在服務器上執行相似於"getflag"命令,或者"curl"訪問某個url獲取flag,而後獲取到一個字符串,而後在答題平臺上提交這段字符串便可獲取分數。就拿前以前的ISCC來講,這個也是我賽後想到的。這個getflag是一個elf的程序,在/usr/bin/下,順手給下載了,有興趣的同窗能夠去逆向一波。重點在這,有幾回我getflag的時候由於webshell丟了,服務器顯示了Error。後來想一想,咱們是否是能夠故意利用這種報錯來欺騙不細心的競爭對手呢,固然我不知道是否是已經有師傅們用了這個手法。這是模擬的效果:

 

 

   怎樣實現?好比咱們能夠添加alias別名,或者咱們能夠把這些命令更改或者替換掉,換成一些假裝命令程序。再換一層想一想,接着上面的思路,若是咱們替換或者假裝了系統命令,對方getshell以後,進來發現cd,ls等命令都無法用,會怎麼樣呢?然而這樣會不會不太好~~

 

  最後推薦一個感受挺實用功能很強的遠程鏈接管理工具,能夠極大方便咱們的工做:MobaXterm。(不是打廣告~)

它支持多種鏈接方式,能夠拖拽進行文件管理。支持在打開的會話一鍵批量執行命令

 

還有一個很是方便的ssh端口轉發功能,支持本地、遠程、動態轉發。

 

  還有不少其餘功能貌似很厲害,不過我沒用過,就不說了...

  真不是打廣告。

三. 對CTF舉辦的一點小小建議

  現在CTF愈來愈火,對於這些比賽的舉辦方,我有着一些不成熟想法和小建議,若是您以爲有什麼不合適的地方,純當娛樂:

  (1)擴展競技形式:目前線下賽web攻防佔絕大多數,有些小比賽甚至只有若干web服務器,上面放幾個不一樣類型的站點,形式有些單一了,其實能夠增長多種對抗模式,甚至可讓參賽選手走出比賽場地。去年曾有幸聆聽了諸葛建偉博士關於打破XCTF現有格局的講座,他提出了體系化攻防演練,認爲CTF能夠引入實地wifi滲透、門禁系統突破、無人機攻防、GPS信號對抗等,增長比賽多樣性與趣味性,讓線下賽再也不只是侷限於小小的機房~~

  (2)重視安全分析與防禦。安全不只僅只是網絡攻防對抗,數據分析、取證分析、應急響應、追蹤溯源等技能也至關重要,而且在安全人才圈裏這方面缺口也比較大。今年六月份,啓明星辰主辦的2017」信息安全鐵人三項賽"(分爲」我的逆向賽「、」數據分析賽「、」企業攻防賽「三個賽事),其中」數據分析賽「即是一個典型表明,參賽選手須要分析真實企業網絡環境下受網絡攻擊的流量數據,從中找出攻擊者、分析其網絡攻擊行爲,如欺騙劫持、爆破、webshell鏈接操做等,找到並分析攻擊者的後門或者惡意軟件。這種模式,有助於參賽者接觸到相對更加真實的網絡攻擊流量的對抗與防護。

  (3)完善競技模式的具體細節,儘可能避免取巧或者粗暴姿式。好比拿修補漏洞舉例子,如今CTF線下賽中絕大部分參賽者爲了維持加固本身的shell,每每都會採用刪除部分頁面的方法,好比登錄、註冊頁面,由於採用正常打補丁、修改配置等操做都比較費時費事。但在比賽中這種方式是對於學習真正的安全加固、漏洞修補知識沒有太多提升。玩CTF不該該僅僅爲了比賽而比賽,或者只是爲了拿個獎、拿幾張證書,仍是要注重從中學到點東西,不過有證書對之後就業仍是有些幫助的。

   雖說這些會增長舉辦方的負擔,給選手增長難度,可是這也是一種趨勢。CTF必然要經歷從普及到提升的轉變,而且隨着參賽選手水平的提升,咱們確實須要一些更有意思的玩法,這是一個相互促進的關係。固然,對於入門級的CTF選手來講,題目難度過大反而會下降比賽體驗,對於不一樣級別的玩家,能夠設置不一樣級別的賽事。從形式上獎,像引入門禁系統突破、無人機攻防等,對於大部分CTF舉辦方來講實現起來有些難度,畢竟涉及到不一樣的環境、設備、人員維護等問題,因此這個不該該強求,可是對網絡攻防來講增長如windows 服務器、郵件服務器、路由設備等仍是可行的。之後的CTF規格和水平會愈來愈高,對於參賽選手的挑戰難度也會愈來愈大,這對於舉辦方和選手來講都是挑戰,可是挑戰亦是機遇,咱們應時刻準備好投入戰鬥!

四. 最後的話

  雖然說上面提到的這些姿式不可能讓咱們的靶機變得無懈可擊,可是至少能在某種程度上提升它的防護值,但願能對你們有所幫助。最後,祝願各位CTF參賽選手在比賽中勇創佳績,同時也祝願各單位的大佬們都能把CTF籌辦的愈來愈好!

相關文章
相關標籤/搜索