Extraer imagen jffs2

Cuando accedemos a un dispositivo embebido una de las cosas que solemos hacer es echar un vistazo a /proc/mtd para ver los montajes de los bloques mtd y suele haber un bloque que es el contiene la imagen del sistema embedibo.

Uno de los formatos de ficheros con el que habitualmente nos encontramos es jffs2 [1]

Para extraer el contenido tenemos varias herramientas que podemos usar:

vía script

Podemos copiar el contenido a un dispositivo mtd local y montarlo como jffs de la siguiente manera. ( Estoy usando image.jffs2)


modprobe mtdram
modprobe jffs2
modprobe mtdchar
modprobe mtdblock
dd if=image.jffs2 of=/dev/mtd0
mkdir -p jffs-root
mount -t jffs2 /dev/mtdblock0 jffs-root/

unjffs2 de firmware mod kit

Es básicamente el mismo script pero mejorado, ya que puede darse que tengamos una image ‘big endian’ este script puede convertir la imagen para su correcta extracción. Firmware mod kit[2] es un conjunto de herramientas empaquetadas para todo este tipo de tareas. Requiere el paquete mtd-utils que provee jffs2dump y debe ejecutarse como root ya que jffs2dump sólo es ejecutable por el usuario root.

apt-get install mtd-utils
git clone https://github.com/mirror/firmware-mod-kit
sudo src/jffs2/unjffs2 image.jffs2 jffs-root

jefferson

Es una herramienta de extracción de jffs2 hecha en python

git clone https://github.com/sviehb/jefferson
sudo python setup.py install
sudo pip install cstruct
sudo apt-get install python-lzma

Extraemos la imagen así
jefferson image.jffs2 -d jffs-root

Personalmente el mejor resultado ha sido con el script de firmware mod kit, aquí dejo algunos enlaces de interés que pueden ayudarte si ninguna de estas herramientas ha funcionado [3] [4]


[1] https://es.wikipedia.org/wiki/JFFS2
[2] https://github.com/mirror/firmware-mod-kit
[3] https://www.owasp.org/index.php/IoT_Firmware_Analysis
[4] http://wiki.securityweekly.com/wiki/index.php/Reverse_Engineering_Firmware_Primer

vim soporte de portapapeles en entornos X

Por defecto en Debian, el paquete vim no soporta copiar y pegar texto de forma que se use el portapapeles para el entorno gráfico. Esto es debido a que vim puede ser compilado con una gran cantidad de opciones distintas, y para ello disponemos de muchos paquetes que actualizarán el binario con más o menos opciones activadas.

En este caso, necesitamos activar ‘clipboard’, pero… ¿ cómo podemos ver las opciones activas de nuestro vim ? con vim --version

$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 17 2016 06:26:47)
Included patches: 1-488, 576
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by jamessan@debian.org
Huge version with GTK2 GUI. Features included (+) or not (-):
+acl +farsi +mouse_netterm +syntax
+arabic +file_in_path +mouse_sgr +tag_binary
+autocmd +find_in_path -mouse_sysmouse +tag_old_static
+balloon_eval +float +mouse_urxvt -tag_any_white
+browse +folding +mouse_xterm +tcl
++builtin_terms -footer +multi_byte +terminfo
+byte_offset +fork() +multi_lang +termresponse
+cindent +gettext -mzscheme +textobjects
+clientserver -hangul_input +netbeans_intg +title
+clipboard +iconv +path_extra +toolbar
+cmdline_compl +insert_expand +perl +user_commands
+cmdline_hist +jumplist +persistent_undo +vertsplit
+cmdline_info +keymap +postscript +virtualedit
+comments +langmap +printer +visual
+conceal +libcall +profile +visualextra
+cryptv +linebreak +python +viminfo
+cscope +lispindent -python3 +vreplace
+cursorbind +listcmds +quickfix +wildignore
+cursorshape +localmap +reltime +wildmenu
+dialog_con_gui +lua +rightleft +windows
+diff +menu +ruby +writebackup
+digraphs +mksession +scrollbind +X11
+dnd +modify_fname +signs -xfontset
-ebcdic +mouse +smartindent +xim
+emacs_tags +mouseshape -sniff +xsmp_interact
+eval +mouse_dec +startuptime +xterm_clipboard
+ex_extra +mouse_gpm +statusline -xterm_save
+extra_search -mouse_jsbterm -sun_workshop +xpm
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
system gvimrc file: "$VIM/gvimrc"
user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
system menu file: "$VIMRUNTIME/menu.vim"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -I/usr/include/tcl8.6 -D_REENTRANT=1 -D_THREAD_SAFE=1 -D_LARGEFILE64_SOURCE=1
Linking: gcc -L. -Wl,-z,relro -L/home/pere/src/debian/ruby/ruby2.1/debian/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.20/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.1 -lpthread -lgmp -ldl -lcrypt -lm

Para afinar un poco más :

$ vim --version | grep clipboard
+clipboard +iconv +path_extra +toolbar
+eval +mouse_dec +startuptime +xterm_clipboard

En este caso vemos ‘+clipboard‘ por lo que tengo la opción activada. Si no es así podemos instalar el paquete gtk para activar el soporte
apt-get install vim-gtk

Ahora ya podemos entrar a vim, escribir algo y probar a seleccionar texto y utilizar las combinaciones típicas de copiar y pegar entre vim y otra aplicación. Si no es posible copiar el texto, podemos mapear la combinación de teclas ‘control+shift+c’ en vim de la siguiente manera:

vmap <C-S-C> "y+<CR>"

… y ya podemos hacer copy+paste de vim a cualquier otro sitio. Recuerda que puedes hacer el mapping persistente en tu ~/.vimrc

Usando tftpd para extraer ficheros de un router

Cuando consigues acceso a un sistema embedido lo más práctico es poder sacar ficheros, o el sistema de ficheros completo fuera del router para poder analizarlo detenidamente.
No siempre hay herramientas como ssh, telnet o un puerto usb donde volcar los datos, pero casi siempre está disponible el comando tftp, un servicio de transferencia de ficheros sin autenticación.

Por lo que nuestro objetivo será conectar desde la consola (busybox) de nuestro router a un host externo que tenga un servidor tftpd y dejar ahí nuestro botín.

Tras algunas pruebas me he decantado por atftpd

sudo apt-get install atfpd

Preparamos la ruta que alberga el contenido

mkdir /srv/tftp/
chonw nobody.nogroup -R /srv/tftp

Desde mi consola tengo este cliente tftp que puede ser o no el tenga tu firmware


# tftp
BusyBox v1.15.3 () multi-call binary

Usage: tftp [OPTIONS] HOST [PORT]

Transfer a file from/to tftp server

Options:
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file

 

Un ejemplo para volcar un fichero de bloques mtd a mi host es este
tftp -p -l /dev/mtd6 -r mtd6 192.168.0.155

Y algo un poco más chulo para volcar casitodo el sistema de ficheros sería esto:
for file in `find /bin/ /etc/ lib/ mnt/ opt/ root/ sbin/ shares/ srv/ tmp/ usr/ var/ vmlinux.lz nocomprlist `; do tftp -p -l "$file" -r "$file"
192.168.0.155; done ;

excluyo los directorios /dev /sys /proc por que tienen ficheros en uso, ficheros de bloques, etc… por que no se pueden copiar de la manera habitual

Como nota, revisar /var/syslog para ver si la subida de ficheros no se está realizando correctamete y por qué. Por defecto el directorio es /srv/tftp el usuario nobdoy y el group nogroup. Recuerda revisar los permisos.