21 августа 2017 г.

PowerShell: удалённое выполнение в безопасном режиме

В продолжение предыдущей статьи.

Итак,
 если вы просрали пароль на KES10 и имеете только удалённый доступ к хосту.
 или же, если вам надо запустить какую-то команду в безопасном  режиме

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

1. Создать на хосте пользователя с правами локального администратора
2. Создать на хосте папку (например, c:\Scripts) и скопировать в неё (только!) необходимые скрипты.

Ваши скрипты безопасного режима должны соответствовать маске SafeMode-*.ps1. Скрипт ищет их в той же папке, где находится сам.

Если же вам надо запустить что-то другое, это что-то другое можно указать в параметре -SafeCommand скрипта. Например, вы можете указать свой CMD файл и вписать в него всё,
что хотели.

Использование

Execute-SafeMode.ps1 -UserName Admin -DomainName MyDomain -Password AdminPassword -RebootImmediately -SafeCommand "cmd.exe /c c:\windows\temp\1.tmp"

Execute-SafeMode.ps1 -UserName Admin -Password AdminPassword

Параметры

  UserName - обязательный, имя пользователя с правами администратора. пользователь должен иметь возможность входа в безопасном режиме, иначе хост так и останется в безопасном режиме.

  DomainName - необязательный. Если не указан, то принимается название хоста.

  Password - обязательный. пароль пользователя с административными правами

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

  SafeCommand - необязательный. команда для безопасного режима

Порядок работы скрипта

При запуске в нормальном режиме
  •  скрипт устанавливает себя в ключ RunOnce для запуска в безопасном режиме
  • скрипт устанавливает указанные логин и пароль для автоматического входа (AutoAdminLogon)
  • скрипт устанавливает флаг загрузки в безопасном режиме (с помощью bcdedit)
  • скрипт выполняет перезагрузку, если указан флаг немедленного исполнения
При запуске в безопасном режиме
  • происходит автоматический вход в систему под указанной учётной записью
  • происходит автоматический запуск скрипта
  • скрипт выполняет команду, переданную в параметре SafeCommand
  • скрипт ищет рядом с собой файлы по маске SafeBoot-*.ps1 и последовательно выполняет их. Порядок выполнения не определён
  • скрипт удаляет параметры автоматического входа в систему (AutoAdminLogon)
  • скрипт устанавливает флаг загрузки в нормальном режиме
  • скрипт выполняет перезагрузку

# Execute-SafeMode.ps1
# LastUpdate: 21.08.2017 17:30:04
# 
[CmdletBinding()]
Param(
    [string]$UserName          = "",
    [string]$Domain            = "",
    [string]$Password          = "",
    [switch]$RebootImmediately = $false,
    [string]$SafeCommand       = ""
)

$SaveVerbosePreference = $VerbosePreference
$VerbosePreference = 'Continue'
$SaveCurrentDir = Get-Location


$keyRunOnce = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
$keyWinlogon = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

$runEntry   = "*ExecuteSafeMode"

$SaveVerbosePreference = $VerbosePreference
$VerbosePreference = 'Continue'

$PluginScriptMask = "SafeMode-*.ps1"


$MyScript = $MyInvocation.MyCommand.Path 
$WorkDir = Split-Path ($MyInvocation.MyCommand.Path) -Parent
$SafeBootScript = "$WorkDir\safeboot.cmd"
$LogFile = [IO.Path]::ChangeExtension($MyInvocation.MyCommand.Path, "log")

Set-Location $WorkDir


$IsNormalBoot = (Get-WmiObject -Class Win32_ComputerSystem | 
    Select-Object -ExpandProperty BootupState) -like '*Normal*'



function myeval($cmd) 
{
    if ($cmd[0] -eq '"')    
    {
        Invoke-Expression "& $cmd"
    }
    else
    {
        Invoke-Expression $cmd 
    }
}

function Write-RegistryString($Path, $Name, $Value)
{
    Remove-ItemProperty -Path $Path -Name $Name | Out-Null
    New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType String
}

Write-Verbose "Arguments is"
Write-Verbose "`tUserName          : $UserName"
Write-Verbose "`tDomain            : $Domain"
Write-Verbose "`tPassword          : $Password"
Write-Verbose "`tRebootImmediately : $RebootImmediately"
Write-Verbose "`tSafeCommand       : $SafeCommand"
Write-Verbose ""
Write-Verbose "`tIsNormalBoot      : $IsNormalBoot"


# проверка аргументов
if ($IsNormalBoot) 
{
    if ( [string]::IsNullOrEmpty($UserName) )
    {
        throw New-Object System.ArgumentException("Parameter -UserName must not be NULL")
    }
    if ( [string]::IsNullOrEmpty($Password) )
    {
        throw New-Object System.ArgumentException("Parameter -Password must not be NULL")
    }
}


