Вот так выглядит реализация 24 бит пина в Тендах (https://github.com/drygdryg/Tenda-AC/blob/master/bcm/src/ecos/router/tenda_httpd_ucd/wps.c) Code: iPin = ptr[3] * 256 * 256 + ptr[4] * 256 + ptr[5]; //printf("[%c][%c][%c]\n", ptr[3] , ptr[4] ,ptr[5] ); iPin = iPin % 10000000; //printf("pin=%u\n", iPin); checksum = ComputeChecksum( iPin ); iPin = iPin*10 + checksum; sprintf(devPwd, "%08u", iPin); printf("eth0 mac: %s\n", if_hw); printf("Generate new WPS PIN = %s, oldpin= %s\n", devPwd, nvram_get("wps_device_pin")); nvram_set("wps_device_pin", devPwd);
Ну, из этого я и исходил. Но статистика--вещь упрямая! Выходит, просто постеснялись переступить черту? А ведь подошли совсем близко: Code: MariaDB [Tenda]> select max(NIC10) from TendaAll where (PIN=NIC10); +------------+ | max(NIC10) | +------------+ | 9757206 | +------------+ 1 row in set (0.08 sec) Впрочем, некоторые модели и так уместились целиком: Code: MariaDB [Tenda]> select count(*) n24,t2.n nAll,Model from TendaAll join (select Model,count(*) n from TendaAll group by Model)t2 using(Model) where PIN=NIC10 group by Model order by n desc; +-------+-------+-------------------------------------------------+ | n24 | nAll | Model | +-------+-------+-------------------------------------------------+ | 13839 | 92571 | Tenda 11N Wireless Router | | 2001 | 2001 | Tenda Wireless-N Router | | 1230 | 1230 | Tenda Wireless-N Router (rebranded) | | 175 | 175 | Tenda 3G 11N Router | | 7 | 141 | | | 72 | 74 | Tenda 11N wireless broadband router | | 59 | 59 | Tenda Wireless-N Router (Pentagram rebranded) | | 1 | 42 | Tenda Realtek Router, firmware: V11.13.01.11_en | | 29 | 29 | Tenda Wireless-N Router (Samsung rebranded) | | 1 | 4 | GoAhead-Webs (proxy server) | | 1 | 1 | Seems to be TP-LINK TL-WR740N | +-------+-------+-------------------------------------------------+ 11 rows in set (0.42 sec) , но на счёт пресловутой 'Tenda 11N Wireless Router' есть сомнения. И вообще, что это за "модель" такая, в которую входит куча разношерстных устройств? Почему оно так? Ранний RS не умел определять подробности?
Потому что в этом китайском гуано, модели нет нигде. Косвенно можно было угадать только по версии прошивки, да и то не факт что точно. У тенда реалтек такая же болезнь. Быстрая гуглежка нашла вот что https://github.com/MikimotoH/DLink_Harvester/blob/master/tenda_filelist.csv Список прошивок, и устройств, к которым они предназначаются. Одинаковая версия для разных устройств оптимизма не внушает, так что и по версии прошивки сложно угадать, что есть что.
RouterScan их если и увидит, то только через вкладку wireless audit, а не в классическом сканировании по сети. И увидит он там... То, что прикреплено, это 5 разных моделей, наверное, с разными OUI.
Дефолтные настройки от Реалтека которые китайцы не поменяли(RTL8xxx и не только ) или общее название без конкретики(Tenda Wireless AP -Ecos - под этим названием куча моделей от Тенды скрываются). У самих китайцев из Тенды если верить исходным кодам. Рабочая среда выглядит примерно так; "http://192.168.100.233:18080/svn/EC...odes/Branches/NH325_old_platform/BCM5357_1X8/" Это примечание было найдено здесь;https://github.com/drygdryg/Tenda-AC/tree/master/rtk/userSpace Если кратко: у китайцев бардак.
Выгрузка с необработанными Тендами + инструменты для работы с необработанной выгрузкой(фильтрация, сортировка), а также инструменты для работы с алгоритмом(генерация дельт) https://mega.nz/file/TjhxjLTZ#5Jvs2WcN-krwQfhiR69_znW3JLw8GNMhhGGwkLOh2L0
Похоже что я нашёл локальную генерацию пин-кода в Тендах(не 24 бит пин), а также проверку пин-кода может натолкнет на какие то мысли. Ковырял дамп с Tenda AC9. Если кто захочет поковырять прошивку то проверка пина находится здесь: squashfs-root/lib/libcommon, локальная генерация пина здесь: squashfs-root/lib/libpti. На картинках псевдокод сформированный Гидрой, к нему привязыватся не стоит сильно. На всякий случай апну
Если вкратце, то эта функция просто генерирует рандомный пин через функцию srand(). Если предположить, что псевдорандом предсказуемый, можно немного сократить время поиска пина, если знать примерную дату, когда он был сгенерирован. Также можно будет для известных пинов прогнать этот алгоритм и вычислить их даты генерации. Лапша ниже из умножений на 3 и магических констант - это рассчёт контрольной суммы.
Любопытно, откуда взят этот список: Code: tenda_static = ('03436080', '03436165', '03974247', '06966409', '09278325', '19967899', '25086164', '25563818', '25777390', '27334737', '35806691', '45304347', '50542208', '63410372', '63491838', '71294988', '74250226')
Ручная выборка, эти точки сложно не заметить. Их как мусора, в буквальном смысле. Больший интерес представляет то, что это за точки и почему так? Но они обработаны, с выгрузки удалены дубли bssid с разными wps pin.
Та вроде не удалены: Code: MariaDB [Tenda]> select count(*) from (select count(distinct(PIN)) nPINs from raw2020_2 group by MAC having nPINs>1) t; +----------+ | count(*) | +----------+ | 5265 | +----------+ 1 row in set (0.35 sec) MariaDB [Tenda]> select MAC,count(distinct(PIN)) nPINs from raw2020_2 group by MAC having nPINs>2; +-------------------+-------+ | MAC | nPINs | +-------------------+-------+ | C8:3A:35:01:49:80 | 3 | | C8:3A:35:01:50:D8 | 3 | | C8:3A:35:02:91:A0 | 3 | | C8:3A:35:02:91:F0 | 3 | | C8:3A:35:02:BA:D8 | 3 | | C8:3A:35:02:BB:E8 | 3 | | C8:3A:35:02:C0:C0 | 3 | | C8:3A:35:02:C3:B0 | 3 | | C8:3A:35:02:DA:00 | 3 | | C8:3A:35:02:DB:40 | 3 | | C8:3A:35:03:09:C0 | 3 | | C8:3A:35:03:27:F0 | 3 | | C8:3A:35:03:28:B8 | 3 | | C8:3A:35:03:9A:A0 | 3 | | C8:3A:35:03:FA:C8 | 3 | | C8:3A:35:04:97:98 | 3 | | C8:3A:35:04:B5:40 | 3 | | C8:3A:35:04:EB:78 | 3 | | C8:3A:35:05:06:98 | 3 | | C8:3A:35:05:1C:70 | 3 | | C8:3A:35:05:3F:D8 | 3 | | C8:3A:35:05:4F:90 | 3 | | C8:3A:35:05:51:28 | 3 | | C8:3A:35:05:6E:B0 | 3 | | C8:3A:35:05:D2:98 | 3 | | C8:3A:35:06:CD:E8 | 3 | | C8:3A:35:08:47:F8 | 3 | | C8:3A:35:08:77:38 | 3 | | C8:3A:35:08:9B:F8 | 3 | | C8:3A:35:09:11:00 | 3 | | C8:3A:35:09:1D:28 | 3 | | C8:3A:35:09:4A:A0 | 3 | | C8:3A:35:0A:88:F8 | 3 | | C8:3A:35:0B:BD:60 | 3 | | C8:3A:35:0B:CF:18 | 3 | | C8:3A:35:0D:25:28 | 3 | | C8:3A:35:0D:A8:A8 | 3 | | C8:3A:35:0E:94:60 | 3 | | C8:3A:35:0E:DF:98 | 3 | | C8:3A:35:0F:A9:B8 | 3 | | C8:3A:35:15:43:F8 | 3 | | C8:3A:35:16:04:48 | 3 | | C8:3A:35:16:AA:38 | 3 | | C8:3A:35:16:D6:E0 | 3 | | C8:3A:35:17:90:C0 | 3 | | C8:3A:35:18:A3:E8 | 3 | | C8:3A:35:19:57:08 | 3 | | C8:3A:35:19:9C:90 | 3 | | C8:3A:35:19:AC:98 | 3 | | C8:3A:35:1C:69:10 | 3 | | C8:3A:35:1C:6C:70 | 4 | | C8:3A:35:1C:9E:50 | 4 | | C8:3A:35:1C:F5:90 | 3 | | C8:3A:35:1D:0B:D0 | 3 | | C8:3A:35:1D:4B:38 | 3 | | C8:3A:35:1D:5F:30 | 3 | | C8:3A:35:1D:77:38 | 3 | | C8:3A:35:1D:78:00 | 4 | | C8:3A:35:1F:3E:78 | 3 | | C8:3A:35:1F:F1:F8 | 3 | | C8:3A:35:20:39:90 | 3 | | C8:3A:35:22:09:F0 | 3 | | C8:3A:35:22:D9:60 | 3 | | C8:3A:35:24:EE:30 | 3 | | C8:3A:35:25:02:E0 | 3 | | C8:3A:35:25:0C:60 | 3 | | C8:3A:35:25:BB:38 | 3 | | C8:3A:35:26:06:10 | 3 | | C8:3A:35:26:0D:B0 | 3 | | C8:3A:35:26:67:30 | 3 | | C8:3A:35:26:7C:90 | 3 | | C8:3A:35:26:A3:D8 | 3 | | C8:3A:35:26:B9:68 | 3 | | C8:3A:35:26:C1:C0 | 3 | | C8:3A:35:26:FF:C8 | 3 | | C8:3A:35:26:FF:D8 | 4 | | C8:3A:35:27:15:A0 | 4 | | C8:3A:35:27:1B:58 | 3 | | C8:3A:35:27:23:90 | 3 | | C8:3A:35:27:2A:F8 | 3 | | C8:3A:35:27:9D:70 | 3 | | C8:3A:35:27:AB:60 | 3 | | C8:3A:35:27:DC:E0 | 3 | | C8:3A:35:27:F8:D0 | 3 | | C8:3A:35:2A:6D:B8 | 3 | | C8:3A:35:2A:8A:F8 | 3 | | C8:3A:35:2B:5C:C8 | 3 | | C8:3A:35:2B:69:68 | 3 | | C8:3A:35:2C:A2:48 | 3 | | C8:3A:35:2D:74:68 | 3 | | C8:3A:35:2D:F5:10 | 3 | | C8:3A:35:2E:85:E8 | 3 | | C8:3A:35:2E:9F:58 | 3 | | C8:3A:35:2E:D8:08 | 3 | | C8:3A:35:2E:DC:58 | 3 | | C8:3A:35:2E:E2:70 | 3 | | C8:3A:35:2E:F5:E0 | 3 | | C8:3A:35:2F:00:68 | 3 | | C8:3A:35:30:A9:38 | 3 | | C8:3A:35:30:E6:A0 | 3 | | C8:3A:35:31:05:48 | 3 | | C8:3A:35:31:A9:D8 | 3 | | C8:3A:35:32:2D:88 | 3 | | C8:3A:35:32:F3:C8 | 3 | | C8:3A:35:33:23:A8 | 3 | | C8:3A:35:33:85:98 | 3 | | C8:3A:35:33:96:A0 | 3 | | C8:3A:35:33:AF:B8 | 3 | | C8:3A:35:33:CA:58 | 3 | | C8:3A:35:33:EE:98 | 3 | | C8:3A:35:33:EF:70 | 3 | | C8:3A:35:33:F6:00 | 3 | | C8:3A:35:34:10:90 | 3 | | C8:3A:35:34:36:98 | 3 | | C8:3A:35:34:37:C0 | 3 | | C8:3A:35:34:3B:A8 | 3 | | C8:3A:35:34:69:90 | 3 | | C8:3A:35:34:F2:E0 | 3 | | C8:3A:35:35:04:C0 | 3 | | C8:3A:35:38:0C:68 | 3 | | C8:3A:35:38:53:F0 | 3 | | C8:3A:35:39:F4:80 | 3 | | C8:3A:35:3A:A9:A8 | 3 | | C8:3A:35:3A:CA:00 | 3 | | C8:3A:35:3A:E2:80 | 3 | | C8:3A:35:3A:F4:D8 | 3 | | C8:3A:35:3A:F4:E8 | 3 | | C8:3A:35:3A:F5:00 | 3 | | C8:3A:35:3A:FA:00 | 4 | | C8:3A:35:3A:FB:E0 | 3 | | C8:3A:35:3B:05:90 | 3 | | C8:3A:35:3B:19:90 | 3 | | C8:3A:35:3B:1D:28 | 3 | | C8:3A:35:3B:21:08 | 3 | | C8:3A:35:3B:3C:08 | 3 | | C8:3A:35:3B:3C:A0 | 4 | | C8:3A:35:3B:3D:40 | 3 | | C8:3A:35:3B:4F:20 | 3 | | C8:3A:35:3B:4F:28 | 3 | | C8:3A:35:3B:4F:48 | 3 | | C8:3A:35:3B:5F:10 | 3 | | C8:3A:35:3B:7D:B0 | 3 | | C8:3A:35:3B:A3:88 | 3 | | C8:3A:35:3D:42:C8 | 3 | | C8:3A:35:3D:EA:00 | 3 | | C8:3A:35:3E:2F:C0 | 3 | | C8:3A:35:3E:79:C0 | 3 | | C8:3A:35:3F:7A:98 | 3 | | C8:3A:35:41:43:78 | 3 | | C8:3A:35:41:BD:B8 | 3 | | C8:3A:35:44:FC:D0 | 3 | | C8:3A:35:45:12:A1 | 3 | | C8:3A:35:45:37:F0 | 3 | | C8:3A:35:45:7F:40 | 3 | | C8:3A:35:45:DE:38 | 3 | | C8:3A:35:45:EF:10 | 3 | | C8:3A:35:45:F1:58 | 3 | | C8:3A:35:45:F9:30 | 3 | | C8:3A:35:46:16:20 | 3 | | C8:3A:35:46:22:D0 | 3 | | C8:3A:35:46:22:E0 | 3 | | C8:3A:35:47:53:D8 | 3 | | C8:3A:35:47:94:D8 | 3 | | C8:3A:35:47:E8:D8 | 3 | | C8:3A:35:48:2D:80 | 3 | | C8:3A:35:48:BF:38 | 3 | | C8:3A:35:49:52:F0 | 3 | | C8:3A:35:49:C2:18 | 3 | | C8:3A:35:49:C5:30 | 3 | | C8:3A:35:49:F0:A0 | 3 | | C8:3A:35:49:F2:00 | 3 | | C8:3A:35:4A:51:C0 | 3 | | C8:3A:35:4A:53:98 | 3 | | C8:3A:35:4B:9A:C0 | 3 | | C8:3A:35:4E:2A:20 | 3 | | C8:3A:35:4E:BA:D0 | 3 | | C8:3A:35:4E:E0:80 | 3 | | C8:3A:35:4F:4B:C0 | 3 | | C8:3A:35:4F:5D:D8 | 3 | | C8:3A:35:50:3F:A1 | 7 | | C8:3A:35:50:AF:08 | 3 | | C8:3A:35:51:BC:F8 | 3 | | C8:3A:35:51:D5:B0 | 3 | | C8:3A:35:52:4E:20 | 3 | | C8:3A:35:52:58:58 | 3 | | C8:3A:35:52:F1:40 | 3 | | C8:3A:35:53:F5:B8 | 3 | | C8:3A:35:55:10:90 | 3 | | C8:3A:35:55:50:58 | 3 | | C8:3A:35:55:64:78 | 3 | | C8:3A:35:58:5A:28 | 3 | | C8:3A:35:58:B4:10 | 3 | | C8:3A:35:59:B3:58 | 3 | | C8:3A:35:5A:89:30 | 3 | | C8:3A:35:5A:B2:38 | 3 | | C8:3A:35:5B:6F:30 | 3 | | C8:3A:35:5B:80:B0 | 3 | | C8:3A:35:5B:DF:E8 | 3 | | C8:3A:35:5C:4D:F8 | 3 | | C8:3A:35:5C:63:F8 | 3 | | C8:3A:35:5C:9A:A8 | 3 | | C8:3A:35:5C:9D:98 | 3 | | C8:3A:35:5D:4E:E8 | 3 | +-------------------+-------+ 203 rows in set (0.34 sec) Или их должно быть больше?
Если Вы или кто-то другой уже составили табличку с вероятными началами серий, было бы любопытно на неё взлянуть. Также приветствуются альтернативные базы, составленные по стикерам или из лично вскрытых устройств, пусть даже крохотного размера, но с высокой достоверностью того, что пин дефолтный.
Ручная выборка по базе. Выборку не обрабатывал. Так как она не очищена даже от паролей. Cтатика же. Или намёк на то что алгоритм используется и для генерации статичного пинкода ?
О сейчас будет весело... Code: seed rand pin unique mostly 4 1968078 19680781 3 ZyXEL VMG1312-B10B 9 4444549 44445492 4 D-Link DSL-6740U 10 1215069 12150694 2 D-Link DSL-6740U 11 1989311 19893112 21 D-Link DSL-6740U, Micro DSL 12 1687063 16870635 507 Micro DSL, Tenda ADSL2/2+, D-Link DSL-6740U 13 1358590 13585907 950 Micro DSL, D-Link DSL-2750U, DSL-2650U, DSL-2640NRU 14 2146406 21464065 7511 Micro DSL, DSL-2640NRU, DSL-2750U, DSL-2650U, DSL-2740NRU, DSL-2640U 15 7622990 76229909 15940 ! Broadcom 3 16 4626484 46264848 19872 ! Broadcom 2 17 1227918 12279180 4078 Micro DSL, D-Link DSL-2640U, DSL-2640NRU, DSL-2600U, DSL-2740U, DSL-2740NRU, DSL-2750U 18 1995168 19951683 7424 Micro DSL, D-Link DSL-2640U, DSL-2640NRU, DSL-2600U, DSL-2740U, NETGEAR JDGN1000 ADSL Router 19 6232714 62327145 14761 ! Broadcom 4 20 3195719 31957199 4342 ! Broadcom 6 21 1086411 10864111 8232 ! Broadcom 5 22 1857631 18576313 3612 Micro DSL, D-Link DSL-2640NRU, DSL-2640U, DSL-2600U, DSL-2650NRU, DSL-2740NRU 23 1562469 15624697 17884 Micro DSL, D-Link DSL-2640NRU, DSL-2640U, DSL-2600U, DSL-2650U, DSL-2740U 24 1883648 18836486 10682 Micro DSL, D-Link DSL-2650U, DSL-2640U, DSL-2750U, DSL-2640NRU 25 2017252 20172527 15105 ! Broadcom 1 26 1708421 17084215 9501 Micro DSL, D-Link DSL-2640U, DSL-2740U, DSL-2650U, DSL-2750U 27 1416980 14169809 3587 Micro DSL, D-Link DSL-2640U, DSL-2740U, DSL-2650U, DSL-2650NRU 28 1110582 11105824 1467 Micro DSL, D-Link DSL-2640U, DSL-2650NRU, DSL-2740U, DSL-2750U 29 1881172 18811728 4418 Micro DSL, D-Link DSL-2640U, DSL-2650NRU, DSL-2740U, DSL-2650U 30 4938505 49385052 7986 Micro DSL, D-Link DSL-2640U, DSL-2740U, DSL-2650U, DSL-2640NRU 31 1271565 12715657 3946 Micro DSL, D-Link DSL-2640U, DSL-2650U, DSL-2640NRU, DSL-2750U 32 9656711 96567111 2064 Micro DSL, D-Link DSL-2640U, DSL-2740U, DSL-2650U Теперь мы знаем, откуда берутся статичные Broadcom пины! Из этих данных также можно понять, какие модели доходят до генерации пин кода быстрее (за меньшее кол-во секунд от начала загрузки при сбросе настроек), а какие медленнее.
Я подобный алгоритм видел не только у Тенд но и на TP-Link от старых на Атеросе до новых на Медиатеке. Для роутера D-LINK DSL-2640U2 Как раз D-LINK DSL-2640U попал под твою выборку
Псевдокод на php: PHP: function genChecksum($pin){ $pin %= 10000000; $a = 0; $t = $pin; while ($t) { $a += 3 * ($t % 10); $t = (int)($t / 10); $a += $t % 10; $t = (int)($t / 10); } return ($pin * 10) + ((10 - ($a % 10)) % 10);}for ($seed = 1; $seed < 1000; $seed++){ srand($seed); $r = rand(); /* Алгоритм подразумевает использование старших разрядов числа */ while ($r > 10000000) $r = (int)($r / 10); $pin = genChecksum($r); $res = QuerySql("SELECT id FROM base WHERE WPSPIN = $pin GROUP BY BSSID ORDER BY id DESC"); if ($res->num_rows > 0) { echo "$seed $r $pin " . $res->num_rows . "\r\n"; } $res->close();} При желании можно переписать на C, функции в точности те же.
Но это ещё не всё. Старые туполинки с ssid TP-LINK_XXXXXX. К таким роутерам в комплекте ишла программа(EasySetupAssistant) которая генерировала рандомный пароль для них. В 2013 году один человек восстановил примерный алгоритм генерации пароля. Алгоритм оказался не очень уж и рандомным. Этот алгоритм очень похож на алгоритм генерации пинкода в туполинках который я нашёл в http сервере туполинка Вполне возможно что китайцы из TP-LINK использовали или используют один и тот же алгоритм для генерации пароля и пинкода. ссылка ниже разбор генератора, разбор короткий и лаконичный https://github.com/AlexAltea/blog/blob/master/posts/2013-03-08-wpa2-vulnerability-tplink/_main.md
У меня получается совсем не та последовательность: seed=1, rand=32422 seed=2, rand=19731 seed=3, rand=7040 seed=4, rand=27117 seed=5, rand=14426 seed=6, rand=1735 seed=7, rand=21812 seed=8, rand=9121 seed=9, rand=29198 seed=10, rand=16507 seed=11, rand=3816 seed=12, rand=23893 seed=13, rand=11202 seed=14, rand=31279 seed=15, rand=18588 seed=16, rand=5897 seed=17, rand=25974 seed=18, rand=13283 seed=19, rand=592 seed=20, rand=20669 .... php 5.3; код: Code: for ($seed = 1; $seed < 1000; $seed++) { srand($seed); $r = rand(); /* Алгоритм подразумевает использование старших разрядов числа */ while ($r > 10000000) $r = (int)($r / 10); echo "seed=$seed, rand=$r<br>\n"; }