2024年5月30日发(作者:)
信息技术
与
信息化
网络与信息安全
利用“Kali Linux”与“Docker”技术
进行渗透测试实验
滕忠钢
*
TENG Zhong-gang
摘 要
当前,网络空间安全斗争变得越来越尖锐和复杂,渗透测试已经成为保障网络安全的重要手段。但是,
传统的搭建测试环境的方法既繁琐又费时,并且已无法跟上信息安全的发展脚步。当前安全业界流行
的是利用虚拟技术构建测试环境,以便安全工作者可以快速进行实验。本文主要介绍利用“Vmware
Workstation”软件运行“Kali Linux”作为实验平台,以及如何使用“Docker”技术搭建一个靶机,让
安全工作者或学习者能够快速地进行渗透测试实验。从而使人们将有限精力放在渗透测试流程,熟悉漏
洞,利用方法,修复漏洞上。同时也为加快网络安全人才培养提供点思路。
关键词
网络安全;渗透测试;虚拟技术;Kali Linux;Docker
doi:10.3969/.1672-9528.2020.02.063
0 引言
早在2016年,习近平总书记就提出“网络空间的竞争,
归根结底是人才的竞争”。网络安全的实质是人与人之间的
对抗。对抗的本质在于攻防两端能力的较量。想要打赢网络
安全这场战争,需要培养众多专业的安全人才。传统的防御
方法难以应对当前日益多样化的攻击形式。所以从攻击的角
度,我们可以分析和评估现有系统的安全风险,并进一步研
究系统可能的安全漏洞,以及针对这些漏洞的新型攻击方法。
1 渗透测试介绍
《中华人民共和国网络安全法》
[1]
明确提出“开展网络
安全认证、检测、风险评估等活动,向社会发布系统漏洞、
计算机病毒、网络攻击、网络侵入等网络安全信息,应当遵
守国家有关规定”。渗透测试除非经过目标业主方的授权,
否则是非法的。因此,我们每个安全工作者都应遵守法律,
并应在实施前得到被测目标的业主的授权,并与其进行充分
沟通。在测试过程中,你还应注意不要执行危险行为,例如
DDOS攻击、破坏数据、超范围的测试等。
1.1 渗透测试定义
渗透测试
[2]
(Penetration Test)是通过模拟黑客的攻
击方法、技术,来评估目标的安全性。渗透测试过程的分析
是基于一个攻击者主动地从某个可能的位置有条件地利用安
全漏洞。渗透测试与入侵行为有本质的区别,是风险评估的
一部分。渗透测试分为三种:白盒测试,黑盒测试和灰盒测试。
* 泉州市公安局 福建泉州 362000
不同的测试方案有其应用场景,安全工作者应根据实际情况
制定合理方案,进行深入、全面的测试并报告结果。
1.2 渗透测试对象
网络设备(如常见的防火墙、入侵检测系统)、操作系统、
中间件、应用程序、数据库、包括系统管理员等都可以是渗
透测试对象。
1.3 渗透测试流程
渗透测试是一个逐步深入的过程。安全工作者想要入门
渗透测试,首先需要了解渗透测试的流程、方法。“PTES”
标准中定义的渗透测试过程得到了安全业界的普遍认同,具
体包括7个阶段:前期交互阶段、情报搜集阶段、威胁建模
阶段、漏洞分析阶段、渗透攻击阶段、后渗透攻击阶段、报
告阶段。
2 认识Kali与Docker技术
2.1 “Kali Linux”简介
“Kali Linux”是基于“Debian”的Linux发行版
[3]
。
它面向专业的渗透测试和安全审计,由国外的“Offensive
Security”公司维护和资助。“Kali Linux”预装包括业界
闻名的Nmap 、Sqlmap、Metasploit、Aircrack-ng等许多渗
透测试软件。“Kali Linux”被设计成使用“单用户,root
权限”方案,其内核已注入无线补丁,以便进行无线安全测
试。截至成文日,“Kali Linux”的最新版本是2019年11
月26日发布的“Kali Linux 2019.4”。该版本系2019年的
第四个也是最后一个版本,可以从官方网站(www.
2020年第2期
195
网络与信息安全
信息技术
与
信息化
/downloads/)下载。用户可以通过硬盘、live CD
或live USB运行“Kali Linux”。“Kali Linux”由于集成
了许多渗透测试的软件和工具,已成为网络安全工作者手中
的一把利剑。
2.2 “Docker”技术简介
Docker是一个开源的应用容器引擎,基于Go语言开发,
源代码托管在Github上,遵从Apache2.0协议开源
[4]
。在
Docker Engine上运行的Docker容器,有标准、轻巧、安全
的特点。目前Docker官方维护了一个公共仓库——Docker
Hub(用户可以在上免费注册账号)。
它是世界上最大的容器映像存储库,截至2019年11月29日,
已有287多万个镜像可供用户下载。
3 渗透测试实验环境搭建
为了快速构建实验环境,本文省略了真实攻击场景中常
见的跳板机、防火墙、内网等。本测试环境使用运行“Windows
7”笔记本电脑作为演示平台。首先在“目标服务器”上配置
“Docker”环境,然后安装“Vulhub”漏洞靶场。
3.1 安装Kali Linux虚拟机
主机系统中安装“Vmware Workstation15.5”软件,并
从“Kali Linux”官网下载“Kali Linux 64-bit Vmware”
最新虚拟机安装包。然后新建两个Kali虚拟机,一台作为攻
击机,另一台作为测试目标服务器。
3.2 安装docker环境
启动目标服务器后,在命令行中敲入“apt-get install
”,等待安装完毕。此时运行命令“docker
version”,可显示安装后的版本号、API版本等信息。我
们还须安装“docker-compose”,命令为“pip install
docker-compose”。若提示没有安装“pip”的话,需要先安
装“pip”。最后注意在实验前启动docker服务,启动命令
为“service docker start”。
3.3 安装“Vulhub”漏洞测试靶场
“Vulhub”是一个依赖“Docker”的比较全面的漏洞环
境集合,以开源的形式共享,可以复现一些比较经典的漏洞。
用户只要进入相应目录并执行一条语句即可启动一个全新的
漏洞环境,让漏洞复现变得更加简单,使安全研究者更加专
注于漏洞原理本身。用户可以从网址“.
com/u/vulhub”按需拉取某个容器。例如用户想进行“Apache
Struts2”相关漏洞实验,则只需执行命令“docker pull
vulhub/struts2”即可拉取相应容器。用户也可以将“Vulhub”
整个包下载。Linux中下载最新版本的“Vulhub”命令为“git
clone /vulhub/”。下载完
后查看保存的目录下会出现“vulhub”文件夹。漏洞靶站集
合如图1所示。
196
2020年第2期
图1 “Vulhub”漏洞靶站集合
4 漏洞复现实验
4.1 “
Struts2-057
”漏洞介绍
“Struts2”是第二代基于Model-View-Controller(M-
VC)模型的java企业级web应用框架
[5]
。“Struts2-057”
漏洞由“Semmle Security Research Team”的安全研究员汇
报,于2018年8月22日被曝出,编号为“CVE-2018-11776”。
该漏洞能够让攻击者在未授权的情况下远程执行系统命令。
受影响的版本为Apache Struts 2.3--2.3.34及Struts
2.5.0--2.5.16。尤其是使用“Linux+Apache”环境的服务器,
如果被攻击者利用获取到服务器管理员权限,就会造成网站
数据库被盗取、篡改等事件。该漏洞是由于在“Struts2”开
发框架中使用“namespace”功能定义XML配置时,“namespace”
值未被设置且在上层动作配置(Action Configuration)中未
设置或用通配符“namespace”,可能导致远程代码执行。同
理,URL标签若未设置value和action值且上层动作未设置
或用通配符“namespace”时也可能导致远程代码执行。
4.2 “Struts2-057”漏洞复现实验
本文以“S2-057”漏洞为例,主要有以下几个步骤:
(1)切换到漏洞复现所在目录:在命令行执行“cd /
vulhub/Struts2/CVE-2018-11776”。
(2)启动漏洞环境:docker-compose up -d(这个命令
已包括“docker-compose build”)。
(3)确认漏洞是否存在:访问网站your-
ip:8080/showcase/(your-ip是目标服务器的实际IP,笔者
的目标虚拟机IP是192.168.10.147),若运行正常则会显示
靶机WEB首页,如图2所示。
确认靶机运行正常后我们访问网址your-
ip:8080/struts2-showcase/$%7B(x*y)%7D/actionChain1.
action,在此处,笔者将EXP即(x*y)设为(10*23)。访问
触发OGNL表达式
[6]
,发现服务器会直接运行算式得到结果
230,如图3所示。URI变为/230/,说明
该服务器存在“S2-057”漏洞。
图2 “S2-057”漏洞靶机页面
图3 算式EXP执行结果
(4)漏洞利用:笔者在此继续演示命令回显的攻击方式。
访问网站首页并用BurpSuite抓包,将执行id命令的EXP即
(#dm=@ntext@DEFAULT_MEMBER_ACCESS).
(#ct=#request[‘tack’].context).
(#cr=#ct[‘Context.
container’]).(#ou=#tance(@mpho-
il@class)).(#luded-
PackageNames().clear()).(#ludedClasses().
clear()).(#berAccess(#dm)).(#a=@.
Runtime@getRuntime().exec(‘id’)).(@-
s@toString(#utStream()))用URL
编码后替换算式EXP重放
[7]
。如图4所示,服务器解析OGNL
语句响应并回显结果。进一步渗透,我们可以用Metasploit
中“Namespace Redirect OGNL Injection”的exploit进行,
在此不再详细叙述。
图4 系统命令“id”EXP执行结果
(5)漏洞分析:上述漏洞存在的代码问题位于De-
faultActionMapper这个类的parseNameAndNamespace方
法里。当alwaysSelectFullNamespace被设置为true时,
namespace的值从URI中获取。因为URI是可控的,所以这
就直接导致了namespace可控。最终会调用TextParseUtil.
信息技术
与
信息化
网络与信息安全
translateVariables方法解析OGNL语句。
(6)漏洞修复:首选方案是升级到Apache Struts最新
版本。官方(/)已经做好漏洞
补丁提供下载,完全兼容旧版本。其次,暂时无法更新的用户,
也可以选择手工修复,修改配置文件struts-actionchain-
。固定“package”标签页与“result”的“param”
标签页的“namespace”值,以及禁止使用通配符。
(7)关闭环境:结束实验后,执行“docker-compose
down”关闭靶机,使环境变为初始状态。该命令会执行几个
动作:关闭正在运行的容器,删除所有相关容器,移除NAT
(docker-compose在运行的时候会创建一个NAT网段)。
Docker默认支持30个不同的自定义bridge网络,如果超过
这个限制,就会提示IPv4地址分配错误。
5 结束语
渗透测试可以帮助目标系统管理员了解系统所面临的
问题,并为他们提供整改建议,这对于提高系统安全性具有
重要意义。想要成为一位出色的渗透测试工程师,任重而道
远。我们必须密切关注网络攻防技术的发展趋势,以攻促防,
建立新的安全防护机制。因此,除了具备传统的基本技能如
脚本编程、精通某一类开发语言与熟悉Windows、Linux、
Android等系统平台,还要熟悉云环境下容器、虚拟化相关
安全技术。并且随着网络安全等级保护制度2.0标准正式实
施,渗透测试必将引起更广泛的关注。
参考文献
[1] 全国人民代表大会常务委员会.中华人民共和国网络安全
法[EB/OL]./public/11/, 2016-
11-7.
[2] 唐秀存, 杜德慧. 渗透测试技术与模型研究[J]. 计算机与
信息技术, 2007 (5): 33-35.
[3] Offensive Kali Linux[EB/OL].www.
/about-us/.
[4] 百度百科.Docker[EB/OL]./item/
Docker/13344470?fr=aladdin.
[5] 百度百科.Struts 2[EB/OL]./item/
Struts%202?fromtitle=Struts2&fromid=10711345.
[6] 聂常红,唐远强,冯相忠.Struts2 OGNL表达式语言的研
究与应用[J].计算机技术与发展,2013,23(3):183-186.
[7] vulhub.S2-057远程代码执行漏洞[EB/OL].vulhub.
org/#/environments/struts2/s2-057/.
【作者简介】
滕忠钢(1984-),男,研究生,公共管理硕士,泉州市
公安局民警,主要研究领域:信息化建设、网络安全。
(收稿日期:2019-12-26)
2020年第2期
197


发布评论