Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 17 de julio de 2015

Cómo ofuscar el código de un script bash

Hasta ahora hemos visto los distintos usos a los que se le puede dar a bash. Desde un sencillo firewall hasta las diferentes formas de sacarle el máximo partido. Pero imaginemos que dicho script tiene que ser entregado a otro usuario; un usuario que casualmente tiene permisos de root en su equipo, y como tal puede hacer lo que quiera el contenido de dicho script... Esto a veces no es importante, pues a veces los cambios que el otro usuario quiere introducir puede suponer una mejora, pero otras veces puede perfectamente ser código malicioso o código que podría "romper" el script que nosotros habíamos creado. Es por ello que a veces es necesario recurrir a herramientas que dificulten la lectura y modificación del contenido del script... Una de ellas se trata de una herramienta que personalmente he encontrado muy útil: shc.

Portada-ofuscación

En este caso hablamos de un software que no podemos obtener desde los repositorios oficiales, sino que se trata de un software de terceros que ha sido compartido en la famosa plataforma github. Dicho software es sorprendentemente fácil de configurar y usar; solamente es necesario descargarse dicho software en el link que os muestro a continuación:

https://github.com/existz/shc-3.8.9

El fichero está disponible para ser bajado en "bruto" mediante git o en formato zip. En este caso optaremos por el método más universal y escogeremos la segunda opción, si bien la primera es perfectamente válida. La primera tarea que deberíamos afrontar para hacer uso de esta herramienta sería la descompresión del fichero en cuestión, que se puede realizar directamente clickando en el archivo (en caso de tener entorno gráfico) o mediante el uso del comando unzip:

  1. unzip shc-3.8.9-master.zip

Esto nos descomprimiría el archivo y nos dejaría un directorio con el nombre shc-3.8.9-master  al cual habría que acceder para poder seguir adelante. Estando presentes en dicho directorio, muchas personas acostumbradas a lidiar con paquetes de este tipo suelen tender a hacer uso de los comandos relacionados con gcc, tales como make o configure; pero en este caso el proceso es mucho más sencillo... Simplemente habría que copiar el binario shc al directorio bin y darle permisos de ejecución de la siguiente forma:

  1. cp shc /bin
  2. chmod +x /bin/shc

Dicha copia nos ha permitido poder disfrutar de la herramienta de ofuscación de código sin recurrir a ningún tipo de instalación adicional o a compilación alguna... Ahora únicamente faltaría darle uso al programa en cuestión, uso de lo más sencillo pues consta de únicamente tres parámetros que se podrían calificar como importantes:

  • -f --> El parámetro indispensable en esta aplicación, cualquier uso del comando -f debe de concluir con el parámetro -f más el nombre del fichero que se desee ofuscar, cualquier intento de ofuscación sin este parámetro será fallido.
  • -e --> Opcionalmente es posible dar una fecha de expiración al código ofuscado. Esto viene bien para ocasiones en las que uno desee que el script que se vaya a entregar a alguien posea una fecha de caducidad. Si el script supera la fecha de caducidad establecida, éste quedará inutilizable. El formato de la fecha establecida siempre será: día/mes/año.
  • -m --> Este parámetro es directamente dependiente del anterior (-e), pues no es ni más ni menos que el mensaje que se mostraría en pantalla en caso de que algún usuario quisiese ejecutar el script caducado.
Ahora que tenemos las bases de este programa, podemos aplicarlos a la práctica. Supongamos que tenemos un programa llamado bashtest.sh con el siguiente código:


  1. #!/bin/bash
  2. cadena="hola esto es una prueba de shc"

Un código simple y perfectamente legible... Ahora es el turno de ofuscar el contenido de éste para que nadie pueda leerlo... Por ejemplo, vamos a hacer que el script bashtest.sh esté ofuscado hasta el día 17 de Julio del 2016 y que cuando caduque muestre el mensaje "Script caducado" a todo aquel que intente ejecutarlo:

  1. shc -e 17/07/2016 -m "Script caducado" -f bashtest.sh

