Главная

Friday, 29 June 2018

Ваш web-браузер как кладезь информации о вас.

Всем привет.

Помните как часто нам предлагают поменять web-браузер, если не получилось с этим сайтом (или web-банкингом, или магазином online) в одном, то перейти временно на другой? Мы ставим еще один и пробуем. Ура, проблема решена и... старый браузер забыли. У кого сейчас только один браузер на ПК? Ууу, а если у жены предпочтения другие... А это же кладезь личной информации. О которой мы часто просто забываем.

Убедиться в этом на помогут утилиты NirSoft Forensic Tools. Программы пакета являются переносимым программным обеспечением и могут использоваться без установки в системе, а также, при некоторых дополнительных настройках, могут применяться для приложений и их рабочих данных, не являющихся частью ПО, установленного в текущей системе т.е. находящихся на внешних съемных дисках.

Что вы там любите - Chrome, Firefox или Opera? Да вы просто оцените ореол обитания ваших паролей и прочей личной информации.

IEHistoryView

IEHistoryView позволяет извлечь историю обозревателя Internet Explorer из файла index.dat. Информация включает в себя посещаемые URL, названия веб-сайтов, количество посещений сайта пользователем, дату и время последнего посещения. Также, отображается информация о локальных файлах, открывавшихся с использованием Internet Explorer.

При использовании IEHistoryView для извлечения истории браузера, использовавшегося на внешнем диске:
перейти в меню File - > Select History Folder (Ctrl+H), и выбрать каталог на внешнем диске, в котором размещается файл index.dat.
В командной строке задать каталог в виде параметра:
iehv.exe /stab c:\temp\history.txt –folder ”D:\Documents and Settings\User\Local Settings\History”
Примечание:Для получения достоверных данных, желательно иметь одинаковые настройки даты и часовых поясов на компьютере с работающей программой IEHistoryView и в исследуемой системе на внешнем диске.

IECacheView

IECacheView позволяет извлечь кэшированные данные на основе содержимого файла index.dat браузера Internet Explorer. Информация отображается в виде, подобном отображаемому программой IEHistoryView, но гораздо больше по объему – для каждой посещаемой страницы отображается множественные записи, включая изображения и загружаемые файлы.

Для просмотра кэш браузера на внешнем диске:
перейти в меню File - > Select Cache Folder (F9), и выбрать папку ”\Temporary Internet Files” из профиля пользователя на внешнем диске.
В командной строке задать параметр, определяющий размещение папки с временными файлами браузера:
IECacheView.exe -folder ” C:\Documents and Settings\Admin\Local Settings\Temporary Internet Files” /stab c:\temp\cache.txt

IECookiesView

IECookiesView позволяет извлечь все файлы куки (cookie), запомненные обозревателем Internet Explorer.

Для извлечения файлов на внешнем диске:
перейти в меню File - > Select Cookies Folder (Ctrl+O) и указать расположение каталога Cookies
В командной строке указать путь к папке Cookies с использованием параметра /dir:
IECookiesView /dir ” C:\Documents and Settings\Admin\Cookies”

IE PassView

IE PassView позволяет получить пароли к сайтам, запомненные в браузере Internet Explorer.
IE PassView может отображать пароли для браузера на внешнем диске, но с ограничениями :
поддерживаются только версии Internet Explorer - 7.x and 8.x .
Пока не поддерживаются версии Windows 7 и старше.
Должен быть известен пароль пользователя Windows на внешнем диске, поскольку он используется при расшифровке зашифрованных паролей внешней системы.

Для использования программы по отношению к внешнему диску:
перейти в меню Options - > Advanced Options (F8), выбрать 'Load passwords from the following user profile', и выбрать папку с профилем пользователя.
В командной строке используется параметр /external задающий путь к профилю пользователя :
iepv.exe /external "C:\Documents and Settings\admin"

Wednesday, 27 June 2018

Профилактика сервера WSUS.

Привет.

Сервер WSUS нуждается в профилактике. Удаление устаревших, замещенных или отмененных обновлений, переиндексация базы, прочее. Начнем с замещенных(устаревших) обновлений. Хорошей практикой считается следующий порядок действий при отмене замещенного обновления:
  1. разрешить более новое (замещающее) обновление
  2. убедиться, что все системы его установили (где требуется)
  3. убедиться, что все системы сообщают о замещаемом обновлении, как неприменимом
  4. теперь можно безопасно удалить замещенное обновление.

