Você já parou para se perguntar por que existem payloads tão parecidos tal como windows/shell_reverse_tcp e windows/shell/reverse_tcp? Por que o nc não abre a sessão com um e não com outro? Em qual deles você precisa usar o exploit/multi/handler? Imagine o seguinte: você está lá bem feliz montando seu payload, “essa máquina vai ser fácil!”, manda um windows/shell/reverse_tcp no msfvenom, sobe o payload para o alvo, o nc já está escutando, você roda o seu exploit, a sessão não abre e você fica triste. “Máquinas são temperamentais”, “quando esse não funciona você tenta o outro”, “vai chutando até um funcionar” são coisas que você já deve ter ouvido antes. O que talvez você não saiba é que windows/shell_reverse_tcp é um payload unstaged e windows/shell/reverse_tcp é um payload staged. Você também pode notar essa sutíl diferença em outros payloads.

Mas o que é um payload staged?

Quando você escolhe esse tipo de payload no msfvenom, o binário gerado vai conter um stager. Stager é um pequeno código que vai estabelecer uma conexão TCP no endereço e porta fornecidos, ler o tamanho restante do payload e reservar um espaço suficiente de memória que possa ser lido, escrito e executável. E então vai ler o restante do payload e escrevê-lo no espaço de memória reservado. Por isso, quando estiver usando um payload staged, você precisa usar o exploit/multi/handler para pegar o shell (e fazer o envio do restante do payload). O nc velho de guerra não vai fazer isso por você.

E o que é um payload unstaged?

O payload unstaged é enviado de uma vez só e executado na máquina alvo. Esse é o tipo de payload para o nc. Se você está habituado em usar o Metasploit provavelmente não esteja fazendo muito uso deles.

Eu gosto do Metasploit e quero continuar usando ele!

Por ser um staged handler, o exploit/multi/handler vai ignorar que o restante do seu payload inicial já foi enviado e enviar o seu próprio stage, gerando mais barulho na rede, o que é bom evitar. No caso do meterpreter você ainda pode dar de cara com um erro SSLError SSL_accept. Então é melhor usar um stageless listener para um unstaged payload.

Mas e qual eu devo escolher?

No final, depende. “Máquinas são temperamentais”, “quando esse não funciona você tenta o outro”, “vai chutando até um funcionar”. Diferentes patches, diferentes anti-vírus, diferentes dlls. Por isso, algumas vezes um pode funcionar e outro não, então é bom sempre saber o que você tem à sua disposição e pode ser usado ou não. Se você quiser procurar mais sobre o assunto, este texto foi inspirado em um guia de como evitar o uso do Metasploit. O blog do Cobalt Strike também já abordou o assunto dos staged payloads e o buffered.io explica melhor a diferença entre staged e stageless handlers.