L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

exploiting-bgp-hijacking-vulnerabilities

exploiting-bgp-hijacking-vulnerabilities

在授权实验室环境中分析和模拟 BGP 路由劫持场景,评估路由来源验证、RPKI 部署以及针对互联网路由基础设施前缀劫持和路由泄漏攻击的 BGP 监控防御。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

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 实验室环境

# 安装 Containerlab 用于 BGP 仿真
sudo bash -c "$(curl -sL https://get.containerlab.dev)"

# 创建 BGP 实验室拓扑文件
cat > bgp-lab.clab.yml << 'EOF'
name: bgp-hijack-lab
topology:
  nodes:
    # 合法 AS(AS65001)通告 10.0.0.0/24
    legitimate-router:
      kind: linux
      image: frrouting/frr:v8.5.0
      binds:
        - legitimate-frr.conf:/etc/frr/frr.conf
    # 攻击者 AS(AS65002),将劫持该前缀
    attacker-router:
      kind: linux
      image: frrouting/frr:v8.5.0
      binds:
        - attacker-frr.conf:/etc/frr/frr.conf
    # 转接提供商(AS65000),连接双方
    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

# 配置合法路由器(AS65001)
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

# 配置攻击者路由器(AS65002)——初始不通告该前缀
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 路由

# 连接受害者路由器,验证到 10.0.0.0/24 的路由
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"

# 预期:路由经过 AS65000 AS65001(合法路径)
# 验证 traceroute 沿合法路径转发
docker exec -it clab-bgp-hijack-lab-victim-router traceroute 10.0.0.1

# 检查转接路由器上的 BGP 表
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"

# 受害者现在应优先选择经过攻击者的 /25 路由
# 因为更精确路由在 IP 路由中始终优先
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip route 10.0.0.1"
# 预期:路由现在经过 AS65000 AS65002(攻击者)

步骤 4:模拟 AS 路径前置和来源劫持

# 来源劫持:攻击者通告完全相同的 /24 前缀
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

# 检查受害者更偏好哪条路由
# 前缀长度相同时,AS 路径最短者优先
docker exec -it clab-bgp-hijack-lab-victim-router vtysh -c "show ip bgp 10.0.0.0/24"
# 两条路由均可见,攻击者可能基于 AS 路径长度获胜

# 分析 BGP 路径选择如何决定胜者
docker exec -it clab-bgp-hijack-lab-transit-router vtysh -c "show ip bgp 10.0.0.0/24 bestpath-compare"

步骤 5:测试 RPKI 路由来源验证

# 设置 RPKI 验证器(Routinator)
docker run -d --name routinator \
  -p 3323:3323 -p 8323:8323 \
  nlnetlabs/routinator:latest

# 配置转接路由器使用 RPKI 验证
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

# 验证 RPKI 状态
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"
# 如果存在 ROA,攻击者的通告应被标记为 RPKI Invalid

步骤 6:监控和检测 BGP 异常

# 安装 BGPalerter 用于实时监控
npm install -g bgpalerter
bgpalerter generate -o /etc/bgpalerter

# 配置 BGPalerter 监控你的前缀
cat > /etc/bgpalerter/prefixes.yml << 'EOF'
10.0.0.0/24:
  description: 生产网络
  asn: 65001
  ignoreMorespecifics: false
  group: production
EOF

# 开始监控
bgpalerter

# 使用 bgpstream 查询历史路由数据
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

# 通过 RIPEstat 检查 RPKI 状态
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 部署的有效性。评估包括实验室仿真和真实世界监控验证。

方法:

  1. 构建 Containerlab 拓扑,复制组织与两家上游 ISP 的 BGP 对等关系
  2. 使用 RIPEstat 验证组织所有前缀的 ROA 记录已正确发布
  3. 模拟来自流氓 AS 的更精确前缀劫持(/25),验证启用了 RPKI 验证的上游 ISP 丢弃无效路由
  4. 模拟完全匹配的来源劫持,验证 RPKI ROV 将路由标记为无效
  5. 测试客户 AS 重新通告提供商前缀的路由泄漏场景
  6. 在生产环境部署 BGPalerter,持续监控未授权通告
  7. 验证组织的 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 数据库注册并向对等体申请前缀过滤
Skills enregistrées