Сценарий power shell с возможностями захвата видео с веб-камеры

PowerShell Script with Webcam Video Capture Capabilitiesedit

Detects PowerShell scripts that can be used to record webcam video. Attackers can capture this information to extort or spy on victims.

: query

  • winlogbeat-*
  • logs-windows.powershell*

: 47

: 5m

Searches indices from: now-9m (Date Math format, see also Additional look-back time)

Maximum alerts per execution: 100

  • Domain: Endpoint
  • OS: Windows
  • Use Case: Threat Detection
  • Tactic: Collection
  • Data Source: PowerShell Logs
  • Elastic

: Elastic License v2

Computer Configuration >
Administrative Templates >
Windows PowerShell >
Turn on PowerShell Script Block Logging (Enable)

Steps to implement the logging policy via registry:

reg add "hklm\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1
event.category:process and host.os.type:windows and powershell.file.script_block_text : ( "NewFrameEventHandler" or "VideoCaptureDevice" or "DirectX.Capture.Filters" or "VideoCompressors" or "Start-WebcamRecorder" or ( ("capCreateCaptureWindowA" or "capCreateCaptureWindow" or "capGetDriverDescription") and ("avicap32.dll" or "avicap32") ) )

: MITRE ATT&CKTM

Приложение 1. Возможные проблемы при установке и работе с VMS

Установщик не открывается после перезагрузки компьютера.

  1. Откройте «Этот компьютер»«Диск С»«vms-installer». Папку «Этот компьютер» можно найти через поиск в меню «Пуск».
  2. Зажмите на клавиатуре клавишу Shift и кликните правой кнопкой мыши по свободному месту в папке.
  3. Появится дополнительная команда: «Открыть окно PowerShell здесь». Выберите её.

    Экран: выбор команды «Открыть окно PowerShell здесь»

  4. В открывшемся окне введите .\VmsInstaller.exe /step2. Нажмите Enter.

    Консоль Windows PowerShell: введение команды

  5. Подтвердите запуск установщика во всплывающем окне, нажав «Да».

    Экран контроля учётных записей

  6. Установка продолжится со второго шага.

Если установщик показывает ошибку, проверьте соединение с интернетом. Если интернет отключен, подключите его.

На Linux при скачивании скрипта установки появилась ошибка, подобная следующей: «bash: curl: команда не найдена».

  1. Выполните команду, которая установит программу curl: sudo apt install curl.
  2. Введите пароль текущего пользователя.
  3. Подтвердите установку, нажав Y.

Не удается установить VMS на WSL.

  • Проверьте, что операционная система подходит для установки WSL — это должна быть Windows 10 без длительной поддержки, т.е. не LTSC.
  • Проверьте, что у пользователя, для которого идет установка, есть права администратора.

Невозможно зарегистрироваться на сайте https://camera.rt.ru.

  • Убедитесь, что MAC-адрес, по которому вы регистрируетесь, совпадает с MAC-адресом в /var/lib/videoserver-rtk/agent-state-cache.json.

Чтобы это проверить это, запустите Ubuntu и в консоли введите команду:

cat /var/lib/videoserver-rtk/agent-state-cache.json

Не отображается видео в Личном кабинете «Видеонаблюдение Ростелеком» на сайте https://camera.rt.ru.

  • Убедитесь, что в настройках тепловизора включен кодек h264 (см. инструкцию «Настройка тепловизоров Dahua»).
  • Убедитесь, что окружение VMS и camera.rt.ru совпадают: введите в терминал команду cat /etc/videoserver-rtk/ag-cfg.json и посмотрите конфигурационный файл.
:/>  Русские буквы отображаются кракозябрами

Не приходят события о температуре человека.

Абсолютно чёрное тело (АЧТ) не найдено и другие проблемы с ним.

  • Абсолютно чёрное тело (АЧТ) (см. определение в «Глоссарии»).
  • Убедитесь, что АЧТ включено.
  • Убедитесь, что АЧТ находится в кадре. Смотреть положение АЧТ нужно на тепловизионном канале, а не на видео.
  • Убедитесь, что температура АЧТ соответствует требованиям.

Тепловизор не подключается к VMS.

  • Через веб-интерфейс или сайт https://dahuawiki.com/ConfigTool убедитесь, что тепловизор активирован.

Статус тепловизора на VMS — офлайн.

  • Убедитесь, что VMS и тепловизор находятся в одной сети.
  • Убедитесь, что выбрана правильная модель, пароль и логин для подключения тепловизора.
  • Убедитесь, что IP тепловизора пингуется с устройства, где установлен VMS.
  • Убедитесь, что для rtsp и http используются стандартные порты (их можно менять через интерфейс тепловизора).

Не отображается интерфейс VMS или проблемы с управлением через интерфейс.

  • Убедитесь, что порт 8080, где находится интерфейс VMS, не занят ничем другим.

  • В Диспетчере задач убедитесь, что запущен только один процесс videoserver-rtk.

Проблемы с функциональностью VMS: не работают методы, не меняется температура и т. д.

  • Проверьте, что запущена последняя версия VMS. Посмотреть это можно в настройках на https://camera.rt.ru.
  • Проверьте пункты «Тепловизор не подключается к VMS», «Статус тепловизора на VMS — офлайн» и «Не отображается интерфейс VMS или проблемы с управлением через интерфейс».

Не работает просмотр архива от VMS с сервера или через https://camera.rt.ru.

  • Проверьте, что включена запись архива.

Пароль для интерфейса VMS не подходит.

  • Попробуйте ввести пароль admin54321.
  • Посмотрите /etc/videoserver-rtk/ag-cfg.json и /var/lib/videoserver-rtk/agent-state-cache.json, чтобы узнать uid тепловизора и получить пароль к нему.

На экране мигает желтая рамка и сообщение black body error.

Тепловизор без перерыва издаёт звуки:

  • См. пункт «Невозможно зарегистрироваться на сайте https://camera.rt.ru».
  • В настройках тепловизора может быть включен звук на события с детектированием температуры. Отключите его (см. инструкцию по настройке тепловизора).

При установке на Linux оказалось запущено две копии VMS:

  • Скрипт установки install.sh можно использовать как для WSL, так и для Linux.

Тепловизор не находится с помощью поисковой строки в интерфейсе VMS:

Проблемы с часовым поясом, не меняется через https://camera.rt.ru (WSL):

  • Необходимо поменять часовой пояс в системе, где установлен VMS.

