Kali中AWD靶机环境搭建

news2025/1/11 21:54:35

Kali中AWD靶机环境搭建

    • 1、kali安装docker
    • 2、克隆项目(400多M,下载会有点久)
    • 3、进入项目
    • 4、下载镜像
    • 5、改镜像名
    • 6、比赛环境搭建
      • 6.1 启动靶机
      • 6.2 连接裁判机,启动check脚本
      • 6.3 关闭环境命令
    • 7、 靶机访问方式
      • 7.1 web界面访问
      • 7.2 ssh访问
      • 7.3.提交flag方法
      • 7.4.记分牌:查看实时分数情况
      • 7.5.查看攻击情况
    • 8、 靶机问题修复汇总
      • 8.1 check.py问题
      • 8.2 flag刷新时间修改
      • 8.3 修改score.txt和result.txt权限为777
      • 8.4 计分板换一个好看的背景
      • 8.5 无限提交flag的bug
    • 9、搭建靶机参考资料

1、kali安装docker

详见:https://blog.csdn.net/aodechudawei/article/details/122450720?spm=1001.2014.3001.5506

2、克隆项目(400多M,下载会有点久)

sudo git clone https://github.com/zhl2008/awd-platform.git

3、进入项目

sudo cd awd-platform/

4、下载镜像

sudo docker pull zhl2008/web_14.04

5、改镜像名

sudo docker tag zhl2008/web_14.04 web_14.04

6、比赛环境搭建

以root权限进入/awd-platform目录下,以yunnan_simple镜像为例

6.1 启动靶机

python2 batch.py web_yunnan_simple 3
python2 start.py ./ 3

在这里插入图片描述
在这里插入图片描述

6.2 连接裁判机,启动check脚本

docker attach check_server
敲一下回车键
python2 check.py

6.3 关闭环境命令

python2 stop_clean.py

7、 靶机访问方式

在虚拟机中执行ip a获取虚拟机ip,这里是192.168.40.129:
在这里插入图片描述

7.1 web界面访问

Team1:<虚拟机ip>:8801
Team2:<虚拟机ip>:8802
Team3:<虚拟机ip>:8803
……

7.2 ssh访问

ssh用户密码可见文件awd-platform/pass.txt

Team1:<虚拟机ip>:2201
Team2:<虚拟机ip>:2202
Team3:<虚拟机ip>:2203
……

7.3.提交flag方法

http://<虚拟机ip>:8080/flag_file.php?token=teamX&flag=xxxx
(teamX中的X为自己队伍号,flag为其他队伍的flag)

在这里插入图片描述

7.4.记分牌:查看实时分数情况

默认配置下是:

http://<虚拟机ip>:8080/score.txt

在这里插入图片描述
参照8.4中配置后是:

http://<虚拟机ip>:8080

在这里插入图片描述

7.5.查看攻击情况

http://<虚拟机ip>:8080/result.txt

在这里插入图片描述

8、 靶机问题修复汇总

按照默认配置搭建的靶机是有问题的,需要执行以下操作来修复:

8.1 check.py问题

参照:https://blog.csdn.net/weixin_34211761/article/details/92983952
修改awd-platform/check_server/check.py,代码如下:

#!/usr/bin/env python
# -*- coding:utf8 -*-
'''

'''
import hashlib
import base64

sleep_time  = 300
debug = True
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}

import time
import httplib
import urllib2
import ssl 

my_time = 'AAAA' 
__doc__ = 'http(method,host,port,url,data,headers)'
flag_server = '172.17.0.1'
key = '744def038f39652db118a68ab34895dc'
hosts = open('host.lists','r').readlines()
user_id = [host.split(':')[0] for host in hosts]
hosts = [host.split(':')[1] for host in hosts]
port = 80

