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 - Kaxperday

#91
Hola a todos, tengo que redirigir el tráfico del puerto 80 (HTTP) a otro puerto para poderlo modificar antes de que salga de mi ordenador, así pues cuando cargue una página con el ordenador el navegador la sacará hacia el puerto 80, si yo esa salida la redirijo a puerto 8080 por ejemplo no me cargaría la página no?, entonces podría montar un server con sockets que escuche las peticiones en el puerto 8080 y lanzarlas desde ahí modificando los datos ¿no?.

Por cierto lo único que he encontrado hasta ahorapara redirigir el tráfico de un puerto a otro en windows es con esto:

netsh interface portproxy v4tov4 listenport=80 connectaddress=192.168.0.100 connectport=8080 protocol=tcp

Poniendo nuestra IP, y en caso de estar redireccionando varias ponerlas todas una a una, ¿no hay manera de poner que redirija a todas con un solo comando? Pero esto no es lo importante, la pregunta principal es la de la parrafada, la que me tiene en ascuas.

Gracias y saludos.
#92
Hola, pues eso, necesito pasar a una función un dominio en forma de cadena, y que me devuelva un "existe", "no sabemos si existe porque algo ha fallado como la red", "no existe".

La idea era hacerlo con gethostbyname():

WSAStartup(MAKEWORD(2, 0), &wsa);
hostent *h = gethostbyname(dominio.c_str());
if(h==NULL)WSAGetLastError();...


Y si existe la funcion devuelve distinto de NULL, pero si no puede conectar con el dominio devuelve NULL, entonces debo recojer el tipo de error producido con WSAGetLastError(), y aqui quiero diferenciar si es un error de red (que no haya internet por ejemplo) o que realmente la haya hecho y el server no responda, pero el problema es que WSAGetLastError() devuelve lo mismo si el host no existe que si tengo el wifi apagado.

Dicho esto, cree esta funcion:

Código (cpp) [Seleccionar]
estado_dominio existe_dominio(string dominio)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);
if (gethostbyname(dominio.c_str()) == NULL){
if (gethostbyname("google.com") == NULL){
WSACleanup();
return SIN_CONEXION;
}
else{
WSACleanup();
return NO_EXISTE;
}
}
WSACleanup();
return SI_EXISTE;
}


Pero no es eficiente ya que por cada peticion hace otra a google.com, de esta manera si google responde es que tenemos conexion.

¿Como lo puedo optimizar?.

De paso os dejo este code que fue el primero que hice pero no tenia sentido ya que  WSAGetLastError() devolvia siempre lo mismo.

Code:

Código (cpp) [Seleccionar]
int existe_dominio(string dominio)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 0), &wsaData);
if (gethostbyname(dominio.c_str()) == NULL){
int error = WSAGetLastError();
if (error == WSAHOST_NOT_FOUND){ //No existe host.
WSACleanup();
return 0;
}
else if (error == WSANO_DATA){ //Existe pero no envió datos.
WSACleanup();
return 1;
}
else if (error == WSANOTINITIALISED || //Reintentaremos puede existir host.
error == WSAENETDOWN ||
error == WSATRY_AGAIN ||
error == WSANO_RECOVERY ||
error == WSAEINPROGRESS ||
error == WSAEFAULT ||
error == WSAEINTR){
WSACleanup();
return 2;
}
else{ //No sabemos que ocurrió.
WSACleanup();
return 2;
}
}
WSACleanup();
return 1; //Encontrado y existe.
}


¿Alguna funcion o metodo para comprobar si existe un dominio y que si falla diferencie entre fallo de red o falta de respuesta del servidor (no existe)?

Saludos, gracias.

Edito: Iba a probar con connect(), pero tenía que rellenar un struct in_addr y necesitaba la ip del server, para saberla primero tengo que resolverlo y si soy capaz de ello es que existe, luego no es metodo, ¿alguien sabe si se puede hacer con datagramas? ¿como sería? o un ping? ¿Cual sería el mejor método más rapido y eficiente?.

Saludos.
#93
Pues eso, hasta el momento se me ocurre haciendo un post a una pagina que muestre mi ip publica. Pero si esa página no responde ¿que hago entonces? ¿alguna idea?

Saludos y gracias!.
#94
Hola gente, necesito saber cuales son los subdominios que usa, ya que son gratuitos y cualquier persona puede crearlos. Ejemplo .hostoi.com, .netai.com .comuv.com etc

¿Son siempre los mismos o no? ¿como podría obtener toda la lista?

Saludos y gracias.

Edito: Y aprovecho para preguntar, ¿alguna web que permita crear tu propio dominio como 000webhost? Es que solo conozco esa que funcione.

Ups, solucionado:

http://www.000webhost.com/forum/content-managament-systems/29088-list-subdomains.html
#95
Redes / ¿Por qué no funciona este MITM?
10 Septiembre 2015, 18:11 PM
Buenas a todos,

sigo tratando de hacer funcionar un MITM, que tengo para windows en C++, en resumen lo que hace es envenenar la red, haciendose pasar por el router para las victimas y por cliente para el router, enviando así las peticione que nos hacen las victimas al router con la ip de las victimas y nuestra mac, ademas al router le decimos que a todas las ips de los clientes de la red les corresponde mi mac, asi cuando el router devuelva el paquete, se lo devuelva a la direccion ip que lo solicitó que estará asociada a nuestra mac, por lo que nosotros obtendremos el paquete, y luego nosotros recojemos la ip del paquete y lo reenviamos a la victima haciendonos pasar por router, pero algo falla pues consigo llegar a hacer denegacion de servicio a la red, pero no consigo dar conexión a los equipos de la red, se quedan cargando y no hay solución. He probado a establecer ip fordwarding pero el resultado es el mismo. No tengo la tarjeta de red en modo monitor, esta en modo normal, ¿puede ser eso?.

Os dejo una captura de lo que hace cuando trato de atacar a mi propio movil en la red:



Aparece la ip del router y la ip del movil, y tambien son paquetes nuestros ya que nosotros interactuamos conel router con la ip de la victima y nuestra mac en los paquetes, y a la victima con la ip del router y nuestra mac.

He visto proyectos de MITM como tomahawk hechos en C#, y lo que hacía era una tabla de ARP estática:

Código (csharp) [Seleccionar]
// static ARP entry manipulation (IP, MAC, friendly interface name, add/remove)
        public bool StaticARP(string IP, PhysicalAddress mac, string WinName, StaticARPOperation operation)
        {
            OperatingSystem system = Environment.OSVersion;

            // format MAC address
            var macString = Network.FriendlyPhysicalAddress(mac).Replace(":", "-").ToLower();

            // prepare process
            Process p = new Process();

            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
            p.StartInfo.FileName = "cmd";

            // Vista, Windows 7/8 - use "netsh"
            if (system.Version.Major > 5)
            {
                if(operation == StaticARPOperation.Add)
                    p.StartInfo.Arguments = "/k netsh interface ip delete neighbors \"" + WinName + "\" " + IP + " && netsh interface ip add neighbors \"" + WinName + "\" " + IP + " " + macString + " && exit";
                else
                    p.StartInfo.Arguments = "/k netsh interface ip delete neighbors \"" + WinName + "\" " + IP + " && exit";

                p.Start();
                p.WaitForExit();

                p.Dispose();

                return true;
            }

            p.Dispose();

            return false;
        }


¿Será esto necesario?, uno de los problemas que puedo tener es que el SO manda datos con los datos correctos a los demás ordenadores, y muchas veces se siente engañado, ¿cómo podría solucionar eso en caso de que sea el problema? ¿sino lo es, que puede ocurrir?

He de añadir, que lo que hago ahora es un flooding de arp-poisoning, cuando me funcione así ya pasaré a hacerlo pasivo, pero de momento es de prueba, los hosts de la red me reconocen a mi como AP, pero no paso de la denegación de servicio.

Saludos y gracias por la ayuda, si os animáis a echar una mano.
#96
Hola a todos, estuve leyendo como hacerlo y era posible modificando una clave en el registro, y poniendola a "1" con los correspondientes permisos de admin, pero desconozco como funcionan eso de las claves y modificar sus valores, esto es lo que tengo, y no funciona:

