sábado, 20 de octubre de 2012

Ingenieria Inversa Basica en Linux

 "Toda la información proporcionada son para fines educativos.En ningún caso alguno se hace responsable de cualquier mal uso de la información.Toda la información son para el desarrollo de la Hacker Defensa entre los usuarios y ayudar a prevenir los ataques de hackers. GSICR insiste en que esta información NO debe ser utilizada para causar ningún tipo de daño, directa o indirectamente"

 Ingeniería Inversa Basica en Linux


Buenas, aqui comentando James Jara, estaba viendo la tarea de ing. inversa de los estudiantes de la UCR, y se ve .. mm interesante! :)

http://orifaz.ecci.ucr.ac.cr:1220/scoreboard/

Básicamente es un programa el cual tiene 6 niveles y uno mas escondido, por cada falla hace un BOOM noo es un bOOm code, boom de explosión..

Básicamente se crea un archivo con oraciones por linea \N ,  cada linea es la solución a una fase, estas  lineas las deben encontrar aplicando ingenieria inversa al archivo binario.. si una linea es incorrecta hace boom , envia el punto menos y detiene el programa.

Paso a paso:

1) Snifeando el trafico:   

Utilizando TCPDUMP o TSHARK
tshark tcp -V -R > dump1
Data (146 bytes)

0000  47 45 54 20 2f 63 69 31 32 32 30 2f 73 75 62 6d   GET /ci1220/subm
0010  69 74 72 2ggggggggggg5 73 65-----------------3d 31   itr.pl/?userid=1
0020  31 34 35 30 30 30 30 30 26 6c 61 62 3d 62 6f 6d   100&lab=bom
0030  62 6c 61 62 26 72 65 73 75 6c 74 3xxxxxxxx2 25 33   blab&result=0000%3
0040  41 65 78 ------------------65 64 25 33 41 31 25 33 41   Aexploded%3A1%3A
0050  45 6c 2b 71 75 65 2b 7ssssssss 2b 76 61 2b 70 61 72   El+que+se+va+par
0060  61 2b 4c 69 6d 6f 6e 2b 70 69 65 72 64 65 2b 73   a+Limon+pierde+s
0070  75 2b 7-------------6f 26 73 75 62 6d 69 74 3d 73   u+sillo&submit=s
0080  75 62 6d 69 74 20 48 54 54 50 2f 31 2e 30 0d 0a   ubmit HTTP/1.0..
0090  0d 0a                                             ..
    Data: 474554202F6369313232302F7375626D6974722E706C2F3F...
    [Length: 146]

 2) Comando STRINGS

Recabar informacion de los strings es bastante util, esta es la razon por la cual hay que encriptar los programas.
strings bomb > strings.txt 
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
socket
fflush
strcpy
exit
sprintf
srand
fopen
__isoc99_sscanf
connect
signal
puts
time
stdin
strtol
fgets
__errno_location
read
stdout
memcpy
__ctype_b_loc
getenv
stderr
alarm
gethostbyname
bcopy
close
fprintf
sleep
__libc_start_main
write
GLIBC_2.3
GLIBC_2.1
GLIBC_2.7
GLIBC_2.0
PTRh
@[^_
gfff
UWVS
<[^_]
UWVS
Erro
r: C
lien
t un
able
 to
crea
"strings.txt" 317
Erro
r: D
NS i
s un
able
 to
reso
lve
F serv
F$er a
F(ddref
F,ss
 [^_
[^_]
%s: Error: No pude abrir %s
Uso: %s [<input_file>]
Hola, est
s ejecutando tu archivo con bombas.
Tienes que resolver 6 fases. Buena suerte!
Fase 1: desarmada. Vamos a la siguiente.
Fase 2: listos con esta fase. Si se pudo!! ...
Fase 3: Bien!!! Estamos a mitad del camino!
Fase 4: Esta fase estuvo interesante, a ver como te va en la siguiente.
Fase 5: Buen trabajo! Seguimos...
Fase 6: Parece que llegaste al final...
El que se va para Limon pierde su sillon.
Bravo! Has desarmado la fase sereta!
Crees que puedes detener la explosi
n con Ctrl-c?
Se ha generado un registro de esta bomba.
Pura vida, encontraste la fase secreta!
Pero encontrarla y resolverla son dos cosas diferentes...
Felicidades! Has desarmado todas las fases!
Se ha generado un registro de la soluci
n y ser
 verificada.
Bueno, pues...
 se puede. :-)
Fase inv
lida%s
Error de inicializaci
defused
exploded
ERROR: L
nea muy larga.
%d:%s:%d:%s

Morenita de ojos negros,
que me ten
s trastornado,
yo quisiera preguntarte
si mi amor has olvidado.
El amor del hombre pobre
es como el gallito enano;
en correr y no alcanzar
se la pasa todo el a
No me gusta la cebolla
y menos la remolacha;
yo no vengo por el tata
yo vengo por la muchacha.
Del cielo baj
 un pa
uelo
bordado de cinta negra;
decile a tu mamacita
que si quiere ser mi suegra.
En una linda ma
 cantar un jilguero,
y en su c
ntico dec
lo mucho que yo te quiero.
La cinta para ser cinta
que no tenga dos colores;
el hombre para ser hombre;
que no tenga dos amores.
Cuando pas
 por tu casa
metiraste un granito.
Y, porqu
 no me tiraste
mejor ... un rico besito?
Me cas
 con un torero
para aprender a torear;
y al padre de mi marido
fue el que tuve que sortear.
Ya la luna se ha perdido,
ya cant
 el alcarav
los que se quedan, se quedan
y los ques se van, se van.
Quisiera ser escalera
de

3)  Directorio proc

Entre muchas cosas, lista las posiciones de memoria en uso de x proceso por PID.
[root@lulzjames tmp]# /proc/9702/root/
bin/        etc/        lib64/      mnt/        root/       srv/        usr/
boot/       home/       lost+found/ opt/        sbin/       sys/        var/
dev/        lib/        media/      proc/       selinux/    tmp/

 4) Comando nm