def http(method,host,port,url,data,headers):
    con=httplib.HTTPConnection(host,port,timeout=2)
    if method=='post' or method=='POST':
        headers['Content-Length']=len(data)
        headers['Content-Type']='application/x-www-form-urlencoded'  
        con.request("POST",url,data,headers=headers)
    else:
        headers['Content-Length'] = 0    
        con.request("GET",url,headers=headers)
    res = con.getresponse()
    if res.getheader('set-cookie'):
        #headers['Cookie'] = res.getheader('set-cookie')
        pass
    if res.getheader('Location'):
        print "Your 302 direct is: "+res.getheader('Location')
    a = res.read()
    con.close()
    return a


def https(method,host,port,url,data,headers):
    url = 'https://' + host + ":" + str(port) + url
    req = urllib2.Request(url,data,headers)
    response = urllib2.urlopen(req)
    return response.read()

def get_score():
    res = http('get',flag_server,8080,'/score.php?key=%s'%key,'',headers)
    print res
    user_scores = res.split('|')
    print "******************************************************************"
    res = ''

    print res
    print "******************************************************************" 
    return user_scores

def write_score(scores):
    scores = '|'.join(scores)
    res = http('get',flag_server,8080,'/score.php?key=%s&write=1&score=%s'%(key,scores),'',headers)
    if res == "success":
        return True
    else:   
        print res
        raise ValueError

class check():
    
    def index_check(self):
        res = http('get',host,port,'/index.php?file=%s'%str(my_time),'',headers)
        if 'perspi' in res:
            return True
        if debug:
            print "[fail!] index_fail"
        return False

def server_check():
    try:
        a = check()
        if not a.index_check():
            return False
        return True
    except Exception,e:
        print e
        return False

game_round = 0
while True:
    
    scores = get_score()
    scores = []
    print "--------------------------- round %d -------------------------------"%game_round
    for host in hosts:
        print "---------------------------------------------------------------"
        host = host[:-1]
        if server_check():
            print "Host: "+host+" seems ok"
            scores.append("0")
        else:
            print "Host: "+host+" seems down"
            scores.append("-10")
    game_round += 1
    write_score(scores)
    time.sleep(sleep_time)

8.2 flag刷新时间修改

check时间和flag刷新时间,从2分钟改为5分钟:

/awd-platform/check_server/gen_flag.py  的time_span 变量设置为5*60
/awd-platform/flag_server/config.php 的 min_time_span变量设置为300
/awd-platform/flag.py 变量time_span设置为5*60

8.3 修改score.txt和result.txt权限为777

否则会因为权限问题无法写入文件,从而导致积分无变化
在这里插入图片描述
更新后效果:
在这里插入图片描述

8.4 计分板换一个好看的背景

资源下载地址如下:
https://pan.baidu.com/s/18KlIeluaTtm-kT3KuXHseQ 密码:cvdn
将计分板文件拷贝至awd-platform下的flag_server文件夹下,执行以下命令解压:

unzip awd计分板.zip

目录结构如下:
在这里插入图片描述

还需将index.php文件中的resul变量中的IP地址更改为本机IP
在这里插入图片描述
修改后结果如下:
在这里插入图片描述
界面效果如下:
在这里插入图片描述

8.5 无限提交flag的bug

网上找到的是修改时间来阻止无限提交
修改方法参见:https://www.cnblogs.com/Triangle-security/p/11332223.html
但感觉不太优雅,最好可以启动靶机的时候同时启动对应脚本,不用人来控制脚本启动时间
另外脚本只是针对某一时刻的,还是有些勉强
感觉逻辑也不太对,应该是一支队伍同一个flag只能提交一次,直到出现新的flag才可以继续提交,这样其实也是变相控制五分钟提交一次
基于以上的逻辑,试探性的修改了一下awd-platform/flag_server/flag_file.php代码,初步试验是可行的,这里简单分享一下:
思路其实很简单,就是如果flag提交正确,那么就将对应的队伍和flag值记录到一个文件中,当下一次再提交时,会与文件中的队伍名和flag值做比对,如果已存在对应的记录则报错不加分,否则打印success同时再记录信息到对应文件中,最终的flag_file.php代码如下:

<?php

