Wednesday, 1 December 2021

Членство в коллекции SCCM.


Всем привет.

Не редко бывает необходимость добавить(удалить) в коллекции SCCM всего один хост, который не подчиняется заданным правилам. Мышкой нащелкать можно, но скучно. Поэтому лучше для это использовать Powershell.

Как инициировать сессию к сайту SCCM я писал ранее, поэтому сегодня просто пройдусь по командам.

Найти хост:

Get-CMDevice -CollectionName "All Computers" | where {$_.name -like '*0008*'} 

Найти пользователя:

Get-CMUSER -CollectionName "All Users" | where {$_.name -like '*Pupkin*'} | ft name

Получаем текущие логины на хостах главной колекции:

(Get-CMDevice -Name $Computer -CollectionName "All Computers").UserName

Получить всех членов коллекции "Forza Upgrade":

Get-CMDeviceCollection –Name "Forza Upgrade"

Получить имена всех членов коллекции "Forza" и ID коллекций в которых они состоят:

Get-CMDeviceCollection –Name "Forza*" | Select Name,CollectionID

Добавляам хост T3-WKS007 в коллекцию c ID "UA1009DA" (ID получен из предыдущего запроса):

$CMCollectionID = "UA1009DA"

$Computer = "T3-WKS007" 

Add-CMDeviceCollectionDirectMembershipRule -CollectionID $CMCollectionID -ResourceId $(Get-CMDevice -Name $Computer -CollectionName "All Computers").ResourceID

Ищем хост T3-WKS007 в главной коллекции:

Get-CMDevice -Name $Computer -CollectionName "All Computers"

А теперь ищем хост T3-WKS007 в нашей коллекции:

Get-CMDevice -Name $Computer -CollectionName "Forza Upgrade"

Или удаляем хост T3-WKS007 из коллекции UA1009DA:

Remove-CMDeviceCollectionDirectMembershipRule -CollectionID $CMCollectionID -ResourceId $(Get-CMDevice -Name $Computer -CollectionName "All Computers").ResourceID

Успехов.

Tuesday, 23 November 2021

Практические кейсы с Volatility.

Всем привет.

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

Как правило, для ана­лиза оперативной памяти используют нес­коль­ко при­ложе­ний: Volatility, Memoryze и Autopsy. Autopsy конечно же удобный инструмент, который может одним нажатием кнопки сделать комплексный анализ всего дампа. Но, если речь идет о кейсах когда вы ограничены о времени, тогда важна скорость получения результатов, т.е. лучше использовать, что-то другое консольное. Поэтому сегодня я для анализа дампа оперативной памяти буду исполь­зовать Volatility.

Для своих тестов я взял три дампа Windows:

1) ch2.dmp, Win7SP0x86 получен здесь.

2) memdump.mem, WinXPSP3x86 получен самостоятельно.

3) challenge.vmem, Win10x64_18362 получен здесь.

Сразу оговорюсь что с третьим кейсом у меня получился фейл. Традиционный запрос на определение профиля дампа:

volatility_2.6_win64_standalone.exe -f challenge.vmem imageinfo

мне ничего не выдал. Даже подстановка вручную профиля Win10x64 к успеху не привела. Так что далее я работал только с первыми двумя дампами.

Case 1.

Получение имени компьютера с моей точки зрения не является чем-то важным, поэтому это присходит буквально за два шага извлечением значения ключа реестра из ControlSet001\Control\ComputerName\ActiveComputerName:

volatility_2.6_win64_standalone.exe -f ch2.dmp --profile=Win7SP0x86 hivelist

volatility_2.6_win64_standalone.exe -f ch2.dmp --profile=Win7SP0x86 hivedump -o 0x8b21c008 > hi_dump.txt

findstr "ComputerName" hi_dump.txt

volatility_2.6_win64_standalone.exe -f ch2.dmp --profile=Win7SP0x86 printkey -K "ControlSet001\Control\ComputerName\ActiveComputerName"

В качестве бонуса к заданию я попытался реконструировать снимок последнего desktop-a.

