ike-scan是Kali Linux中一款专注于IKE(Internet Key Exchange,互联网密钥交换协议)的扫描工具,主要用于探测网络中支持IPsec VPN的设备。它通过发送IKE协议数据包并分析响应,实现对目标设备的识别、指纹提取、预共享密钥(PSK)破解辅助等功能,是网络安全测试中针对IPsec VPN设备的重要工具。
IKE协议是IPsec VPN的核心协议,负责在通信双方之间建立安全关联(SA)、协商加密算法、交换密钥等,ike-scan正是通过与目标设备的IKE协议交互,获取设备类型、支持的加密套件、厂商信息等关键数据。
二、目标主机指定方式
使用ike-scan时,需通过命令行或文件指定目标主机,支持多种格式,具体如下表所示:
| 指定方式 | 格式示例 | 说明 |
|---|---|---|
| IP地址 | 192.168.1.100 | 单个IP地址,直接指定目标主机 |
| 主机名 | vpn.example.com | 通过DNS解析为IP地址,若使用--nodns选项则不支持 |
| IP网段/子网掩码位数 | 192.168.1.0/24 | 指定整个网段,包含网络地址和广播地址 |
| IP地址范围 | 192.168.1.3-192.168.1.27 | 指定连续的IP地址范围,包含起始和结束IP |
| IP网段:子网掩码 | 192.168.1.0:255.255.255.0 | 通过网段和子网掩码指定目标网络 |
| 文件读取 | --file=targets.txt | 从文件中读取目标,每行一个IP或主机名;使用"-"表示从标准输入读取 |
三、核心选项说明
ike-scan提供丰富的选项,用于控制扫描行为、协议参数、输出格式等,以下按功能分类整理为表格:
3.1 基础控制选项
| 选项 | 简写 | 参数说明 | 默认值/备注 |
|---|---|---|---|
| --help | -h | 显示帮助信息并退出 | 无 |
| --version | -V | 显示工具版本并退出 | 无 |
| --file=<fn> | -f <fn> | 从指定文件<fn>读取目标主机 | 无;文件中每行一个IP/主机名,"-"表示标准输入 |
| --verbose | -v | 显示详细进度信息,多次使用增强详细程度 | 1级:显示扫描阶段完成、无效Cookie包;2级:显示每个收发包;3级:扫描前显示主机/厂商ID列表 |
| --quiet | -q | 不解析返回的数据包 | 输出更简洁,减少协议信息 |
| --multiline | -M | 将负载解析结果拆分为多行显示 | 每个负载解析结果单独一行,以TAB开头,提升可读性 |
| --random | -R | 随机化目标主机列表顺序 | 使用Knuth洗牌算法,避免按顺序扫描被检测 |
| --nodns | -N | 不使用DNS解析主机名 | 使用此选项时,所有目标必须指定为IP地址 |
| --timestamp | 无 | 为接收的数据包显示时间戳 | 每个响应包均附带时间信息,便于日志分析 |
| --shownum | 无 | 显示响应主机的序号 | 在IP地址前显示主机 ordinal 序号,适用于多包发送到同一目标的场景 |
3.2 网络参数选项
| 选项 | 简写 | 参数说明 | 默认值/备注 |
|---|---|---|---|
| --sport=<p> | -s <p> | 设置UDP源端口为<p> | 默认500;0表示随机;--nat-t选项会将默认改为4500;1024以下端口需root权限 |
| --dport=<p> | -d <p> | 设置UDP目标端口为<p> | 默认500(ISAKMP标准端口);--nat-t选项会将默认改为4500 |
| --retry=<n> | -r <n> | 设置每个主机的总尝试次数为<n> | 默认3次 |
| --timeout=<n> | -t <n> | 设置初始超时时间为<n>毫秒 | 默认500ms;后续超时时间按--backoff系数倍增 |
| --backoff=<b> | -b <b> | 设置超时退避系数为<b> | 默认1.5;例:3次重试时,超时依次为500ms、750ms、1125ms |
| --bandwidth=<n> | -B <n> | 设置期望的出站带宽为<n> | 默认56000bps;K=千位/秒,M=兆位/秒(十进制,如64K=64000) |
| --interval=<n> | -i <n> | 设置最小数据包间隔为<n> | 默认毫秒;u=微秒,s=秒;与--bandwidth互斥,二选一 |
| --sourceip=<s> | 无 | 设置出站数据包的源IP为<s> | "random"表示每个包随机源IP;需raw socket支持和root权限;使用后无法接收响应 |
| --bindip=<s> | 无 | 设置绑定的IP地址为<s> | 出站包从<s>发出,同时用于接收响应 |
| --tcp[=<n>] | -T[<n>] | 使用TCP传输而非UDP;<n>指定TCP类型 | 默认类型1(Checkpoint RAW IKE over TCP);类型2为Cisco封装IKE over TCP;仅支持单个目标 |
| --tcptimeout=<n> | -O <n> | 设置TCP连接超时为<n>秒 | 默认10秒;仅适用于TCP传输模式 |
| --nat-t | 无 | 使用RFC 3947 NAT穿越封装 | 添加非ESP标记,默认源/目标端口改为4500;可通过--sport/--dport后续修改端口 |
3.3 IKE协议参数选项
| 选项 | 简写 | 参数说明 | 默认值/备注 |
|---|---|---|---|
| --lifetime=<s> | -l <s> | 设置IKE生命周期为<s>秒 | 默认28800秒;十进制=4字节值,十六进制=自适应长度;"none"表示不添加该属性;可与--trans搭配使用 |
| --lifesize=<s> | -z <s> | 设置IKE流量生命周期为<s>KB | 默认0;十进制=4字节值,十六进制=自适应长度;可与--trans搭配使用 |
| --auth=<n> | -m <n> | 设置认证方式为<n> | 默认1(PSK,预共享密钥);RFC定义1-5;Checkpoint混合模式64221;GSS/Kerberos 65001;XAUTH 65001-65010;不适用于IKEv2 |
| --vendor=<v> | -e <v> | 设置厂商ID字符串为十六进制值<v> | 可多次使用,发送多个厂商ID负载 |
| --trans=<t> | -a <t> | 使用自定义转换集<t>替代默认集 | 可多次使用;支持两种格式: 1. 新格式:(attr=value,...),如(1=1,2=2,3=1,4=2)(DES-CBC、SHA1、PSK、DH Group2) 2. 旧格式:enc[/len],hash,auth,group,如5,2,1,2(3DES-CBC、SHA1、PSK、DH Group2);不适用于IKEv2 |
| --aggressive | -A | 使用IKE主动模式(默认为主模式) | 可搭配--dhgroup、--id、--idtype;主动模式下所有转换集需相同DH组 |
| --id=<id> | -n <id> | 设置标识值为<id> | 仅适用于主动模式;可指定字符串(如test)或十六进制(如0xdeadbeef) |
| --idtype=<n> | -y <n> | 设置标识类型为<n> | 默认3(ID_USER_FQDN);仅适用于主动模式;参考RFC 2407 4.6.2 |
| --dhgroup=<n> | -g <n> | 设置Diffie-Hellman组为<n> | 默认2;适用于主动模式和IKEv2;支持值:1,2,5,14-21;主动模式下自定义转换集需匹配此组 |
| --gssid=<n> | -G <n> | 使用GSS ID(十六进制字符串<n>) | 使用转换属性类型16384(参考draft-ietf-ipsec-isakmp-gss-auth-07.txt);Windows 2000可能用32001;需搭配--auth=65001(Kerberos认证) |
| --noncelen=<n> | -c <n> | 设置nonce负载长度为<n>字节 | 默认20字节;仅适用于主动模式;RFC要求8-256字节,工具不强制;缩短可加速PSK破解 |
| --headerlen=<n> | -L <n> | 设置ISAKMP头部长度为<n>字节 | 默认自动填充正确值;支持"+n"(比正确值大n)、"-n"(比正确值小n)、"n"(固定值);可用于测试设备对错误长度的响应 |
| --mbz=<n> | -Z <n> | 为保留(MBZ)字段设置值<n> | 默认0;取值0-255;会使数据包不符合RFC标准,仅用于测试设备兼容性 |
| --headerver=<n> | -E <n> | 指定ISAKMP头部版本为<n> | 默认0x10(v1.0);取值0-255;非默认值会使数据包不符合RFC标准,用于测试设备对异常版本的响应 |
| --certreq=<c> | -C <c> | 添加证书请求负载,值为十六进制<c> | 首字节为证书类型,其余为证书颁发机构(参考RFC 2408 3.10);证书类型定义见RFC 2408 3.9 |
| --doi=<d> | -D <d> | 设置SA DOI(域标识符)为<d> | 默认1(IPsec);一般无需修改,除非测试设备对非标准DOI的响应 |
| --situation=<s> | -S <s> | 设置SA情境值为<s> | 默认1;含义取决于DOI,IPsec DOI中1表示SIT_IDENTITY_ONLY;用于测试设备对非标准情境的响应 |
| --protocol=<p> | -j <p> | 设置提案协议ID为<p> | 默认1;含义取决于DOI,IPsec DOI中1表示PROTO_ISAKMP;用于测试设备对非标准协议ID的响应 |
| --transid=<t> | -k <t> | 设置转换ID为<t> | 默认1;含义取决于DOI,IPsec DOI中1表示KEY_IKE;用于测试设备对非标准转换ID的响应 |
| --spisize=<n> | 无 | 设置提案SPI大小为<n>字节 | 默认0(无SPI);非零时会添加指定大小的随机SPI到提案负载 |
| --hdrflags=<n> | 无 | 设置ISAKMP头部标志为<n> | 默认0;标志定义见RFC 2408 3.1 |
| --hdrmsgid=<n> | 无 | 设置ISAKMP头部消息ID为<n> | 默认0;IKE第一阶段应设为0 |
| --cookie=<n> | 无 | 设置ISAKMP发起者Cookie为十六进制值<n> | 默认自动生成唯一值;使用此选项时仅能指定单个目标(需唯一Cookie匹配响应) |
| --exchange=<n> | 无 | 设置交换类型为<n> | 默认主模式(2)或主动模式(4);仅支持这两种模式,其他值仅修改头部字段,不调整负载;定义见RFC 2408 3.1 |
| --nextpayload=<n> | 无 | 设置ISAKMP头部的下一个负载类型为<n> | 默认自动设置为正确值;可手动指定修改 |
| --randomseed=<n> | 无 | 使用<n>作为伪随机数生成器种子 | 默认使用不可预测值;用于需要数据包可重复的场景(如包含随机数据的负载) |
| --rcookie=<n> | 无 | 设置ISAKMP响应者Cookie为十六进制值<n> | 默认0 |
| --ikev2 | -2 | 使用IKE版本2 | 实验性功能;发送RFC 4306定义的IKEv2格式包;响应自动按IKEv1/IKEv2解析;仅支持默认提案 |
3.4 指纹与破解选项
| 选项 | 简写 | 参数说明 | 默认值/备注 |
|---|---|---|---|
| --showbackoff[=<n>] | -o[<n>] | 显示退避指纹表;可选参数<n>为接收最后一个包后的等待时间(秒) | 默认等待60秒;用于通过退避模式识别远程主机的IKE实现;短选项格式:-o25(无空格) |
| --fuzz=<n> | -u <n> | 设置模式匹配模糊值为<n>毫秒 | 默认500ms;允许观察到的退避时间与参考时间的最大差异;值越大容错越高,但误报风险增加;模式文件中的值可覆盖此设置 |
| --patterns=<f> | -p <f> | 使用IKE退避模式文件<f> | 默认/usr/share/ike-scan/ike-backoff-patterns;仅在--showbackoff时使用 |
| --vidpatterns=<f> | -I <f> | 使用厂商ID模式文件<f> | 默认/usr/share/ike-scan/ike-vendor-ids;用于厂商ID指纹识别 |
| --pskcrack[=<f>] | -P[<f>] | 破解主动模式预共享密钥;可选参数<f>为输出文件 | 输出PSK参数供psk-crack工具离线破解;默认输出到标准输出;短选项格式:-Pfile(无空格);仅支持单个目标;仅适用于主动模式 |
四、使用教程
4.1 基础扫描:探测目标IPsec设备
扫描单个目标主机,检测是否运行IKE服务:
ike-scan 192.168.1.1
扫描整个网段(如192.168.1.0/24):
ike-scan 192.168.1.0/24
从文件读取目标列表扫描(文件targets.txt每行一个IP):
ike-scan --file=targets.txt
4.2 详细信息获取:显示厂商与协议细节
使用详细模式(-v)扫描,获取更多协议交互信息:
ike-scan -v 192.168.1.1
显示多行走负载解析结果(-M),便于阅读复杂响应:
ike-scan -M 192.168.1.1
识别设备厂商(通过厂商ID指纹):
ike-scan --vidpatterns=/usr/share/ike-scan/ike-vendor-ids 192.168.1.1
4.3 主动模式扫描与PSK破解准备
使用主动模式(-A)扫描,获取更多协商信息:
ike-scan -A 192.168.1.1
导出主动模式PSK破解参数到文件(供psk-crack使用):
ike-scan -A --pskcrack=psk_data.txt 192.168.1.1
使用指定ID和ID类型的主动模式扫描:
ike-scan -A --id=vpnuser --idtype=3 192.168.1.1
4.4 指纹识别:通过退避模式识别设备类型
启用退避指纹分析,识别目标设备的IKE实现:
ike-scan --showbackoff 192.168.1.1
指定退避模式文件并延长等待时间(30秒):
ike-scan --showbackoff=30 --patterns=custom-patterns.txt 192.168.1.1
4.5 高级扫描:自定义协议参数
使用自定义加密套件(3DES、SHA1、PSK、DH Group2):
ike-scan --trans=(1=5,2=2,3=1,4=2) 192.168.1.1
设置非默认IKE生命周期(3600秒)并扫描:
ike-scan --lifetime=3600 192.168.1.1
使用NAT-T穿越模式(端口4500)扫描:
ike-scan --nat-t 192.168.1.1
4.6 速率控制与网络参数调整
限制扫描带宽为128Kbps,避免网络拥塞:
ike-scan --bandwidth=128K 192.168.1.0/24
增加重试次数(5次)和超时时间(1000ms):
ike-scan --retry=5 --timeout=1000 192.168.1.1
随机化目标扫描顺序,避免被检测:
ike-scan --random 192.168.1.0/24
五、注意事项
- 使用ike-scan扫描目标网络需获得合法授权,未经允许的扫描可能违反法律法规。
- 部分选项(如低端口、raw socket)需要root权限,建议使用sudo执行。
- IKEv2支持为实验性功能,可能存在兼容性问题。
- 主动模式和PSK破解仅适用于支持主动模式的设备,部分设备默认使用主模式。
- 扫描结果的准确性受网络环境(如防火墙、NAT)影响,复杂环境下可能需要调整参数重试。