| name | exploiting-bgp-hijacking-vulnerabilities |
| description | 在授权实验室环境中分析和模拟 BGP 路由劫持场景,评估路由来源验证、RPKI 部署以及针对互联网路由基础设施前缀劫持和路由泄漏攻击的 BGP 监控防御。
|
| domain | cybersecurity |
| subdomain | network-security |
| tags | ["network-security","bgp","routing-security","rpki","route-hijacking"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
利用 BGP 路由劫持漏洞
适用场景
- 评估组织对 BGP 前缀劫持(BGP prefix hijacking)和路由泄漏攻击(route leak attack)的暴露程度
- 测试 RPKI(资源公钥基础设施,Resource Public Key Infrastructure)部署和路由来源验证的有效性
- 验证 BGP 监控和告警系统能否检测未授权的路由通告
- 在隔离实验室环境中模拟 BGP 路由劫持,培训网络运营团队
- 评估 ISP 前缀过滤和路由来源授权(ROA)配置
不适用场景:对实际互联网执行 BGP 路由劫持;在未经授权的情况下针对 BGP 对等体;破坏真实互联网路由基础设施。对生产系统的 BGP 攻击是违法的,可能导致大规模互联网中断。
前置条件
- 使用 GNS3、EVE-NG 或 Containerlab 搭建的隔离 BGP 实验室环境,包含虚拟路由器(FRRouting、BIRD 或 Cisco IOS)
- 了解 BGP 路径属性、AS 路径、前缀通告和路由选择
- 访问 BGP Looking Glass 服务器和 RPKI 验证器,监控真实路由状态
- bgpstream、RIPEstat 和 BGPalerter 工具用于路由监控
- 任何涉及真实 AS 号或前缀通告的测试均需书面授权
工作流程
步骤 1:构建隔离 BGP 实验室环境
sudo bash -c "$(curl -sL https://get.containerlab.dev)"
cat > bgp-lab.clab.yml << 'EOF'
name: bgp-hijack-lab
topology:
nodes:
legitimate-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- legitimate-frr.conf:/etc/frr/frr.conf
attacker-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- attacker-frr.conf:/etc/frr/frr.conf
transit-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- transit-frr.conf:/etc/frr/frr.conf
victim-router:
kind: linux
image: frrouting/frr:v8.5.0
binds:
- victim-frr.conf:/etc/frr/frr.conf
links:
- endpoints: ["legitimate-router:eth1", "transit-router:eth1"]
- endpoints: ["attacker-router:eth1", "transit-router:eth2"]
- endpoints: ["transit-router:eth3", "victim-router:eth1"]
EOF
cat > legitimate-frr.conf << 'EOF'
frr defaults traditional
hostname legitimate-router
router bgp 65001
bgp router-id 1.1.1.1
neighbor 10.0.1.2 remote-as 65000
address-family ipv4 unicast
network 10.0.0.0/24
neighbor 10.0.1.2 activate
exit-address-family
!
interface eth1
ip address 10.0.1.1/30
!
interface lo
ip address 10.0.0.1/24
EOF
cat > attacker-frr.conf << 'EOF'
frr defaults traditional
hostname attacker-router
router bgp 65002
bgp router-id 2.2.2.2
neighbor 10.0.2.2 remote-as 65000
address-family ipv4 unicast
neighbor 10.0.2.2 activate
exit-address-family
!
interface eth1
ip address 10.0.2.1/30
EOF
sudo containerlab deploy -t bgp-lab.clab.yml
步骤 2:验证合法 BGP 路由
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp"
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip route 10.0.0.0/24"
docker exec -it clab-bgp-hijack-lab-victim-router traceroute 10.0.0.1
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24"
步骤 3:模拟前缀劫持(更精确路由)
docker exec -it clab-bgp-hijack-lab-attacker-router vtysh << 'VTYSH'
configure terminal
router bgp 65002
address-family ipv4 unicast
network 10.0.0.0/25
network 10.0.0.128/25
exit-address-family
!
interface lo
ip address 10.0.0.1/25
ip address 10.0.0.129/25
exit
end
write memory
VTYSH
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp 10.0.0.0/24 longer-prefixes"
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip route 10.0.0.1"
步骤 4:模拟 AS 路径前置和来源劫持
docker exec -it clab-bgp-hijack-lab-attacker-router vtysh << 'VTYSH'
configure terminal
router bgp 65002
address-family ipv4 unicast
network 10.0.0.0/24
no network 10.0.0.0/25
no network 10.0.0.128/25
exit-address-family
end
write memory
VTYSH
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp 10.0.0.0/24"
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24 bestpath-compare"
步骤 5:测试 RPKI 路由来源验证
docker run -d --name routinator \
-p 3323:3323 -p 8323:8323 \
nlnetlabs/routinator:latest
docker exec -it clab-bgp-hijack-lab-transit-router vtysh << 'VTYSH'
configure terminal
rpki
rpki cache 172.17.0.1 3323 preference 1
exit
!
route-map RPKI-FILTER permit 10
match rpki valid
!
route-map RPKI-FILTER deny 20
match rpki invalid
!
route-map RPKI-FILTER permit 30
match rpki notfound
!
router bgp 65000
address-family ipv4 unicast
neighbor 10.0.2.1 route-map RPKI-FILTER in
exit-address-family
end
write memory
VTYSH
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show rpki prefix-table"
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24"
步骤 6:监控和检测 BGP 异常
npm install -g bgpalerter
bgpalerter generate -o /etc/bgpalerter
cat > /etc/bgpalerter/prefixes.yml << 'EOF'
10.0.0.0/24:
description: 生产网络
asn: 65001
ignoreMorespecifics: false
group: production
EOF
bgpalerter
pip3 install pybgpstream
python3 << 'PYEOF'
import pybgpstream
stream = pybgpstream.BGPStream(
from_time="2024-03-14 00:00:00",
until_time="2024-03-15 00:00:00",
collectors=["route-views2", "rrc00"],
record_type="updates",
filter="prefix more 10.0.0.0/24"
)
for rec in stream.records():
for elem in rec:
if elem.type == "A":
print(f"时间:{elem.time}")
print(f"前缀:{elem.fields['prefix']}")
print(f"AS 路径:{elem.fields['as-path']}")
print(f"对等体:{elem.peer_asn}")
print("---")
PYEOF
curl -s "https://stat.ripe.net/data/rpki-validation/data.json?resource=AS65001&prefix=10.0.0.0/24" | python3 -m json.tool
核心概念
| 术语 | 定义 |
|---|
| BGP 路由劫持(BGP Hijacking) | 不拥有 IP 前缀的 AS 对其进行未授权通告,将流量转向攻击者网络 |
| 更精确路由劫持(More-Specific Hijack) | 通告比受害者更精确的前缀(更长的掩码),由于最长前缀匹配规则,这类前缀在 IP 路由中始终优先 |
| RPKI(资源 PKI) | 允许 IP 前缀持有者通过路由来源授权(ROA)授权特定 ASN 通告其路由的密码学框架 |
| 路由来源授权(ROA,Route Origin Authorization) | 授权 AS 通告特定 IP 前缀的数字签名对象,支持基于 RPKI 的路由验证 |
| AS 路径前置(AS Path Prepending) | 在 AS 路径中添加重复 AS 号以降低路由优先级的 BGP 技术,也可防御性地用于对抗路由劫持 |
| 路由泄漏(Route Leak) | BGP 路由通告超出其预期范围的传播,例如客户将转接提供商的路由重新通告给其他提供商 |
工具与系统
- Containerlab:使用 Docker 容器部署虚拟路由器拓扑的网络实验室编排工具
- FRRouting(FRR):支持 BGP、OSPF、IS-IS 的开源路由套件,具备 RPKI 验证能力
- BGPalerter:实时 BGP 监控工具,检测前缀劫持、路由泄漏和 RPKI 状态变化
- Routinator:RPKI 依赖方软件,验证 ROA 并向路由器提供经验证的前缀来源数据
- pybgpstream:Python 库,用于分析来自 RouteViews 和 RIPE RIS 收集器的历史和实时 BGP 数据
常见场景
场景:评估组织的 BGP 路由劫持韧性
背景:某云托管公司(AS12345)为其面向客户的服务通告 203.0.113.0/24。他们需要评估自身对 BGP 路由劫持攻击的韧性,并验证 RPKI 部署的有效性。评估包括实验室仿真和真实世界监控验证。
方法:
- 构建 Containerlab 拓扑,复制组织与两家上游 ISP 的 BGP 对等关系
- 使用 RIPEstat 验证组织所有前缀的 ROA 记录已正确发布
- 模拟来自流氓 AS 的更精确前缀劫持(/25),验证启用了 RPKI 验证的上游 ISP 丢弃无效路由
- 模拟完全匹配的来源劫持,验证 RPKI ROV 将路由标记为无效
- 测试客户 AS 重新通告提供商前缀的路由泄漏场景
- 在生产环境部署 BGPalerter,持续监控未授权通告
- 验证组织的 ISP 已正确配置前缀过滤(基于 IRR 和 RPKI)
常见陷阱:
- 在真实互联网基础设施而非隔离实验室环境中测试 BGP 路由劫持
- 假设 RPKI 可防止所有劫持——许多网络仍不验证 RPKI
- 未测试更精确前缀通告——如果 ROA 中未设置最大长度,此类通告可绕过来源验证
- 忽视路由泄漏场景——授权对等体可能无意间重新分发路由
输出格式
## BGP 安全评估报告
**组织**:Cloud Hosting Co.(AS12345)
**评估前缀**:203.0.113.0/24,198.51.100.0/24
**评估日期**:2024-03-15
### RPKI 状态
| 前缀 | ROA 存在 | 最大长度 | 来源 AS | 状态 |
|--------|-----------|------------|-----------|--------|
| 203.0.113.0/24 | 是 | /24 | AS12345 | 有效 |
| 198.51.100.0/24 | 否 | N/A | AS12345 | 未找到 |
### 实验室仿真结果
| 攻击类型 | RPKI 验证 | 结果 |
|-------------|-----------------|--------|
| 更精确 /25 劫持 | 已启用 | 被拦截(来源无效) |
| 更精确 /25 劫持 | 已禁用 | 成功(流量被转向) |
| 完全匹配来源劫持 | 已启用 | 被拦截(来源无效) |
| 客户路由泄漏 | 已启用 | 未拦截(来源有效,路径错误) |
### 建议
1. 为 198.51.100.0/24 创建 ROA(当前未受保护)
2. 在 ROA 中将最大长度设为 /24 以防止更精确前缀劫持
3. 请求上游 ISP 启用 RPKI 路由来源验证
4. 部署 BGPalerter 进行持续前缀监控
5. 向 IRR 数据库注册并向对等体申请前缀过滤