Kali中AWD靶机环境搭建

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 base64sleep_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 = 80def 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')passif res.getheader('Location'):print "Your 302 direct is: "+res.getheader('Location')a = res.read()con.close()return adef https(method,host,port,url,data,headers):url = 'https://' + host + ":" + str(port) + urlreq = 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 resuser_scores = res.split('|')print "******************************************************************"res = ''print resprint "******************************************************************" return user_scoresdef 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 Trueelse:   print resraise ValueErrorclass check():def index_check(self):res = http('get',host,port,'/index.php?file=%s'%str(my_time),'',headers)if 'perspi' in res:return Trueif debug:print "[fail!] index_fail"return Falsedef server_check():try:a = check()if not a.index_check():return Falsereturn Trueexcept Exception,e:print ereturn Falsegame_round = 0
while True:scores = get_score()scores = []print "--------------------------- round %d -------------------------------"%game_roundfor 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 += 1write_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代码如下:

<?phprequire '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.rhkb.cn/news/78527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig与zag/左右双旋/3+4重构)

本文目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 06.代码注意插入算法删除算法完整代码&#xff1a…

spring security + oauth2 使用RedisTokenStore 以json格式存储

1.项目架构 2.自己对 TokenStore 的 redis实现 package com.enterprise.auth.config;import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis…

基于SpringBoot+Vue的漫画网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

41.利用matlab 平衡方程用于图像(matlab程序)

1.简述 白平衡 白平衡的英文为White Balance&#xff0c;其基本概念是“不管在任何光源下&#xff0c;都能将白色物体还原为白色”&#xff0c;对在特定光源下拍摄时出现的偏色现象&#xff0c;通过加强对应的补色来进行补偿。 所谓的白平衡是通过对白色被摄物的颜色还原&…

opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

双边滤波&#xff08;BilateralFiltering&#xff09;是一种图像处理滤波技术&#xff0c;用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同&#xff0c;双边滤波在考虑像素之间的空间距离之外&#xff0c;还考虑了像素之间的灰度值相似性。这使得双边滤波能够有…

【C语言进阶】指针的高级应用(下)

文章目录 一、指针数组与数组指针1.1 指针数组与数组指针的表达式 二、函数指针2.1 函数指针的书写方式 三、二重指针与一重指针3.1 二重指针的本质3.2 二重指针的用法3.3 二重指针与数组指针 总结 一、指针数组与数组指针 (1)指针数组的实质是一个数组&#xff0c;这个数组中存…

【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…

IntelliJ IDEA 2023.2 最新变化

IntelliJ IDEA 2023.2 引入 AI Assistant&#xff0c;通过一组由 AI 提供支持的功能助力开发。 升级的 IntelliJ 分析器现在提供编辑器内提示&#xff0c;使分析进程更加直观详尽。 此版本还包括有助于简化开发工作流的 GitLab 集成&#xff0c;以及其他多项值得关注的更新和改…

在政策+市场双轮驱动下,深眸科技助力机器视觉行业走向成熟

近年来&#xff0c;随着人工智能发展的不断提速&#xff0c;机器视觉作为其重要的前沿分支&#xff0c;凭借着机器代替人眼来做测量和判断的能力&#xff0c;广泛应用于工业领域的制造生产环节&#xff0c;用来保证产品质量、控制生产流程、感知环境等&#xff0c;并迸发出强劲…

基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数

基于新浪微博海量用户行为数据、博文数据数据分析&#xff1a;包括综合指数、移动指数、PC指数三个指数 项目介绍 微指数是基于海量用户行为数据、博文数据&#xff0c;采用科学计算方法统计得出的反映不同事件领域发展状况的指数产品。微指数对于收录的关键词&#xff0c;在指…

用Log4j 2记录日志

说明 maven工程中增加对Log4j 2的依赖 下面代码示例的maven工程中的pom.xml文件中需要增加对Log4j 2的依赖&#xff1a; <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0&…

【C语言学习】整数的输入输出、八进制和十六进制

一、整数的输入输出 只有两种形式&#xff1a;int或long long %d:int %u:unsigned %ld:long long %lu:unsigned long long 二、八进制和十六进制 以0开头就是八进制&#xff0c;以0x开头就是十六进制。 无论是八进制还是十六进制只是如何将数字表达为字符串&#xff0c;但计…

UML-构件图

目录 1.概述 2.构件的类型 3.构件和类 4.构件图 1.概述 构件图主要用于描述各种软件之间的依赖关系&#xff0c;例如&#xff0c;可执行文件和源文件之间的依赖关系&#xff0c;所设计的系统中的构件的表示法及这些构件之间的关系构成了构件图 构件图从软件架构的角度来描述…

Vue2 第二十节 vue-router (四)

1.全局前置路由和后置路由 2.独享路由守卫 3.组件内路由守卫 4.路由器的两种工作模式 路由 作用&#xff1a;对路由进行权限控制 分类&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫 一.全局前置路由和后置路由 ① 前置路由守卫&#xff1a;每次路由…

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的&#xff0c;但应用是健壮的。 kubelet运行在Cluster所有节点上&#xff0c;负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用&#xff0c;查看各种资源&#xff0c;创建、删除和更新各种组件。 …

python使用虚拟环境安装第三方模块和运行python脚本

1、在用户家目录下创建一个名为env38的虚拟环境 python3 -m venv env38 创建虚拟环境env38后的目录 2、 激活虚拟环境 source ~/env38/bin/activate 3、安装pyqt5 pip install pyqt5 4、写一个简单的python脚本 import sys print(sys.path)# 如果执行成功&#xff0c;没有…

Unity Shader编辑器工具类ShaderUtil 常用函数和用法

Unity Shader编辑器工具类ShaderUtil 常用函数和用法 Unity的Shader编辑器工具类ShaderUtil提供了一系列函数&#xff0c;用于编译、导入和管理着色器。本文将介绍ShaderUtil类中的常用函数和用法。 编译和导入函数 CompileShader 函数签名&#xff1a;public static bool C…

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件&#xff0c;适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高&#xff1b;球…

如何将 dubbo filter 拦截器原理运用到日志拦截器中?

业务背景 我们希望可以在使用日志拦截器时&#xff0c;定义属于自己的拦截器方法。 实现的方式有很多种&#xff0c;我们分别来看一下。 拓展阅读 java 注解结合 spring aop 实现自动输出日志 java 注解结合 spring aop 实现日志traceId唯一标识 java 注解结合 spring ao…

概念解析 | PointNet概述

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次解析的概念是:点云深度学习及PointNet论文概述 参考论文:Qi C R, Su H, Mo K, et al. Pointnet: Deep learning on point sets for 3d classification and segmentation[C]//Proceedings of …