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

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

  1. TOX1C

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

    Joined:
    24 Mar 2012
    Messages:
    1,135
    Likes Received:
    1,931
    Reputations:
    24
    Ссылка утеряна несколько лет назад, и кажись это было на hackforums. Предположили, что netgear, из-за внаглую сворованного веб-интерфейса, и некоторой вероятности того, что помимо веб-интерфейса украли еще что-то. Форум этот - подобие нашего ХАКЕР.РУ, так что к информации оттуда я серьезно не относился бы.

    У нетгиров алгоритм может быть и похож на тенду, только беда в том, что их очень мало в 3wifi.

    Их вполне хватает, как оказалось. Надо будет изучить поподробнее и эти устройства.
     
    #4801 TOX1C, 5 Aug 2020
    Last edited: 5 Aug 2020
  2. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
    Интерфейс своровать я ещё понимаю, но своровать алгоритм он значит есть в прошивке или я чего-то не понимаю
    Даже если у нетгиров подобный алгоритм то это мало чем помогло бы.

    Я не очень понимаю что искать в целовом алгоритме для Тенд. У меня изначально была надежда найти первые Тенды в партии и посмотреть на их пин-коды, DeltaMAC, возможно что-то ещё, в рассчёте на то что будет что-то интересное. Переиспользование мак адресов это осложняет.
    Рытьё в прошивках дало мало толка - там ничего я не нашёл, возможно плохо искал. Кстати целевые тенды которые на eCos они не только на Lexra. Есть ещё версии на MIPS которыем можно покопать в дизасме.

    Если у кого есть идеи в каком направление копать под этот алгоритм то делитесь идеями.
     
    TOX1C and 4Fun like this.
  3. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Думаю, стоит поковырять, дабы окончательно удостовериться, вшит ли там пин в виде константы (ибо в противном случае, он обязан генерироваться).

    Х.з., может в Нетгирах и есть?

    1. Найти две максимально длинные SolidChain (можно не совсем Solid) из разных партий (с разными точками начала отсчёта) и проанализировать пересечения между ними (если таковые будут иметь место) на предмет совпадения всей последовательности с момента пересечения.

    2. Найти хотя-бы одну длинную SolidChain и исследовать периоды флуктаций различных битов-довесков (в надежде на их взаимонезависимость).
     
    #4803 Isica, 6 Aug 2020
    Last edited: 6 Aug 2020
    TOX1C likes this.
  4. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Тогда надо бы сделать выборку по Нетгирам и попробовать скормить её нашим генераторам для Тенды (походу, есть надежда, что буржуи побрезговали реюзать маки).
    Code:
    00:09:5B        Netgear
    00:0F:B5        Netgear
    00:14:6C        Netgear
    00:18:4D        Netgear
    00:1B:2F        Netgear
    00:1E:2A        Netgear
    00:1F:33        Netgear
    00:22:3F        Netgear
    00:24:B2        Netgear
    00:26:F2        Netgear
    00:8E:F2        Netgear
    04:A1:51        Netgear
    08:02:8E        Netgear
    08:36:C9        Netgear
    08:BD:43        Netgear
    10:0C:6B        Netgear
    10:0D:7F        Netgear
    10:DA:43        Netgear
    14:59:C0        Netgear
    20:0C:C8        Netgear
    20:4E:7F        Netgear
    20:E5:2A        Netgear
    28:80:88        Netgear
    28:C6:8E        Netgear
    2C:30:33        Netgear
    2C:B0:5D        Netgear
    30:46:9A        Netgear
    38:94:ED        Netgear
    3C:37:86        Netgear
    40:5D:82        Netgear
    44:94:FC        Netgear
    44:A5:6E        Netgear
    4C:60:DE        Netgear
    50:4A:6E        Netgear
    50:6A:03        Netgear
    6C:B0:CE        Netgear
    74:44:01        Netgear
    78:D2:94        Netgear
    80:37:73        Netgear
    84:1B:5E        Netgear
    8C:3B:AD        Netgear
    9C:3D:CF        Netgear
    9C:C9:EB        Netgear
    9C:D3:6D        Netgear
    A0:04:60        Netgear
    A0:21:B7        Netgear
    A0:40:A0        Netgear
    A0:63:91        Netgear
    A4:2B:8C        Netgear
    B0:39:56        Netgear
    B0:7F:B9        Netgear
    B0:B9:8A        Netgear
    BC:A5:11        Netgear
    C0:3F:0E        Netgear
    C0:FF:D4        Netgear
    C4:04:15        Netgear
    C4:3D:C7        Netgear
    CC:40:D0        Netgear
    DC:EF:09        Netgear
    E0:46:9A        Netgear
    E0:91:F5        Netgear
    E4:F4:C6        Netgear
    E8:FC:AF        Netgear
    F8:73:94        Netgear
    
     
    #4804 Isica, 6 Aug 2020
    Last edited: 6 Aug 2020
    TOX1C likes this.
  5. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
    Я посмотрю в нетгирах. Если роутеры прошиваются на заводе то буржуи из нетгир должны на завод давать и утилиту для генерации пин-кодов, по идее . На заводе можно своровать или скопировать утилитку.
     
    TOX1C and 4Fun like this.
  6. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Подробный разбор DeltaPIN_8

    1. Первое приближение.
    Для наглядности, пока отбросим младшие 3 цифры дельты, т.е., разберём DeltaHalf_8 (что не совсем корректно, но, тем не менее, познавательно).

    Вот все обнаруженные варианты:
    Code:
    +-----------+---------+------+
    | DeltaHalf | Signed_ | n    |
    +-----------+---------+------+
    | 0195      | +195    | 1954 |
    | 0261      | +261    |  814 |
    | 0196      | +196    |  193 |
    | 9195      | -805    |   47 |
    | 4418      | -5582   |   30 |
    | 9261      | -739    |   29 |
    | 1195      | -8805   |   25 |
    | 0326      | +326    |   11 |
    | 1261      | -8739   |   10 |
    | 4483      | -5517   |    9 |
    | 4484      | -5516   |    6 |
    | 1196      | -8804   |    3 |
    | 9196      | -804    |    3 |
    | 9419      | -581    |    1 |
    | 0327      | +327    |    1 |
    | 9858      | -142    |    1 |
    | 8884      | -1116   |    1 |
    +-----------+---------+------+
    17 rows in set (0.00 sec)
    
    (два полседних варианта я считаю случайным вбросом).
    Как видим, положительных дельт всего 5. И минимальную из них (+195) можно считать основой, а все остальные есть основа+довесок (довески могут быть сложными--состоять из нескольких битов, и разбираться с ними следует на полных, а не на халф-дельтах).
    Идём дальше: дельты 1195,1196 и 1261, а также 9195,9196 и 9261 есть частные случаи для 195, 196 и 261 соответственно, природа которых мне известна (могу рассказать подробнее).
    Таким образом, истинно-отрицательных дельт у нас всего три: 4418, 4483 и 4484 (и, похоже, ещё 9419).

    (продолжение следует)
     
    TOX1C, hydra and Monohrom like this.
  7. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
    Радует что дефолтные пароли не совсем уж уникальные у Тенд. У нетгиров такая же ситуация
     

    Attached Files:

    TOX1C, hydra and 4Fun like this.
  8. 4Fun

    4Fun Elder - Старейшина

    Joined:
    25 Jul 2018
    Messages:
    496
    Likes Received:
    709
    Reputations:
    11
    Это так не работает. Если пин-код вшит в прошивку – он статичный. Иначе он может быть вшит в раздел загрузчика или в так называемую NVRAM. Но если взять прошивку с сайта производителя (не дамп, считанный программатором с флеш-памяти), то в ней не получится найти эти данные, т. к. если пин-код записывается в какой-либо из разделов, то делается это на заводе индивидуально для каждого устройства.

    Что касается части целевых устройств, которые я смог загрузить в Ghidra: это модели на eCos и SoC Realtek RTL8196E: N301, F3, F9, F300 и FH456.
    Хочу сказать пару слов о том, как загрузить прошивку такой Тенды в Гидру.
    Получение образа
    Есть 2 варианта:
    1) зайти на официальный сайт, выбрать модель и перейти в раздел загрузок;
    2) искать образы (и, что важно, дампы флеш-памяти) на просторах интернета.
    Распаковка
    При анализе binwalk'ом видна примерно такая картина:
    2020-08-06_12-01.png
    Распаковываем прошивку (binwalk -e) и определяем архитектуру CPU (RTL8196E — это MIPS 32 big endian):
    upload_2020-8-6_12-7-7.png
    И чтобы окончательно убедиться, что перед нами исполняемая часть eCos, анализируем её binwalk'ом. Должна выглядеть примерно так (начинается с eCos excetion handler):
    upload_2020-8-6_12-9-54.png
    Если работаете с дампом флеш-памяти, а не с образом с сайта производителя, то при распаковке будет другая картина (появится ещё несколько частей):
    upload_2020-8-6_12-13-7.png
    В таком случае берите участок, сжатый с LZMA, который имеет больший размер. Ну а также для подстраховки проанализируйте его инструкции, чтобы определить архитектуру (binwalk -Y): должна быть MIPS 32 BE.
    Загрузка в Ghidra
    Создайте новый проект, перетащите файл исполняемой части eCos в окно Гидры и, когда появится окошко, выберите Language MIPS:BE:32:default:default
    upload_2020-8-6_12-27-1.png
    upload_2020-8-6_12-29-12.png
    Нажмите ОК, запустите анализ, дождитесь окончания анализа (это может занять около 15 минут).
     
    TOX1C, bluelife, Monohrom and 4 others like this.
  9. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Или в так-называемый Non-vol и т.п. И для прояснения ситуации, само-собой, желательно иметь полный дамп.

    3) слить дамп самому
     
  10. TOX1C

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

    Joined:
    24 Mar 2012
    Messages:
    1,135
    Likes Received:
    1,931
    Reputations:
    24
    Потенциальные дубли, с налезающими друг на друга пинкодами?? 032х - тоже подлые дубли, или что-то имеющее место быть? Они хоть и очень редкие, но больше похожи на довесок к 195528 (2FBC8h + 20000h = 4FBC8h, т.е. 326600 и так далее), нежели на попавшийся дубль.
    Желательно с примерами mac и pin, которые к месту были бы и для остальных примеров дельт-"неформалов".
    С этим нужно копать в сторону экспериментального генератора, точнее с его инструментами для работы с выгрузкой.

    Вместо тех фильтров, которые есть сейчас, нужен рекурсивный парсер, основанный как раз на этих минимальных, 100% достоверных дельтах. С перекрестными проверками после каждой итерации.

    Затея сулит огромными профитами:
    - Возможность работы с многострадальным диапазоном C8:3A:35, с которым сейчас нельзя ничего сделать из-за горы нецелевых устройств, дублей, статических пинов, и невалида. 17 мегабайт полезных данных, лежит мертвым грузом.
    - Получение достоверных дельт для генератора, вычисленных, а не собранных. Шанс попадания мусора из-за недочищенной выгрузки должен быть куда ниже.
    - Получение solidchain длиной из всех роутеров в серии, в теории.
    - И исходя из вышесказанного - исправление ошибки из прошлого. Всего лишь одна фотография наклейки, превратит сотни безликих Tenda Realtek и Tenda 11N во вполне осмысленные Tenda N304 и Tenda F3, к примеру.
     
  11. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
  12. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
    Если кто захочет разобраться с генерацией пин-кодов на TP-LINK то неплохой идеей будет посмотреть на Mercysys. Mercysys - это бренд туполинков и у них есть странности с генерацией пин-кода. https://3wifi.stascorp.com/find?bssid=38:6B:1C:0*:*:*
     

    Attached Files:

    4Fun likes this.
  13. Felis-Sapiens

    Felis-Sapiens Reservists Of Antichat

    Joined:
    21 Jul 2015
    Messages:
    616
    Likes Received:
    3,833
    Reputations:
    171
    Внутри группы со схожими пинами (скажем, 674....) разница между пинами равна разнице между суммой всех (или последних 3, по крайней мере) октетов BSSID.
     
    Isica, bluelife and binarymaster like this.
  14. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Ещё бы знать, откуда берутся эти группы.
    Поглядеть бы выборку с моделями...
    PS
    А добавили бы колонку с моделью в стандартной выборке--цены бы Вам не было! ;)
     
    4Fun likes this.
  15. Monohrom

    Monohrom Active Member

    Joined:
    26 Jan 2020
    Messages:
    83
    Likes Received:
    132
    Reputations:
    2
    Пин-коды причём повторяются, вот пины из групы 674
    https://3wifi.stascorp.com/find?bssid=◯&pin=67487363
    https://3wifi.stascorp.com/find?bssid=◯&pin=67487509
    https://3wifi.stascorp.com/find?bssid=◯&pin=67487608
     
  16. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    А с чего бы им не повторяться при таком алго?

    PS
    А выборку кто-то уже сделал? Интересно: сколько всего известно констант-точек отсчёта?
     
    #4816 Isica, 3 Oct 2020
    Last edited: 3 Oct 2020
  17. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Просьба к @binarymaster, @Felis-Sapiens и другим админам 3wifi (если таковые существуют): пожалуйста, поищите в базе другие OUI с этой уязвимостью, и сделайте по ним выборку с моделями устройств.
    Как-то так:
    Code:
    SELECT OUI, COUNT(DISTINCT(PIN))/COUNT(DISTINCT(PIN-CONV(LEFT(NIC,2),16,10)-CONV(MID(NIC,4,2),16,10)-CONV(RIGHT(NIC,2),16,10)))>2 y FROM [TABLE] GROUP BY OUI HAVING y ORDER BY OUI;
     
  18. Felis-Sapiens

    Felis-Sapiens Reservists Of Antichat

    Joined:
    21 Jul 2015
    Messages:
    616
    Likes Received:
    3,833
    Reputations:
    171
    Вот 945 шт.
    Я не админ.
     

    Attached Files:

    binarymaster, 4Fun and Isica like this.
  19. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    Нашёл я ещё несколько OUI с этой уязвимостью:
    Code:
    6C:59:40
    8C:F2:28
    C0:A5:DD
    C8:E7:D8
    E4:F3:F5
     
  20. Isica

    Isica Active Member

    Joined:
    17 Oct 2018
    Messages:
    243
    Likes Received:
    190
    Reputations:
    1
    А картина не так проста, как ожидалось:
    1) константы бывают и сингл-, кросс-модельными;
    2) и как мажорными, так и минорными (возможно, это не миноры, а просто не дефолтные пины, но некоторые из них уж очень похожи на мажоры!)
    3) кросс-OUI констант пока не выявлено, но данных для этого проанализировано слишком мало (всего 6 устройств из трёх малочисленных OUI и 3 костанты соответственно)
    Выборка по OUI C0:A5:DD и C8:E7:D8 может прояснить ситуацию.
    А пока:
    Code:
    +---------+-----+---+-----------------------------------------------------------------+
    | const   | n   | m | Models                                                          |
    +---------+-----+---+-----------------------------------------------------------------+
    | 2732971 | 113 | 3 | 305R, hardware: 1.0 | 305R, hardware: 2.0 | 325R, hardware: 2.0 |
    | 6324054 |  33 | 3 | 301R, hardware: 1.0 | 305R, hardware: 2.0 | 305R, hardware: 1.0 |
    | 1418951 |  29 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    |  214517 |  26 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 6739656 |  21 | 2 | 301R, hardware: 1.0 | 305R, hardware: 1.0                       |
    | 1672762 |   9 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 2877196 |   4 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 6748288 | 262 | 1 | 301R, hardware: 2.0                                             |
    | 3032128 | 144 | 1 | 301R, hardware: 2.0                                             |
    | 1198183 |  76 | 1 | 301R, hardware: 2.0                                             |
    | 2299773 |  70 | 1 | 301R, hardware: 2.0                                             |
    | 7198110 |  39 | 1 | 305R, hardware: 2.0                                             |
    | 9288922 |  23 | 1 | 305R, hardware: 2.0                                             |
    | 5107645 |  22 | 1 | 301R, hardware: 2.0                                             |
    | 1782372 |  15 | 1 | 301R, hardware: 2.0                                             |
    | 5874232 |  14 | 1 | 301R, hardware: 2.0                                             |
    | 5737450 |   6 | 1 | 325R, hardware: 2.0                                             |
    | 9686483 |   5 | 1 | 325R, hardware: 2.0                                             |
    | 2980878 |   4 | 1 | 305R, hardware: 2.0                                             |
    |  324127 |   3 | 1 | 301R, hardware: 2.0                                             |
    | 7782299 |   3 | 1 | 305R, hardware: 2.0                                             |
    | 1144728 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 4538175 |   2 | 1 | 305R, hardware: 1.0                                             |
    | 6321639 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 8639731 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 1144979 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 1198192 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1419512 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1419669 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1419818 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1639824 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 1781942 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 1782255 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 2300391 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 2733061 |   1 | 1 | 305R, hardware: 1.0                                             |
    | 3616317 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 4191216 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 4863394 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 6740099 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 6740167 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 7097342 |   1 | 1 | er MW300R rebranded                                             |
    | 3288806 |   2 | 0 | NULL                                                            |
    | 6776076 |   2 | 0 | NULL                                                            |
    | 9884461 |   2 | 0 | NULL                                                            |
    +---------+-----+---+-----------------------------------------------------------------+
    44 rows in set (0.01 sec)
    
    
    +---------+-----+---+-----------------------------------------------------------------+
    | const   | n   | m | Models                                                          |
    +---------+-----+---+-----------------------------------------------------------------+
    |  214517 |  26 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    |  324127 |   3 | 1 | 301R, hardware: 2.0                                             |
    | 1144728 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 1144979 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 1198183 |  76 | 1 | 301R, hardware: 2.0                                             |
    | 1198192 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1418951 |  29 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 1419512 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1419669 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1419818 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 1639824 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 1672762 |   9 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 1781942 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 1782255 |   1 | 1 | 301R, hardware: 1.0                                             |
    | 1782372 |  15 | 1 | 301R, hardware: 2.0                                             |
    | 2299773 |  70 | 1 | 301R, hardware: 2.0                                             |
    | 2300391 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 2732971 | 113 | 3 | 305R, hardware: 1.0 | 305R, hardware: 2.0 | 325R, hardware: 2.0 |
    | 2733061 |   1 | 1 | 305R, hardware: 1.0                                             |
    | 2877196 |   4 | 2 | 301R, hardware: 1.0 | 301R, hardware: 2.0                       |
    | 2980878 |   4 | 1 | 305R, hardware: 2.0                                             |
    | 3032128 | 144 | 1 | 301R, hardware: 2.0                                             |
    | 3288806 |   2 | 0 | NULL                                                            |
    | 3616317 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 4191216 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 4538175 |   2 | 1 | 305R, hardware: 1.0                                             |
    | 4863394 |   1 | 1 | 325R, hardware: 2.0                                             |
    | 5107645 |  22 | 1 | 301R, hardware: 2.0                                             |
    | 5737450 |   6 | 1 | 325R, hardware: 2.0                                             |
    | 5874232 |  14 | 1 | 301R, hardware: 2.0                                             |
    | 6321639 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 6324054 |  33 | 3 | 301R, hardware: 1.0 | 305R, hardware: 2.0 | 305R, hardware: 1.0 |
    | 6739656 |  21 | 2 | 301R, hardware: 1.0 | 305R, hardware: 1.0                       |
    | 6740099 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 6740167 |   1 | 1 | 301R, hardware: 2.0                                             |
    | 6748288 | 262 | 1 | 301R, hardware: 2.0                                             |
    | 6776076 |   2 | 0 | NULL                                                            |
    | 7097342 |   1 | 1 | er MW300R rebranded                                             |
    | 7198110 |  39 | 1 | 305R, hardware: 2.0                                             |
    | 7782299 |   3 | 1 | 305R, hardware: 2.0                                             |
    | 8639731 |   2 | 1 | 325R, hardware: 2.0                                             |
    | 9288922 |  23 | 1 | 305R, hardware: 2.0                                             |
    | 9686483 |   5 | 1 | 325R, hardware: 2.0                                             |
    | 9884461 |   2 | 0 | NULL                                                            |
    +---------+-----+---+-----------------------------------------------------------------+
    44 rows in set (0.01 sec)
    
    
    
     
    #4820 Isica, 5 Oct 2020
    Last edited: 5 Oct 2020