require 'config.php';
#require 'pass.php';
$now_time = time();
$flag_file = 'xxxxxxxx_flag';

function check_time($attack_uid,$victim_uid){
    global $time_file;
    global $min_time_span;
    global $now_time;
    global $team_number;
    $old_times = explode('|' , file_get_contents($time_file));
    $id = $attack_uid * $team_number + $victim_uid;
    if ($now_time - $old_times[$id] < $min_time_span){
        die("error: submit too quick ". ($min_time_span + $old_times[$id] - $now_time). " seconds left");
    }else{
        return True;
    }
}

function update_time($attack_uid,$victim_uid){
    global $time_file;
    global $now_time;
    global $team_number;
    $old_times = explode('|' , file_get_contents($time_file));
    $id = $attack_uid * $team_number + $victim_uid;
    $old_times[$id] = $now_time;
    $now_times = $old_times;
    file_put_contents($time_file,implode('|' , $now_times));
}

function match_flag($flag,$flag_file){
    $flags = explode("\n",file_get_contents($flag_file));
    foreach ($flags as $real_flag) {
        $tmp = explode(":",$real_flag);
        $host = $tmp[0];
        $real_flag = $tmp[1];
        if($flag==$real_flag){
            return $host;
        }
    }
    return '';

}

function check_flag($attack_id,$flag){
    $flags = explode("\n",file_get_contents('submit_flag.txt'));
    foreach ($flags as $sub_flag) {
        $tmp = explode(":",$sub_flag);
        $attacker = $tmp[0];
        $real_flag = $tmp[1];
        $submit_status = $tmp[2];
		if($flag==$real_flag && $attack_id == $attacker){
            return '';
        }
    }
    return $flag;

}

if(isset($_REQUEST['token']) && isset($_REQUEST['flag'])){
    $token = $_REQUEST['token'];
    $flag = $_REQUEST['flag'];
    //$ip = isset($_REQUEST['test_ip'])?$_REQUEST['test_ip']:$_SERVER['REMOTE_ADDR'];
    if(!array_key_exists($token , $token_list)){
        die('error: no such token');
    }
    $ip = match_flag($flag,$flag_file);
    if(!$ip){
        die('error: no such flag');
    }
    $attack_id = $token_list[$token];
    $victim_id = $ip_list[$ip];
    if($attack_id === $victim_id){
        die('error: do not attack yourself');
    }
    $flag_validity = check_flag($attack_id,$flag);
    if(!$flag_validity){
        die('error: The flag has already been submitted');
    }
    file_put_contents('submit_flag.txt',$attack_id . ':' . $flag . "\n", FILE_APPEND);
    for($i=0;$i<$team_number;$i++){
        $scores[$i] = 0;
    }
    $scores[$attack_id] = 2;
    $scores[$victim_id] = -2; 
    check_time($attack_id,$victim_id);
    $score = implode('|',$scores);
    file_put_contents('result.txt',$user_list[$attack_id] . ' => ' . $user_list[$victim_id]."\n", FILE_APPEND);
    $cmd = 'curl "127.0.0.1/score.php?key='.$key.'&write=1&score='.$score.'"';
    system($cmd);
    update_time($attack_id,$victim_id);
 
}else {
    die("error: empty token or empty target");
}

主要的修改为增加了check_flag()函数和以下的判断代码:

	$flag_validity = check_flag($attack_id,$flag);
    if(!$flag_validity){
        die('error: The flag has already been submitted');
    }
    file_put_contents('submit_flag.txt',$attack_id . ':' . $flag . "\n", FILE_APPEND);

除替换awd-platform/flag_server/flag_file.php外还需要在awd-platform/flag_server/目录下执行以下操作:

touch submit_flag.txt
chmod 777 submit_flag.txt

最终的效果如下:
team1第一次提交team3的flag,可以成功提交:
在这里插入图片描述
第二次提交则报错,且分数不会增加:
在这里插入图片描述
team2第一次提交team3的flag,可以成功提交:
在这里插入图片描述
第二次提交则报错,且分数不会增加:
在这里插入图片描述

