Sunday 29 August 2021

Аудит членства локальных групп.


Всем привет.

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

Используем для этого Powershell. Итак, выберем членов соответствующих групп у которых PrincipalSource указано Local, что говорит от том учетная запись именно локальная.

Get-LocalGroupMember -Name Administrators | where -Property PrincipalSource -eq Local

Get-LocalGroupMember -Name "Remote Desktop Users"  

или так:

Get-LocalGroupMember -Name Администраторы | where -Property PrincipalSource -eq Local

Get-LocalGroupMember -Name "Пользователи удаленного рабочего стола" 


Get-LocalUser | Select -Property Name,Enabled,LastLogon,Description


Если в выводе Get-LocalGroupMember мы получаем в поле PrincipalSource значение ActiveDirectory то уточняем учетные записи пользователей как, например, для группы WS-Local-Admins:

Get-ADGroupMember 'WS-Local-Admins' | Select name | Sort name

Такой запрос хорошо работает локально. Для аудита локальных пользователей на удаленном компьютере нужно сначала подключится к нему через WinRM командлетами Invoke-Command или Enter-PSSession. Например, так можно собрать список учетных записей в локальной группе на удаленных хостах:

$UserCredential = Get-Credential

$S = New-PSSession -CN pc01,pc02,pc03 -Credential $UserCredential

Invoke-Command -scriptblock {Get-LocalGroupMember -Name "Remote Desktop Users"} -session $s -hidecomputername |

 select * -exclude RunspaceID | Out-Gridview -title "Remote Desktop Users"

или так:

Invoke-Command -FilePath .\list.ps1 -session $s -hidecomputername | select * -exclude RunspaceID | Out-Gridview -title "Local Admins"

где list.ps1 содержит:

Get-LocalGroupMember -Name Administrators | where -Property PrincipalSource -eq Local

Get-LocalGroupMember -Name "Remote Desktop Users"  

Get-LocalUser | Select -Property Name,Enabled,LastLogon,Description

Успехов.

Friday 27 August 2021

Используем PowerShell Remoting.

Всем привет.

Такая мега-полезная фича как PowerShell Remoting основана на реализации протокола Web Services for Management (WS-Management), а для связи использует службу  Windows Remote Management (WinRM). Связь между компьютерами осуществляется по HTTP или HTTPS. Весь трафик между двумя компьютерами шифруется на уровне протокола (за исключением случаев, когда используется SSL). Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos.

В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт 5985(или 5986) на брандмауэре.

Но сперва надо подготовить удаленный хост PC1 к внешним запросам:

Enable-PSRemoting -Force

Эта комадна устанавливает следующее:

- WinRM start automatically

- WinRM accept remoting requests

- Firewall allow remoting requests

Также следует изменить тип сети на частную (private) так:

Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private

или использовать команду:

Enable-PSRemoting –SkipNetworkProfileCheck

Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:

Test-WsMan PC1

Точно также вы можете протестировать, можно ли подключится через PowerShell Remoting к компьютеру локально:

Test-WSMan localhost

Sunday 22 August 2021

Передача параметров в PowerShell.


Всем привет.

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

Самый простой вариант передачи данных - использовать встроенную переменную $args, которая имеет тип одномерный массив (hashtable). Для этого создадим скрипт с именем service.ps1 вот такого содержания:

Get-Service -Name $args[0] -ComputerName $args[1]

Этот скрипт должен вывести состояние заданного сервиса\сервисов для одного или нескольких компьютеров. Имя сервиса и компьютера передаются в скрипт в качестве аргументов.

Теперь выполним его, указав в качестве аргументов сервис печати (spooler) и имя компьютера SRV1:

.\service.ps1 spooler SRV1

Получив эту команду, PowerShell подставит вместо $args[0] название сервиса, вместо $args[1] имя компьютера и выведет полученный результат.

При использовании $args каждое из указываемых значений добавляется в массив, в результате мы получаем возможность передавать в сценарий любое необходимое количество параметров. Однако аргументы должны вводиться ровно в том порядке, в каком они указаны в сценарии, что при большом количестве аргументов может привести к путанице. Кроме того, этот способ ограничивает нас в определении параметров.

Более эффективным способом передачи параметров является использование в сценарии блока param. Для примера возьмем наш сценарий и изменим его:

Param (

[string]$service,

[string]$computer

)

Get-Service -ServiceName $service -ComputerName $computer

Friday 20 August 2021

Windows Performance Analyzer - хочу знать все.

Всем привет.

В сегодняшнем посту я упомяну о прекрасном инструменте под названием - Windows Performance Analyzer (WPA), который как никто другой позволяет выполнять диагностику автозапуска программ Windows и показывает, сколько времени отнимает у загрузки вашей операционной системы та или иная программа.

- Почему именно Windows Performance Analyzer? - Ведь он довольно сложный в этом отношении. 

Да, в цифровом мире существует много программ, пользоваться которыми избегают обычные пользователи по причине их сложности, предпочитая более простые. Но уверяю вас, с Windows Performance Analyzer вам просто не хватило времени разобраться, а разобраться стоит, так как на данный момент не существует бесплатного инструмента способного его заменить. К примеру, чтобы определить какая именно программа тормозит загрузку вашей Windows, нужно узнать время загрузки (в миллисекундах) всех приложений по отдельности, загружающихся вместе с ОС, также необходимо узнать время загрузки всех системных процессов по одному. Т.е. нужна наглядная картинка корреляции многих данных. И справится с этим вам поможет именно Windows Performance Analyzer.

Чтобы вам  стало более понятно, предлагаю разобрать конкретный кейс Романа Нахвата - установка на компьютер программ Skype, uTorrent, Download Master и FTP-клиент FileZilla, и последующий анализ запуска(и тормозов) системы с помощью WPA.


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

От себя добавлю, что Windows Performance Analyzer позволяет проанализировать любой процесс, не обязательно со старта ОС. Ему только лишь надо подготовить пищу для анализа, а именно провести  накопление данных в ЕТL-формате.

Например так:

wpr -start CPU -start DiskIO -start FileIO

newproc.exe # здесь должен запуск вашего исследуемого процесса

pause 

wpr -stop с:\newporc21.etl

И все, теперь он ваш. Успехов вам в исcледовании.



Wednesday 18 August 2021

SCCM - нюансы инсталляции приложений.

Всем привет.

Сегодня для вас вторая заметка в формате конспекта из серии публикаций Сергея Болдина, посвященных использованию SCCM 2012 R2. Как я писал ранее, в SCCM существует два способа автоматической инсталляции программного обеспечения: package (пакетный) и application (приложений).

Пакетный способ.

Пакетный метод прост, имеет меньше настроек, потому менее гибок. Как говорится, без излишеств. Ниже пример кода для установки Far3 – файловый менеджера, который выглядит так:

%~dp0Far3_x64.msi /qn

xcopy "\\sccm01.forza.com\SMS_DDD\Source\Far3\Addons" "C:\Program Files\Far Manager"/q/e/s/y

exit /B %EXIT_CODE%

А вот пример для установки  MS Office 2016 имеет несколько нюансов. Тонкая настройка происходит в Microsoft Office Customization Tool (Центр развертывания Microsoft Office). Для его запуска нужно в командной строке набрать: setup.exe /admin

В появившемся мастере настроек нам необходимо два пункта: 

- Licensing and user interface (Лицензирование и пользовательский интерфейс).

Тут выбираем способ активации, Display Level (Отображать уровень), выбираем None (Нет) и активируем галочку Suppress modal (Подавлять модальные окна);

- Set feature installation states (Задание режимов установки компонентов). Здесь среди всего перечня указываем нужные компоненты для установки, а лишние отключаем.

Затем необходимо сохранить настройки в файле .MSP в папке Updates, и только теперь в командном файле прописать обычный запуск exe-файла без ключей:

%~dp0Setup.exe

Tuesday 17 August 2021

Cоздание ЕХЕ из Python-файлов.


Всем привет.

Утилита py2exe позволяет превратить любой скрипт на Python в монолитный исполняемый файл Windows, и запускать без наличия интепретатора Python в системе.

Домашняя страница проекта - http://www.py2exe.org/index.cgi/FrontPage.

Вначале подготовим площадку для конвертации .py -> .exe. Установим сам Python. Проверим связь Python-файлов в Windows:

c:>assoc .py

.py=Python.File

c:>ftype Python.File

Python.File="C:Python27python.exe" "%1" %*

Теперь зная какой у нас Python - качаем файл самого конвертора со страницы  http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/, в данном случае - py2exe-0.6.9.win32-py2.7.exe. Устанавливаем его. Чтобы убедиться, что все пакеты готовы к работе - запускаем консоль и проверяем:


Если сообщений импорта нет - то всё Ok.

Для создания своего exe-файла - нам потребуется создать файл setup.py с такими содержимым:

# py2exe download link: http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/

from distutils.core import setup

import py2exe, sys, os

sys.argv.append("py2exe")

setup(

    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},

    windows = [{'script': "Client.py"}],    

    zipfile = None

)

Wednesday 11 August 2021

Запрос версии Windows из домена.

Всем привет.

