国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PowerShell > 正文

如何防范PowerShell代碼注入漏洞繞過受限語言模式

2020-05-30 20:21:24
字體:
來源:轉載
供稿:網友

導語:受限語言模式是緩解PowerShell攻擊的一種方式,能夠阻止執行任意未簽名的代碼。

介紹

受限語言模式是緩解PowerShell攻擊的一種方式,能夠阻止執行任意未簽名的代碼。當Device Guard或者AppLocker處于強制模式時,它是最實際有效的強制安全措施,因為未被策略允許的任何腳本或者模塊都位于受限語言模式下,這嚴重限制了攻擊者執行未簽名的代碼。通過限制語言模式限制了Add-Type的調用。限制Add-Type明顯是考慮到了它能編譯并加載任意的C#代碼到你的運行空間中去。

但策略允許的PowerShell代碼運行在“Full Language”模式下,允許執行Add-Type。這樣,微軟簽名的PowerShell代碼就能調用Add-Type。不相信嗎?運行下面的命令你就會發現我是正確的。

利用

現在想象如果以下的PowerShell模塊代碼(暫且被稱為“VulnModule”)是由Microsoft簽名的。

ls C:* -Recurse -Include '*.ps1', '*.psm1' | Select-String -Pattern 'Add-Type' | Sort Path -Unique | % { Get-AuthenticodeSignature -FilePath $_.Path } | ? { $_.SignerCertificate.Subject -match 'Microsoft' }

那么有什么可以影響來自受限語言模式的Add-Type的輸入呢?

讓我們一起思考下吧:

1. Add-Type作為類型定義傳遞給一個全局變量。因為它是全局的,它可以被任何人訪問,包括我們和攻擊者。
2. 問題是,簽名的代碼先于調用Add-Type就定義了全局變量,因此如果我們使用自定義的惡意C#代碼,這將會被合法的代碼覆蓋。

3. 你知道能用Set-Variable cmdlet來設置變量只讀嗎?你知道我現在在想什么了吧?

武器化

好的,為了從受限語言模式注入代碼到Add-Type,攻擊者需要將它們的惡意代碼定義為只讀變量,從而設置全局“Source”變量來拒絕簽名的代碼。這是一個武器化的概念證明:

  $Global:Source = @'  public class Test {    public static string PrintString(string inputString) {      return inputString;    }  }'@Add-Type -TypeDefinition $Global:Source

簡要說明下Add-Type注入缺陷。受限語言模式的一個限制是你不能調用非白名單類的.NET方法,但有兩個例外:屬性(getter方法)和ToString方法。在上面的PoC中,我選擇了實現一個靜態的ToString方法,因為ToString允許傳遞參數(getter不行)。我的類也是靜態的,因為.NET類的白名單只在New-Object實例化對象時適用。

那么上面的漏洞代碼是否聽起來不切實際呢?你可以這么認為,但是Microsoft.PowerShell.ODataUtils 模塊中的Microsoft.PowerShell.ODataUtils也有這個漏洞。微軟在 CVE-2017-0215, CVE-2017-0216, CVE-2017-0219中修復了它。說實話,我不太記得了。Matt Nelson 和我都報告了這些注入bug。

緩解攻擊

盡管微軟在推動解決這個漏洞,我們有什么可以做的呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庐江县| 曲麻莱县| 嵩明县| 金华市| 富蕴县| 荔波县| 汝阳县| 海盐县| 建瓯市| 金溪县| 汉寿县| 青岛市| 甘泉县| 云霄县| 金塔县| 封丘县| 思茅市| 柳河县| 惠来县| 聂拉木县| 安丘市| 达尔| 沽源县| 藁城市| 桃园市| 永清县| 昂仁县| 蕲春县| 泉州市| 浦江县| 类乌齐县| 金华市| 潮州市| 灵丘县| 丹棱县| 陇南市| 永兴县| 新昌县| 房山区| 南溪县| 福州市|