Linux Quest. Felicitamos a los ganadores y hablamos sobre las soluciones de los desafíos

Linux Quest. Felicitamos a los ganadores y hablamos sobre las soluciones de los desafíos

El 25 de marzo abrimos la inscripción para Linux Quest, es un juego para aficionados y conocedores del sistema operativo Linux. Algunas estadísticas: 1117 personas se registraron para el juego, de las cuales 317 encontraron al menos una clave, 241 lograron completar la tarea de la primera etapa, 123 la segunda y 70 pasaron la tercera etapa. Hoy nuestro juego ha llegado a su fin, ¡y felicitamos a nuestros ganadores!

  • El primer lugar fue para Alexander Teldikov.
    Alexander dijo sobre sí mismo que es el administrador de sistemas más típico. Vive en Volgogrado, administra diferentes sistemas Unix-like desde hace unos veinte años. Ha trabajado en proveedores de internet, un banco y una empresa integradora de sistemas. Actualmente trabaja de forma remota en una pequeña empresa, gestionando la infraestructura en la nube para un importante cliente extranjero. Le gusta leer y escuchar música. Sobre el juego, Alexander comentó que en general le gustó, disfruta de este tipo de retos. En una de las empresas, durante una entrevista, participó en algo similar a Hackerrank, le pareció interesante.
  • El segundo lugar fue para Roman Suslov.
    Roman es de Moscú. Tiene 37 años. Trabaja como ingeniero de Linux/Unix en la empresa 'Infostek Jet'. En su trabajo se dedica a la administración y resolución de problemas de sistemas Linux/Unix + SAN. Sus intereses son variados: sistemas Linux, programación, ingeniería inversa, seguridad informática, Arduino. Sobre el juego, Roman destacó que le gustó en general. 'Ejercité un poco mis neuronas y me distraje de la rutina gris del trabajo diario. 🙂 Me gustaría tener más tareas, ya que no tuve tiempo de disfrutar completamente antes de que el juego terminara'.
  • El tercero fue alex3d.
    Alex vive en Moscú y se dedica al desarrollo de software. 'Gracias por el concurso, fue interesante poner a prueba mis habilidades de google-fu'.

También en el ranking de los 10 mejores jugadores:

  • Yevgeniy Saldayev
  • Markel Mokhnachevskiy
  • Konstantin Konosov
  • Pavel Sergeyev
  • Vladimir Bovaev
  • Ivan Bubnov
  • Pavlo Klets

Entendemos que hay muchas formas de resolver nuestras tareas, a continuación describimos algunas de las posibles soluciones.

1. Primera etapa

La hemos llamado '¿Eres realmente admin?', ya que la tarea era bastante sencilla: reparar un cálido y acogedor servicio.

1.1. Datos interesantes:

Dos jugadores encontraron la primera clave en los primeros 15 minutos del juego, y en una hora tuvimos tres líderes que completaron la tarea.

1.2. Tarea

Te has unido a una empresa donde no ha habido un especialista en tecnologías de la información durante mucho tiempo. Antes de comenzar a ordenar, es necesario resolver un problema urgente que bloquea el funcionamiento de la oficina.

La limpiadora ha enganchado el cable de alimentación del armario del servidor con la mopa. Se ha restaurado la alimentación, pero un sitio web muy importante sigue sin funcionar. Este sitio web es crucial porque la empresa no se preocupa mucho por la seguridad de la información, y en la página principal se puede encontrar públicamente la contraseña de administrador del ordenador del director general.

Días atrás se cambió la contraseña, y todos se olvidaron de la nueva, el director no puede trabajar. Se rumorea que en esta máquina había otras claves que pueden ayudarnos a descifrar la copia de seguridad de los documentos contables.

¡Todos están esperando una solución rápida al problema!

1.3. Solución

1. Lo primero que hay que hacer es cambiar la contraseña root en la máquina virtual para obtener acceso a ella. Al iniciar, notamos que es Ubuntu 16.04 Server.

Para restablecer la contraseña de root reiniciamos la máquina, al arrancar, en el momento en que aparece el menú de grub, pasamos a editar la opción de Ubuntu pulsando la tecla «e». Editamos la línea linux, añadiendo al final init=\/bin\/bash. Cargamos con Ctrl+x y obtenemos bash. Re-montamos la raíz como rw, cambiamos la contraseña:

$ mount -o remount,rw \/dev\/mapper\/ubuntu--vg-root
$ passwd

No olvidemos hacer un sync, reiniciamos.

2. En las condiciones se indica que nuestro servidor web no está funcionando, veamos:

$ curl localhost
Not Found
The requested URL \/ was not found on this server.
Apache\/2.4.18 

Es decir, en realidad Apache está en funcionamiento, pero responde con un código 404. Revisamos la configuración:

$ vim \/etc\/apache2\/sites-enabled\/000-default.conf

Aquí se encuentra la clave — StevenPaulSteveJobs.

Comprobamos la ruta /usr/share/WordPress — no existe, pero hay /usr/share/wordpress. Modificamos la configuración y reiniciamos Apache.

$ systemctl restart apache2

3. Intentamos de nuevo, obtenemos el error:

Warning: mysqli_real_connect(): (HY000\/2002): Connection refused in \/usr\/share\/wordpress\/wp-includes\/wp-db.php on line 1488

¿La base de datos no está en funcionamiento?

$ systemctl status mysql
Active: active (running)

¿Cuál es el problema? Es necesario investigar. Para esto, necesitamos acceder a MySQL, cómo hacerlo está descrito en la documentación. Uno de los puntos de la documentación nos recomienda añadir la opción skip-grant-tables en /etc/mysql/mysql.conf.d/mysqld.cnf. Aquí también se encuentra la clave — AugustaAdaKingByron.

Ajustamos los permisos para el usuario 'wp'@'localhost'. Iniciamos MySQL, lo hacemos accesible a través de la red, comentando en la configuración la opción skip-networking.

4. Después de las acciones realizadas, el servidor web se inicia, pero el sitio sigue sin funcionar, ya que

Advertencia: require_once( /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): no se pudo abrir el flujo: Permiso denegado en /usr/share/wordpress/wp-includes/template.php en la línea 562

Cambiamos los permisos del archivo.

$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php

Actualizamos la página, entramos en el sitio y encontramos la clave — BjarneStroustrup! Hemos encontrado las tres claves, nuestro director puede trabajar, hemos descifrado los archivos contables. Todos están felices, y tú tienes mucho trabajo por delante para establecer la infraestructura, copias de seguridad y seguridad en la empresa.

2. Segunda etapa

Era necesario resolver la tarea sobre la recopilación de analytics. A todos les gusta la analítica: quién, de dónde y en qué cantidades ingresa. Se nos ocurrió un caso con el que todos los ingenieros pueden encontrarse en la vida.

2.1. Datos interesantes

Uno de nuestros jugadores introdujo la clave correcta en los primeros 10 minutos del juego, y en la primera hora tuvimos un líder que completó la tarea.

2.2. Tarea

Llegaste a trabajar en la empresa, y los gerentes te pidieron que encontraras a quién se enviaron los correos desde África. Es necesario construir un top-21 de direcciones de los destinatarios. Las primeras letras de las direcciones de los destinatarios son la clave. Pero hay un problema: el servidor de correo a través del cual se enviaron los correos no se está levantando. ¡Todos esperan una solución operativa al problema!

2.3. Solución

1. El servidor no arranca debido a que no existe la sección swap en fstab, al arrancar, el sistema intenta montarlo y se cae. ¿Cómo arrancar?

Descargamos la imagen, hemos descargado CentOS 7, arranca con Live CD/DVD (Solución de problemas -> Rescate), montamos el sistema, modificamos /etc/fstab. Aquí mismo encontramos la primera clave — GottfriedWilhelm11646Leibniz!

Creamos swap:

$ lvcreate -n swap centos -L 256M
$ sync && reboot

2. Como siempre, no hay contraseña, necesitamos cambiar la contraseña root en la máquina virtual. Ya hicimos esto en la primera tarea. Cambiamos y accedemos exitosamente al servidor, pero se reinicia de inmediato. El servidor se reinicia tan rápido que no puedes ni siquiera mirar todos los registros con atención. ¿Cómo entender qué está pasando?

De nuevo arrancamos con livecd, estudiamos los registros del sistema con atención y, por si acaso, echamos un vistazo al cron, dada tal periodicidad. Allí encontramos el problema y la segunda clave — Alan1912MathisonTuring!

Es necesario en /etc/crontab eliminar o comentar la línea echo b > /proc/sysrq-trigger.

3. Después de lo cual el servidor se inició y se pueden realizar las tareas de los administradores: «¿Cuáles son las direcciones de África?» Esta información, en general, es de acceso público. Se puede encontrar en Internet utilizando las frases «ip address africa», «geoip database». Para resolver la tarea se pueden utilizar bases de datos de distribución de direcciones de acceso libre (geoip). Usamos una base de datos como referencia. MaxMind GeoLite2, disponible bajo la licencia Creative Commons Attribution-ShareAlike 4.0.

Intentaremos resolver nuestra tarea usando solo utilidades del sistema Linux, aunque hay muchas maneras de hacerlo: utilizando herramientas de filtrado de texto y scripts en varios lenguajes de programación.

Para empezar, simplemente obtendremos pares «IP del remitente - receptor» del registro de correo electrónico /var/log/maillog (construiremos una tabla de emails de receptores - IP del remitente). Se puede hacer con el siguiente comando:

$ cat /var/log/maillog | fgrep -e ' connect from' -e 'status=sent' | sed 's/[][]/ /g' | awk '/connect from/ {ip=$11} /status=sent/ {print $10" "ip}' > log1.txt

Y antes de continuar con la creación de la base de datos de direcciones de África, veamos la lista de las principales IP de los remitentes.

$ cat log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n 40
5206 L2JhbjAbM67GA99jg@mail.ru
4165 iHKTBkegOQa6fIALq@mail.ru
3739 nHkcBl7BdgXxijSYD7@mail.ru
3405 SMAzPJAzbl9vp4hAXo@mail.ru
3346 xILz6d7P@mail.ru

Entre todos, destacan claramente por la cantidad de correos los tres primeros receptores de la lista. Si buscamos las IP de los remitentes que enviaron a las direcciones de este top-3, podemos notar una clara predominancia de ciertas redes:

$ cat log1.txt | fgrep 'L2JhbjAbM67GA99jg@mail.ru' | cut -d' ' -f2 | sort | cut -d'.' -f1 | uniq -c | sort -r | head
831 105
806 41
782 197
664 196
542 154
503 102
266 156
165 45
150 160
108 165

La mayor parte de las redes 105/8, 41/8, 196/8, 197/8 están asignadas a AFRINIC, uno de los cinco registradores regionales de Internet que llevan a cabo la distribución de recursos de Internet. AFRINIC distribuye el espacio de direcciones en el territorio de África. Y el 41/8 pertenece completamente a AFRINIC.

https://www.nic.ru/whois/?searchWord=105.0.0.0 
https://www.nic.ru/whois/?searchWord=41.0.0.0

Por lo tanto, la respuesta a la tarea, en realidad, está en el propio registro.

$ cat log1.txt | fgrep -e '105.' -e '41.' -e '196.' -e '197.' -e '154.' -e '102.' | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
4209 L2JhbjAbM67GA99jg@mail.ru
3313 iHKTBkegOQa6fIALq@mail.ru
2704 nHkcBl7BdgXxijSYD7@mail.ru
2215 uvRbp1O@mail.ru
1774 sPmMsmmFiV@mail.ru
1448 BtG3aHgQgCKuze2AKuRH@mail.ru
1233 eQpuuQ2uQdbwRL3@mail.ru
958 nJT5dpaBZ@mail.ru
862 ef4WbQiB@mail.ru
762 dQCqKL6eVminFfH7wLA@mail.ru
632 ifq6Rd1HxuCQOdO9@mail.ru
539 cFwm2ssypMmx1sA7@mail.ru
531 twtTnr4G@mail.ru
431 TSrczgYASrR11Hs3qCi@mail.ru
380 o3r3exc3OL@mail.ru
357 rzmjr2VAHK@mail.ru
348 vnPr6YjJ3ndw@mail.ru
312 anOjFXrwOtLP2Rl1Vcz6@mail.ru
289 dvny5zHmRW8fiT@mail.ru
282 sgg9jPxFDYvzw8Kr@mail.ru
274 tKSevzA7GntJ@mail.ru

En esta etapa, recibimos la cadena «LinuxBenedictTorvadst».

La clave correcta: «LinusBenedictTorvalds».

La cadena obtenida contiene un error tipográfico en los 3 últimos caracteres. Esto se debe a que las redes que hemos seleccionado no están completamente asignadas a los países de África y a cómo están distribuidos los correos electrónicos en las direcciones IP en nuestro registro.

Con suficiente precisión en las redes más grandes asignadas a los países de África, se puede obtener una respuesta exacta.:

$ cat log1.txt | fgrep -e' '105.{30..255}. -e' '41. -e' '196.{64..47}. -e' '196.{248..132}. -e' '197.{160..31}. -e' '154.{127..255}. -e' '102.{70..255}. -e' '156.{155..255}. | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
3350 L2JhbjAbM67GA99jg@mail.ru
2662 iHKTBkegOQa6fIALq@mail.ru
2105 nHkcBl7BdgXxijSYD7@mail.ru
1724 uvRbp1O@mail.ru
1376 sPmMsmmFiV@mail.ru
1092 BtG3aHgQgCKuze2AKuRH@mail.ru
849 eQpuuQ2uQdbwRL3@mail.ru
712 nJT5dpaBZ@mail.ru
584 ef4WbQiB@mail.ru
463 dQCqKL6eVminFfH7wLA@mail.ru
365 ifq6Rd1HxuCQOdO9@mail.ru
269 cFwm2ssypMmx1sA7@mail.ru
225 twtTnr4G@mail.ru
168 TSrczgYASrR11Hs3qCi@mail.ru
142 o3r3exc3OL@mail.ru
111 rzmjr2VAHK@mail.ru
 96 vnPr6YjJ3ndw@mail.ru
 78 anOjFXrwOtLP2Rl1Vcz6@mail.ru
 56 lHzWiB7ExvRtSbAcU9@mail.ru
 56 dvny5zHmRW8fiT@mail.ru
 40 sgg9jPxFDYvzw8Kr@mail.ru

La tarea también se puede resolver de otra manera.
Descargamos MaxMind, descomprimimos y los siguientes tres comandos también resuelven nuestra tarea.

$ cat GeoLite2-Country-Locations-ru.csv | grep "África" | cut -d',' -f1 > africaIds.txt
$ grep -Ff africaIds.txt GeoLite2-Country-Blocks-IPv4.csv | cut -d',' -f1 > africaNetworks.txt
$ grepcidr -f africaNetworks.txt log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n21

De una forma u otra, al final contamos con las estadísticas y los gerentes obtuvieron los datos que necesitaban para trabajar.

3. Tercera etapa

La tercera etapa es algo similar a la primera — también se necesita arreglar un cálido servicio de lámpara, pero todo es más complicado que en la primera tarea.

3.1. Datos interesantes

En los primeros 15 minutos, tres jugadores encontraron la primera clave, y después de 2 horas y 20 minutos desde el inicio de la etapa, nuestro ganador completó la tarea.

3.2. Tarea

Te incorporaste a una empresa donde todos los documentos se almacenan en un servidor interno Wiki. El año pasado, un ingeniero solicitó 3 nuevos discos para el servidor, además de uno existente, argumentando que para la redundancia del sistema era necesario colocar los discos en ciertos arreglos. Desafortunadamente, unas semanas después de su instalación, el ingeniero se fue de vacaciones a India y no regresó.

Durante varios años, el servidor funcionó sin problemas, pero hace un par de días la red de la empresa fue hackeada. Siguiendo las instrucciones, el personal de seguridad extrajo los discos del servidor y te los envió. Durante el transporte, se perdió un disco de manera irreversible.

Es necesario restaurar la funcionalidad de Wiki, primero nos interesa el contenido de las páginas de la wiki. Un fragmento de texto que estaba en una de las páginas de esta wiki es la contraseña del servidor 1C y es urgente para desbloquearlo.