9、搭建靶机参考资料

kali安装docker(亲测有效)
AWD平台搭建
搭建CTF-AWD训练平台
线下AWD平台搭建以及一些相关问题解决
一个awd训练平台
云服务器AWD平台搭建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AMD 翻身无望,RX7000多款主流新卡出炉逗乐NVIDIA

看了今年 NVIDIA RTX 40 系中端主流级显卡&#xff0c;让咱明白了什么叫毫无诚意。 4060 核心规模不及 4090 的 19%、4060Ti 打不过 3070&#xff0c;可真是小刀划屁股开了眼。 奈何 AMD 这代 RX 7000 系显卡着实给不上压力。 旗舰 RX 7900 XTX、7900 XT 完全不敌 RTX 4090、…

go get报错

这里写目录标题 执行 go install github.com/mitchellh/goxlatest提示下面错误&#xff0c;我浏览器直接访问时能访问了&#xff0c;这个下面的提示是golang代理问题 go install: github.com/mitchellh/goxlatest: module github.com/mitchellh/gox: Get “https://proxy.golan…

职场演讲口才培训的影响研究:演讲训练项目的效果探究

题目&#xff1a;职场演讲口才培训的影响研究&#xff1a;演讲训练项目的效果探究 I. 引言 A. 话题背景和意义 在现代职场中&#xff0c;良好的演讲口才已经成为一个不可或缺的技能。随着全球化和信息技术的迅速发展&#xff0c;职场中的沟通方式和需求也发生了巨大变化。无论…

多门店小程序怎么弄

连锁多门店小程序是一种基于微信平台的应用&#xff0c;旨在为连锁企业提供线上线下一体化的服务。以下是该小程序的功能介绍&#xff1a; 1. 门店查找&#xff1a;用户可以通过小程序查找附近的连锁门店&#xff0c;根据地理位置、距离等条件进行筛选&#xff0c;并查看每个门…

MFC创建和使用OCX控件

文章目录 MFC建立OCX控件注册OCX控件与反注册使用Internet Explorer测试ocx控件OCX控件添加方法OCX控件添加事件Web使用OCX控件MFC使用OCX控件使用OCX控件调用ocx的功能函数对ocx的事件响应OCX控件调试工具tstcon32.exe加载ocx控件使用tstcon32.exe调试ocxMFC建立OCX控件 新建…

镜像网站汇总【8月9日更新】

今日最新整理&#xff1a;还是最基本原则&#xff1a; 不用注册&#xff0c; 不用登录&#xff0c; 不用魔法&#xff0c; 不用梯子&#xff0c; 必须是上来就用的镜像&#xff01; 第一个&#xff1a;可用网址汇总 网址&#xff1a;https://c.aalib.net/tool/chatgpt/ …

【原创】基于JavaWeb的婚礼策划平台

主要功能介绍&#xff1a;系统基于Java语言开发。整个程序属于B/S架构应用。在开发的时候&#xff0c;将婚礼策划中主要的业务如&#xff1a;婚纱摄影预约以及婚纱租赁等作为主要的目标和研究方向。婚礼策划平台系统从整体结构设计上&#xff0c;由网站前台和系统后台组成。网站…

江苏省发布雨水排放环境管理办法,这些重点值得关注!

近日&#xff0c;江苏省深入打好污染防治攻坚战指挥部办公室正式印发了《江苏省重点行业工业企业雨水排放环境管理办法&#xff08;试行&#xff09;》&#xff0c;已于2023年5月15日正式施行。 本办法所称重点行业工业企业&#xff0c;是指化工、电镀原料药制造、冶炼、印染行…

方法区——元空间概述

方法区 不同版本具体实现 标准层面&#xff1a;方法区&#xff08;Method Area&#xff09;具体实现层面&#xff1a; ≤JDK1.6 永久代JDK1.7 永久代仍然存在&#xff0c;但是已经开始提出&#xff1a;去永久代≥JDK1.8元空间&#xff08;Meta Space&#xff09; 永久代概念辨…

