This task focuses on enumerating a Linux machine after accessing a shell, such as bash
. Although some commands provide information on more than one area, we tried to group the commands into four categories depending on the information we expect to acquire.
- System
- Users
- Networking
- Running Services
We recommend that you click โStart AttackBoxโ and โStart Machineโ so that you can experiment and answer the questions at the end of this task.
System
On a Linux system, we can get more information about the Linux distribution and release version by searching for files or links that end with -release
in /etc/
. Running ls /etc/*-release
helps us find such files. Letโs see what things look like on a CentOS Linux.
Letโs try on a Fedora system.
We can find the systemโs name using the command hostname
.
Various files on a system can provide plenty of useful information. In particular, consider the following /etc/passwd
, /etc/group
, and /etc/shadow
. Any user can read the files passwd
and group
. However, the shadow
password file requires root privileges as it contains the hashed passwords. If you manage to break the hashes, you will know the userโs original password.
Similarly, various directories can reveal information about users and might contain sensitive files; one is the mail directories found at /var/mail/
.
To find the installed applications you can consider listing the files in /usr/bin/
and /sbin/
:
ls -lh /usr/bin/
ls -lh /sbin/
On an RPM-based Linux system, you can get a list of all installed packages using rpm -qa
. The -qa
indicates that we want to query all packages.
On a Debian-based Linux system, you can get the list of installed packages using dpkg -l
. The output below is obtained from an Ubuntu server.
Users
Files such as /etc/passwd
reveal the usernames; however, various commands can provide more information and insights about other users on the system and their whereabouts.
You can show who is logged in using who
.
We can see that the user root
is logged in to the system directly, while the users jane
and peter
are connected over the network, and we can see their IP addresses.
Note that who
should not be confused with whoami
which prints your effective user id.
To take things to the next level, you can use w
, which shows who is logged in and what they are doing. Based on the terminal output below, peter
is editing notes.txt
and jane
is the one running w
in this example.
To print the real and effective user and group IDS, you can issue the command id
(for ID).
Do you want to know who has been using the system recently? last
displays a listing of the last logged-in users; moreover, we can see who logged out and how much they stayed connected. In the output below, the user randa
remained logged in for almost 17 hours, while the user michael
logged out after four minutes.
Finally, it is worth mentioning that sudo -l
lists the allowed command for the invoking user on the current system.
Networking
The IP addresses can be shown using ip address show
(which can be shortened to ip a s
) or with the older command ifconfig -a
(its package is no longer maintained.) The terminal output below shows the network interface ens33
with the IP address 10.20.30.129
and subnet mask 255.255.255.0
as it is 24
.
The DNS servers can be found in the /etc/resolv.conf
. Consider the following terminal output for a system that uses DHCP for its network configurations. The DNS, i.e.ย nameserver, is set to 10.20.30.2
.
netstat
is a useful command for learning about network connections, routing tables, and interface statistics. We explain some of its many options in the table below.
Option | Description |
---|---|
-a | show both listening and non-listening sockets |
-l | show only listening sockets |
-n | show numeric output instead of resolving the IP address and port number |
-t | TCP |
-u | UDP |
-x | UNIX |
-p | Show the PID and name of the program to which the socket belongs |
You can use any combination that suits your needs. For instance, netstat -plt
will return Programs Listening on TCP sockets. As we can see in the terminal output below, sshd
is listening on the SSH port, while master
is listening on the SMTP port on both IPv4 and IPv6 addresses. Note that to get all PID (process ID) and program names, you need to run netstat
as root or use sudo netstat
.
netstat -atupn
will show All TCP and UDP listening and established connections and the program names with addresses and ports in numeric format.
One might think that using nmap
before gaining access to the target machine would have provided a comparable result. However, this is not entirely true. Nmap needs to generate a relatively large number of packets to check for open ports, which can trigger intrusion detection and prevention systems. Furthermore, firewalls across the route can drop certain packets and hinder the scan, resulting in incomplete Nmap results.
lsof
stands for List Open Files. If we want to display only Internet and network connections, we can use lsof -i
. The terminal output below shows IPv4 and IPv6 listening services and ongoing connections. The user peter
is connected to the server rpm-red-enum.thm
on the ssh
port. Note that to get the complete list of matching programs, you need to run lsof
as root or use sudo lsof
.
Because the list can get quite lengthy, you can further filter the output by specifying the ports you are interested in, such as SMTP port 25. By running lsof -i :25
, we limit the output to those related to port 25, as shown in the terminal output below. The server is listening on port 25 on both IPv4 and IPv6 addresses.
Running Services
Getting a snapshot of the running processes can provide many insights. ps
lets you discover the running processes and plenty of information about them.
You can list every process on the system using ps -e
, where -e
selects all processes. For more information about the process, you can add -f
for full-format and-l
for long format. Experiment with ps -e
, ps -ef
, and ps -el
.
You can get comparable output and see all the processes using BSD syntax: ps ax
or ps aux
. Note that a
and x
are necessary when using BSD syntax as they lift the โonly yourselfโ and โmust have a ttyโ restrictions; in other words, it becomes possible to display all processes. The u
is for details about the user that has the process.
Option | Description |
---|---|
-e | all processes |
-f | full-format listing |
-j | jobs format |
-l | long format |
-u | user-oriented format |
For more โvisualโ output, you can issue ps axjf
to print a process tree. The f
stands for โforestโ, and it creates an ASCII art process hierarchy as shown in the terminal output below.
To summarize, remember to use ps -ef
or ps aux
to get a list of all the running processes. Consider piping the output via grep
to display output lines with certain words. The terminal output below shows the lines with peter
in them.
Start the attached Linux machine if you have not done so already, as you need it to answer the questions below. You can log in to it using SSH: ssh user@10.10.164.73
, where the login credentials are:
- Username:
user
- Password:
THM6877