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