В связи с модой на обновления не только ОС, но и самих ядер Windows понадобилась выборка реальной ситуации по всем рабочим станциям в домене. Тут имеет смысл делать выборку значения атрибута OperatingSystemVersion. Это номер сборки ОС. Ему в соответствие надо поставить номер версии ОС, так как это делает команда winver.


Поэтому возможные пары значений сборка+версия предварительно заносим в отдельный файлик Cores.csv, и далее пишем скрипт запроса в Powershell:

$cores = Import-CSV -Encoding UTF8 -path "d:\ps\Cores.csv" -Delimiter ";" 

#Type of output file: CSV or TXT

$TypeOfFile = 'txt'


foreach($core in $cores){

$core.name

$corename = '*(' + $core.Name + ')'

if ($typeoffile -eq 'csv'){

  $filename = 'd:\'+ $core.CoreV +'.csv'  

  }

  else { $filename = 'd:\Cores.txt'  

         "Version of core: "+$core.coreV | Out-File $filename -Append -Force -Encoding UTF8

       }

 $str1 = Get-ADComputer -filter {(OperatingSystemVersion -like $corename) -and (Enabled -eq 'True') -and (OperatingSystem -notlike '*Server*')} -properties CanonicalName,Description | Select Name,CanonicalName,Description 

if ($str1) {$str1 | Out-File $filename -Append -Force -Encoding UTF8} else {"No hosts." | Out-File $filename -Append -Force -Encoding UTF8}

Где файл Cores.csv имеет следующее содержание:

Name;CoreV;

19043;21H1;

19042;20H2;

19041;2004;

18363;1909;

18362;1903;

17763;1809;

17134;1803;

16299;1709;

15063;1703;

14393;1607;

10568;1511

Успехов.

Saturday 7 August 2021

Анализ дампа памяти фреймворком Volatility.

Всем привет.

Криминалистический анализ дампов памяти - метод исследования, который включает в себя поиск и извлечение криминалистических артефактов из физической памяти компьютера (ОЗУ). В памяти компьютера хранится ценная информация о состоянии системы во время выполнения. Создание дампа памяти и его анализ дадут необходимую для расследования информацию, например о том, какие приложения работают в системе, к каким объектам (файлу, реестру и т. д.) эти приложения обращаются, сведения об актив ных сетевых соединениях, загруженных модулях, загруженных драйверах ядра и другую информацию. По этой причине криминалистический анализ дампов памяти используется при реагировании на компьютерные инциденты и анализе вредоносных программ.

Создание дампа памяти – это процесс получения дампа энергозависимой памяти (ОЗУ) в виде энергонезависимого хранилища информации (файла на диске). Существуют различные инструменты, которые позволяют создать дамп памяти физического устройства. Ниже приведен ряд инструментов, которые позволяют создать дамп физической памяти в Windows. Некоторые из них являются коммерческими, а многие можно скачать бесплатно после регистрации. Следующие инструменты работают как на 32-разрядных, так и на 64-разрядных компьютерах:

  • Comae Memory Toolkit (DumpIt) от Comae Technologies (можно скачать бесплатно после регистрации): my.comae.io;
  • Belkasoft RAM Capturer (можно скачать бесплатно после регистрации): belkasoft.com/ram-capturer;
  • FTK Imager от AccessData (можно скачать бесплатно после регистрации): accessdata.com/product-download;
  • Memoryze от FireEye (можно скачать бесплатно после регистрации): www.fireeye.com/services/freeware/memoryze.html;
  • Surge Collect от Volexity (коммерческий): www.volexity.com/products-over-view/surge/;
  • OSForensics от PassMark Software (коммерческий): www.osforensics.com/osforensics.html;
  • WinPmem (бесплатный), часть криминалистического фреймворка Rekall Memory: blog.rekall-forensic.com/search?q=winpmem.

В большинстве случаев вы можете сделать дамп памяти виртуальной машины, приостановив ее. Например, после выполнения образца вредоносного ПО на рабочей станции VMware вы можете приостановить виртуальную машину, которая запишет гостевую память (RAM) в файл с расширением .vmem на диске главного компьютера. В случае с такими приложениями, как VirtualBox, когда дамп памяти нельзя сделать путем приостановки, вы можете использовать утилиту типа DumpIt на гостевом компьютере.

После того как вы сделали дамп памяти зараженной системы, следующим шагом является анализ полученного образа. Volatility представляет собой лучший фреймворк для компьютерной криминалистики с открытым исходным кодом, написанный на Python, позволяющий анализировать и извлекать цифровые артефакты из образа памяти. Volatility может работать на различных платформах (Windows, macOS и Linux). Он поддерживает анализ памяти из 32-разрядных и 64-разрядных версий Windows, MacOS и операционной системы Linux.

Volatility распространяется в нескольких форматах, и его можно скачать на странице www.volatilityfoundation.org/releases. В зависимости от операционной системы, на которой вы собираетесь запускать Volatility, следуйте процедуре установки для соответствующей ОС.

Самый быстрый способ начать работу с Volatility – использовать автономный исполняемый файл. Автономный исполняемый файл распространяется для операционных систем Windows, macOS и Linux. Его преимущество состоит в том, что вам не нужно устанавливать интерпретатор Python или зависимости Volatility, поскольку он поставляется с интерпретатором Python 2.7 и всеми необходимыми зависимостями.

Friday 6 August 2021

Выполнение скриптов в SCCM на лету.

Всем привет.

MS SCCM имеет полезную фишку в библиотеке - Scripts. SCCM позволяет выполнять Powershell script-ы на целевых коллекциях или хостах без выгрузки кода скрипта в виде файла и  последующего запуска. Т.е. в таком случае можно оперативно выполнить запрос или задать параметр в ОС хоста, даже если выполнение Powershell-скриптов запрещено политикой компании. Простой пример: удалим софт по имени, который был установлен некорректно. Т.е. штатно его удалить невозможно.

Пишем код: 

Param (

[string]$Prgname

)

$PSVersionTable.PSVersion

$app = Get-WmiObject -Class Win32_Product -Filter "Name like '%$Prgname%'"

$app.Uninstall()

утверждаем (approve) его и пытаемся выполнить в нужной коллекции.


Результат выполнения смотрим, как обычно, в Мониторинге. Вывод работы скрипта, если таковой предусмотрен, можно получить в формате Raw или JSON.

Monday 2 August 2021

Как исправить кириллицу в ISE.

Всем привет.

Традиционные приложения Windows запускаемые в консоли cmd.exe, как правило не являются unicode-приложениями. Иначе говоря, они ожидают ввод и выводят информацию в обычной кодировке, например, CP866 или CP1251. С другой стороны, Powershell является unicode-приложением. Это означает, что Powershell должен выполнять перекодировку в обе стороны при вызове native application. По умолчанию он это делает в большинстве случаев правильно. Но если на целевой системе вместо кодировки по умолчанию для non-unicode программ стоит не «Русский», что соответствует CP866, а «Английский» - CP437, при работе «русской» native application мы получим проблемы: программа не будет понимать ввод, а ее вывод будет абракадаброй.

В Powershell за перекодировку отвечают две переменные:

[Console]::OutputEncoding : отвечает за перекодировку <native application> -> <Powershell>

$OutputEncoding : отвечает за перекодировку <Powershell> -> <native application>

Есть ещё [Console]::InputEncoding, которая отвечает за ввод с клавиатуры в консольное приложение.

Например при попытке получить результат команды ping увидим такое:


Sunday 1 August 2021

Анализ логов RDP подключений.


Всем привет.

Время от времени администратору необходимо проводить аудит логов RDP подключений в Windows. Как правило, это может пригодиться при расследовании различных инцидентов на терминальных / RDS серверах Windows, когда от системного администратора требуется предоставить информацию: какие пользователи входили на RDS сервер, когда авторизовался и завершил сеанс конкретный пользователь, с какого устройства (имя или IP адрес) подключался RDP-пользователь, и т.п. 

Используем Powershell. Самый простой запрос:

Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'Тип входа:\s+(10)\s'} |  select -First  5 | Select $_.Message 

И более развернутый вариант. Обращаю ваше внимание на различие запросов по языку интерфейса.

# English версия

Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'Тип входа:\s+(10)\s'}| %{

(new-object -Type PSObject -Property @{

TimeGenerated = $_.TimeGenerated

ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'

UserName = $_.Message -replace '(?smi).*Account Name:\s+([^\s]+)\s+.*','$1'

UserDomain = $_.Message -replace '(?smi).*Account Domain:\s+([^\s]+)\s+.*','$1'

LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'

})

} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `

, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `

, @{N='LogType';E={

switch ($_.LogonType) {

2 {'Interactive - local logon'}

3 {'Network conection to shared folder)'}

4 {'Batch'}

5 {'Service'}

7 {'Unlock (after screensaver)'}

8 {'NetworkCleartext'}

9 {'NewCredentials (local impersonation process under existing connection)'}

10 {'RDP'}

11 {'CachedInteractive'}

default {"LogType Not Recognised: $($_.LogonType)"}

}

}} | Export-Csv RDP-eng.txt  -Encoding UTF8

Версия на печать

Популярное