"Después del juego es antes del juego"
Sepp Herberger

domingo, 18 de marzo de 2018

Ocultando el código de un script bash

A veces necesitamos un script bash que puedan ejecutar los usuarios (por ejemplo, mediante un acceso directo en un fichero .desktop), pero dentro de él hay contraseñas o algún fragmento código que no nos interesa hacer público.

Por poner un ejemplo práctico, imaginemos un script que levanta/apaga a voluntad la red wifi de 5ghz de nuestros puntos de acceso DLink, que en mi caso mantengo apagada por defecto.

El script es sencillo:
# cat wifi5ghz.sh
#!/bin/bash
case "$1" in
  "on")   comando="ifconfig ba0 up"
          ;;
  "off")  comando="ifconfig ba0 down"
          ;;
  *)      echo "Error en parámetros"
          exit 1
          ;;
esac
sshpass -p "tuyM59b" ssh -o StrictHostKeyChecking=no root@192.168.0.1 "$comando"
exit 0
Usamos sshpass para entrar por ssh y ejecutar el comandod de apagado/encendido sin que se pida contraseña al usuario. El problema que tenemos es que si distribuimos el script tal que así, cualquier usuario puede ver la contraseña de administración del router DLink (la que he puesto es figurada) y eso no es tolerable.

Entre las diversas soluciones a este problema una consiste en hacer el script ilegible ofuscando su contenido. De las herramientas y trucos que hay para eso el mas potente que he encontrado es usando la aplicación "shc", que compila un script generando un fichero ejecutable ilegible. Nosotros nos quedaremos con el código fuente del script y a los usuarios les distribuiremos el ejecutable. Es raro esto de compilar scripts, pero para la situación descrita viene de perillas.

Una vez instalado compilaremos el script haciendo:
# shc -r -f wifi5ghz.sh -o wifi5ghz
Esto nos creará un fichero ejecutable wifi5ghz que hará lo mismo que wifi5ghz.sh sin que sea visible su código (si el usuario hace un cat sobre él verá un galimatías ASCII). El parámetro "-r" es importante porque permite que ese ejecutable pueda ejecutarse en otras máquinas distintas a aquella dónde se compila el script (si no se pone el ejecutable deja de funcionar a los pocos días).

Como apunte adicional, si consultamos los parámetros de shc veremos que tiene cosas bastante interesantes, como por ejemplo la posibilidad de hacer que el ejecutable caduque en una fecha predeterminada.

Hasta pronto.

3 comentarios:

  1. Estoy con un problema usando éste metodo. 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 prueba.x" se ve todo el contenido del binario en texto plano. ¿Alguna idea de como solucionarlo?

    ResponderEliminar
    Respuestas
    1. perdon, corrijo el comentario anterior. Se ve el contenido del binario mientras esta ejecuandose (o sea en memoria) con el comando "ps aux | grep prueba.x"

      Eliminar
    2. Hola, realmente no hay manera de ocultarlo usando shc. De hecho incluso se puede averiguar el código interno del script por otros métodos que no sea hacer el ps aux y pillarlo in fraganti. Ten en cuenta que shc es un método sencillo pero básico de ocultación que protege de usuarios no muy avanzados.

      Hay métodos mas complicados pero quizá mas seguros como http://enscryption.com/encrypt-and-obfuscate-scripts.html. Te aconsejo que pruebes con ellos hasta encontrar lo que te satisface.

      Saludos.

      Eliminar