Ejercicios de utilidades

Aquí iré recopilando algunos ejemplos de pequeñas utilidades del sistema empleando comandos.

Script de información del sistema

A continuación te pongo un script que refleja algunos comandos usados a lo largo de los topics para sacar información de un sistema, por ejemplo al hacer el mantenimiento:

echo "================================================"
echo "Información del sistema"
echo "================================================"

echo "Sistema Operativo:"
uname -a

echo ""
echo "Distribución de Linux"
lsb_release -a 2>/dev/null || echo "lsbe_release ha fallado"

echo ""
echo "Versión del kernel:"
uname -r

echo ""
echo "Tiempo de actividad del Sistema:"
uptime

echo ""
echo "Espacio en Disco:"
df -h

echo ""
echo "Información de la red:"
ip a

echo ""
echo "Conexiones de red activas:"
ss -tuln

echo ""
echo "Archivos de configuración de Red:"
cat /etc/hosts
cat /etc/resolv.conf

echo ""
echo "Binarios con permisos SUID:"
find / -perm -4000 2>/dev/null

echo ""
echo "Comandos ejecutables con sudo:"
sudo -l

echo "================================================"

Gestionar archivos desde terminal con find

Topic 103.2

Ejemplo 1) Vamos a crear un directorio de correos electrónicos y contraseñas a partir de un listado de usuarios

Imaginemos que tenemos el siguiente fichero users.csv:

nombre,apellido,telefono,puesto de trabajo
Juan,Pérez,555-1234,Desarrollador
Ana,López,555-5678,Analista
Luis,García,555-8765,Administrador de Sistemas
María,Fernández,555-4321,Gerente de Proyectos
Carlos,Sánchez,555-3456,Soporte Técnico
Laura,Rodríguez,555-6543,Consultora

A partir de aquí, nuestro trabajo es añadir estas personas a un servidor LDAP por ejemplo por lo que necesitamos generarles un correo de login, una contraseña y conservar el resto de datos.

Lo primero sería conservar el archivo original:

cp users.csv users.csv.bkp

Ahora ya podemos trabajar cómodamente:

# 1- Generamos un archivo a parte de logins
cut -d "," -f 1,2 users.csv | tr 'A-Z,' 'a-z.' 1>usernames.csv

# 2- Creamos un archivo con los dominios "dominio.com" con el mismo numero de lineas y lo juntamos
# Esto de momento lo haremos a mano, más adelante veremos como hacerlo en vi o automático con un script con un bucle.
paste usernames.csv domains.csv | expand -t 1 | tr ' ' '@' >logins.csv

# 3- Instalamos la herramienta de generación de contraseñas y creamos
sudo apt install pwgen
pwgen -yB -s 8 6 >passwords.txt
#Esto creará un archivo de contraseñas con simbolos especiales y letras de 6 lineas con 8 caracteres cada una.

# 4- Lo pegamos todo y eliminamos 
paste users.csv logins.csv passwords.txt |expand -t 1 | tr ' ' ';' >users.csv

Seguro que hay formas más sencilla de hacer esto mismo con Linux pero no deja de ser una práctica de comandos útil.

Más info sobre pwdgen: https://parzibyte.me/blog/2019/05/20/generar-contrasenas-seguras-pwgen-ubuntu/

Ejemplo 2) Hagamos un listado de IPs de bancos europeos

Lo primero es descargar la base de datos con la que vamos a trabajar que es la de RIPE (si no tienes instalado wget puedes instalarlo como ya sabes):

wget https://ftp.ripe.net/ripe/dbase/ripe.db.gz

Podemos dividir este archivo en paquetes mas pequeños de 10MB:

split -b 10M ripe.db ripe_

Vamos con el procedimiento:

# 1- Vamos primero a leer (cierralo con Ctrl+C) y descomprimir la bd
zcat ripe.db.gz
gunzip ripe.db.gz

# 2- Busquemos coincidencias por bancos:
grep -i -B 1 bank ripe.db 
# -i hara la busqueda case-insensitive
# -B 1 nos mostrará la fila coincidente y la superior 

# 3- Añadimos aquellas entradas de IP
grep -i -B 1 bank ripe.db | grep inetnum 
#El inetnum es el campo de rango de IPs

# 4- Damos formato al documento
#Eliminamos espacios
#Nos quedamos con lo que hay despues de ":"
#Ordenamos las filas
grep -i -B 1 bank ripe.db | grep inetnum | tr -d ' ' | cut -d ':' -f 2 | sort >bank-ip.txt

Podemos leer o comprobar ahora el recuento de entradas:

more bank-ip.txt
wc -l bank-ip.txt

Esta práctica no está afinada ya que como puedes ver se nos cuela alguna entrada en texto y ordena mal las IPs.

Esta misma práctica podría hacerse con nombres de empresas concretas o gobiernos y luego se puede usar esta información para comparar con resultados de conexiones, intrusiones, etc.

De nuevo, estamos aquí para aprender!

18MB
Open
Archivo que necesitarás para la siguiente práctica ⬇️
Ejemplo 3) Trabajar con un registro de intrusiones

Partiendo de un registro de intrusiones de un servidor público cualquiera (extraido de /var/log/secure de RedHat), vamos a usar el ejemplo que tienes arriba para practicar:

# 1- Comprobamos las lineas de fechas de inicio y final
head -1 secure.log
tail -1 secure.log

# 2- Comprobamos cuantos intentos ha habido:
grep "Failed password for root" secure.log | wc -l

# 3- Extraemos IPs de intrusión
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7

# 4- Ponemos formato a las entradas 
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq

# 5- Comprobamos cuantos intentos hay por IP
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq -c | sort -n

# 6- Comprobemos una IP cualquiera (hay que instalarlo a parte)
whois XXX.XXX.XXX.XXX

# 7- Revisamos que IPs de red 

(REVISAR)
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq | sort | cut -d '.' -f 1,2,3 | uniq -c | sort -n

# 8- Revisamos ahora intentos de usuarios no root y que nombres han usado
grep "Failed password for invalid user" secure.log

# 9- Hacemos una lista de nombres intentados para conexión
grep "Failed password for invalid user" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq

# 10- Revisamos intentos de usuarios que SI existen en el sistema

(REVISAR)
grep "Failed password for invalid user" secure.log | grep -v "root" | grep -v "invalid" | cut -d ':' -f 5 | cut -d ' ' -f 5 | sort | uniq -c | sort -n

Ejemplo 4) Crear atajo de consulta de IP

Esta práctica es bastante sencilla y muy útil, como ya sabrás el comando ip address show (ip a para los amigos) te permite ver las interfaces e IPs de tu sistema. Vamos a ello:

# 1- Vamos a quedarnos con la fila de la IP:
ip address show | grep -w inet 

# 2- De momento nos aparecen todas las interfaces pero nos interesa la principal (normalmente tendremos 2 como ya sabes):
ip address show | grep -w inet | grep -vw enp0s3 

# 3- Damos formato a la entrada:
ip address show | grep -w inet | grep -vw enp0s3 | tr ' ' ';' | cut -d ';' -f 6

Ahora esto lo podemos poner en un alias temporal:

alias myip="ip address show | grep -w inet | grep -vw enp0s3 | tr ' ' ';' | cut -d ';' -f 6"

O bien añadirlo al sistema como una utilidad más, para ello, debes añadirlo al archivo de configuración de tu shell (.bashrc, .bash_profile, o .zshrc), dependiendo del shell que estés utilizando, en mi caso, para Ubuntu es /home/user/.bashrc.

sudo nano ~/.bashrc

En la última línea añadimos el alias de arriba y guardamos el archivo. Ahora debemos abrir nueva shell o hacer los cambios persistentes con:

source ~/.bashrc

Listo! Ahora deberias probarlo:

myip
#20.0.20.4/24

.

31- Dividir el fichero ripe.db en ficheros de 10M

Topic 103.4

Ejemplo 1) Copias de seguridad con pipes y tee

Debemos crear una rutina de copia de seguridad simple que cree periódicamente una imagen de la partición /dev/sda1 con dd.

dd if=/dev/sda1 of=sda1.img
#ó tambien aceptado:
dd </dev/sda1 >sda1.img

Adicionalmente podemos añadir para futuras comprobaciones de integridad de datos, que la rutina también genere un hash SHA1 del archivo de imagen:

#Esto generará el archivo con el HASH + nombre del archivo
sha1sum sda1.img >sda1.sha1
#Esto generará un archivo solo con el HASH
sha1sum <sda1.img >sda1.sha1

Estos dos podemos combinarlo con pipes y el comando tee:

dd </dev/sda1 | tee sda1.img | sha1sum > sda1.sha1

Si quisiéramos comprobar el SHA1 simplemente:

sha1sum -c sda1.sha1

Topic 105.1

Usos útiles de alias

Algunos alias útiles:

alias ..="cd .." #Subir un nivel de directorio  
alias ...="cd ../.." #Subir dos niveles de directorio  
alias ....="cd ../../.." #Subir tres niveles de directorio  
alias ll="ls -al --color-auto" #Listar archivos con detalles  
alias lt="ls -ltr" #Listar archivos ordenados por tiempo de modificación en orden ascendente  
mkd() { mkdir -p "$1" && cd "$1"; } #Crear un directorio y entrar en él  
alias rm="rm -i" #Solicitar confirmación antes de eliminar archivos  
alias du="du -ch --max-depth=1" #Resumir el uso del disco por directorio  
alias mem="free -h" #Resumir el uso de memoria  
alias topcpu="ps -eo pid,cmd,%mem,%cpu --sort=-%cpu | head" #Listar procesos que consumen más CPU  
alias topmem="ps -eo pid,cmd,%mem,%cpu --sort=-%mem | head" #Listar procesos que consumen más memoria  
alias psg="ps aux | grep -v grep | grep -i" #Buscar procesos por nombre o palabra clave  
alias f="find . -type f -name" #Buscar archivos  
alias grep="grep --color-auto -i" #Realizar búsquedas insensibles a mayúsculas/minúsculas con salida colorida  
alias reload="source ~/.bashrc" #Recargar la configuración del shell  
alias hgrep="history | grep" #Buscar en el historial de comandos del shell  
alias chown="chown --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias chmod="chmod --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias chgrp="chgrp --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias ports="sudo ss -tulanp" #Mostrar todos los puertos abiertos en el sistema  
ipa() { ip -4 a show "$1" | grep -oP '(?<=inet\s)\d+(\.\d+){3}'; } #Mostrar la dirección IP de una interfaz  
alias cpv="rsync -ah --info=progress2" #Copiar archivos con indicador de progreso  
alias update="sudo apt update && sudo apt upgrade -y" #Actualizar un sistema basado en Debian  
alias clean="sudo apt autoremove && sudo apt clean" #Limpiar paquetes de Debian no utilizados  
alias status="sudo systemctl status" #Verificar el estado de un servicio systemd  
alias restart="sudo systemctl restart" #Reiniciar un servicio systemd  
alias please="sudo !!" #Reejecutar el último comando con sudo  

Last updated