54

使用Linux容器迅速搭建渗透测试环境(上篇)

 5 years ago
source link: https://www.linuxprobe.com/linux-penetration-environment.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作为一名渗透测试人员,我经常需要搭建一些小型实验环境(有时候不是那么小),当然,这样做的原因是多方面的,例如在对客户的生产系统进行测试之前先做一下试验,或为了避免被检测到,或者只是为了练手。为此,我们可以用物理设备搭建一个测试环境。但是,如果公司员工很多是远程工作的话,那么,用起来也很不方便。当然,我们也可以通过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。

上面命令的输出结果,应该与上面的内容相似。如果缺少任何功能,请启用指定的内核选项并重新编译内核!这不是必须的,因为这些功能已经在大多数常见配置中启用了很长一段时间。

配置网络

接下来,我们开始配置网络。在折腾多种路由方法后,我发现最好的方法是使用虚拟以太网接口或“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”中为其提供接口。这将是我们的第一个容器。

结束语

在本文中,我们为读者介绍了如何配制宿主机和网络,在本文的下篇中,我们将为读者介绍更多的精彩内容,敬请期待。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK