Environment-based Privilege Escalation
Path Abuse
PATH is an environment variable that specifies the set of directories where an executable can be located. An account's PATH variable is a set of absolute paths, allowing a user to type a command without specifying the absolute path to the binary. For example, a user can type cat /tmp/test.txt
instead of specifying the absolute path /bin/cat /tmp/test.txt
. We can check the contents of the PATH variable by typing env | grep PATH
or echo $PATH
.
Creating a script or program in a directory specified in the PATH will make it executable from any directory on the system.
As shown below, the conncheck
script created in /usr/local/sbin
will still run when in the /tmp
directory because it was created in a directory specified in the PATH.
Adding .
to a user's PATH adds their current working directory to the list. For example, if we can modify a user's path, we could replace a common binary such as ls
with a malicious script such as a reverse shell. If we add .
to the path by issuing the command PATH=.:$PATH
and then export PATH
, we will be able to run binaries located in our current working directory by just typing the name of the file (i.e. just typing ls
will call the malicious script named ls
in the current working directory instead of the binary located at /bin/ls
).
In this example, we modify the path to run a simple echo
command when the command ls
is typed.
Wildcard Abuse
A wildcard character can be used as a replacement for other characters and are interpreted by the shell before other actions. Examples of wild cards include:
Character
Significance
*
An asterisk that can match any number of characters in a file name.
?
Matches a single character.
[ ]
Brackets enclose characters and can match any single one at the defined position.
~
A tilde at the beginning expands to the name of the user home directory or can have another username appended to refer to that user's home directory.
-
A hyphen within brackets will denote a range of characters.
The --checkpoint-action
option permits an EXEC
action to be executed when a checkpoint is reached (i.e., run an arbitrary operating system command once the tar command executes.) By creating files with these names, when the wildcard is specified, --checkpoint=1
and --checkpoint-action=exec=sh root.sh
is passed to tar
as command-line options. Let's see this in practice.
Consider the following cron job, which is set up to back up the /home/htb-student
directory's contents and create a compressed archive within /home/htb-student
. The cron job is set to run every minute, so it is a good candidate for privilege escalation.
We can leverage the wild card in the cron job to write out the necessary commands as file names with the above in mind. When the cron job runs, these file names will be interpreted as arguments and execute any commands that we specify.
We can check and see that the necessary files were created.
Once the cron job runs again, we can check for the newly added sudo privileges and sudo to root directly.
Escaping Restricted Shells
A restricted shell is a type of shell that limits the user's ability to execute commands. In a restricted shell, the user is only allowed to execute a specific set of commands or only allowed to execute commands in specific directories. Restricted shells are often used to provide a safe environment for users who may accidentally or intentionally damage the system or provide a way for users to access only certain system features. Some common examples of restricted shells include the rbash
shell in Linux and the "Restricted-access Shell" in Windows.
RBASH
Restricted Bourne shell (rbash
) is a restricted version of the Bourne shell, a standard command-line interpreter in Linux which limits the user's ability to use certain features of the Bourne shell, such as changing directories, setting or modifying environment variables, and executing commands in other directories. It is often used to provide a safe and controlled environment for users who may accidentally or intentionally damage the system.
RKSH
Restricted Korn shell (rksh
) is a restricted version of the Korn shell, another standard command-line interpreter. The rksh
shell limits the user's ability to use certain features of the Korn shell, such as executing commands in other directories, creating or modifying shell functions, and modifying the shell environment.
RZSH
Restricted Z shell (rzsh
) is a restricted version of the Z shell and is the most powerful and flexible command-line interpreter. The rzsh
shell limits the user's ability to use certain features of the Z shell, such as running shell scripts, defining aliases, and modifying the shell environment.
The IT team sets up several rbash
, rksh
, and rzsh
shells on the network and assigns each user to a specific shell. For example, external partners who need to access only certain network features, such as email and file sharing, are assigned to rbash
shells, which limits their ability to execute specific commands and access certain directories. Contractors who need to access more advanced network features, such as database servers and web servers, are assigned to rksh
shells, which provide them with more flexibility but still limit their abilities. Finally, employees who need to access the network for specific purposes, such as to run specific applications or scripts, are assigned to rzsh
shells, which provide them with the most flexibility but still limit their ability to execute specific commands and access certain directories.
Several methods can be used to escape from a restricted shell. Some of these methods involve exploiting vulnerabilities in the shell itself, while others involve using creative techniques to bypass the restrictions imposed by the shell. Here are a few examples of methods that can be used to escape from a restricted shell.
Escaping
In some cases, it may be possible to escape from a restricted shell by injecting commands into the command line or other inputs the shell accepts. For example, suppose the shell allows users to execute commands by passing them as arguments to a built-in command. In that case, it may be possible to escape from the shell by injecting additional commands into the argument.
Command injection
Imagine that we are in a restricted shell that allows us to execute commands by passing them as arguments to the ls
command. Unfortunately, the shell only allows us to execute the ls
command with a specific set of arguments, such as ls -l
or ls -a
, but it does not allow us to execute any other commands. In this situation, we can use command injection to escape from the shell by injecting additional commands into the argument of the ls
command.
For example, we could use the following command to inject a pwd
command into the argument of the ls
command:
This command would cause the ls
command to be executed with the argument -l
, followed by the output of the pwd
command. Since the pwd
command is not restricted by the shell, this would allow us to execute the pwd
command and see the current working directory, even though the shell does not allow us to execute the pwd
command directly.
Command Substitution
Another method for escaping from a restricted shell is to use command substitution. This involves using the shell's command substitution syntax to execute a command. For example, imagine the shell allows users to execute commands by enclosing them in backticks (`). In that case, it may be possible to escape from the shell by executing a command in a backtick substitution that is not restricted by the shell.
Command Chaining
In some cases, it may be possible to escape from a restricted shell by using command chaining. We would need to use multiple commands in a single command line, separated by a shell metacharacter, such as a semicolon (;
) or a vertical bar (|
), to execute a command. For example, if the shell allows users to execute commands separated by semicolons, it may be possible to escape from the shell by using a semicolon to separate two commands, one of which is not restricted by the shell.
Environment Variables
For escaping from a restricted shell to use environment variables involves modifying or creating environment variables that the shell uses to execute commands that are not restricted by the shell. For example, if the shell uses an environment variable to specify the directory in which commands are executed, it may be possible to escape from the shell by modifying the value of the environment variable to specify a different directory.
Shell Functions
In some cases, it may be possible to escape from a restricted shell by using shell functions. For this we can define and call shell functions that execute commands not restricted by the shell. Let us say, the shell allows users to define and call shell functions, it may be possible to escape from the shell by defining a shell function that executes a command.
Last updated