Auteur Sujet: Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12)  (Lu 1472 fois)

0 Membres et 1 Invité sur ce sujet

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 242
  • Hauts-de-Seine
Bonjour,

Voici un script, basé sur un autre trouvé dans ce forum, pour générer les options nécessaires pour Orange sur un routeur Mikrotik.
Il est nécessaire d'avoir la version de ROS 7.12 car avec cette version nous avons la transformation MD5 native. Il est nécessaire de le modifier pour mettre le bon usr/pswd.

:local genOrangeAuthHex do={

################
#### [conf] ####
################

:local USERNAME "fti/XASDFXX"
:local PASSWORD "XYZXYZXYZ"

#################
#### [/conf] ####
#################

:local md5sum do={
:local md5result ""
:local input $1;
:set md5result [:convert "$input" transform=md5 to=hex];
return $md5result;
}

:local hex2str do={
:local retStr ""
:local input $1;
:set retStr [:convert "$input" to=raw from=hex ];
:return $retStr
}

:local RANDSTRING [:rndstr length=16 from="0123456789ABCDEF" ]
:local RANDCHAR [:rndstr length=1 from="0123456789ABCDEF" ]

:local retStr ""

:set retStr ( $retStr . [$hex2str "00000000000000000000001A0900000558010341"] )
:set retStr ( $retStr . [$hex2str "010D"] . $USERNAME )
:set retStr ( $retStr . [$hex2str "3C12"] . $RANDSTRING )
:set retStr ( $retStr . [$hex2str "0313"] . $RANDCHAR )
:set retStr ( $retStr . [$hex2str [$md5sum ($RANDCHAR . $PASSWORD . $RANDSTRING)]] )

:return [:convert "$retStr" to=hex from=raw ]
}

# Generate new auth chain
:local authchain [$genOrangeAuthHex]

:local dhcpIpv4OptId [/ip/dhcp-client/option/find where code="90"]
:local dhcpIpv6OptId [/ipv6/dhcp-client/option/find where code="11"]

:if ( [:len $dhcpIpv4OptId] = 1 ) do={
:local newVal ""
:set newVal ( $newVal . "0x" . $authchain )
/ip/dhcp-client/option set [:pick $dhcpIpv4OptId 0] value=$newVal
:log info "DHCPv4 (client): New Orange authentification code (option 90)."
}

:if ( [:len $dhcpIpv6OptId] = 1 ) do={
:local newVal ""
:set newVal ( $newVal . "0x" . $authchain )
/ipv6/dhcp-client/option set [:pick $dhcpIpv6OptId 0] value=$newVal
:log info "DHCPv6 (client): New Orange authentification code (option 11)."
}

« Modifié: 09 novembre 2023 à 14:26:21 par fttmeh »

Gnubyte

  • Abonné Orange Fibre
  • *
  • Messages: 1 062
  • Toulon (83)
    • HSGMII intégriste
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #1 le: 28 août 2023 à 11:48:14 »
merci beaucoup  :D

halesk2k

  • Abonné Sosh fibre
  • *
  • Messages: 57
  • Brétigny-sur-Orge (91)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #2 le: 30 août 2023 à 20:20:20 »
La classe, merci.  8)

A exécuter à chaque renew dhcp-client.

/ip/dhcp-client/set 0 script=genOrangeAuthHex

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 242
  • Hauts-de-Seine
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #3 le: 31 août 2023 à 10:04:27 »
La classe, merci.  8)

A exécuter à chaque renew dhcp-client.

/ip/dhcp-client/set 0 script=genOrangeAuthHex

Il faut faire attention à une race condition si l'on utiliser IPv4 et IPv6. Le serveur DHCPv4 et DHCPv6 attend la même chaine d'authentification et executer le script de changement des chaines d'authent peut les changer entre deux requêtes.

Pour éviter le problème, je change la chaine d'authentification tous les jours via le scheduler.

halesk2k

  • Abonné Sosh fibre
  • *
  • Messages: 57
  • Brétigny-sur-Orge (91)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #4 le: 31 août 2023 à 10:08:57 »
Il faut faire attention à une race condition si l'on utiliser IPv4 et IPv6. Le serveur DHCPv4 et DHCPv6 attend la même chaine d'authentification et executer le script de changement des chaines d'authent peut les changer entre deux requêtes.

Pour éviter le problème, je change la chaine d'authentification tous les jours via le scheduler.

Le but de changer de chaîne d'authentification, c'est car en face, le système d'authentification est sencé faire de l'anti rejeu. Donc si tu changes tous les jours, tu n'aurais, en théorie, le droit de ne faire qu'une requête DHCP par jour, les autres requête étant drop par l'anti rejeu.

Sauf erreur, DHCPv4 et v6 attendent les mêmes paramètres, du genre le modèle de Livebox, mais pas l'authentification, puisque c'est justement le but ne pas jamais avoir la même.

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 242
  • Hauts-de-Seine
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #5 le: 31 août 2023 à 10:45:04 »
Tu as raison, c'est bien le but de la chaîne qui doit changer à chaque fois. Pour Orange, on peut toujours utiliser la même chaîne dès lors qu'elle est valide.

