CTF線下防御戰 — 讓你的靶機變成“銅牆鐵壁”


本文首發安全客,未經允許禁止轉載。原文鏈接

一. 前言

  隨着CTF的普及,比賽的形式也有了越來越多的花樣,對於線下賽來說,開始出現了安全加固或者防御戰之類的環節,亦或者因為拿下靶機后不希望其他攻擊者進入而進行“爭奪”,無論什么形式,這些都需要我們對於服務器的防護工作有所了解。對於線下賽,筆者雖說沒有什么很高超的攻防技巧,但也是有着一些自己的心得。本文總結了一些CTF線下賽中常用的服務器加固姿勢,希望能對各位CTF朋友們有所幫助。環境針對目前常見線下賽常見的linux Web服務器,但是因為CTF畢竟與真實網絡環境有很大區別,本文的涉及的大部分姿勢不具有普遍適用性。本文涉及到的相關代碼github下載地址:CTFDefense

二. 常用姿勢

1. 提權

  在開始正文之前,需要先提一下提權,這個要根據自己的比賽過程中的需要而定。有些比賽就有專門的防御加固環節,但安全加固的很多操作都會涉及到root權限,如果直接給root權限最好,但一般一開始會給一個普通權限賬號,或者干脆什么都不給,需要我們自己通過漏洞拿下服務器,這樣往往就需要提權了。關於提權,通常我們要根據kernel版本號找到對應的poc,平時我們可以收集測試一些比較新的提權poc,以備不時之需。這里有一個網站:http://exploit.linuxnote.org/,里面有許多linux本地提權的poc。github上有一個挺全的提權exp項目:https://github.com/SecWiki/linux-kernel-exploits。網上也有人分享的一些打包搜集的poc,比如這個,有興趣的朋友可以多下載看看。

下面分享幾個最近兩年並且影響范圍比較大的:

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.04、14.04,Debian 7、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,攻擊者可以利用它破壞內存並執行任意代碼 。

CVE-2016-1247(Nginx權限提升漏洞)

描述:Nginx服務在創建log目錄時使用了不安全的權限設置,可造成本地權限提升,惡意攻擊者能夠借此實現從 nginx/web 的用戶權限 www-data 到 root 用戶權限的提升。

POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.html

 

 提權相關代碼在GetRoot目錄,POC中是上面提到的幾個本地提權源代碼,release中分別是編譯好的32位和64位程序。 

 

實用腳本

   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籌辦的越來越好!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM