# Ejercicios de utilidades

<details>

<summary>Script de información del sistema</summary>

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:

<pre class="language-bash"><code class="lang-bash">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"

<strong>echo ""
</strong>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 "================================================"
</code></pre>

</details>

<details>

<summary>Gestionar archivos desde terminal con find</summary>

<https://x.com/PinguinoDeMario/status/1845894889604608430>

</details>

### Topic 103.2

<details>

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

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:

```bash
cp users.csv users.csv.bkp
```

Ahora ya podemos trabajar cómodamente:

{% code overflow="wrap" %}

```bash
# 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
```

{% endcode %}

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/>

</details>

<details>

<summary><strong>Ejemplo 2)</strong> Hagamos un listado de IPs de bancos europeos</summary>

Lo primero es descargar la base de datos con la que vamos a trabajar que es la de [RIPE](https://www.ripe.net/) (si no tienes instalado wget puedes instalarlo como ya sabes):

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

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

```bash
split -b 10M ripe.db ripe_
```

Vamos con el procedimiento:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong># 1- Vamos primero a leer (cierralo con Ctrl+C) y descomprimir la bd
</strong><strong>zcat ripe.db.gz
</strong><strong>gunzip ripe.db.gz
</strong><strong>
</strong><strong># 2- Busquemos coincidencias por bancos:
</strong><strong>grep -i -B 1 bank ripe.db 
</strong><strong># -i hara la busqueda case-insensitive
</strong><strong># -B 1 nos mostrará la fila coincidente y la superior 
</strong><strong>
</strong><strong># 3- Añadimos aquellas entradas de IP
</strong>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
</code></pre>

Podemos leer o comprobar ahora el recuento de entradas:

```bash
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.&#x20;

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!

</details>

{% file src="<https://727141126-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGDxv9DabSo9OMw53A4vS%2Fuploads%2F4s1jgyNRQCHOpEIWKkL9%2Fsecure.log?alt=media&token=722154b5-0678-4f31-89d3-aa4244921994>" %}
Archivo que necesitarás para la siguiente práctica :arrow\_down:
{% endfile %}

<details>

<summary>Ejemplo 3) Trabajar con un registro de intrusiones</summary>

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:

{% code overflow="wrap" %}

```bash
# 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

```

{% endcode %}

</details>

<details>

<summary>Ejemplo 4) Crear atajo de consulta de IP</summary>

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:

{% code overflow="wrap" %}

```bash
# 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
```

{% endcode %}

Ahora esto lo podemos poner en un alias temporal:

```bash
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`.

```bash
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:

```bash
source ~/.bashrc
```

Listo! Ahora deberias probarlo:

```bash
myip
#20.0.20.4/24
```

</details>

.

<details>

<summary>31- Dividir el fichero ripe.db en ficheros de 10M </summary>

</details>

### Topic 103.4

<details>

<summary>Ejemplo 1) Copias de seguridad con pipes y tee</summary>

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

```bash
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:

```bash
#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`:

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

Si quisiéramos comprobar el SHA1 simplemente:

```bash
sha1sum -c sda1.sha1
```

</details>

### Topic 105.1

<details>

<summary>Usos útiles de alias</summary>

Algunos alias útiles:

```bash
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  

```

</details>