Жесткий диск заполняется архивом, нужно больше свободного места:

  • В сваггере VMS (http://<ip_addr_vms>:8080/swagger-ui.html#/vms/) откройте вкладку /storage_device/cleanup_params и установите параметр «usage_threshold»: 0 на нужный процент от диска, куда идет запись.
:/>  Теневое копирование тома windows 10 что это

У человека температура выше, чем ожидалось:

  • Измерение температуры происходит наиболее точно, если человек находится в одной плоскости с АЧТ. Необходимо устанавливать АЧТ так, чтобы человек не подходил к тепловизору слишком близко.
  • Источники излучения, направленные на тепловизор, могут искажать измерения температуры. Нужно выставить зону распознавания так, чтобы источники излучения не мешали процессу измерения.
  • Источником излучения может служить АЧТ, см. предыдущий пункт.

Зона для детектирования температуры не изменяется.

  • Область детектирования не может быть больше зоны, которая отображается на тепловизионном канале.

Последнее обновление: 2023-11-09

Время на прочтение

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

  1. Список ПК к которым нужно подключиться

  2. Управление ПК без согласия пользователя

А значит нам будет достаточно простого powershell’a.

Для выполнения дальнейших действий необходимо установить модуль Active Directory для PowerShell

Add-Type -assembly System.Windows.Forms
$window_form = New-Object System.Windows.Forms.Form
$window_form.Text ='Подключение к удаленному рабочему столу'
$window_form.Width = 240
$window_form.Height = 550
$window_form.StartPosition = 'CenterScreen'
$FormLabel1 = New-Object System.Windows.Forms.Label
$FormLabel1.Text = "Введите логин:"
$FormLabel1.Location = New-Object System.Drawing.Point(10,10)
$FormLabel1.AutoSize = $true
$window_form.Controls.Add($FormLabel1)
$FormTextBox1 = New-Object System.Windows.Forms.TextBox
$FormTextBox1.Width = 200
$FormTextBox1.Location = New-Object System.Drawing.Point(10,25)
$FormLabel2 = New-Object System.Windows.Forms.Label
$FormLabel2.Text = "Введите пароль:"
$FormLabel2.Location = New-Object System.Drawing.Point(10,50)
$FormLabel2.AutoSize = $true
$FormTextBox2 = New-Object System.Windows.Forms.TextBox
$FormTextBox2.Width = 200
$FormTextBox2.text = $NULL
$FormTextBox2.Location = New-Object System.Drawing.Point(10,65)
$FormLabel3 = New-Object System.Windows.Forms.Label
$FormLabel3.Text = "Выберете компьютер для подключения:"
$FormLabel3.Location = New-Object System.Drawing.Point(10,90)
$FormLabel3.AutoSize = $true
$ListBox = New-Object System.Windows.Forms.ListBox
$ListBox.Width = 200
$ListBox.Height = 300
$ListBox.Location = New-Object System.Drawing.Point(10,105)
$FormButton = New-Object System.Windows.Forms.Button
$FormButton.Location = New-Object System.Drawing.Size(10,400)
$FormButton.Size = New-Object System.Drawing.Size(200,30)
$FormButton.Text = "Подключится"
$window_form.AcceptButton = $FormButton
$FormButton2 = New-Object System.Windows.Forms.Button
$FormButton2.Location = New-Object System.Drawing.Size(10,440)
$FormButton2.Size = New-Object System.Drawing.Size(200,30)
$FormButton2.Text = "Закрыть"
$window_form.CancelButton = $FormButton3
$FormButton2.Add_Click({$window_form.Close();$window_form.Visible=$false})
$FormLabel4 = New-Object System.Windows.Forms.Label
$FormLabel4.Text = ""
$FormLabel4.Location = New-Object System.Drawing.Point(10,480)
$FormLabel4.AutoSize = $true
$window_form.Controls.Add($FormButton)
$window_form.Controls.Add($FormButton2)
$window_form.Controls.Add($ListBox)
$window_form.Controls.Add($FormTextBox1)
$window_form.Controls.Add($FormTextBox2)
$window_form.Controls.Add($FormLabel1)
$window_form.Controls.Add($FormLabel2)
$window_form.Controls.Add($FormLabel3)
$window_form.Controls.Add($FormLabel4)
$window_form.Add_Shown({$FormTextBox1.Select()})
$window_form.Topmost = $true
$window_form.MaximizeBox = $false
$result = $window_form.ShowDialog()
# Прописываем ваш домен и имя пользователя
$FormTextBox1.text = "$Env:UserDomain\$Env:UserName"
# Поле пароля делаем скрытым
$FormTextBox2.PasswordChar = '*'
# Заполняем свой OU и домен
$OU = "OU=Computers,DC=domain,DC=local"
# Получаем список ПК и вносим его в поле выбора ПК
$comps = (Get-ADComputer -SearchBase $OU -Filter *).Name | Sort-Object
ForEach ($comp in $comps){ [void] $listBox.Items.Add($comp) }

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

# Действие на нажатие кнопки
$FormButton.Add_Click({
# Получаем имя выбранного ПК из списка
$ps = $listBox.SelectedItem.ToString()
# Передаем логин и пароль в переменную
$pwsecur = ConvertTo-SecureString -String $FormTextBox2.text -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $FormTextBox1.text, $pwsecur
# Находим все сессии удаленного ПК и ищем активную $active_sessions = quser /server:$ps | foreach {($_ -replace "\s\s+",",")} | ConvertFrom-Csv ForEach ($active_session in $active_sessions) { #Не проверял работу на англ версии if (($active_session.СТАТУС -eq 'Активно') -or ($active_session.STATUS -eq 'Active')){ $id = $active_session.ID }
# Подключаемся к активной сессии
Start-Process -FilePath "mstsc" -ArgumentList "/v:$ps /shadow:$id /control /noconsentprompt" -Credential $Cred -Wait -WindowStyle Maximized

Скрипт готов, бежим проверять

:/>  Как скачать шрифт на телефон Samsung? (Maggalia S3S)

Так же можем добавить проверки:

  1. Заполнено поле с паролем

С такими проверками полная версия скрипта будет выглядеть так

Hidden text
[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding('cp866')
$OU = "OU=Computers,DC=domain,DC=local"
Add-Type -assembly System.Windows.Forms
$window_form = New-Object System.Windows.Forms.Form
$window_form.Text ='Подключение к удаленному рабочему столу'
$window_form.Width = 240
$window_form.Height = 550
$window_form.StartPosition = 'CenterScreen'
$FormLabel1 = New-Object System.Windows.Forms.Label
$FormLabel1.Text = "Введите логин:"
$FormLabel1.Location = New-Object System.Drawing.Point(10,10)
$FormLabel1.AutoSize = $true
$window_form.Controls.Add($FormLabel1)
$FormTextBox1 = New-Object System.Windows.Forms.TextBox
$FormTextBox1.Width = 200
$FormTextBox1.text = "$Env:UserDomain\$Env:UserName"
$FormTextBox1.Location = New-Object System.Drawing.Point(10,25)
$FormLabel2 = New-Object System.Windows.Forms.Label
$FormLabel2.Text = "Введите пароль:"
$FormLabel2.Location = New-Object System.Drawing.Point(10,50)
$FormLabel2.AutoSize = $true
$FormTextBox2 = New-Object System.Windows.Forms.TextBox
$FormTextBox2.Width = 200
$FormTextBox2.text = $NULL
$FormTextBox2.PasswordChar = '*'
$FormTextBox2.Location = New-Object System.Drawing.Point(10,65)
$FormLabel3 = New-Object System.Windows.Forms.Label
$FormLabel3.Text = "Выберете компьютер для подключения:"
$FormLabel3.Location = New-Object System.Drawing.Point(10,90)
$FormLabel3.AutoSize = $true
$ListBox = New-Object System.Windows.Forms.ListBox
$ListBox.Width = 200
$ListBox.Height = 300
$ListBox.Location = New-Object System.Drawing.Point(10,105)
$comps = (Get-ADComputer -SearchBase $OU -Filter *).Name | Sort-Object
ForEach ($comp in $comps){ [void] $listBox.Items.Add($comp) }
$FormButton = New-Object System.Windows.Forms.Button
$FormButton.Location = New-Object System.Drawing.Size(10,400)
$FormButton.Size = New-Object System.Drawing.Size(200,30)
$FormButton.Text = "Подключится"
$window_form.AcceptButton = $FormButton
$FormButton.Add_Click({ $ps = $listBox.SelectedItem.ToString() If (($FormTextBox2.text).Length -gt 1){ If ($ps -ne $NULL){ Function Test-ADAuthentication { param($username,$password) (new-object directoryservices.directoryentry "",$username,$password).psbase.name -ne $null } $testcred = Test-ADAuthentication $FormTextBox1.text $FormTextBox2.text If ($testcred -eq 'True'){ If (Test-Connection $ps -Count 1 -Quiet){ $FormLabel4.Text = "Подключаемся..." $pwsecur = ConvertTo-SecureString -String $FormTextBox2.text -AsPlainText -Force $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $FormTextBox1.text, $pwsecur Invoke-Command –ComputerName $ps -Credential $cred –ScriptBlock {New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name 'Shadow' -Value '2' -PropertyType 'DWord'} Invoke-Command –ComputerName $ps -Credential $cred –ScriptBlock {New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name 'AllowRemoteRPC' -Value '1' -PropertyType 'DWord'} $active_sessions = quser /server:$ps | foreach {($_ -replace "\s\s+",",")} | ConvertFrom-Csv ForEach ($active_session in $active_sessions) { #вот тут не знаю как будет на анг языке if (($active_session.СТАТУС -eq 'Активно') -or ($active_session.STATUS -eq 'Active')){ $id = $active_session.ID } } Start-Process -FilePath "mstsc" -ArgumentList "/v:$ps /shadow:$id /control /noconsentprompt" -Credential $Cred -Wait -WindowStyle Maximized
}else { $FormLabel4.Text = "КОМПЬЮТЕР НЕ ДОСТУПЕН!"
} }else { $FormLabel4.Text = "ЛОГИН ИЛИ ПАРОЛЬ НЕ ВЕРНЫЕ!"
} }else { $FormLabel4.Text = "ВЫ НЕ ВЫБРАЛИ КОМПЬЮТЕР!"
} }else { $FormLabel4.Text = "ВЫ НЕ ВВЕЛИ ПАРОЛЬ!"
} })
$FormButton2 = New-Object System.Windows.Forms.Button
$FormButton2.Location = New-Object System.Drawing.Size(10,440)
$FormButton2.Size = New-Object System.Drawing.Size(200,30)
$FormButton2.Text = "Закрыть"
$window_form.CancelButton = $FormButton3
$FormButton2.Add_Click({$window_form.Close();$window_form.Visible=$false})
$FormLabel4 = New-Object System.Windows.Forms.Label
$FormLabel4.Text = ""
$FormLabel4.Location = New-Object System.Drawing.Point(10,480)
$FormLabel4.AutoSize = $true
$window_form.Controls.Add($FormButton)
$window_form.Controls.Add($FormButton2)
$window_form.Controls.Add($ListBox)
$window_form.Controls.Add($FormTextBox1)
$window_form.Controls.Add($FormTextBox2)
$window_form.Controls.Add($FormLabel1)
$window_form.Controls.Add($FormLabel2)
$window_form.Controls.Add($FormLabel3)
$window_form.Controls.Add($FormLabel4)
$window_form.Add_Shown({$FormTextBox1.Select()})
$window_form.Topmost = $true
$window_form.MaximizeBox = $false
$result = $window_form.ShowDialog()

Powershell это очень хорошо, но запускать его жутко не удобно. Есть прекрасная возможность конвертировать полученный скрипт в exe файл