Lista los simbolos , funciones locales , variables globales y sus direcciones de un objecto binario
 nm bomb > nm.txt

0804c414 d _DYNAMIC
0804c500 d _GLOBAL_OFFSET_TABLE_
0804a0a4 R _IO_stdin_used
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
         w _Jv_RegisterClasses
0804b404 r __FRAME_END__
0804c410 d __JCR_END__
0804c410 d __JCR_LIST__
0804cd30 D __TMC_END__
0804cd30 A __bss_start
         U __ctype_b_loc@@GLIBC_2.3
0804c5a0 D __data_start
08048990 t __do_global_dtors_aux
0804c40c t __do_global_dtors_aux_fini_array_entry
0804a0a8 R __dso_handle
         U __errno_location@@GLIBC_2.0
0804c408 t __frame_dummy_init_array_entry
         w __gmon_start__
0804c40c t __init_array_end
0804c408 t __init_array_start
         U __isoc99_sscanf@@GLIBC_2.7
0804a080 T __libc_csu_fini
0804a010 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
08048914 T __x86.get_pc_thunk.bx
0804cd30 A _edata
0804d410 A _end
0804a084 T _fini
0804a0a0 R _fp_hw
080486d4 T _init
080488f0 T _start
         U alarm@@GLIBC_2.0
0804a2e0 r array.2788
         U bcopy@@GLIBC_
080489b0 t frame_dummy
08048e6a T fun7
08048c6f T func4
         U getenv@@GLIBC_2.0
         U gethostbyname@@GLIBC_2.0
0804cae0 D host_table
0804cd6c B infile
08049da4 T init_driver
08049d6d T init_timeout
08049028 T initialize_bomb
0804908d T initialize_bomb_solve
0804cd80 B input_strings
08048f78 T invalid_phase

080489dc T main
         U memcpy@@GLIBC_2.0
0804c5c0 D n1
0804c5cc D n21
0804c5d8 D n22
0804c5fc D n31
0804c5e4 D n32
0804c5f0 D n33
0804c608 D n34
0804c620 D n41
0804c644 D n42
0804c650 D n43
0804c638 D n44
0804c614 D n45
0804c65c D n46
0804c62c D n47
0804c668 D n48
0804c674 D node1
0804c680 D node2
0804c68c D node3
0804c698 D node4
0804c6a4 D node5
0804c6b0 D node6
0804cd68 B num_input_strings
08048b40 T phase_1
08048b64 T phase_2
08048bb1 T phase_3
08048ccc T phase_4
08048d2e T phase_5
08048d77 T phase_6

080493a3 T phase_defused
         U printf@@GLIBC_2.0
         U puts@@GLIBC_2.0
         U rand@@GLIBC_2.0
         U read@@GLIBC_2.0
