Уязвимость в протоколе Wi-Fi Protected Setup

Discussion in 'Беспроводные технологии/Wi-Fi/Wardriving' started by gpuhash, 30 Dec 2011.

  1. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    При наличии физического доступа к железке (или к рубильнику :D), надо бы её поперезагружать и сперва удостовериться, действительно ли N1=F(time), а затем собрать все возможные варианты E-Hash1 и E-Hash2 для некого N1 (к примеру, на 30-й секунде после старта) и убедившись, что их не слишком много, побрутить их все.

    UP
    @4Fun, поглядел я свои логи, где pixi отработал в mode3, и у меня ВСЕГДА ES1=ES2, а N1 младше как минимум на секунду. Но если без бага эта точка уязвима, тогда ведь можно юзать mode3 по полной, не полагаясь на то, что N1=ES* (или Вы так и делаете?)
     
    #4861 Isica, 15 Nov 2020
    Last edited: 15 Nov 2020
  2. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    704
    Reputations:
    10
    Так и делал. Написал программку для генерации E-S1,2 на основе генератора случайных чисел из Realtek, нашёл seed N1, прибавлял к нему несколько секунд (от 1 до 5), поучал E-S1,2 и проверял их с помощью самописного брутфорсера. Кстати, по вашему совету расширил набор проверяемых символов до
    Code:
    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r
    Но пока что никакого результата.
     
  3. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
    Можно поправить это место в бинарнике wsc
    https://github.com/drygdryg/Tenda-A...Space/cbb/src/wps/rtk/src/txpkt.c#L2856-L2857
    Code:
    TagSize = strlen(pCtx->manufacturer);
    pMsg = add_tlv(pMsg, TAG_MANUFACTURER, TagSize, (void *)pCtx->manufacturer);
    
    на
    Code:
    TagSize = strlen(pCtx->pin_code);
    pMsg = add_tlv(pMsg, TAG_MANUFACTURER, TagSize, (void *)pCtx->pin_code);
    
    Там два байта всего. И вместо manufacturer будет виден pin.
     
    4Fun and Isica like this.
  4. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Но я Вам советовал не совсем это, точнее даже совсем не это:
    или
    Также обратите внимание, что в моей последней цитате, вариант "затем" не перекрывает "сперва" (при желании, их можно поменять местами, но не исключить первый).

    UP
    На перебор всех вариантов из 4 символов, с вашей реализацией потребуется ~21 час.
    Но, повторюсь, СНАЧАЛА желательно проверить строки "\x00\x00\x00\x00" и "\xFF\xFF\xFF\xFF", затем эти же строки, но длиной от 1 до, скажем, 256 символов (бОльшая длина менее вероятна и не факт, что корректно пройдёт через HMAC), и только потом приступать к полному перебору (что, скорее всего, не понадобится).
    А DeltaSeed я бы пробовал в такой последовательности: 1,2,3,0,4,5...
     
    #4864 Isica, 17 Nov 2020
    Last edited: 17 Nov 2020
  5. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Походу, вопрос: а как собрать pixi под Винду?
    И что есть mode 2,4,5 (eCos*) и где они подробно описаны?
     
    #4865 Isica, 17 Nov 2020
    Last edited: 17 Nov 2020
  6. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,716
    Likes Received:
    10,185
    Reputations:
    126
    MinGW.
     
    Isica likes this.
  7. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    704
    Reputations:
    10
    Попытаюсь перебрать все размещения байтов (от 0 до 255), если хватит терпения и времени :) Проблемка в том, что это займёт действительно много времени на одном ядре (256^1+256^2+256^3+256^4=4311810304 комбинаций), и, как говорил @binarymaster, разумно было бы модифицировать Hashcat для этих целей (насколько это сложно, не знаю), но пока что у меня нет совместимого с ним железа.
     
    #4867 4Fun, 17 Nov 2020
    Last edited: 17 Nov 2020
  8. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Т.е., строки "\x00\x00\x00\x00" и "\xFF\xFF\xFF\xFF" Вы уже пробовали, и они не подошли?


    Для каких целей? В нашем случае, когда E-Hash1=E-Hash2, достаточно ОДИН РАЗ сбрутить этот "ПИН" (точнее, халф), ибо он будет одинаковым для всех глючных устройств.
     
    #4868 Isica, 17 Nov 2020
    Last edited: 17 Nov 2020
  9. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
    Вы же можете попросить у 4Fun хеши, и самостоятельно проверить эти идеи.
     
  10. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    704
    Reputations:
    10
    Попробую в скором времени, в первую очередь их, разумеется.
    Спасибо за совет, сделал: пропатчил бинарник wscd, глядя на исходники, нашёл смещение от pCtx для пин-кода и заменил им смещение manufacturer. Но возникла проблема при запаковке прошивки: на этом роутере SquashFS, причём не простая, а с вендорскими патчами от Realtek: для распаковки добрые люди создали набор патчей для unsquashfs, а вот чтобы запаковать, я использую обычную mksquashfs, и в итоге роутер не принимает прошивку, где ФС запакованна ею.
    Code:
    $ binwalk -e netis\(WF2419\)-V2.2.41694.bin
    
    DECIMAL       HEXADECIMAL     DESCRIPTION
    --------------------------------------------------------------------------------
    11280         0x2C10          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2371584 bytes
    633954        0x9AC62         Squashfs filesystem, big endian, version 2.0, size: 2280896 bytes, 417 inodes, blocksize: 65536 bytes, created: 2017-05-16 06:29:47
    
    Code:
    $ binwalk firmware_with_patched_wscd.bin
    
    DECIMAL       HEXADECIMAL     DESCRIPTION
    --------------------------------------------------------------------------------
    11280         0x2C10          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2371584 bytes
    633954        0x9AC62         Squashfs filesystem, little endian, version 4.0, compression:gzip, size: 2724689 bytes, 394 inodes, blocksize: 65536 bytes, created: 2020-11-17 20:23:55
    
    Возможно, нужно попробовать более старую версию mksquashfs (текущая генерирует файлы версии 4.0, а в роутере 2.0), буду экспериментировать.
    РЕД: попробовал собрать более старые версии squashfs-tools из исходников — они просто отказываются собираться с современным компилятором в современном окружении. Видимо, придётся искать какой-нибудь старый дистрибутив либо SDK.
     
    #4870 4Fun, 17 Nov 2020
    Last edited: 17 Nov 2020
    altblitz likes this.
  11. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
    Лучше ориентироваться на первый вызов strlen() в send_wsc_M1() и send_wsc_M3(). А не на структуры в исходниках. Там два числа 0xae43(manufacturer) и 0xadb4(pin) для прошивки версии V2.2.41694, до патча wscd md5: d7bd12a5304c4d28a96e70a853ccbee4
    Firmware mod kit вроде бы распаковывает / запаковывает, но там еще в конце есть контрольная сумма, которую надо пересчитать. Алгоритм такой-же как здесь (id хидеров другие): https://forum.antichat.ru/threads/480969/#post-4422553 Я бы предложил сначала просто распаковать, запаковать не модифицируя, пересчитать crc, залить в роутер, если всё ок - заливать патченную.
     
    #4871 VasiliyP, 17 Nov 2020
    Last edited: 18 Nov 2020
  12. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
    У меня такой результат, предлагаю для сверки с вашим: https://0x0.st/i5VS.7z .
     
  13. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    704
    Reputations:
    10
    Сверил wscd в вашей прошивке с пропатченным мною — MD5 совпадают.
    Перепаковал прошивку, только заменив wscd, собрал с помощью squqashfs-2.1 из firmware-mod-kit (я вижу, вы тоже этой же версией запаковали) — размер образа squashfs вышел на 400 КиБ больше, чем оригинальный. Перепакованная прошивка: https://transfiles.ru/07i03
    Вижу, что у вас размер перепакованной ФС близок к оригинальной, как вы её запаковывали?
     
    #4873 4Fun, 18 Nov 2020
    Last edited: 18 Nov 2020
  14. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
    Запаковывал firmware-mod-kit. У вас просто образ squqashfs получился, а в прошивке ещё хидеры должны быть, как в оригинале, и firmware-mod-kit должна была об этом позаботится. У меня так, во всяком случае.
     
  15. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Походу, заметил в pixi странную фичу: Seed ES1 зачем-то ищется в обе стороны от Seed N1 (а не только вперёд), что вдвое замедляет работу:
    Code:
    [DEBUG] src/pixiewps.c: 948:main(): Debugging enabled
    [DEBUG] src/pixiewps.c: 951:main(): Mode is auto (no --mode specified)
    [DEBUG] src/pixiewps.c: 977:main(): Modes: 3 (RTL819x), 0 (), 0 (), 0 (), 0 ()
    [DEBUG] src/pixiewps.c:1128:main(): Trying with E-S1: 10d4d83e4e9a19b97470e4d14515c3a2
    [DEBUG] src/pixiewps.c:1128:main(): Trying with E-S1: 10d4d83e4e9a19b97470e4d14515c3a2
    [DEBUG] src/pixiewps.c:1245:main(): * Mode: 3 (RTL819x)
    [DEBUG] src/pixiewps.c:1278:main(): Start: 1606071849 (Sun Nov 22 19:04:09 2020 UTC)
    [DEBUG] src/pixiewps.c:1281:main(): End: 0 (Thu Jan 1 00:00:00 1970 UTC)
    [DEBUG] src/pixiewps.c: 117:crack_thread_rtl(): Seed N1 found (1604666682)
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666682
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666683
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666681
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666684
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666680
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666685
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666679
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666686
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666678
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666687
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666677
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666688
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666676
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666689
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666675
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666690
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666674
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666691
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666673
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666692
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666672
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666693
    [DEBUG] src/pixiewps.c: 389:find_rtl_es1(): Trying Seed E-S1: 1604666671^C
    
    Это баг, или такое где-то бывает нужно?
     
  16. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    @VasiliyP, @4Fun
    Коль уж патчите прошивку, хорошо бы сделать, чтобы M5 отправлялся при любом (невалидном) пине, и посмотреть точный ES1
     
  17. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    704
    Reputations:
    10
    Так задумано
    upload_2020-11-21_9-48-58.png
    Как видите, если вы перебираете полный диапазон дат, в качестве старта выбирается дата, несколько выше текущей (Sun Nov 22 19:04:09 2020 UTC в вашем логе).
     
  18. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Да, но это утверждение из другой оперы: диапазон дат (заданный ключами --force, --[c]statr/end или +-сутки по умолчанию) используется только при поиске seed-N1.
    А seed-ES1 всегда, независимо от параметров, ищется в диапазоне (seed-N1 +- MODE3_TRIES), т.е., +- 10 минут.

    Так что мой вопрос "это баг, или фича?" остаётся в силе и сводится к вопросу:
    существуют ли в природе дивайсы, у которых seed-ES1 < seed-N1 (в mode3)?
    Прошу всех, кто в курсе, прояснить эту ситуацию.
     
    #4878 Isica, 21 Nov 2020
    Last edited: 21 Nov 2020
  19. VasiliyP

    VasiliyP Elder - Старейшина

    Joined:
    30 Aug 2011
    Messages:
    363
    Likes Received:
    670
    Reputations:
    11
  20. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    172
    Likes Received:
    119
    Reputations:
    1
    Здесь боролись за расширение диапазона (увеличили константу MODE3_TRIES), и эффект был достигнут, но опять же, в директном направлении. А о целесообразности направления ретроградного там вроде ни слова. Или я невнимательно прочитал?

    PS
    Поскольку такое поведение явно предусмотрено авторами, тогда это уже не баг, а идеоголическая ошибка. Что не снимает вопроса.