导语:在这篇文章中,我们将为读者详细介绍如何使用Linux容器迅速搭建渗透测试环境。
作为一名渗透测试人员,我经常需要搭建一些小型实验环境(有时候不是那么小),当然,这样做的原因是多方面的,例如在对客户的生产系统进行测试之前先做一下试验,或为了避免被检测到,或者只是为了练手。为此,我们可以用物理设备搭建一个测试环境。但是,如果公司员工很多是远程工作的话,那么,用起来也很不方便。当然,我们也可以通过VMware在自己的笔记本电脑上轻松安装一个完整的虚拟机(VM),但是这样还是可能遇到许多问题,例如耗尽系统的磁盘或内存空间,或者因为存储空间不足,无法保留将来需要再次使用的东西。当然,我们可以连接一些容量较大的外接驱动器,但它们又很难随身携带。
随着技术的飞速发展,进入轻量级容器和高效的写入时拷贝文件系统(如Btrfs )的时代!有了这些,我们就可以用最低的磁盘成本搭建任意数量的虚拟Linux机器,并且不必担心运行完整虚拟机所带来的内存开销。现在,我们有了更加大的选择余地,下面,我们将为读者介绍一些基础技术。像Docker这样的工具非常适合需要重复或可分发的东西,但是,我更喜欢直接使用Linux Containers(LXC)和kvm(qemu-kvm)进行日常测试。如今,我们可以在可引导当代Linux内核的硬件(几乎所有硬件都能满足这一要求)上搭建一个简单的环境。您甚至可以从运行在VMware中的虚拟机开始这些工作!
在构建特定渗透测试环境方面,本文介绍的方法还不够完善,但是,我可以为读者指出一些正确的方向——这些都是通过我自己的实践验证过的,因此,剩下的事情,就靠读者根据自身的情况填补空白或做出相应的修改了。希望本文可以帮助各位节约一些宝贵的时间。此外,我将专注于LXC,但本文的目标是创建一个可以集成其他的环境容器类型,如Docker或在同一宿主机上以kvm运行的完整VM。
配置宿主机
首先,我们需要一个宿主机平台。就个人而言,我会选择Slackware!与许多其他平台不同,它没有很多制造麻烦的东西,例如对新发现的网络接口进行处理的systemd/udev规则等。也就是说,为了减少麻烦,最好使用自己最熟悉的Linux平台。请记住,这只是宿主机平台——我们仍然可以运行CentOS或任何其他客户机Linux操作系统。
这里不会对宿主机平台的设置进行详细介绍,相反,我们只是给出几个主要要点:
(1)如果使用虚拟机作为“宿主机”平台,并计划支持所有非Linux系统客户机的话,请启用嵌套虚拟化。
· 对于kvm,可以通过向/etc/modprobe.d/添加conf文件来完成此操作。
它应该包含选项kvm_amd nested = 1或options kvm_intel nested = 1
· 对于VMware,vmx文件应该含有enable =“TRUE”
(2)如果您希望VM与外界通信,请考虑使用第二个物理网络接口控制器(NIC)。这样,即使进行网络更改,也不会中断与宿主机的SSH连接。还有很多其他选项,例如在宿主机上使用iptables进行网络地址转换(NAT),或者将物理主适配器放置在充当虚拟LAN网段的网桥中,然后将IP分配给该网桥,但这些选项可能会让你的生活变得复杂
· 设置宿主机系统,令该接口处于未配置状态。它应该是“UP”,但不要启用DHCP或设置网络地址。
(3)在主文件系统方面,您可以根据自己的喜好进行选择。您可以使用一个大型卷,并把Btrfs文件系统挂载到/var/lib/lxc,或者,如果将Btrfs作为主文件系统,则容器可以共享相同的卷。
请确保宿主机内核支持Linux容器!为此,可以运行命令lxc-checkconfig。
图1 经过正确配置的系统上的lxc-checkconfig
上面命令的输出结果,应该与上面的内容相似。如果缺少任何功能,请启用指定的内核选项并重新编译内核!这不是必须的,因为这些功能已经在大多数常见配置中启用了很长一段时间。
配置网络
接下来,我们开始配置网络。在折腾多种路由方法后,我发现最好的方法是使用虚拟以太网接口或“veth”。之所以这么说,肯定是有原因的。首先,使用它时,对于更高层的协议没有特殊要求,因此,即使不是IP,也照样能玩。第二个原因是,可以将其他以太网设备无缝地添加到桥接器中;这些以太网设备可以包括物理适配器和kvm虚拟接口,甚至包括使用tun/tap接口的OpenVPN。最后,因为它在容器内部显示为普通的以太网接口,所以,客户无需更改即可正常工作。
在宿主机上,需要创建Linux网桥。如果您不熟悉桥接的概念,可以将其视为虚拟网络二层交换机。有的平台会提供rc脚本,我们可以在此定义和配置桥接接口。我将在设置拓扑时给出相关的基本命令。您可以将相关的设置迁移到平台的引导脚本中,也可以使用这些命令自行编写一些shell脚本来创建配置接口。
对于需要的每个LAN网段,我们都会在宿主机上创建一个对应的网桥接口。
brctl addbr lab
该命令将创建一个名为“lab”的网桥接口。我建议使用像“lab”这样的名称,而不是“br0”之类的名称,因为当您运行诸如ifconfig -a之类的命令时,能够一眼看出将来会发生什么。否则,随着实验室中虚拟网络和接口的数量变得越来越多,您的噩梦般的生活就要开始了。
如果您只有一个接口(假设为eth0),则可以创建第二个网桥作为外部世界的上行链路,然后将物理适配器添加到该接口即可。您需要将适配器配置为“UP”,同时不要为其分配地址。如果您有像Networkmanager这样的守护进程,则需要确保这些守护程序不会修改该接口的属性。
brctl addbr uplnk brctl addif uplnk eth0 dhclient uplnk
在宿主机上,该网桥将显示为网络适配器,您可以把它看作是一个已经插入虚拟交换机端口的网络适配器。在这里,dhclient uplnk将从物理LAN上的DHCP服务器获取IP地址。这里获得的IP地址可能会与以前不同的,因为该网桥的虚拟MAC地址与以太网适配器不同。
从设计的角度来看,我喜欢将测试环境与网络的其他部分隔离开来。为此,我选用了容器,并将其设置为Linux路由器/网关。然后,我在实验室网段和其他测试网段上为其提供了相应的接口,并将物理网卡传入其中以访问外部世界或者在“uplnk”中为其提供接口。这将是我们的第一个容器。
结束语
在本文中,我们为读者介绍了如何配制宿主机和网络,在本文的下篇中,我们将为读者介绍更多的精彩内容,敬请期待。