Técnicas de ofuscación para AMSI

Tècniques d'ofuscació per a AMSI



Molt bones a tothom. En aquest post parlarem de com els antivirus (AV) detecten scripts maliciosos en temps d'execució i les mesures per ofuscar els scripts a Powershell i que l'execució d'aquest no sigui bloquejada per l'AV.

Com ja s'ha vist a articles anteriors, AMSI és una API que connecta l'AV amb Powershell per a identificar si un script pot ser maliciós o no en temps d'execució i en cas de ser-ho, bloquejar-lo. Però la pregunta que cal fer és la següent: Com els antivirus detecten si l'script és maliciós? La resposta a aquesta pregunta són les firmes dels AV.

Signatures d'antivirus a Powershell 

Les clàssiques firmes de virus són una seqüència contínua de bytes comuns en certa mostra de malware, és a dir, si aquesta seqüència contínua de bytes està inclosa en un fitxer, aquest fitxer és malware.

Seguint aquest concepte, les firmes d'antivirus a PowerShell són patrons únics que representen cadenes característiques als scripts escrits en aquest llenguatge. Quan un script és escrit a la consola de Powershell, en executar-lo, AMSI envia l'script a l'antivirus i aquest detecta si la signatura d'alguna de les cadenes incloses a l'script pot ser susceptible de ser maliciosa o si tota la cadena ho és i si aquests casos es compleixen, l'execució de l'script és bloquejada per l'antivirus.

Com a exemple a això, si intentéssim utilitzar mimikatz a Powershell, com la cadena de mimikatz és ben coneguda per ser un script que podria ser maliciós en mans equivocades, si s'intenta invocar, encara que l'arxiu no estigui a el path, abans de saltar l'error que no es troba l'script, saltarà l'error que l'script conté un o més elements malintencionats i que ha estat bloquejat per l'antivirus.


El mateix passa si escrivim la cadena amsiInitFailed que és usada en alguns bypass d'AMSI, l'antivirus ho detectarà i bloquejarà perquè hi ha una signatura a l'antivirus d'aquesta cadena en concret:


Això, per tant, suposa un impediment a l'hora d'executar scripts maliciosos en primera instància, per això el que se sol fer és ofuscar les cadenes de l'script de manera que aquestes no tinguin signatura a l'antivirus i per tant ho fa indetectable a l'AV .

Tècniques d'ofuscació a Powershell

Per evadir la detecció de l'AV, s'utilitzen tècniques d'ofuscació per modificar el codi font d'un script perquè sigui més difícil de detectar i analitzar. Aquest conjunt de tècniques són les següents:

Codificació i descodificació a Base64: 

Aquesta tècnica consisteix a codificar el contingut de l'script a Base64 i descodificar-lo en temps d'execució, és a dir, es codifica a Base64 la cadena que fa de trigger per a l'AV i es descodifica dins de l'script. 
Com ja hem vist, la cadena amsiInitFailed és detectada per l'AV, però si la passem a base64 la cadena passa a ser YW1zaUluaXRGYWlsZWQ= i en tornar a convertir-la en ASCII, ja no la detecta, i s'imprimirà per terminal.


Concatenació i fuga de caràcters

L'operador per concatenar a Powershell, com en molts altres llenguatges, és el caràcter +. Una manera d'ofuscar el codi d'un script és dividint les cadenes que l'inclouen i que tenen una signatura a l'AV, de manera que a l'hora d'escriure l'script i concatenar-les en temps d'execució, l'antivirus no detecta l'execució que sí detectaria sense aquesta concatenació perquè la signatura de la cadena dividida no hi està inclosa.


Una altra manera d'ofuscar és incloent a les cadenes el caràcter d'escapament que a Powershell és el caràcter `. Aquest tipus de caràcter se sol incloure dins una cadena de caràcters.



Reordenació de cadenes amb formateig

Powershell també inclou el format de cadenes mitjançant l'ordre -f. Amb això podem escriure una cadena que normalment detectaria l'AV per tenir una signatura i reordenar-la en temps d'execució.


Reflex de mètodes .NET

A internet hi ha nombrosos scripts que fan bypass a AMSI. Un dels més famosos és el de Matt Graeber que utilitza el mètode de reflex.

El reflex de mètodes .NET (reflection en anglès), consisteix a inspeccionar, invocar i accedir a dades de tipus .NET que inclouen tant paràmetres públics com privats. Per defecte, PowerShell proporciona accés a les propietats i mètodes daccés públic, però utilitzant les API de reflexió, pot accedir als paràmetres privats.

El mètode és el següent:

[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

Tanmateix, ja és tan usat que cal aplicar alguna de les tècniques descrites a dalt i la següent tècnica que s'explicarà perquè l'antivirus no ho detecti.

Divisió de scripts en diferents línies

Hi ha molts scripts d'una sola línia (one-lineren anglès) que usen mètodes com reflection juntament amb concatenació de cadenes, etc. Tot i així, l'ús d'aquests scripts està tan estès que ja hi ha signatures per a aquest tipus de scripts.

No obstant això, una manera simple d'evitar que AMSI es queixi és dividint el codi en diferents línies o si és un codi d'una mateixa línia com el de Matt Graeber, dividint-lo en diferents variables. D'aquesta manera, encara que a primer cop d'ull pugui semblar absurd, com ja hem explicat com funcionen les firmes dels antivirus a Powershell i AMSI, té sentit que sigui possible aquesta manera d'ofuscar l'script.

Vegem-ho en un exemple.


A la imatge podem veure que el primer és l'script original i al segon se li ha aplicat concatenació de cadenes de caràcters per intentar evitar l'AV. Tanmateix, és tan usat que una cosa així no és vàlida.

Però si dividim aquest script en diferents línies, el tema canvia com us demostraré a la següent imatge:


Com podeu veure, en dividir-lo en diferents variables més l'ús de la concatenació de cadenes de caràcters és possible evitar que AMSI detecti aquest script i s'efectua correctament el bypass.

Cal aclarir que normalment aquestes tècniques es fan servir alhora en un mateix script ja que totes les explicades en aquest post són més eficaces si es realitzen en conjunt que per separat.

Això és tot per ara. En els següents articles d'AMSI es veuran diferents tècniques de com realitzar aquestes evasions (els scripts evidentment estaran ofuscats amb alguna de les tècniques aquí esmentades).

Fins al proper post!


Tornar al bloc

Deixa un comentari

Tingueu en compte que els comentaris s'han d'aprovar abans que es publiquin.