jueves, 7 de noviembre de 2013

Los insultos de sudo... y nuestros insultos

El otro día me aburría y decidí tomarme una cerveza y leer el manual de sudoers (el fichero de configuración de sudo), lo típico que haría cualquiera para desaprovechar bien el tiempo.

Al grano, resulta que una de las opciones es la siguiente:

insults         If set, sudo will insult users when they enter an incorrect password.  This flag is off by default.

Para activarla y ver su comportamiento añadimos la siguiente línea a /etc/sudoers:

Defaults    insults

Ahora cuando algún usuario introduzca mal la contraseña, sudo amablemente le insultará :).

$ sudo echo "no me se la contraseña"
Password:
Wrong!  You cheating scum!
Password:
And you call yourself a Rocket Scientist!
Password:
No soap, honkie-lips.
sudo: 3 incorrect password attempts

Bueno, esto está bien y tal, tiene su cierto toque de gracia, pero más divertido es que si somos el administrador de la máquina (o más de una) cambiemos los insultos y le pongamos algunos personalizados, bien sea en español en nuestro caso o más divertido aún, que tengan que ver con el ámbito (la empresa, la uni, la casa o lo que sea). Este ha sido el proceso que he seguido yo para conseguirlo (uso ubuntu 12.04).
  1. Me bajé el código fuente de sudo (estas son las tonterías que hace que sea un ferviente defensor del software libre, entre otras).
    • $ apt-get source sudo
  2. Extraemos el paquete.
    • $ tar xvzf sudo_1.8.3p1-1ubuntu3.4.debian.tar.gz
  3. Después tenemos que empezar a buscar dónde anda toda la parte de los insultos. Sorprendentemente sudo no busca los insultos en algún fichero, sino que los tiene directamente hardcodeados dentro del binario... no sé por qué. Acabaremos encontrando que los insultos están en el directorio plugins/sudoers, que el fichero insults.h es el que controla cuáles insultos se incluyen y cuáles no, y que los distintos tipos de insultos están en los ficheros ins_*.
  4. A partir de aquí modificamos el fuente de la manera que más nos guste para añadirle nuestros insultos, recompilamos e instalamos, lo típico.
Veámos un pequeño ejemplo. Para empezar creo un nuevo fichero con la estructura adecuada con mis insultos.

$ vim my_own_insults.h

  1 #ifndef _MY_OWN_INSULTS_H
  2 #define _MY_OWN_INSULTS_H
  3
  4     "MAAAAAAAAAAAAAAAAAAAAL!",
  5     "Paquete",
  6     "Intentando fuerza bruta? JA!",
  7     "Ponte a estudiar",
  8     "Menos de 100m en el d3? Pobre",
  9     "Yarr mola",
 10
 11 #endif


Ahora modificamos insults.h para incluir nuestros insultos (muestro sólo las líneas relevantes con lo que yo hice en negrita).

 21 #if defined(HAL_INSULTS) || defined(GOONS_INSULTS) || defined(CLASSIC_INSULTS) || defined(CSOPS_INSULTS) || defined (MY_OWN_INSULTS)
...
 29 #ifdef MY_OWN_INSULTS
 30 #   include "my_own_insults.h"
 31 #else

 32
 33 #   ifdef HAL_INSULTS
 34 #       include "ins_2001.h"
 35 #   endif
 36
 37 #   ifdef GOONS_INSULTS
 38 #       include "ins_goons.h"
 39 #   endif
 40
 41 #   ifdef CLASSIC_INSULTS
 42 #       include "ins_classic.h"
 43 #   endif
 44
 45 #   ifdef CSOPS_INSULTS
 46 #       include "ins_csops.h"
 47 #   endif
 48 #endif


Lo he puesto para que si estan mis insultos no esté ninguno más. Ahora continuamos con los típicos pasos de configuración, compilación e instalación. En el directorio donde se encuentra el script de configure:

$ ./configure --with-insults

No estoy seguro de si hace falta ponerle el --with-insults o ya viene por defecto, pero para el caso da lo mismo. Antes de compilar modificamos el makefile de plugins/sudoers/ para que al compilar se defina la macro MY_OWN_INSULTS, de la que dependen nuestros insultos, si no lo hacemos nos quedaremos con un palmo de narices jeje:

$ vim plugins/sudoers/Makefile
...
 56 CFLAGS = -g -O2 -DMY_OWN_INSULTS
...

Y ahora ya el proceso normal:

$ make && make install
$ sudo echo "hola"
Password:

Yarr mola

Fácil, rápido y para toda la familia. Ahora replicamos el sudo de esta máquina por el resto de máquinas que administremos y nos echamos unas risas :D.

Saludos.

jueves, 12 de septiembre de 2013

Color del prompt para no cagarla

Esta entrada no va de seguridad directamente, sino de buenas prácticas para administradores de sistemas. Esto es algo que aprendí hace algunos años y que me pareció un truco fantástico así que aprovecho y se los cuento.

Un problema que he visto que se da bastante cuando uno maneja varios sistemas desde consola es que en un momento dado, entre todo el trapeteo que esté haciendo, acaba perdiéndose y no sabe en que sistema está en un momento dado. El escenario típico es, por ejemplo, tener la consola (o varias!) de la máquina que tienes delante, una máquina virtual con otra consola y la pantalla maximizada y quizás para hacerlo todo más guay alguna sesión de SSH a alguna máquina remota. No te cuento ya cuando además desde esa sesión de SSH tienes más sesiones a otras máquinas de una red interna, etc. Esto se puede liar todo lo que quieran.

Para intentar tener una pista rápida de en qué sistema me encuentro en un momento dado, yo lo que hago es a cada máquina ponerle su prompt de un color diferente. Así por ejemplo en mi máquina del día a día lo tengo de color gris, en una máquina servidor importante amarillo, en una virtual verde, etc. De esa forma después de pulsar alt + tab y antes de escribir algún comando loco (rm -rf) identifico rápidamente en dónde me encuentro.

No me voy ni a molestar en poner algún enlace a alguna página que muestre como hacerlo, "set <aquí su consola> prompt color" en google y a correr.

Tan sólo comentar un par de cosas más, el sitio ideal para poner estos cambios suele ser el .<nombre consola>rc del home. Y la otra cosa es que esta idea es interesante de aplicar no sólo a prompts en distintas máquinas sino también para distintos usuarios. Yo por ejemplo en las máquinas donde me puedo logear como root, a este usuario en concreto le pongo el prompt en rojo para indicar peligro xD... sííííív, ya sééééé, vaya mierda de sysadmin que soy que me logueo como root, para algo está sudo y sudoers... Son mis sistemas y me los follo como quiero!

Saludos.

miércoles, 29 de mayo de 2013

Hasselhoff en consola

Muchos en España conocen lo que es el ataque David Hasselhoff. Traigo aquí una versión un poco más linuxera... y nada de Gnome, KDE, Xfce, Enlightenment o sucedaneos. Esta será una versión de consola.

Lo primero es conseguir la imagen, y dado que estamos en consola, transformarla a ascii art usando alguna de las páginas webs que hacen esto. Hail a las personas que hacen programas de este estilo! xD. Con esto ya tenemos nuestro santo grial...

............................................................,......:I+~=.:=,....
..........,......................................................INDDNNNDNOZ,...
..................................,,............................8DDNDNNNNNNNZO:.
.............................................................,:DDDNDDDDDNNNNNNN.
............................................................,?ONNNNNNDDNNNNNNNNZ
...........................................................:=?8NNNNDDNNDNNNNNNN8
........................................................~~=~?ODD88D8D8ZDDNNNNNNN
....................................................,=+===I$OZD8DOI7$II$8DNNNNNN
...................................,.............,+++++=$$7?~IOO+=~~~=?I7$NN8ODD
..............................................,?=++==?$Z$......=I??7Z7DZII88Z$NN
............,.................=???I+,.......:++====+I$?.........?II?++==?7$$7ZNN
............,................?+?++?I$,...,,++==~=++$8..........~++??I=++I7$$$$88
............................I==~~=?I7Z:..+++===+?7O8OZ$III77I777$??+OI??II7ZZ$$.
...........................+?+~+++?I7$ZI?++++++I$OD7++?I777IIIIIIII++IOII7ZOZ$$$
...........................??++++??II$$Z8?+??I7O87?===++?II77777777II7II7$OOZZ$$
..........................~I???I+??II7$$Z8?I????I+=+=+??I77$Z7I7$ZZI?+I$OOOZ$7I7
....................:~~,..?III?ZI?I777$$$Z8~IZOOZ$$$ZZO$7ZO8D$7$$ZZOIZ$O8OZ7I?II
.................,:?==++IZ$7IIIZ7I7$$$$$$ZOO.......,=Z8Z?Z88D$$$$ZZOI$IZOZ$I??II
...........,,...,I?====++?$ZZII$DZ$7$$ZZZZZOZ,....~7O$O7$78ZND$$$$ZOOZ$Z$$77I777
..............,??+~==~+?++?7$8ZZDDOZ$ZZZZOOZO8~IZOZZ888Z8DO8DN$Z$$Z8ZZ$77I?77$$7
.............,?I??==++====+?I7Z8DND8ZZZZZOOOOOZ8$7OZ7ZZ8Z88DNNNZZZ8OZ$7$$$$77II?
.....,......,?7I????++=+==+??I77$DD8OZOOO888OZZZ$O7I8+I$DDDNMN8$D8OZZ$$$7III?+=~
...........,?II++?II7?I?+=+++??I77Z8ZZOZ8OZZZ7$77ZZ?$7IID8NNNZOZN8OZ$77II??I????
..........:II?+??IIIIIII?++++++??I7$O88Z8Z7Z7$$Z$?O$II$ZOZ7$8ZZNDOZ$77I???????I?
.........+??++????I78?III??++?++???I7$O$$III7$?O$$I$I+?$7I$Z8NN8OZ$$III??I???III
........II?++??IIII7ZZ$III?++++?+++??I7ZZII??$ZI$$I8I87Z$O8NND8OOZ$$$I???I???III
......,?????????II7$Z.,$7III?++?+??+??I7$O$$I7=I$I8$OOZNDOOOOZOO$$$$IIIIIIII7777
.....~??????+???I77Z,.IZ777III??????+??II7Z$$7$$7Z78OO8ZOZ$$ZOZ88ZZ$$7777$$ZZO77
....~???+??IIII7I7Z:..Z7II7II7II+???????II7$7$OZOONZODD8$$$$$$$$ZOZ$$777$ZZZON7I
...+???I????I7I77$,..,$7I7O7777II????????II77OOZ$OD8N8OO$7I777IIII77IIIIII7$ZOD$
..????????III7$?.....$7II$O877I777III?I?IIIII7ZDZZIZZZ7ZOZ77I7IIIII?I77777$$ZO8+
:??+?????II77+,.....,7I?IZO?.77II77II?IIIIIIII$Z887ZOOZZNO77I??????I77777$$ZO?..
??????IIII7~........7II?ZZO...+777777IIIIIIII77$ZOD8O$$Z$$777777III777$$ZOO+....
+?++?III7,.........??+?7$ZZ....,77I77777II77777$O$8D8ZO8D877$7777$$ZZOOO8?.....,
??+?II7:.........,???I7$Z$7....,,$777777777777$OI7OOI$7ODD8OZZZZZZOO8DD8....,,,,
?I7II...........??+II777I7?,,,,,,,I777777777$$7IOD8D8DDO788O8ODDDDD$8ZI77Z88~,::
77~......,,,,,~I?I777II???+::::::,:,7I7777$$$$Z$DDD8ZZZ77Z$O8IZ88$87$I7?IOZNZD~+
7,...,,,::=?I???I777I?IIII::::,,.,,,,I77777$$ZZ8NNDDDO8$Z??II77$ZO7$Z7ZOOOOOOZOZ
I:~::,,,:==?I??II~~~~:::::,....,.,,,,,:7I77$7$ZZNNNNDN8OI??III7II7$77$7$$$$$$$$$
+.......,?==??7?,,,,,.,.......,...,,,,,,,:88D88DZ8D8O$78DNI?I?III7I?II$$7$$$7$$$
......,...,,,..,,,,...,............,,,,,,ID8OOO88888OZO$$O?8??I777?II$ZZZOZZZOOO
.......,..............,...,...,,....,,,,...,,O8OI~:,,,,,,.::7OZZI+:...,.........
.........................,..........,.,,........................................ 


Desde luego podría ser mejor, pero lo importante es que el pwneado reconozca lo que esto significa xD.

Ahora lo suyo es metérsela en algún lado (la imagen digo). Vamos a aprovechar la característica del .bashrc de que se lee y ejecuta al iniciar una sesión. Lo que haremos será guardar la imagen en algún archivo y ponerle un cat en el .bashrc, suponiendo que el archivo se lo dejamos en $HOME/.dh:

cat ~/.dh

Así cuando se inicie sesión la próxima vez comenzará la ultrajación xD.

Evidentemente ésto se descubre muy fácil y se remedia aún más fácil, eliminando el archivo y/o quitando el cat del .bashrc. Vamos a meterle una vuelta de tuerca (sólo una) para tocar un poco más los cojones. En concreto vamos a hacer que, si borran el fichero .dh se vuelva a crear y si quitan el comando del .bashrc se vuelva a meter. No va a ser ningún hackeo complicado ni nada por el estilo, la idea es dar un poco más por culo.

Para evitar el borrado del archivo lo que podemos hacer es una copia de seguridad del fichero en algún sitio más oculto y con un nombre menos evidente, por ejemplo dentro de alguna de las carpetas ocultas tipo .ssh/ opor el estilo. Luego en el propio .bashrc en medio del código que hay ahí, no al final del archivo ponemos algo como:

if [[ ! -e ~/.dh ]]; then
    cp .ssh/authorize_keys ~/.dh 2>/dev/null 1>/dev/null
fi


Es importante el hecho de meter este código en medio del .bashrc para que pase inadvertido a simple vista, y por ello y lo siguiente también es importante que el cat que pusimos antes esté al final en plan evidente jejeje.

Esto es una salvaguarda para si la persona pwneada decide borrar el fichero .dh, pero lo más normal es que lo que borre sea el cat que habremos metido al final del .bashrc, más que nada porque si no lo hace, cada vez que se loguée va a aparecerle un error de fichero no encontrado. Lo que haremos será meter otro poco de código en medio del .bashrc para detectar si han borrado el cat y en tal caso meterlo nuevamente xD. Algo como esto:

CMD1="cat"
CMD2="~/.dh"
CMD="$CMD1 $CMD2"
egrep "$CMD" ~/.bashrc 2>/dev/null 1>/dev/null
if [[ $? -eq 1 ]]; then
    echo "$CMD" > ficheroconnombrequenocolisiona1

    cat ~/.bashrc ficheroconnombrequenocolisiona1 > ficheroconnombrequenocolisiona2
    mv ficheroconnombrequenocolisiona2 ~/.bashrc
    rm -f ficheroconnombrequenocolisiona1
fi

Con esto lo que conseguimos es que al iniciar sesión se compruebe si dentro del .bashrc está el "cat ~/.dh" y si no está pues se lo pone. En este inicio de sesión no se imprimirá el hasselhoff, eso ocurrirá la siguiente vez. Me pareció interesante hacerlo así para que la persona que lo esté sufriendo no lo note inmediamente si no se suele loguear demasiado en ese sistema y de esta forma piense que hemos vuelto a entrar y hacerle lo mismo, de hecho verá el cat de nuevo al final del .bashrc jejeje.

Un par de cosas a tener en cuenta:
  • Aquí he puesto líneas un poco largas, es mejor que los nombres de los ficheros intermedios sean mas cortos y menos evidentes para que se confunda más con el entorno (camouflage programming :P).
  • La redirección de las salidas (estándar y de errores) del egrep para que no aparezca en pantalla nada si encuentra algo.
  • Vemos que juego con un par de variables CMD1 y CMD2, es necesario "partir" el comando ya que si lo ponemos tal cual (egrep "cat ~/.dh" ~/.bashrc) aunque el pwneado borre el cat que ponemos al final, el egrep siempre va a encontrar este patrón... en su propia línea ;).
  • Una vez preparado todo esto sería interesante borrar el historial o posibles pistas que hayamos podido dejar y que puedan hacer más fácil que encuentre todo esto.
Y con esto y un bizcocho ya tenemos el hasselhoff de consola xD.

Saludos.