J'ai eu des problèmes pour mon renew DHCPv6 quand la chaîne n'était pas la même. Je fais des tests à nouveau.
« Modifié: 31 août 2023 à 14:30:05 par fttmeh »

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 242
  • Hauts-de-Seine
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #6 le: 31 août 2023 à 14:41:00 »
J'ai revu le script pour avoir un pour IPv4 et un autre pour IPv6, et les hooks pour faire changer la chaine d'authentification à chaque fois que les clients DHCP obtiennent une adresse ou prefixe.

/ip dhcp-client add comment="Orange IPv4" default-route-distance=10 dhcp-options=hostname,clientid,authsend,userclass,vendor-class-identifier interface=vlan832-wan script=":if (\$bound = 1) do={\r\
    \n\t/system/script/run generateOrangeAuthV4\r\
    \n}\r\
    \n" use-peer-dns=no use-peer-ntp=no

/ipv6 dhcp-client add add-default-route=yes comment="Orange IPv6" default-route-distance=10 dhcp-options=authsend,userclass,vendor-class-identifier dhcp-options=authsend,userclass,vendor-class-identifier interface=vlan832-wan pool-name=wan-pool6 rapid-commit=no request=prefix script=":if (\$\"pd-valid\" = 1) do={\r\
    \n\t/system/script/run generateOrangeAuthV6\r\
    \n}" use-interface-duid=yes use-peer-dns=no

/system script add dont-require-permissions=no name=func_genOrangeAuthHex policy=read,write source="################\r\
    \n#### [conf] ####\r\
    \n################\r\
    \n\r\
    \n:local USERNAME \"fti/XXXXXX\"\r\
    \n:local PASSWORD \"XXXXXX\"\r\
    \n\r\
    \n#################\r\
    \n#### [/conf] ####\r\
    \n#################\r\
    \n\r\
    \n:local md5sum do={\r\
    \n\t:local md5result \"\"\r\
    \n\t:local input \$1;\r\
    \n\t:set md5result [:convert \"\$input\" transform=md5 to=hex];\r\
    \n\treturn \$md5result;\r\
    \n}\r\
    \n\r\
    \n:local hex2str do={\r\
    \n\t:local retStr \"\"\r\
    \n\t:local input \$1;\t\t\r\
    \n\t:set retStr [:convert \"\$input\" to=raw from=hex ];\t\t\r\
    \n\t:return \$retStr\r\
    \n}\r\
    \n\r\
    \n:local RANDSTRING [:rndstr length=16 from=\"0123456789ABCDEF\" ]\r\
    \n:local RANDCHAR [:rndstr length=1 from=\"0123456789ABCDEF\" ]\r\
    \n\r\
    \n:local retStr \"\"\r\
    \n\r\
    \n:set retStr ( \$retStr . [\$hex2str \"00000000000000000000001A0900000558010341\"] )\r\
    \n:set retStr ( \$retStr . [\$hex2str \"010D\"] . \$USERNAME )\r\
    \n:set retStr ( \$retStr . [\$hex2str \"3C12\"] . \$RANDSTRING )\r\
    \n:set retStr ( \$retStr . [\$hex2str \"0313\"] . \$RANDCHAR )\r\
    \n:set retStr ( \$retStr . [\$hex2str [\$md5sum (\$RANDCHAR . \$PASSWORD . \$RANDSTRING)]] )\r\
    \n\r\
    \n:return [:convert \"\$retStr\" to=hex from=raw ]\r\
    \n"

/system script add dont-require-permissions=yes name=generateOrangeAuthV4 policy=read,write source="# Generate new auth chain\r\
    \n:local genOrangeAuthHex [:parse [/system/script get func_genOrangeAuthHex source ]]\r\
    \n\r\
    \n:local authchain [\$genOrangeAuthHex]\r\
    \n\r\
    \n:local dhcpIpv4OptId [/ip/dhcp-client/option/find where code=\"90\"]\r\
    \n\r\
    \n:if ( [:len \$dhcpIpv4OptId] = 1 ) do={\r\
    \n\t\t:local newVal \"\"\r\
    \n\t\t:set newVal ( \"0x\" . \$authchain )\r\
    \n\t\t/ip/dhcp-client/option set [:pick \$dhcpIpv4OptId 0] value=\$newVal\r\
    \n\t\t:log info \"DHCPv4 (client): New Orange authentification code (option 90).\"\r\
    \n}\r\
    \n"

/system script add dont-require-permissions=yes name=generateOrangeAuthV6 policy=read,write source="# Generate new auth chain\r\
    \n:local genOrangeAuthHex [:parse [/system/script get func_genOrangeAuthHex source ]]\r\
    \n\r\
    \n:local authchain [\$genOrangeAuthHex]\r\
    \n\r\
    \n:local dhcpIpv6OptId [/ipv6/dhcp-client/option/find where code=\"11\"]\r\
    \n\r\
    \n:if ( [:len \$dhcpIpv6OptId] = 1 ) do={\r\
    \n\t\t:local newVal \"\"\r\
    \n\t\t:set newVal ( \"0x\" . \$authchain )\r\
    \n\t\t/ipv6/dhcp-client/option set [:pick \$dhcpIpv6OptId 0] value=\$newVal\r\
    \n\t\t:log info \"DHCPv6 (client): New Orange authentification code (option 11).\"\r\
    \n}\r\
    \n"