Código (cpp) [Seleccionar]
bool establece_forwarding(bool modo){
HKEY key;
if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"), &key) == ERROR_SUCCESS){
if (RegSetValueEx(key, TEXT("IPEnableRouter"), 1, REG_SZ, (LPBYTE)"0x00000001", strlen("value_data")*sizeof(char)) != ERROR_SUCCESS)
{
RegCloseKey(key);
cout << "Unable to set registry value value_name";
}
else
{
cout << "value_name was set" << endl;
}
RegCloseKey(key);
}
return false;
}


También aparte de esta duda, me gustaría saber si es algo imprescindible para realizar un MITM con ARP o no. Tengo entendido de que sí, aunque quizás en mi modelo de MITM no sea necesario, porque todos paquetes llegan a mi IP y de ahí reenvío, el problema es que no soy capaz de redirigirlos, ¿me los rechazará el router? ¿el ip fordwarding ayudará?, lo active manualmente y nada cambió, pero quizás ayude, y así ya tengo la función para automatizarlo.

Saludos.

Edito: Tambien me gustaría saber si esto funcionaria, a ver si con un simple pistazo me lo podéis decir o si tiene algún fallo, es para anclar un programa al registro apartir de una direccion y el nombre del ejecutable:

Código (cpp) [Seleccionar]

bool anclar_registro(string nombre, string direccion)//incluye exe
{
HKEY hkey;//(lcpwstr) L"algo"
string total = direccion + nombre;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey) == ERROR_SUCCESS){
if (RegSetValueEx(hkey, (LPCWSTR)(nombre.c_str()), 0, REG_SZ, (BYTE*)total.c_str(), total.length()) == ERROR_SUCCESS){
RegCloseKey(hkey);
return true;
}
else{
RegCloseKey(hkey);
return false;
}
}
else
return false;
}
#97
Programación C/C++ / Crear red P2P descentralizada
5 Septiembre 2015, 21:51 PM
Hola a todos, quería informarme de como crear una red P2P descentralizada, me he estado informando y según he leído no requiere un servidor que haga de enroutador. Simplemente los usuarios actuan como cliente y servidor a la vez, vale. Pero mi pregunta es, ¿como hago que los usuarios busquen a más usuarios entre sí?.

Mi idea es programar algo sencillo en C++, sería una red P2P descentralizada. El cliente haría de cliente y servidor a la vez, es decir, se conectaría a otro cliente o usuario de la red y a la vez permitiría que estos se conectaran a el, para compartir información. Una vez tenga la IP  de estos sería fácil para mi por medio de sockets realizar la conexion, pero la pregunta es:

¿Como encuentro la IP de los clientes conectados, cual es el método de programación que he de usar? ¿Como obtengo la lista de todos los clientes conectados de la red? (Tendría que preguntar al que ya tengo y este a los que ya tiene y así hasta acabar supongo).

Algo de información pls, estoy leyendo pero no se como implementar.

Podría hacer una centralizada, pero no busco eso, quiero está que es más difícil y supongo que más estable ya que no depende de un server central.

Saludos y gracias.
#98
Bueno, para acabar la noche escribo este post.

Miren tengo un archivo que divido en campos con delimitadires, escribo cadenas encriptadas en cada campo. El problema es que luego al obtener esas cadenas no las recojo correctamente, creo que es porque uso string en vez de char o no sé.

Lo leo todo su contenido así:

Código (cpp) [Seleccionar]
string almacen::obtener_campo(int campo)
{
ifstream archivo;
archivo.open(directorio, ifstream::in);
if (!archivo)
return "";
else{
string contenido;
while (archivo.good())
contenido += archivo.get();
archivo.clear();
archivo.close();
}


Me dice que tiene lo siguiente:

CitarCPcqGW51VRuFPRzAxwEMholaaaaaaaaque haaceess maripooossssssssssa7mgF5BDu2xspuP4DtANxO■¦©^×{oT╗┐Gç_÷SÆs
È~©BüQ³f5Ä{░µ ðø¥¹Q:╗\‗Y╚§.áë╔¾¶ÈÙ│Ï,jI¸Ñ°┴!▀Òs

Pero el archivo con el bloc de notas muestra lo siguiente:

CitarCPcqGW51VRuFPRzAxwEMholaaaaaaaaque haaceess maripooossssssssssa7mgF5BDu2xspuP4DtANxOþݸ^ž{oT»¿G‡_öS's
¢&H‹>VßnÎÀeØo®QNЛ¾ûQ:»\òYÈõ. ‰ÉóôÔë³Ø,jI÷¥øÁ!ßãs
Ô¶~¸BQüf5Ž{°æÔ;pÉE^ª•€UÏ·Ù¹ÒÛŒM™ÈuUÌvýýýý^ÿ^ÿnyFtCn4jPKItqWCAdJn6QTMTgH0wSWCMQOKA3H6OxDNJOWH2PIWCy3k79QJwÿ

¿Porque no accedo a todos los datos? ¿acaso no puedo obtener todos los caracteres con ifstream.get()? ¿qué solución puedo dar?

Saludos y gracias.

Edito: Sin embargo caracteres alfanumericos los lee sin problemas, pero los raros no.. ¿ que son ? xd

Edito: Acabo de abrirlo en binario || fstream::binary  y el resultado ha sido el mismo.
#99
Bueeeno, resulta que me resistía a crear este hilo, pero no me queda otro remedio tras horas de frustración.

Tengo una clase que saque del Rijandel a través de su code source de codeproyect.

Esa clase en mi proyecto se llama "encriptador_1". Y bien creo una clave de 24 caracteres, ahora tengo que cifrar en bloque pues venga que comience la fiesta.

Código (cpp) [Seleccionar]
encriptador_1 prueba;
prueba.MakeKey(ENCLAVE_PRIMERA, encriptador_1::sm_chain0, 24, 24);
string ***** = "wu1394yvh 1034y v180934ync89103y4 0813480ycn10384yn081n348401";
char * salida = new char[*****.length()]();//length te da los bytes.
cout << *****.length() << " " << strlen(*****.c_str()) << endl;
while (*****.length() % 24 != 0)
***** += '\0';

cout << *****.length() << " " << strlen(*****.c_str()) << endl;
prueba.Encrypt(*****.c_str(), salida, *****.length(), 0);
cout << "entrada: " << ***** << endl;
cout << "cifra: " << salida << endl;
***** = salida;
strcpy(salida, "");
while (*****.length() % 24 != 0)
***** += '\0';
prueba.Decrypt(*****.c_str(), salida, *****.length(), 0);
cout << "descifra: " << salida << endl;
cout << "feliz";
system("pause");


Salida:

Citar61 61
72 61
entrada: wu1394yvh 1034y v180934ync89103y4 0813480ycn10384yn081n348401          
cifra: ÃÅäþ̵=C¾
descifra: 8╝
Ï┤─¸K{ç§░lI┐Ò┬ä%+2¨Ò▄┘f«ð¹º»½h
pUq@ôMä°BÛ¤§p1ê­¡┐e┐È╩µÒ¥Q▓UGø°±{!9¹L
felizPresione una tecla para continuar . . .

He de decir que me he dado cuenta que string.legth() devuelve caracteres incluyendo \0 en la string y strlen() solo hasta el primer \0.

Como se puede observar no cifra correctamente, antes lo hice funcionar pero me daba error en el system("pause"), omg. Algo casca por ahí.

Cojo una cadena la añados \0 hasta hacerla múltiplo, luego llamo a Riyandel.Encrypt(), y le paso un puntero char* del que he reservado memoria igual al tamaño de la cadena a cifrar, ese puntero tras llamada al método contiene la cadena cifrada.

Esa cadena la paso a la string y repito el proceso.

¿Qué hago mal?

Saludos.

Edito: Por favor basta de banear la palabra mierd.a es muy usada en la comunidad, de hecho es la palabra que se me banea en el código #FREEMIERDA.

Por cierto he reducido la cadena y he eliminado los espacios y me funciona (sale la cadena descifrada correctamente) pero el programa casca, al depurar dice que es el system("pause") pero creo que es algo de overflow.

Saludos.

EDICION DELICATESSE: solucionado rigth now, habia un overflow en el puntero, necesitaba mas memoria pues la cadena desenciptada tenía mas caracteres de los que podia abarcar el puntero.

Código (cpp) [Seleccionar]
encriptador_1 prueba;
prueba.MakeKey(ENCLAVE_PRIMERA, encriptador_1::sm_chain0, 24, 24);
string ***** = "wu1394yvh1034y v180934ync89103y0 813480ycn10qwefq  384yn081n348401";

cout << *****.length() << " " << strlen(*****.c_str()) << endl;
while (*****.length() % 24 != 0)
***** += '\0';
char * salida = new char[*****.length()]();//length te da los bytes.
cout << *****.length() << " " << strlen(*****.c_str()) << endl;
prueba.Encrypt(*****.c_str(), salida, *****.length(), 0);
cout << "entrada: " << ***** << endl;
cout << "cifra: " << salida << endl;
***** = salida;
strcpy(salida, "");
cout << *****.length() << endl;
while (*****.length() % 24 != 0)
***** += '\0';
salida = new char[*****.length()]();
prueba.Decrypt(*****.c_str(), salida, *****.length(), 0);
cout << "descifra: " << salida << endl;
cout << "feliz";
system("pause");


Working fine muak mk, Kaxperday
#100
.NET (C#, VB.NET, ASP) / Travian bot en C#
28 Agosto 2015, 16:21 PM
¿Alguien se anima a algo de diversión?.

Postead aquí si os interesa o mandadme MP.

Algo en plan que ataque todo el rato a jugadores de menos de 50 habs :).

Saludos.

Edito: Ya inicia sesión, he creado cuenta y estoy construyendo cosas para poder crear tropas y atacar con el bot :) jajaja.
#101
Programación C/C++ / Detener thread en C++
24 Agosto 2015, 10:58 AM
Hola, antes de meterme en Mutex etc, quería saber si se puede detener de esta manera un thread en C++, o apartir de una funcion externa que busque un valor la devuelva, y apartir de ese nuevo valor, haga false la condicion de bucle del thread y salga de este.

Probé con un volatile bool y con una variable global pasandola como argumento a la funcion del thread, pero creo que una vez pasada como argumento la funcion la trata como variable estática, luego si la cambio en otra parte del código no influye en el valor de la función del thread.

Código (cpp) [Seleccionar]
bool on = true;
thread ok(trabaja, on, a);//hay que pasarle el bool a través de una funcion
system("pause");
on=false;
ok.get();
cout << "yano hay thread!!";


Código (cpp) [Seleccionar]
trabaja (bool on, string a)
{
while(on){
/...
}
}

Visto que eso no funciona, pensé en crear una función que busque el valor externo y lo devuelva, pero a primeras no se me ocurre nada, seguiré pensando en ello.

Y sino con mutex como se podría hacer?

Saludos.
#102
Hola, hace unos dias estuve buscando algo para cifrar cadenas de texto incluso un archivo completo, y encontré este encriptador de código abierto que incluí en mi proyecto.

Funciona, pero cifra bloques de 8, 16, y 24 carácteres, luego si lo que quieres cifrar no es múltiplo de eso falla.

¿que solución puedo aportar?.

Código (cpp) [Seleccionar]
string encriptar_primera(string entrada)
{
try
{
encriptador_1 oRijndael;
string retorno;
oRijndael.MakeKey(ENCLAVE_PRIMERA, encriptador_1::sm_chain0, 24, 24);
while (entrada.length() % 24 != 0)
entrada += 'Z';
for (int i = 0; i < entrada.length(); i = i + 24){
char *salida = new char[entrada.length()]();
salida = NULL;
string bloque = entrada.substr(i, 24);
oRijndael.EncryptBlock(bloque.c_str(), salida);
retorno += salida;
}
cout << ": " << retorno << endl;
return retorno;
}
catch (exception& roException)
{
return "";
}
}


Probé a añadirle 'Z' hasta que sea múltiplo pero creo que la llamada Encrypt hace Xor y por eso no funciona, ¿qué puedo hacer para trabajar con ello sin problemas si quiero cifrar cadenas no necesariamente multiplos de 24 sin perder datos.

Saludos.
#103
Programación C/C++ / Problema abrir archivo
15 Agosto 2015, 19:16 PM
Hola, no entiendo porque si abro el archivo en modo escritura y lectura a la vez, no puedo hacer ambas cosas a la vez, sino que tengo que cerrarlo y volverlo a abrir.

Código (cpp) [Seleccionar]
fstream archivo;
archivo.open(directorio, fstream::in | fstream::out);
if (!archivo)
return false;
else{
string contenido;
while (archivo.good()){
contenido += archivo.get();
}

//archivo.close();
//archivo.open(directorio, fstream::out || fstream::ate);
//contenido = contenido.insert(inicio, datos);
//archivo.write(contenido.c_str(), contenido.length());
archivo.seekp(inicio);
archivo.write(datos.c_str(), datos.length());
archivo.close();


Este code no funciona, lo que quiero hacer es leer todo el archivo e insertar datos en el archivo, pero no hay manera, parece que despues de leerlo tengo que cerrarlo y abrirlo en escritura para escribir en el, ¿esto es siempre asi? ¿o hago algo mal?

Saludos.
#104
Código (cpp) [Seleccionar]
almacen a;
a.crear_archivo();
a.insertar_campo("pruebaOEIOIEOCIo", 2);
cout << a.obtener_campo(2);


CitarError   3   error C1001: Error interno en el compilador.

Definicion de la problemática clase:

Código (cpp) [Seleccionar]
class almacen
{
private:
string directorio = string(DIRECTORIO_INSTALACION) + string(NOMBRE_ALMACEN);
string *delimitadores = new string[5]{
"Cqwerwerwerwer23t23tt",
"7348b3835grtjebr6uertt",
"nyFtCn4jPKItqWCAdJn66",
"QT36ub356iub356ub635"
"y98NYN8YA89CYA898333"};
public:
bool crear_archivo();
bool existe_archivo();
bool corrupto_archivo();
bool insertar_campo(string datos, int campo);
string obtener_campo(int campo);
bool eliminar_campo(int campo);
bool encriptar_archivo();
bool desencriptar_archivo();
};


Saludos.
#105
Pues eso, ¿se puede? Iré actualizando este hilo con más datos.

Saludos.

Edito: ¡Vaya!

https://msdn.microsoft.com/en-us/library/windows/desktop/dd318087(v=vs.85).aspx
#106
Hola, necesito trabajar con ficheros para escribir y leer datos, hacer ambas cosas a la vez en una misma función vaya.

Tenía pensado usar FILE como hacía para C, pero sería una incoherencia debido a que estoy usando C++, y estaría dejando atrás los métodos que ofrecen sus funciones.

Mi pregunta es, que debo hacer ¿crear un ifstream para leerlo, liberarlo y crear luego un ofstream para escribir en el?. No creo que sea haga así.

¿No hay una clase, que maneje archivos con métodos de lectura y escritura? Es lo que busco.

Edito: Acabo de leer acerca de fstream, y creo que es lo que busco, lo inicializaría de esta manera:

fstream fs("test.txt", fstream::in | fstream::out);

Parece tener métodos de lectura y escritura, aun no lo he probado, ¿me lo recomendáis? ¿o hay algo mejor?.

La función debe de leer todo el archivo y luego sobrescribir unas líneas.

¡Saludos!.
#107
Redes / Duda redes, subredes, y hosts
10 Agosto 2015, 10:39 AM
Hola, si tenemos estamos conectados a una red que esta subneteada, ejemplo:

Imaginemos 3 subredes dentro de la red, las subredes las obtendríamos con la ip de un host y la de la máscara de red. Corregidme si me equivoco.

Las subredes pongamos que son:

"172.26.10.1-255"
"172.26.0.1-255"
"172.26.16.1-255"

Si nuestra IP es 172.26.10.30, ¿podríamos mandar paquetes desde nuestra subred a hosts de las demás subredes?, en caso de que si, ¿siempre funcionaría o podrían ponernos restricciones un administrador para independizarlas?.

La idea parte de la implementación de un MITM, así podría obtener hosts de otras subredes, pero quiero saber si sería posible.

Y luego la implementación en C++, para obtener el rango ya la iré poniendo. Estoy usando bitset y u_char*.

Saludos.
#108
Redes / ¿IP fordwarding para MITM?
1 Agosto 2015, 02:14 AM
Hola, en todos los MITM, veo que es necesario usar el IP forwarding para decirle al router a que host mandale los datos y a que puerto, mm. (Tampoco tengo muy claro el concepto), estoy implementando un MITM, en C++ paar windows, y no sé si debería usarlo.

Lo que hago es envenenar con arp poisoning al router diciendo que soy el host y que tengo la ip del host pero con mi mac, y al host le digo que tengo la ip del router pero con mi mac, de esta manera todos los paquetes me llegan a mi. Host piensan que soy el router con la ip del router y mi mac, router piensa que todos los host tienen mi mac con distintas ips, ok.

Ahora, reenvio los paquetes de los hosts al router, pasandole mi mac al router y la IP del host, (el router me reenviara a mi su paquete ya que esa IP el la tiene asignada con mi MAC), es todo normal, solo que el router tiene a todos los hosts con mi mac, ¿ me deberían llegar así todos los paquetes correctamente? ¿o debería usar IP fordwarding? De ser así ¿a que puerto?

Saludos y gracias.
#109
Código (cpp) [Seleccionar]

u_char ip[4];
u_char mac[6];
/*for (int i = 0; i < 4; i++)
ip[i]=pkt_data[i+28];
for (int i = 0; i < 6; i++)
mac[i] = pkt_data[i + 22];*/

_mbscpy_s(ip, _TRUNCATE, pkt_data +28);
_mbscpy_s(mac, _TRUNCATE, pkt_data+22);


Salida con las apis (usando _mbscpy_s):

Citarc0a81260cccccccccc
c0a81190ef684965a6
c0a81188329b236d40
c0a81260329b236d40
c0a81190ef684965a6
c0a81188329b236d40
c0a81260329b236d40
c0a81190ef684965a6
c0a81170188bc327db

Salida usando el for:

Citarc0a812188329b236d40
c0a81260234d5f2697
c0a81c990ef684965a6
c0a81260234d5f2697
c0a812188329b236d40
c0a81c990ef684965a6
c0a812188329b236d40
c0a81260234d5f2697
c0a81c990ef684965a6

No funciona bien _mbscpy_s, ¿¿porque??

Saludos.

Edito: Creo que el fallo radica en que estoy usando UNICODE de juego de caracteres del proyecto, y la funcion como pone aqui:

https://msdn.microsoft.com/en-us/library/td1esda9.aspx

Es para multybyte, y para unicode  sería usar wcscpy_s, (pero ahi ya no sería un argumento de u_char*), ademas _mbscpy_s no da error, ¿que pasa?

Tambien añado que estoy cambiando el proyecto, pues donde antes ponia bucles sustituirlo por apis que hagan lo mismo, pero ya véis como me van de bien, lo mismo ocurre con _mbsicmp que compara u_char* con un u_char*, y dice si son iguales, tampoco me funciona, ¿porque?
#110
Código (cpp) [Seleccionar]
u_char* checksum_ip(u_char* datos, int tamaño)
{
u_char *checksum = new u_char[2]();
u_long suma = 0;
for (int i = 0; i < 24; i++)
{
suma += datos[i];
if (suma & 0xFFFF0000)
{
suma &= 0xFFFF;
suma++;
}
}
checksum = (u_char*)&suma;
cout << checksum << endl;
for (int i = 0; i < sizeof(checksum); i++)
printf("%x", checksum[i]);
system("pause");
return checksum;
}


La salida no concuerda con el checksum original del paquete, algo está fallando, quiero pensar que el paso de u_long a u_char* es correcto, iré dando más detalles.

Saludos.

Edito: http://www.arcesio.net/checksum/checksuminternet.html, aqui explica bien como funciona lo del checksum, y el de ip. Según he entendido debo de sumar, de 16 bits en 16 bits todos los campos del header hasta llegar a el del checksum, que ocupartian los bytes 24 y 25 de la cabecera, así pues hice esto, pero no me funciono, no tengo ni idea de trabajar con bits ni entiendo como lo hacen  >:( >:(

Código (cpp) [Seleccionar]
u_char* checksum_ip(u_char* datos, int tamaño)
{//24 y 25 son checksum hasta el 23 sumamos

u_char *checksum = new u_char[2]();
for (int i = 0; i < 24; i++)
checksum += datos[i];
//sumo los campos byte a byte o ¿como sino?
for (int i = 0; i < 24; i++)
{
if (checksum[i] == 1)//ya se que esta mal, pero aqui sería poner 0 en los 1 y 1 en los 0, trbajando con bits ¿como accedo a ellos? ni idea
checksum[i] = 0;
else
checksum[i] = 1;
}


Segun pone aqui: http://www.arcesio.net/checksum/checksumIP.html

Debería coger los bytes de 2 en 2, y formar con el par una ristra de bits con 16 en total. Esa ristra la sumo.

Vale vale, tenia una cosa mal, ahora comento.

Código (cpp) [Seleccionar]
//un sumando del 13 al 23 incluyendo ambos.
//otro dumando 16 bits de ceros, y 2 ristras de 16 bits con las ips
//se suman se cambian 0s por 1s y 1s por 0s, separamos la ristra de 6 en 2 bytes
//formamos un u_char[2] y ya tenemos el checksum ip


La cosa ahora es como puedo sumarlos de 16 en 16?, podría sumar byte a byte, de 8 en 8, con u_char + .., pero de 16 en 16?.

Os dejo el code:

Código (cpp) [Seleccionar]
u_char* checksum_ip(u_char* datos, int tamaño)
{//24 y 25 son checksum hasta el 23 sumamos
//un sumando del 13 al 23 incluyendo ambos.
//otro dumando 16 bits de ceros, y 2 ristras de 16 bits con las ips
//se suman se cambian 0s por 1s y 1s por 0s, separamos la ristra de 6 en 2 bytes
//formamos un u_char[2] y ya tenemos el checksum ip
/*
u_char *checksum = new u_char[2]();
for (int i = 0; i < 24; i++)
checksum += datos[i];
for (int i = 0; i < 24; i++)
{
if (checksum[i] == 1)
checksum[i] = 0;
else
checksum[i] = 1;
}*/
u_char *checksum = new u_char[2]();
u_long suma = 0;
for (int i = 13; i < 24; i++)
{
suma += datos[i];
if (suma & 0xFFFF0000)
{
suma &= 0xFFFF;
suma++;
}
}
for (int i = 26; i < 33; i++)
{
suma += datos[i];
if (suma & 0xFFFF0000)
{
suma &= 0xFFFF;
suma++;
}
}
u_short a = ~(suma & 0xFFFF);
checksum = (u_char*)&a;
cout << checksum << endl;
for (int i = 0; i < sizeof(checksum); i++)
printf("%x", checksum[i]);
system("pause");
return checksum;
}


Seguiré investigando.

Horrible, http://www.dreamincode.net/forums/topic/158278-help-with-c-ip-header-checksum/

Saludos.

Ya lo tengo orgasm http://www.badprog.com/c-type-converting-two-uint8-t-words-into-one-of-uint16-t-and-one-of-uint16-t-into-two-of-uint8-t
#111
Simplemente quería saber eso, conozco bien los litecoins que minan para CPU y GPU, pero con velocidades de minado muy lentas, y no acaban dando un buen beneficio. Para los bitcoins ocurre lo contrario, piden lo máximo del hardware y si no supera un numero aceptable de MHs generan ingreso nulo, pues estuve minando con ordenadores i3 de procesador y 1G de gráfica por días y conseguí beneficio nulo, a partir de un gran velocidad de minado es cuando realmente funcionan, sino no te llevas nada, mi pregunta es, ¿que criptomoneda es la mejor para el minado en GPUs? litecoin se queda muy corta para el potencial de un GPU, y BTC muy grande, ¿punto medio?

Saludos.

Edito: Creo que me ha quedado claro, las 2 monedas con más peso son los bitcoins y litecoins. Ambos con gran dificultad. Pero minar BTCs con una NVIDIA de 2Gbs buena, generaría 42^-8 bitcoins al día, lo que es lo mismo que una centésima de céntimo al día, luego los BTCs no se pueden minar con CPU ni GPU, de ninguna manera, nunca obtendríamos un beneficio que mereciera la pena.

Sin embargo, con los LTCs si se puede, se puede sacar algo de dinero aunque muy poca cantidad realmente.
#112
Hola a todos, miren estoy buscando la manera más eficiente de poder hacer todos estos procesos sin que el programa falle y con el mínimo consumo de CPU, puesto que un MITM, puede quemar mucho el ordenador y más si está mal estructurado.

Voy a añadir una función única hasta ahora (que yo sepa) al MITM, que es que escanee los hosts cada cierto tiempo, para actualizar la lista a la que hace spoofing, pues sino se acabará quedando vieja, spoofeará hosts que se hayan desconectado y no tendrá en cuenta los nuevos.

Luego tiene que hacer:

1. Escanear los hosts en primera ejecución y cada X tiempo. (actualizando la lista de usuarios).

2. Realizar arp spoofing a los hosts y a la gateway, pasando a los hosts la ip del gateway, y mi mac (no se si esto es lo mejor), luego a el gateway le paso la ip de los hosts y mi mac. Así pues cuando el router responda a una peticion del host la mandará a mi mac, sea cual sea la ip del host.

3. Redirigir paquetes, escuchando en la red. Los de los hosts los mando al router, los de el router les miro la ip y los mando a su correspondiente host (del cual tengo la mac en la lista, aqui tambien hay problemas porque despues de spoofearlos muestran mi mac), tendré que eliminar aquellos que tengan mi mac.

4. Analizar tráfico al redirigir paquetes, modificar paquetes, disfrutar de la red en general  :D :D

Pero claro, ¿como sincronizo todo esto? ¿Cómo lo plantearíais vosotros de la manera más inteligente y funcional?, la verdad es que son muchos procesos, estoy probando cosas, pero siempre me falla algo.

Por ejemplo he probado a hacer un proceso que haga spoofing cada 2 segundos a los hosts, y cada 60 segundos reescanea la red por ejemplo, en ese tiempo de reescaneo no spoofea, la idea sería, dividirlo en 2 uno que spoofea a los hosts, y pasado X tiempo llama al escaner, pero ahí hacer que el escaner ya esté hecho para poder recoger los hosts al momento y continuar el spoofing, pero no conozco métodos de espera en procesos me vendría bien que me dijerais alguno.

Eso nos permitiría hacer arp spoofing a los host de la red de manera dinamica, pues cada cierto tiempo habremos reescaneado la red, ya dije que en ese reescaner aparecen con mi mac, pero creo que podría solucionarlo.

Luego pasaría a redirigir el tráfico para ello necesitaría la dirección mac de los hosts y acceder a la lista de hosts que está siendo utilizada por el spoofer, ahí tendríamos el mayor problema, pues cuando el router nos envíe el paquete para la ip del ordenador B, tendremos que reenviarsela a ese ordenador a través de su MAC, y nosotros somos los unicos que la sabremos entonces. Luego necesitaremos tener la lista de hosts.

Y luego ya sería meter filtros a la hora de reenviar paquetes, que no habría ningún problema.

Saludos, a ver si me podéis iluminar un poco porque a veces también yo me hago mucho lío.








#113
Ey heavy weys, resulta que me ha venido un problemilla en el sniffer llamado "Accept-Encoding" y bueno hay 2 maneras descomprimir la cadena que nos dan, o algo que haré más adelante que será eliminarla de la respuesta del servidor una vez hecho el MITM, pero ahora quiero probar una cosa y necesito descomprimir la peticion.

Os paso un login en una web una vez ya pasado a cadena:

POST /user/login HTTP/1.1
Host: pag.com
Connection: keep-alive
Content-Length: 56
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
.8
Origin: http://pag.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/43.0.2357.132 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://pag.com/user/login
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.8
Cookie: a_c=yes; qaapo=a957d5ce95865c588f8388194b38653bd148935f%7E1; show_popi=b
f9d8e780daa75b620bfc484a5740acf03b595b0%7E1; __insp_wid=422975268; __insp_nv=tru
e;

  ▄öÑU┼V♫ n   n   ¶   dh♀\÷np↑ï├' E  `!¡@ Ç♠oÁ¼→ o^↨


La ultima linea muestra las variables del login (usuario y contraseña), comprimidas en gzip, he visto que se puede descomprimir archivos en gzip, pero la idea es descomprimir directamente la cadena para obtener otra cadena, con zlib, ¿se podrá hacer?

Saludos.
#114
Hola, tengo he probado a usar la función clock() pero claro, el valor de la misma es más grande cada vez, así pues tras pasar un segundo desde la primera llamada devolverá 1000, pues tras 48h, devolvería 48x60x60x1000=172.800.000 que no se si una variable podría almacenarlo un unsigned long, o si clock() sería capaz de devolverlo, pero la verdad es un valor muy grande. Lo que tengo es:

Código (cpp) [Seleccionar]

clock_t inicio= clock();
while(true)
{
   if(clock()-inicio>2000)
      inicio=clock();
      //ejecuto esto cada 2 segundos de bucle.
}


El problema es que clock() tomará valores muy grandes y puede ser peligroso para el programa, ¿no habrá una mejor forma de hacerlo?

Saludos.
#115
Redes / ¿como filtra paquetes wireshark?
13 Julio 2015, 13:59 PM
Hola a todos, estoy usando wireshark y me gustaría saber como filtra los paquetes.

Es decir cuando pongo por ejemplo "http" que hace exactamente ¿mostrar todos los paquetes con puerto de destino 80?, ¿o hay algo más?.

Para paquetes como ftp o https ¿el procedimiento es el mismo?, ¿simplemente haría un filtro de paquete para los paquetes de puerto de destino 21 y 443?.

Supongo también puede darse el caso de que una página web tenga esos servicios implementados en otro puerto, ¿como podríamos detectarlo entonces?

Saludos.


#116
Bueno, me resulta curiosa y cuanto menos oportuna la noticia, pues hace a penas 2 días vi un documental sobre cómo se escapaba de prisiones y como consiguió albergar tal inmensa fortuna...

Así que cuando ví que se escapaba, pensé que era una noticia vieja de cuando le capturaron por primera vez, pero no es que el tipo se acababa de escapar de la prisión por un tunel que habían cavado desde una casa a 1,5km de distancia.

Ese tipo asesinó a miles de personas y su cartel no para de corromper a las fuerzas del poder, amenazándolas de muerte.

Lo que realmente me preocupa es hay gente que lo apoya, y lo tiene como un héroe o un ídolo, la verdad les faltan varias reflexiones a esas personas. O quizás probar la propia medicina que están promoviendo.

Hoy ha salido el mayor delincuente del mundo de la cárcel, por segunda vez, creo que para una persona que ha cometido tales atrocidades y ha creado un ejército de asesinos  sin piedad dedicado a la extorsión, la droga y la corrupción, ojalá acabe en Guantánamo pronto y sus hijos que quieren seguir sus pasos también.

Recordad: "Lo único necesario para que el mal triunfe es que los hombre buenos no hagan nada". Edmund Burke.  ;)

http://www.elmundo.es/america/2015/07/12/55a20bf0ca474100478b456c.html

Saludos.
#117
Programación C/C++ / Algo heavy en C++
12 Julio 2015, 20:58 PM
Hola miren, quiero realizar un MITM a la red, para ello me estoy sirviendo de wpcap.

Tengo la lista de usuarios en la red con su ip y mac asociada.

Ahora bien ya se como mandar mensajes ARP response para engañarlos y que me manden los datos a mí, el problema viene ahora.

Los mensajes ARP respose se los mando a los usuarios de una lista donde tengo las ips y sus macs de los usuarios de la red.

Lo que quiero es pasar el vector donde tengo las ips y macs a una funcion para que mande ARP responses a los hosts, pero a la vez quiero estar monitoreando el tráfico y añadiendo nuevos miembros a esa lista, y en caso de que uno falle o no responda ni un paquete en X tiempo quitarlo, si el numero de hosts es menor a X también se detendría, no sé si sería buena idea hacer 2 asyncs o threads.

Uno para mandar ARP responses y envenenar la red y otro que mientras me actualice la lista de hosts con sus ip y mac, la duda es:

¿Si tengo 2 asyncs que comparten una variable en este caso una clase que contiene un vector con la lista de usuarios, y una me está añadiendo y eliminando elementos mientras otra está trabajando con ellos, ¿fallaría el programa o no?

Ya os digo usar 2 asyncs o threads, uno escanea y actualiza la red y otro hace el spoofing.

Nada más, sino también se me ocurre meterlo todo en una función pero no sería igual de elegante y quedaría un poco gorda.

Saludos.
#118
Hola de nuevo  :xD :xD, tengo una clase definida en la cabecera, pero al poner sus métodos dentro de la cabecera (archivo ".h") me da error sin embargo al poner sus métodos en el ".cpp" no da error, ¿que solución puedo tomar?.

Código (cpp) [Seleccionar]
struct host
{
public:
u_char ip[4];
u_char mac[6];
};

class lista_usuarios
{
public:
vector<host> usuarios;
bool contiene_host(u_char* ip, u_char* mac);
void insertar_host(u_char* ip, u_char* mac);
};

void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int cont = 0, cant = 0;

for (int i = 0; i < usuarios.size(); i++)
{
cont = 0;
for (int j = 0; j < 4; j++)
if (ip[j] != usuarios[i].ip[j])
{
cont++;
break;
}

for (int j = 0; j < 6; j++)
if (mac[j] != usuarios[i].mac[j])
{
cont++;
break;
}
if (cont == 2)
cant++;
}

if (cant == usuarios.size())
{
host usuario;
for (int j = 0; j < 4; j++)
usuario.ip[j] = ip[j];
for (int j = 0; j < 6; j++)
usuario.mac[j] = mac[j];
usuarios.push_back(usuario);
}
}


Cuando pongo esto en "capturador.h" me sale el siguiente error:

CitarError   8   error LNK2005: ya se definió "public: void __thiscall lista_usuarios::insertar_host(unsigned char *,unsigned char *)" (?insertar_host@lista_usuarios@@QAEXPAE0@Z) en main.obj

Ya os digo que simplemente al mover el método a el ".cpp" se corrige el error, pero ¿porque no me deja meterlo en la cabecera? No hay más definiciones que yo sepa XD

Saludos y gracias como siempre.

Edito_ Estoy en ello:

https://support.microsoft.com/en-us/kb/148652/es

Edito: Solucionado de rara manera ahora entiendo el error:

http://www.cplusplus.com/forum/beginner/30800/

El último comentario lo explica, lo que hice fue meter el metodo en el cuerpo de la funcion y quitar su declaracion cambiandola por la del cuerpo del método:

Código (cpp) [Seleccionar]
class lista_usuarios
{
private:
vector<host> usuarios;
public:
//bool contiene_host(u_char* ip, u_char* mac);
//void añadir_host(u_char* ip, u_char* mac);
//void eliminar_host(u_char* ip, u_char* mac);

void lista_usuarios::añadir_host(u_char* ip, u_char* mac)
{
int cont = 0, cant = 0;

for (int i = 0; i < usuarios.size(); i++)
{
cont = 0;
for (int j = 0; j < 4; j++)
if (ip[j] != usuarios[i].ip[j])
{
cont++;
break;
}

for (int j = 0; j < 6; j++)
if (mac[j] != usuarios[i].mac[j])
{
cont++;
break;
}
if (cont == 2)
cant++;
}

if (cant == usuarios.size())
{
host usuario;
for (int j = 0; j < 4; j++)
usuario.ip[j] = ip[j];
for (int j = 0; j < 6; j++)
usuario.mac[j] = mac[j];
usuarios.push_back(usuario);
}
};

};


Funciona, aunque no creo que sea el mejor método (pero al menos ya lo tengo en el ".h").

Saludos.
#119
Lo de siempre diría, llamo a una función a la que le paso un PIP_ADAPTER_INFO por referencia, y me la rellenará:

Código (cpp) [Seleccionar]
bool seleccionar_interfaz(PIP_ADAPTER_INFO* adaptador)
{
bool seleccion = false;
PIP_ADAPTER_INFO pAdapterInfo;
static PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;

ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));

if (pAdapterInfo == NULL)
return false;

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
if (pAdapterInfo == NULL)
return false;
}

if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
//Si tiene gateway y dirección IPv4 en la interfaz nos vale.
if (pAdapter->DhcpEnabled == true &&
pAdapter->GatewayList.IpAddress.String &&
pAdapter->IpAddressList.IpAddress.String &&
strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0 &&
strcmp(pAdapter->GatewayList.IpAddress.String, "0.0.0.0") != 0 )
{
//printf("%s", pAdapter->GatewayList.IpAddress.String); Esta linea lo cambia todo, hace que funcione y no haya problema pero no quiero poner printf..
*adaptador = pAdapter;
seleccion = true;
break;
}
pAdapter = pAdapter->Next;
}
}
else
seleccion = false;
if (pAdapterInfo)
FREE(pAdapterInfo);
return seleccion;
}


La llamada y declaración de la función está aquí:

Código (cpp) [Seleccionar]
lista_usuarios* buscar_usuarios()
{
PIP_ADAPTER_INFO* adaptador = nullptr;

adaptador = (PIP_ADAPTER_INFO*)malloc(sizeof(PIP_ADAPTER_INFO));

if (seleccionar_interfaz(adaptador))
       {

       printf("%s", (*adaptador)->GatewayList.IpAddress.String);
}
{


Este printf muestra basura, ¿porqué?. Cuando pongo el printf que muestro de comentario en seleccionar_inferfaz() no muestra basura, funciona.

Lo paso como referencia esta vez, y he reservado memoria previamente. No se que puede ser XD.

Siento que abuso del foro  :rolleyes: :rolleyes: :rolleyes:

Saludos.
#120
Programación C/C++ / Variable pierde valor
8 Julio 2015, 15:35 PM
Hola a todos, miren tengo la siguiente clase:

Código (cpp) [Seleccionar]
struct host
{
u_char ip[4];
u_char mac[6];
};

class lista_usuarios
{
public:
vector<host> usuarios;
void insertar_host(u_char* ip, u_char* mac);
};


Tiene un vector de estructuras como se puede observar. Claro, ¿cómo hago para reservar memoria dinamica si tiene un vector que desconozco cuanto puede llegar a valer?

Declaración de un puntero de tipo clase lista_usuarios:

Código (cpp) [Seleccionar]

lista_usuarios* buscar_usuarios()
{
lista_usuarios *lista_host = nullptr;
printf("ANTES: %d\n", lista_host->usuarios.size());
auto envio_arp = async(enviando_arp, capturador, ip_cliente, mac_adaptador, ip_gateway);
auto recojo_arp = async(recogiendo_arp, capturador, *lista_host);

envio_arp.get();
recojo_arp.get();

printf("\nDESPUES: %d\n", lista_host->usuarios.size());
return lista_host;


Como se puede observar la paso como parámetro a la función recogiendo_arp.
En esa clase se añadirán estructuras de tipo host a la lista de hosts de lista_usuarios, con su mac e ip, se incrustarán.

El problema es que la lista me debería de salir que tiene 6 hosts y me dice que tiene 0, los valores se pierden.

Código (cpp) [Seleccionar]
void recogiendo_arp(pcap_t *capturador, lista_usuarios lista)
{lista.insertar_host(ip, mac);}


El problema es que tras llamar a la funcion y añadir host a el vector de lista_host de lista_usuarios, me dice que el vector lista_host tiene 0 elementos, cuando he podido comprobar que se añaden hasta 6.

Saludos.
#121
Digamos que tengo un correo que no es hotmail, ni gmail, ni yahoo ni niguno conocido.

Como los de @elhacker.net pero menos conocido, ¿como puedo entrar en el?

Saludos.

Edito: Necesitaría el servidor de email, su dominio y su puerto de conexión, algo que desconozco ahora mismo, luego estaría jodido XD.

http://www.howtogeek.com/130516/how-to-access-pop3-email-accounts-in-windows-8/

Creo que la solución pasará por usar wireshark e intentar recapturarlo y mirar el contenido de paquete con su servidor y puerto al que va dirigido, de todas formas lo tendré en cuenta para mi proyecto, que a la hora de capturar un email POP3, que no se conforme con el usuario y contraseña, y que saque tambien el servidor y el puerto.



Saludos.
#122
Hola tengo una función que añade a un vector de estructuras, una estructura con una ip y una mac asociada, siempre y cuando no esté añadida ya en el vector, pero al ejecutarlo me aparecen repetidas las ips con sus correspondientes macs, es frustrante. ¿donde puede estar el error?

Código (cpp) [Seleccionar]
void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int salida;
printf("CONTENIDO LISTA************\n");
for (int i = 0; i < usuarios.size(); i++)
{
for (int j = 0; j < 4; j++)
{
printf("%x", usuarios[i].ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", usuarios[i].mac[j]);
}
printf("\n");
}
printf("CONTENIDO IPS Y MAC***********\n");
for (int j = 0; j < 4; j++)
{
printf("%x", ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", mac[j]);
}
printf("\n");
for (int i = 0; i < usuarios.size(); i++)
{
salida = 0;
for (int j = 0; j < 4; j++)
{
if (ip[j] != usuarios[i].ip[j])
{
salida++;
break;
}
}

for (int j = 0; j < 6; j++)
{
if (mac[j] != usuarios[i].mac[j])
{
salida++;
break;
}
}
printf("salida %d\n", salida);

if (salida == 2)
{
printf(" ENTRA \n");
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
break;
}
}

if (usuarios.size() == 0)
{
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
}
#123
Bueno tras perder todo lo que acabo de escribir iré al grano.

Tengo una clase que contiene 2 vectores, uno contiene la lista de ips y otro la lista de macs de la red, a ips[2] le correspondería la mac macs[2]. Fácil.

Ambos vectores son de tipo u_char*. Antes que nada os dejo el codigo:

La clase es lista_usuarios:

Código (cpp) [Seleccionar]
class lista_usuarios
{
public:
vector<u_char*> ips;//LA p**a *****.
vector<u_char*> macs;
void almacena_usuario(u_char* ip, u_char* mac);
};

void lista_usuarios::almacena_usuario(u_char* ip, u_char* mac)
{
int cont = 0, cant = 0;//diferenciar win32 win64 if def ifndef

if (sizeof(ip) == 4 && sizeof(mac) == 4)
{
if (ips.size() == 1)
{
printf("\n");
for (int k = 0; k < 4; k++)
{
printf("%x", ips[0][k]);
}
}
//CLARO MISTERIOSAMENTE EL VECTOR VALE LO MISMO QUE IP NO ALMACENA UNA p**a *****
for (int i = 0; i < ips.size(); i++)
{
for (int k = 0; k < 4; k++)
{
//printf("%x", ip[k]);
}
printf("-");
for (int k = 0; k < 4; k++)
{
//printf("%x", ips[i][k]);
}
printf("\n");


for (int j = 0; j < 4; j++)
if (ip[j] == ips[i][j])
cont++;


for (int j = 0; j < 6; j++)
if (mac[j] == macs[i][j])
cant++;
}
//printf("\nCont: %d, Cant: %d\n", cont, cant);
if (cont != 4 && cant != 6)
{
printf("entra\n\n", cont);
/*for (int k = 0; k < 4; k++)
{
printf("%x", ip[k]);
}
printf(" - ");
for (int k = 0; k < 6; k++)
{
printf("%x", mac[k]);
}
system("pause");*/
ips.insert(ips.begin(), ip);
macs.insert(macs.begin(), mac);
}
}
}


La llamada a la función es así:

lista.almacena_usuario(ip,mac);

Yo le paso la ip y la mac del host, ambas son u_char*.

Ahora comienza la MAGIA del programa, cuando esto:

printf("%x", ips[0][k]);

Muestra cada vez una cosa distina, es decir el vector de las ips su primer elemento (ips[0]) que contiene 4 valores u_char que corresponden a la IP, VEMOS que en cada llamada toma una IP distinta que casualmente es justo la que ha recibido, luego el vector siempre tiene 1 elemento, que es cuando cont=0 la primera vez (al no haber ips/mac entra porque no hay otra igual a la suya), si hay igual no se añade y saldría.

Salida: (muestra el contenido del primer elemento del vector de ips como vemos su valor se sobreescribe ¿porque? no lo sé)

ac1aab0-

ac1aa42-

ac1aa44-

ac1aab0-

ac1aa42-

ac1aa44-

ac1aa44-

ac1aa42-

ac1aa44-

ac1aab0-

ac1aa42-

ac1aa44-

ac1aa44-

ac1aa42-

ac1aab0-

ac1aab0-

ac1aa44-

ac1aab0-

ac1aa42-
tam: 1
ac1aa42::5c2e59caddeb


Al final muestra las IPs de la lista y su MAC asociada, en este caso 1 solo, ¿porque? porque la lista solo tiene un elemento, ¿porque? porque se sobreesribe...

DesesperanT.

OJO que si pruebo a hacer simplemente esto:

lista.ips.insert(lista.ips.end(), ip);
lista.macs.insert(lista.macs.end(), mac);


La lista me sale con 40 elementos todos iguales, a pesar de que al insertar inserto distintos elementos, ¿esto que broma es?
#124
Modifico el post, la anterior duda fue solucionada. La nueva duda esta en mi siguiente post.

Saludos.
#125
Hola a todos, miren estoy buscando escanear los host de la red pero no sé si el sistema trabajará como yo creo, es por eso por lo que creo el hilo.

Se supone que haciendo un ping a la broadcast obtendré la respuesta de todos los hosts de la red conectados al router.

Entonces tendré que mandar un ICMP a la dirección de broadcast ¿pasando mi IP?, y luego el router mandará una peticion a todos los host, pasandole un ICMP con mi dirección IP sino me equivoco un PING vamos, y responderán con su dirección IP a la mi IP que fue la que lanzó la broadcast. ¿funciona así no?

La idea es implementarlo, mandaría un ICMP a la broadcast, y escucharía los paquetes tipo ICMP response entrantes almacenando las ips conectadas a la red, ¿podéis confirmarme que esto funcionara?.

Antes tomé un camino fácil, hacer ping a todo el rango de IPs y la propia funcion me decía si había respondido sin necesidad de escuchar el tráfico, iba de una en una. Mal método escanear host haciendo ping uno a uno para todo el rango de ips.

Si conocéis algún método mejor para hacerlo decidme, luego ya lo implementaría en C++, nada más solo eso.

Saludos.

Edito: He estado informandome y no es buena idea escanear la red usando un ping a la broadcast, pues muchos equipos cancelan los paquetes ICMP, y no responden, usando wireshark, he visto que solo me ha respondido un equipo al ping de broadcast, mientras que 3 lo han ignorado, es por ello que buscaré otros métodos, saludos.

Edito 2: He estado probando como funciona Fing de mi móvil, ya que obtiene los host de la red con su MAC muy rápidamente, y aquí os lo cuento.

Simplemente manda paquetes ARP a todo el rango de hosts y usa threads para mandarlos. Luego la solución más efectiva pasa por mandar mensajes ARP, además de esta manera cuando respondan ya tendré su MAC, y no tendré que hacer 2 llamadas, saludos.
#126
Código (cpp) [Seleccionar]
if (SendARP(destino, origen, MacAddr, &PhyAddrLen) == NO_ERROR)
{
if (PhyAddrLen)
{
*mac = (char*)&MacAddr;
/*BYTE *bMacAddr = (BYTE*)&MacAddr;
*(mac) = (char*)bMacAddr;
for (int i = 0; i < (int)PhyAddrLen; i++)
{
//printf("%x", bMacAddr[i]);
//*(mac[i]) = (char)bMacAddr[i];
}*/
return true;
}
}


MacAddr es un long que contiene la direccion mac, y necesito esa direccion mac en char*, mac es un char** que recibe de argumento.

*mac = (char*)&MacAddr;

No funciona, ¿que puedo hacer para el cambio?.

Saludos.
#127
Desarrollo Web / ¿Como alquilar servidor?
25 Junio 2015, 16:44 PM
Hola a todos, nunca he comprado ni alquilado un servidor, todos los que he probado han sido gratuitos.

Me gustaría saber como alquilar un servidor en un país, preferiblemente sin leyes de protección de datos (Irán, Afganistán... no conozco tampoco muchos), tampoco es imprescindible, simplemente pues tengo más protección legal, al no haber leyes que puedan ser usadas contra mí, pues si quieren joderte siempre pueden hacerlo, pero si no hay leyes con las que te puedan atacar, lo tienen más jodido.

Quiero utilizarlo de proxy y colgarlo en internet. para ver hasta dónde puede llegar usando javascript.

Pero eso ya es aparte, simplemente quiero acceder a el, poder poner mis scripts y poco más, ¿alguna página de confianza o consejo?

Saludos.
#128
Programación C/C++ / Ayuda con conversión
22 Junio 2015, 15:47 PM
Desesperado.

Código (cpp) [Seleccionar]
u_char *mac_adaptador = (u_char *)pAdapter->Address;
Funciona, pasa de binario a hexadeciaml, de byte a u_char (cont char) perfecto.

¿Pero ahora como hago para pasar una string que contiene la ip de la gateway "192.168.1.1" a hexadecimal que sería: "c0 a8 01 01" y meterlo en un u_char?

Código (cpp) [Seleccionar]
u_char *ip_gateway = (u_char *)(byte *)pAdapter->GatewayList.IpAddress.String

Desesperante 50 pestañas y nada.  :o :o :o :o :o

Por no hablar de como obtener el tamaño de los u_char, la verdad nunca los he estudiado y estoy bastante liado.

Edito: Os paso el código con todo lo que tengo:

Código (cpp) [Seleccionar]
u_char *mac_adaptador = (u_char *)pAdapter->Address;//reinterpret_cast<u_char*>(pAdapter->Address);
u_char *ip_gateway = (u_char *)(byte *)pAdapter->GatewayList.IpAddress.String;
u_char *ip_cliente = (u_char *)pAdapter->IpAddressList.IpAddress.String;
u_char ****** = (u_char *)"192";
printf("***** %x\n", *****[0]);
//c0 a8 01 05 -> 192.168.1.5
for (int i = 0; i < strlen((char *)ip_cliente); i++)
printf("%c", ip_cliente[i]);
printf("\n");

for (int i = 0; i < sizeof(ip_cliente); i++)
printf("%x", ip_cliente[i]);
printf("\n");

//c0 a8 01 01 -> 192.168.1.1
for (int i = 0; i < strlen((char *)ip_gateway); i++)
printf("%c", ip_gateway[i]);
printf("\n");

for (int i = 0; i < strlen((char *)ip_gateway); i++)
printf("%x", ip_gateway[i]);
printf("\n");


for (int i = 0; i < pAdapter->AddressLength; i++)
printf("%x", mac_adaptador[i]);
printf("\n");


***** 31
192.168.1.5
3139322e
192.168.1.1
3139322e3136382e312e31
7218dbc397da


Salida, compilación sin errores.

Como se puede observar la MAC es correcta, las IPv4 las muestra bien en decimal, pero en hexadecimal la salida no es correcta.

Perdonad, la variable mi.erda sale como **** ;)

Curioso esto funciona:

Código (cpp) [Seleccionar]
int primertermino = atoi("192");
stringstream stream;
stream << hex << primertermino;
string result(stream.str());

for (int i = 0; i < 3; i++)
printf("%c", result[i]);
printf("\n");


Pero lo tengo en char* no en u_char, y tendría que hacerlo para cada numero separado por punto de la ip.

Código (cpp) [Seleccionar]
u_char* ipv4_to_hex(char *ip)
{
u_char ip_hex[4];
in_addr addr;
addr.S_un.S_addr = inet_addr(ip);
ip_hex[0] = addr.S_un.S_un_b.s_b1;
ip_hex[1] = addr.S_un.S_un_b.s_b2;
ip_hex[2] = addr.S_un.S_un_b.s_b3;
ip_hex[3] = addr.S_un.S_un_b.s_b4;
return ip_hex;
}
#129
Programación C/C++ / Compilar tor.exe en C++
22 Junio 2015, 13:55 PM
Hola a todos, me vendría bien que me ayudarais a compilar TOR en visual studio. Este es el código fuente del programa, y viene con numerosos makefiles. La pregunta es:

1. ¿que debo compilar el "branch" o el "tag", y qué diferencias hay entre ellos?.
2. ¿que archivos debería de incluir (los de que directorios) para que compile el programa y que necesito?.

Solo quiero compilar el cliente. Me he estado mirado directorios e incluyendo programas y eso no bajaba de 155 fallos, añadía librerías que faltaban compilaba y otros 155 fallos.

Quizás alguien que lo haya compilado en windows, me pueda ayudar, y decir que requisitos necesito, porque la verdad estoy algo liado.

También otra manera es usando Socks5 y connectando la aplicación a tor.exe 127.0.0.1 y puerto 9051 creo que era, pero si tuviera la opción de compilar tor en mi programa sería mucho mejor que trabajando con 2 programas a la vez (aplicación+tor).

Saludos y gracias, sois bienvenidos.

Edito: Ya iré subiendo código sobre esto conforme me ponga a ello, pero preferiría ser capaz de compilar tor desde el programa, el código que subiría sería de conectar a tor desde la aplicación con socks5 para mandar peticiones desde ella a través de tor.

Saludos y gracias.
#130
Redes / ¿IP del router termina siempre en .1?
20 Junio 2015, 03:14 AM
Estoy haciendo un programa y obtengo la IP de mi ordenador en la red, la idea es cortar el .x por .1 para obtener la IP del router. Ejemplo: mi IP es 192.168.1.5 la del router será 192.168.1.1, ¿pero eso es siempre así? Sino alguien conoce un método para obtener la IP del router en cpp, sino ya me las apañaré, perdonaz la duda tonta.

Saludos.
#131
Hola foreros, estoy intentando obtener la gateway que me ofrece servicio a internet con la winapi, el problema es que tras discriminar todas las interfaces de red, me quedan 2 que son la de el wifi y la de ethernet, pero la de ethernet no tiene conexión, ¿qué hacer entonces para coger la correcta?, también puede darse el caso de que tenga ethernet y no wifi.

Código (cpp) [Seleccionar]

#include <pcap.h>
#include <winsock.h>
#define IPTOSBUFFERS 12
bool escaner();
bool seleccionar_interfaz(pcap_if_t *interfaz);
char* ip_string(u_long in);
bool escaner()
{
pcap_if_t * adaptadores_lista;
pcap_if_t * adaptador;
pcap_t * capturador = nullptr;

if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &adaptadores_lista, NULL) == -1)
return NULL;

if (adaptadores_lista == NULL)
return NULL;

for (adaptador = adaptadores_lista; adaptador != NULL; adaptador = adaptador->next)
{
if (seleccionar_interfaz(adaptador) == true)
break;
}

sniffer(adaptador->name,capturador);
pcap_freealldevs(adaptadores_lista);
}

bool seleccionar_interfaz(pcap_if_t *interfaz)
{
pcap_addr_t *a;

for (a = interfaz->addresses; a; a = a->next)
{//Está la wifi y ethernet. Coje la primera por defecto; Wi-Fi
if (a->addr->sa_family == AF_INET)
if (strcmp(ip_string(((struct sockaddr_in *)a->addr)->sin_addr.s_addr), "0.0.0.0") != 0)
return true;
}
return false;
}

char* ip_string(u_long in)
{
static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
static short which;
u_char *p;

p = (u_char *)&in;
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
_snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return output[which];
}


Una solución sería abrirlas en orden y comprobar que existe tráfico en ellas y coger la que tenga tráfico. Pero tampoco me convence, ¿tenéis algo seguro para obtener la ip de la gateway en funcionamiento?

Saludos.
#132
Bueno pues estoy en ello, seguramente se pueda hacer con una buena lista de servidores proxy, que el programa podría actualizar directamente con webscraping de páginas como esta.

Y luego lanzar peticiones http a las direcciones de adfly a traves de los servidores proxy:

190.37.199.133:8080 (direccion ip y puerto de servidor proxy de venezuela)

Que trataríamos de conectar con esto:

Código (csharp) [Seleccionar]

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();


Ahora el truco sería simplemente, visitar los links al azar. Y usar cada vez un servidor proxy distinto, no hay problema pues actualizan cada minuto según dice la página XP, pero también podemos usar cualquier otra.

Aqui podéis descargar lo que acabo de hacer, básicamente hice la interfaz gráfica, e implemente el botón de actualizar y su función correspondiente que debería obtener la respuesta del servidor, un html.

Toda ayuda es bienvenida, si queréis colaborar podéis hacerlo por aquí o mandarme un privado, esto no es nada comparado con lo que se puede hacer.

Edito: El codigo tiene un error en req.host, es igualado a esto "proxy-list.org".
Ya lo he subido modificado XD.

Saludos.
#133
Hola no se si me podrán decir algun programa que decompile un ejecutable en cpp. Como por ejemplo hace el .NET reflector para C#. Es decir obtener del ejecutable el código directamente a ser posible. Saludos
#134
Hola he visto que hay troyanos que al cerrarlos se vuelven a ejecutar pasado un tiempo, ¿como es eso posible?, ¿cómo puedo implementarlo?

¿Será otra aplicación que lo ejecuta no? ¿2 programas en uno entonces?

Saludos.
#135
Hola, estoy pensando en como hacer un programa que corra en windows y sea capaz de conectarse a los servidores .onion, quizás alguna librería o algo para hacerlo de TOR vendría bien, programo en C#.

Toda ayuda es bien recibida, leí que era necesario intalar TOR y ejecutar tor.exe y luego capturarlo de alguna manera pero preferiría no intalar TOR, y encontrar alguna manera de ejecutar sus proxies con la app, o crear una DLL compilando TOR y luego llevarla a C#, ¿alguna idea?

Saludos.