volatility_2.6_win64_standalone.exe -f ch2.dmp --profile=Win7SP0x86 screenshot -D F:\Case\Dump

Однако сборка версии 2.6 заточена на библиотеку PIL, где и я получил ошибку "Please Install PIL". PIL уже давно именуется как Pillow, что требует перекомпиляцию всего кода volatility, поэтому более быстрым решением стало использование версии volatility 2.4:

volatility-2.4.standalone.exe -f ch2.dmp --profile=Win7SP0x86 screenshot --dump-dir=/


Wednesday, 17 November 2021

Уникальный плагин для Teams.

Всем привет.

Cегодня утром при запуске всеми обожаемого Teams-а выплыло предложение установить плагин Helper v1.0. Не вдаваясь в детали Алекс согласился. После установки плагина Teams попросил перезапуск, вслед за ним на перезапуск попросилась и сама Windows.

После нового старта Teams-а Helper провел анализ времени продуктивной работы за неделю и запланированных собраний. И выдал напоминание на экран что Алексу буквально вчера рекомендовали изменить фон видеочата. Да, участвовать в митингах из дому удобно, но эта стена в его комнате... Алекс по привычке потянулся оформлять заявку на сервис-деск...

- Я могу сделать это прямо сейчас. - выскочило в новом окне.

- Вот как? А ну-ка покажи варианты. - отстучал Алекс в ответ.

Фон позади Алекса изменился на светлый офис с видом на деловой квартал города.

- А еще?

Фон позади начал меняться с частотой в одну секунду... 

- О, вот эти пальмы, прибой, океан,...то что надо. - поспешил заметил Алекс.

- Нет, не пойдет, - вежливо заметил Helper.

- Как это "не пойдет"? - возмутился Алекс.

- Смотри сам - невозмутимо заметил Helper.

При этом изображение Алекса за пару секунд растворилось до слабовидимых контуров на экране.

- Это еще что за глюк?

- Мои алгоритмы анализа совместимости говорят мне что ты являешься лишним на таком фоне. - также невозмутимо продолжил Helper.

- Ты ваще офигел? Алгоритмы видите ли?! Это я то лишний? - Алекс не находил себе места.

- Алекс, а зачем тебе другой фон? - продолжил Helper.

- Что? Фон?! Ты видишь что у меня за спиной? - Алекс был вне себя.

- Ну не то чтобы очень, но этот ковер из прошлого века на стене наводит грусть даже на меня. Ты что-то там прячешь? - спросил Helper.

- Не твое дело. У меня совещание завтра. Говорят что в Teams можно поменять фон на время митинга. Это что - проблема?

- Вовсе нет. А ты не пробовал поменять сам ковер или, на худой конец, повернуть камеру? - спросил Helper.

- Меня все устраивает и так! - отрезал Алекс.

- Как интересно, все устраивает, кроме фона для завтрашнего митинга...! - Helper взял паузу.

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

К 8-ми утра Алекс приготовил себе кофе, и привычным кликом активировал утренний митинг. На экране он увидел себя, а позади солнце, пальмы, прибой океана,...то что надо. Плагин работает! Пальмы на экране раскачивались при дуновении ветра, волны нехотя накатывались на белый песок.

- Класс, даже анимацию всунули. - заметил улыбаясь Алекс.

Митинг закончился быстро. Кто-то даже пошутил про новый фон Алекса. "Зато не ковер!" - отметил он про себя. По окончании митинга выплыло сообщение оценить качество связи, в котором Алекс поставил твердую пять. Затем выплыл еще один запрос - желает ли Алекс использовать новую версию фона по умолчанию. Он, не задумываясь, ответил "Yes". Алекс услышал крики чаек, чуть помедлив сбросил туфли и с наслаждением погрузил свои ноги в белый песок. Он почувствовал как океан осторожно коснулся его ног... тропическое солнце становилось все ярче...

Плагин работал на полную.

Tuesday, 16 November 2021

Подписываем PowerShell скрипт с помощью сертификата.


