Introduction to Payloads
Last updated
Last updated
Have you ever sent an email or text to someone?
Most of us probably have. The message we send in an email or text is the packet's payload as it is sent across the vast Internet. In computing, the payload is the intended message. In information security, the payload is the command and/or code that exploits the vulnerability in an OS and/or application. The payload is the command and/or code that performs the malicious action from a defensive perspective. As we saw in the reverse shells section, Windows Defender stopped the execution of our PowerShell payload because it was considered malicious code.
Keep in mind that when we deliver and execute payloads, just like any other program, we give the target computer instructions on what it needs to do. The terms "malware" and "malicious code" romanticize the process and make it more mysterious than it is. Any time we work with payloads, let's challenge ourselves to explore what the code & commands are actually doing. We will start this process by breaking down the one-liners we worked with earlier:
The commands above make up a common one-liner issued on a Linux system to serve a Bash shell on a network socket utilizing a Netcat listener. We used this earlier in the Bind Shells section. It's often copied & pasted but not often understood. Let's break down each portion of the one-liner:
Removes the /tmp/f
file if it exists, -f
causes rm
to ignore nonexistent files. The semi-colon (;
) is used to execute the command sequentially.
Makes a at the location specified. In this case, /tmp/f is the FIFO named pipe file, the semi-colon (;
) is used to execute the command sequentially.
Concatenates the FIFO named pipe file /tmp/f, the pipe (|
) connects the standard output of cat /tmp/f to the standard input of the command that comes after the pipe (|
).
Specifies the command language interpreter using the -i
option to ensure the shell is interactive. 2>&1
ensures the standard error data stream (2
) &
standard output data stream (1
) are redirected to the command following the pipe (|
).
Uses Netcat to send a connection to our attack host 10.10.14.12
listening on port 7777
. The output will be redirected (>
) to /tmp/f, serving the Bash shell to our waiting Netcat listener when the reverse shell one-liner command is executed
The shells & payloads we choose to use largely depend on which OS we are attacking. Be mindful of this as we continue throughout the module. We witnessed this in the reverse shells section by establishing a reverse shell with a Windows system using PowerShell. Let's breakdown the one-liner we used:
We will dissect the rather large PowerShell command you can see above. It may look like a lot, but hopefully, we can demystify it a bit.
Executes powershell.exe
with no profile (nop
) and executes the command/script block (-c
) contained in the quotes. This particular command is issued inside of command-prompt, which is why PowerShell is at the beginning of the command. It's good to know how to do this if we discover a Remote Code Execution vulnerability that allows us to execute commands directly in cmd.exe
.
Sets/evaluates the variable $client
equal to (=
) the New-Object
cmdlet, which creates an instance of the System.Net.Sockets.TCPClient
.NET framework object. The .NET framework object will connect with the TCP socket listed in the parentheses (10.10.14.158,443)
. The semi-colon (;
) ensures the commands & code are executed sequentially.
Creates a byte type array ([]
) called $bytes
that returns 65,535 zeros as the values in the array. This is essentially an empty byte stream that will be directed to the TCP listener on an attack box awaiting a connection.
Sets/evaluates the variable $sendback
equal to (=
) the Invoke-Expression (iex
) cmdlet against the $data
variable, then redirects the standard error (2>
) &
standard output (1
) through a pipe (|
) to the Out-String
cmdlet which converts input objects into strings. Because Invoke-Expression is used, everything stored in $data will be run on the local computer. The semi-colon (;
) ensures the commands & code are executed sequentially.
Sets/evaluates the variable $sendback2
equal to (=
) the $sendback
variable plus (+
) the string PS ('PS'
) plus +
path to the working directory ((pwd).path
) plus (+
) the string '> '
. This will result in the shell prompt being PS C:\workingdirectoryofmachine >. The semi-colon (;
) ensures the commands & code are executed sequentially. Recall that the + operator in programming combines strings when numerical values aren't in use, with the exception of certain languages like C and C++ where a function would be needed.
Sets/evaluates the variable $sendbyte
equal to (=
) the ASCII encoded byte stream that will use a TCP client to initiate a PowerShell session with a Netcat listener running on the attack box.
Understanding what different types of payloads are doing can help us understand why AV is blocking us from execution and give us some idea of what we might need to change in our code to bypass restrictions. This is something we will explore further in this module. For now, understand that the payloads we use to get a shell on a system will largely be determined by what OS, shell interpreter languages, and even programming languages are present on the target.
Sets/evaluates the variable $stream
equal to (=
) the $client
variable and the .NET framework method called that facilitates network communications. The semi-colon (;
) ensures the commands & code are executed sequentially.
Starts a while
loop containing the $i
variable set equal to (=
) the .NET framework ($stream.Read
) method. The parameters: buffer ($bytes
), offset (0
), and count ($bytes.Length
) are defined inside the parentheses of the method.
Sets/evaluates the variable $data
equal to (=
) an encoding .NET framework class that will be used in conjunction with the GetString
method to encode the byte stream ($bytes
) into ASCII. In short, what we type won't just be transmitted and received as empty bits but will be encoded as ASCII text. The semi-colon (;
) ensures the commands & code are executed sequentially.
This is the method that will be used when the connection is terminated.
The one-liner we just examined together can also be executed in the form of a PowerShell script (.ps1
). We can see an example of this by viewing the source code below. This source code is part of the project: