Surveillance des routes par Juniper (7.1)

La nouvelle version de Juniper Network Connect (7.1) ne change pas grand chose à la surveillance des routes :(
Ainsi, la nouvelle version du patch anti-surveillance de routes est incorporée à mimikatz (et ne prend plus en charge la version 7.0)

Pour plus de précisions dans le service dsNcService :

  • Remplacer {0x83, 0xec, 0x1c, 0x55, 0x8b, 0xe9}; // 7.0 // 83 ec 1c 55 8b e9
  • ou bien {0x83, 0xec, 0x14, 0x53, 0x8b, 0xd9}; // 7.1 // 83 ec 14 53 8b d9
  • par : {0xb0, 0x01, 0xc2, 0x04, 0x00}

nc71

Surveillance des routes par Juniper

Le composant Juniper Network Connect est fréquemment utilisé pour se connecter, via VPN, au système d’information de son organisation.
Ce dernier offre une multitude de fonctionnalités, dont une très pratique : la redirection du réseau du poste vers le SI.

La redirection peut se faire en plusieurs points, mais le principal reste la table de routage modifiée à la connexion :

Ce que Juniper peut nous imposer suite à une connexion

===========================================================================
Liste d'Interfaces
0x1 ........................... MS TCP Loopback interface
0x2 ...00 03 ff 91 17 83 ...... Carte Fast Ethernet PCI à base de Intel 21140 (Générique) - Miniport d'ordonnancement de paquets
0x3 ...00 ff 98 8c 03 82 ...... Juniper Network Connect Virtual Adapter - Miniport d'ordonnancement de paquets
===========================================================================
===========================================================================
Itinéraires actifs :
Destination réseau    Masque réseau  Adr. passerelle   Adr. interface Métrique
          0.0.0.0          0.0.0.0   [ip attribuée]  [ip attribuée]	  1
          0.0.0.0          0.0.0.0    192.168.0.254   192.168.0.246	  20
   [ip attribuée]  255.255.255.255        127.0.0.1       127.0.0.1	  10
   10.255.255.255  255.255.255.255   [ip attribuée]  [ip attribuée]	  10
   [ip organisme]  255.255.255.255    192.168.0.254   192.168.0.246	  1
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1	  1
      192.168.0.0    255.255.255.0    192.168.0.246   192.168.0.246	  20
      192.168.0.0    255.255.255.0   [ip attribuée]  [ip attribuée]	  1
    192.168.0.246  255.255.255.255        127.0.0.1       127.0.0.1	  20
    192.168.0.255  255.255.255.255    192.168.0.246   192.168.0.246	  20
        224.0.0.0        240.0.0.0    192.168.0.246   192.168.0.246	  20
        224.0.0.0        240.0.0.0   [ip attribuée]  [ip attribuée]	  1
  255.255.255.255  255.255.255.255   [ip attribuée]  [ip attribuée]	  1
  255.255.255.255  255.255.255.255    192.168.0.246   192.168.0.246	  1
Passerelle par défaut :     [ip attribuée]
===========================================================================
Itinéraires persistants :
  Aucun

Il est important de visualiser :

  • les rajouts de routes vers la passerelle Juniper (via l’ip attribuée) avec une métrique plus faible que la route originale
  • la conservation de la connexion avec la passerelle de l’organisme (notre entreprise) via une route unique et explicite vers l’ip de l’organisme (c’est la seule connexion passant encore en dehors du VPN)
  • l’impossibilité de se connecter à son réseau interne ou à internet

La solution trop évidente…

route add 10.0.0.0 mask 255.0.0.0 [ip attribuée]
route delete 0.0.0.0 mask 0.0.0.0 [ip attribuée]
route delete 192.168.0.0 mask 255.0.0.0 [ip attribuée]
  1. rajout d’une route vers le réseau de notre organisme via le VPN.
  2. suppression de la passerelle par défaut passant par le VPN, l’on récupère celle d’origine.
  3. suppression de la route vers le réseau interne qui voulait passer par le VPN, l’on récupère celle d’origine.

Surveillé…

Le service Juniper surveille (par boucle d’environ 5s) la table de routage courante et peut couper la connexion dès détection d’une modification :
nc_routemon
loin d’être un bogue, c’est une mesure de sécurité décrite par Juniper : http://kb.juniper.net/InfoCenter/KB15829

Le code

Grâce à un import bien particulier du service :

00475110     GetIpForwardTable                                    IPHLPAPI

… et aux belles traces pouvant être remontées :

.rdata:0047AAA8 00000075 C Route to destination %u.%u.%u.%u is missing mask %u.%u.%u.%u with gw %u.%u.%u.%u, metric %d, if_id %d, disconnecting
.rdata:0047AB20 0000007A C Unauthorized new route to %u.%u.%u.%u/%u.%u.%u.%u has been added (conflicts with our route to %u.%u.%u.%u), disconnecting

…l’on retrouve facilement la routine de vérification appelée périodiquement :

0415D30 sub_415D30      proc near               ; DATA XREF: .rdata:0047A838o
.text:00415D30
.text:00415D30 var_1C          = dword ptr -1Ch
.text:00415D30 var_18          = dword ptr -18h
.text:00415D30 var_14          = dword ptr -14h
.text:00415D30 var_10          = dword ptr -10h
.text:00415D30 var_C           = dword ptr -0Ch
.text:00415D30 var_8           = dword ptr -8
.text:00415D30 var_4           = dword ptr -4
.text:00415D30
.text:00415D30                 sub     esp, 1Ch
.text:00415D33                 push    ebp
.text:00415D34                 mov     ebp, ecx
.text:00415D36                 cmp     dword ptr [ebp+40h], 0
.text:00415D3A                 mov     [esp+20h+var_14], ebp
.text:00415D3E                 mov     byte ptr [esp+20h+var_1C+3], 0
.text:00415D43                 jnz     short loc_415D7F
.text:00415D45                 push    offset aNoRoutesToMoni ; "no routes to monitor"
.text:00415D4A                 push    offset aRmon    ; "rmon"
.text:00415D4F                 push    199h
.text:00415D54                 push    offset a_Routemon_cpp ; ".\\routemon.cpp"
...

Évitons cette routine après tout ?

nc_noroutemon

Cette fois-ci, après modifications de la table de routage sans déconnexions, les communications fonctionnent vers tous les réseaux :)

…une fois de plus, ça sera dans mimikatz 1.0.