S- GW Serving Gateway
4.2 DESAFIOS
4.2.2 Cénario 2: Interno
4.2.2.2 Fake WLAN Access Points in 3G-WLAN Interworking
A rede local sem fio (WLAN) é uma tecnologia complementar para o sistema 3GPP. O termo interfuncionamento 3G-WLAN refere- se à extensão dos serviços 3GPP e das funcionalidades para o ambiente de acesso à WLAN.
O interfuncionamento 3G-WLAN é desenvolvido com base em uma tecnologia-chave chamada Extensible Authentication Protocol (EAP), que é uma estrutura de autenticação que suporta vários métodos de au- tenticação. O Extensible Authentication Protocol for SIM (EAP-SIM) é um método EAP que permite usar os vetores de autenticação SIM e GSM e funções de criptografia dentro da estrutura EAP. O. Extensible Authentication Protocol Method for Authentication and Key Agree- ment (EAP-AKA) é um método EAP que permite encontrar os vetores de autenticação USIM e UMTS e as funções de criptografia no qua-
dro EAP. Um WLAN UE deve suportar um desses métodos EAP para acessar os serviços 3GPP. A visão geral de autenticação baseada em EAP no interfuncionamento 3G-WLAN é mostrada na figura 19. Após o registro bem-sucedido da WLAN, a identidade do UE é solicitada pelo servidor AAA. O UE responde com o IMSI na mensagem EAP- Response.
5 ESTRUTURA E APLICAÇÃO
Neste capítulo são apresentadas a arquitetura da solução e a es- pecificação da aplicação que foi construída para a realização dos testes.
5.1 ARQUITETURA DA REDE
Na Figura 20 é apresentado a arquitetura de rede do sistema implementado para realizar os testes na rede LTE com sinalização por Diameter. Foram realizadas experiências para verificar os ataques na rede principal de uma operadora global. Devido a legislação de pri- vacidade e segurança no país de residência do autor, os ataques não puderam ser realizados na prática contra assinantes reais em redes im- plantadas.
Figura 20 – Estrutura de rede do sistema de testes
5.1.1 Diameter client
Este serviço faz a codificação e decodificação das mensagens Dia- meter com base em um template no formato JSON (JavaScript Object Notation). As mensagens codificadas são enviadas por um socket TCP para o Diameter proxy. Quando este serviço recebe uma mensagem de resposta, ela é decodificada e armazenada no disco em formato PCAP para posterior visualização no Wireshark. O Diameter Client foi de-
senvolvido utilizando a linguagem de programação python 2.7.
5.1.2 Diameter proxy
Este serviço estabelece e mantém uma conexão com o Diameter Server por um socket SCTP. Além disso, este serviço aceita conexões TCP de um Diameter Client.
Ao receber uma mensagem do um Diameter Client, o Diame- ter Proxy redireciona a mensagem para o Diameter server que estiver disponível de acordo com a interface Diameter que foi solicitada e ar- mazena em um mapa os dados da conexão com o Diameter Client e da mensagem. Ao receber uma mensagem do Diameter Server, o Diame- ter Proxy verifica se existe algum Diameter Client aguardado aquela mensagem e redireciona para este Diameter Client. Se não houver ne- nhum Diameter Client aguardando a mensagem, ela é descartada e identificado no log. Quando uma conexão com um Diameter Client é perdida ou encerrada por qualquer motivo, os dados desta conexão são removidos do mapa. O Diameter Proxy foi desenvolvido utilizando a linguagem de GO 1.11.
5.1.3 Diameter Server
Este serviço foi disponibilizado por uma empresa parceira, que forneceu acesso à rede. Devido à acordos de roaming, algumas interfaces não foram suportadas. Duas conexões foram estabelecidas para cada Diameter Server, uma primária e outra secundária.
5.1.4 Limitações
Cada operadora de telefonia móvel possui diferentes formas de interoperabilidade e implementação dos componentes da rede. Esta heterogeneidade traz algumas dificuldades para os teste das mensagens padronizadas.
5.2 ESPECIFICAÇÃO DA APLICAÇÃO
Como apresentado na Figura 9.1, esta aplicação foi dividida em duas partes:
• Gen: esta função é responsável pela codificação das mensagens Diameter. Conforme o template JSON utilizado, cada AVP é gerado e codificado para formar a mensagem binária.
• Parser: esta função é responsável pela decodificação de uma men- sagem Diameter no formato binário para uma mensagem em texto plano no formato JSON.
1 from h e x d u m p import r e s t o r e as h e x d u m p _ r e s t o r e 2 from t e m p f i l e import N a m e d T e m p o r a r y F i l e
3 from os import path as os_path , remove as os_remove , mkdir as o s _ m k d i r
4 from c o m m a n d s import g e t o u t p u t as r u n _ c o m m a n d 5 from d a t e t i m e import d a t e t i m e
6 from time import time as n_time
7 from common . common import write_file , h e a d e r _ g e n 8 from d i a f u z z e r _ i n t e r f a c e import Interface , Msg 9 from l o g g i n g import g e t L o g g e r
10 from random import r a n d i n t 11 12 S P E C S _ P A T H = ’ client / d i a f u z z e r / specs / ’ 13 log = g e t L o g g e r (’ d i a m e t e r s t . lib ’) 14 15 P A T H _ P C A P = ’ ./ pcaps ’ 16 17 # - - - gen - - - - 18 def gen ( c o m p o n e n t s ) : 19 m s g _ n a m e = c o m p o n e n t s . get (’ m e s s a g e ’, ’ uk ’) 20 m s g _ a v p s = c o m p o n e n t s . get (’ avps ’, ’ uk ’) 21 i n t e r f a c e _ n a m e = c o m p o n e n t s . get (’ i n t e r f a c e ’, ’ uk ’) 22 i n t e r f a c e = I n t e r f a c e ( i n t e r f a c e _ n a m e ) 23 if i n t e r f a c e : 24 msg = i n t e r f a c e . c r e a t e _ m e s s a g e ( msg_name , m s g _ a v p s ) 25 return msg . encode () 26 else: 27 return ’ I n v a l i d M e s s a g e ’ 28 29 # - - - parser - - - - 30 31 def parser ( p a c k e t _ b i n ) : 32 return Msg . decode ( p a c k e t _ b i n )
Figura 5.1 – Diameter lib - GEN/PARSER
As opções de execução da aplicação estão descritas na Figura 5.2. As mensagens de teste implementadas foram:
– AIR (Authentication-Information-Request) – IDR (Insert-Subscription-Data-Request) – ULR (Update-Location-Request) • Interface Diameter SIP Application:
– LIR (Location-Info-Request) • Interface Cx: – LIR (Location-Info-Request) • Interface SLh: – RIR (’LCS-Routing-Info-Request) • Interface S6c: – SRR (Send-Routing-Info-for-SM-Request) • Interface SLg: – PLR (Provide-Location-Request) 1 """ 2 A l l o w e d o p t i o n s 3 4 o p t i o n a l a r g u m e n t s :
5 -h , -- help show this help m e s s a g e and exit
6 -V , -- v e r s i o n d i sp l a y a p p l i c a t i o n v e r s i o n 7 -f FILENAME , -- f i l e n a m e F I L E N A M E
8 CSV f i l e n a m e
9 -p , -- p r i n t M e s s a g e s Print m e s s a g e s 10 -ns , -- n o t S e n d ’ Pcap create only 11 -mr , -- m o c k R e s p Copy req in resp 12
13
14 CSV p a t t e r n IN 15
16 AIR CMD , DESTINATION , IMSI , PLMN_ID , FLAG_EUTRAN , F L A G _ U T R A N _ G E R A N
17 IDR CMD , DESTINATION , D E S T I N A T I O N _ H O S T , IMSI , MSISDN , FLAG_UTRAN , FLAG_GERAN , FLAG_GAN , FLA G_I_HSPA_E , FLAG_E_UTRAN , F L A G _ H O _ T O _ N O N _ 3 G P P _ A C C E S S , FLAG_NB_IOT , F L A G _ E N H A N C E D _ C O V E R A G E , F L A G _ N R _ A S _ S E C O N D A R Y _ R A T 18 LIR CMD , DESTINATION , P U B L I C _ I D E N T I T Y 19 PLR CMD , DESTINATION , D E S T I N A T I O N _ H O S T , IMSI , S L G _ L O C A T I O N _ T Y P E , L C S _ C L I E N T _ T Y P E , L C S _ E P S _ N A M E _ S T R I N G , L C S _ E P S _ F O R M A T _ I N D I C A T O R
20 RIR CMD , DESTINATION , MSISDN / IMSI , GMLC 21 SRR CMD , D E S T I N A T I O N _ R E A L M , MSISDN , SCF 22 ULR CMD , DESTINATION , IMSI , RAT_TYPE , P L M N _ ID 23 24 F L A G _ X X X : y / n 25 L C S _ C L I E N T _ T Y P E : E M E R G E N C Y _ S E R V I C E S / V A L U E _ A D D E D _ S E R V I C E S / P L M N _ O P E R A T O R _ S E R V I C E S / L A W F U L _ I N T E R C E P T _ S E R V I C E S 26 L C S _ E P S _ F O R M A T _ I N D I C A T O R : L O G I C A L _ N A M E / E M A I L _ A D D R E S S / MSISDN / URL / S I P _ U R L 27 P L M N _ I D : < MCC >f < MNC >
28 R A T _ T Y P E : EUTRAN / WLAN / V I R T U A L / UTRAN / GERAN / GAN / H S P A _ E V O L U T I O N / C D M A 2 0 0 0 _ 1 X / HRPD / UMB / EHRPD
29 S L G _ L O C A T I O N _ T Y P E : C U R R E N T _ L O C A T I O N /
C U R R E N T _ O R _ L A S T _ K N O W N _ L O C A T I O N / I N I T I A L _ L O C A T I O N / A C T I V A T E _ D E F E R R E D _ L O C A T I O N / C A N C E L _ D E F E R R E D _ L O C A T I O N / N O T I F I C A T I O N _ V E R I F I C A T I O N _ O N L Y
Figura 5.2 – Diameter APP - Allowed options
As figuras 9.2, 5.4 e 5.5 apresentam as composições das mensa- gem Diameter, que são diferenciadas por Request e Response (Answer).
1 # - - - - 2 # - - - M E S S A G E C L A S S E S # - - - - 3 # - - - - 4
5 class M e s s a g e (object) :
6 def _ _ i n i t _ _ ( self , name , i n t e r f a c e ) : 7 self . m e s s a g e = name
8 self . i n t e r f a c e = i n t e r f a c e
9 self . avps = list()
10
11 def a d d _ a v p ( self , name , value , a v p _ t y p e =’ string ’) :
12 avp = lambda: None
13 avp . name = name
14 avp .type = a v p _ t y p e
15 avp . value = str( value ) if a v p _ t y p e . lower () == ’ string ’ else value
16 self . avps . append ( avp )
17
18 def a d d _ a v p _ n 2 ( self , name , value , s u b _ n a m e = None , a v p _ t y p e =’ string ’, a v p _ s u b _ t y p e = None ) :
19 avp = lambda: None
20 avp . name = s u b _ n a m e if s u b _ n a m e else name 21 if a v p _ s u b _ t y p e :
22 avp .type = a v p _ s u b _ t y p e 23
24 avp . value = str( value ) if a v p _ s u b _ t y p e and a v p _ s u b _ t y p e . lower () == ’ string ’ else value
25
26 self . a d d _ a v p ( name , avp , a v p _ t y p e = a v p _ t y p e ) 27
28 def t o _ j s o n ( self ) :
29 return json . loads ( json . dumps ( self , d e f a u l t =lambda o : o . __dict__ ,
30 s o r t _ k e y s = True , indent =4) ) Figura 5.3 – Diameter Message
1 # - - - - 2 # - - - S P E C I F I C CLASSES - - - - 3 # - - - - 4 5 # - - - - 6 # - - - S6a - - - - 7 # - - - - 8 9 class R e q u e s t ( M e s s a g e ) :
10 def _ _ i n i t _ _ ( self , name , i n t e r f a c e ) :
11 super( Request , self ) . _ _ i n i t _ _ ( name = name , i n t e r f a c e = i n t e r f a c e ) 12 13 def s e t _ s e s s i o n _ i d ( self , s e s s i o n _ i d ) : 14 self . a d d _ a v p (’ Session - Id ’, s e s s i o n _ i d ) 15 16 def s e t _ d r m p ( self , drmp ) : 17 self . a d d _ a v p (’ DRMP ’, drmp ) 18 19 def s e t _ v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d ( self , v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d ) : 20 v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p = lambda: None 21 v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p . name = ’ Vendor - Specific - Application - Id ’ 22 v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p . value = list() 23 24 if ’ V E N D O R _ I D ’ in v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d :
25 avp = lambda: None
26 avp . name = ’ Vendor - Id ’
27 avp . value = v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d . get (’ V E N D O R _ I D ’) 28 v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p . value . append ( avp ) 29 30 if ’ A U T H _ A P P L I C A T I O N _ I D ’ in v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d :
31 avp = lambda: None
32 avp . name = ’ Auth - Application - Id ’
33 avp . value = v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d . get (’ A U T H _ A P P L I C A T I O N _ I D ’)
34 v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p . value . append ( avp )
35
36 self . avps . append ( v e n d o r _ s p e c i f i c _ a p p l i c a t i o n _ i d _ a v p ) 37
38 def s e t _ a u t h _ s e s s i o n _ s t a t e ( self , a u t h _ s e s s i o n _ s t a t e ) : 39 self . a d d _ a v p _ n 2 (’ Auth - Session - State ’,
a u t h _ s e s s i o n _ s t a t e , a v p _ t y p e =’ enum ’) 40
41 def s e t _ o r i g i n _ h o s t ( self , host ) : 42 self . a d d _ a v p (’ Origin - Host ’, host ) 43
44 def s e t _ o r i g i n _ r e a l m ( self , realm ) : 45 self . a d d _ a v p (’ Origin - Realm ’, realm ) 46
47 def s e t _ d e s t i n a t i o n _ h o s t ( self , host ) : 48 self . a d d _ a v p (’ Destination - Host ’, host ) 49
50 def s e t _ d e s t i n a t i o n _ r e a l m ( self , realm ) : 51 self . a d d _ a v p (’ Destination - Realm ’, realm ) 52
53 def s e t _ u s e r _ n a m e ( self , u s e r _ n a m e ) : 54 self . a d d _ a v p (’ User - Name ’, u s e r _ n a m e ) 55
56 def s e t _ m s i s d n ( self , msisdn ) : 57 self . a d d _ a v p (’ MSISDN ’, msisdn ) 58
59 def s e t _ m s i s d n _ o r _ u s e r _ n a m e ( self , m s i s d n _ o r _ u s e r _ n a m e ) : 60 if len( m s i s d n _ o r _ u s e r _ n a m e . strip () ) < 15:
61 self . a d d _ a v p (’ MSISDN ’, m s i s d n _ o r _ u s e r _ n a m e )
62 else:
63 self . a d d _ a v p (’ User - Name ’, m s i s d n _ o r _ u s e r _ n a m e ) 64 65 def s e t _ g m l c _ n u m b e r ( self , g m l c _ n u m b e r ) : 66 self . a d d _ a v p (’ GMLC - Number ’, g m l c _ n u m b e r ) 67 68 def s e t _ p u b l i c _ i d e n t i t y ( self , p u b l i c _ i d e n t i t y ) : 69 self . a d d _ a v p (’ Public - I d e n t i t y ’, p u b l i c _ i d e n t i t y ) 70 71 def s e t _ s c _ a d d r e s s ( self , s c _ a d d r e s s ) : 72 self . a d d _ a v p (’SC - A d d r e s s ’, s c _ a d d r e s s ) 73 74 def s e t _ o c _ s u p p o r t e d _ f e a t u r e s ( self , o c _ s u p p o r t e d _ f e a t u r e s ) :
75 self . a d d _ a v p (’OC - Supported - F e a t u r e s ’, o c _ s u p p o r t e d _ f e a t u r e s ) 76 77 def s e t _ s u p p o r t e d _ f e a t u r e s ( self , s u p p o r t e d _ f e a t u r e s ) : 78 self . a d d _ a v p (’ Supported - F e a t u r e s ’, s u p p o r t e d _ f e a t u r e s ) 79 80 def s e t _ r e q u e s t e d _ e u t r a n _ a u t h e n t i c a t i o n _ i n f o ( self ,
r e q u e s t e d _ e u t r a n _ a u t h e n t i c a t i o n _ i n f o ) :
81 if r e q u e s t e d _ e u t r a n _ a u t h e n t i c a t i o n _ i n f o . upper () == ’ Y ’:
82 avp = lambda: None
83 avp . name = ’ Requested - EUTRAN - A u t h e nt i c a t i o n - Info ’
84 avp . value = list()
85
86 avp2 = lambda: None
87 avp2 . name = ’ Number - Of - Requested - V e c t o r s ’
88 avp2 . value = 2
89 avp . value . append ( avp2 )
90
91 avp3 = lambda: None
92 avp3 . name = ’ Immediate - Response - P r e f e r r e d ’
93 avp3 . value = 1
94 avp . value . append ( avp3 )
95 self . avps . append ( avp )
96
97 def s e t _ r e q u e s t e d _ u t r a n _ g e r a n _ a u t h e n t i c a t i o n _ i n f o ( self , r e q u e s t e d _ u t r a n _ g e r a n _ a u t h e n t i c a t i o n _ i n f o ) :
98 if r e q u e s t e d _ u t r a n _ g e r a n _ a u t h e n t i c a t i o n _ i n f o . upper () == ’Y ’:
99 avp = lambda: None
100 avp . name = ’ Requested - UTRAN - GERAN - A u t h e n t i c a t i o n - Info ’
101 avp . value = list()
102
103 avp2 = lambda: None
104 avp2 . name = ’ Number - Of - Requested - V e c t o r s ’
105 avp2 . value = 2
106 avp . value . append ( avp2 )
107
108 avp3 = lambda: None
109 avp3 . name = ’ Immediate - Response - P r e f e r r e d ’
110 avp3 . value = 1
111 avp . value . append ( avp3 )
112 self . avps . append ( avp )
113
114 def s e t _ v i s i t e d _ p l m n _ i d ( self , v i s i t e d _ p l m n _ i d ) : 115 self . a d d _ a v p (’ Visited - PLMN - Id ’, v i s i t e d _ p l m n _ i d ) 116
117 def s e t _ a i r _ f l a g s ( self , a i r _ f l a g s ) : 118 self . a d d _ a v p (’ AIR - Flags ’, a i r _ f l a g s ) 119
120 def s e t _ a v p ( self , avp ) : 121 self . a d d _ a v p (’ AVP ’, avp ) 122
123 def s e t _ p r o x y _ i n f o ( self , p r o x y _ i n f o ) : 124 self . a d d _ a v p (’ Proxy - Info ’, p r o x y _ i n f o ) 125
127 self . a d d _ a v p (’ Route - Record ’, r o u t e _ r e c o r d ) 128
129 def s e t _ r a t _ t y p e ( self , r a t _ t y p e ) :
130 self . a d d _ a v p _ n 2 (’ RAT - Type ’, rat_type , a v p _ t y p e =’ enum ’)
131
132 def s e t _ u l r _ f l a g s ( self , u l r _ f l a g s ) :
133 self . a d d _ a v p (’ ULR - Flags ’, ulr_flags , a v p _ t y p e =’ int ’) 134
135 def s e t _ s L g _ l o c a t i o n _ t y p e ( self , s L g _ l o c a t i o n _ t y p e ) : 136 self . a d d _ a v p _ n 2 (’ SLg - Location - Type ’,
s L g _ l o c a t i o n _ t y p e , a v p _ t y p e =’ enum ’) 137
138 def s e t _ l c s _ e p s _ c l i e n t _ n a m e ( self , l c s _ e p s _ c l i e n t _ n a m e ) : 139 l c s _ e p s _ c l i e n t _ n a m e _ a v p = lambda: None
140 l c s _ e p s _ c l i e n t _ n a m e _ a v p . name = ’ LCS - EPS - Client - Name ’ 141 l c s _ e p s _ c l i e n t _ n a m e _ a v p . value = list()
142
143 if ’ L C S _ N A M E _ S T R I N G ’ in l c s _ e p s _ c l i e n t _ n a m e :
144 avp = lambda: None
145 avp . name = ’ lcs - name - string ’
146 avp . value = l c s _ e p s _ c l i e n t _ n a m e . get (’ L C S _ N A M E _ S T R I N G ’) . strip ()
147 l c s _ e p s _ c l i e n t _ n a m e _ a v p . value . append ( avp ) 148
149 if ’ L C S _ F O R M A T _ I N D I C A T O R ’ in l c s _ e p s _ c l i e n t _ n a m e :
150 avp = lambda: None
151 avp . name = ’ lcs - format - i n d i c a t o r ’
152 avp . tyoe = ’ enum ’
153 avp . value = lambda: None
154 avp . value . name = ’ lcs - format - i n d i c a t o r ’
155 avp . value . tyoe = ’ enum ’
156 avp . value . value = l c s _ e p s _ c l i e n t _ n a m e . get (’ L C S _ F O R M A T _ I N D I C A T O R ’) . strip ()
157 l c s _ e p s _ c l i e n t _ n a m e _ a v p . value . append ( avp ) 158
159 self . avps . append ( l c s _ e p s _ c l i e n t _ n a m e _ a v p ) 160
161 def s e t _ l c s _ c l i e n t _ t y p e ( self , l c s _ c l i e n t _ t y p e ) :
162 self . a d d _ a v p _ n 2 (’ LCS - Client - Type ’, l c s _ c l i e n t _ t y p e , a v p _ t y p e =’ enum ’)
Figura 5.4 – Diameter Message Request
1 2 # - - - - 3 # - - - R E S P O N S E # - - - - 4 # - - - - 5 6 class R e s p o n s e (object) : 7 def _ _ i n i t _ _ ( self ) :
8 self . m e s s a g e = None 9
10 def g e t _ a v p _ b y _ c o d e ( self , code , avps = None , g e t _ d a t a = True ) :
11 avps = avps if avps else self . m e s s a g e . avps
12 for avp in avps :
13 if int( avp . code ) == int( code ) :
14 if g e t _ d a t a :
15 return avp . data
16 else: 17 return avp 18 19 return None 20 21 def t o _ j s o n ( self ) :
22 return json . loads ( json . dumps ( self , d e f a u l t =lambda o : o . __dict__ , 23 s o r t _ k e y s = True , indent =4) ) 24 25 def s e t _ m e s s a g e ( self , msg ) : 26 self . m e s s a g e = msg 27 28 def g e t _ e r r o r _ m e s s a g e ( self ) : 29 return self . g e t _ a v p _ b y _ c o d e (281) 30 31 def g e t _ s e s s i o n _ i d ( self ) : 32 return self . g e t _ a v p _ b y _ c o d e (263) 33 34 def g e t _ r e s u l t _ c o d e ( self ) : 35 value = self . g e t _ a v p _ b y _ c o d e (268)
36 return int( value . encode (’ hex ’) , 16) if value else value 37 38 def g e t _ r e s u l t _ m e s s a g e ( self ) : 39 r e s u l _ c o d e = self . g e t _ r e s u l t _ c o d e () 40 return d i a m e t e r _ l i b . g e t _ r e s u l t _ m e s s a g e ( r e s u l _ c o d e ) if r e s u l _ c o d e else None 41 42 def g e t _ e x p e r i m e n t a l _ r e s u l t _ c o d e ( self ) :
43 avp = self . g e t _ a v p _ b y _ c o d e (297 , g e t _ d a t a = False ) 44 value = self . g e t _ a v p _ b y _ c o d e (298 , avps = avp . avps ) if
avp else None
45 return int( value . encode (’ hex ’) , 16) if value else None 46 47 def g e t _ e x p e r i m e n t a l _ r e s u l t _ m e s s a g e ( self ) : 48 e x p e r i m e n t a l _ r e s u l _ c o d e = self . g e t _ e x p e r i m e n t a l _ r e s u l t _ c o d e () 49 return d i a m e t e r _ l i b . g e t _ e x p e r i m e n t a l _ r e s u l t _ m e s s a g e ( e x p e r i m e n t a l _ r e s u l _ c o d e ) if e x p e r i m e n t a l _ r e s u l _ c o d e else None 50
51 def g e t _ e r r o r _ d i a g n o s t i c ( self ) :
52 value = self . g e t _ a v p _ b y _ c o d e (1614)
53 return int( value . encode (’ hex ’) , 16) if value else value 54 55 def g e t _ e r r o r _ d i a g n o s t i c _ m e s s a g e ( self ) : 56 e r r o r _ d i a g n o s t i c = self . g e t _ e r r o r _ d i a g n o s t i c () 57 return d i a m e t e r _ l i b . g e t _ e r r o r _ d i a g n o s t i c _ m e s s a g e ( e r r o r _ d i a g n o s t i c ) if e r r o r _ d i a g n o s t i c else None 58 59 def g e t _ a u t h _ s e s s i o n _ s t a t e ( self ) : 60 value = self . g e t _ a v p _ b y _ c o d e (277)
61 return int( value . encode (’ hex ’) , 16) if value else value 62 63 def g e t _ o r i g i n _ h o s t ( self ) : 64 return self . g e t _ a v p _ b y _ c o d e (264) 65 66 def g e t _ o r i g i n _ r e a l m ( self ) : 67 return self . g e t _ a v p _ b y _ c o d e (296) 68 69 def g e t _ u s e r _ n a m e ( self ) : 70 return self . g e t _ a v p _ b y _ c o d e (1) 71 72 def g e t _ s e r v i n g _ n o d e ( self ) : 73 return self . g e t _ a v p _ b y _ c o d e (2401) 74 75 def g e t _ a d d i t i o n a l _ s e r v i n g _ n o d e ( self ) : 76 return self . g e t _ a v p _ b y _ c o d e (2406) 77 78 def g e t _ l m s i ( self ) : 79 return self . g e t _ a v p _ b y _ c o d e (2400) 80 81 def g e t _ u s e r _ i d e n t i f i e r ( self ) : 82 return self . g e t _ a v p _ b y _ c o d e (3102) 83 84 def g e t _ m s i s d n ( self ) : 85 return self . g e t _ a v p _ b y _ c o d e (701) 86 87 def g e t _ g m l c _ a d d r e s s ( self ) : 88 return self . g e t _ a v p _ b y _ c o d e (2405) 89 90 def g e t _ p p r _ a d d r e s s ( self ) : 91 return self . g e t _ a v p _ b y _ c o d e (2407) 92 93 def g e t _ a u t h e n t i c a t i o n _ i n f o ( self ) : 94 value = self . g e t _ a v p _ b y _ c o d e (1413)
95 return int( value . encode (’ hex ’) , 16) if value else value
96
97 def g e t _ u e _ u s a g e _ t y p e ( self ) :
99
100 def g e t _ s u b s c r i p t i o n _ d a t a ( self ) : 101 value = self . g e t _ a v p _ b y _ c o d e (1400)
102 return int( value . encode (’ hex ’) , 16) if value else value
Figura 5.5 – Diameter Message Response (Answer)
Cada mensagem Diameter é implementada utilizando uma inter- face específica, como apresentado na Figura 9.3, e codificada de acordo com seus AVPs, como apresentado na figura 9.4.
1 from pyfkd . d i a f u z z e r import Diameter , avps as _avps , sctp 2 from c S t r i n g I O import S t r i n g I O 3 from c o m m a n d s import g e t o u t p u t as r u n _ c o m m a n d 4 import os 5 6 Msg = D i a m e t e r . Msg 7 SCTP = sctp . SCTP 8 D a t a C h u n k = sctp . D a t a C h u n k 9 10 class M e s s a g e :
11 def _ _ i n i t _ _ ( self , function , avps , i n t e r f a c e ) :
12 g e t a t t r( self , ’_ ’ + f u n c t i o n + ’_ ’ + i n t e r f a c e . lower () ) ( avps )
13
14 def _ c a n c e l _ l o c a t i o n _ r e q u e s t _ s 6 a ( self , avps ) : 15 # # Cancel L o c a t i o n R e q u e s t Code 317
16 # The Cancel - Location - Re q u e s t ( CLR ) c o m m a n d is sent from HSS to MME or SGSN .
17 # R e f e r e n c e : 29.272
18 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 19 # R e q u e s t Bit : MUST
20 # P r o x i a b l e Bit : MUST
21 # Error Bit : MAY
22 # #
23 self . _ m e s s a g e = Msg ( R = True , P = True , code =317 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
24
25 def _ a u t h e n t i c a t i o n _ i n f o r m a t i o n _ r e q u e s t _ s 6 a ( self , avps ) : 26 # # A u t h e n t i c a t i o n I n f o r m a t i o n R e q u e s t Code 318 27 # The A ut h e n t i c a t i o n - Information - R e q u e s t ( AIR )
c o m m a n d is sent from MME or SGSN to HSS . 28 # R e f e r e n c e : 29.272
29 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 30 # R e q u e s t Bit : MUST
31 # P r o x i a b l e Bit : MUST
32 # Error Bit : MAY
33 # #
34 self . _ m e s s a g e = Msg ( R = True , P = True , code =318 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
35
36 def _ d e l e t e _ s u b s c r i b e r _ d a t a _ r e q u e s t _ s 6 a ( self , avps ) : 37 # # Delete S u b s c r i b e r Data R e q u e s t Code 320
38 # The Delete - S u b s c r i b e r D a t a - R e q u e s t ( DSR ) c o m m a n d is sent from HSS to MME or SGSN .
39 # R e f e r e n c e : 29.272
40 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 41 # R e q u e s t Bit : MUST
42 # P r o x i a b l e Bit : MUST
43 # Error Bit : MAY
44 # #
45 self . _ m e s s a g e = Msg ( R = True , P = True , code =320 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
46
47 def _ i n s e r t _ s u b s c r i b e r _ d a t a _ r e q u e s t _ s 6 a ( self , avps ) : 48 # # Insert S u b s c r i b e r Data R e q u e s t Code 319
49 # The Insert - Subscriber - Data - R e q u e s t ( IDR ) c o m m a n d is sent from HSS to MME or SGSN .
50 # R e f e r e n c e : 29.272
51 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 52 # R e q u e s t Bit : MUST
53 # P r o x i a b l e Bit : MUST
54 # Error Bit : MAY
55 # #
56 self . _ m e s s a g e = Msg ( R = True , P = True , code =319 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
57
58 def _ n o t i t y _ r e q u e s t _ s 6 a ( self , avps ) : 59 # # Notify R e qu e s t Code 323
60 # The Notify - R e q u e s t ( NOR ) c o m m a n d is sent from MME or SGSN to HSS .
61 # R e f e r e n c e : 29.272
62 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 63 # R e q u e s t Bit : MUST
64 # P r o x i a b l e Bit : MUST
65 # Error Bit : MAY
66 # #
67 self . _ m e s s a g e = Msg ( R = True , P = True , code =323 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
68
69 def _ p u r g e _ u e _ r e q u e s t _ s 6 a ( self , avps ) : 70 # # Purge UE R e q u e s t Code 321
71 # The Purge - UE - R e q u e s t ( PUR ) co m m a n d is sent from MME or SGSN to HSS .
72 # R e f e r e n c e : 29.272
73 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 74 # R e q u e s t Bit : MUST
75 # P r o x i a b l e Bit : MUST
76 # Error Bit : MAY
77 # #
78 self . _ m e s s a g e = Msg ( R = True , P = True , code =321 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
79
80 def _ r e s e t _ r e q u e s t _ s 6 a ( self , avps ) : 81 # # Reset R e q u e s t Code 322
82 # The Reset - R e q u e s t ( RSR ) c o m m a n d is sent from HSS to MME or SGSN .
83 # R e f e r e n c e : 29.272
84 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 85 # R e q u e s t Bit : MUST
86 # P r o x i a b l e Bit : MUST
87 # Error Bit : MAY
88 # #
89 self . _ m e s s a g e = Msg ( R = True , P = True , code =322 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
90
91 def _ u p d a t e _ l o c a t i o n _ r e q u e s t _ s 6 a ( self , avps ) : 92 # # Update L o c a t i o n R e q u e s t Code 316
93 # The Update - Location - Re q u e s t ( ULR ) c o m m a n d is sent from MME or SGSN to HSS .
94 # R e f e r e n c e : 29.272
95 # A p p l i c a t i o n : 3 GPP S6a ( 1 6 7 7 7 2 5 1 ) 96 # R e q u e s t Bit : MUST
97 # P r o x i a b l e Bit : MUST
98 # Error Bit : MAY
99 # #
100 self . _ m e s s a g e = Msg ( R = True , P = True , code =316 , app_id =16777251 , avps = self . _ p a r s e _ a v p s ( avps ) )
101
102 def _ f i n d _ e n u m ( self , name , value ) :
103 return g e t a t t r(g e t a t t r( _avps , name . upper () ) , value . upper () )
104
105 def _ p a r s e _ a v p s ( self , avps ) :
106 lavps = []
107 for avp in avps :
108 if avp [’ type ’] == ’ enum ’:
109 lavps . append (g e t a t t r( _avps , avp [’ name ’]) ( self . _ f i n d _ e n u m ( avp [’ name ’] , avp [’ value ’]) ) )
110 elif avp [’ type ’] == ’ group ’:
111 lavps . append (g e t a t t r( _avps , avp [’ name ’]) ( self . _ p a r s e _ a v p s ( avp [’ value ’]) ) )
112 elif avp [’ type ’] == ’ flag ’:
113 flg = 0
114 for flag in avp [’ value ’]:
115 flg += self . _ f i n d _ e n u m ( avp [’ name ’] , flag
)
116 lavps . append (g e t a t t r( _avps , avp [’ name ’]) ( flg ) )
117 else:
118 lavps . append (g e t a t t r( _avps , avp [’ name ’]) (str ( avp [’ value ’]) ) )
119
121
122 def encode ( self ) :
123 return self . _ m e s s a g e . encode () 124
125 def size ( self ) :
126 return len( self . _ m e s s a g e . encode () )
Figura 5.6 – Interface para mensagens Diameter
1 # - - - - 2 # - - - S6a # - - - - 3 # - - - - 4 5 # AIR ( A u t h e n t i c a t io n - Information - R e qu e s t ) 6 def g e t _ s 6 a _ a i r _ r u l e () : 7 """
8 ( AIR ) c o m m a n d is sent from MME or SGSN to HSS . 9 """
10 r e q _ m s g = R e q u e s t ( name =’ A u t h e n t i c a t i o n - Information - R e q u e s t ’, i n t e r f a c e =’ S6a ’)
11 r e s p _ m s g = R e s p o n s e () 12
13 s e s s i o n _ i d = uuid . uuid4 () .int 14 r e q _ r u l e _ s i z e = 6
15
16 r e q _ r u l e = {
17 # D e f a u l t Req ( d i s p l a y : False )
18 0: {’ m a n d a t o r y ’: True , ’ name ’: ’ S E S S I O N _ I D ’, ’ alias ’ : None , ’ set ’: r e q _ m s g . s e t _ s e s s i o n _ id , ’ d i s p l a y ’: False ,
’ d e f a u l t ’: _ t r u n c a t e ( s e s s i o n _ i d ) } , 19
20 # Get from file in order ( d i s p l a y : True )
21 1: {’ m a n d a t o r y ’: True , ’ name ’: ’ D E S T I N A T I O N _ R E A L M ’, ’ alias ’: ’ D E S T I N A T I O N ’, ’ set ’: r e q _ m s g .
s e t _ d e s t i n a t i o n _ r e a l m , ’ d i s p l a y ’: True } ,
22 2: {’ m a n d a t o r y ’: True , ’ name ’: ’ U S E R _ N A M E ’, ’ alias ’: ’ IMSI ’, ’ set ’: r e q _ m s g . set_u ser_name , ’ d i s p l a y ’: True } , 23 3: {’ m a n d a t o r y ’: True , ’ name ’: ’ V I S I T E D _ P L M N _ I D ’, ’ alias ’: ’ P L M N _ I D ’, ’ set ’: r e q _ m s g . s e t _ v i s i t e d _ p l m n _ i d , ’ d i s p l a y ’: True } , 24 4: {’ m a n d a t o r y ’: False , ’ name ’: ’ R E Q U E S T E D _ E U T R A N _ A U T H E N T I C A T I O N _ I N F O ’, ’ alias ’: ’ F L A G _ E U T R A N ’, ’ set ’: r e q _ m s g . s e t _ r e q u e s t e d _ e u t r a n _ a u t h e n t i c a t i o n _ i n f o , ’ di s p l a y ’: True } , 25 5: {’ m a n d a t o r y ’: False , ’ name ’: ’ R E Q U E S T E D _ U T R A N _ G E R A N _ A U T H E N T I C A T I O N _ I N F O ’, ’ alias ’: ’ F L A G _ U T R A N _ G E R A N ’, ’ set ’: r e q _ m sg . s e t _ r e q u e s t e d _ u t r a n _ g e r a n _ a u t h e n t i c a t i o n _ i n f o , ’ d i s p l a y ’ : True } , 26
27 # D e f a u l t ( d i s p l a y : False )
28 6: {’ m a n d a t o r y ’: False , ’ name ’: ’ DRMP ’, ’ alias ’: None , ’ set ’: None , ’ d i s p l a y ’: False } ,
29 7: {’ m a n d a t o r y ’: False , ’ name ’: ’
V E N D O R _ S P E C I F I C _ A P P L I C A T I O N _ I D ’, ’ alias ’: None , ’ set ’: None , ’ d i s p l a y ’: False } ,
30 8: {’ m a n d a t o r y ’: True , ’ name ’: ’ A U T H _ S E S S I O N _ S T A T E ’, ’ alias ’: None , ’ set ’: r e q _ m s g . s e t _ a u t h _ s e s s i o n _ s t a t e , ’ d i s p l a y ’: False , ’ d e f a u lt ’: ’ N O _ S T A T E _ M A I N T A I N E D ’} , 31 9: {’ m a n d a t o r y ’: True , ’ name ’: ’ O R I G I N _ H O S T ’, ’ alias
’: None , ’ set ’: r e q _ m s g . s e t _ o r i g i n _ h o s t , ’ d i s p l a y ’: False , ’ d e f a u l t ’: O R I G I N _ H O S T } ,
32 10: {’ m a n d a t o r y ’: True , ’ name ’: ’ O R I G I N _ R E A L M ’, ’ alias ’: None , ’ set ’: r e q _ m s g . s e t _ o r i g i n _ r e a l m , ’ d i s p l a y ’ : False , ’ d e fa u l t ’: O R I G I N _ R E A L M } ,
33 11: {’ m a n d a t o r y ’: False , ’ name ’: ’ D E S T I N A T I O N _ H O S T ’, ’ set ’: None , ’ d i s p l a y ’: False } ,
34 12: {’ m a n d a t o r y ’: False , ’ name ’: ’
O C _ S U P P O R T E D _ F E A T U R E S ’, ’ set ’: None , ’ d i s p l a y ’: False } , 35 13: {’ m a n d a t o r y ’: True , ’ name ’: ’ S U P P O R T E D _ F E A T U R E S ’
, ’ set ’: None , ’ d i s p l a y ’: False } ,
36 14: {’ m a n d a t o r y ’: False , ’ name ’: ’ A I R _ F L A G S ’, ’ set ’: None , ’ d i s p l a y ’: False } ,
37
38 # ...
39 15: {’ m a n d a t o r y ’: False , ’ name ’: ’ AVP ’, ’ set ’: None , ’ d i s p l a y ’: False } ,
40 16: {’ m a n d a t o r y ’: False , ’ name ’: ’ P R O X Y _ I N F O ’, ’ set ’ : None , ’ d i s p l a y ’: False } ,
41 17: {’ m a n d a t o r y ’: False , ’ name ’: ’ R O U T E _ R E C O R D ’, ’ set ’: None , ’ d i s p l a y ’: False }
42 }
43
44 r e s p _ r u l e = {
45 # D e f a u l t Resp ( d i s p l a y : False )
46 0: {’ name ’: ’ RESULT ’, ’ get ’: r e s p _ m s g . g e t _ r e s u l t _ m e s s a g e , ’ d i s p l ay ’: False } , 47 1: {’ name ’: ’ E X P E R I M E N T A L _ R E S U L T ’, ’ get ’: r e s p _ m s g . g e t _ e x p e r i m e n t a l _ r e s u l t _ m e s s a g e , ’ d i s p l a y ’: False } , 48 2: {’ name ’: ’ E R R O R _ M E S S A G E ’, ’ get ’: r e s p _ m s g . g e t _ e r r o r _ m e s s a g e , ’ d i s p l a y ’: False } , 49 3: {’ name ’: ’ E R R O R _ D I A G N O S T I C ’, ’ get ’: r e s p _ m s g . g e t _ e r r o r _ d i a g n o s t i c _ m e s s a g e , ’ d i s p la y ’: True } , 50 51 # S p e c i f i c Resp ( d i s p l a y : True ) 52 4: {’ name ’: ’ S E S S I O N _ I D ’, ’ get ’: r e s p _ m s g . g e t _ s e s s i o n _ i d , ’ d i s p l a y ’: True } ,
53 5: {’ name ’: ’ DRMP ’, ’ get ’: None , ’ d i s p l a y ’: False } , 54 6: {’ name ’: ’ V E N D O R _ S P E C I F I C _ A P P L I C A T I O N _ I D ’, ’ get ’:
None , ’ d i s p l a y ’: False } ,
55 7: {’ name ’: ’ A U T H _ S E S S I O N _ S T A T E ’, ’ get ’: r e s p _ m s g . g e t _ a u t h _ s e s s i o n _ s t a t e , ’ d i s p l a y ’: False } ,
56 8: {’ name ’: ’ O R I G I N _ H O S T ’, ’ get ’: r e s p _ m s g . g e t _ o r i g i n _ h o s t , ’ d i s p l a y ’: True } ,
57 9: {’ name ’: ’ O R I G I N _ R E A L M ’, ’ get ’: r e s p _ m s g . g e t _ o r i g i n _ r e a l m , ’ d i s p l a y ’: True } ,
58 10: {’ name ’: ’ O C _ S U P P O R T E D _ F E A T U R E S ’, ’ get ’: None , ’ d i s p l a y ’: False } ,
59 11: {’ name ’: ’ OC_OLR ’, ’ get ’: None , ’ d i s p l a y ’: False } ,
60 12: {’ name ’: ’ S U P P O R T E D _ F E A T U R E S ’, ’ get ’: None , ’ d i s p l a y ’: False } , 61 13: {’ name ’: ’ A U T H E N T I C A T I O N _ I N F O ’, ’ get ’: r e s p _ m s g . g e t _ a u t h e n t i c a t i o n _ i n f o , ’ d i s p l a y ’: True } , 62 14: {’ name ’: ’ U E _ U S A G E _ T Y P E ’, ’ get ’: r e s p _ m s g . g e t _ u e _ u s a g e _ t y p e , ’ d i s p l a y ’: True } , 63 64 # ...
65 15: {’ name ’: ’ AVP ’, ’ get ’: None , ’ d i s p l a y ’: False } , 66 16: {’ name ’: ’ F A I L E D _ A V P ’, ’ get ’: None , ’ d i s p l a y ’:
False } ,
67 17: {’ name ’: ’ P R O X Y _ I N F O ’, ’ get ’: None , ’ d i s p l a y ’: False } ,
68 18: {’ name ’: ’ R O U T E _ R E C O R D ’, ’ get ’: None , ’ d i s p l a y ’: False }
69 }
70 return req_msg , resp_msg , req_rule , re q_rule_size , r e s p _ r u l e
Figura 5.7 – Implementação da mensagem AIR
5.2.1 Templates
Nesta aplicação, as mensagens Diameter são representadas no formato JSON. Alguns exemplos são apresentados a seguir:
5.2.2 CER/CEA
As figuras 9.5 e 9.6 apresentam os templates para as mensa- gens de Capabilities Exchange Request (CER) e Capabilities Exchange Answer (CEA) da interface Diameter Base Protocol.
1 {
2 " m e s s a g e ": " Capabilities - Exchange - R e q u e s t ", 3 " i n t e r f a c e ": " b a s e _ r f c 6 7 3 3 ",
4 " avps ": [
5 {
7 " value ": " xxx . xxxxx . xxxx "
8 } ,
9 {
10 " name ": " origin - realm ", 11 " value ": " xxx . xxxxx . xxxx " 12 } , 13 { 14 " name ": " Host - IP - A d d r e s s ", 15 " value ": " xxx . xxx . xxx . xxx " 16 } , 17 { 18 " name ": " Vendor - Id ", 19 " value ": 1 20 } , 21 {
22 " name ": " Product - Name ", 23 " value ": " xxx . xxx . xxx "
24 } ,
25 {
26 " name ": " Inband - Security - Id ", 27 " value ": 1 28 } , 29 { 30 " name ": " Firmware - R e v i s i o n ", 31 " value ": 1 32 } , 33 {
34 " name ": " Vendor - Specific - Application - Id ", 35 " value ": [ 36 { 37 " name ": " Vendor - Id ", 38 " value ": 1 39 } , 40 {
41 " name ": " Auth - Application - Id ", 42 " value ": 1
43 }
44 ]
45 } ,
46 {
47 " name ": " Auth - Application - Id ", 48 " value ": 1
49 }
50 ]
51 }
Figura 5.8 – Capabilities Exchange Request (CER)
1 {
2 " m e s s a g e ": " Capabilities - Exchange - Answer ", 3 " i n t e r f a c e ": " b a s e _ r f c 6 7 3 3 ",
4 " avps ": [
5 {
6 " name ": " Result - Code ", 7 " value ": 2001
8 } ,
9 {
10 " name ": " origin - host ", 11 " value ": " xxx . xxx . xxx "
12 } ,
13 {
14 " name ": " origin - realm ", 15 " value ": " xxx . xxx . xxx " 16 } , 17 { 18 " name ": " Host - IP - A d d r e s s ", 19 " value ": " xxx . xxx . xxx . xxx " 20 } , 21 { 22 " name ": " Vendor - Id ", 23 " value ": x 24 } , 25 {
26 " name ": " Product - Name ", 27 " value ": " py - d i a m e t e r "
28 } ,
29 {
30 " name ": " Acct - Application - Id ", 31 " value ": x
32 } ,
33 {
34 " name ": " Auth - Application - Id ", 35 " value ": x
36 } ,
37 {
38 " name ": " Supported - Vendor - Id ", 39 " value ": xxxxx
40 } ,
41 {
42 " name ": " Vendor - Specific - Application - Id ", 43 " value ": [ 44 { 45 " name ": " Vendor - Id ", 46 " value ": xxxxx 47 } , 48 {
49 " name ": " Auth - Application - Id ", 50 " value ": x x x x x x x x
51 }
52 ]
53 } ,
54 {
56 " value ": 1
57 } ,
58 {
59 " name ": " Supported - Vendor - Id ", 60 " value ": xxxxx
61 } ,
62 {
63 " name ": " Vendor - Specific - Application - Id ", 64 " value ": [ 65 { 66 " name ": " Vendor - Id ", 67 " value ": xxxxx 68 } , 69 {
70 " name ": " Auth - Application - Id ", 71 " value ": 4
72 }
73 ]
74 } ,
75 {
76 " name ": " Supported - Vendor - Id ", 77 " value ": xxx
78 } ,
79 {
80 " name ": " Vendor - Specific - Application - Id ", 81 " value ": [ 82 { 83 " name ": " Vendor - Id ", 84 " value ": xxx 85 } , 86 {
87 " name ": " Auth - Application - Id ", 88 " value ": xxxxx 89 } 90 ] 91 } , 92 { 93 " name ": " Firmware - R e v i s i o n ", 94 " value ": 1 95 } 96 ] 97 }
Figura 5.9 – Capabilities Exchange Answer (CEA)
5.2.3 DWR/DWA
As figuras 9.7 e 9.8 apresentam os templates para as mensa- gens de Device Watchdog Request (DWR) e Device Watchdog Answer
(DWA) da interface Diameter Base Protocol. 1 { 2 " m e s s a g e ": " Device - Watchdog - R e q u e s t ", 3 " i n t e r f a c e ": " b a s e _ r f c 6 7 3 3 ", 4 " avps ": [ 5 {
6 " name ": " origin - host ", 7 " value ": " xxx . xxx . xxx "
8 } ,
9 {
10 " name ": " origin - realm ", 11 " value ": " xxx . xxx . xxx "
12 } ,
13 {
14 " name ": " Origin - State - Id ", 15 " value ": 1
16 }
17 ]
18 }
Figura 5.10 – Device Watchdog Request (DWR)
1 {
2 " m e s s a g e ": " Device - Watchdog - Answer ", 3 " i n t e r f a c e ": " b a s e _ r f c 6 7 3 3 ",
4 " avps ": [
5 {
6 " name ": " Result - Code ", 7 " value ": 2001
8 } ,
9 {
10 " name ": " origin - host ", 11 " value ": " xxx . xxx . xxx "
12 } ,
13 {
14 " name ": " origin - realm ", 15 " value ": " xxx . xxx . xxx "
16 }
17 ]
18 }
Figura 5.11 – Device Watchdog Answer (DWA)
5.2.4 AIR/AIA
As Figura 9.9 apresenta o template para a mensagem de Authen- tication Information Request (AIR) da interface S6a. Não foi gerado
um template para a mensagem de Authentication Information Answer (AIA). 1 { 2 " m e s s a g e ": " A u t h e n t i c a t i o n - Information - R e q u e s t ", 3 " i n t e r f a c e ": " S6a ", 4 " avps ": [ 5 { 6 " name ": " Session - Id ", 7 " type ": " string ", 8 " value ": " X X X X X X X X X X X X " 9 } , 10 {
11 " name ": " auth - session - state ", 12 " value ": {
13 " name ": " Auth - Session - State ", 14 " value ": " N O _ S T A T E _ M A I N T A I N E D "
15 } ,
16 " type ": " enum "
17 } ,
18 {
19 " name ": " Destination - Realm ", 20 " type ": " string ",
21 " value ": " epc . mnc0xx . mccxx .3 g p p n e t w o r k . org "
22 } ,
23 {
24 " name ": " User - Name ", 25 " type ": " string ", 26 " value ": " X X X X X X X X X X X X X X X " 27 } , 28 { 29 " name ": " Visited - PLMN - Id ", 30 " type ": " string ", 31 " value ": " xxxxx " 32 } , 33 {
34 " name ": " Origin - Host ", 35 " type ": " string ", 36 " value ": " epc . XXX . com "
37 } ,
38 {
39 " name ": " Origin - Realm ", 40 " type ": " string ",
41 " value ": " epc . XXX .3 g p p n e t w o r k . org "
42 } ,
43 {
44 " name ": " Requested - EUTRAN - A u t h e n t i c a t i o n - Info ", 45 " value ": [
46 {
47 " name ": " Number - Of - Requested - V e c t o r s ", 48 " value ": 2
49 } ,
50 {
51 " name ": " Immediate - Response - P r e f e r r e d ", 52 " value ": 1 53 } 54 ] 55 } 56 ] 57 }
Figura 5.12 – Authentication Information Request (AIR)
5.2.5 IDR/IDA
A Figura 9.10 apresenta um template a mensagem de Insert Subscriber Data Request (IDR) da interface S6a. Não foi gerado um template para a mensagem de Insert Subscriber Data Answer (IDA).
1 {
2 " m e s s a g e ": " Insert - Subscriber - Data - R e q u e s t ", 3 " i n t e r f a c e ": " S6a ", 4 " avps ": [ 5 { 6 " name ": " Session - Id ", 7 " type ": " string ", 8 " value ": " x x x x x x x x x x " 9 } , 10 {
11 " name ": " auth - session - state ", 12 " value ": {
13 " name ": " Auth - Session - State ", 14 " value ": " N O _ S T A T E _ M A I N T A I N E D "
15 } ,
16 " type ": " enum "
17 } ,
18 {
19 " name ": " Origin - Host ", 20 " type ": " string ", 21 " value ": " xxx . xxx . xxx "
22 } ,
23 {
24 " name ": " Origin - Realm ", 25 " type ": " string ",
26 " value ": " epc . xxxx .3 g p p n e t w o r k . org "
27 } ,
28 {
29 " name ": " Destination - Host ", 30 " type ": " string ",
31 " value ": " epc . mncXXX . mccXXX .3 g p p n e t w o r k . org "
32 } ,
33 {
34 " name ": " Destination - Realm ", 35 " type ": " string ",
36 " value ": " epc . mncXXX . mccXXX .3 g p p n e t w o r k . org "
37 } ,
38 {
39 " name ": " User - Name ", 40 " type ": " string ",
41 " value ": " X X X X X X X X X X X X X X X "
42 } ,
43 {
44 " name ": " Subscription - Data ", 45 " value ": [...]
46 }
47 ]
48 }
Figura 5.13 – Insert Subscriber Data Request (IDR)
5.2.6 ULR/ULA
A Figura 9.11 apresenta um template a mensagem de Update Location Request (ULR) da interface S6a. Não foi gerado um template para a mensagem de Update Location Answer (ULA).
1 { 2 " m e s s a g e ": " Update - Location - R e q u e s t ", 3 " i n t e r f a c e ": " S6a ", 4 " avps ": [ 5 { 6 " name ": " Session - Id ", 7 " type ": " string ", 8 " value ": " x x x x x x x x x x x x " 9 } , 10 {
11 " name ": " auth - session - state ", 12 " value ": {
13 " name ": " Auth - Session - State ", 14 " value ": " N O _ S T A T E _ M A I N T A I N E D "
15 } ,
16 " type ": " enum "
17 } ,
18 {
19 " name ": " Origin - Host ", 20 " type ": " string ",
22 } ,
23 {
24 " name ": " Origin - Realm ", 25 " type ": " string ",
26 " value ": " epc . xxx .3 g p p n e t w o r k . org "
27 } ,
28 {
29 " name ": " Destination - Realm ", 30 " type ": " string ",
31 " value ": " epc . mncXXX . mccXXX .3 g p p n e t w o r k . org "
32 } ,
33 {
34 " name ": " User - Name ", 35 " type ": " string ",
36 " value ": " x x x x x x x x x x x x x x x "
37 } ,
38 {
39 " name ": " RAT - Type ", 40 " value ": {
41 " name ": " RAT - Type ", 42 " value ": " EUTRAN "
43 } ,
44 " type ": " enum "
45 } ,
46 {
47 " name ": " ULR - Flags ", 48 " value ": 2 49 } , 50 { 51 " name ": " Visited - PLMN - Id ", 52 " type ": " string ", 53 " value ": " xxxxx " 54 } 55 ] 56 }
Figura 5.14 – Update Location Request (ULR)
5.2.7 Limitações
Como algumas interfaces não são suportadas pelo Diameter Ser- ver, nem todas as mensagens e interfaces foram testadas.
Figura 24 – Insert Subscriber Data Request (IDR) - Sem resposta
6.3 ATAQUE DE DOS COM ULR
Conforme apresentado na Figura 25, o atacante representou um parceiro MME e envia uma mensagem de ULR para o HSS. O HSS aciona um CLR e o envia ao MME que o serve para desconectar o UE da rede.
Figura 27 – Cancel Location Request (CLR)
6.4 ANÁLISE COMPORTAMENTAL
A proximidade dos dispositivos móveis com a rotina da vida diá- ria das pessoas e o avanço na exploração de ataques nas redes móveis, abrem diversas possibilidades na análise e modelagem do contexto das informações coletadas, tais como contiguidade de dados e informações de localização. Essas informações podem ser muito úteis para analisar o comportamento humano. Os dados de proximidade sem fio podem fornecer informações importantes sobre a vida cotidiana e as rotinas de um indivíduo.
Padrões repetitivos encontrados em dados de proximidade tam- bém podem mostrar as rotinas de longo prazo de uma pessoa. Existem diversos estudos na área do comportamento humano e da computação ubíqua que podem ser aplicados aos dados coletados com a exploração das vulnerabilidades encontradas na rede SS7 e no protocolo Diameter. Com a extração dos dados de localização de um assinante, não só seria possível definir sua trajetória ao longo do tempo, mas também ao enriquecer os dados com fontes externas, tais como redes sociais, clima e eventos, seria possível delimitar ações e comportamentos.
7 CONCLUSÃO
7.1 CONSIDERAÇÕES FINAIS
Este trabalho teve como objetivo analisar o comportamento do protocolo Diameter na rede LTE em um ambiente fim-a-fim. Inicial- mente foram analisadas as vulnerabilidades da rede em quatro cenários diferentes, variando-se as informações de entrada e a abordagem. Com isso, verificou-se a possibilidade de explorar ataques utilizando o pro- tocolo Diameter, usando funções de interoperabilidade, o que por sua vez permitiria a um invasor negar serviços a assinantes segmentados, capturar as chaves de criptografia do assinante e rastrear a localização dos usuários por meio das redes móveis.
Neste projeto foi possível fornecer uma compreensão mais abran- gente das características de segurança do protocolo Diameter. Foram abordadas diferentes formas de exploração da sinalização por Diameter para uma rede LTE,
O Diameter está substituindo gradualmente o protocolo de si- nalização SS7. Embora existam muitas vantagens na sinalização por Diameter, a segurança padrão fornecida pelo protocolo ainda não é su- ficiente para fazer do LTE uma rede resistente a ataques. Enquanto as interconexões de roaming garantem uma forma econômica de fornecer serviços móveis em escala global, é importante implementar medidas adicionais de segurança na rede de interconexão para proteger os usuá- rios contra violações de privacidade e segurança.
Os ataques de testados exploram as vulnerabilidades identifica- das nos protocolos de transferência LTE e na arquitetura SON. Esses ataques também podem desativar serviços de rede para um determi- nado conjunto de assinantes em uma área alvo ou fazer o downgrade dos assinantes para usar serviços de rede 2G e 3G menos seguros, que possibilitariam outros tipos de ataques.
7.2 FUTUROS TRABALHOS
Novos cenários podem ser explorados com expansão desta im-