Powershell 安全最佳實踐
長期以來,網路犯罪分子一直渴望尋求一種能夠將攻擊痕迹降低至最小的合法工具,這樣在進行滲透和攻擊時,合法的工具就很容易獲得攻擊目標的許可權,從而儘可能少地觸發殺軟工具,避免被檢測到。而PowerShell正是一個這樣的工具,比如近來肆虐的Petya/NotPetya都使用到了它。
POWERSHELL攻擊性能進化史
PowerShell是Windows和Windows Server的自動化平台和腳本語言,它允許你簡化系統管理。與其他基於文本的shell不同,PowerShell利用了.NET Framework的強大功能,提供了豐富的對象和大量的內置函數來控制Windows環境。
為什麼POWERSHELL會成為黑客的最愛
PowerShell已經被大量地用於網路攻擊,特別是最近肆虐的Petya/NotPetya。攻擊者利用的是PowerShell的.NET Framework本地集成功能,為感染或操縱目標提供多種選擇。
PowerShell對攻擊者最有吸引力的屬性包括:
1.對網路套接字的簡單訪問;
2.能夠動態地在內存中組裝惡意的二進位文件;
3.直接訪問Win32應用程序編程介面(API);
4.使用Windows管理工具的簡單介面(WMI);
5.強大的腳本環境;
6.動態的調用運行時間方法;
7.輕而易舉地訪問密碼庫,例如IPSec,哈希演算法;
8.能夠鉤住託管代碼;
9.完全綁定組件對象模型(COM)。
上述所有的屬性都可以為攻擊者提供一個非常有效的攻擊矢量。
PowerShell作為一個攻擊的平台的概念首次出現在2010年Dave Kennedy & Josh Kelley 在DEF CON 18一個演講,該演講雖然提出了攻擊者可以利用PowerShell進行攻擊,但也僅僅是演示了在PowerShell中編寫的綁定和反向shell如何在相同的環境中進行攻擊。2012 年,Matt Graeber 開發了 PowerSploit並在Monday.com發表了一篇題為「為什麼PowerShell是一個強大的攻擊平台」的博文。自從"PowerSploit"被發布後,PowerShell的利用率就大幅提升。2013年Mimikatz 開始支持 PowerShell調用(aka Invoke-Mimikatz),這樣PowerShell就徹底的流行起來了。
如今有許多成熟的PowerShell工具,如Nishang,PowerSploit和Empire,其中Empire出現在2015年,是一個純碎的PowerShell後期漏洞利用代理工具,它建立在密碼學、安全通信和靈活的架構之上。Empire實現了無需powershell.exe就可運行PowerShell代理的功能。快速部署後期漏洞利用模塊,從鍵盤記錄器到Mimikatz,並且能夠適應通信躲避網路檢測,所有的這些功能都封裝在一個以實用性為重點的框架中。
另外,隨著對抗策略、技術和通信知識、Mitre的ATT&CK的發展,PowerShel已經可以提供大量的攻擊載體、策略和技術,攻擊者可以使用它來執行各種操作。
POWERSHELL安全最佳實踐
由於PowerShell不能被禁用或從包含它的架構中被移除,所以下面的一些操作是我在實踐中總結的一些最佳安全實踐方法,這樣你可以有效地使用PowerShell,同時也是防止它作為攻擊向量被攻擊者使用。
PSLockDownPolicy和PowerShell約束語言模式
限制語言模式限制了PowerShell基礎的功能,進而消除了諸如.NET和Windows API調用和COM訪問之類的高級功能支持。 缺少高級功能會阻止大多數PowerShell攻擊工具,因為它們依賴於這些高級功能的支持。 然而,在企業環境中,該方法會對合法腳本產生一些不利影響,因此強烈建議你使用該方法之前先進行測試,以避免對合法使用的代碼進行影響。
使約束語言模式:
[Environment]::SetEnvironmentVariable(『__PSLockdownPolicy『, 『4』, 『Machine『)
通過組策略使用:
Computer ConfigurationPreferencesWindows SettingsEnvironment
具有Applocker和Device Guard的PowerShell 5
PowerShell 5研發過程中投入很多時間和精力,增加了許多新功能特性。這些特性對企業環境下的運行安全特別重要,這些安全功能包括:
1.腳本塊日誌記錄(Script block logging),腳本塊日誌記錄提供了將非混淆的PowerShell代碼記錄到事件日誌的能力。
2.系統級記錄(System-wide transcripts),系統級記錄可以通過組策略實現,並提供一個「即時許可權提升(over the shoulder)」的記錄文件,這樣每個用戶就可以在系統上執行相應的PowerShell命令和代碼塊。
3.Powershell約束語言模式,上文已經提到過。
4.各種反惡意軟體的集成功能,該功能在Windows 10以後的版本中才有。在Windows 10中,微軟公司引入了反惡意軟體掃描介面(AMSI),這個介面可以用來掃描基於腳本的入侵攻擊和惡意軟體。
對於企業安全而言,基於腳本的入侵攻擊往往是致命的,而且隨著PowerShell的開源和添加了跨平台的支持,這類攻擊將會變得越來越常見。
AMSI針對的是那些採用PowerShell、VBScript、以及JScript等語言開發出來的惡意腳本,它可以大大提升惡意腳本的檢測準確率,並幫助用戶有效地屏蔽這類惡意腳本。在腳本宿主準備運行某一段腳本代碼之前,AMSI便會介入並嘗試掃描出代碼中潛在的惡意內容。
此外,使用AppLocker 可幫助你控制用戶可以運行的應用和文件。它們包括可執行文件、腳本、Windows Installer 文件、動態鏈接庫 (DLL)、封裝應用和封裝應用安裝程序。在 Windows 10 中,AppLocker 增添了一些改進,Windows 10 中的新增功能:
1.已向 New-AppLockerPolicy Windows PowerShell cmdlet 添加了一個新參數,該參數可使你選擇可執行文件和 DLL 規則集合是否適用於非交互過程。若要啟用此功能,請將「ServiceEnforcement」設置為「已啟用」。
2.已添加了新的 AppLocker 配置服務提供程序來允許你使用 MDM 伺服器啟用 AppLocker 規則。
除此之外,在正常情況下,通過使用AppLocker+Device Guard可以防止普通用戶使用PowerShell。Device Guard也適用於Windows 10和Windows Server 2016,可以通過利用支持的高級硬體功能來加強受約束的語言模式和應用白名單。
記錄PowerShell活動
PowerShell日誌記錄可以通過PowerShell模塊的組策略啟用:
1.Microsoft.PowerShell即Microsoft.PowerShell.Management模塊,記錄PowerShell的大部分核心功能。
2.活動目錄(ActiveDirectory) ,記錄Active Directory的cmdlet。 一個執行單個功能的輕量級Windows PowerShell腳本。
3.BITS Transfer ,記錄後台智能傳送服務 (BITS) 使用 cmdlet。
4.CimCmdlets(2012R2 / 8.1) - 記錄與CIM介面相關的cmdlet的使用情況。
5.GroupPolicy-記錄組策略相關的cmdlet的使用情況。
6.Microsoft.WSMan.Management - 記錄管理Web服務(WS管理)和Windows遠程管理(WinRM)的cmdlet。
7.NetAdapter / NetConnection - 記錄網路相關的cdmdlet。
8.PSScheduledJob / ScheduledTasks(PSv5) - 記錄cmdlet以管理計劃作業。
9.ServerManager - 記錄Server Manager cmdlet的使用。
10.SmbShare - 記錄伺服器消息塊(SMB)共享活動。
PowerShell的日誌記錄會返回到中央日誌記錄系統中,以為未來的攻擊做出預警。
PowerShell日誌比較關注的活動:
1.通過.Net下載 (New-Object Net.WebClient.DownloadString)
2.Invoke-Expression或者iex。
3.BITS的活動
4.計劃任務的創建或刪除
5.PowerShell的遠程連接功能。
檢測PowerShell攻擊代碼的最佳方法是查找代碼關鍵指示符,即PS攻擊代碼能正確運行所需的關鍵代碼段。
Invoke-Mimikatz事件日誌關鍵詞:
「System.Reflection.AssemblyName」
「System.Reflection.Emit.AssemblyBuilderAccess」
「System.Runtime.InteropServices.MarshalAsAttribute」
「TOKEN_PRIVILEGES」
「SE_PRIVILEGE_ENABLED」
對於混淆的PowerShell來說,應該開發自定義規則。例如:
1.查找大量的括弧{}
2.尋找大量的引號"
這兩種方法都被大量使用在混淆技術中,通常不被合法的軟體或普通管理員使用。
棄用PowerShell 2
很明顯,在最新版本的PowerShell中集成的安全特性並不適用於PowerShell 2,這樣PowerShell 2就成了攻擊滋生的地方。PowerShell 2可用於具有相同功能的橫向傳染和持久性攻擊。 PowerShell的額外吸引力還在於,由於它沒有本地日誌記錄功能,因此很難被被檢測到,這就為攻擊者提供隱身攻擊保護。
由於Microsoft最近宣布了PowerShell 2將不再適用於今年9月份的下一次Windows 10 Update,所以強烈建議你從你的運行環境中檢查和刪除PowerShell 2。
你可以通過運行以下操作來檢查是否安裝了Windows PowerShell 2:
1.在Windows 7/8.1/10上,輸入以下內容將返回「啟用或禁用」的狀態:
Get-WindowsOptionalFeature -nline -FeatureName MicrosoftWindowsPowerShellV2
2.在Windows Server上,輸入以下內容將返回安裝或刪除的.installstate文件:
Get-WindowsFeature PowerShell-V2
JEA
Just Enough Administration (JEA) 是一項安全技術,委派的管理員可通過它執行可通過 PowerShell 處理的任意操作。使用JEA,你可以:
1.通過利用代表普通用戶執行特權操作的虛擬帳戶或組託管服務帳戶,減少你計算機上的管理員數量。
2.通過指定用戶可運行的 cmdlet、函數和外部命令,限制用戶可執行的操作。
3.使用準確顯示用戶在會話中所執行命令的腳本和日誌,更好地了解你的用戶進行的操作。
JEA適用於最新更新的Windows管理框架5.0和5.1。
更棒的是,JEA包含了創建一個到被管理伺服器的遠程會話。PowerShell遠程會話可以通過會話配置文件或者腳本來進行限制。JEA工具包運行允許這些限制以簡單的文本文件來配置,這可以控制用戶被授權運行哪些PowerShell cmdlets。JEA工具包同時也可以被設置執行審計的功能。那樣的話,如果一個用戶嘗試非授權的行為,這個行為會被阻止並且記錄下來以待查看。
1.PowerShell會話配置文件,此文件用於指定連接到端點的管理員。這樣,用戶和安全組可以映射到特定的管理角色。這些文件是特定於每台設備的,因此每個設備都有一個訪問控制,它們包含關於JEA端點的名稱信息。此外,該端點的管理員可以被重新分配。這些文件是以.pssc擴展名結尾的PowerShell數據文件。
2.角色許可權文件(Role Capability file),這些文件可以讓特定角色中的用戶執行特定的操作。例如,可以限制使用某些預先選擇的cmdlet,函數和外部程序,這樣攻擊者就不可能使用潛在的惡意cdmlet執行自定義的攻擊。應該限制的潛在危險命令 Start-Process,New-Service,Invokde-Item等,點此你可以詳細了解如何創建這樣的文件。
3.JEA配置案例,案例和模板可以在Microsoft的JEA Github資源庫中找到。
最後,JEA的另一個顯著優點是可以以Windows事件日誌格式提供可操作的日誌記錄和報告,因為通過JEA端點執行的所有操作都可以被記錄下來,除此之外,連誰進行了訪問,何時進行了訪問以及訪問時都做了些什麼……都有記錄。
腳本代碼簽名
如果在企業環境中使用PowerShell腳本,則代碼簽名是通過確保真實性和完整性來改善安全狀態的另一個控制項。AllSigned 和 RemoteSigned 執行策略可防止 Windows PowerShell運行沒有數字簽名的腳本。
AllSigned——只能運行經過數字證書籤名的腳本。
RemoteSigned——運行本地的腳本不需要數字簽名,但是運行從網路上下載的腳本就必須要有數字簽名。
然而,目前已經有幾次攻擊使用了數字簽名的惡意文件,因此這種控制只是增加了另一個安全層,它還是可以被繞過。
PowerShell檢測的逃避技術
由於PowerShell的攻擊利用率逐年提高,所以攻擊者們想出了一些逃避檢測的技術,包括:
1.將目前的PowerShell版本降到PowerShell 2。
2.自定義使用沒有PowerShell.exe執行的.NET Framework。
3.PowerShell混淆(invoke-obfuscation)。
以上三種方法只是一些粗略地指導意見,不過利用「記錄PowerShell活動」將會檢測到大部分惡意運行,是目前最佳的安全做法。
總結:保護PowerShell並不簡單
從以上的分析可以看出,每種安全預防建議都有被攻破的可能,所以,在查看了最近使用的大多數攻擊技術之後,最佳做法還是建議大家升級到Windows 10和PowerShell 5。目前,所有的安全功能都允許刪除PowerShell 2。然而,對於大多數企業環境來說,這種方法實現起來並不現實,對於他們,我的建議是激活已經嵌入的安全屬性和對應的安全日誌功能,這樣就可以及時將已潛在的攻擊標記出來。
※域滲透——利用DCOM在遠程系統執行程序
※內存取證分析的實戰演練
※黑客開發虛假WordPress安全插件植入後門感染用戶
※研究顯示:數百萬蘋果Mac設備仍受EFI固件漏洞影響
TAG:嘶吼RoarTalk |