Script avanzado en Bash (bash+md5) para proteger ‘algo’ (+Explicación detallada)

Hace unos días les hablé de FlatPress, una aplicación web (CMS) mediante el cual pueden tener un blog o algo similar sin necesidad de usar bases de datos, ni complicarse mucho 🙂

Bueno, yo tengo en mi laptop un FlatPress para apuntes personales, cosas que no quiero olvidar y por eso los escribo en esta bitácora personal. Pero, como varios ya deben saber… yo soy algo paranoico con la seguridad, y, si es referente a la seguridad de MIS pensamientos, no tienen idea de qué tan paranoico puedo llegar a ser 😀

Entonces me enfrenté al problema: ¿Cómo usando FlatPress puedo proteger todo el contenido del mismo?

Pensé en varias aplicaciones que permiten cifrar datos, mas… ninguna hacía exactamente lo que deseaba, por eso me dí a la tarea de programar yo mismo lo que quería.

Ahora les mostraré un script que hice, el cual hace lo siguiente:

El script está diseñado para funcionar en KDE, si no tienen KDE los cuadros de diálogo no les aparecerán.

1. Muestra un cuadro de diálogo preguntando si eres KZKG^Gaara, si presionas NO se cierra el script, si presionas SI continúa todo normal.

2. Muestra un cuadro de texto preguntando cuál es el password:

3. Si presionas Cancelar se cierra el script, ahora viene uno de los trucos del script 😉 …

3.1. La lógica es que el script compare el password que escribimos con uno que esté predefinido dentro del mismo script ya, y si los passwords concuerdan entonces sigue ejecutándose, y si los passwords no concuerdan pues que aparezca un mensaje de error. El problema es que, si ponemos el password correcto dentro del script así sin más, cualquiera que abra el script con un editor de texto podría ver muy claramente el password correcto.. y esto amigos míos, es simplemente una falla imperdonable 🙂

3.2. Para evitar poner el password así en texto plano en el script, yo usé MD5. O sea, al inicio del script, yo declaré que el password correcto es «2dac690b816a43e4fd9df5ee35e3790d«, y este es el MD5 de: «desdelinux«. … No entiendo nada!! … 😀

Detallemos un poco más. Si yo ahora escribo en un archivo (por ejemplo, ~/pass.txt) de texto: desdelinux

Si en una terminal escribo: md5sum ~/pass.txt

Me devolverá: 2dac690b816a43e4fd9df5ee35e3790d sum

Y… como pueden ver, esa primera columna que tiene montón de números y letras sin orden aparente, es idénticamente igual a la que puse más arriba, y es la que está en el script declarada.

Bien, esa primera columna es el MD5 de desdelinux 😉

Si ponen lo siguiente les devolverá solamente la 1ra columna, que es la que nos interesa: md5sum ~/pass.txt | awk '{print $1}'

4. Entonces, el funcionamiento del script en esta parte en específico es:

4.1. El script pondrá el password que hayas escrito tú en un archivo temporal llamado temp.txt, y sacará el MD5 del contenido de ese archivo mediante el comando:

md5sum temp.txt | awk '{print $1}'

4.2. Si el MD5 del password que acabas de escribir NO es idénticamente igual al que él tiene definido (o sea, que el que está escrito en el script) se cerrará y dará un error:

4.3. Si el password coincide, perfecto… el script continúa 😀

5. Al coincidir el password, el script hará una serie de pasos, en mi caso:

5.1. Entrará a la carpeta /home/shared/hosted/cd /home/shared/hosted/

5.2. La carpeta de FlatPress se llama «me», y está comprimida en .RAR protegido con password (el password es el mismo que se debe poner antes), por lo que el script va a descomprimir ese archivo (me.rar) -» rar x me.rar -hp$MWORD

rar x -» Lo que hace es descomprimir archivos y carpetas manteniendo el mismo orden que tienen.

me.rar -» Este es el archivo que deseo descomprimir.

