SecGen 创建易受攻击的虚拟机、实验环境和黑客挑战,以便学生能够学习安全渗透测试技术。
像 Metasploitable2 这样的靶机总是相同的,而本项目使用 Vagrant、Puppet 和 Ruby 来创建随机易受攻击的虚拟机,可用于学习或举办 CTF 赛事。
最新版本可在以下地址获取:http://github.com/cliffe/SecGen/
如需托管解决方案,请访问:https://hacktivity.co.uk/
计算机安全专业的学生能从参与黑客挑战中获益。实践性实验工作和预先配置好的黑客挑战,在安全教育以及安全爱好者的日常消遣中都是常见做法。竞技性黑客挑战,例如夺旗(CTF)竞赛,已成为行业会议上的常设项目,也是大型在线社区关注的焦点。虚拟机(VM)提供了一种共享黑客攻击目标的有效方式,并且可以专门设计用来测试攻击者的技能。像 Vulnhub 这样的网站托管着预先配置好的黑客挑战虚拟机,对于学习和提升计算机安全技能的人来说是宝贵的资源。然而,开发这些黑客挑战非常耗时,而且一旦创建,基本上就是静态的。也就是说,一旦挑战被“解决”,学生就没有剩余的挑战可做了;而如果挑战是为竞赛或评估而创建的,则无法在不冒抄袭和串通风险的情况下重复使用。
安全场景生成器(SecGen)生成随机化的易受攻击系统。虚拟机是基于场景规范创建的,该规范描述了要创建的虚拟机的约束条件和属性。例如,一个场景可以指定创建一个具有可远程利用漏洞的系统,该漏洞会导致用户级权限被攻陷,同时还有一个可本地利用的缺陷,会导致 root 级权限被攻陷。这将要求攻击者发现并利用两个随机选择的漏洞,才能获得对系统的 root 访问权限。或者,所定义的场景可以更具体,指定某些类型的服务(例如 FTP 或 SMB),甚至指定确切的漏洞(通过 CVE)。
SecGen 是一个 Ruby 应用程序,带有 XML 配置语言。SecGen 读取其配置,包括可用的漏洞、服务、网络、用户和内容,读取所请求场景的定义,应用随机化场景的逻辑,并利用 Puppet 和 Vagrant 来配置所需的虚拟机。
SecGen 是自由软件:您可以根据自由软件基金会发布的 GNU 通用公共许可证条款重新分发和/或修改它,无论是许可证的第 3 版,还是(由您选择)任何更高版本。
SecGen 包含安装各种软件包的模块。每个 SecGen 模块可能包含或远程获取软件,并且每个模块都在随附的 secgen_metadata.xml 文件中定义了自己的许可证。
SecGen 在 Ubuntu Linux 上开发和测试。理论上,如果您安装了所有必需的软件,SecGen 应该可以在 Mac 或 Windows 上运行。
SecGen 需要:
有两种安装方式。两者都已在全新的 Ubuntu 安装上测试过。
在主机上安装 Docker 和 VirtualBox,然后让 docker/secgen-docker.sh 构建一个包含其他所有内容的容器。主机上仍然需要 VirtualBox 来提供其内核驱动。参见 docker/README.md。
git clone https://github.com/cliffe/SecGen.git
cd SecGen
docker/secgen-docker.sh run -s scenarios/default_scenario.xml
从 Oracle 的仓库安装 VirtualBox。Ubuntu 24.04 中的 virtualbox 软件包(7.0.16)无法为当前的 HWE 内核构建其内核驱动,而 Linux 7.0 需要 VirtualBox 7.2.8 或更高版本:
sudo apt-get update
sudo apt-get install -y wget gpg lsb-release
wget -qO- https://www.virtualbox.org/download/oracle_vbox_2016.asc \
| sudo gpg --yes --dearmor -o /usr/share/keyrings/oracle-virtualbox-2016.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] https://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib" \
| sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt-get update
sudo apt-get install -y virtualbox-7.2
如果 KVM 已加载,VirtualBox 无法在 KVM 占用 VT-x 时启动虚拟机(VERR_VMX_IN_VMX_ROOT_MODE)。在 6.12 及更高版本的内核上,你可以让它们共存:
echo "options kvm enable_virt_at_load=0" | sudo tee /etc/modprobe.d/kvm-virtualbox.conf
sudo modprobe -r kvm_intel kvm_amd kvm; sudo modprobe kvm_intel || sudo modprobe kvm_amd
SecGen 场景使用 VirtualBox 默认 192.168.56.0/21 之外的仅主机网络范围,因此允许任意范围:
sudo mkdir -p /etc/vbox
echo '* 0.0.0.0/0 ::/0' | sudo tee /etc/vbox/networks.conf
从 HashiCorp 的仓库安装 Vagrant(Ubuntu 26.04 不再打包它,而且较旧的 Vagrant 版本已无法再从 Vagrant Cloud 下载 box):
wget -qO- https://apt.releases.hashicorp.com/gpg | sudo gpg --yes --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update
sudo apt-get install -y vagrant
安装 Ruby 和其他所需软件包:
sudo apt-get install -y git ruby-full ruby-dev build-essential patch pkg-config zlib1g-dev liblzma-dev \
imagemagick exiftool libpq-dev libcurl4-openssl-dev libxml2-dev libxslt1-dev graphviz libgraphviz-dev \
libpcap-dev libsqlite3-dev libgpgme-dev libyaml-dev libffi-dev libssl-dev
克隆 SecGen 并安装 gems。使用 bundle install,而不是 bundle update:Gemfile.lock 固定了在所有受支持的 Ruby 上都能正常工作的版本,而 bundle update 会将其替换为最新版本,这些版本可能无法正常工作。
git clone https://github.com/cliffe/SecGen.git
cd SecGen
sudo gem install bundler -v '~> 2.4'
sudo bundle install
然后尝试默认场景(首次运行时会从 hacktivity.co.uk 下载基础 box):
ruby secgen.rb run
注意:
.deb 安装 Vagrant。不要安装 ruby-bundler 包。它会带来一个 Debian 打包的 thor gem,随后 bundle install 会失败并报错 "Could not find thor-0.19.4.gem"。请按上文使用 sudo gem install bundler -v 2.4.22(2.4 是最后一个支持 Ruby 2.7 的 Bundler 版本)。bundle install 会重新解析几个 gem(librarian-puppet 及其依赖项)并在本地重写 Gemfile.lock,因为为 Ruby 2.7 固定的版本不允许 Ruby 4。sudo bundle install。scenarios/ctf/nosferatu.xml)的 CTF 需要大约 6 GB 的可用 RAM。可使用 --memory-per-vm 或 --total-memory 覆盖。要使用 Windows 基础盒子,你需要安装 Packer。使用以下命令:
curl -SL https://releases.hashicorp.com/packer/1.3.2/packer_1.3.2_linux_amd64.zip -o packer_1.3.2_linux_amd64.zip
unzip packer_1.3.2_linux_amd64.zip
sudo mv packer /usr/local/
sudo bash -c 'echo "export PATH=\"\$PATH:/usr/local/\"" >> /etc/environment'
sudo vagrant plugin install winrm
sudo vagrant plugin install winrm-fs
基本用法:
ruby secgen.rb run


SecGen 接受参数以改变其行为方式,当前已实现的参数有:
ruby secgen.rb [--options] <command>
OPTIONS:
--scenario [xml file], -s [xml file]: Set the scenario to use
(defaults to /home/secgen/SecGen/scenarios/default_scenario.xml)
--project [output dir], -p [output dir]: Directory for the generated project
(output will default to /home/secgen/SecGen/projects/SecGen20200313_094915)
--shutdown: Shutdown VMs after provisioning (vagrant halt)
--network-ranges: Override network ranges within the scenario, use a comma-separated list
--forensic-image-type [image type]: Forensic image format of generated image (raw, ewf)
--read-options [conf path]: Reads options stored in file as arguments (see example.conf)
--memory-per-vm: Allocate generated VMs memory in MB (e.g. --memory-per-vm 1024)
--total-memory: Allocate total VM memory for the scenario, split evenly across all VMs.
--cpu-cores: Number of virtual CPUs for generated VMs
--help, -h: Shows this usage information
--system, -y [system_name]: Only build this system_name from the scenario
--snapshot: Creates a snapshot of VMs once built
--no-tests: Prevent post-provisioning tests from running.
VIRTUALBOX OPTIONS:
--gui-output, -g: Show the running VM (not headless)
--nopae: Disable PAE support
--hwvirtex: Enable HW virtex support
--vtxvpid: Enable VTX support
--max-cpu-usage [1-100]: Controls how much cpu time a virtual CPU can use
(e.g. 50 implies a single virtual CPU can use up to 50% of a single host CPU)
OVIRT OPTIONS:
--ovirtuser [ovirt_username]
--ovirtpass [ovirt_password]
--ovirt-url [ovirt_api_url]
--ovirtauthz [ovirt authz]
--ovirt-cluster [ovirt_cluster]
--ovirt-network [ovirt_network_name]
--ovirt-affinity-group [ovirt_affinity_group_name]