« Modifié: 01 septembre 2023 à 11:48:20 par fttmeh »

halesk2k

  • Abonné Sosh fibre
  • *
  • Messages: 57
  • Brétigny-sur-Orge (91)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #7 le: 03 septembre 2023 à 21:48:27 »
Je me ferais un plaisir de tester dès que ROS 7.12 sors en stable!

yeocti

  • Abonné Sosh fibre
  • *
  • Messages: 211
  • Plougastel-Daoulas (29)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #8 le: 05 septembre 2023 à 20:10:44 »
J'ai revu le script pour avoir un pour IPv4 et un autre pour IPv6, et les hooks pour faire changer la chaine d'authentification à chaque fois que les clients DHCP obtiennent une adresse ou prefixe.

Bonjour,

Merci pour le partage :)

Avec cette version, si j'ai bien lu, on peu se retrouver avec des valeurs différentes pour les chaines d'authentification. Or, comme tu l'as rappelé, il faut que les valeurs soient identiques entre DHCPv4 et DHCPv6.
Une solution pour éviter les race condition pourrait être d'utiliser un système de verrou. On peut utiliser une variable globale et au tout début du script (celui du premier post), on vérifie si elle est initialisée ou pas.
Ca doit donner quelque chose comme ça (non testé) :

if ( $lockDhcpOpt = false ) do={
  :global lockDhcpOpt true

  ... script régénération option DHCP ...

  :global lockDhcpOpt false
}

On peut pousser le vice jusqu'à utiliser une variable pour stocker la "fraicheur de la chaine". Si on estime qu'elle est trop récente, on ne la régénère pas...

fttmeh

  • Abonné Orange Fibre
  • *
  • Messages: 242
  • Hauts-de-Seine
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #9 le: 05 septembre 2023 à 20:13:27 »
J'ai fait des tests et tant que les deux chaines (v4 et v6) sont valides, il n'y a pas de problème pour le RENEW. Je continue mon test pour vérifier si au prochain RENEW tout se passe bien.

halesk2k

  • Abonné Sosh fibre
  • *
  • Messages: 57
  • Brétigny-sur-Orge (91)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #10 le: 05 septembre 2023 à 21:20:37 »
La théorie

Le rejeu, c'est le fait qu'un attaquant sniff la phase d'authentification, et s'en serve pour se connecter à notre place en rejouant la trame sniffée.
L'anti-rejeu, c'est le fait que lorsqu'une authentification a été effectuée, le salt est blacklisté.
De ce fait, même si on se fait voler notre chaine d'authentification, l'attaquant ne pourra pas la réutiliser/la rejouer puisqu'elle est "grillée".

Donc par définition cette chaine d'authentification DOIT être différente à chaque requête d'authentification.

La pratique

Par rapport à ce que dit le gars d'Orange sur le thread.

Les options ...
- 60 en IPv4 / 16 en IPv6: vendor class identifer
- 61 en IPv4 / 1 en IPv6: client identifier
- 77 en IPv4 / 15 en IPv6: userclass
... DOIVENT être identiques entre IPv4 et IPv6. Sinon, Orange coupe la connexion.

Par contre, concernant donc les options 90 en IPv4 et 11 en IPv6, authsend, elles DOIVENT être différentes, entre IPv4 et IPv6, et à chaque requête. Je cite: "Concernant le CHAP challenge et idéalement le changer à chaque cycle complet DHCP quand on change le TransactionID DHCP4/6 (voir RFC)".

En réalité, l'anti-rejeu n'est pas actif coté Orange car il est quasiment impossible pour le commun des mortels de sniffer la trame d'authentification sur un arbre GPON, c'est pour ça qu'ils ne s'embête pas avec ce système d'anti-rejeu. Changer la chaine d'authentification à chaque requête, c'est juste pour la beauté du geste aujourd'hui, ou pour le cas où Orange activerait l'anti-rejeu un jour.

yeocti

  • Abonné Sosh fibre
  • *
  • Messages: 211
  • Plougastel-Daoulas (29)
Script pour générer options 90 (DHCPv4) et 11 (DHCPv6) (ROS 7.12b3)
« Réponse #11 le: 06 septembre 2023 à 16:53:25 »
La théorie
Donc par définition cette chaine d'authentification DOIT être différente à chaque requête d'authentification.

La pratique

Par contre, concernant donc les options 90 en IPv4 et 11 en IPv6, authsend, elles DOIVENT être différentes, entre IPv4 et IPv6, et à chaque requête. Je cite: "Concernant le CHAP challenge et idéalement le changer à chaque cycle complet DHCP quand on change le TransactionID DHCP4/6 (voir RFC)".

J'en étais resté au fait que les options 90 et 11 devaient être identiques puisque c'est ce que fait la Livebox.
Tant mieux si ça fonctionne lorsqu'elles sont différentes.