08049247 T read_line
08049353 T read_six_numbers

5) Comando STRACE

strace ntercepta y registra las llamadas de sistema que son llamadas por un proceso y las señales que son recibidas por un proceso.

[root@xxxq tmp]# strace  -d ./bomb > strace.txt

pid 12381 stopped, [133]
) = 0xfffffffff7754000
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mmap2(0xf7756000, 6216, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 0xfffffffff7756000
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
close(4 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)                                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mprotect(0xf7754000, 4096, PROT_READ [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)   = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mprotect(0xf775d000, 4096, PROT_READ [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)   = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
munmap(0xf776e000, 29278 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)               = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 4
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("72.14.179.5")}, 16 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
gettimeofday( [wait(0x857f) = 12381]
pid 12381 stopped, [133]
{1350795072, 491688}, NULL) = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
poll([{fd=4, events=POLLOUT}], 1, 0 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)    = 1 ([{fd=4, revents=POLLOUT}])
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
send(4, "\344\243\1\0\0\1\0\0\0\0\0\0\6orifaz\4ecci\3ucr\2ac\2"..., 39, MSG_NOSIGNAL [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 39
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
poll([{fd=4, events=POLLIN}], 1, 5000 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)  = 1 ([{fd=4, revents=POLLIN}])
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
ioctl(4, FIONREAD [wait(0x857f) = 12381]
pid 12381 stopped, [133]
, [93])                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
recvfrom(4,  [wait(0x857f) = 12381]
pid 12381 stopped, [133]
"\344\243\201\200\0\1\0\1\0\1\0\1\6orifaz\4ecci\3ucr\2ac\2"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("72.14.179.5")}, [16]) = 93
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
close(4 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)                                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
connect(3, {sa_family=AF_INET, sin_port=htons(1221), sin_addr=inet_addr("163.178.104.110")}, 16^X


cleanup: looking at pid 12424
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         1           kill
  -nan    0.000000           0         1           geteuid
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     3           total
System call usage summary for 32 bit mode:
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 53.21    0.000141          20         7           munmap
 46.79    0.000124          11        11           open
  0.00    0.000000           0        12           read
  0.00    0.000000           0        14           close
  0.00    0.000000           0         1           getpid
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1           ioctl
  0.00    0.000000           0         1           gettimeofday
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           poll
  0.00    0.000000           0         4           rt_sigaction
  0.00    0.000000           0        19           mmap2
  0.00    0.000000           0        11           fstat64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         4           socket
  0.00    0.000000           0         3         2 connect
  0.00    0.000000           0         1           send
  0.00    0.000000           0         1           recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00    0.000265                   104         3 total
 

6) debuger gdb

Muy obvio no? :)

8) Comando objdump con -d

objdump muestra información de llamads,   Muestra los mnemónicos de ensamblador para las instrucciones de la máquina de fichobj. Esta opción sólo  desensambla aquellas secciones que se espera que contengan instrucciones. 
 [root@li9 tmp]# objdump -d ./bomb > objdump

./bomb:     file format elf32-i386


Disassembly of section .init:

080486d4 <_init>:
 80486d4:       53                      push   %ebx
 80486d5:       83 ec 08                sub    $0x8,%esp
 80486d8:       e8 37 02 00 00          call   8048914 <__x86.get_pc_thunk.bx>
 80486dd:       81 c3 23 3e 00 00       add    $0x3e23,%ebx
 80486e3:       8b 83 fc ff ff ff       mov    -0x4(%ebx),%eax
 80486e9:       85 c0                   test   %eax,%eax
 80486eb:       74 05                   je     80486f2 <_init+0x1e>
 80486ed:       e8 ee 00 00 00          call   80487e0 <__gmon_start__@plt>
 80486f2:       83 c4 08                add    $0x8,%esp
 80486f5:       5b                      pop    %ebx
 80486f6:       c3                      ret

Disassembly of section .plt:

08048700 <read@plt-0x10>:
 8048700:       ff 35 04 c5 04 08       pushl  0x804c504
 8048706:       ff 25 08 c5 04 08       jmp    *0x804c508
 804870c:       00 00                   add    %al,(%eax)
        ...

08048710 <read@plt>:
 8048710:       ff 25 0c c5 04 08       jmp    *0x804c50c
 8048716:       68 00 00 00 00          push   $0x0
 804871b:       e9 e0 ff ff ff          jmp    8048700 <_init+0x2c>

08048720 <printf@plt>:
 8048720:       ff 25 10 c5 04 08       jmp    *0x804c510
 8048726:       68 08 00 00 00          push   $0x8
 804872b:       e9 d0 ff ff ff          jmp    8048700 <_init+0x2c>

08048730 <fflush@plt>:
 8048730:       ff 25 14 c5 04 08       jmp    *0x804c514
 8048736:       68 10 00 00 00          push   $0x10
 804873b:       e9 c0 ff ff ff          jmp    8048700 <_init+0x2c>

08048740 <memcpy@plt>:
 8048740:       ff 25 18 c5 04 08       jmp    *0x804c518
 8048746:       68 18 00 00 00          push   $0x18
 804874b:       e9 b0 ff ff ff          jmp    8048700 <_init+0x2c>

08048750 <fgets@plt>:
 8048750:       ff 25 1c c5 04 08       jmp    *0x804c51c
 8048756:       68 20 00 00 00          push   $0x20
 804875b:       e9 a0 ff ff ff          jmp    8048700 <_init+0x2c>

9) Y hay muchos mas, pero tambien podemos utilizar soluciones de windows, las cuales no nos van a dar todo le trabajo pero si van a ayudar..

IDA , the interactive dissambler

 En informática, Interactive Disassembler (Desensamblador Interactivo), más conocido por su acrónimo IDA, es un desensamblador empleado para ingeniería inversa. Soporta una variedad de formatos ejecutables para diferentes procesadores y sistemas operativos. También puede ser usado como un depurador para executables Windows PE, Mac OS X, Mach-O y Linux ELF. Un plugin de decompilador para programas compilados con C/C++ está disponible a un costo extra. La última versión completa del IDA Pro es un software comercial; una versión anterior y menos capaz está disponible para descarga gratuita (la versión 5.0 de noviembre de 2010). wikipedia.

IDA the interactive dissambler


Bueno finalizando este tutorial es un poco basico sobre todo informativo, no es mi area favorita asi que no puedo aportar demasiada información mas que esta, la básica pero pueden intentar por aqui, ademas de encriptar y ofuscar el codigo luego aplicar estos pasos, y ver que les sale :D... , en fin muchas gracias por su lectura..

--JAMES JARA 
 Bueno gracias por su lectura, james jara costa rica
Autor: jamesjara.com @jamesjara

miércoles, 10 de octubre de 2012

Scripting en Nmap, con NSE (Nmap Script Engine)


"Toda la información proporcionada es con fines educativos. En ningún caso nos hacemos responsable del mal uso de la información. Toda la información es para el desarrollo de la Hacker Defensa entre los usuarios además de ayudar a prevenir los ataques malintencionados. GSICR insiste en que esta información NO debe ser utilizada para causar ningún tipo de daño, directa o indirectamente"

Nmap (Network Mapper) es una herramienta multiplataforma utilizada por administradores de sistemas y pentesters para  escanear redes y poder determinar que puertos o servicios están activos en nuestra red y cuales posibles vulnerabilidades se podrían explotar, su principal función es la de escaneo de puertos no la de escaneo de vulnerabilidades, a pesar de esto es una útil herramienta para determinar si un servicio se esta ejecutando o si la versión de un servicio ha cambiado, es muy bueno identificando versiones de aplicaciones y sistemas operativos mediante el análisis de huellas de protocolos y aplicaciones. Su diseño fue orientado a la linea de comandos, pero en la actualidad existen versiones gráficas tales como Zenmap o Umit Network Scanner. Si queremos aprovechar al máximo todas sus funcionalidades debemos entonces preferir la linea de comandos y utilizar su poderoso motor de "scripts" --NSE-- . Por este motivo se puede incluir fácilmente en lenguajes de scripting, como BASH (Bourne again shell), o en lenguajes de procesamientos de textos, como Perl, sed o awk. El NSE posee ciertas ventajas sobre BASH o los lenguajes mencionados anteriormente, entre ellas podemos citar:
  • Sensible a las fases. Nmap organiza los procesos de escaneo en fases. NSE sabe en que fase se encuenntra el escaneo, lo que permite al programador evitar recursividades complejas o algoritmos if-then para determinar el estado en que se encuentra el escaneo.
  • Lenguajes comunes para que sea portable. Mediante el uso de un lenguaje común (NSE) se posibilita la exportación de los scripts a sistemas Nmap de otras plataformas. Un script hecho en BASH se puede exportar a otro Linux, pero no se podría ejecutar en un sistema Windows o Mac.
  • Distribución basada en la comunidad. Se usa un lenguaje común para lograr un estándar común y un sistema de distribución de scripts, ya sea con Nmap o de manera independiente.
