Pull to refresh

Comments 58

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

Ставь патч.
или скачать отсюда http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598
А как там выбрать язык? У меня по умолчанию установлен английский — страница открывается на английском. Открываю страницу описания патча, там вкладка Language Selection — отмечаю Russian. Закрываю, жму Download — предлагает только англоязычный вариант (enu).
А галку с английского снять?
И снимал, и оставлял. Очень смущает то, что по клику на названии патча и системы страница открывается в новой вкладке браузера, а кнопка для скачивания есть только на странице списка. Неудивительно, что после выставления галок и закрывания этой дополнительной страницы, основная страница об этом ничего не знает. О чем они вообще думали, когда делали такой интерфейс?
А вы с осла заходили? Это работает в Internet Explorer — некая наколка от микросфота, чтобы хотя бы для обновлений использовали их браузер.
Заходил в Firefox. Сейчас вспомнил, что у MS и раньше были какие-то завязки на IE.
Спасибо, а как получили? У Вас эта кухня с выбором языка работает?
Тоже не работала, то язык не тот, то версия ОС. Не стал возиться, просто нагуглил ссылку.
Обновление для Windows XP даёт доступ к расшаренным папкам и сетевым принтерам на XP со стороны Windows 7?
Мне особенно проверять не на чем, рабочих мест Windows XP осталось всего несколько штук.
Файловая шара, созданная на Windows XP с рабочего места Windows 7 доступна.
А что, без этого обновления оно не работало?
У меня домен MS Windows, файловые шары между рабочими местами не используются, поэтому я не проверял, как оно было до этого обновления.
Если мне не изменяет мой склероз, то оно и до этого обновления работало.
Скрипт быстрой проверки на подверженность уязвимости.

Для тех у кого вообще нечем посмотреть состояние парка ПК сойдет :)
Скрытый текст
# 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
NGFW (App Control, Web Filtering) + OpenDNS + End Point Antivirus = сразу дали отпор по трем направлениям (проверено в каждом из сегментов).

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Т.е., заходит с XP на все расшаренные ресурсы, но один сервер помечается сканером как безопасный, а второй — как с неопределяемой уязвимостью.
Эм…
Тогда я не знаю. Чудеса какие-то.
По-идее вирусняк не должен проникнуть в такие системы, так как сканер работает по принципу вируса. Если сканер так говорит, значит и вирус пойдет лесом.
Можете код скрипта под спойлер выложить, что то не хочется с данного файлобменника ничего скачивать. Спасибо!
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)")
	}
}

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

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