尝试搭建域环境靶场 + 构建 Metasploitable 3 VMWare 镜像

前言

最近在忙着备战考研,同时忙里偷闲也在进行渗透测试的学习,虽然本人主攻二进制安全但是全方面还是需要接触一些,其实感觉渗透也挺好玩的。在LLVM成为大趋势的现代语言编译出来的神人才能看懂的二进制折磨之下渗透测试简直是一片乐土(

因为做了不少域环境的靶场故尝试自己搭建,以加强对域环境的了解,同时把折腾的过程记录下来

搭建 Metasploitable 3

https://github.com/rapid7/metasploitable3

metasploitable3 是 msf 作者 rapid7 制作的类似 DVWA 的靶机,配置/脚本等与镜像分离所以相比于手工搭建的2代其可定制性更高。

但是因为其开源属性,所以 rapid7 没有在README中特意写出该如何搭建 VMWare 的镜像(默认只支持 docker / libvirt / virtualbox),因为笔者比较习惯使用VMWare(顺便一提现在VMWare Workstation对个人免费哦)所以稍微折腾了一下如何在 VMWare 上使用 metasploitable 3,其实 metasploitable 3 是支持VMWare的,只不过要多些额外操作。

可能有人会觉得直接把 VirtualBox 镜像导出成 ova 再导入不就行了,笔者一开始也是这么想的,但是发现

  1. 导出/导入过程巨慢无比,导入甚至在我的 VMWare Workstation 上会卡住不动
  2. metasploitable 3 存在特定的网卡设置、端口转发以及配置脚本,直接导出再导入可能会导致这些操作失效

前置需求

  1. 安装 Vagrant https://developer.hashicorp.com/vagrant/docs/installation,ms3 采用 Vagrant 来管理虚拟机配置

这边建议是通过包管理器安装,scoop 或者 chocolatey 都可以,与直接通过官网提供的 msi 安装本质相同不过更好管理。

1
2
scoop install vagrant
vagrant --version

因为是 Windows 特供的安装包所以部分所需插件都已经预安装,如果发现有插件没有安装的可以执行一下安装命令:

1
vagrant plugin install winrm winrm-fs winrm-elevated vagrant-reload
  1. 安装 Vagrant vmware desktop plugin / utility https://github.com/hashicorp/vagrant-vmware-desktop

需要安装 vmware desktop providers,这样才能构建出 VMWare 虚拟机:

1
vagrant plugin install vagrant-vmware-desktop

然后还需要 utility 生成证书,utility 可以直接下载安装预构建的 msi 安装程序:https://developer.hashicorp.com/vagrant/install/vmware,也可以根据repo 中的 README 自行构建。

  1. 获取 metasploitable 3 配置文件:
1
2
3
mkdir metasploitable3-workspace
cd metasploitable3-workspace
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/rapid7/metasploitable3/master/Vagrantfile"

修改配置文件

ms3 的默认配置文件没有对 VMWare 进行特别的配置,而像 ubuntu 这种使用了 networkmanager 的 distro 话,如果虚拟网络和系统网卡配置不匹配则会长时间卡在Waiting for network configuration... 并且实测就算VMWare配置了这个 172.28.128.0 网络 Vagrant 还是会报错退出,所以网卡需要改成 dhcp 后续再配置。编辑 Vagrantfile:

1
2
3
4
ub1404.vm.network "private_network", ip: '172.28.128.3'

# 把 ip 这个字段改成 type: 'dhcp'
ub1404.vm.network "private_network", type: 'dhcp'

注意这里把固定的ip改掉了,后面构建完成之后还需要进行对脚本的进一步修改。

顺便一提,如果有人使用 VirtualBox 搭建遇到 DHCP 报错:

1
2
3
4
5
6
7
A host only network interface you're attempting to configure via DHCP  
already has a conflicting host only adapter with DHCP enabled. The
DHCP on this adapter is incompatible with the DHCP settings. Two
host only network interfaces are not allowed to overlap, and each
host only network interface can have only one DHCP server. Please
reconfigure your host only network or remove the virtual machine
using the other host only network.

可以在 Vagrantfile 最上方加上一个小 patch:

1
2
3
4
5
class VagrantPlugins::ProviderVirtualBox::Action::Network
def dhcp_server_matches_config?(dhcp_server, config)
true
end
end

VMWare 的话应该不会遇到什么问题。

构建镜像

在存有 Vagrantfile 的文件夹下执行命令:

1
vagrant up --provider=vmware_workstation

然后会开始漫长的下载以及配置,期间可能会报一些警告,如果后面网络正常的话无视即可。

跑完了以后不出意外 win2k8 有一个脚本会执行错误: setup_linux_share.bat 其内容如下:https://github.com/rapid7/metasploitable3/blob/6885193671614f3b2990029e4e55a88b5490a5fd/scripts/installs/setup_linux_share.bat

1
2
3
4
5
6
@echo off
ping -n 1 -4 172.28.128.3 | find /i "TTL=" > nul
IF ERRORLEVEL 1 (echo "Linux host not available.") ELSE (
cmdkey /add:172.28.128.3 /user:chewbacca /pass:rwaaaaawr5
net use W: \\172.28.128.3\public /savecred /p:yes
)

因为我们刚才把 ubuntu 的网卡设置成了 dhcp 所以找不到这个网址,不影响虚拟机搭建,后面再改。

配置网卡

注意:本章节只是为了还原原本配置而设置,如果你想把主机当作攻击机或者攻击机只想放在NAT网络上,可以跳过这个章节忽略掉另外一张网卡,上述脚本里的 Linux 地址改成 NAT 网络里的地址就行。因为 Vagrant 总会保留 NAT 网卡以免无法通信所以 NAT 网络应该是不能随便删除的。

vmware 进入虚拟网络编辑器,添加一个网络,子网地址为 172.28.128.0

如果刚才构建完了以后在 vmware 的库里看不到虚拟机可以右键系统托盘点击 Open All Background Virtual Machines 就能看到了。

然后我们对虚拟机需要设置一下网卡,默认的话应该是会配两张网卡,一个是 NAT 另一个是 Host-Only (默认是 vmnet1),把 Host-Only 那张网卡改成我们设置的 172.28.128.0/24 的网络,重启两台虚拟机。

两台虚拟机默认登录账户密码: vagrant/vagrantipconfig / ifconfig 看到两张网卡即可

配置静态IP属于可选项,图方便可以直接将dhcp分配的地址填入上面的脚本。这里就不赘述 Linux 和 Windows 的静态IP配置了,网上一搜就有。

自动挂载 Linux 共享

上面报错的脚本是用来挂载 Linux 的网络共享的,如果没有需求可以忽略。

新建一个 .bat 文件复制脚本进去将 Linux 的 IP 替换掉:

1
2
3
4
5
6
@echo off
ping -n 1 -4 172.28.128.131 | find /i "TTL=" > nul
IF ERRORLEVEL 1 (echo "Linux host not available.") ELSE (
cmdkey /add:172.28.128.131 /user:chewbacca /pass:rwaaaaawr5
net use W: \\172.28.128.131\public /savecred /p:yes
)

执行看看效果:

成功挂载上了,接下来是将其自动执行,首先看看注册表里是不是已经有了自动执行项:HKLM\Software\Microsoft\Windows\CurrentVersion\Run

如果 C:\Windows\setup_linux_share.bat 不存在复制过去即可

那么 metaspoloitable 3 的基本搭建就结束了!最后扫一扫端口看看:

因为 Win2k8 防火墙禁ping,所以不能用ping扫描端口。

搭建域环境

基本概念

  • **域(Domain)**:将网络中的多台计算机通过逻辑的方式组织到一起,进行集中管理,这种集中管理的环境称为域。
  • **域控制器(Domain Controller,DC)**:每个域中至少有一台域控制器、集中存放整个域的用户账号和安全数据库,安装了活动目录(AD)的主机称为域控制器。
  • **活动目录(Active Directory,AD)**:活动目录是一个目录数据库,存储整个windows网络中对象的相关信息(可以理解为存储了网络中所有资源的快捷方式)。也是一种服务,可对活动目录中数据执行各种操作。
  • 父域和子域:出于管理需求,需要在网络中划分多个域。第一个域称为父域,各分部的域称为子域。不同的域之间,信息交互的条目会大大减少,且可以压缩后进行交互,节约带宽。并且域管可以针对各个域,设置不同的安全策略,灵活管理。
  • **域树 (Tree)**:域管只能管理本域,如果需要管理其他域,则需要建立信任关系,域树则是指多个域通过建立信任关系组成的集合。同理,多个域树通过建立信任关系组成的集合则称为域林。
  • **域名服务器 (DNS)**:用于实现域名和与之对应的IP地址之间相互转换。因为域中的计算机是使用DNS来定位域控和其他服务器的,所以域的名字就是DNS域的名字。(DNS和DC一般在同一台机器上)

虚拟机准备

理论上一台 DC 和 一台计算机即可组成一个域,但为了更加模拟现实环境加上了一台 ms3 win2k8服务器和一台 ms3 ubuntu 服务器以及两台原装镜像安装的 Win10 / Win7:

域控制器DC 先改名以便后续操作:

域控制器需要固定IP,在这里我才用刚才搭建 ms3 时创建的 MyDomain 网络(172.28.128.0/24)作为域网络,给域控制器添加该网络然后这样配置:

IP地址随意,DNS 服务器填本机环回地址 127.0.0.1,默认网关留空(因为我们的域网络不出网所以不需要网关)

配置域网络

开始配置域网络,首先先配置域控制器。

添加角色,选择 Active Directory 域服务 / DNS 服务器,其他一直下一步即可:

安装完应该会提示 AD 域服务需要配置,AD DS -> 更多 -> 将此服务器提升为域控制器:

选择添加新林,指定域名:

然后一路下一步,设置还原模式密码(记得保存该密码),如果想要更改 NetBIOS 名也可以。

注意服务器功能级别不向下兼容,比如 Win2k8 不能成为林功能为 Win2k12 的林的域服务器,所以林功能尽量选 2k8,域功能同理。

检查先决条件时可能会提示未分配静态IP导致DNS可能无法工作,应该是因为 NAT网络没有配置静态IP 以及 域网络没有配置 IPv6 静态IP,暂时只考虑域网络IPv4的DNS服务所以可以忽略,点击安装后等待重启即可。

重启后检查计算机全名是否已变为 DC.ruk1t.org ,右键DC服务器打开DNS管理器查看到DNS记录(忽略掉 192.168.86.145 这个 NAT 网络地址)

配置域账户

右键 DC 进入 AD用户与计算机。右键域新建组织单位(OU):

继续添加二级组织等,接着添加一个用户:

然后设置用户默认密码(如果后面发现计算机登录域时不能修改密码,可以把必须修改的勾去掉),注意 Windows 域控制器默认开启密码复杂性要求如下:

比如 zhangsan 就不能设置 Ruk1t@zhangsan 因为含有用户名。

我设置的 Ruk1t@zs0001

加入域网络

有了账户我们就能将计算机加入域网络了,比如 PC1-Win7:

若想加入域网络,首先需要将 DNS 服务器设置为域控地址,并测试是否能 ping 通:

然后更改域(以及计算机名,方便一点):

使用刚才设置的账户密码登录:

注销(或者重启)后用域账户密码登录,看到已经进入域了:

这里我发现域网络变成我的 NAT 网络了,可能是因为域控也在 NAT 里,于是我直接移除掉了域控的NAT网卡就正常了:

Win10 PC的加入跟Win7差不多,只是系统属性被放到了高级系统设置里(关于页右边):

搭建漏洞环境

Windows Server 2008

上面折腾这么多,现在开始将 ms3 服务器加入网络

首先创建一个 Web 服务器用户,将其添加到 Administrators 组中:

ms3 win2k8 登录该用户加入域,重启再登录用户,看到计算机名变化即可。

然后在域控中添加要管理的服务器,点击立即查找,选择 ms3 win2k8 服务器

笔者配置的时候出现 WinRM 解析错误之类的问题,许久没能找到解决方法,一段时间后莫名其妙就好了……

Ubuntu 14.04

才知道原来 Linux 也能加入 AD 域,不过需要安装额外的软件,多加很多步骤。笔者参考了 https://blog.csdn.net/Bksz_guest/article/details/128672998

首先跟 Windows 一样需要修改域网络的DNS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo vi /etc/resolvconf/resolv.conf.d/head

添加一行:
nameserver 172.28.128.100
:wq 保存

sudo resolvconf --enable-updates
sudo resolvconf -u
cat /etc/resolv.conf

能看到 nameserver 添加上即可:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 172.28.128.100
nameserver 192.168.86.2
nameserver 172.28.128.1
search localdomain

安装所需包:

1
2
sudo apt update
sudo apt install realmd sssd-ad sssd-tools adcli -y

查找域:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vagrant@metasploitable3-ub1404:~$ sudo realm discover -v ruk1t.org
* Resolving: _ldap._tcp.ruk1t.org
* Performing LDAP DSE lookup on: 172.28.128.100
* Successfully discovered: ruk1t.org
ruk1t.org
type: kerberos
realm-name: RUK1T.ORG
domain-name: ruk1t.org
configured: no
server-software: active-directory
client-software: sssd
required-package: sssd-tools
required-package: sssd
required-package: libnss-sss
required-package: libpam-sss
required-package: adcli
required-package: samba-common-bin

域控里跟 win2k8 一样创建一个用户并加入管理员组,然后 ubuntu 登录(注意如果提示依赖不满足跟上 --install=/ 参数)期间要输入好几次密码:

1
2
3
4
5
6
7
8
9
10
vagrant@metasploitable3-ub1404:~$ sudo realm join -v --user=webadmin2 ruk1t.org --install=/
* Resolving: _ldap._tcp.ruk1t.org
* Performing LDAP DSE lookup on: 172.28.128.100
* Successfully discovered: ruk1t.org
Password for webadmin2:
* Assuming packages are installed
* Joining using a truncated netbios name: METASPLOITABLE3
* LANG=C /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.VUIDR2 -U webadmin2 ads join ruk1t.org
Enter webadmin2's password:
...

验证加入成功:

1
2
vagrant@metasploitable3-ub1404:~$ id webadmin2@ruk1t.org
uid=1124001113(webadmin2@ruk1t.org) gid=1124000513(domain users@ruk1t.org) groups=1124000513(domain users@ruk1t.org)

其实可以通过这个域用户登录ubuntu不过我就不试了

然后又是跟之前2k8一样的问题…这次发现时区不太对结果改正确还是不行……解决不了

1
LANG=C /usr/sbin/adcli join --verbose --domain ruk1t.org --domain-realm RUK1T.ORG --domain-controller 172.28.128.100 --login-type user --login-user webadmin2 --stdin-password