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.
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:
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.
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.
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