El lenguaje de scripting de Nmap utiliza el lenguaje de programación Lua. Se trata de un lenguaje interpretado "potente, rápido y ligero", conocido sobre todo por que se usa en el popular juego WoW (World of Warcraft); sin embargo, Lua también se usa en Adobe Lightroom y en otras muchas herramientas. Existe una extensa colección de scripts disponibles. Algunos de estos scripts se incluyen en la distribución de Nmap. Mediante el comando ls (en linux) se puede obtener un listado de los scripts NSE instalados localmente. 

Ejemplo 1. Listado de scripts.

Comprender los Scripts de NMAP
Nmap organiza el proceso de escaneo en cinco fases.

Fases de escaneo.
  • Pre-rules – Los scripts pre-rules se ejecutan antes de que nmap haga cualquier tipo de escaneo en la red. Estos scripts suelen llevar a cabo tareas de limpieza, como por ejemplo crear tablas, determinar el entorno, o incluso generar la lista de direcciones que se escaneará con Nmap.
  • Host scripts – Los scripts de host se ejecutan contra cada host especificado a Nmap una vez completado el escaneo correspondiente a dicho host. Un buen ejemplo de script de este fase es aquel que determina las direcciones MAC de los hosts de la red local. Los scripts de host sólo se ejecutan contra hosts existentes. A estos scripts se les conoce como hostrules.
  • Service scripts – Los scripts de servicio se ejecutan justo después de los scripts de host, pero sólo si el servicio concreto se está ejecutando. Nmap incluye muchos scripts de servicio, siendo probablemente la fase que recibirá una mayor atención en cuanto a scripts soportados por la comunidad. Los scripts de servicio sólo se ejecutan con los puertos de servicio que coincidan. Se suele usar el término portrule para designar esta fase.
  • Post rule scripts – Los scripts post rule se ejecutan después del resto de fases. Estos scripts se suelen usar para tareas de limpieza, notificaciones, informes o para cualquier otra cosa que haya que hacer una vez finalizados los escaneos. 
Los scripts de NSE se dividen en las siguientes secciones:
  • Description – proporciona una descripción del script, la cual se debe incluir entre corchetes dobles después de un signo igual.
Ejemplo 2. Descripción de script.
  • Categories – define las categorías en las que se ejecutará el script. Al asociar un script con una categoría hacemos que el script se ejecute como parte del escaneo de categoría. Un script puede estar asociado a varias categorías. El formato de la sección Categories es el siguiente:

Ejemplo 3. Categorías.
La entrada anterior hace que el script se ejecute cada vez que el administrador ejecute scripts de las categorías Default o Safe.

  • Phase – identifica la fase en la que se ejecutará el script: hostrule, portrule, postrule o prerule. Nótese que los valores hostrule y portrule requieren parámetros y reciben parámetros desde el motor de scripting de Nmap. La sección Phase finaliza con el comando end de Lua (las fases están implementadas como funciones Lua).
Ejemplo 4. Código portrule.
Lo que hace básicamente es crear las variables svc.std y svc.ssl como un array asociativo (líneas 2-3) para después comprobar si el protocolo de transporte no es TCP (línea 4) o si los puertos no están ejecutando HTTP o HTTP sobre SSL (línea 5). Si alguna de estas condiciones no fuese verdadera, el script devolvería un false (línea 6) y Nmap no mostraría ningún resultado. Por otro lado, si el puerto está ejecutando TCP, la lógica continúa y el script determina si Nmap tiene acceso a la librerías cliente para SSL. En caso de no tener acceso a ellas, devolvería un false (línea 11) y no mostraría nada durante la ejecución. Si por el contrario se superan todos los test, la función devuelve true y pasa a ejecutar la lógica definida en la sección "Action".

  • Action – es el algoritmo que contiene la lógica del script para cuando se supere la lógica de la fase. La lógica utiliza variables Lua estándar, sintaxis y funciones, combinadas con las librerías incluidas con Nmap. El hecho de que las librerías de NSE estén presentes en Nmap ahorra al desarrollador el tener que lidiar con funciones como la conexión al puerto o la lectura desde un servicio de red.