Для того, чтобы отфильтровать обновления по замещению:
нужно перейти в WSUS во "Обновления" - "Все обновления", в выпадающем списке "утверждение" выбрать "утверждено", в выпадающем списке "состояние" выбрать "любой", кликнуть правой кнопкой мышки по заголовку таблицы и поставить галочку напротив "замена" (supersedence). 

Также рекомендую сразу же добавить столбец "Число необходимых установок", чтобы видеть что это обновление нужно на 0 компьютерах и значит можно его отменять. Далее сортируйте по столбцу "замена" и отменяйте не нужные замененные обновления после всех этих действий нужно очистить wsus одним из двух способов описанных ниже.

После этого неплохо бы почистить базу сервера WSUS.

Чистка базы WSUS через штатную опцию Server Cleanup Wizard.

Запускаем оснастку "Windows Server Update Services"
Переходим в "Имя WSUS Сервера" - "Computers" - "Options" - "Server Cleanup Wizard"
Выставляем галочки возле тех вариантов очистки которые подходят и жмем "Next"
Ждем ххх или больше часов, все зависит от размера вашей базы обновлений. Ставьте этот процесс на выходной.

Чистка базы WSUS через Powershell скрипт от Microsoft.

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

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
#$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true

$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope) | Out-File d:\WsusCleanupMS.log

Значения параметров:
DeclineSupersededUpdates - отклонить обновления, которые заменены более новыми версиями или же включены в пакеты обновлений. Также, отклоняются обновления, которые не были подтверждены в течение 30 и более дней, и не востребованы ни одним клиентом.

DeclineExpiredUpdates - отклонить просроченные обновления. Как правило, Microsoft выпускает новые обновления взамен просроченным, а просроченные - удаляет со своих потоковых серверов загрузки.

CleanupObsoleteUpdates - удаляем неиспользуемые и устаревшие обновления, включая все их ревизии. Удаляются те обновления и ревизии, которые не были подтверждены в течение 30 и более дней.

CompressUpdates - удаляем устаревшие ревизии обновлений.

CleanupObsoleteComputers - удаляет устаревшие компьютеры, которые не контактировали с сервером 30 и более дней.

CleanupUnneededContentFiles - удаляем ненужные файлы обновлений. Включение этой опции позволяет освободить максимальный объем места на диске.

Saturday, 23 June 2018

RouterOS и Layer7 protocol.

Всем привет.

В заточенную под сетевые процессы Linux систему RouterOS заложены довольно таки серьезные возможности. Я знакомлюсь с RouterOS весьма простым способом - можно взять официальный образ с сайта Mikrotik и проинсталлировать ее в виртуальную машину. Получаете полнофункциональный роутер для теста на 24 часа. 

Как я сказал, операционная система от Mikrotik является специализированной сетевой OS с обширным функционалом и большим количеством разнообразных функций и сетевых протоколов. В частности доступна весьма интересная функция анализа проходящих через маршрутизатор пакетов - Layer7 protocol.

При помощи правильно составленных регулярных выражений можно гибко управлять потоками, блокировать адреса, выделять гарантированную полосу для протоколов и много другое. Данная функция открывает достаточно широкие возможности по определению вида трафика и его последующей сортировки.

Теория для Layer7 - RouterOS получает первые 10 пакетов каждого установленного соединения и ищет совпадения по заранее определенным выражениям, если совпадений не обнаружено, то дальнейший поиск прекращается и соединение считается не определенным. Если же совпадение нашлось, то в дальнейшем в разделах Filter rules, Nat, Mangle можно создать цепочки правил с действиями. 

Внимание - данная функция проверки регулярных выражений layer7-protocol корректно работает только в 6-й версии прошивки Mikrotik. На сегодня это версия 6.42.4.

Внимание - чрезмерное злоупотребление данной функцией и большое количество записей с разделе layer7-protocol может привести к нагрузке на устройство. Но потренироваться в написании регулярных выражений самое то. Насколько я понимаю главное это не забыть про маркированные списки.  Иначе получим высокую нагрузка на cpu роутера, увеличенную latency и потерю пакетов.

Была, кстати, такая же функция и в ранних версиях pfSense однако позже ее там убрали. Сообщество разработчиков pfSense решило что есть и другие достойные способы блочить лишний трафик. А жаль.

Дела.

Thursday, 21 June 2018

Запрос Get-WinEvent и его параметры.

Всем привет.

Продолжим вычитывать события с помощью Get-WinEvent. У одного админа была задача сформировать запрос Get-WinEvent в котором более 25 условий. Такие вот задачки ставят администратору. Почему 25, а не 125?  Не знаю. Жизнь штука сложная.

Ближе к делу. Для формирования запросов в  Get-WinEvent мы можем использовать 3 параметра:
-FilterXPath <String>
-FilterXml <XmlDocument>
-FilterHashtable <Hashtable[]>

Подробную справку по параметрам у Get-WinEvent найдете здесь.

Я просто поганял все три параметра для самых популярных, на мой взгляд, кодов событий:
4720 : A user account was created.
4722 : A user account was enabled.
4723 : An attempt was made to change an account’s password.
4724 : An attempt was made to reset an account’s password.
4725 : A user account was disabled.
4726 : A user account was deleted.

1) FilterHashtable.
Первый вариант использует период времени в сутки и сам код события $IDEvent.
Если нужен диапазон то $IDEvent = (4720..4726), если  несколько то $IDEvent = (4720,4722,4725) соответственно.

$time = (get-date) - (new-timespan -hour 24)
$QEvent = 0
$IDEvent = 4720

"Time  | ADGroup | NewUser | AdminUser | ID:"+ $IDEvent
Get-WinEvent -FilterHashtable @{LogName="Security";ID=$IDEvent;StartTime=$Time}| Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$QEvent = $QEvent +1;

$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$NewUser = $event.Event.EventData.Data[0]."#text"
$ADGroup = $event.Event.EventData.Data[2]."#text"
$AdminUser = $event.Event.EventData.Data[6]."#text"
$dc = $event.Event.System.computer
$Time + " | " + $ADGroup + " | " + $NewUser + " | " + $AdminUser
 }
}
"Count: "+$QEvent

Wednesday, 20 June 2018

Поиск закрытого видео по картинке.

Всем привет.

Еще раз убеждаешься что у интернета хорошая память. И если вы что-то спрятали от посторонних глаз в интернет то ваши друзья могут нам "помочь" это найти. Если быть точным то ваши друзья и, конечно же, Google. С оговоркой. Мои практические кейсы с поиском по фотографиям можно глянуть здесь и здесь.

Но сегодняшний кейс более сложный. В одном из музыкальных видео в youtube есть 5-ти секундный отрывок зажигательного танца на свадьбе. Разумеется никаких комментариев кто и когда зажигает там не было, так как само видео было совершенно по другому поводу. Мне захотелось посмотреть выступление невесты полностью.

Как поступаем? Ставим видео на паузу, делаем снимок. 



Идем в поиск по картинке Google и предлагаем ему наш снимок. Но Google сегодня подкачал, кроме как "на картинке девушка" ничего предложить не смог. Не сдаемся и идем в другой поисковик по картинками TinEye. Оп-па, он нам выдает 4 результата. Уже есть от чего отталкиваться. На поверку улов оказался еще лучше - вторым пунктом была ссылка не на похожие фото, а прямо на случайный сайт с полным видео с танцем.


А так как само видео, как обычно, располагалось на youtube то получить закрытую ссылку с того сайта "для своих" оказалось пустяковым делом.


Такие дела. И девушка молодец, отожгла по полной!

Monday, 18 June 2018

Запрещаем USB накопители.

Всем привет.

При подключении нового USB устройства к компьютеру, ОС автоматически определяет устройство и устанавливает подходящий драйвер, в результате чего пользователь практически сразу может использовать подключенный USB накопитель. 

В многих организациях для предотвращения утечки конфиденциальных данных и проникновения в сеть вирусов, возможность использования USB накопителей (флешки, USB HDD, SD-карты и т.п) отключена из соображений безопасности по умолчанию. 

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


Первой неплохо было бы включить именно политику "Запретить выполнение" со сьемных и других внешних накопителей. Как по мне это самая ценная возможность из всего списка. Однако это опция применима только к Компьютерам и отсутствует как для Пользователей. Также эта опция не применима к компьютерам на которых живет Windows ХР. Достаточно одной такой старушки и у вас будет брешь в безопасности сети.

К тому же у вас может быть группа техподдержки которой необходимо использование служебных флеш-накопителей. С одной стороны можно внести такие накопители в белый список разрешенных к использованию на фирме. С другой - как запретить пользователям использовать служебные флешки вне работы, дома например? Разве что они их должны сдавать своему шефу в конце дня. Или замыкать в служебном сейфе.

Только техническими средствами вы не добьётесь нормальной безопасности, особенно с инсайдером. Вначале должны быть приняты административные меры, и только потом - технические. Причем по административным мерам, извините, нужен пример показательной порки по случаю. Например оставить нарушителя без квартальной премии. Это сильно впечатляет, и может перевоспитать не один десяток любителей фото на природе).

Но помните, как бы они не закручивали гайки - все равно человеческий фактор не исключишь на 100%. И конфиденциальную информацию рано или поздно вынесут. Поэтому главные ваши силы все таки лучше сосредоточить на противодействии привнесения вредного кода через парадный вход. 

Удачи.

Sunday, 17 June 2018

Способы делегирования административных полномoчий в АD.

Всем привет.

Очевидно, что практически в каждой организации ИТ-подразделение включает в себя нескольких администраторов, и различные административные задачи должны быть распределены среди администраторов и администраторов филиалов.

Есть разные способы делегирования административных полномoчий в АD:

1) В OU Группа по меню «Свойства/Управляется/Изменить»  назначается Пользователь который может изменять только членство объектов в этой группе.

2) В OU Группа по меню «Делегирование управления…» назначается Пользователь которому далее назначается задача из предлагаемого списка, например «Создание, удаление и управление уч. записями пользователей».  Это дает ему право править в этой группе любой объект типа «Пользователь» и все его атрибуты.

3) С помощью создания Группы с ограниченным доступом. Создается еще одна группа администраторов которой назначаются ограниченные права на конкретный OU. 

Я много раз читал что таким образом можно предложить и отделу кадров править многие атрибуты пользователей, но никак не мог понять каким именно образом кадровики будут это делать.)

Думаю, с администратором филиала должно быть полегче. Итак, инструменты которыми можно править делегированные администратору филиала объекты AD:
- модуль RSAT Powershell: бесплатен, без GUI, требует знания Powershell, требует инсталляцию
- оснастка MMC «Пользователи и компьютеры AD»: бесплатен, не требует инсталляции.
- оснастка MMC ADSIEdit: бесплатен, не требует инсталляции
- утилита ADExplorer: бесплатен, не требует инсталляции
- утилита Softerra LDAP Administrator: 30 дней бесплатный период, требует инсталляцию.

Однако независимо от задачи делегирования существует видимость объектов в AD. По умолчанию все пользователи домена как члены группы «Прошедшие проверку» могут видеть все объекты в домене в режиме чтения.

Friday, 15 June 2018

PowerShell и другие языки программирования.

Привет всем.

Технический писатель Коробко Иван Викторович в своей книге "PowerShell как средство автоматического администрирования" 2012-го года издания еще раз показал нам насколько PowerShell является универсальным инструментом. Я имею ввиду его главу про "PowerShell и другие языки программирования". Просто передам слово автору.

Довольно часто возникает потребность использовать вставки VB.NET или C# в листинге PowerShell. Это обусловливается невозможностью реализовать тот или иной функционал в PowerShell. Как правило, любую манипуляцию с любым объектом можно выполнить с помощью API-функции, вызываемой на низком уровне. Ярким примером является служба DFS, программное управление которой возможно только с помощью API-функций. Чтобы упростить изложение материала  приведем пример вывода обычного окна сообщения – MessageBox(). Реализуем вызов сообщения с помощью вставки листинга программного кода, написанного на VB.NET, в тело сценария на PowerShell и с помощью вызова соответствующей API-функции, описанной в VB.NET.

Компиляция кода на DOT.NET в PowerShell

Интеграция в PowerShell кода компилируемых языков, например C# или VB.NET, осуществляется несколько иным механизмом. Вставка программного кода также компилируется, однако вместо файла записывается в оперативную память. Успешная интеграция программного кода на DOT.NET обеспечивается с помощью двух объектов: с помощью первого объекта – CompilerParameters – осуществляется настройка параметров компиляции указанного кода, идентификация языка программирования. Второй объект изменяется в зависимости от используемого языка программирования в ставке. Для C# – Microsoft.CSharp.CSharp-CodeProvider, а для Visual Basic - Microsoft.VisualBasic.VBCodePro-
vider.

Фрагмент исполняемого кода на DOT.NET представляет собой описание класса с произвольным именем и минимум одной функции, имя которой так же произвольно. Листинг является значением переменной, заключенной, помимо кавычек, в символы @ (листинги П4.1 (C#) и П4.2 (VB.NET). При переносе листинга из Visual Studio в PowerShell необходимо следить за тем, чтобы иерархический путь ко всем методам и функциям был указан целиком, так как импорт пространств имен не поддерживается. Таким образом, вывести окно с помощью MsgBox() невозможно, следует указать полный путь – Microsoft.VisualBasic.Interaction.MsgBox().

Листинг П4.1. Вызов VB.NET-вставки из PowerShell (C#)

$provider = New-Object Microsoft.CSharp.CSharpCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$refs = "System.dll","System.Windows.Forms.dll"
$params.ReferencedAssemblies.AddRange($refs)
$txtCode = @"
Class mBox
Sub Main()
Microsoft.VisualBasic.Interaction.MsgBox ("Тестовое сообщение")
End Sub
End class
“@
$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("mBox")
$r = $i.main()

Листинг П4.2. Вызов VB.NET-вставки из PowerShell (VB.NET)

$provider = New-Object Microsoft.VisualBasic.VBCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$refs = "System.dll","Microsoft.VisualBasic.dll"
$params.ReferencedAssemblies.AddRange($refs)
$txtCode = @"
Class mBox
Sub Main()
Microsoft.VisualBasic.Interaction.MsgBox ("Тестовое сообщение")
End Sub
End class
"@
$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("mBox")
$r = $i.main()

Компиляция вставки на DOT.NET осуществляется в оперативной памяти. За это отвечает свойство GenerateInMemory. После завершения компиляции осуществляется выполнение скомпилированного кода. Для обращения к нужной функции необходимо указать класс, в котором она находится, а затем и саму функцию.

Wednesday, 13 June 2018

Ловим двойников в AD по атрибуту email.

Всем привет.

Случается такое что у двух юзеров в AD указан один и тот же адрес email. То ли замене была, то ли кто-то уволился. Не важно. Мне надо срочно таких двойников отловить.

Пишем скрипт. Идея такова чтобы выбрать вначале все адреса по OU в файл List.txt.
А после парсить каждый OU по email-адресам из этого же файла на предмет совпадения где более одного. Название OU передадим параметром на вход powershell.

Скрипт test1.ps1:

$OU = $args[0]
$OU

#получаем список пользователей  OU с непустыми адресами в файл List.txt
get-ADUser -SearchBase $OU -Filter {(EmailAddress -like '*')} -Properties EmailAddress | Select EmailAddress,SamAccountName,Name,Enabled | ft -hidetableheaders | out-file List.txt -Encoding Oem

$Users = gc "list.txt" -Encoding Oem

"==========================================" | Out-File -FilePath dub.txt -Append
"Looking for email double addresses of AD-users in:" | Out-File -FilePath dub.txt -Append
$OU | Out-File -FilePath dub.txt -Append
"==========================================" | Out-File -FilePath dub.txt -Append

foreach ($Email in $Users)
 {
$User = $Email
IF ($Email.Length -ge 1)   
{
#вырезаем адрес и считаем количество его совпадений
        $Email = $Email.Substring(0,$Email.IndexOf(" "))
$EmailCount = (get-ADUser -SearchBase $OU -Filter {EmailAddress -like $Email} -Properties EmailAddress).count

#если совпадений более одного пишем этого юзера в файл dub.txt
         IF ($EmailCount -ge 1) { $User + ":" + $EmailCount | Out-File -FilePath dub.txt -Append }
        }
 }

А сам вызов для подразделения "OU=Support,DC=forza,DC=local" выглядит так:
powershell -NoProfile -ExecutionPolicy bypass -File test1.ps1 "OU=Support,DC=forza,DC=local"

Успехов.


Tuesday, 12 June 2018

Обслуживание WSUS.

Привет.

Решил себе составить краткий мануал по обслуживанию WSUS. Возможно вам будет полезно.

Распределение по группам: hosts как все станции, servers как сервера, pilotHosts это устойчивые клиенты и testGroup как "мальчики для битья".

Оснастка WSUS, ветка Обновления.

*Автоматические утверждения включены только на подгруппы testGroup.

1. Подветка "Критические Обновления".

1.1 Для подгрупп testGroup. 
Внимание: включить отображение колонок "Число необходимых установок" и "Замена".

1.1.1. Оценка какие хосты нуждаются в пришедших за ночь апдейтах:
Утверждение "Не утверждено", состояние "Требуется".
Оцениваем каждое обновление: оно не заменяется другим, подходит под версию ОС, Office или SQL-сервера: если Да (Число необходимых установок > 0), то утверждаем на соответствующую группу в testGroup.

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

1.1.2. Оценка как успешно прошли предыдущие утверждения:
 а) утверждение "Не утверждено", состояние "Установленный/неприменимо/нет состояния".
 В идеале здесь не должно быть ничего.
 б) утверждение "Утверждено", состояние "Установленный/неприменимо/нет состояния".
 В идеале здесь могут быть только обновления по которым информация от хостов еще не получена.

1.2. Для подгрупп hosts, servers, pilotHosts. 
1.2.1. Оценка какие хосты нуждаются в протестированных апдейтах:
Утверждение "Утверждено", состояние "Требуется". Оцениваем каждое обновление как: оно не заменяется другим, подходит под версию ОС, Office или SQL-сервера. Если Да, то утверждаем на соответствующую группу. Для ускорения операции утверждения можно использовать опцию "Применить к дочерним".

1.2.2. Оценка как успешно прошли предыдущие утверждения:
утверждение "Утверждено", состояние "Установлeнный/ неприменимо/нет состояния" или "Любой". В идеале здесь могут быть только обновления по которым информация от хостов еще не получена.

2. Подветка Обновления Безопасности.
2.1.1 Для подгрупп testGroup. 
Повторить шаги по аналогии выше.
2.1.2. Для подгрупп hosts, servers, pilotHosts. 
Повторить шаги по аналогии выше.

Ветка Компьютеры.

3. Группа "Все компьютеры". Состояние "Неудача". 
Оцениваем количество сбоев по каждому хосту. Открываем отчет, жмем "Неудача" напротив каждой ошибки,  смотрим Код ошибки и ее Описание. Смотрим дату последнего отчета о состоянии. Делаем выводы, предпринимаем ответные действия.

Коды многих ошибок WSUS здесь

4. Группа "Неназначенные компьютеры". Состояние "Любой". 
Оцениваем причину появления хоста здесь: смотрим его дату последнего отчета о состоянии. Сверяем политику принадлежности хоста к целевой группе в AD. Делаем выводы, предпринимаем ответные действия.

Оснастка "Диспетчер серверов":

5. меню WSUS, закладка "События". Оцениваем события категории "Ошибка".
Cмотрим oписание ошибок. Делаем выводы, предпринимаем ответные действия.

6. меню Средства/Диспетчер служб ISS. MYUPDATE, Пулы приложений, пул WSUSpool.
Здесь можно править параметры пула или перегружать его. 
Ограничения для работы пула по использованию памяти сервера и ресурсов процессора.

Sunday, 10 June 2018

Нетипова схема доставки вірусу.

Всім привіт.

Мені іноді здається що деякі віруси пишуть студенти в якості чергового проекту з інформаційного предмету. Так, це дуже корисно в плані саморозвитку для майбутнього спеціаліста. Але ж навіщо своє чудо випускати в світ? З іншого боку перегляд таких кейсів корисно і для нас. Ви тільки оценіть скільки технологій було задіяно щоб досягти мети зараження.

Кейс від Владислава Радецького IOC_HawkEye_110418.

Щодо спроби доставки #HawkEye (keylogger) який має нетипову схема доставки основного коду. Цей тип шкідливого коду застосовується для перехоплення вводу з клавіатури, відтак крадіжки облікових даних.

Аналітика.

Приманки та payload розміщені на серверах Amazon AWS (білий список для 90% URL-фільтрів).

Початковий .docx файл містить в одному із ресурсних .xml посилання на .rtf з вразливістю редактору формул. 

Вразливість редактору формул застосовується для завантаження та виконання .hta файлу.
.hta містить інструкції для PowerShell, який нарешті завантажує основну частину.

Основна частина зберігається на диск у Windows\Temp (не користувацька змінна оточення %temp%).

.hta чітко регламентує ім’я та шлях за яким буде збережена основна частина.

Закріплення через HKCU але не Run, а WinNT\Load.

Winword не генерує дочірніх процесів.

Виклик powershell від імені mshta.exe.

Не потребує прав Адміністратора.

Тобто схема така:
Attach (.DOCX) > OLE (17-0199) > GET .RTF > EQUENETD (17-11882) > HTA > PowerShell > GET payload > Windows\temp\shell.exe

1) DOCX файл що містить посилання на RTF у xml
2) RTF файл що завантажується при відкритті попереднього DOCX
3) HTA файл який завантажується при обробці попереднього RTF:
4) Основна частина яка звантажуєтеся засобами powershell при обробці HTA файлу.
5) ехе-Модуль основної частини що записується після активації попереднього файлу.