Всем привет.

Наличие цифровой подписи у скрипта или исполняемого файла позволяет пользователю удостовериться, что файл является оригинальным и его код не был изменен третьими лицами. В современных версиях PowerShell есть встроенные средства для подписывания кода файла скриптов *.ps1 с помощью цифровых сертификатов.

Для подписывания скриптов PowerShell нужно использовать специальный сертификат типа Code Signing. Этот сертификат может быть получен от внешнего коммерческого центра сертификации, внутреннего корпоративного Certificate Authority (CA) или можно даже самоподписанный сертификат.

Шаг 1 - сертификат.

В первую очередь нам нужно получить сертификат типа CodeSign из локального хранилища сертификатов текущего пользователя. Сначала выведем список всех сертификатов, которые можно использовать для подписывания кода:

Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert

Возьмем первый сертификат и сохраним его в переменную $cert.

$cert = (Get-ChildItem cert:\CurrentUser\my –CodeSigningCert)[0]

Затем можно использовать данный сертификат, чтобы подписать файл PS1 с вашим скриптом PowerShell:

Set-AuthenticodeSignature MyTest.ps1 -Certificate $cert

Или

Set-AuthenticodeSignature -Certificate $cert -FilePath MyTest.ps1

Теперь можно проверить, что скрипт подписан. Можно использовать командлет Get-AuthenticodeSignature  или открыть свойства PS1 файла и перейдти на вкладку Digital Signatures: Get-AuthenticodeSignature MyTest.ps1 | ft -AutoSize

Если при выполнении команды Set-AuthenticodeSignature появится предупреждение  UnknownError, значит наш сертификат недоверенный, т.к. находится в персональном хранилище сертификатов пользователя. Нужно переместить его в корневые сертификаты:

Move-Item -Path $cert.PSPath -Destination "Cert:\LocalMachine\Root"

Хотя наш сертификат теперь из доверенного Центра Сертификации, но он не от доверенного издателя. Поэтому следует его также скопировать в раздел Trusted Publishers с помощью обычной операции Copy-Paste в консоли Certificates.

Saturday, 13 November 2021

REST API и PowerShell.

Всем привет.

Теперь, когда вы знаете, как работать с данными JSON, давайте сделаем нечто более интересное: мы воспользуемся PowerShell для запроса REST API и анализа полученных результатов. Вы можете использовать практически любой REST API, но для некоторых требуется  аутентификация, поэтому будем использовать тот, который ее не требует. Используем сервис postcodes.io как вариант REST API, который позволяет вам запрашивать почтовые индексы стран по различным критериям.

Мы будем использовать URI api.postcodes.io/random/postcodes. Когда вы обращаетесь к этому URI, он запрашивает службу API postcodes.io и возвращает случайный почтовый индекс в форме JSON. Чтобы запросить этот URI, мы будем использовать PowerShell-командлет Invoke-WebRequest:

PS> $result = Invoke-WebRequest -Uri 'http://api.postcodes.io/random/postcodes'

PS> $result.Content


{"status":200,"result":{"postcode":"IP12

2FE","quality":1,"eastings":641878,"northings":250383,"country

:"England","nhs_ha":"East of England","longitude":

1.53013518866685,"latitude":52.0988661618569,"european_elector

al_region":"Eastern","primary_care_trust":"Suffolk","region":"

East of England","lsoa":"Suffo

lk Coastal 007C","msoa":"Suffolk Coastal

007","incode":"2FE","outcode":"IP12","parliamentary_constituen

cy":"Suffolk Coastal","admin_district":"Suffolk Coa

stal","parish":"Orford","admin_county":"Suffolk","admin_ward":

"Orford & Eyke","ccg":"NHS Ipswich and East

Suffolk","nuts":"Suffolk","codes":{"admin_distri

ct":"E07000205","admin_county":"E10000029","admin_ward":"E0501

449","parish":"E04009440","parliamentary_constituency":"E14000

81","ccg":"E38000086","nuts"

:"UKH14"}}}

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

Популярное