• Nenhum resultado encontrado

Fake WLAN Access Points in 3G-WLAN Interworking

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-

Documentos relacionados