Вам сподобалось? Мені дуже. Як і та людина що складала це до купи і розкинула мізками. Просто молодець.

Щасти.

Saturday, 9 June 2018

ХР каламбур.

Привет.

Коротко - прохаживаясь по политикам обновлений наступил на старушку Windows ХР. Да вот, бывает в жизни и такой каламбур.

Собственно прочтите и сделайте вывод сами: включив этот параметр вы получите Да или Нет.)


Friday, 8 June 2018

Сравнение классов виртуальных машин в VMM.

Всем привет.

Как я писал ранее недавно у меня была возможность попробовать Virtual Machine Manager.  В Virtual Machine Manager надо было создать несколько виртуальных хостов. Так вот сейчас в VMM такая политика что виртуальные машины могут быть двух классов: Generation 1 и Generation 2.

Поколение виртуальной машины определяет виртуальное аппаратное обеспечение и функционал, предоставляемый создаваемой виртуальной машине. Возможность поддержки виртуальных машин поколения Generation 2 появилась начиная с Windows Server 2012 R2. Гипервизор Hyper-V установленный на базе Windows 2012 R2 позволяет использовать два типа виртуальных машин - Generation 1 и Generation 2. Виртуальные машины поколения Generation 2 представлены с упрощенной моделью виртуального аппаратного обеспечения и поддерживают возможность использования интерфейса UEFI (Unified Extensible Firmware Interface) вместо BIOS. Также дополнительно, для виртуальных машин поколения Generation 2 была исключена возможность использования эмуляции большинства legacy-устройств. Поколение Generation 1 позволяет использовать те же функции виртуального аппаратного обеспечения, которые были доступны при работе виртуальной машины на гипервизоре Hyper-V до выпуска версии системы Windows 2012 R2.

Поколение Generation 2 позволяет задействовать новый функционал:
- безопасная загрузка (Secure Boot (включен по умолчанию))
- загрузка системы из SCSI виртуального жесткого диска (Boot from a SCSI virtual hard drive)
- загрузка системы из виртуального SCSI DVD привода (Boot from a SCSI virtual DVD drive)
- загрузка системы по сети с использованием стандартного сетевого адаптера (PXE boot using a standard network adapter)
- поддержка UEFI (UEFI firmware support).

Thursday, 7 June 2018

Разница между Заблокированным, Отключенным и Неактивным аккаунтами в AD.

Всем привет.

Практика использования командлета Search-ADAccount показала мне разницу между Заблокированным, Отключенным и Неактивным аккаунтами. Собственно выводы ниже.

Список заблокированных учетных записей пользователей (кем заблокировано: пользователем например, согласно политике использования паролей):
Search-ADAccount -UsersOnly –LockedOut
ИЛИ по хостам:
Search-ADAccount -ComputersOnly –LockedOut (кем заблокировано ?):

Список отключенных учетных записей пользователей (кем отключено: Админом):
Search-ADAccount -UsersOnly -AccountDisabled
ИЛИ по хостам:
Search-ADAccount -ComputersOnly -AccountDisabled (кем отключено: Админом):

Список неактивных учетных записей пользователей ДО даты "mm.dd.yyyy":
Search-ADAccount –UsersOnly –AccountInactive -DateTime "mm.dd.yyyy"
ИЛИ
Search-ADAccount -ComputersOnly –AccountInactive -DateTime "mm.dd.yyyy"

В этих запросах можно использовать параметр TimeSpan или DateTime.
Разница между ними следующая:
  • TimeSpan 60 - диапазон времени для выборки "60 дней (или часов/минут) до сегодня";
  • DateTime "mm.dd.yyyy" - диапазон времени для выборки "столько то дней до даты "mm.dd.yyyy".
Увидимся.

Tuesday, 5 June 2018

Virtual Machine Manager и версия RDP.

Всем привет.

Мне представилась возможность попробовать Virtual Machine Manager для тестирования одного проекта в облаке.

Для запуска "Virtual Machine Manager" требуется использовать протокол RDP (Remote Desktop Protocol) версии не ниже 8.1, что в случае использования клиентом операционных систем семейства Windows, предполагает использование версии не ниже Windows7 SP1. Для работы с облаком необходимо что бы версия Remote Desktop Connection была не ниже 8.1 и поддерживала Remote Desktop Protocol не ниже 10.2.

Проверяем текущую версию протокола RDP:




Все хорошо. Однако при работе с RDP в Windows 10 может возникнуть другая "многозначительная" ошибка подключения: 


Эта ошибка правится, как и многое другое, просто в реестре Windows 10. В ветке реестра HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client создается ключик RDGClientTransport тип ключа REG_DWORD (DWORD 32-bit Value) с значением 1.