-hp$MWORD -» Aquí le indico que debe usar password para descomprimir el archivo, y el password es la variable $MWORD (esta variable es el password que introdujimos antes)

5.3. Entonces, si se descomprimió bien, paso a borrar el archivo me.rar … ¿por qué?, bueno, porque no tiene sentido que exista el .rar si estoy trabajando con los archivos que tenía dentro, y esos archivos están cambiando pues estoy escribiendo cosas nuevas en el blog -» rm me.rar

5.4. Le debo cambiar los permisos para que funcione bien todo -» chmod 777 -R me/ (recuerden que la carpeta me/ es lo que contenía el comprimido me.rar)

5.5. Me mostrará una ventana que me indica que tengo 10 segundos para abrir «el» navegador…. WTF!, ¿esto qué significa? …

5.5(a). Simple, muy simple… 🙂 … Yo abro el navegador (en este caso Rekonq) y estoy trabajando en algún post nuevo, pero al momento de cerrar el navegador, el script vuelve a comprimir en .rar la carpeta me/ (quedando en me.rar).

Esto es posible porque el script está comprobando cada 3 segundos si Rekonq está abierto o no, si detecta que sí está abierto, el script no hace nada, pero si detecta que NO está abierto, pasa a ejecutar: rar a me.rar -hp$MWORD me/* && rm -R me/

Lo cual significa que va a comprimir la carpeta me/ en me.rar (y le pondrá password, que sería el mismo que hemos visto ya), y una vez que la comprima y si no hubo errores, pasará a borrar la carpeta me/ con todo su contenido.

5.5(b). ¿Esto en qué nos ayuda? … simple, esto nos evita tener que acordarnos de que debemos volver a proteger nuestro contenido, pues solo necesitamos dejar de trabajar en él (cerrar el navegador) y el script hará todo el resto del trabajo 😉

6. Listo, esto viene siendo todo explicado de forma general 🙂

… aunque aún hay otro detalle 😀

El script tiene una protección aún mayor, protección que está deshabilitada (comentada) son estas líneas:

if [ "$USER" != "$ME" ]; then
rm *.sh
kdialog --error "Sorry but u are not me. Auto-destroying..." --title "Im Me..."
exit
fi

Esto lo que hace es simple. La variable $USER es una variable global del sistema, si en una terminal ponen:

echo $USER

Verán que les muestra el usuario de ustedes… bueno, la lógica de estas líneas es simple.

Si $USER no coincide con la variable $ME (y esta la declaré yo en el script, y es: «gaara») el script borrará TODOS los archivos .sh que estén en esa carpeta, o sea, se autodestruirá 😉

Esto es para prevenir que alguien más ejecute el script en otro ordenador jejejeje.

Y bueno, no creo que haya mucho más que explicar, les dejo el script:

Descarga de archivo .SH
Ver el script en nuestro Paste

Sé que a muchos les resultará sumamente complejo, pero en realidad asusta más de lo que debería… el script tiene una lógica de funcionamiento realmente simple, para un propósito simple.

Esto lo hice para suplir una necesidad muy específica mía, lo comparto esperando que alguna que otra línea o idea acá explicada le pueda servir a alguien 😉

Por cierto, el script está pensado para KDE, porque los cuadros de diálogo (las ventanas) que muestra son de KDE (usando KDialog), pero se puede adaptar para Gnome/Unity/Cinnamon/Mate usando Zenity, o bien usarlo 100% en terminal usando simplemente el comando dialog.

Y sí, aún el script tiene alguna que otra falla, por ejemplo si el script descomprime el .rar, y luego alguien cierra a la fuerza (mata) el script, el contenido del .rar quedará desprotegido, son algunos detalles que quedan por pulir… pero eh!, que también nosotros debemos controlar que nadie pueda revisar nuestro ordenador 😀

Para finalizar quiero aclarar que yo NO soy programador ni mucho menos, no me considero tal, imagino que se puede optimizar líneas en el código, o usar alguna función para mejorar el funcionamiento del script… pero lo dicho, no soy programador 😉

Cualquier duda que tengan al respecto me dicen, si bien el script puede que no les sirva pues no lo necesitan, siempre podrán aprender algún que otro tip de él 😀

Saludos

PD: Sé que elav dirá que soy demasiado paranoico… o que desperdicio mi tiempo, pero no es así. Quería algo muy específico, un sistema muy específico de seguridad, y me lo programé yo mismo… ¿qué tan geek es eso? … LOL!!


41 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   HacKan dijo

    Esta interesante, pero creo que la pregunta de si/no es muy al pedo xD
    Y que te parece, en lugar de usar rar que es privativo y no ofrece seguridad verdadera, reemplazarlo por gpg, que es un soft de seguridad más que probado con los años, y existe en todas las distros practicamente 😉
    Otra cosa, podes pasarle a md5sum un string, no hace falta q crees un archivo temporal. Aca tb te recomiendo pasarte a sha que es muchisimo mas seguro, proba en la terminal: shasum

    SAludos!

    1.    KZKG^Gaara dijo

      Hola y gracias por tu comentario 😀
      GPG me permite empaquetar un directorio con todo su contenido? Es que en realidad solo lo he usado para archivos sueltos, no para directorios que contengan subdirectorios y archivos.

      ooo… genial lo de shasum, no lo conocía 😀
      Pasaré a modificar el script para usar este, y… sí !! cierto, con simplemente: echo «$PASSWORD» | shasum ya obtengo la cadena, en efecto, no hay necesidad de escribirlo en un archivo 😀

      De veras muchísimas gracias por tu comentario, he aprendido ya algo nuevo 🙂
      Saludos

    2.    sieg84 dijo

      es lo mismo que le preguntaba…

      1.    KZKG^Gaara dijo

        Lo que necesitaría es averiguar cómo cifrar con GPG un archivo y pasarle el password en la misma línea… por ejemplo:
        gpg -e file.tar.gz –password elpasswordquesea

        ¿alguna idea de cómo hacerlo? 🙂

        1.    HacKan dijo

          Para encriptar un directorio c/ gpg, primero hay q empaquetarlo con tar.
          luego, para este caso conviene usar cifrado simetrico, con el parametro -c (ver en wikipedia la dif entre cifrado simetrico y asimetrico).
          esto entonces seria algo como:
          tar -czf destino.tgz directorio_fuente/ && echo $passwd | gpg –batch –compress-level 0 -c –passphrase-fd 0
          esto creara un archivo comprimido llamado «destino.tgz» y el archivo encriptado llamado «destino.tgz.gpg». tanto el directorio fuente como el mismo comprimido deberian eliminarse x seguridad (fijate el comando shred)

          para desencriptar:
          echo $passwd | gpg –batch -d –passphrase-fd 0 archivo_cifrado.tgz.gpg | tar -xz
          eso extraera los archivos en el directorio actual (luego puede usarse mv para moverlos a otro lado)

          cualquier duda, responde este comment 🙂

          saludos!!

          1.    HacKan dijo

            ehm, ojo con los guiones dobles (–) y los simples (-)… hay alguna forma de escribir algo como si fuese codigo para q no cambie el formato?
            prueba de codigo -- -
            [code]prueba de codigo — -[/code]

          2.    HacKan dijo

            lo paso mas prolijo

            comprimir y encriptar:
            tar -czf destino.tgz directorio_fuente/ && echo $passwd | gpg –batch –compress-level 0 -c –passphrase-fd 0
            notese q aca son dos pasos: primero crea el archivo comprimido y acto seguido, si no se produjo un error, prosigue c la encriptacion (encadenamiendo con &&)

            desencriptar y descomprimir:
            echo $passwd | gpg –batch -d –passphrase-fd 0 archivo_cifrado.tgz.gpg | tar -xz

            salutes!

          3.    KZKG^Gaara dijo

            Síp, de hecho ayer en casa me leí el man de gpg y ahí estaba todo lo que necesitaba 😀
            En realidad no lo hice del todo así, no usé echo ni compresión, hice un post sobre esto, recién lo publiqué.

            Mil gracias por la ayuda amigo, de veras que sí.

  2.   Josh dijo

    ¡Que maravilla! justo estaba buscando algo así y me encuentro con tu articulo. Voy a probarlo para proteger mis datos. En cuanto a seguridad informática nunca se es demasiado paranoico. Gracias

    1.    KZKG^Gaara dijo

      Gracias jaja.
      ¿Entendiste el funcionamiento del script no?

      Parece mucho más complejo de lo que en realidad es jejeje.

      Gracias por el comentario, de veras 😀

      Saludos

      PD: En efecto, la seguridad nunca es suficiente jajaja.

      1.    Josh dijo

        Me costo un poco entenderlo(lo leí 3 veces) ya que llevo poco tiempo usando linux. Pero en verdad es simple y siempre resulta agradable aprender cosas como esta. Saludos y gracias otra vez.

        1.    KZKG^Gaara dijo

          Lo importante es entenderlo jeje. Intenté explicar todo sumamente detallado, pero creo que me extendí demasiado jajaja.
          Gracias a tí 🙂

  3.   auroszx dijo

    Wow, muy bueno el script 🙂

    PD: Paranoia is Over 9000! xD

    1.    KZKG^Gaara dijo

      hahahahahahaha that’s me … LOL!!

  4.   Rafael dijo

    Viendo tu script creo que se puede hacer con xdialog por si no tienen kde :)! saludos

    1.    KZKG^Gaara dijo

      Oh, no conocía xdialog … tendré que echarle un ojo a ver 😀
      Gracias por el dato.

  5.   sieg84 dijo

    en lugar de rar porque no usar tar.xz/gz y gpg ¿?

    1.    Rafael dijo

      es porque ya lo tiene en rar donde tiene su CMS

  6.   Citux dijo

    Excelente @KZKG^Gaara hace días estaba pensando en algo así, pero ando en exámenes así que no he tenido tiempo de nada, y de repente veo tu artículo….
    lo probaré la próxima semana 🙂

    1.    KZKG^Gaara dijo

      Gracias, cualquier detalle acá estoy 😀

  7.   truko22 dijo

    xD no entendí nada u.u pero si me gustaría como usar en los scrits kdialog correctamente, como sacar mensaje en el notificador de KDE

    1.    KZKG^Gaara dijo

      Para sacar mensajes en las notificaciones de KDE prueba a instalar el paquete: libnotify-bin
      Luego en una terminal pones:
      notify-send "texto texto texto"

      Y verás qué chulo 😀 … y, esto funciona para KDE, Gnome, Unity, Cinnamon, Mate y Xfce 😉

      No obstante en este script no uso las notificaciones como tal, sino simplemente ventanas de KDialog. En una terminal escribe:
      kdialog

      Y verás la ayuda ahí 😉

      Saludos 😀

      1.    truko22 dijo

        Muchas gracias o/

  8.   Joel Antonio Vásquez dijo

    Hola, buen post, solo una sugerencia, vale que con md5 no se ve a simple vista, pero algunos curiosos podrán utilizar un rainbow table para ver si la contraseña convertida en md5 se encuentra dentro de ahí, te recomiendo usar bcrypt (http://bcrypt.sourceforge.net/), solo es una sugerencia, lo puedes tomar para cualquier ocasión, Saludos.

    1.    KZKG^Gaara dijo

      Gracias 😀
      En realidad sí, MD5 no es perfecto y hay quienes han logrado sacar passwords, le echaré un ojo a esta aplicación 😉

      Gracias por tu comentario.

  9.   sieg84 dijo

    con la simétrica apenas en kdialog te pida la contraseña
    y con la asimétrica usando una llave pública.

    debo aclarar que no tengo ni una pisca de programador.

    1.    KZKG^Gaara dijo

      Síp, ya logré cifrar con GPG (de hecho acabo de poner un post sobre esto) jeje.

  10.   Caro dijo

    KZKG^Gaara leo siempre tus post.
    Armate uno para usar con XFCE.
    Beso. Caro

    1.    KZKG^Gaara dijo

      Hola y ante de todo, bienvenida al blog 😀
      jajaja gracias, sé que a veces se hace difícil porque escribo cosas un tanto técnicas, pero intento siempre explicar todo tan claro como me sea posible 🙂

      Experimentaré un poco con XDialog o Zenity a ver si me sale para Xfce jaja, haré las pruebas en un Xubuntu virtual 🙂

      Saludos

  11.   Elynx dijo

    Bastanteee util hombre, gracias!

    Saludos!

  12.   Damian Rivera dijo

    Gracias me va servir mucho para proteger unos archivos

    Lo tuve que adaptar a zenity porque no tengo kde en estos momentos :\

    Aquí dejo el esqueleto que voy a usar adaptado a zenity

    http://paste.desdelinux.net/4641

    Gracias de nuevo y saludos 😀

    1.    KZKG^Gaara dijo

      oooo genial, muchísimas gracias 😀 😀
      Recuerdo que alguien pidió esto pero para Xfce, con Zenity funcionaría en Xfce no?

      1.    Damian Rivera dijo

        Si,solo que la orden de comandos se quedo para que añadieran los comandos a ejecutar, después de pasar el password de shasum o md5

        Se tendría que modificar a distintas necesidades para cada quien ,para proteger distintas cosas en distintas rutas con distintos comandos

        O tal vez añadiendo otra parte (GUI) para crear la configuración de seguridad de nuestro archivo

        Un Saludo 😀

        1.    Damian Rivera dijo

          Tenia tiempo y xfce(en Archlinux) y ya he adaptado totalmente el script como estaba, para xfce usando zenity(creo) ya que el que deje arriba solo era el esqueleto que use

          http://paste.desdelinux.net/4644

          ¿se podrá editar si tiene un fallo desde el paste?

          Lo que pasa es que tengo varias shells gráficas y no se si servirá en xfce limpio,por ejemplo en xubuntu

          Saludos 😀

  13.   Matias Gastón dijo

    Interesante che!!! Buen aporte!!!!!!

    Soy muy nuevo en esto de programar, estoy aprendiendo BASH de a poquito…pero algunas cosas se me ocurrieron y te pueden servir o no..
    Cuando decís que el script pelado tiene incorporado el password y sería imperdonable que alguien lo abra y lo lea de ahí… vos planteás todo este truco de embeber el MD5 como medida de protección.

    Lo cual está bastante bueno como primer paso para complicarle la vida al posible intruso, pero fijate en las siguientes ideas (que incluso pueden aplicarse una arriba de la otra)

    IDEA 1) Qué tal si el password lo guardas dentro de un archivo en tu máquina, y no alojarlo en el script?

    EJ: en un txt ponés la clave y la guardás en /home/<user>/bla/bla/clave.txt
    En tu script llamas a la clave como CLAVE="$(cat $HOME/bla/bla/clave.txt)", luego tirás el if $clavepreguntada = $CLAVE, then.. etc etc

    De esta forma, estás logrando 3 cosas +1 ventaja:
    1) Que la contraseña jamás estuvo en el script. (Evitás el MD5)
    2) La ruta en donde está la clave, depende del nombre de usuario. (Cualquiera que lo quiera abrir, lo redirecciona a cualquier lado) En el 99.9% de los casos le va a fallar el script.
    3) En caso de que quieras más seguridad, quitale todos los permisos al archivo clave.txt para todos los demás usuarios excepto el tuyo.
    4) Ventaja: Portabilidad para cambiar la password cuando quieras, sin editar script. Porque la comprobación es externa a través de un fichero.

    IDEA 2) Qué tal si ofuscás todo el script de bash, para que ni siquiera se pueda abrir?

    Una forma de hacer esto es aprovechar de que en C es necesario compilar.
    Entonces, introduce el script dentro de un código C que lo único que hace es llamar a ese Script (pero que está metido dentro del programa). Al momento de compilar… queda todo dentro y tu salida es un ejecutable.. y no más un script. Hay una persona que ya hizo un "script" que hace el proceso de ofuscación, con lo cual es muy práctico.

    Más info acá: http://es.wikibooks.org/wiki/El_Manual_de_BASH_Scripting_B%C3%A1sico_para_Principiantes/Compilar_%28ofuscar%29_BASH_scripts_con_C_-_SHC

    IDEA 3) Qué tal si, ponés una condición virtual en el script en donde requiera contraseña de administrador?

    Por ej, ejecutar una condición usando "sudo" y que luego siga con el script, sino detenerla.
    De esta manera toda la protección recaería como un puente sobre tu password de ROOT.

    Bueno, nada más…
    Saludos!!!!!!!! y aguante BASH.

    1.    KZKG^Gaara dijo

      HAHAHAHA Gacias 😀
      En realidad ahora ando usando SHA512 pues es mucho mejor que MD5: https://blog.desdelinux.net/como-saber-la-suma-md5-o-sha-de-una-palabra-oracion-o-archivo/
      Así como GPG como medio de protección en vez de comprimir con .RAR: https://blog.desdelinux.net/como-proteger-datos-con-gpg-de-forma-simple/

      El problema de poner el password en un archivo diferente, es que entonces pondría el password en otro lugar sí, pero ¿estaría en texto plano?. Si debo cifrarlo (que es lo recomendado), lo dejo en el mismo script, pues… dudo muuuuuucho que alguien pueda romper SHA512 jajajaja (mira el 1er link y entenderás 😉 )

      Sobre lo de los permisos, si alguien usa un LiveCD podría entonces abrir el .txt usando el root del LiveCD, por lo que los permisos no es del todo la mejor opción.

      Sobre lo de ofuscar el código del Bash … sí, esto lo había pensado y la idea es GENIAL, el problema es que no sé cómo hacerlo, de hecho ni siquiera sé si se puede hacer JAJAJA.

      Oh wait… ahora leo el resto del comentario O_O … jeje, no sabía que se podía hacer eso. Yo no tengo ni idea de C o C++, pero valdría la pena probarlo jajaja.

      Sobre la idea 3, no está mal 😀

      Le he hecho varias mejoras al script desde que publiqué este post, 2 son las que mencioné en los links al inicio de este comentario, otra es que si cambia algún caracter en el script, se borra. Y ahora tengo pendiente probar esto de ofuscar el código jajajaja.

      Gracias por tu comentario y … sí, aguante bash!!! JAJA

    2.    KZKG^Gaara dijo

      WTF!!!
      Ya he usado SHC … GE-NI-AL !!!! O_O

  14.   Atheyus dijo

    Muy bueno el script,oye y si usas un comprobador de root,para poder ejecutar el script como sudo ./script

    Solo tendrías que añadir este código al principio

    http://paste.desdelinux.net/4663

    Un Saludo

  15.   Neo61 dijo

    KZKG^Gaara, amigo, creo que el extenderte en una explicación no es el problema, eso es bueno para los que no tenemos tanto conocimiento. Aquí mismo se han publicado articulos que no enseñan, solo dan una información de algo que existe. Así que no te excuses y que hayan mas con eplicaciones extendidas.

  16.   dhunter dijo

    Para cosas como estas uso http://www.truecrypt.org/

  17.   Abel dijo

    Alguien podría compartir el script? Tengo curiosidad y todos los links estan caídos. 🙁

    Gracias.