iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
IT管理

一個人的5G網路與資安小圈圈系列 第 12

DAY12 DLC 透過python scapy 抓取SMF註冊UPF的封包

  • 分享至 

  • xImage
  •  

大家好,今天我們要來講如何抓取SMF與UPF中間通訊的封包,也就是PFCP,當然有很多方式可以解析封包,特別像是eBPF等在處理這些封包,不過我們這邊就簡單的透過scapy與socket進行轉發即可
而scapy在這幾年有新增PFCP的函式庫 scapy PFCP document

from scapy.all import *
from scapy.contrib.pfcp import *
import socket

LOCAL_DATA_HANDLER = lambda x:x
REMOTE_DATA_HANDLER = lambda x:x
BUFFER_SIZE = 2 ** 15

PFCP_ASSOCIATION_DATA = None
PFCP_SESSION_ESTABLISHMENT_DATA = None
PFCP_SESSION_MODIFICATION_DATA = None

PFCP_ASSOCIATION_RESENDING = False
PFCP_SESSION_ESTABLISHMENT_RESENDING = False
PFCP_SESSION_MODIFICATION_RESENDING = False

proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

proxy_socket.bind(("10.20.1.22", 8805))
while True:
    data, address = proxy_socket.recvfrom(BUFFER_SIZE)
    print(str(PFCP(data)))

執行並啟動SMF(config裡UPF IP記得修改為python程式的ip)後,可以看到他有收到資訊

而我們在PFCP(data)後面加.show()

可以看到PFCP完整的封包
修改UPF的config後

可以看到UPF回復的資訊
因此我們這邊可以看到SMF首先會先送一個request UPF會回覆一個response,因此我們這邊進行過濾與分析,分別將封包進行轉送這樣我們DAY13才能繼續下去抓取UE的註冊時PFCP的封包

while True:
    data, address = proxy_socket.recvfrom(BUFFER_SIZE)
    print(PFCP(data).show())
    if str(PFCP(data)[0]) == "PFCP / PFCPAssociationSetupRequest":
        proxy_socket.sendto(data, ("10.244.0.90", 8805))
    if str(PFCP(data)[0]) == "PFCP / PFCPAssociationSetupResponse":
        proxy_socket.sendto(data, ("10.244.0.88", 8805))

可以看到smf有成功註冊UPF而ip為PFCP程式的ip

day13會繼續往下做到抓取UE註冊時pdusession建立時的PFCP封包


上一篇
DAY11 透過5G MANO部屬free5gc
下一篇
DAY13 透過python scapy 抓取UE建立連線時的PFCP封包
系列文
一個人的5G網路與資安小圈圈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言