Продолжение следует.

Sunday, 3 June 2018

Administration WSUS with Powershell.

Hi guys.

Recently I have to make some new groups from AD in WSUS server. I wouldn't to type all names with my keyboard. Therefore I can do some mistake and it so boring. So I though that WSUS Powershell scripts are in this world.

I found super PoshWSUS package (PoshWSUS v2.3.2, Last Updated: 12 Apr 2018) from Boe Prox for performing my task. I think there is Get-PSWSUSGroup, so Set-PSWSUSGroup function have to be there too. Ok, so I imported module to my Powershell profile. Then I got the names of 96 functions! I found there Get-PSWSUSGroup and New-PSWSUSGroup functions.

Ok, let's go.
At fisrt I make connection to my WSUS server.
>Connect-PSWSUSServer
Name                 Version              PortNumber           ServerProtocolVersion
----                 -------              ----------           ---------------------
192.168.1.28         6.3.9600.18838       8530                 1.8

Then I can get the info of my existing groups in WSUS:
>Get-PSWSUSGroup

Then I can get the info of my PARENTGROUP group:
>Get-PSWSUSGroup | ?{$_.Name -like "PARENTGROUP"} | fl

ok, and I thought that I can create the new CHILDGROUP group easy as:
>New-PSWSUSGroup -Name "CHILDGROUP" -ParentGroup "PARENTGROUP"

Ooops, I got error of type conversion for ParentGroup parameter - New-PSWSUSGroup: Can not process the argument conversion for the "ParentGroup" parameter. Can not convert the value of "pilotHosts" type "System.String" to type Microsoft.UpdateServices.Internal.BaseApi.ComputerTargetGroup ".

Saturday, 2 June 2018

Аудит журналов безопасности с помощью PowerShell.

Всем привет.

Скажу сразу, я не знаю насколько это актуально. Но сам подход меня заинтересовал. Задача периодического отслеживания активности пользователей, которые используют сервер терминалов в качестве рабочих станций. Тем более что после небольшой правки в качестве сервера терминалов можно использовать даже вашу Windows 10. При этом ваша лицензия на 10-ку не страдает.

Разумеется я уже писал что с помощью PowerShell можно легко осуществлять парсинг событий журнала безопасности.
Например так:
$Events = Get-EventLog Security | ?{$_.eventid -eq 4624}

В условия отбора можно поставить и код события, и время, и много чего еще. Более того, вы можете выполнить выборку  с удаленного компьютера, и даже выполнить так называемую Подписку на интересующие вас события. Однако про Подписку позже.

С некоторой версии PowerShell появился командлет Get-WinEvent, который можно использовать не только для определения имен журналов в Windows.

В нем предыдущий запрос будет выглядеть так:
$filter = "*[System[EventID=4624]]"
Get-WinEvent -FilterXPath $filter -LogName Security

Так вот, один спец решил украсить себе жизнь и наваял скрипт который не просто парсит журнал Security, но и выделяет цветами результат. С тех пор прошло немало времени поэтому скрипт в части палитры надо поправить. Иначе на выходе получите 0.

Friday, 1 June 2018

Вызов функции Powershell из внешнего скрипта.

Всем привет.

Себе напоминаю и вам подсказываю. Часто в Powershell необходимо вызвать скрипт или отдельную функцию из другого файла.

Если мы уже находимся в папке где находится скрипт test1.ps1 то пишем:
powershell -ExecutionPolicy bypass -File test1.ps1

Если мы находимся в другом месте и указание полного пути к файлу нас устраивает:
powershell -ExecutionPolicy bypass -File D:\PS\test1.ps1

Вызов функции Get-OfficeVersion из файла RemoveOffices.ps1 который находится тут же:
powershell -ExecutionPolicy bypass -command "& {. .\RemoveOffices.ps1; Get-OfficeVersion | fl}"

Это была командная строка. Теперь как тоже самое сделать из другого скрипта. В этом случае в него помещается две строчки кода.

Для одной папки так:
.\RemoveOffices.ps1
Get-OfficeVersion

А вот так если файл RemoveOffices.ps1, находящийся во вложенной папке Scripts:
. .\Scripts\RemoveOffices.ps1
Get-OfficeVersion

А вот так если папка с скриптами находится выше на ступень от скрипта, который ими пользуется
. ..\Scripts\RemoveOffices.ps1
Get-OfficeVersion

Запомнили? Молодцы.