Ejemplo 5. Codigo fase "Action" de un script para NSE.
El código mostrado en el Ejemplo 5., que corresponde al script de Nmap para ftp anónimo ftp-anon.nse, muestra lo fácil que es conectar con un socket, enviarle datos y comprobar el código de estado devuelto.

Uso de NSE

Muchos de los scripts de NSE básicos son miembros de la categoría Default.Para ejecutar los scripts de Default usamos la opción -sC.

 root@root:~# nmap -sC www.ejemplo.net

El parámetro -A también ejecuta los scripts de la categoría Default, añadiendo además algunas opciones extra al escaneo. Para ejecutar un script específico utilizamos el parámetro --script seguido del nombre del script. Por ejemplo, para ejecutar el script Whois incluido con NSE.

 root@root:~# nmap --script whois.nse www.ejemplo.net

NSE permite además ejecutar varios scripts separándolos con comas, o incluso categorías enteras introduciendo el nombre de la categoría. Por ejemplo:

root@root:~# nmap --script malware www.ejemplo.net

De este modo se ejecutaran todos los scripts que pertenezcan a la categoria malware en nmap.

Categorías de Scripts

La comunidad de Nmap clasifica los scripts en categorías. A la hora de buscar un script, o a la de escribir uno, es importante comprender la metodología empleada para la clasificación de éstos:

  • Auth – La categoría Auth se compone de más de 30 scripts para la comprobación de protocolos de autenticación, configuración y controles en el host objetivo. La mayoría de estos scripts tienen que ver con fuerza bruta o con vulnerabilidades, por lo que no se deben emplear contra redes en las que se haya implementado un servicio de detección de intrusiones.
  • Broadcast – La categoría Broadcast es actualmente muy pequeña, con un total de seis scripts que utilizan métodos broadcast y multicast para obtener información de la red. Entre los scripts hay identificación de clientes de dropbox, detección de servicios de host mediante servicios de DNS y multicasting para servicios web.
  • Default – La categoría Default cuenta con más de 50 scripts. El equipo de Nmap utiliza 6 criterios a la hora de colocar un script en esta categoría predeterminada: velocidad, utilidad, volumen de salida, fiabilidad, nivel de intrusión (ha de ser muy bajo), privacidad (o falta de la misma).
  • Discovery – Los scripts de detección son aquellos que se prestan a usar la
    información de red y de sistema operativo para mapear los hosts de la red.
    Existen más de 70 scripts incluidos con el motor de escaneo de Nmap.
  • DoS – En la categoría de denegación de servicio se encuentran los scripts que pueden causar fallos de servicio u otros problemas importantes. Se ha de extremar la precaución en su uso, puesto que podrían tirar servicios indispensables. Actualmente sólo se distribuyen 2 scripts de este tipo con Nmap.
  • Exploit – Los scripts de Exploit tratan de ejecutar efectivamente un exploit en función de si Nmap ha descubierto un host con una vulnerabilidad explotable. Nmap sólo incluye un exploit en su paquete.
  • External – En External se encuentran los scripts que se comunican con otros hosts distintos del host local o el host objetivo. Por ejemplo, en esta categoría se incluiría un script que actualizase automáticamente una base de datos con información heurística.
  • Fuzzer – Los scripts de la categoría Fuzzer son scripts destinados al descubrimiento de nuevas vulnerabilidades o técnicas identificativas, cuyo funcionamiento habitual consiste en enviar datos aleatorios a los servicios.
  • Intrusive – Los scripts de esta categoría pueden o bien tirar servicios y sistemas, o emplear grandes cantidades de ancho de banda para su ejecución.
  • Malware – Los scripts que hay en Malware son aquellos que han sido diseñados para detectar malware en los hosts remotos.
  • Safe – Los de la categoría Safe son scripts considerados por lo general como poco intrusivos.
  • Version – La categoría Versión pertenece a los scripts diseñados para identificar explícitamente versiones concretas de servicios.
  • Vuln – La categoría Vuln (vulnerabilidad) está dedicada a la detección (pero no explotación) de vulnerabilidades.
Conclusión
Hemos presentado NSE, el motor de scripting de Nmap. Esperamos que el contenido mostrado les aporte una buena base a la hora de determinar cuándo conviene usar scripts y cómo desenvolverse con NSE. Con un conocimiento sólido de las categorías de Nmap y los scripts en sí, así como cierto conocimiento en cuanto al motor de scripting, se le puede sacar el máximo partido a Nmap.

¡Happy Hacking!