if ($IsNormalBoot)
{
    # создаём файл safeboot.cmd с указанной командой
    $CommandLine = "PowerShell.exe -NoProfile -ExecutionPolicy Bypass -File {0} -SafeCommand `"{1}`"" -f $MyScript, $SafeCommand
    $CommandLine | Set-Content -Path $SafeBootScript -Force

    # устанавливаем в HKLM\\RunOnce наш скрипт safeboot.cmd
    if ( !(Test-Path -Path $keyRunOnce) )
    {
        New-Item -Path $keyRunOnce -Force
    }

    Remove-ItemProperty -Path $keyRunOnce -Name $runEntry -Force | Out-Null
    New-ItemProperty -Path $keyRunOnce -Name $runEntry -Value $SafeBootScript -PropertyType String -Force | Out-Null

    # назначаем AutoAdminLogon пользователя
    if ( !(Test-Path -Path $keyWinlogon) ) 
    {
        New-Item -Path $keyWinlogon -Force | Out-Null
    }
    Remove-ItemProperty -Path $keyWinlogon -Name "AutoAdminLogon" | Out-Null
    New-ItemProperty -Path $keyWinlogon -Name "AutoAdminLogon" -Value "1" -PropertyType String -Force

    if ( [string]::IsNullOrEmpty($Domain) ) 
    {
        $Domain = $env:COMPUTERNAME
    }

    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultDomainName" -Force | Out-Null
    New-ItemProperty -Path $keyWinlogon -Name "DefaultDomainName" -Value $Domain 
        -PropertyType String -Force | Out-Null
    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultUserName" -Force | Out-Null
    New-ItemProperty -Path $keyWinlogon -Name "DefaultUserName" -Value $UserName 
        -PropertyType String -Force | Out-Null
    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultPassword" -Force | Out-Null
    New-ItemProperty -Path $keyWinlogon -Name "DefaultPassword" -Value $Password 
        -PropertyType String -Force | Out-Null

    # устанавливаем следующую перезагрузку в безопасном режиме
    & bcdedit /set `{current`} safeboot minimal

    # перегружаемся
    if ($RebootImmediately)
    {
        Restart-Computer -Force
    }
} 
else # Safe Mode
{
    # удаляем Auto Logon пользователя
    if ( !(Test-Path -Path $keyWinlogon) ) 
    {
        New-Item -Path $keyWinlogon -Force
    }
    Remove-ItemProperty -Path $keyWinlogon -Name "AutoAdminLogon" | Out-Null
    New-ItemProperty -Path $keyWinlogon -Name "AutoAdminLogon" -Value "0" -PropertyType String | Out-Null

    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultPassword" -Force | Out-Null
    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultDomainName" -Force | Out-Null
    Remove-ItemProperty -Path $keyWinlogon -Name "DefaultUserName" -Force | Out-Null

    # устанавливаем следующую перезагрузку в нормальный режим
    & bcdedit /deletevalue `{current`} safeboot

    # удаляем SafeBoot.cmd
    Remove-Item -Path $SafeBootScript -Force | Out-Null

    # выполняем команду пользователя
    if ( ![string]::IsNullOrEmpty($SafeCommand) )
    {
        try
        {
            "Invoke $SafeCommand :" | Out-File -FilePath $LogFile -Append -Encoding unicode
            myeval $SafeCommand | Out-File -FilePath $LogFile -Append -Encoding unicode
        }
        catch
        {
            "ERROR: $($_.Exception.Message)" | Out-File $LogFile -Append -Encoding unicode
        }
    }

    Get-ChildItem -Path $WorkDir -Filter "SafeMode-*.ps1" |
        Select-Object -ExpandProperty FullName |
        ForEach-Object {
            $SafeModePlugin = $_
            try
            {
                "Invoke $SafeModePlugin :" | Out-File -FilePath $LogFile -Append -Encoding unicode
                Invoke-Expression -Command $SafeModePlugin | Out-File -FilePath $LogFile -Append -Encoding unicode
                "Invoke $SafeModePlugin : OK" | Out-File -FilePath $LogFile -Append -Encoding unicode
            }
            catch
            {
                "ERROR: $($_.Exception.Message)" | Out-File -FilePath $LogFile -Append -Encoding unicode
            }
        }

    # перегружаемся 
    & shutdown.exe -r -f -t 3
}


$VerbosePreference = $SaveVerbosePreference
Set-Location $SaveCurrentDir

PowerShell: Если забыли пароль от KES10

Итак, если вы просрали пароль на KES10 и хотите его сбросить - поможет следующий скрипт.
Скрипт необходимо выполнять в безопасном режиме.

safemode-resetpwdkes10.ps1
# howto reset KES10
# x64: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\KasperskyLab\protected\KES10\settings
# x32: HKEY_LOCAL_MACHINE\SOFTWARE\KasperskyLab\protected\KES10\settings
#    "EnablePswrdProtect"=dword:00000000
#    "OPEP"=""
#

$keyKES10x64 = "HKLM:\SOFTWARE\Wow6432Node\KasperskyLab\protected\KES10"
$keyKES10x86 = "HKLM:\SOFTWARE\KasperskyLab\protected\KES10"

$valPassworpProtect = "EnablePswrdProtect"
$valOPEP = "OPEP"

if ([System.IntPtr]::Size -eq 8) # is x64 bit system
{
    $keyKES10Settings = "$keyKES10x64\Settings"
}
else
{
    $keyKES10Settings = "$keyKES10x86\Settings"
}

New-ItemProperty -Path $keyKES10Settings -Name $valPassworpProtect -Value 0 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $keyKES10Settings -Name $valOPEP -Value "" -PropertyType String -Force | Out-Null 
# the end :-)

13 августа 2017 г.

О DPI (a.k.a. Deep Packet Inspection)

DPI (Deep Packet Inspection) — технология классификации и фильтрации трафика по его содержимому.

Подробности в статье "Типы DPI"

21 июля 2017 г.

Скрипт PowerShell, проверяющий хосты локальной сети на наличие установленных патчей уязвимости протокола SMBv1


Скрипт PowerShell, проверяющий хосты локальной сети на наличие установленных патчей уязвимости протокола SMBv1

# --
function Find-CryHotFixes
{

    param([string]$ComputerName)


    # List of all HotFixes containing the patch
    $hotfixes = @(
        "KB4012598", "KB4012212", "KB4012215", "KB4015549",
        "KB4019264", "KB4012213", "KB4012216", "KB4015550",
        "KB4019215", "KB4012214", "KB4012217", "KB4015551",
        "KB4019216", "KB4012606", "KB4015221", "KB4016637",
        "KB4019474", "KB4013198", "KB4015219", "KB4016636",
        "KB4019473", "KB4013429", "KB4015217", "KB4015438",
        "KB4016635", "KB4019472", "KB4018466")


    # Search for the HotFixes
    $HotfixIDs = Get-HotFix -ComputerName $ComputerName |
        Where-Object {$hotfixes -contains $_.HotfixID} |
        Select-Object -ExpandProperty "HotFixID"
    $obj = New-Object -TypeName PSCustomObject -Property @{
        ComputerName = $ComputerName;
        CryHotFixes = [string]$HotfixIDs
    }

    $obj | Write-Output
}

# --


Clear-Host

$FoundFixes = @()

Get-ADComputer -Filter { Enabled -eq $true } `
               -Properties IPv4Address -SearchBase "OU=Computers,DC=office,DC=domain,DC=com" |
    Where-Object { Test-Connection -ComputerName $_ -Quiet } |
    ForEach-Object {
        $pc = $_   
        $FoundFixes += ( Find-CryHotFixes -ComputerName $pc )
}


$FoundFixes | ft -au 

Eternal Blues - сканер уязвимости ETERNALBLUE



Сотрудник компании Imperva Элад Эрез (Elad Erez) представил простой бесплатный инструмент Eternal Blues.

Eternal Blues позволяет выявить наличие уязвимости ETERNALBLUE в протоколе SMB. Также Eternal Blues позволяет выявить наличие в сканируемых системах включенного протокола SMBv1, который не рекомендован к использованию.

Немного утешает лишь то, что даже при включенном протоколе SMBv1 эксплойт ETERNALBLUE не сработает при установленном патче MS17-010.

Страничка Eternal Blues
Патч MS17-010

5 июня 2013 г.

Сервис отписки от СМС рассылок - СМС не надо!

Проект "СМС не надо " был создан для пользователей сотовых телефонов в России. Цель проекта — дать возможность отписаться от любой смс-рассылки, бесплатно и без лишних усилий. Причем, сервис абсолютно бесплатный.

Вот что пишут сами создатели сервиса:
ЦЕЛИ ПРОЕКТА
1. Создание эффективного механизма досудебного разрешения споров между распространителями и получателями СМС-рассылок.
2. Борьба со спамерами (организаторами незаконных рассылок).
3. Создание условий для цивилизованного развития российского рынка СМС-маркетинга.
URL сервиса: http://smsnenado.ru/