滲透測試神器powershell入門必備(三)–函式和指令碼
介紹
隨著我們本系列文章的逐步深入,我們便會更加明白powershell的強大之處,本文我們就來講解一些powershell的函式和指令碼。
Powershell函式
基於前兩篇文章的介紹,相信大家對powershell有了基本的瞭解,函式的用法其實也非常簡單,只要使用下面的語法即可:
function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])] { param([type]$parameter1 [,[type]$parameter2]) dynamicparam {<statement list>} begin {<statement list>} process {<statement list>} end {<statement list>} }
不過根據上下文環境不同,函式的使用可能很簡單,但也可能很複雜。
現在我們來看看如何使用powershell函式,先從一個簡單的函式開始:multiplying 4 by 3.
這個函式就是一個乘法運算,如圖:
我們也可以使用變數$args作為陣列來表示引數,然後按照位置順序從使用者的輸入中取值,如圖所示:
我們還可以使用命名引數,如圖:
關於引數還有一個功能是,我們可以指定引數被解析的型別。
在下面這個例子中,我們只允許int型引數才能被解析,其他任何型別都會引發一個異常,如圖:
當然,這裡我只是向大家介紹的最基礎的知識,關於函式還有很多用法需要你自己探索,特別是在使用引數和屬性等高階功能或使用引數驗證時。我們稍後會討論一些例子。
使用Powershell編寫指令碼
現在我們來講解一下使用powershell編寫指令碼。
不過,在我們直接開始編寫指令碼之前,先來了解下Microsoft是如何保護我們的系統免受惡意指令碼攻擊的。
我們可以發現在指令碼執行安全策略(微軟稱之為執行策略)中,有一條很有意思,那就是“執行策略是Windows powershell安全策略的一部分”。
它決定你是否執行指令碼,如果執行指令碼的話,它還決定哪些指令碼在執行之前必須進行數字簽名。
你可以使用‘Get-ExecutionPolicy’命令來獲取當前的執行策略,如圖:
根據微軟官方文件,執行策略有如下幾種:
·Restricted:Powershell不會執行任何指令碼,這是powershell預設的執行策略。
· Allsigned:Powershell只會執行具有數字簽名的指令碼。如果你執行的指令碼是由Powershell無法識別的Publisher進行簽名的,powershell會詢問你是否信任這個指令碼的Publisher.
· RemoteSigned:powershell不會執行從網際網路上下載的指令碼,除非他們有簽名,但是powershell可以執行非網際網路下載指令碼,而不會彈窗提醒.如果下載指令碼有簽名,但是powershell無法識別,那麼在執行指令碼之前,powershell還是會彈框提示.
· Unrestricted:powershell忽視數字簽名,但是執行從網際網路上下載的指令碼時會彈窗提示.
當然,你也可以修改預設策略,命令是Set-ExecutionPolicy <policy>,如圖:
現在我們已經修改了執行策略為“unrestricted”,這個策略允許我們執行指令碼,我們來嘗試進行攻擊。(我非常激動來完成這一部分來攻擊滲透中的例項)。
你可以在notepad中編寫指令碼,也可以使用powershell的指令碼編寫互動介面,這是powershell預設就自帶的整合指令碼環境(ISE),也是非常好用的,介面如圖:
如圖可以看到ISE有三個區域:
1.指令碼編寫區
2.Powershell直譯器
3.現有命令(可以搜尋和過濾)
現在終於可以開始編寫指令碼了,我們先寫一個非常簡單的hello world指令碼並執行,如圖:
或者儲存指令碼,然後使用命令列執行,如圖:
現在你就可以自由發揮了,發現什麼功能都可以嘗試去做。不過,放心,我們會在後續的文章中講解一些非常不錯的用例和場景。
指令碼和函式用例
下面這個簡單的指令碼可以讓我們殺掉指定程序,需要指定的引數就是我們想要殺掉的程序的PID,指令碼如下:
執行指令碼,如圖: