Ofuscar ficheros / Improvisar visor de contraseñas con VIM (>= 7.4.399)

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.