Además, en alguna parte de las páginas de la wiki o en otro lugar había contraseñas del servidor de logs y del servidor de videovigilancia, que también es recomendable recuperar, sin ellas la investigación del incidente es imposible. ¡Como siempre, esperan una solución rápida!

3.3. Solución

1. Intentamos arrancar secuencialmente con los discos que tenemos y en todos recibimos el mismo mensaje:

¡No se encontró medio de arranque! Sistema detenido 

Necesitamos arrancar de alguna manera. Nuevamente, nos salva el arranque desde un Live CD/DVD (Solución de problemas -> Rescate). Al arrancar, intentamos encontrar la partición de arranque, no la encontramos, y llegamos a shell. Intentamos estudiar qué y cómo con los discos. Se sabe que hay tres. Hay más herramientas para esto en la versión 7 de CentOS, donde hay comandos blkid o lsblk, que nos muestran toda la información sobre los discos.

Qué hacemos y cómo:

$ ls /dev/sd*

Se nota de inmediato que

/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий момент

Montamos sdb1, se ve que esta es la partición de arranque de CentOS 6.

$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1

Obviamente vamos a la sección grub y encontramos la primera clave: James191955Gosling en un archivo inusual.

2. Estudiamos pvs y lvs, ya que trabajamos con LVM. Vemos que debería haber 2 volúmenes físicos, uno no se encuentra y se queja por uid perdido. Vemos que debería haber 2 volúmenes lógicos: root y swap, y además root está parcialmente perdido (atributo P en el volumen). No se puede montar, ¡una pena! Lo necesitamos mucho.

Hay otros 2 discos, miramos y los montamos:

$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127 /mnt/md127 

Vemos, se nota que esta es la partición de arranque de CentOS 6 y un duplicado de lo que ya hay en /dev/sdb1, y aquí de nuevo la misma clave: DennisBMacAlistairCRitchie!
Vemos cómo está formado /dev/md127.

$ mdadm --detail /dev/md127

Vemos que debería haberse formado a partir de 4 discos, se formó a partir de dos /dev/sda1 y /dev/sdc1, que debieron ser los números 2 y 4 en el sistema. Suponemos que de /dev/sda2 y /dev/sdc2 también se puede formar un arreglo. No queda claro por qué no tienen metadata, pero eso es culpa del administrador que está en alguna parte de Goa. Suponemos que aquí debería haber RAID10, aunque hay opciones. Formamos:

$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2

Vemos blkid, pvs, lvs. Descubrimos que hemos formado un volumen físico, que antes nos faltaba.

Inmediatamente reparamos lvroot, lo montamos, pero primero activamos VG:

$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot 

Y allí está todo, incluyendo la clave en el directorio home de root — /root/sweet.

3. Intentamos revivir nuestro servidor para que arranque correctamente. Movemos todos los volúmenes lógicos de nuestro /dev/md0 (donde encontramos todo) a /dev/sdb2, donde originalmente funcionaba todo el servidor.

$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0

Apagamos el servidor, removemos el disco 1 y 3, dejamos el segundo, iniciamos con Live CD/DVD en Rescue. Localizamos la partición de arranque, restauramos el gestor de arranque en grub:

root (hd0,0)
setup (hd0)

Quitamos el disco de arranque y iniciamos con éxito, pero el sitio no funciona.

4. Hay dos opciones para lanzar el sitio: configurar Apache desde cero o usar nginx ya configurado con php-fpm:

$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start

Finalmente, hay que iniciar MySQL:

$ /etc/init.d/mysqld start

No arranca, y la solución está en /var/log/mysql. Una vez resuelta la problemática con MySQL, el sitio funcionará, en la página principal se encontrará la clave — RichardGCCMatthewGNUStallman! Ahora tenemos acceso a 1C, y los empleados podrán recibir su salario. Y tú, como siempre, tendrás mucho trabajo por delante para optimizar la infraestructura y la seguridad en la empresa.

También podemos compartir una vez más la lista de libros que ayudaron a nosotros y a nuestros participantes a prepararse para el juego: linux.mail.ru/books.

¡Gracias por estar con nosotros! ¡Estén atentos a los anuncios de los próximos juegos!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster