В прошлую пятницу, аккурат под конец дня, когда все администраторы и специалисты по безопасности засобирались по домам и дачам, мир облетела новость о начале беспрецедентной атаке WannaCry. По истечении пары дней уже можно сказать, что не зря название этой атаки ассоциируется с песней Кита Урбана «Tonight I Wanna Cry» («Сегодня я хочу плакать»). Ее масштабы оказались достаточно зловещими — на момент написания число жертв превысило 230 тысяч и это число может вырасти, когда многие вернутся с выходных и отпусков и включат свои домашние и рабочие компьютеры. Мы, в нашем подразделении Cisco Talos, еще в пятницу опубликовали свое исследование данной вредоносной программы и сейчас хотели бы поделиться отдельными ключевыми моментами с пользователям Хабра.

WannCry

WannyCry — это червь-шифровальщик, отличительной особенностью которого является функция саморазмножения, обычно отсутствующая у классических шифровальщиков. Это значит, что для заражения вам не требуется никуда кликать, ничего нажимать и ничего открывать. Достаточно иметь просто уязвимый, непропатченный и подключенный к Интернет (в том числе и через другие компьютеры, например, в локальной сети) компьютер на базе платформы Windows, чтобы стать жертвой WannaCry. После заражения компьютера жертва видит предложение об оплате определенной суммы денег (разные вариации WannaCry требуют разные суммы — от 300 до 600 долларов) за возврат доступа к файлам. Предложение выводится на разных языках, включая и русский. Интересный момент — сообщение о выкупе является не просто текстовым файлом, картинкой или HTA-файлом, как обычно у шифровальщиков, а файлом исполняемым.

Требование выкупа в WannaCry

Обратите внимание на этот момент — от пользователя не требуется никакой реакции! За счет чего это стало возможным? Тут все просто — авторы WannaCry воспользовались утечкой из ShadowBrokers, в результате которой миру стали известны множество ранее неизвестных уязвимостей и способов проведения атак. Среди них была и уязвимость ETERNALBLUE и связанный с ней бэкдор DOUBLEPULSAR. Первая позволяла через уязвимый SMB получать удаленный доступ к компьютеру и незаметно устанавливать на него программное обеспечение. Так и устанавливается шифровальщик WannyCry. Компания Microsoft еще в марте выпустила соответствующий патч для данной уязвимости, но, как показывает опыт, многие администраторы по разным причинам не удосужились его установить на свои компьютеры. Уязвимость ETERNALBLUE присутствует на всех версиях Windows, исключая Windows 10. Учитывая наличие в мире большого числа уже неподдерживаемых компанией операционных систем семейства Windows (Windows XP, Windows 8, Windows Server 2003) и масштаб атаки, Microsoft пошла на беспрецедентный шаг и выпустила патчи и для этих ОС.

Обратите внимание, что если у вас установлен соответствующий патч или иным образом блокируется использование данной уязвимости, например, с помощью IPS), то это не значит, что вы неподвержены WannaCry. Шифровальщик и в этом случае сможет быть запущен, но для этого уже понадобится реакция пользователя, привычная для работы классических локеров-вымогателей. Установка патча Microsoft блокирует только удаленное заражение и распространение вредоносного кода.

Вредоносная программа WannaCry ищет уязвимые компьютеры, путем сканирования открытого извне TCP-порта 445 (Server Message Block/SMB). Поэтому неплохой идеей (если ваши процессы допускают это) было бы заблокировать доступ по этому порту (а также по 139-му) из Интернет на вашем межсетевом экране или маршрутизаторе. Для маршрутизаторов Cisco соответствующий ACL может выглядеть следующим образом:

access-list 110 deny tcp any any eq 445
access-list 110 deny tcp any any eq 139

Однако блокирование данных портов извне не означает полной защиты от внутреннего заражения. Если какой-либо из ваших пользователей принесет домашний ноутбук, содержащий WannaCry, и подключит его к внутренней локальной сети (а мы уже получили запросы от некоторых заказчиков, у которых генеральные директора со своими зараженными компьютерами приехали в выходные на работу, вызвав туда же «на ковер» и ИТ-персонал), то WannaCry начнет искать новые жертвы внутри организации.

Наш анализ показывает, что в паре с уязвимостью ETERNALBLUE действует и бэкдор DOUBLEPULSAR из утечки ShadowBrokers, который позволяет получать удаленный доступ и выполнять произвольный код на предварительно скомпрометированной машине. Обычно после успешной эксплуатации уязвимости ETERNALBLUE устанавливается бэкдор DOUBLEPULSAR и уже с его помощью устанавливается шифровальщик. Если успешно проэксплуатировать ETERNALBLUE не удается, но при этом на атакуемом узле находится копия DOUBLEPULSAR, то код шифровальщика устанавливается через него.

Анализ WannaCry в Cisco AMP Threat Grid

После успешной инсталляции и зашифрования файлов WannaCry пытается установить соединение с узлами сети Tor для передачи трафика через нее и попытки скрыть своих истинных «хозяев». Указанные ниже IP-адреса узлов Tor были обнаружены специалистами Cisco Talos, но это не финальный список. У наших коллег из других компаний списки используемых узлов Tor имеют другие адреса. При этом их анализ показывает, что большинство из них имеет старую историю и уже применялись в тех или иных вредоносных активностях. Кроме того, стоит помнить, что указанные адреса не будут применяться постоянно — их срок жизни для текущей версии WannaCry составит несколько недель. Поэтому стоит регулярно отслеживать информацию о данной угрозе и обновлять соответствующие индикаторы компрометации.

Несмотря на то, что с момента начала эпидемии прошло всего пару дней и пострадало уже несколько сотен тысяч компьютеров, злоумышленники успели выпустить несколько новых версий своего вредоносного творения, преимущественно в части шифровальщика. Текущая версия WannaCry содержит функцию «kill switch», то есть проверку наличия определенного домена в Интернет, при обнаружении которого вредоносный код не устанавливался на компьютер жертвы. Этот домен — iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea[.]com (в новых модификациях WannaCry возможно использование и других доменов) был идентифицирован одним из исследователей и зарегистрирован им для «перехвата» управления вредоносной программой. Как показал анализ обращений к данному домену с помощью сервиса Cisco OpenDNS Investigate, около 200 тысяч компьютеров за прошедшие два дня были спасены от заражения.

Анализ обращения к домену kill switch с помощью Cisco OpenDNS Investigate

Пока не обнаружено модификаций WannaCry без функции «kill switch» (хотя попытки предпринимались, но пока неуспешные), но это не означает, что ее быть не может. В любом случае история еще не закончилась. В понедельник многие включат свои компьютеры после отпуска и выходных и число жертв у данной вредоносной программы может еще увеличиться. Более того, наш анализ показывает, что архитектура у WannaCry модульная и может быть использована для доставки и использования других вредоносных модулей.

Стоит обратить внимание, что на момент написания заметки, пока не удалось найти способ расшифрования зашифрованных файлов. Это означает, что в случае заражения пользователя и отсутствия у него резервной копии своих данных, вероятность возврата доступа к своим файлам невысока (даже в случае выплаты выкупа, что не гарантирует получения ключа для расшифрования). Для шифрования используется 2048-мибитный ключ RSA, а «под раздачу» попадают файлы со следующими расширениями:

.der, .pfx, .key, .crt, .csr, .p12, .pem, .odt, .sxw, .stw, .3ds, .max, .3dm, .ods, .sxc, .stc, .dif, .slk, .wb2, .odp, .sxd, .std, .sxm, .sqlite3, .sqlitedb, .sql, .accdb, .mdb, .dbf, .odb, .mdf, .ldf, .cpp, .pas, .asm, .cmd, .bat, .vbs, .sch, .jsp, .php, .asp, .java, .jar, .class, .mp3, .wav, .swf, .fla, .wmv, .mpg, .vob, .mpeg, .asf, .avi, .mov, .mp4, .mkv, .flv, .wma, .mid, .m3u, .m4u, .svg, .psd, .tiff, .tif, .raw, .gif, .png, .bmp, .jpg, .jpeg, .iso, .backup, .zip, .rar, .tgz, .tar, .bak, .ARC, .vmdk, .vdi, .sldm, .sldx, .sti, .sxi, .dwg, .pdf, .wk1, .wks, .rtf, .csv, .txt, .msg, .pst, .ppsx, .ppsm, .pps, .pot, .pptm, .pptx, .ppt, .xltm, .xltx, .xlc, .xlm, .xlt, .xlw, .xlsb, .xlsm, .xlsx, .xls, .dotm, .dot, .docm, .docx, .doc

Как можно заметить, шифруются офисные файлы Excel, Word, PowerPoint, Open Office, музыкальные и видео файлы, архивы, сообщения e-mail и почтовые архивы/базы данных, файлы баз данных MS SQL, MS Access, графические файлы MS Visio, Photoshop, а также виртуальные машины и другие.

Сейчас пока рано ставить точку в истории с WannaCry и впереди нас ждет более детальный анализ этой вредоносной программы. Пока же мы можем дать ряд рекомендаций по защите от нее:

  1. Установите, как минимум, патч MS17-010, закрывающий уязвимость ETERNALBLUE в SMB. Лучше обновить все свои компьютеры с ОС Windows. В промышленных сетях, где установка патчей имеет свои особенности, стоит уточнить у производителя своей АСУ ТП, не повлияет ли установка этого патча на функционирование системы и технологического процесса. Также можно вовсе заблокировать поддержку протокола SMB, если это допустимо в конкретной сети и для конкретных ИТ-процессов и приложений.
  2. Заблокируйте внешние соединения из Интернет по протоколам SMB/NetBIOS — для этого необходимо закрыть 137-й, 139-й и 445-й TCP-порты, а также 137-й и 138-й UDP-порты.
  3. Задействуйте системы резервного копирования (даже копирование важных файлов на обычную флешку или внешний жесткий диск в ручном режиме уже будет нелишним).
  4. Используйте актуальные, поддерживаемые версии ОС, для которых выпускаются обновления безопасности.
  5. Используйте средства защиты персональных компьютеров — от традиционных антивирусов с регулярно обновляемыми базами сигнатур до средств защиты следующего поколения (EDR, STAP, BDS и т.п. наименования).
  6. Контролируйте и блокируйте трафик к узлам сети Tor, которые часто используются шифровальщиками и иными вредоносными программами.
  7. Используйте сервисы Threat Intelligence, которые позволят вам быть в курсе динамически изменяющегося ландшафта угроз и постоянно обнволять свои средства защиты новыми индикаторами компрометации.

Для тех пользователей, кто применяет решения Cisco по кибербезопасности можем сказать, что все наши решения могут бороться с данной угрозой:

  • Advanced Malware Protection (AMP), особенно AMP for Endpoints, идеально подходит для обнаружения и предотвращения данной вредоносной программы.
  • Cloud Web Security (CWS) и Web Security Appliance (WSA) детектируют обращение к вредоносным доменам «kill switch».
  • Cisco Firepower NGIPS имеет актуальные сигнатуры для обнаружения и блокирования данной угрозы.
  • Cisco Firepower NGFW (а также Cisco ASA) может блокировать доступ к 139-му и 445-му TCP-портам, а также имеет регулярно обновляемый список узлов Tor для отслеживания взаимодействия с этой сетью и блокирования исходящих соединений.
  • AMP Threat Grid помог проанализировать вредоносное поведение WannaCry, а также может это сделать и для новых модификаций этой вредоносной программы.
  • OpenDNS Umbrella помогает распознавать взаимодействие с доменами, ассоциированными с данной угрозой. Вы можете воспользоваться бесплатной версией OpenDNS Home, которая позволит повысить уровень защиты домашних пользователей.
  • Stealthwatch детектирует сетевую активность, связанную со сканированием уязвимых узлов, распространение вредоносного кода по сети, а также взаимодействие с командными серверами (C2 или CnC), в том числе и с сетью Tor.
  • Identity Service Engine (ISE) может отслеживать непропатченные узлы в локальной сети и блокировать им доступ или локализовывать, перенаправляя в карантинную подсеть. Также интеграция ISE со сканером безопасности Qualys (TC-NAC) позволяет идентифицировать уязвимые к ETERNALBLUE узлы и также помещать их в карантин.

Пользователям Snort стоит знать, что с данной угрозой помогают бороться правила 42329-42332, 42340 и 41978, доступные в рамках пакета обновления на Snort.org. Для пользователей Cisco Legacy IPS подготовлен IPS Signature Pack S982, в котором с WannaCry борются 7958-0 и 7958-1.

Дополнительно хотим указать индикаторы компрометации для WannaCry, которые мы идентифицировали в рамках проведенного нами анализа:

Имена файлов:
d5e0e8694ddc0548d8e6b87c83d50f4ab85c1debadb106d6a6a794c3e746f4fa b.wnry
055c7760512c98c8d51e4427227fe2a7ea3b34ee63178fe78631fa8aa6d15622 c.wnry
402751fa49e0cb68fe052cb3db87b05e71c1d950984d339940cf6b29409f2a7c r.wnry
e18fdd912dfe5b45776e68d578c3af3547886cf1353d7086c8bee037436dff4b s.wnry
4a468603fdcb7a2eb5770705898cf9ef37aade532a7964642ecd705a74794b79 taskdl.exe
2ca2d550e603d74dedda03156023135b38da3630cb014e3d00b1263358c5f00d taskse.exe
97ebce49b14c46bebc9ec2448d00e1e397123b256e2be9eba5140688e7bc0ae6 t.wnry
b9c5d4339809e0ad9a00d4d3dd26fdf44a32819a54abf846bb9b560d81391c25 u.wnry

Наблюдавшиеся IP-адреса:
188[.]166[.]23[.]127:443 — Tor Exit Node
193[.]23[.]244[.]244:443 — Tor Exit Node
2[.]3[.]69[.]209:9001 — Tor Exit Node
146[.]0[.]32[.]144:9001 — Tor Exit Node
50[.]7[.]161[.]218:9001 — Tor Exit Node
128.31.0[.]39 — Tor Exit Node
213.61.66[.]116 — Tor Exit Node
212.47.232[.]237 — Tor Exit Node
81.30.158[.]223 — Tor Exit Node
79.172.193[.]32 — Tor Exit Node

Tor C2:
xxlvbrloxvriy2c5.onion
cwwnhwhlz52maqm7.onion
gx7ekbenv2riucmf.onion
57g7spgrzlojinas.onion
76jdd2ir2embyv47.onion

Список наблюдаемых в рамках деятельности WannaCry хешей:
ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa
c365ddaa345cfcaff3d629505572a484cff5221933d68e4a52130b8bb7badaf9
09a46b3e1be080745a6d8d88d6b5bd351b1c7586ae0dc94d0c238ee36421cafa
0a73291ab5607aef7db23863cf8e72f55bcb3c273bb47f00edf011515aeb5894
428f22a9afd2797ede7c0583d34a052c32693cbb55f567a60298587b6e675c6f
5c1f4f69c45cff9725d9969f9ffcf79d07bd0f624e06cfa5bcbacd2211046ed6
62d828ee000e44f670ba322644c2351fe31af5b88a98f2b2ce27e423dcf1d1b1
72af12d8139a80f317e851a60027fdf208871ed334c12637f49d819ab4b033dd
85ce324b8f78021ecfc9b811c748f19b82e61bb093ff64f2eab457f9ef19b186
a1d9cd6f189beff28a0a49b10f8fe4510128471f004b3e4283ddc7f78594906b
a93ee7ea13238bd038bcbec635f39619db566145498fe6e0ea60e6e76d614bd3
b43b234012b8233b3df6adb7c0a3b2b13cc2354dd6de27e092873bf58af2693c
eb47cd6a937221411bb8daf35900a9897fb234160087089a064066a65f42bcd4
24d004a104d4d54034dbcffc2a4b19a11f39008a575aa614ea04703480b1022c
2c2d8bc91564050cf073745f1b117f4ffdd6470e87166abdfcd10ecdff040a2e
7a828afd2abf153d840938090d498072b7e507c7021e4cdd8c6baf727cafc545
a897345b68191fd36f8cefb52e6a77acb2367432abb648b9ae0a9d708406de5b
fb0b6044347e972e21b6c376e37e1115dab494a2c6b9fb28b92b1e45b45d0ebc
9588f2ef06b7e1c8509f32d8eddfa18041a9cc15b1c90d6da484a39f8dcdf967
b43b234012b8233b3df6adb7c0a3b2b13cc2354dd6de27e092873bf58af2693c
4186675cb6706f9d51167fb0f14cd3f8fcfb0065093f62b10a15f7d9a6c8d982
09a46b3e1be080745a6d8d88d6b5bd351b1c7586ae0dc94d0c238ee36421cafa

Дополнительная информация:


UPDATE: По мере появления новых сведений по данной вредоносной программе мы будем вносить изменения в данный текст.
Поделиться с друзьями
-->

Комментарии (57)


  1. abyrkov
    14.05.2017 20:34

    Лично мне WannaCry напоминает не «Tonight we wanna cry», а Flowey the Flower из Undertale. Характер и приемы уж донельзя похожи.


  1. ValdikSS
    15.05.2017 00:08
    +2

    То, что у вас обозначено в виде управляющих серверов, на самом деле является Entry (Guard)-нодами Tor. Они каждый раз разные.


    1. NiTr0_ua
      15.05.2017 01:17

      более того, в «служебных» файлах шифровщика есть тор-адреса, вида <0123456789abcdef>.onion с которых он что-то, очевидно, тянет…


      1. alukatsky
        15.05.2017 01:25

        У него модульная структура. По идее он может новый вредоносный контент подтягивать. Но пока такого не зафиксировано


    1. alukatsky
      15.05.2017 01:18
      +1

      Да, мы уже поправили формулировки. Спасибо


  1. mtumanov
    15.05.2017 01:18

    В статье Microsoft где выложены патчи для локализованной Windows XP SP3 x86 ошибка в ссылке.
    Вот по этой ссылке сначала идёт редирект на страницу скачивания для обычной Windows XP, но при нажатии на кнопку «Download» скачивается патч для версии Embedded.
    Как бы донести до Microsoft просьбу исправить ссылку, и выложить патч для обычной XP?
    Windows XP ещё используется.


    1. ukt
      15.05.2017 02:35
      +1

      Добавь в реестр код(в файл.рег, потом импорт):

      Windows Registry Editor Version 5.00
      [HKEY_LOCAL_MACHINE\SYSTEM\WPA\PosReady]
      «Installed»=dword:00000001

      Ставь патч.


      1. RangerRU
        15.05.2017 12:02

        или скачать отсюда http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598


    1. Jef239
      15.05.2017 09:09

      Скачивайте с http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598 — там все версии перечислены верно.


      1. emusic
        15.05.2017 14:19

        А как там выбрать язык? У меня по умолчанию установлен английский — страница открывается на английском. Открываю страницу описания патча, там вкладка Language Selection — отмечаю Russian. Закрываю, жму Download — предлагает только англоязычный вариант (enu).


        1. Jef239
          15.05.2017 14:22

          А галку с английского снять?


          1. emusic
            15.05.2017 14:29

            И снимал, и оставлял. Очень смущает то, что по клику на названии патча и системы страница открывается в новой вкладке браузера, а кнопка для скачивания есть только на странице списка. Неудивительно, что после выставления галок и закрывания этой дополнительной страницы, основная страница об этом ничего не знает. О чем они вообще думали, когда делали такой интерфейс?


            1. Jef239
              15.05.2017 15:09

              А вы с осла заходили? Это работает в Internet Explorer — некая наколка от микросфота, чтобы хотя бы для обновлений использовали их браузер.


              1. emusic
                15.05.2017 16:10

                Заходил в Firefox. Сейчас вспомнил, что у MS и раньше были какие-то завязки на IE.


        1. jqb
          15.05.2017 14:27
          +1

          1. emusic
            15.05.2017 15:07

            Спасибо, а как получили? У Вас эта кухня с выбором языка работает?


            1. jqb
              15.05.2017 15:18

              Тоже не работала, то язык не тот, то версия ОС. Не стал возиться, просто нагуглил ссылку.


            1. Carburn
              15.05.2017 22:08

    1. VadimGrad
      18.05.2017 11:04

      Обновление для Windows XP даёт доступ к расшаренным папкам и сетевым принтерам на XP со стороны Windows 7?


      1. mtumanov
        18.05.2017 20:08

        Мне особенно проверять не на чем, рабочих мест Windows XP осталось всего несколько штук.
        Файловая шара, созданная на Windows XP с рабочего места Windows 7 доступна.
        А что, без этого обновления оно не работало?
        У меня домен MS Windows, файловые шары между рабочими местами не используются, поэтому я не проверял, как оно было до этого обновления.
        Если мне не изменяет мой склероз, то оно и до этого обновления работало.


  1. Sergey-S-Kovalev
    15.05.2017 05:23
    +2

    Скрипт быстрой проверки на подверженность уязвимости.

    Для тех у кого вообще нечем посмотреть состояние парка ПК сойдет :)

    Скрытый текст
    # Powershell
    # Скрипт проверки на подверженность атаки Wana decrypt0r 2.0 (WannaCry)
    # Не проверяет заражена ли система (мне пока не чем проверить)
    # При запуске с клиентского ПК требует установленной RSAT и возможно WMF5
    # habrahabr / @sergey-s-kovalev / 15.05.2017 / free for use
    
    
    cls
    
    Import-Module ActiveDirectory
    
    $domainname = "domain.local" # Задаем имя домена которое хотим проверить
    
    $ResultPath = "D:\WannaCry\" # Указываем путь до папки, куда складывать отчеты
    
    # Задаем списки для сохранения списков ПК
    $SafeHosts = @()
    $VulnerabilityHosts = @()
    $OfflineHosts = @()
    $NotManagedHosts = @()
    
    
    $SafeDate = Get-Date -Date 11-2-2017 -Hour 0 -Minute 0 -Second 1 # Определяем безопасную дату файла
     
    # Получаем список ПК из домена
    $DomainComputers = Get-ADComputer -Server $domainname -Filter * -Properties * #| Where-Object {$_.OperatingSystem -like '*Server*'} | Sort Name # Используем маски в случае необходимости
       
    # Общий список ПК  
    Write-Host "Всего хостов обнаружено:" $DomainComputers.count
    
    
    foreach ($ComputerName in $DomainComputers.DNSHostName) # Для каждого ПК из списка
    { 
    
    Write-host "Проверяем",$ComputerName
    
    $PingResult = Get-WmiObject Win32_PingStatus -Filter "Address = '$ComputerName'" # Проверяем доступность ПК в сети
    
    
       
      If (($PingResult.ResponseTime -ne $null) -and ($PingResult.IPV4Address -ne $null)) # Если нет пингов до хоста или у него нет ip адреса
      { 
         $Command = {(Get-Item c:\WINDOWS\system32\drivers\srv.sys).LastWriteTime} # Команда которая получает дату файла
         
         $Result = "Empty" # Задаем значение по умолчанию
    
         # Пробуем запустить команду на удаленном ПК
         Try {$Result = Invoke-Command -ComputerName $ComputerName -ScriptBlock $Command -ErrorAction Stop} Catch {write-host -foreground yellow $ComputerName, "включен, но управление через WinRM недоступно";$NotManagedHosts = $NotManagedHosts + $ComputerName}
         
         
         if ($Result -ne "Empty") { # Если результат не пустой
         # Сравнить дату файла с контрольной датой
            if ($Result -lt $SafeDate) {write-host -foreground red $ComputerName,"уязвим! Дата файла",$Result;$VulnerabilityHosts = $VulnerabilityHosts + $ComputerName} else {write-host -foreground green $ComputerName, "имеет необходимое обновление. Дата файла",$Result;$SafeHosts = $SafeHosts + $ComputerName} 
            }
        # Если результат пинга пустой
      } else {write-host -foreground DarkRed $ComputerName, "не в сети, не имеет IP-адреса или фаерволлом запрещен PING";$OfflineHosts = $OfflineHosts + $ComputerName} 
    
    }
    
    $LogTime = get-date -format yyyy-MM-dd_HH-mm-ss # Получить текущее время
    
    # Выгрузить списки компьютеров в той или иной категории
    $SafeHosts | Out-file -FilePath $ResultPath$LogTime"_"$domainname"-SafeHosts.log" -Encoding utf8 -Force
    $VulnerabilityHosts | Out-file -FilePath $ResultPath$LogTime"_"$domainname"-VulnerabilityHosts.log" -Encoding utf8 -Force
    $OfflineHosts | Out-file -FilePath $ResultPath$LogTime"_"$domainname"-OfflineHosts.log" -Encoding utf8 -Force
    $NotManagedHosts | Out-file -FilePath $ResultPath$LogTime"_"$domainname"-NotManagedHosts.log" -Encoding utf8 -Force
    


  1. Avatorus
    15.05.2017 12:02

    NGFW (App Control, Web Filtering) + OpenDNS + End Point Antivirus = сразу дали отпор по трем направлениям (проверено в каждом из сегментов).

    Что касается Tor, то он блокируется на уровне правил App Contorol.

    На мой взгляд, проблема раздута, и часто связана с отсутствием действующих контрактов (NGFW/UTM) и легального ПО (потому и не обслуживается). В добавок, этот зловред похож на демо (шоу кейс) утекших функций АНБ, которые срочно начали все блокировать, то ли для того что бы реализацию скрыть, то ли для того, что бы лишний раз компрометировать WiKi Leaks.


  1. bisor
    15.05.2017 12:12
    -2

    В чем ценность вашей статьи? Чем она отличается от предидущих?
    https://habrahabr.ru/company/pentestit/blog/328606/


    1. alukatsky
      15.05.2017 12:12
      +2

      Тем, что она появилась раньше


  1. mSnus
    15.05.2017 12:13

    Поддался общей панике, скачал патч с сайта MS, поставил, перегрузился. Нннааа! — синий экран с надписью «Error145. Application cannont be started, press OK to close».

    Ага, вот сейчас найду кнопку «ОК» на синем экране, и ещё чем нажать… в общем, часов 6 заняло восстановление, от загрузочной флешки с WinPE до поиска и удаления через DSIM всех возможных обновлений, приводящих к BSOD.


    1. VEG
      15.05.2017 13:10
      +1

      Скорее всего виной пиратская версия Windows с кривым активатором, модифицирующим ядро. Если система лицензионная и кривых активаторов нет — возможно, у вас уже установлен какой-нибудь кривой руткит, который также модифицирует ядро и не совместим с обновлением.


    1. Nikolaich
      15.05.2017 16:45

      Нижеприведённый код сохранить в текстовом виде с расширением .cmd и запустить от имени администратора. Будет восстановлено оригинальное ядро, система перезагрузится. Скорее всего, слетит пиратская активация, можно использовать альтернативный активатор, не затрагивающий ядро, например, лоадер.
      DEL "%windir%\system32\drivers\oem-drv64.sys"
      DEL "%windir%\system32\xNtKrnl.exe"
      DEL "%windir%\system32\xOsLoad.exe"
      DEL "%windir%\System32\ru-RU\xOsLoad.exe.mui"
      DEL "%windir%\System32\en-US\xOsLoad.exe.mui"
      %windir%\System32\BCDEDIT.exe /set {current} path \Windows\system32\winload.exe
      %windir%\System32\BCDEDIT.exe /deletevalue {current} kernel
      %windir%\System32\BCDEDIT.exe /deletevalue {current} nointegritychecks
      %windir%\System32\BCDEDIT.exe /deletevalue {current} custom:26000027
      REG DELETE HKLM\SYSTEM\CurrentControlSet\services\oem-drv64 /va /f
      shutdown -r -t 0


  1. opanas
    15.05.2017 13:14

    Для тех предприятий, у кого есть SIEM ArcSight, QRadar или Splunk (сбор и анализ лог-файлов) мы выпустили бесплатный use case WannaCry Detector. https://my.socprime.com/en/ucl/

    Отслеживаемые признаки компрометации (IOCs) по состоянию на 13:12 MSK 15.05.2017:
    — MD5s of malicious processes on host
    — Names of malicious processes on host
    — Command-line parameters of WannaCry worm, including ones called out by cmd.exe
    — File paths identified
    — IP addresses and ports reported in OSINT as command centers


    1. m0ps
      16.05.2017 15:18
      +1

      И где его там качать? Зарегаться — загегался.


      1. opanas
        19.05.2017 14:14

        Сам портал еще молодой и потому не все интуитивно, к сожалению. Залогинившись, перейдите во вкладку Use Case Library, где есть ссылка на сам портал. Скриншот прилагаю

        Заголовок спойлера



  1. xtelekom
    15.05.2017 14:58

    Проверенные ссылки на микрософт, собирал для себя, может еще кому пригодятся.
    https://sysadminblog.ru/


  1. vl185
    15.05.2017 18:54

    Я прошу прощения, я мало что понимаю в скриптах, но хотелось бы проверить свой комп на уязвимость. Я правильно понимаю, если открыт 445 порт то уязвимость есть? Если подключиться по локалке к моему компу telnet ом к 445-му порту то уязвимость есть? Правильно или не всё так просто?


    1. alukatsky
      15.05.2017 18:56

      Нет, неправильно. Помимо открытого порта у вас должна быть непропатченная уязвимость и не 10-я Винда. Тогда можно говорить о вашей уязвимости. Если у вас 10-я Винда или стоит патч, то наличие открытого порта не означает вашей уязвимости к WannaCry. Хотя зачем вам открытый в Интернет 445-й порт?


  1. RangerRU
    16.05.2017 05:06
    +1

    http://rgho.st/8T2QKwpty рабочий сканер сети

    может сканировать как отдельный комп, так и подсети
    взято и скомпилено отсюда https://github.com/jflyup/goMS17-010

    немного модернизировал сканер, добавил флаги:
    e — отключение вывода ошибки подключения в консоль
    td — таймаут на попытку подключения (было прописано жестко 2 секунды)
    tc — таймаут на само соединение (было прописано жестко 5 секунд)

    также исправил вывод информации

    Virustotal


    1. dkhromenko
      17.05.2017 16:38

      C:\Users\tmp\Downloads>ms17-010.exe -h 192.168.1.35
      A Go program for detecting if host(s) is vulnerable to SMB exploit(MS17-010)
      Compiled from https://github.com/jflyup/goMS17-010
      
      can't determine whether 192.168.1.35 is vulnerable or not
      

      для W2012R2 надо где то вбивать логин/пароль?


      1. RangerRU
        18.05.2017 14:14

        Код сканера не предполагает ввода логина/пароля.
        Возможно необходимо проверять локально, к примеру через wmi


    1. Pochemuk
      18.05.2017 14:40

      Спасибо за сканер — оч-ч-чень полезное изобретение… За полдня обежал всю контору и еще по RAdmin кучу компов обновил. Где XP стояла (автоматом она не не находит обновлений — только вручную устанавливать), где обновления по каким-то причинам глючили, где доступ в Инет был заблочен, но время от времени обновления хоть вручную ставить надо. Без сканера наверняка бы много пропустил.

      Только вот на двух серверах тоже выдает такую строчку:

      can't determine whether 192.168.xxx.yyy is vulnerable or not

      На одном файерволл включен, на другом — нет. На одном MS SQL сервер, на другом сервер геоинформационной системы. Общее — Win2K12 Server R2 Standard Edition. Но эта ОСь есть и на других машинах, как и включенные файерволлы.

      Вобщем, чем они такие особенные — не понятно.


      1. RangerRU
        18.05.2017 14:44

        в Win2K12 Server R2 smb_v1 по-умолчанию отключен
        http://winitpro.ru/index.php/2014/12/01/podderzhka-smb-1-0-v-windows-server-2012-r2/

        В Windows Server 2012 R2 была представлена новая версия протокола SMB 3 (технически это SMB 3.02, т.к. версия SMB 3.0 появлялась еще в Windows Server 2012), а драйвер устаревшего протокола SMB 1.0 теперь по-умолчанию отключен и его компоненты не загружаются. Вследствие отсутствия поддержки SMB 1.0 устаревшие (Windows XP, Server 2003 и ) и совместимые клиенты (Mac OSX 10.8 Mountain Lion, Snow Leopard, Mavericks, старые версии Linux) не смогут получить доступ к файлам, расположенным файловом сервере под управлением Windows 2012 R2.


        1. Taciturn
          19.05.2017 11:28

          Данная статья не очень соответствует реальности. Прямо сейчас успешно подключился с XP к 2012 R2 на котором никакие из перечисленных действий не выполнялись и никакого «Server SMB 1.xxx Driver» в зависимостях нет.


          1. RangerRU
            19.05.2017 11:59

            в ролях сервера есть что-то активное с наименованием SMB 1.0/CIFS File Sharing Support?

            потому как отключив SMB 1, я не смогу попасть на него ни с XP, ни с 2003
            возможно действительно в статье что-то не так, но она перевод со статьи http://woshub.com/smb-1-0-support-in-windows-server-2012-r2/


            1. Taciturn
              19.05.2017 12:08

              Конечно есть. Ведь они установлены по умолчанию. И вы пишете что отключили SMB 1, а не не стали устанавливать. В статье же написано что SMB 1 нет по умолчанию, но это не так.


              1. RangerRU
                19.05.2017 12:14

                Значит статьи так грамотно написаны ((

                Если на сервер можно попасть с ХП и утилита говорит что невозможно определить наличие уязвимости — значит с 2012 не все так просто
                и червь, соответственно, тоже не сможет проникнуть


        1. Pochemuk
          19.05.2017 13:02

          Но это не единственные сервера с Win2K12 R2. Про другие сканер, тем не менее пишет не такую строчку, а вполне обычную:

          [-] 192.168.xxx.yyy (Windows Server 2012 R2 Standard 9600) stays in safety

          Ну это после установки всех последних обновлений. Как было до этого — не знаю. Потому что сразу при начале эпидемии кинулся устанавливать их и перегружать сервера.

          P.S. Файерволл на них включен. В чем разница?


          1. RangerRU
            19.05.2017 13:25

            с ХП по сети в шару заходит?


            1. Pochemuk
              19.05.2017 14:23

              На SQL-сервере общих ресурсов нет кроме системных: ADMIN$, IPC$, C$ и т.д. Администратор домена может к ним подключиться.
              На сервере геоинформационной системы есть расшаренные папки. Чтобы админ ГИС мог заливать привязанные к объектам фото, схемы, пятисотки. С XP с правами этого админа в них заходит.
              На сервере терминалов (про который сканер говорит, что он безопасен) тоже есть шары — на локальные файловые БД. С правами соответствующих админов на них с XP заходит.

              Т.е., заходит с XP на все расшаренные ресурсы, но один сервер помечается сканером как безопасный, а второй — как с неопределяемой уязвимостью.


              1. RangerRU
                20.05.2017 12:31

                Эм…
                Тогда я не знаю. Чудеса какие-то.
                По-идее вирусняк не должен проникнуть в такие системы, так как сканер работает по принципу вируса. Если сканер так говорит, значит и вирус пойдет лесом.


    1. Pogreb33
      18.05.2017 14:52

      Можете код скрипта под спойлер выложить, что то не хочется с данного файлобменника ничего скачивать. Спасибо!


      1. RangerRU
        18.05.2017 15:12

        Пожалуйста http://rgho.st/private/7wvXb6fww/d3054016e244d74956de2b695d431242

        я свои вставки таймаутов убрал, так как автор добавил свою

        для вин компилируется так: go build -ldflags -H=windows ms17-010.go



      1. RangerRU
        18.05.2017 15:40

        ms17-010.go
        package main
        
        import (
        	"encoding/binary"
        	"encoding/hex"
        	"flag"
        	"fmt"
        	"net"
        	"sync"
        	"time"
        	"strings"
        )
        
        var (
        	negotiateProtocolRequest, _  = hex.DecodeString("00000085ff534d4272000000001853c00000000000000000000000000000fffe00004000006200025043204e4554574f524b2050524f4752414d20312e3000024c414e4d414e312e30000257696e646f777320666f7220576f726b67726f75707320332e316100024c4d312e325830303200024c414e4d414e322e3100024e54204c4d20302e313200")
        	sessionSetupRequest, _       = hex.DecodeString("00000088ff534d4273000000001807c00000000000000000000000000000fffe000040000dff00880004110a000000000000000100000000000000d40000004b000000000000570069006e0064006f007700730020003200300030003000200032003100390035000000570069006e0064006f007700730020003200300030003000200035002e0030000000")
        	treeConnectRequest, _        = hex.DecodeString("00000060ff534d4275000000001807c00000000000000000000000000000fffe0008400004ff006000080001003500005c005c003100390032002e003100360038002e003100370035002e003100320038005c00490050004300240000003f3f3f3f3f00")
        	transNamedPipeRequest, _     = hex.DecodeString("0000004aff534d42250000000018012800000000000000000000000000088ea3010852981000000000ffffffff0000000000000000000000004a0000004a0002002300000007005c504950455c00")
        	trans2SessionSetupRequest, _ = hex.DecodeString("0000004eff534d4232000000001807c00000000000000000000000000008fffe000841000f0c0000000100000000000000a6d9a40000000c00420000004e0001000e000d0000000000000000000000000000")
        )
        
        func checkHost(ip string, timeout time.Duration, flag1 bool) {
        	// connecting to a host in LAN if reachable should be very quick
        	conn, err := net.DialTimeout("tcp", ip+":445", time.Second*timeout)
        	if err != nil {
        		fmt.Printf("failed to connect to %s\n", ip)
        		return
        	}
        
        	conn.SetDeadline(time.Now().Add(time.Second * timeout))
        	conn.Write(negotiateProtocolRequest)
        	reply := make([]byte, 1024)
        	// let alone half packet
        	if n, err := conn.Read(reply); err != nil || n < 36 {
        		return
        	}
        
        	if binary.LittleEndian.Uint32(reply[9:13]) != 0 {
        		// recv error
        		return
        	}
        
        	conn.Write(sessionSetupRequest)
        
        	n, err := conn.Read(reply)
        	if err != nil || n < 36 {
        		return
        	}
        
        	if binary.LittleEndian.Uint32(reply[9:13]) != 0 {
        		// recv error
        		fmt.Printf("[E] Can't determine whether %s is vulnerable or not. Protocol SMB 1.0 is disabled?\n", ip)
        		return
        	}
        
        	// extract OS info
        	var os string
        	sessionSetupResponse := reply[36:n]
        	if wordCount := sessionSetupResponse[0]; wordCount != 0 {
        		// find byte count
        		byteCount := binary.LittleEndian.Uint16(sessionSetupResponse[7:9])
        		if n != int(byteCount)+45 {
        			fmt.Println("invalid session setup AndX response")
        		} else {
        			// two continous null byte as end of a unicode string
        			for i := 10; i < len(sessionSetupResponse)-1; i++ {
        				if sessionSetupResponse[i] == 0 && sessionSetupResponse[i+1] == 0 {
        					os = string(sessionSetupResponse[10:i])
        					break
        				}
        			}
        		}
        
        	}
        	userID := reply[32:34]
        	treeConnectRequest[32] = userID[0]
        	treeConnectRequest[33] = userID[1]
        	// TODO change the ip in tree path though it doesn't matter
        	conn.Write(treeConnectRequest)
        
        	if n, err := conn.Read(reply); err != nil || n < 36 {
        		return
        	}
        
        	treeID := reply[28:30]
        	transNamedPipeRequest[28] = treeID[0]
        	transNamedPipeRequest[29] = treeID[1]
        	transNamedPipeRequest[32] = userID[0]
        	transNamedPipeRequest[33] = userID[1]
        
        	conn.Write(transNamedPipeRequest)
        	if n, err := conn.Read(reply); err != nil || n < 36 {
        		return
        	}
        
        	os = strings.Replace(os, "\u0000", "", -1)
        
        	if reply[9] == 0x05 && reply[10] == 0x02 && reply[11] == 0x00 && reply[12] == 0xc0 {
        		fmt.Printf("[+] %s (%s) is likely VULNERABLE to MS17-010!\n", ip, os)
        
        		// detect present of DOUBLEPULSAR SMB implant
        		trans2SessionSetupRequest[28] = treeID[0]
        		trans2SessionSetupRequest[29] = treeID[1]
        		trans2SessionSetupRequest[32] = userID[0]
        		trans2SessionSetupRequest[33] = userID[1]
        
        		conn.Write(trans2SessionSetupRequest)
        
        		if n, err := conn.Read(reply); err != nil || n < 36 {
        			return
        		}
        
        		if reply[34] == 0x51 {
        			fmt.Printf("[!] DOUBLEPULSAR SMB IMPLANT in %s\n", ip)
        		}
        
        	} else {
        		fmt.Printf("[-] %s (%s) stays in safety\n", ip, os)
        	}
        
        }
        
        func incIP(ip net.IP) {
        	for j := len(ip) - 1; j >= 0; j-- {
        		ip[j]++
        		if ip[j] > 0 {
        			break
        		}
        	}
        }
        
        func main() {
        	fmt.Println("A Go program for detecting if host(s) is vulnerable to SMB exploit(MS17-010)")
        	fmt.Println("Compiled from https://github.com/jflyup/goMS17-010")
        	fmt.Println()
        
        	host := flag.String("i", "", "single ip address")
        	timeout := flag.Duration("t", 2, "timeout on connection, in seconds")
        	netCIDR := flag.String("n", "", "CIDR notation of a network")
        	misserrorPtr := flag.Bool("e", false, "Do not show hosts with a connection error in the console (default False)")
        	flag.Parse()
        
        	if *host != "" {
        		checkHost(*host, *timeout, false)
        		return
        	}
        
        	if *netCIDR != "" && *host == "" {
        		ip, ipNet, err := net.ParseCIDR(*netCIDR)
        		if err != nil {
        			fmt.Println("invalid CIDR")
        			return
        		}
        		var wg sync.WaitGroup
        
        		for ip := ip.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) {
        			wg.Add(1)
        			go func(ip string) {
        				defer wg.Done()
        				checkHost(ip, *timeout, *misserrorPtr)
        			}(ip.String())
        		}
        
        		wg.Wait()
        	}
        	if *netCIDR == "" && *host == "" {
        		fmt.Println("Usage:")
        		fmt.Println("ms17-010.exe [-e -t <seconds>] -i HOST")
        		fmt.Println("or")
        		fmt.Println("ms17-010.exe [-e -t <seconds>] -n CIDR_prefix")
        		fmt.Println()
        		fmt.Println("-i	single ip address")
        		fmt.Println("-n	CIDR notation of a network")
        		fmt.Println()
        		fmt.Println("-e	Do not show hosts with a connection error in the console (default False)")
        		fmt.Println("-t	timeout on connection, in seconds (default 2)")
        	}
        }
        


        1. Pogreb33
          18.05.2017 15:44

          Спасибо!


          1. RangerRU
            19.05.2017 11:15

            если Вы заметили, там ошибочка в коде ;)
            флаг e не задействован, поправите сами?


            1. Pogreb33
              19.05.2017 11:18

              Меня не смущает. Спасибо!


              1. RangerRU
                19.05.2017 11:37

                не нравится мне ввод таймаута по правилам языка Go, переделал на Int, а дальше идет конвертация (и флаг e поправил)

                fixed ms17-010.go
                package main
                
                import (
                	"encoding/binary"
                	"encoding/hex"
                	"flag"
                	"fmt"
                	"net"
                	"sync"
                	"time"
                	"strings"
                )
                
                var (
                	negotiateProtocolRequest, _  = hex.DecodeString("00000085ff534d4272000000001853c00000000000000000000000000000fffe00004000006200025043204e4554574f524b2050524f4752414d20312e3000024c414e4d414e312e30000257696e646f777320666f7220576f726b67726f75707320332e316100024c4d312e325830303200024c414e4d414e322e3100024e54204c4d20302e313200")
                	sessionSetupRequest, _       = hex.DecodeString("00000088ff534d4273000000001807c00000000000000000000000000000fffe000040000dff00880004110a000000000000000100000000000000d40000004b000000000000570069006e0064006f007700730020003200300030003000200032003100390035000000570069006e0064006f007700730020003200300030003000200035002e0030000000")
                	treeConnectRequest, _        = hex.DecodeString("00000060ff534d4275000000001807c00000000000000000000000000000fffe0008400004ff006000080001003500005c005c003100390032002e003100360038002e003100370035002e003100320038005c00490050004300240000003f3f3f3f3f00")
                	transNamedPipeRequest, _     = hex.DecodeString("0000004aff534d42250000000018012800000000000000000000000000088ea3010852981000000000ffffffff0000000000000000000000004a0000004a0002002300000007005c504950455c00")
                	trans2SessionSetupRequest, _ = hex.DecodeString("0000004eff534d4232000000001807c00000000000000000000000000008fffe000841000f0c0000000100000000000000a6d9a40000000c00420000004e0001000e000d0000000000000000000000000000")
                )
                
                func checkHost(ip string, timeout int, flag1 bool) {
                	// connecting to a host in LAN if reachable should be very quick
                	conn, err := net.DialTimeout("tcp", ip+":445", time.Duration(timeout)*time.Second)
                	if err != nil {
                		if (flag1 != true) {
                			fmt.Printf("failed to connect to %s\n", ip)
                		}
                		return
                	}
                
                	conn.SetDeadline(time.Now().Add(time.Duration(timeout)*time.Second))
                	conn.Write(negotiateProtocolRequest)
                	reply := make([]byte, 1024)
                	// let alone half packet
                	if n, err := conn.Read(reply); err != nil || n < 36 {
                		return
                	}
                
                	if binary.LittleEndian.Uint32(reply[9:13]) != 0 {
                		// recv error
                		return
                	}
                
                	conn.Write(sessionSetupRequest)
                
                	n, err := conn.Read(reply)
                	if err != nil || n < 36 {
                		return
                	}
                
                	if binary.LittleEndian.Uint32(reply[9:13]) != 0 {
                		// recv error
                		fmt.Printf("[E] Can't determine whether %s is vulnerable or not. Protocol SMB 1.0 is disabled?\n", ip)
                		return
                	}
                
                	// extract OS info
                	var os string
                	sessionSetupResponse := reply[36:n]
                	if wordCount := sessionSetupResponse[0]; wordCount != 0 {
                		// find byte count
                		byteCount := binary.LittleEndian.Uint16(sessionSetupResponse[7:9])
                		if n != int(byteCount)+45 {
                			fmt.Println("invalid session setup AndX response")
                		} else {
                			// two continous null byte as end of a unicode string
                			for i := 10; i < len(sessionSetupResponse)-1; i++ {
                				if sessionSetupResponse[i] == 0 && sessionSetupResponse[i+1] == 0 {
                					os = string(sessionSetupResponse[10:i])
                					break
                				}
                			}
                		}
                
                	}
                	userID := reply[32:34]
                	treeConnectRequest[32] = userID[0]
                	treeConnectRequest[33] = userID[1]
                	// TODO change the ip in tree path though it doesn't matter
                	conn.Write(treeConnectRequest)
                
                	if n, err := conn.Read(reply); err != nil || n < 36 {
                		return
                	}
                
                	treeID := reply[28:30]
                	transNamedPipeRequest[28] = treeID[0]
                	transNamedPipeRequest[29] = treeID[1]
                	transNamedPipeRequest[32] = userID[0]
                	transNamedPipeRequest[33] = userID[1]
                
                	conn.Write(transNamedPipeRequest)
                	if n, err := conn.Read(reply); err != nil || n < 36 {
                		return
                	}
                
                	os = strings.Replace(os, "\u0000", "", -1)
                
                	if reply[9] == 0x05 && reply[10] == 0x02 && reply[11] == 0x00 && reply[12] == 0xc0 {
                		fmt.Printf("[+] %s (%s) is likely VULNERABLE to MS17-010!\n", ip, os)
                
                		// detect present of DOUBLEPULSAR SMB implant
                		trans2SessionSetupRequest[28] = treeID[0]
                		trans2SessionSetupRequest[29] = treeID[1]
                		trans2SessionSetupRequest[32] = userID[0]
                		trans2SessionSetupRequest[33] = userID[1]
                
                		conn.Write(trans2SessionSetupRequest)
                
                		if n, err := conn.Read(reply); err != nil || n < 36 {
                			return
                		}
                
                		if reply[34] == 0x51 {
                			fmt.Printf("[!] DOUBLEPULSAR SMB IMPLANT in %s\n", ip)
                		}
                
                	} else {
                		fmt.Printf("[-] %s (%s) stays in safety\n", ip, os)
                	}
                
                }
                
                func incIP(ip net.IP) {
                	for j := len(ip) - 1; j >= 0; j-- {
                		ip[j]++
                		if ip[j] > 0 {
                			break
                		}
                	}
                }
                
                func main() {
                	fmt.Println("A Go program for detecting if host(s) is vulnerable to SMB exploit(MS17-010)")
                	fmt.Println("Compiled from https://github.com/jflyup/goMS17-010")
                	fmt.Println()
                
                	host := flag.String("i", "", "single ip address")
                	timeout := flag.Int("t", 2, "timeout on connection, in seconds")
                	netCIDR := flag.String("n", "", "CIDR notation of a network")
                	misserrorPtr := flag.Bool("e", false, "Do not show hosts with a connection error in the console (default False)")
                	flag.Parse()
                
                	if *host != "" {
                		fmt.Printf("Using timeout %s\n", time.Duration(*timeout)*time.Second)
                		fmt.Println()
                		checkHost(*host, *timeout, false)
                		return
                	}
                
                	if *netCIDR != "" && *host == "" {
                		ip, ipNet, err := net.ParseCIDR(*netCIDR)
                		if err != nil {
                			fmt.Println("invalid CIDR")
                			return
                		}
                
                		fmt.Printf("Using timeout %s\n", time.Duration(*timeout)*time.Second)
                		fmt.Println()
                
                		var wg sync.WaitGroup
                
                		for ip := ip.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) {
                			wg.Add(1)
                			go func(ip string) {
                				defer wg.Done()
                				checkHost(ip, *timeout, *misserrorPtr)
                			}(ip.String())
                		}
                
                		wg.Wait()
                	}
                	if *netCIDR == "" && *host == "" {
                		fmt.Println("Usage:")
                		fmt.Println("ms17-010.exe [-e -t <seconds>] -i HOST")
                		fmt.Println("or")
                		fmt.Println("ms17-010.exe [-e -t <seconds>] -n CIDR_prefix")
                		fmt.Println()
                		fmt.Println("-i	single ip address")
                		fmt.Println("-n	CIDR notation of a network")
                		fmt.Println()
                		fmt.Println("-e	Do not show hosts with a connection error in the console (default False)")
                		fmt.Println("-t	timeout on connection, in seconds (default 2)")
                	}
                }
                


            1. Pogreb33
              22.05.2017 16:47

              Якобы уже лазейки нашли для расшифровки
              http://4pda.ru/2017/05/21/342335/#comment3853501


  1. Pogreb33
    17.05.2017 16:54

    По всем вопросам у кого не ставятся обновления из статьи MS17-010
    И тем у кого в команде wmic qfe list | findstr 4013198 — ответ пустой
    Я поясню для Win10
    В win 10 есть 3 сборки 1511,1607,1703
    Я в CMD набрал команду winver и у меня появилось окно с версией и сборкой моей ОС
    У меня OS Build 10586.916.
    И ни одно из KB командой wmic qfe list | findstr 4013198 я так и не нашел
    Обновление 4013198 входит в сборку OS Build 10586.842, поэтому у кого сборки OS Build 10586.873 и OS Build 10586.916 у вас уже установлениы все необходимые обновления.


  1. Pogreb33
    23.05.2017 09:06

    Якобы уже лазейки нашли для расшифровки
    http://4pda.ru/2017/05/21/342335/#comment3853501