Principios / ideas para ofuscar de forma básica pero efectiva un determinado documento o archivo en sistemas Unix. Útil cuando no se quiere usar un gestor de contraseñas al uso y se prefiere crear algo más personal para ocultar cierta información sin hacer uso de herramientas sofisticadas.
Para el ejemplo se generará un fichero a proteger para su posterior visualización desde cualquier sistema UNIX que tenga VIM (>= 7.4.399). Una vez creado el fichero, que por ejemplo puede contener credenciales, se cifrará usando el algoritmo blowfish2 (ver versión de VIM), se ofuscará mínimamente y se ocultará dentro de una imagen o cualquier otro archivo.
Generar el fichero con VIM y cifrarlo (Bluefish2)
Arrancamos VIM, creamos un fichero, Esc + :setlocale cm=blowfish2, posteriormente ejecutamos “:X” para cifrar el archivo y guardarlo. Si se desea hacer directamente al ejecutar VIM se puede ejecutar el siguiente comando.
vim --cmd 'set cryptmethod=blowfish2' -x fichero. # Generar con VIM el fichero cifrado (Blowfish2) de forma no interactiva. # vim --cmd 'set cryptmethod=blowfish2' -c 'set key=PASSWORD123' -c w -c q file
Ofuscar el fichero previamente cifrado. (Ver enlaces del final del artículo).
Paso 1: Se invierte el orden de las lineas.
sed '1!G;h;$!d' /root/cuentas | tr '!-+,-56-JK-ab-~' 't-~!-*+-?@-VW-s' > /tmp/konto_reverse
Paso 2: Se realiza un cifrado cesar sobre ciertos caracteres de las lineas.
od -An -vtx1 /tmp/konto_reverse > /tmp/konto.txt
Paso 3: Se invierte el orden de los caracteres de las lineas que forman el fichero.
rev /tmp/konto.txt > /tmp/konto_rev.txt LC_ALL=C tr -cd 0-9a-fA-F < /tmp/konto_rev.txt | xxd -r -p > /tmp/konto_rev
Paso 4: Se adjunta el contenido del fichero ofuscado al final de un fichero imagen.
cat tumblr.gif /tmp/konto_rev.txt > imagen.gif
Es importante conocer el tamaño de la imagen original para crear un script que obtenga limpiando el archivo resultante.
du -b tumblr.gif 141164 tumblr.gif # Necesitamos el valor para extraer con dd el fichero cifrado.
Automatizar la recuperar del fichero y su lectura.
Supongamos para el siguiente código de ejemplo que la imagen se ha subido a un servidor web y está accesible. Con esta serie de comandos se obtendría el fichero, se extraería la parte del fichero que nos compete, se desofusca y se le envía a VIM para que solicite la password y se pueda visualizar.
curl -k -qs https://www.dominio.org/imagen.gif > /tmp/cuentas_imagen dd bs=141164 skip=1 if=/tmp/cuentas_imagen of=/tmp/cuentas status=none od -An -vtx1 /tmp/cuentas > /tmp/konto_rev.txt rev /tmp/konto_rev.txt > /tmp/konto.txt LC_ALL=C tr -cd 0-9a-fA-F < /tmp/konto.txt | xxd -r -p > /tmp/konto_casi_ok sed '1!G;h;$!d' /tmp/konto_casi_ok | tr 't-~!-*+-?@-VW-s' '!-+,-56-JK-ab-~' > /tmp/konto_ok truncate --size=-1 /tmp/konto_ok /usr/bin/vim -Rn /tmp/konto_ok rm /tmp/konto* /tmp/cuentas*
NOTA: El proceso mostrado en el artículo es básico y lógicamente es infinitamente fortificable, por ejemplo usando múltiples algoritmos de cifrado, GPG, esteganografía profesional y crypters para la fase de ocultación y/o ofuscación, protección de acceso del fichero mediante HTTPS / IP ACL / Browser Agent, etc.
Ocultar de forma simple en Nginx el acceso a un fichero si no se utiliza una cabecera “Browser-agent” específica.
location /cuenta.gif { if ($http_user_agent !~ (SuPeRbRowSer) ) { return 500; } }
curl -k -A "SuPeRbRowSer" -qs https://www.dominio.org/imagen.gif > /tmp/cuentas_imagen
Improvisar otro gestor de contraseñas usando Git y VIM en 2 minutos.
El concepto es crear un repositorio que servirá de lugar central donde estará el fichero con las credenciales o lo que sea que salvaguardemos. Este método se puede fusionar lógicamente con el comentado anteriormente y rizar el rizo como queramos para ocultar / ofuscar todavía más nuestras credenciales. Para crear un repositorio git accesible solo es necesario tener un servidor de ssh.
La parte cliente, la que va a leer y editar el fichero de credenciales, puede automatizar con un script de pocas lineas todo el proceso para que sea todo más confortable. El script simplemente debe ejecutar un “git pull” del repositorio, abrir el fichero cifrado con VIM y subirá los cambios nuevamente al repositorio. Veamos los pasos a seguir.
Se crea un repositorio desde algún lugar seguro donde se tenga acceso ssh.
El servidor contendrá el repositorio desde el cual se descargará siempre el fichero con las contraseñas, en este caso el fichero se llamará “cuentas”, pero este se creará posteriormente en la parte cliente.
cd ~ mkdir .git cd .git mkdir contraseñas cd contraseñas git --bare init
Ahora como primer paso el cliente simplemente clona el repositorio en /home/XXX/contraseñas/, crean el fichero “cuentas” dentro, cifran el fichero y se sube al servidor.
cd $HOME && git clone ssh://USUARIO@XXXXXX:22/home/USUARIO/.git/contraseñas vim $HOME/contraseñas/cuentas # Para cifrar entrar en el modo comando de vim y pulsar ":X". git add cuentas git commit -m "Primer commit." git push # Actualizamos la copia del servidor.
Una vez realizado el primer paso, ya no hace falta volver a clonar el repositorio. De todas maneras este código intentará clonar el repositorio, pero si ya existe entonces hará un pull y usará la versión más actual del mismo. Esto permite que se pueda copiar dicho script en varios hosts y siempre tener accesible nuestro fichero de contraseñas, se haya o no clonado previamente el repositorio. Estos serían los comandos a implementar en un script para automatizar el proceso de visualizado / edición del fichero “cuentas” desde cualquier sistemas GNU/Linux conectado a Internet.
git clone ssh://USUARIO@XXXXXX:22/home/USUARIO/.git/contraseñas &> /dev/null || (cd $HOME/contraseñas/ && git pull) # Clona o actualiza el repositorio local con los datos del servidor. cd $HOME/contraseñas/ vim cuentas # Abre el fichero cifrado. git add cuentas # Realiza un push con los cambios realizados. git commit -m "`date`" git push
NOTA: No olvidar que el usuario que invoque el comando debe tener una configuración mínima de git, como es el nombre y correo. Se recomienda usar uno diferente para cada sistema cliente de manera que se pueda identificar posteriormente con “git log” desde donde se editaron las credenciales.
# git config --list # (Información de la cuenta actual.) git config user.email "marialasexy@archlinux" git config --global user.name "María Lopez (Sobremesa)"
Lecturas recomendadas para entender los comandos mostrados en el artículo.