Native API: Native API (T1106)

Gli attaccanti possono interagire con le API native del sistema operativo per eseguire comportamenti malevoli. Le API native forniscono un accesso controllato ai servizi di basso livello nel kernel, come quelli relativi a hardware, memoria e processi. Questa tecnica rientra nella tattica TA0002 - Execution, rappresentando la fase della kill chain in cui l'avversario sta cercando di eseguire codice malevolo.

Le API native come NtCreateProcess su Windows o fork() su GNU/Linux permettono a programmi e script di avviare altri processi, caricare moduli o eseguire comandi. Esistono migliaia di funzioni API simili per diverse operazioni di sistema. Framework di alto livello come Microsoft .NET e macOS Cocoa forniscono wrapper che semplificano l'accesso a queste funzionalità.

L'utilizzo diretto di syscalls tramite assembly permette agli attaccanti di eludere i sensori difensivi e le firme di rilevamento basate su hook delle API in user mode. 18 gruppi APT hanno utilizzato questa tecnica, insieme a 189 software malevoli e 4 campagne documentate.

Per testare l'utilizzo malevolo delle API native in ambiente controllato, puoi iniziare con l'invocazione diretta di CreateProcess su Windows. Apri una PowerShell amministrativa ed esegui:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
    [DllImport("kernel32.dll")]
    public static extern bool CreateProcess(string lpApplicationName,
        string lpCommandLine, IntPtr lpProcessAttributes, 
        IntPtr lpThreadAttributes, bool bInheritHandles,
        uint dwCreationFlags, IntPtr lpEnvironment,
        string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo,
        out PROCESS_INFORMATION lpProcessInformation);
}
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFO { public Int32 cb; }
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION { 
    public IntPtr hProcess; public IntPtr hThread; 
    public int dwProcessId; public int dwThreadId; 
}
"@

Dopo aver caricato le definizioni, esegui un processo nascosto utilizzando direttamente l'API: $si = New-Object STARTUPINFO; $pi = New-Object PROCESS_INFORMATION; [Win32]::CreateProcess($null, "calc.exe", [IntPtr]::Zero, [IntPtr]::Zero, $false, 0x08000000, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi)

Su Linux, puoi testare l'invocazione diretta di syscalls per creare processi. Compila questo codice C che bypassa la libc:

.global _start
_start:
    mov $57, %rax      # syscall number for fork
    syscall
    test %rax, %rax
    jz child
    mov $60, %rax      # exit parent
    xor %rdi, %rdi
    syscall
child:
    mov $59, %rax      # execve syscall
    lea path(%rip), %rdi
    xor %rsi, %rsi
    xor %rdx, %rdx
    syscall
path:
    .string "/bin/sh"

Per simulare tecniche più avanzate come quelle usate da Cobalt Strike, puoi utilizzare il comando inline senza cmd.exe. In PowerShell: $psi = New-Object System.Diagnostics.ProcessStartInfo; $psi.FileName = "notepad.exe"; $psi.UseShellExecute = $false; $psi.CreateNoWindow = $true; [System.Diagnostics.Process]::Start($psi)

Su macOS, testa l'utilizzo di NSTask per l'esecuzione di processi, tecnica documentata in XAgentOSX. Crea uno script Swift che invoca direttamente le API Cocoa per lanciare processi in background, monitorando con log stream --predicate 'eventMessage contains "exec"' per verificare il comportamento.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Scarica la guida gratuita e segui il percorso corretto fin dal primo passo