Ejercicios de utilidades
Aquí iré recopilando algunos ejemplos de pequeñas utilidades del sistema empleando comandos.
Last updated
Aquí iré recopilando algunos ejemplos de pequeñas utilidades del sistema empleando comandos.
Last updated
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 "================================================"
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
:
Lo primero es descargar la base de datos con la que vamos a trabajar que es la de (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!
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
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
.
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
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