用于网络攻防教学的AWS+Docker网络实训平台设计
——以安徽公安职业学院为例
2020-06-11杨路
杨 路
(安徽公安职业学院,安徽·合肥 230031)
“没有网络安全就没有国家安全”。随着全球网络安全事件频发,信息安全已经上升到国家战略高度。当前的网络安全形势和保卫工作都迫切需要网络警察掌握网络攻防技术,公安院校都开设了网络安全专业培养从事网络安全保卫和执法的专业人才。网络攻防实训平台能够为网络攻防教学提供实验环境,是公安院校培养学生开展网络攻防技术学习和实践的重要支撑。安徽公安职业学院(以下简称学院)现有实验环境包括红亚信息网络安全平台和易霖博网络攻防平台,上述平台存在如下问题:一是红亚平台提供了CTF,易霖博平台提供了AWD,根据教学实训内容要在两个平台间切换,使用不便。二是网络攻防技术日新月异,现有商用平台性能稳定,但因技术保密等原因,自定义化程度较低。内容相对陈旧,题库更新缓慢,不利于学生学习最新技术。针对上述不足,基于现有实验室硬件环境,采用Docker虚拟化技术,在亚马逊云计算服务(AWS)云端搭建网络攻防训练平台(1)李雪芳,丁志刚,徐翔,等.网络安全攻防技术在运营商中的应用研究[J].电信工程技术与标准化, 2019,(11).宋超,吴明.浅析中职网络攻防平台的设计与实现[J].计算机产品与流通, 2019,(10).崔康.基于云计算技术的网络安全攻防实验平台研究[J].卫星电视与宽带多媒体, 2019,(17).陈永平.现代信息技术在网络攻防对抗中的应用研究[J].山东工业技术, 2015,(04).。该平台同时提供CTF与AWD,自定义的靶场和混战环境可以快速更新内容,较好地弥补现有平台不足,最大程度发挥实训平台的功能,以实战促学习,为公安事业培养具有较高专业素养的人才队伍。
一、网络攻防平台介绍
常见类型有CTF与AWD,CTF称为“夺旗赛”,从比赛环境中得到一串具有一定格式的字符串或其他内容提交并获得分数。AWD也称为多人或多组混战模式,比赛开始前每队会分配低权限非root用户,在比赛过程中通过SSH登陆自己的服务器进行漏洞加固,同时在规定时间内对其他队伍的服务器进行攻击,通过漏洞获取相应的flag得分,flag每隔一个固定时间会刷新一次。常见漏洞有文件上传、SQL注入、渗透攻击等,考查知识点与CTF类似,只是表现形式不同。CTF强调基础知识和脚本的积累,AWD则强调对知识点的应用能力。
二、设计原理
网络攻防实训平台设计有如下几种方式:一是学生在自己的机器上安装Linux并部署训练平台。二是学生在自己的机器上安装虚拟机,在虚拟机上安装Linux并部署训练平台。三是专门购买服务器,在服务器上安装Linux或虚拟机再部署训练平台,学生远程登录访问。四是基于云服务部署训练平台,学生通过远程登录访问。考虑到学生对Linux操作系统普遍不熟悉,且Windows与Linux文件系统不同,不采用在真机上安装Linux的方案。当前学院正处在筹本建设的攻坚阶段,资源有限,专门购买服务器又花费不菲,应用虚拟化技术的虚拟机是一个比较好的选择,可以在一个物理机上部署多种类型的应用。但虚拟机有其局限性,每一个虚拟机都是一个完整的系统,要给其分配资源,当虚拟机数量增多时,对硬件资源的要求也随之提高,部署速度变慢,镜像容量增大,实验室现有机器难以满足需求。轻量级虚拟技术Docker是一种比较好的解决方案,它提供了一种标准,镜像小,易于部署,启动速度快,可快速回滚且不占用太多资源,相比较VMware⑤等虚拟机,启动更快更安全。目前常用的云服务有AWS、阿里云、腾讯云、百度云等,从市场占有率、技术支持、硬件性能、价格和网络延时与丢包率等综合比较,亚马逊的AWS最为全面,所以基于Docker在AWS上搭建网络攻防实训平台。
图1 网络攻防实训平台结构
教学的目的是为了服务未来的实战,当前公安系统、各类省部级乃至国家级网络攻防比赛往往采用线上+线下模式,线上初赛采用浏览器端答题,线下决赛进行攻防混战,所以设计的网络攻防实训平台应包括CTF靶场和AWD,平台与学院的计算机实训中心通过互联网连接,学生可通过学生机采用B/S模式访问CTF靶场,采用C/S模式访问AWD。结构如图1所示,CTF靶场包括已有靶场和自定义靶场,已有靶场应覆盖攻防的基本知识点,性能稳定,适合学生的初期实践和知识积累。自定义靶场则可以部署在GitHub下载的最新漏洞writeup,学生在熟练完成已有靶场的内容后,再通过自定义靶场学习最新的攻防技术,扩展知识层面。自定义靶场还应具备动态独立靶机技术,可有效避免作弊行为,更贴近攻防比赛和实践情况。AWD是网络安全实战的主要表现形式,通过CTF练习积累一定的知识和脚本后,再通过AWD进行模拟训练,对提升学生的实战应用水平是很有必要的。
图2 CTF靶场组成
三、平台组成
(一)CTF靶场
已有靶场用于初期实践和知识积累,因此在难度选择上应当从简单到困难,知识点上应该从单一到丰富,层层递进,避免门槛过高打击学生的积极性。基础知识点包括文件上传、SQL注入/盲注、CSRF、暴力破解、XSS、代码审计等,如图2所示,采用upload-labs、DVWA、mutillidae、 SQLol和Metasploitable3等组成,包括初始靶场、进阶靶场和巩固靶场三部分。初始靶场upload-labs是包含了各类上传漏洞的靶场,共有二十关,涉及各类绕过(图片马、大小写、二次渲染等)、00截断、条件竞争等,很适合入门代码分析和了解burp suite、菜刀、不死马等常用工具的使用。之后开始DVWA+ Mutillidae+SQLol进阶靶场的练习,DVWA是具备暴力破解、命令/SQL注入、XSS、文件上传/包含、CSRF等不同模块的安全性漏洞靶场,每个模块包括low、medium、high和impossible四种级别的代码分析。暴力破解用到burp suite爆破、手工sql注入、函数绕过、python脚本爆破等实现登录。命令注入用到Windows和Linux下的命令参数,绕过黑名单机制输出命令执行结果。SQL注入用到手工注入的知识得到数据表的用户名和密码。XSS用到双写/大小写绕过、恶意js代码等实现弹窗。文件上传用到一句话木马、00截断等获取服务器的webshell。文件包含用到本地和远程URL构建,通过各种替换方式实现读取服务器配置文件的目的。CSRF用到cookie获取token。Mutillidae是一款与DVWA类似的渗透测试靶场,区别在类型题目的设定上,如DVWA上XSS例子较Mutillidae多,两个靶场可以并行使用,互为补充。SQLol 可配置注入靶场提供了一系列挑战任务,可作为SQL注入实训的补充内容。进阶靶场在丰富学生知识的同时进一步训练对nmap、wireshark、putty、sqlmap、nessus、ripper等工具的使用,实现能力的进阶。Metasploitable3是metasploit团队维护的、囊括了SSH、MYSQL、IIS、Apache、SMB、WINRM、JMX等服务和漏洞的综合性靶场,可生成Linux+Windows版本。帮助学生掌握EXP库和漏洞库、收集WAF和部署脚本、批量webshell、权限维持和各种软件包的使用。除此之外,考虑到PWN在网络攻防比赛中的不断普及,选用基于Docker、flask和layui,具备动态flag功能的自研H1VE靶场,Metasploitable3+H1VE组成的巩固靶场用于对前期内容的复习和补充,并为AWD储备工具和脚本。
常用开源可自定义靶场平台有cftd和fbctf,考虑到初次搭建、经费等问题选择占资源相对较小的cftd。ctfd是一个CTF运行框架,可以使用插件和主题轻松进行自定义。动态独立靶机技术在i春秋举办的比赛中开始应用推广,该技术为每一题提供了一个新的虚拟环境,flag也是独一无二的,可有效防止flag分享的作弊行为。CTFd-Whale是一种ctfd插件,允许创建独立靶机、快速部署题目。基于ctfd+CTFd-Whale搭建自定义靶场,可部署南邮CTF、i春秋、安恒杯等最新的writeup,扩展学生的知识层面,进一步丰富在AWD阶段所需的工具和脚本。
(二)AWD
AWD是网络攻防实战的表现形式,可直观反映学生对知识的应用能力。一般具有三个server:web_server是队伍服务器,每个队伍要加固好自己的服务器防止被其他队伍攻击,并尝试攻击其他队伍的服务器。check_server用于检查每个队伍的服务器状态,判断服务器是否可用。每个队伍要确保自己的服务器是可用的,如果不可用则扣除相应队伍的分数,与flag_server配合工作。flag_server是队伍提交flag的服务器,存储每个队伍的分数。GitHub、CSDN上提供了多种厂商和个人设计的平台,综合实验中心的硬件性能和软件功能需求选择开源框架awd-platform。每支队伍分为攻击和防守两部分,负责攻击的学生通过EXP库、漏洞库、扫描工具库和工具审计等发现对方可能存在的漏洞,通过文件上传、SQL注入等渗透测试绕过,利用脚本或不死马、反弹shell等拿到webshell并维权持续获得flag得分。负责防守的学生要熟悉网站和数据库的备份、代码审计、服务器日志记录和安全性检测,提前准备好WAF、文件监控和流量监控脚本并能够迅速部署,降低被其他队伍获得flag而丢分的概率。结构如图3所示,AWD强调快速反应能力,需要进行反复训练。
图3 AWD结构图
四、平台搭建
(一)创建Linux环境
在AWS EC2上创建Linux环境,登录AWS管理控制台选择EC2,进入EC2 Dashboard,选择实例,点击启动实例创建一个Linux环境,步骤如下:一是选择Ubuntu Server 16.04 LTS,64位(x86)的系统映像,选择t2.micro实例类型,点击下一步配置实例详细信息。二是配置实例信息大部分可以选择默认的参数,需要注意的是配置安全组,这是定义防火墙规则控制实例的流量,默认只开启了SSH的22端口,如果要提供web服务,那么要打开HTTP和HTTPS端口。之后核查配置,没有问题就可以启动实例。三是启动实例,选择现有密钥对或创建新密钥对,如果之前已经创建过密钥对,会显示密钥对名称,勾选我确认启动实例即可。也可以创建新的密钥对并保存文件(.pem)到合适位置,完成后启动实例。四是基于putty登录Linux环境。
(二)配置Docker
Linux下采用apt安装Docker CE版本,可添加HTTPS传输的软件包(apt-transport-https)和CA证书(ca-certificates)避免下载过程中内容被篡改,也可采用curl-fsSL get.docker.com-o get-docker.sh、sudo sh get-docker.sh-mirror Aliyun的安装脚本。完成安装后要创建Docker组用户,因为Docker采用了Unix socket引擎,只有root和Docker组用户才能够访问Unix socket。但root用户拥有系统最高权限,从安全角度考虑不建议采用,所以执行sudo groupadd Docker命令建立Docker组,再把用户加入到Docker组中,完成配置。
(三)部署靶场
1.部署已有靶场
upload-labs部署步骤如下:一是下载并创建镜像,解压缩后进入upload-labs/docker文件夹,把docker-php.conf的Directory参数修改成upload-labs源码路径,然后执行docker build -t命令创建镜像。二是运行容器,创建镜像后执行docker run -d -p 80:80 upload-labs:latest运行容器,可通过80端口访问。部署DVWA靶场首先要安装apache、MySQL和php的相关包,重启apache服务。之后采用docker命令创建执行dvwa容器,下载解压DVWA目录复制到html下并赋值777权限后就可通过web访问。上述靶场也可从镜像站pull安装,docker search 镜像名称,再执行docker pull。SQLol、Mutillidae、Metasploitable等其他常用靶场的部署方法类似,本文不再赘述。H1VE靶场提供了single mode和single-nginx mode,首先执行git clone https://github.com/D0g3-Lab/H1ve.git安装,进入H1ve目录,single mode下执行docker-compose -f single.yml up,single-nginx mode执行docker-compose -f single.-nginx.yml up即可。
2.部署自定义靶场
ctfd基于flask框架,所以要先安装git、pip和flask。之后通过sudo git clone下载ctfd源码,解压进入ctfd目录,执行prepare.sh、python serve.py启动ctfd。因为ctfd部署在云端,学生要能通过外网访问,考虑到性能问题,采用gunicorn+nginx方式,前者用于端口映射,执行sudo gunicorn --bind 0.0.0.0:8000 -w 1 "CTFd:create_app()",映射8000端口。后者用于转发提高运行效率,修改nginx.conf和server配置。之后重启nginx,执行gunicorn --bind 0.0.0.0:4000 -w 1 "CTFd:create_app()"启动ctfd平台,之后就可以根据需要部署自定义题目,访问效果如图4所示。
图4 CTFD自定义靶场
应用ctfd+CTFd-Whale部署动态靶场的流程如下:一是安装frps,配置frps.ini并启动服务,执行docker network create/connect,创建ctfd_frp容器(创建好后执行docker run -d启动)和frpcad网络,connect把frpcad和ctfd_frp容器连接。docker network inspect查看frpcad网络连接和ctfd_frp的IP,之后把frpc.ini的admin_addr参数修改成ctfd_frp的IP。二是安装ctfd+CTFd-Whale,把CTFd-Whale放到ctfd的plugins目录下,修改ctfd的docker-compose.yml文件:ports写上服务器的端口号,在volumes下添加- /var/run/docker.sock:/var/run/docker.sock,db参数部分的密码、用户名、数据库名等要和MySQL数据库的配置相同。bulid后启动ctfd,把ctfd连接到frpcad网络。(3)登录ctfd后台设置,选择插件,配置关键参数如下:frp api ip填写ctfd_frp的IP,frp direct ip address填写服务器的公网ip,frp direct minimum/maximum port要填写docker-compose.yml 里开放的端口,docker auto connect containers/network填写之前创建的ctfd_frp和frpcad,frp config template可根据作者提供的模板填写,要修改token。之后设置题目时选择dynamic_docker,docker镜像选用支持动态flag的,如ctftraining,访问效果如图5所示。
图5 动态靶场
(四)部署AWD
awd-platform包含多个环境和对应的writeup,部署流程如下:一是github下载源码,解压缩进入web_XXXX文件夹。二是执行docker tag zhl2008/web_14.04 web_14.04下载镜像。三是根据当前队伍数量copy队伍的比赛文件夹,以web_yunnan_simple环境为例,假设有5支队伍,执行python batch.py web_yunnan_simple 5。四是启动比赛环境:python start.py ./5,启动时可能会有权限和IP问题,前者需要root权限,后者要修改/etc/hosts,强制docker.io相关域名解析到可用IP,之后就可以通过浏览器访问靶机了。五是启动检查脚本:docker attach check_server、python check.py,一般通过检查某个文件是否存在判定服务器的状态,比如admin.php等,检测时间与time_span变量相关,在check_server目录下的gen_flag.py脚本中,同理还有flag的刷新时间,修改flag_server目录下的config.php中的min_time_span变量即可。六是比赛结束,关闭环境:python stop_clean.py。
源码中的check.py脚本要做修改:一是状态检测是根据网页的关键词判定的,提供了index、admin、login等页面的检测,要把源代码中路径和关键词等信息根据应用略做修改。二是源代码检测正常加1分,宕机减1分,这里也要根据规则做修改。源代码存在在flag有效时间内不停提交无限加分的问题,原因在于flag_file.php参数now_time是当前的时间戳,min_time_span是flag更新时间间隔,time_file是上传flag的时间戳。从time_file中读取当前队伍提交flag的时间戳赋值给old_times,now_time-old_times是flag上传时间间隔,如果该数值小于min_time_span,则认为提交过于频繁,不能再次提交。但time_file文件中的内容全部是0,min_time_span默认是120,now_time-old_times的数值不小于120,所以可以在flag有效时间内不停提交加分。采用增加一个更新脚本,将flag刷新时间的时间戳更新到time.txt中解决。
(五)测试
以awd-platform混战平台为例进行测试,设置了5只队伍,每个队伍通过SSH登录,密码在pass.txt文件中可以找到,SSH连接端口规则默认从2201开始,第一队SSH连接端口就是2201,第二队就是2202,以此类推。每个队伍通过分析漏洞,找到并提交flag获取分数。同时check_server会定时检查各个服务器的状态,避免有的队伍采取作弊的方式避免失分,测试效果如图6-7所示,平台运行稳定,可满足网络混战的训练要求。
图6 服务器状态检查
图7 AWD计分板
五、结语
针对网络攻防实验环境的不足,基于AWS+Docker设计了可自定义的网络攻防实训平台,同时提供CTF+AWD内容。轻量级虚拟化的Docker技术简化了平台搭建的复杂度,降低了平台的硬件需求和后期管理维护的难度。可自定义的设计能够根据需要部署最新的writeup。该平台已应用到网络攻防教学实践中并取得了较好的效果,学生在2019年全国大学生信息安全竞赛安徽省赛网络攻防赛高职组获得一等奖,第三届“蓝帽杯”全国大学生网络安全技能大赛总决赛获得二等奖。AWS+Docker的网络攻防实训平台能够满足公安院校网络攻防实战教学训练需求,具备一定应用和推广意义。