28 января 2018 г.

Speedup yaourt in Arch Linux

I greatly increased the speed of yaourt by replacing curl with wget. I have no doubt that curl can accomplish this task no worse than wget, but wget is my favorite tool that I can use efficiently.

In yaourtrc, there is no mention of XferCommand, because yaourt uses makepkg for this. Therefore, make the following changes to the /etc/makepkg.conf configuration:

DLAGENTS = ('ftp :: / usr / bin / wget -c --passive-ftp -t 3 -waitretry = 3 -O% o% u'
          'http: / usr / bin / wget -c -t 3 -waitretry = 3 -O% o% u'
          'https :: / usr / bin / wget -c -t 3 - waitaitry = 3 --no-check-certificate -O% o% u'
          'rsync :: / usr / bin / rsync -z% u% o'
          'scp :: / usr / bin / scp -C% u% o')

## DLAGENTS = ('ftp :: / usr / bin / curl -fC - -ftp-pasv --retry 3 --retry-delay 3 -o% o% u'
## 'http :: / usr / bin / curl -fLC - --retry 3 --retry-delay 3 -o% o% u'
## 'https :: / usr / bin / curl -fLC - --retry 3 --retry-delay 3 -o% o% u'
## 'rsync :: / usr / bin / rsync --no-motd -z% u% o'
## 'scp :: / usr / bin / scp -C% u% o')

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 :-)

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