Simple y sencillo... A los pocos tiempo de su ejecución (el tiempo varía dependiendo del tamaño del script) el proceso finalizará y creará dos archivos. Uno con la extensión .x y otro con la extensión .x.c.  El primero de estos dos contiene el código ofuscado, el cual puede ser ejecutado sin problemas, si bien es recomendable eliminarle la extensión .x con el fin de no dar información innecesaria al usuario final... El segundo es un fichero en escrito en c que hace referencia al fichero ofuscado; Dicho fichero no nos es útil y puede ser eliminado sin problema alguno...

En caso de consultar el contenido de nuestro nuevo fichero, veríamos un galimatías parecido a éste:

bash-ofuscado

Como veis las virtudes que ofrece esta herramienta no son nada desdeñables y puede ser un recurso muy a tener en cuenta en determinadas ocasiones.

Saludos.

12 comentarios :

  1. me ha sido de mucha ayuda y es el mas completo que he visto, Saludos

    ResponderEliminar
  2. Me alegro que te haya sido útil.

    Saludos.

    ResponderEliminar
  3. Muy buen post... felicidades.

    Sin embargo tengo una duda, al momento de renombrar el archivo generado, digamos: bash-prueba.sh.x a bash-prueba1.sh y lo ejecuto no me sale el resultado esperado, me sale el siguiente mensaje:


    [12]+ Detenido ./bash-prueba1.sh

    Tienes alguna idea? En otros post, indican de que debo tener instalado el paquete glibc, pero ya está instalado.

    ResponderEliminar
    Respuestas
    1. Muchas gracias Ronald.

      Me parece raro, ya que a mí nunca me ha dado problemas... He de suponer que el script original te funcionaba correctamente y que únicamente se detiene el script con el código ofuscado? Has mirado si hay alguna versión más reciente de shc?

      Otra alternativa sería usar el parámetro -r (Relax Security) en el comando shc (además de los mencionados en el post) que podría darle al script algo más de "flexibilidad". Algo así como sch -r -e 17/07/2016 -m "Script caducado" -f bash-prueba1.sh.

      Espero que te sea de ayuda.

      Saludos.

      Eliminar
    2. Gracias por este post, me ha sido de gran ayuda, pero tengo el siguiente problema, resulta que si genero el archivo en un sistema de 64 bits no funciona en uno de 32 bits, hay una manera para que funcione en las dos arquitecturas

      Eliminar
    3. debes usar shc -r -f (la opcion r es para otracualquier plataforma) igualmente abajo comente que tengo un problemas más importante, que aun con el script ofuscado se ve el codigo en la salida del comando ps | grep mi_script

      Eliminar
  4. debes ejecutar shc -r -f (la opcion r es para que funcione en otras plataformas si mal no recuerdo).
    de todas formas tengo este problema..... El codigo queda oculta al usar el comando ""cat mi.escript.binario"" por ejemplo, pero en mi caso, tengo un script que se llama "prueba", lo he comvertido en binario "prueba.x" pero si el binario esta ejecutandose y haces "ps aux | grep prueba.x" se ve todo el contenido del binario en texto plano. ¿Alguna idea de como solucionarlo?
    contenido del script:
    Por cierto, esto solo pasa cuando esta en binario, si ejecuto el "ps" siendo un script puro no se ve el contenido

    #!/bin/bash
    while true; do
    echo "hola"
    done


    y esto es lo que se ve del binario:

    ps aux | grep prueba.x
    root 2356 99.1 0.2 3296 2236 pts/0 R+ 16:43 0:33 ./prueba.x -c #!/bin/bash while true; do echo "hola" done ./prueba.x
    root 2409 0.0 0.0 2636 540 pts/1 S+ 16:43 0:00 grep prueba.x

    ResponderEliminar
    Respuestas
    1. Buenas.

      Por lo general es imposible esconder dicha información Lo máximo que podrías hacer sería esconder el pid del proceso de otros usuarios mediante:

      mount -o remount,rw,hidepid=2 /proc

      Si bien dicho cambio afectaría a todo y no solamente al programa en cuestión.

      Saludos.

      Eliminar
  5. HOla ivan, te consulto, estoy queriendo hacer esto, pero hay forma de ejecutar ese script ofuscado?

    ResponderEliminar
  6. probe ejecutarlo y me tira el siguiente error Syntax error: "(" unexpected

    es el archivo que contiene la x al final, que lo borre y le añadi la extension sh

    ResponderEliminar