Linux Fundamentals
Overview
Este es uno de los módulos que más tiempo me requirió para completarlo hasta ahora. Tiene muchos ejercicios prácticos para aprender a navegar por el sistema operativo y maniobrar en consola. Y como en la mayorÃa de los casos las preguntas no se resuelven con la información provista en la sección, te obliga a tener que investigar por cuenta propia y buscar en Internet para poder avanzar.
Entre los temas que se destacan se encuentran la historia y la filosofÃa de Linux, su arquitectura, el sistema de archivos, la shell, los permisos y los servicios. Vemos qué son las expresiones regulares, sumado a herramientas para filtrar contenido como find, grep, cut, tr, awk, sed, etc. También se tocan temas de contenedores, networking y hardening en sistemas Linux.
Ahora comencemos con los ejercicios. Primero desplegamos la Pwnbox y el target. Nos conectamos por SSH a la IP asignada al target. En mi caso, a la 10.129.97.206 con el usuario htb-student
y la contraseña HTB_@cademy_stdnt!
.
$ ssh htb-student@10.129.97.206
System Information
La arquitectura de hardware de la máquina:
x86_64
$ uname -m
x86_64
La ruta al directorio personal de usuario de htb-student:
/home/htb-student
$ pwd
/home/htb-student
La ruta al mail de htb-student:
/var/mail/htb-student
Para esta pregunta, tuve que investigar cuál es la ruta tÃpica del mail en un sistema Linux.
La shell asignada al usuario htb-student:
/bin/bash
Para eso, podemos ver qué vale la variable de entorno $SHELL.
$ echo $SHELL
/bin/bash
La versión del kernel instalada en el sistema:
4.15.0
$ uname -r
4.15.0-123-generic
El nombre de la interfaz de red cuyo MTU está establecido en 1500:
ens192
Primero tuve que buscar qué es MTU. Encontré que el MTU (Maximum transmission unit) es una medida en bytes de la cantidad máxima de paquetes que un dispositivo conectado a Internet puede aceptar.
Con el comando ip a
visualizamos todas las interfaces de red y sus direcciones IP asociadas. Ya podemos ver cuál tiene el MTU en 1500.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:b9:6b:7c brd ff:ff:ff:ff:ff:ff
inet 10.129.97.206/16 brd 10.129.255.255 scope global ens192
valid_lft forever preferred_lft forever
inet6 dead:beef::250:56ff:feb9:6b7c/64 scope global dynamic mngtmpaddr
valid_lft 86400sec preferred_lft 14400sec
inet6 fe80::250:56ff:feb9:6b7c/64 scope link
valid_lft forever preferred_lft forever
Navigation
El nombre del archivo histórico oculto en el directorio personal del usuario htb-student:
.bash_history
Para listar archivos ocultos, ls
no alcanza, necesitamos pasarle el parámetro -la
de list all
.
$ ls -la
total 32
drwxr-xr-x 4 htb-student htb-student 4096 Aug 3 2021 .
drwxr-xr-x 5 root root 4096 Aug 3 2021 ..
-rw------- 1 htb-student htb-student 5 Sep 23 2020 .bash_history
-rw-r--r-- 1 htb-student htb-student 220 Apr 4 2018 .bash_logout
-rw-r--r-- 1 htb-student htb-student 3771 Apr 4 2018 .bashrc
drwx------ 2 htb-student htb-student 4096 Aug 3 2021 .cache
drwx------ 3 htb-student htb-student 4096 Aug 3 2021 .gnupg
-rw-r--r-- 1 htb-student htb-student 807 Apr 4 2018 .profile
El index number (o inode) del archivo sudoers en el directorio /etc:
147627
No tenÃa idea de qué era el index number, asà que empecé a buscar. También se lo conoce como inode y es un número único que se le asigna a un archivo en el sistema de archivos Unix. El sistema operativo utiliza este número identificativo cuando almacena o recupera los datos.
Encontré dos formas de averiguar el inode de un archivo:
$ ls -i /etc/sudoers
147627 /etc/sudoers
$ stat /etc/sudoers
File: /etc/sudoers
Size: 755 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 147627 Links: 1
Access: (0440/-r--r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-11-12 18:17:31.922746204 +0000
Modify: 2018-01-18 00:08:16.000000000 +0000
Change: 2021-08-03 12:08:36.494845988 +0000
Birth: -
Working with Files and Directories
El nombre del último archivo modificado en el directorio /var/backups:
apt.extended_states.0
Nos movemos al directorio correspondiente y listamos los archivos con su información detallada, que incluye la última fecha en que fueron modificados.
$ cd /var/backups
$ ls -la
total 2168
drwxr-xr-x 2 root root 4096 Aug 3 2021 .
drwxr-xr-x 14 root root 4096 Sep 23 2020 ..
-rw-r--r-- 1 root root 51200 Oct 29 2020 alternatives.tar.0
-rw-r--r-- 1 root root 2497 Oct 16 2020 alternatives.tar.1.gz
-rw-r--r-- 1 root root 2492 Sep 24 2020 alternatives.tar.2.gz
-rw-r--r-- 1 root root 41872 Nov 12 2020 apt.extended_states.0
-rw-r--r-- 1 root root 4437 Nov 12 2020 apt.extended_states.1.gz
-rw-r--r-- 1 root root 4623 Oct 22 2020 apt.extended_states.2.gz
-rw-r--r-- 1 root root 4601 Oct 15 2020 apt.extended_states.3.gz
-rw-r--r-- 1 root root 4572 Sep 23 2020 apt.extended_states.4.gz
-rw-r--r-- 1 root root 437 Aug 5 2019 dpkg.diversions.0
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.1.gz
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.2.gz
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.3.gz
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.4.gz
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.5.gz
-rw-r--r-- 1 root root 202 Aug 5 2019 dpkg.diversions.6.gz
-rw-r--r-- 1 root root 367 Sep 23 2020 dpkg.statoverride.0
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.1.gz
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.2.gz
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.3.gz
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.4.gz
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.5.gz
-rw-r--r-- 1 root root 229 Sep 23 2020 dpkg.statoverride.6.gz
-rw-r--r-- 1 root root 742750 Nov 11 2020 dpkg.status.0
-rw-r--r-- 1 root root 206270 Nov 11 2020 dpkg.status.1.gz
-rw-r--r-- 1 root root 206270 Nov 5 2020 dpkg.status.2.gz
-rw-r--r-- 1 root root 206270 Nov 5 2020 dpkg.status.3.gz
-rw-r--r-- 1 root root 206270 Nov 5 2020 dpkg.status.4.gz
-rw-r--r-- 1 root root 206270 Nov 5 2020 dpkg.status.5.gz
-rw-r--r-- 1 root root 206270 Nov 5 2020 dpkg.status.6.gz
-rw------- 1 root root 860 Sep 23 2020 group.bak
-rw------- 1 root shadow 716 Sep 23 2020 gshadow.bak
-rw------- 1 root root 2014 Sep 23 2020 passwd.bak
-rw------- 1 root shadow 1362 Sep 23 2020 shadow.bak
El inode del archivo shadow.bak en el directorio /var/backups:
265293
$ ls -i shadow.bak
265293 shadow.bak
Find Files and Directories
El nombre del archivo config que ha sido creado después del 2020-03-03 y es más pequeño que 28k pero más grande que 25k:
00-mesa-defaults.conf
$ find / -type f -size +25k -newermt 2020-03-03 -name *.conf 2>/dev/null
/usr/share/drirc.d/00-mesa-defaults.conf
La cantidad de archivos existentes en el sistema que tienen la extensión .bak:
4
Hay cuatro archivos:
$ find / -type f -name *.bak 2>/dev/null
./var/backups/shadow.bak
./var/backups/gshadow.bak
./var/backups/group.bak
./var/backups/passwd.bak
Si queremos que nos devuelva directamente la cantidad de archivos, usamos wc:
$ find / -type f -name *.bak 2>/dev/null | wc -l
4
La ruta absoluta del binario xxd:
/usr/bin/xxd
$ which xxd
/usr/bin/xxd
File Descriptors and Redirections
La cantidad de archivos existentes en el sistema que tienen la extensión .log:
32
$ find / -type f -name *.log 2>/dev/null | wc -l
32
La cantidad total de paquetes instalado en el target:
737
Al output del comando hay que restarle uno porque cuenta la primera linea que dice "Listing…done."
$ apt list --installed | wc -l
738
Filter Contents
La cantidad de servicios en escucha en el target en todas las interfaces (no en el localhost, solo por IPv4):
7
$ netstat -l | grep -vE '127.0.0.|tcp6'
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN
$ netstat -nat | grep -vE 'localhost|127.0.0.|tcp6'| grep -i 'listen'| wc -l
7
Determina bajo qué usuario está corriendo el sevidor ProFTPd:
proftpd
$ ps aux | grep 'proftp'
proftpd 1579 0.0 0.1 126444 3648 ? Ss 18:31 0:00 proftpd: (accepting connections)
Utiliza cURL desde la Pwnbox para obtener el código fuente de la página "https://www.inlanefreight.com" y filtra por las rutas únicas de ese dominio.
La cantidad de rutas es: 34.
Para averiguarlo, lanzamos un cURL a la web y almacenamos el output en un archivo de texto.
$ curl https://www.inlanefreight.com > text.txt
Luego, convertimos los espacios en saltos de lÃnea con tr. Nos quedamos con el segundo argumento tomando como delimitador tanto las comillas dobles como las comillas simples con cut; esto elimina el href=
y el src=
que se encuentran delante de lo que necesitamos. Aplicamos un ordenamiento y nos quedamos con las cadenas únicas para evitar repeticiones con sort. Finalmente, contamos la cantidad total de lÃneas y listo.
$ cat text.txt | grep 'https://www.inlanefreight.com/' | tr " " "\n" | cut -d '""' -f2 | cut -d "'" -f2 | sort -u | wc -l
34
User Management
La opción para crear un directorio personal de usuario al añadir uno nuevo con el comando useradd:
-m
$ man useradd
-m, --create-home
Create the user's home directory if it does not exist. The files and
directories contained in the skeleton directory (which can be defined
with the -k option) will be copied to the home directory.
By default, if this option is not specified and CREATE_HOME is not
enabled, no home directories are created.
La opción para bloquear una cuenta de usuario con el comando usermod:
--lock
La opción --lock
en el comando usermod
se utiliza para bloquear una cuenta de usuario en un sistema Linux. Cuando se aplica esta opción a un usuario, se desactiva la cuenta, lo que impide que el usuario inicie sesión en el sistema.
$ man usermod
-L, --lock
Lock a user's password. This puts a '!' in front of the encrypted
password, effectively disabling the password. You can't use this option
with -p or -U.
Note: if you wish to lock the account (not only access with a password),
you should also set the EXPIRE_DATE to 1.
La opción para ejecutar un comando como un usuario diferente usando el comando su:
--command
$ man su
-c, --command=command
Pass command to the shell with the -c option.
Service and Process Management
El nombre de la unidad de servicio con la descripción "Load AppArmor profiles managed internally by snapd":
snapd.apparmor.service
Usamos el comando systemctl para listar todos los servicios y filtramos por AppArmor.
$ systemctl | grep -i 'AppArmor'
apparmor.service loaded active exited Load AppArmor profiles
Task Scheduling
El tipo de servicio de syslog.service:
notify
Usamos el comando systemctl con la opción show para ver la información relacionada al servicio, y para especificar una propiedad usamos el parámetro -p.
$ systemctl show syslog.service -p Type
Type=notify
Working with Web Services
El comando para arrancar un servicio HTTP con npm por el puerto 8080:
http-server -p 8080
Cabe aclarar que, en este caso, no es necesario indicar el puerto 8080 ya que npm inicia el servidor por dicho puerto por defecto.
$ http-server -p 8080
Starting up http-server, serving ./
http-server settings:
CORS: disabled
Cache: 3600 seconds
Connection Timeout: 120 seconds
Directory Listings: visible
AutoIndex: visible
Serve GZIP Files: false
Serve Brotli Files: false
Default File Extension: none
Available on:
http://127.0.0.1:8080
http://209.94.56.95:8080
http://10.10.15.63:8080
Hit CTRL-C to stop the server
El comando para arrancar un servidor HTTP con php por el localhost en el puerto 8080:
php -S 127.0.0.1:8080
$ php -S 127.0.0.1:8080
File System Management
La cantidad de particiones existentes en la Pwnbox:
3
$ sudo fdisk -l
Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: BEDCBC1A-6B76-B743-8F21-D32E9B1310E5
Device Start End Sectors Size Type
/dev/vda1 2048 96471039 96468992 46G Linux filesystem
/dev/vda2 96471040 96473087 2048 1M BIOS boot
/dev/vda3 96724992 104855551 8130560 3.9G Linux swap
Last updated