WannaCry: анализ, индикаторы компрометации и рекомендации по предотвращению

    В прошлую пятницу, аккурат под конец дня, когда все администраторы и специалисты по безопасности засобирались по домам и дачам, мир облетела новость о начале беспрецедентной атаке 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: По мере появления новых сведений по данной вредоносной программе мы будем вносить изменения в данный текст.
    Метки:
    Cisco 82,13
    Cisco – мировой лидер в области сетевых технологий
    Поделиться публикацией
    Похожие публикации
    Комментарии 58
    • 0
      Лично мне WannaCry напоминает не «Tonight we wanna cry», а Flowey the Flower из Undertale. Характер и приемы уж донельзя похожи.
      • +2
        То, что у вас обозначено в виде управляющих серверов, на самом деле является Entry (Guard)-нодами Tor. Они каждый раз разные.
        • 0
          более того, в «служебных» файлах шифровщика есть тор-адреса, вида <0123456789abcdef>.onion с которых он что-то, очевидно, тянет…
          • 0
            У него модульная структура. По идее он может новый вредоносный контент подтягивать. Но пока такого не зафиксировано
          • +1
            Да, мы уже поправили формулировки. Спасибо
          • 0
            В статье Microsoft где выложены патчи для локализованной Windows XP SP3 x86 ошибка в ссылке.
            Вот по этой ссылке сначала идёт редирект на страницу скачивания для обычной Windows XP, но при нажатии на кнопку «Download» скачивается патч для версии Embedded.
            Как бы донести до Microsoft просьбу исправить ссылку, и выложить патч для обычной XP?
            Windows XP ещё используется.
            • +1
              Добавь в реестр код(в файл.рег, потом импорт):
              Windows Registry Editor Version 5.00
              [HKEY_LOCAL_MACHINE\SYSTEM\WPA\PosReady]
              «Installed»=dword:00000001

              Ставь патч.
              • 0
                или скачать отсюда http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598
              • 0
                Скачивайте с http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598 — там все версии перечислены верно.
                • 0
                  А как там выбрать язык? У меня по умолчанию установлен английский — страница открывается на английском. Открываю страницу описания патча, там вкладка Language Selection — отмечаю Russian. Закрываю, жму Download — предлагает только англоязычный вариант (enu).
                  • 0
                    А галку с английского снять?
                    • 0
                      И снимал, и оставлял. Очень смущает то, что по клику на названии патча и системы страница открывается в новой вкладке браузера, а кнопка для скачивания есть только на странице списка. Неудивительно, что после выставления галок и закрывания этой дополнительной страницы, основная страница об этом ничего не знает. О чем они вообще думали, когда делали такой интерфейс?
                      • 0
                        А вы с осла заходили? Это работает в Internet Explorer — некая наколка от микросфота, чтобы хотя бы для обновлений использовали их браузер.
                        • 0
                          Заходил в Firefox. Сейчас вспомнил, что у MS и раньше были какие-то завязки на IE.
                • 0
                  Обновление для Windows XP даёт доступ к расшаренным папкам и сетевым принтерам на XP со стороны Windows 7?
                  • 0
                    Мне особенно проверять не на чем, рабочих мест Windows XP осталось всего несколько штук.
                    Файловая шара, созданная на Windows XP с рабочего места Windows 7 доступна.
                    А что, без этого обновления оно не работало?
                    У меня домен MS Windows, файловые шары между рабочими местами не используются, поэтому я не проверял, как оно было до этого обновления.
                    Если мне не изменяет мой склероз, то оно и до этого обновления работало.
                • +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
                  
                  • 0
                    NGFW (App Control, Web Filtering) + OpenDNS + End Point Antivirus = сразу дали отпор по трем направлениям (проверено в каждом из сегментов).

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

                    На мой взгляд, проблема раздута, и часто связана с отсутствием действующих контрактов (NGFW/UTM) и легального ПО (потому и не обслуживается). В добавок, этот зловред похож на демо (шоу кейс) утекших функций АНБ, которые срочно начали все блокировать, то ли для того что бы реализацию скрыть, то ли для того, что бы лишний раз компрометировать WiKi Leaks.
                    • –2
                      В чем ценность вашей статьи? Чем она отличается от предидущих?
                      https://habrahabr.ru/company/pentestit/blog/328606/
                      • +2
                        Тем, что она появилась раньше
                      • 0
                        Поддался общей панике, скачал патч с сайта MS, поставил, перегрузился. Нннааа! — синий экран с надписью «Error145. Application cannont be started, press OK to close».

                        Ага, вот сейчас найду кнопку «ОК» на синем экране, и ещё чем нажать… в общем, часов 6 заняло восстановление, от загрузочной флешки с WinPE до поиска и удаления через DSIM всех возможных обновлений, приводящих к BSOD.
                        • +1
                          Скорее всего виной пиратская версия Windows с кривым активатором, модифицирующим ядро. Если система лицензионная и кривых активаторов нет — возможно, у вас уже установлен какой-нибудь кривой руткит, который также модифицирует ядро и не совместим с обновлением.
                          • 0
                            Нижеприведённый код сохранить в текстовом виде с расширением .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
                            • 0
                              Для этого надо сначала попасть в систему, не правда ли?)
                          • 0
                            Для тех предприятий, у кого есть 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
                              И где его там качать? Зарегаться — загегался.
                              • 0
                                Сам портал еще молодой и потому не все интуитивно, к сожалению. Залогинившись, перейдите во вкладку Use Case Library, где есть ссылка на сам портал. Скриншот прилагаю

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


                            • 0
                              Проверенные ссылки на микрософт, собирал для себя, может еще кому пригодятся.
                              https://sysadminblog.ru/
                              • 0
                                Я прошу прощения, я мало что понимаю в скриптах, но хотелось бы проверить свой комп на уязвимость. Я правильно понимаю, если открыт 445 порт то уязвимость есть? Если подключиться по локалке к моему компу telnet ом к 445-му порту то уязвимость есть? Правильно или не всё так просто?
                                • 0
                                  Нет, неправильно. Помимо открытого порта у вас должна быть непропатченная уязвимость и не 10-я Винда. Тогда можно говорить о вашей уязвимости. Если у вас 10-я Винда или стоит патч, то наличие открытого порта не означает вашей уязвимости к WannaCry. Хотя зачем вам открытый в Интернет 445-й порт?
                                • +1
                                  http://rgho.st/8T2QKwpty рабочий сканер сети

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

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

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

                                  Virustotal
                                  • 0
                                    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 надо где то вбивать логин/пароль?
                                    • 0
                                      Код сканера не предполагает ввода логина/пароля.
                                      Возможно необходимо проверять локально, к примеру через wmi
                                    • 0
                                      Спасибо за сканер — оч-ч-чень полезное изобретение… За полдня обежал всю контору и еще по RAdmin кучу компов обновил. Где XP стояла (автоматом она не не находит обновлений — только вручную устанавливать), где обновления по каким-то причинам глючили, где доступ в Инет был заблочен, но время от времени обновления хоть вручную ставить надо. Без сканера наверняка бы много пропустил.

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

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

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

                                      Вобщем, чем они такие особенные — не понятно.
                                      • 0
                                        в 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.
                                        • 0
                                          Данная статья не очень соответствует реальности. Прямо сейчас успешно подключился с XP к 2012 R2 на котором никакие из перечисленных действий не выполнялись и никакого «Server SMB 1.xxx Driver» в зависимостях нет.
                                          • 0
                                            в ролях сервера есть что-то активное с наименованием SMB 1.0/CIFS File Sharing Support?

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

                                                Если на сервер можно попасть с ХП и утилита говорит что невозможно определить наличие уязвимости — значит с 2012 не все так просто
                                                и червь, соответственно, тоже не сможет проникнуть
                                          • 0
                                            Но это не единственные сервера с Win2K12 R2. Про другие сканер, тем не менее пишет не такую строчку, а вполне обычную:

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

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

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

                                                Т.е., заходит с XP на все расшаренные ресурсы, но один сервер помечается сканером как безопасный, а второй — как с неопределяемой уязвимостью.
                                                • 0
                                                  Эм…
                                                  Тогда я не знаю. Чудеса какие-то.
                                                  По-идее вирусняк не должен проникнуть в такие системы, так как сканер работает по принципу вируса. Если сканер так говорит, значит и вирус пойдет лесом.
                                        • 0
                                          Можете код скрипта под спойлер выложить, что то не хочется с данного файлобменника ничего скачивать. Спасибо!
                                          • 0
                                            Пожалуйста http://rgho.st/private/7wvXb6fww/d3054016e244d74956de2b695d431242

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

                                            для вин компилируется так: go build -ldflags -H=windows ms17-010.go
                                          • 0
                                            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)")
                                            	}
                                            }
                                            

                                            • 0
                                              Спасибо!
                                              • 0
                                                если Вы заметили, там ошибочка в коде ;)
                                                флаг e не задействован, поправите сами?
                                                • 0
                                                  Меня не смущает. Спасибо!
                                                  • 0
                                                    не нравится мне ввод таймаута по правилам языка 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)")
                                                    	}
                                                    }
                                                    

                                                  • 0
                                                    Якобы уже лазейки нашли для расшифровки
                                                    http://4pda.ru/2017/05/21/342335/#comment3853501
                                          • 0
                                            По всем вопросам у кого не ставятся обновления из статьи 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 у вас уже установлениы все необходимые обновления.
                                            • 0
                                              Якобы уже лазейки нашли для расшифровки
                                              http://4pda.ru/2017/05/21/342335/#comment3853501

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое