#! /bin/bash
# fichier executable de type bash unix
# copier par CPUPDATE Netstart ...
#NC imcp.ba@trousperdu.org imcp.ba@free.fr IMCP Blandy Alain
# ce petit pogramme en mode ligne de commande
# permet de verifier le protcole d'authentification chap md5 pppoe
# entre la box FAI a tester et le modem de transmission
#
# Il suffit d'enregistrer, avec un hub les echanges entre ces deux periferiques,
# ( entre la box du fai et le modem )
# par un programme de dump pppoe ..
# d'isoller plus particulierement les trames CHAP (challeng et reponse ok)
# et de les passer en parametres d'appel a ce programme
#
# ce programme vous indiquera alors, si le mots de passe suppose,
# que le fai vous a donne, et vraiment utilise tel quel par la box
# (sans aucune modificationn malhonnete) !
#
# A partir du vraie password il sera alors possible
# de supprimer et remplacer entierement la box de ce fai la !
# MISE EN OEUVRE :
#
# COPIER COLLER TEL QUEL CE SOURCE DANS UN FICHIER
#
# RENDRE LE FICHIER EXECUTABLE : chmod +x ....
#
# TAPPER LE NOM DU FICHIER EN LIGNE DE COMMANDE
# sans aucun parametres
# suivre les instructions du pg ...
#ECHO='/bin/echo'; #fonctionn globale (ne marche pas toujour)
ECHO='echo'; #fonction interne au shel(la sepcification -n -e "\x02" ne passe pas toujours)
# afficher un caractere a partir de son code hexadecimal !!!!!!!!!!!!!!!!!!!!!!!!
#chaque version de sh n'est pas d'accord avec interpretation -n -e !!!!!!!!!!!!!!!!!!!!!!!!
# adapter la ligne precedante pour avoir la resultat voulu !!!!!!!!!!!!!!!!!!!!!!!!
# 'A' a la commande suivante $ECHO -n -e "\x41" !!!!!!!!!!!!!!!!!!!!!!!!
OD='od -t x1'; #appel de octal dump affichage de controle (ou test) en hexa
MD5SUM='md5sum'; #appel de calcul hash md5 reponse en hexa minuscule : a adapter si SAH...
MG='<'; # > #MG est le caractere inferieur
MD='>'; # #MD est le caractere superieur
function controlhexa
{
#verifis qu'un octet est bien represente par deux digit hexa 01 02 34
stat=''; #global variable resultat lie a info
local contid="`$ECHO -n -e \"\x$1\" | $OD | (read a b c; echo $b)`" ; # affichage de controle en fead back
if test "$contid" != "$1"; then
stat="$info incorrect byte digit format \"$1\" ";
fi;
}
function controlchalleng #applique la procedure de controle des rfc
{
# soit les parmetres en entre
# idhexa='02'
# challenghexa='968f04a ... '; #(sur paires de caractere hexa minuscule) le challeng transmis par ISP
# reponse='30cc4 ...'; #en hexa minuscule !!!!! la reponse donne par la box
# pass='huburoi'; #le password suppose
#les parametre en entre globaux ne sont pas modifie par cette fonction
#sortie :
# variable globale code
# 0 : pour password ok
# 1 : password incorrect
# autre : erreur programme
echo --------------------------------
echo --------------------------------
# mise ne forme des data du dump !!!!!
# la transmission en CHAP se fait en binnaire ( rfc1994 ):
#Description 1 byte 1 byte 2 bytes 1 byte Variable variable
#Challenge Code = 1 ID Length Challenge Length Challenge value Name
#Response Code = 2 ID Length Response Length Response value Name
#Success Code = 3 ID Length Message
#Failure Code = 4 ID Length Message
# mais l'outil de dump le represente en haxadecimal
# on donne les parametres d'appels au programme directement dans le format de dump !!!
code='99'; #unknow erreur
# on doit le transcoder le ${MG}challengenhexa${MD} en notation \xy compatible echo -E
echo " Soit le challeng : "
echo -E "[CHAP Challenge id=0x$idhexa ${MG}$challenghexa${MD}, ...";
# mise en forme et controle des data : identite
local stat='identite vide';
local info='Dans la champ identite :'; #en cas erreur hexa
controlhexa $idhexa;
if test "$stat" != ''; then #malformed string identite
echo "
$stat
( Deux digits hexa Minuscules attendus ( un octet ) !)
Arret du sous programme de controle
";
code='2';
return;
fi;
# mise ne forme des data : challeng
stat='challeng vide'; # un automate qui reponds a un challeng
# ne devrais pas accepte un challeng trop court
# et limiter le nombre essai
# ( en cas de spoofing fai )
info='Dans la string de challeng :' #en cas erreur hexa dans controlhexa
local result=''; #variable a mettre a jour sous format compatible echo \xFE\xFD
local str="$challenghexa"; #copie restante a explorer
while true; do # extraire la string par groupe de deux caracteres
local HE="`expr substr \"$str\" 1 2`"; #extraire les deux premier digit !!!!!
if test "$HE" == ''; then break ; fi; #fin de string
controlhexa $HE; if test "$stat" != ''; then break ; fi; #verifier format deux a deux
result="${result}\x${HE}"; #format compatible echo \xFE !!!!!
str="`expr substr \"$str\" 3 200`"; #pour continuer assembler le reste de la ligne !!!!!
#normalement il y a un nombre pair de caracteres dans la string
done;
if test "$stat" != ''; then #malformed string challenghexa
echo "
$stat
( suite de paires de digits hexa Minuscules attendus !)
Arret du sous programme de controle
";
code='3'; #return code
return;
fi;
$ECHO -n -e $result | $OD ; # affichage de controle puisque tous va bien
echo --------------------------------
#soit le password :
#
# il peut y avoir un pb si le pass est binaire,
# a cause de cette faiblesse, bien souvant les fai chossisent
# d'utiliser comme password une string genneree par un base64
# ( ce qui conduit a avoir des chiffres et des lettres minuscules et maguscules,
# bien verifier alors, les zero les lettres O o les un les i les 1 .... )
echo " Soit le password \"$pass\" :";
$ECHO -n -E "$pass" | $OD ; # affichage de controle en octal
echo --------------------------------
# on fabrique une reponse composite ( pasword avant challend ! )
echo " On fabrique une string composite,
en concatenant : id , le_secret et le_challeng : "
$ECHO -n -e "\x${idhexa}${pass}${result}" | $OD ; # affichage de controle en octal
echo --------------------------------
echo " On calcule le hash md5 de la string composite ";
#######################################
# il suffit d'une seule ligne :
hach="`$ECHO -n -e \"\x${idhexa}${pass}${result}\" | $MD5SUM |( read a b; echo $a)`"; #calcul effectif !!!!!
# on constate qe le sel ou le challeng est apres le password
#######################################
# Dans les controles chap ppp c'est le concentrateur qui fait le boulot
# en utilisant souvant un serveur de signature de type Radius
# le FAI ne fait que renseigner au prealable le serveur de signature
# ( au moins une fois en souscrivant abonnement ) !
# et on transmettre sont hach a isp
echo " Et on transmet la reponse CHAP calculee : "
echo " [CHAP Response id=0x$idhexa ${MG}$hach${MD}, ...";
echo --------------------------------
echo " Qui devrais etre egal a ${MG}$reponse${MD} ?"
if test "$hach" == "$reponse"; then
echo -e "LE PASSWORD TESTE EST LE BON !!!!!!!!!!!\a\a\a";
code='0';
else
echo "LE PASSWORD TESTE N'EST LE BON ???? ";
code='1';
fi;
echo --------------------------------
echo --------------------------------
}
#EXEMPLE D'UTILISATION
echo -n "
Programme $0
de controle d'un challeng CHAP MD5
Avant tous verifier que sur la ligne suivante apparais un \"A\" tous seul
\"";
$ECHO -n -e "\x41";
echo '"
( sinon raparametrer le source ECHO de ce programme )
';
if test "$1" == ''; then #help de demonstration
idhexa='02'; # sur deux caracteres hexa
challenghexa='968f04a89a76b9e83f418b8151fd7597'; # en hexa pair
reponse='9b5ba81b5d0c7e207663ed6e0268db74';
echo "
HELP
Ce programme en ligne de commande
qaund on lui donne un challeng de type :
#rcvd [CHAP Challenge id=0x${idhexa} ${MG}${challenghexa}${MD}, name = \"99-031-002\"]
connaisant le password suppose, il calcule ou verifis la reponse :
#sent [CHAP Response id=0x${idhexa} ${MG}${reponse}${MD}, name = \"R-PAP-tagada_17292@fai.net\"]
le format est compatible avec un dump pppoe :
on peut en mode debug de pppd
recuperer les info dans les fichier /var/log/syslog
(grep \\\\[CHAP /var/log/syslog )
idem avec tcpdump -i eth0 -n |grep -i chap
(voir aussi ethereal)
si la reponse ne correspond pas, alors le password teste n est pas le bon !
RQ : octet id doit etre rentree sur la forme de deux caracteres hexa (un octet)
01 ou 02 ou 03 ....
en cas de challengs multiples sur une cession donne
id permet de differentier les questions et les reponses
rfc1994
Ce petit programme permet de verifier sur un dump de la liaison
que le password que vous a fournis le FAI
et celui utiliser effectivement par sa box
sont strictement identiques (pas de prefix ni de suffixe ....)
et suivent la rfc1994
A partir de la vous pourrez gerrer directement les ppp
a supprimer la box du FAI pour mettre la votre !
EXEMPLE EN COURS :
";
pass='EXPRESSION FAVORITE DU PERE UBU EN SIX LETTRES'; #pass='m....e';
#appel de demo pour ewpliquer le fonctinnement
controlchalleng ; #appel de demo
echo "
usage
$0 'codeid' 'challenghexa' 'reponse' 'passwordatester' ;
#pour introduire des caracteres bizzares dans le password utiliser les \` \`
";
else #appel normal hors help
idhexa="$1"; # a donner sur deux caracteres hexa idhexa='02'
challenghexa="$2"; #challenghexa='968f04a ... '; #sur paires de caractere hexa
reponse="$3"; #reponse='30cc4 ...';
pass="$4"; #pass='huburoi';
controlchalleng;
fi;
# dans tous les cas
echo "Ligne de commande equivalente a cet exemple (en copier coller):
$0 '$idhexa' '$challenghexa' '$reponse' '$pass' ;
"
exit $code; #pour mettre a jour la variable shell $?
# ceci n'est qu'un exemple de programme
# que vous pouvez faire evoluer ...
# Du fait que controlchalleng ne modifis pas les parametres d'appel
# on peut ameliore le programme et faire une boucle d'appel
# qui fait une recurence d'appel de controlchalleng
# sur des variantes du mots de pass (prefixe suffixe ...)
# et qui s'arrete des que c'est ok (code retour egal a 0)
# for i in a b c d aa az ; do #generre les variantes
# pass="$i$4"; controlchalleng; if test "$code" == '0'; then break; fi
# done
# On peut aussi envoyer des defis succesifs a la box ....
# ou aussi l'isoller totalement du modem
# et ne lui transmettre que les defis CHAP
# en simulant le protcole PADT
# et en retournant ces reponses a la bs !
# Mais le plus simple, si le mot de passe
# que vous a transmis votre FAI, n'est pas le bon,
# et de changer de FAI !!!
# IMCP Blandy Alain imcp.ba@free.fr http://www.trousperdu.org
|