[系統安全] 四十.Powershell惡意代碼檢測系列 (1)Powershell基礎入門及管道和變量的用法
作者作為網絡安全的小白,分享一些自學基礎教程給大家,主要是關于安全工具和實踐操作的在線筆記,希望您們喜歡。同時,更希望您能與我一起操作和進步,后續將深入學習網絡安全和系統安全知識并分享相關實驗。總之,希望該系列文章對博友有所幫助,寫文不易,大神們不喜勿噴,謝謝!如果文章對您有幫助,將是我創作的最大動力,點贊、評論、私聊均可,一起加油喔!

聲明:本人堅決反對利用教學方法進行犯罪的行為,一切犯罪行為必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家了解它們背后的原理,更好地進行防護。(參考文獻見后)
一.Powershell初識
1.基礎概念
Windows PowerShell 是一種命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用 .NET Framework的強大功能。它引入了許多非常有用的新概念,從而進一步擴展了您在 Windows 命令提示符和 Windows Script Host 環境中獲得的知識和創建的腳本。
傳統的CMD支持腳本編寫,但擴展性不好,而Powershell類似于Linux shell,具有更好的遠程處理、工作流、可更新的幫助、預定任務(Scheduled Job)、CIM等優點。
那么,如何進入Powershell呢?
一種方法是在運行中直接輸入Powershell打開,另一種方法是CMD中輸入Powershell打開。



不同操作系統內置的Powershell是不一樣的,比如win7或win2008,如何查看版本呢?
$psversiontable
輸出結果如下圖所示:

2.為什么強大?
首先,它可以進行計算任務,包括計算1gb大小(以字節為單位),還有基本的運算。

其次,Powershell可以獲取計算機的服務詳細信息、狀態等。
get-service
其顯示結果如下圖所示,采用動詞+名詞方式命名,比較清楚。

而CMD中無法獲取services的(輸入services.msc),它是以圖形化方式顯示出來的。


最后,由于Powershell具有以下特點,它被廣泛應用于安全領域,甚至成為每一位Web安全必須掌握的技術。
- 方便
- 支持面向對象
- 支持和.net平臺交互
- 強大的兼容性,和cmd、vbs相互調用
- 可擴展性好,它可以用來管理活動目錄、虛擬機產品等平臺
3.控制臺和快捷鍵
鼠標右鍵屬性,可以對Powershell控制臺進行編輯,并且它支持兩種編輯模式,快速編輯模式默認鉤上的。


Powershell快捷鍵包括:
ALT+F7 清楚命令的歷史記錄PgUp PgDn 翻頁Enter 執行當前命令End 將光標移動至當前命令的末尾Del 從右開始刪除輸入的命令字符Esc 清空當前命令行F2 自動補充歷史命令至指定字符處F4 刪除命令行至光標右邊指定字符處F7 對話框顯示命令行歷史記錄F8 檢索包含指定字符的命令行歷史記錄F9 根據命令行的歷史記錄編號選擇命令,歷史記錄編號可以通過F7查看 左/右 左右移動光標上/下 切換命令行的歷史記錄Home 光標移至命令行字符最左端Backspace 從右刪除命令行字符Ctrl+C 取消正在執行的命令Tab 自動補齊命令或文件名
例如,使用快捷鍵Ctrl+C打斷了正在運行的ping指令;使用tab快捷鍵補齊了service.msc命令。

4.數學運算
Powershell支持數學運算,比如:
PS C:\Users\yxz> 2+46PS C:\Users\yxz> 4-22PS C:\Users\yxz> 4*312PS C:\Users\yxz> 9%21PS C:\Users\yxz> (1+3*5)/28PS C:\Users\yxz> 1gb/1mb1024PS C:\Users\yxz> 1gb/1mb*18kb18874368PS C:\Users\yxz> 1gb -gt 1mbTruePS C:\Users\yxz> 0xabcd43981
顯示結果如下圖所示:

二.Powershell管道和重定向
1.管道
Powershell管道旨在將上一條命令的輸出作為下一條命令的輸出。

管道并不是什么新事物,以前的Cmd控制臺也有重定向的命令,例如Dir | More可以將結果分屏顯示。傳統的Cmd管道是基于文本的,但是Powershell管道是基于對象。例如:
linux:lscmd:dir

如果只獲取其中的name、mode值,則使用如下指令。
ls | format-table name, mode

2.重定向
重定向旨在把命令的輸出保存到文件中,‘>’為覆蓋,’>>’追加。
ls | format-table name, mode > demo.txttype demo.txt
上面代碼是將ls顯示文件內容的name和mode信息存儲至本地demo.txt文件夾中,再調用“type demo.txt”打印文件內容。如果兩個 >> 它會在原來的基礎上,再進行補充(類似 a+),而單個大于號是刪除原來的寫入(類似 w)。

輸出結果如下圖所示。

三.Powershell執行外部命令及命令集
1.外部命令
Powershell是CMD的一個擴展,仍然能夠讓CMD中的命令在Powershell中使用,Powershell初始化時會加載CMD應用程序,所以CMD命令正常情況下在Powershell中都能使用,例如ipconfig。
查看端口信息
netstat -ano
包括協議、本地地址、外部地址、狀態、PID(進程號)。

查看網絡配置信息
ipconfig

打印路由信息
route print

自定義文件路徑,打開應用程序
start notepadnotepad
notepad放在C盤下面的Windows\System32文件中,能夠直接打開。

系統變量
$env:path

Python可以直接打開,Wordpad不能打開,需要添加環境變量中。

2.命令集
通過get-command獲取所有命令,通常是動名詞的方式。
get-command

獲取其用法的命令如下,簡稱gcm。
get-help get-command

獲取進程信息
get-process

獲取當前會話的別名
get-alias

獲取輸入的歷史命令信息
get-history

獲取當前時間
get-date

四.Powershell別名使用
1.別名基本用法
獲取所有命令get-command可以用別名gcm替代。
get-commandgcm

獲取當前目錄的所有文件信息get-childitem,可以用ls、dir兩個命令達到同樣的效果。
get-childitemlsdir


獲取相關的幫助信息,其命令如下:
get-help get-childitem

獲取別名所對應真實的命令
get-alias -name lsget-alias -name dir

查找所有以Remove開頭的別名
get-alias | where{$_.definition.startswith("Remove")}
其中,where來做一個管道的篩選,$_表示當前的元素,definition 定義一個字符串數組類型。Powershell支持.net強大的類庫,里面的definition包括字符串startswith操作,獲取字符串開頭函數。

查找所有別名,并調用sort降序排序及計算排列。
get-alias | group-object definition | sort -descending Count

注意:自定義別名是臨時生效的,當關閉Powershell時就會失效。
2.自定義別名
設置別名,將notepad設置為新的別名pad。pad打開notepad,表明我們的別名創建成功。
set-alias -name pad -value notepad

別名是臨時生成的,關掉Powershell即可失效,也可以撰寫命令刪除。
del alias:pad

保存別名
export-alias demo.psdirtype demo.ps


導入別名命令如下,其中-force表示強制導入。
import-alias -force demo.ps
五.Powershell變量基礎
1.基礎用法
Powershell變量跟PHP很類似,如下所示。
$name='eastmount'$name$age=28$age

Powershell對大小寫不敏感,$a 和 $A 一樣。復雜變量用大括號引起來,但不建議同學們這里定義。
${"I am a" var ()}="yxz"${"I am a" var ()}$n=(7*6+8)/2$n=3.14

變量也可以設置等于命令。
$n=ls

變量多個同時賦值,但不建議這么寫。
$n1=$n2=$n3=25$n1,$n2,$n3

2.變量操作
變量的基本運算操作
$a=2$b=10$c=a+b$a,$b,$c

傳統變量交換方法
$num1=10$num2=20$temp=$num1$num1=$num2$num2=$temp$num1,$num2

現在變量交換的寫法
$num1=10$num2=20$num1,$num2=$num2,$num1$num1,$num2

查看當前的變量
ls variable:

查找特定的變量值,星號表示代替所有的值(num開頭)。
ls variable:num*ls variable:num1

查找變量是否存在
test-path variable:num1test-path variable:num0

刪除變量
del variable:num1test-path variable:num1

專用變量管理的命令
clear-variableremove-variablenew-variable
3.自動化變量
powershell打開會自動加載變量,例如:窗口打開它會自動加載大小,再比如程序的配置信息自動加載。
根目錄信息
$home

當前進程的標志符,該自動化內置變量只能讀取,不能寫入。
$pid$$

4.環境變量
查看當前環境變量
ls env:

打印某個環境變量的值
$env:windir

創建新的環境變量
$env:name='eastmount'ls env:na*

刪除環境變量
del env:namels env:na*

更新環境變量,注意它只是臨時生效,并不會記錄到我們的系統中。
$env:OS$env:OS="Linux"$env:OS

永久生效如何實現呢?增加路徑至環境變量PATH中,只對User用戶生效。
[environment]::setenvironmentvariable("PATH","E:\","User")[environment]::getenvironmentvariable("PATH","User")
系統變量對所有用戶都生效,用戶變量只對當前用戶生效。


生效之后如下圖所示,用戶變量增加了相關值。

六.Powershell調用腳本程序
1.腳本文件執行策略
首先,發現我們的腳本文件是禁止執行的。
get-executionpolicy

接著,我們嘗試獲取策略幫助信息。
get-help set-executionpolicy

最后修改權限,讓其能運行Powershell腳本文件。
set-executionpolicy RemoteSigned
它會提示你需要啟動管理員身份運行。

通過管理員身份打開CMD,再設置其權限即可,設置完成之后可以調用相關的腳本程序。

2.調用腳本程序
(1) 定義一個demo.bat文件,其內容如下,關閉回寫,打印hello world。
@echo offecho hello world
運行命令打開:
cd desktop.\demo.bat

(2) 定義一個demo.vbs文件,內容如下:
msgbox "CSDN Eastmount"
運行命令打開:
cd desktop.\demo.vbs

(3) 運行Powershell腳本文件也類似。
$number=49switch($number){ {($_ -lt 50) -and ($_ -gt 40)} {"此數值大于50且小于40"} 50 {"此數值等于50"} {$_ -gt 50} {"此數值大于50"}}
運行結果如下圖所示:


那么,如何在CMD中運行Powershell文件呢?
我們將demo.bat修改為如下內容,其中&表示運行。
@echo offpowershell "&'C:\Users\yxz\Desktop\demo.ps1'"

運行命令:
cd desktop.\demo.bat
下面方法也可以直接運行
start demo.batdemo.bat

七.總結
寫到這里,這篇文章就介紹完畢,希望您喜歡,本文主要介紹PowerShell基礎之后,這將為后續PowerShell惡意代碼檢測提供基礎。文章非常長,作者也花費了很長時間,但相信只要你認真讀完,肯定會有收獲,尤其是對MSF的理解。
- 一.Powershell初識
- 二.Powershell管道和重定向
- 三.Powershell執行外部命令及命令集
- 四.Powershell別名使用
- 五.Powershell變量基礎
- 六.Powershell調用腳本程序
篇文章中如果存在一些不足,還請海涵。作者作為網絡安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章。同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行。愛你們喔,祝大家安好。