【torch.nn.Fold】和【torch.nn.Unfold】

文章目录 torch.nn.Unfold直观理解官方文档 toch.nn.Fold直观理解官方文档 torch.nn.Unfold 直观理解 torhc.nn.Unfold的功能&#xff1a; 从一个batch的样本中&#xff0c;提取出滑动的局部区域块patch&#xff08;也就是卷积操作中的提取kernel filter对应的滑动窗口&#…

C语言基础(持续更新)

常用函数 strrchr 描述 C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c&#xff08;一个无符号字符&#xff09;的位置。测试代码 #include "stdio.h" #include "string.h"int main() {printf(&q…

Ubuntu18.04中QGroundControl安装及添加到应用程序

Ubuntu18.04中QGroundControl安装及添加到应用程序 Ubuntu18.04中QGroundControl安装及添加到应用程序教程 目录 Ubuntu18.04中QGroundControl安装及添加到应用程序QGroundControl下载安装一、设置用户权限二、安装必要扩展包三、注销并再次登录以启用对用户权限的更改四、下…

pgsql查询某表所有字段

查询某表所有字段 查询某表所有字段 select * from information_schema.columns where table_schema模式名称 and table_name表名;模式 查询某表字段个数 select count(*) from information_schema.columns where table_schema模式名称 and table_name表名;

4.2 Windows终端数据安全

数据参考&#xff1a;CISP官方 目录 系统备份与还原数据备份数据粉碎数据加密 一、系统备份与还原 为什么需要系统备份 系统越用越慢系统故障导致不稳定系统无法登录 系统备份重新部署 (重装系统、重置系统) 丟失配置&#xff0c;需要重新配置个人数据丢失的风险 系统…

2023-08-09 LeetCode每日一题(整数的各位积和之差)

2023-08-09每日一题 一、题目编号 1281. 整数的各位积和之差二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例1&#xff1a; 示例2&#xff1a; 提示&#xff1a; 1 …

记一次空间告警与pg_rman keep-data-days参数研究

一、 背景 收到一个磁盘空间告警&#xff0c;检查发现是本地备份保留比较多导致的&#xff0c;处理过程倒很简单&#xff0c;手动清理掉旧的备份&#xff08;已自动备到远端服务器&#xff09;&#xff0c;告警就恢复了。 但是检查备份脚本的时候&#xff0c;发现keep-data-day…

WPF实战项目十一(API篇):待办事项功能api接口

1、新建ToDoController.cs继承基础控制器BaseApiController&#xff0c;但是一般业务代码不写在控制器内&#xff0c;业务代码写在Service&#xff0c;先新建统一返回值格式ApiResponse.cs&#xff1a; public class ApiResponse{public ApiResponse(bool status, string mess…

科技云报道:一波未平一波又起?AI大模型再出邪恶攻击工具

AI大模型的快速向前奔跑&#xff0c;让我们见识到了AI的无限可能&#xff0c;但也展示了AI在虚假信息、深度伪造和网络攻击方面的潜在威胁。 据安全分析平台Netenrich报道&#xff0c;近日&#xff0c;一款名为FraudGPT的AI工具近期在暗网上流通&#xff0c;并被犯罪分子用于编…

数据包传输方式:单播、多播、广播、组播、泛播

数据包传输方式 单播、多播、广播、组播、泛播 网络中假设X代表所有的机器&#xff0c;Y代表X中的一部分机器&#xff0c;Z代表一组机器&#xff0c;1代表一台机器&#xff0c;那么 1&#xff1a;1 那就是单播&#xff1b;1&#xff1a;Y 那就是多播&#xff1b;1&#xff1…

mysql数据库如何转移到oracle

mysql数据库转移到oracle 在研发过程中&#xff0c;可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中&#xff0c; 比如说从mysql中迁移到oracle中&#xff0c; 常用的方法有好些&#xff0c;如下 1、使用powerdesigner&#xff0c;先连接mysql然后生成mysql的p…