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ú

Mensajes - Kaxperday

#341
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.
#342
Buenas socio, por lo visto te has centrado en la frase que soy un poco crítico conmigo mismo para crear tu respuesta, dejando desapercibidas las demás y las preguntas. Pero debes de saber, que mientras escribía esa frase ya busqué y estaba buscando info del tema, por lo que doy por hecho a lo que te refieres.

Bueno, he estado trabajando con el code y las funciones. Y conseguí establecer el IP_fordwarding de la siguiente manera:

Código (cpp) [Seleccionar]
bool establece_forwarding(DWORD valor)
{
HKEY key;
if (valor != 0 && valor != 1)
return false;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &key) == ERROR_SUCCESS){
if (RegSetValueEx(key, L"IPEnableRouter", 0, REG_DWORD,
(const BYTE*)&valor, sizeof(valor)) != ERROR_SUCCESS){
RegCloseKey(key);
return false;
}
else{
RegCloseKey(key);
return true;
}
}
return false;
}


Funciona correctamente, ahora bien para el anclado al registro es un problemilla, ya que como argumentos recibo 2 strings nombre de ejecutable y directorio de instalacion, pero como ya sabrás necesito trabajar con LPCTSTR, y no he conseguido hallar manera de pasar de char* a LPCTSTR, o lo que es lo mismo pasar de char* a wchar*, seguiré buscando haber si consigo solucionarlo, saludos.

Edito: Unos pocos minutos de responder, ya he encontrado la solución porque como ya digo mientras digo que no lo sé hacer, ya estoy buscando la respuesta, la solución pasaba por pasar de string a wstring:

Funcion para anclar al registro un programa:

Código (cpp) [Seleccionar]
bool anclar_registro(string nombre, string direccion)//incluye exe
{
HKEY hkey;
string total = direccion + nombre;
nombre = nombre.substr(0, nombre.find(".exe"));
wstring wtotal(total.begin(), total.end());
wstring wnombre(nombre.begin(), nombre.end());

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey) == ERROR_SUCCESS){
if (RegSetValueEx(hkey, (LPCTSTR)wnombre.c_str(), 0, REG_SZ, (LPBYTE)wtotal.c_str(),
total.length()) == ERROR_SUCCESS){
RegCloseKey(hkey);
return true;
}
else{
RegCloseKey(hkey);
return false;
}
}
else
return false;
}


Saludos y que aproveche!!

Kaxperday.
#343
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;
}
#344
Cita de: ccrunch en  7 Septiembre 2015, 10:57 AM
con esa cara de zorra no me extraña.

Ya ¿eh? Como delata la cara, lo dice casi todo de una persona y de su carácter.

:o :o
#345
Programación C/C++ / Re: Detener thread en C++
6 Septiembre 2015, 16:47 PM
Buenas gracias por las respuestas,

Básicamente usaba el mutex para coordinar varios async que ejecuta un solo thread, que es ejecutado de entre otros thread en el main.

Este thread se encarga de realizar un MITM sobre la red local, mediante ARP Spoofing, lo primero que hace es un escaneo y si hay hosts comienza un async() que los envenena, otro async que cada X tiempo reescanea la red en busca de nuevos hosts y que elimina los que se desconectaron. Tambien otro async se encarga de redirigir los paquetes y filtrarlos para poder obtener los datos de la red, en total son 3. ¿Qué tienen en común?, el adaptador de la interfaz de red, usé mutex para que si hay uno usando ese adaptador no lo usen los otros por se acaso inducía a error pero no sé si llegaría a ocurrir este error.

Estoy hablando de un pcap_t* a través de esa variable envío y recojo paquetes de la red, si la estoy usando en varios procesos, ¿sería necesario un mutex?

Edito: Vaya no sabía eso ivancea, pero creo que lo cambié porque al haber 3 subprocesos usando el mutex, al hacer lock() en 2 a la vez cascaba pues no sabía a cual de los 2 dárselo, pero si lo que dices funciona me ahorraría bastante code.

Saludos.
#346
Programación C/C++ / Re: Detener thread en C++
6 Septiembre 2015, 13:49 PM
A todo esto, e pregunto ahora, ¿porque usar mutex si con esto podríamos hacer lo mismo y de manera más sencilla sin producir tantos errores?

Ya que para controlar la entrada a la ejecucion de un code con mutex lo que hacia era esperar a que se desbloquee haciendo un Sleep(10) en un bucle y cuando este accesible entre al codigo pero aun asi no me funcionaba a veces, empiezo a pensar que es mejor hacerlo con variables como bool como exponemos en este tema:

Código (cpp) [Seleccionar]
while (*on_mitm)
{
if (control.try_lock())
{
//haz cosas
control.unlock();
//duerme Sleep(TIEMPO);
}
Sleep(10);
}
#347
Ahh vale, ahora entiendo bien. Podría hacer algo "persistente" creando varios servidores web HTTP y poniendo su IP en el cliente, de esta manera si falla uno saltarían al siguiente, y desde el siguiente que pueda mandar una orden o que lo haga desde un cliente (con una firma) diciendo que añadan un nuevo dominio de web que he creado y que eliminen el anterior.

Pero ayer estuve leyendo acerca del troyano más sofisticado actualmente el "Gameover Zeus" o "zbot", y si no puede conectarse a la red por medio del tracker creaba un dominio en función del día y la hora, para que se conectaran a él me pareció entender.

También, para no perder conexión con el tracker en caso de que el tracker principal cayera, el programa hacía peticiones HTTP a dominios random con terminaciones .com, .biz, .net ... con una palabra clave como "gameover-zeus-dga.com" etc.

CitarP2P layer peer communication entries – tagged "gameover-zeus-peer"
HTTP proxy layer connections – tagged "gameover-zeus-proxy"
Fallback DGA requests (to 1000 random domains per week in the .biz, .com, .info, .net, .org and .ru TLDs) – tagged "gameover-zeus-dga"

De esta manera si cae todos los trackers el cliente mandará peticiones a dominios aleatorios y cuando el controlador de la red cree ese dominio, habrá podido reconectar toda la botnet y controlar los bots. Es bastante fino.

LEEAN: http://blog.shadowserver.org/2014/06/08/gameover-zeus-cryptolocker/

Muy interesante, así se comunica el troyano más potente del mundo.
Y con esto ya creo que puedo partir a hacer pequeños programillas.

Saludos y gracias.

Edito: Aunque si pongamos que "la policia" tomará el control del primer tracker, y se apoderara de ese dominio, ¿como reconectaríamos?, yo creo que aunque haya conexión con el tracker principal, habría que mandar peticiones a los demás servidores frecuentemente, o mejor aún a servidores que se generen aleatoriamente, y que solo el autor sepa cuales son.

Así pues podríamos tener un programa que genere en orden 1000 dominios distintos, solo el creador sabría que dominios generaría y cuando cree uno reconectaría la botnet, a pesar de tener conexión con el tracker principal, debería de hacerlo por si nos quieren robar la botnet que no puedan, ya que cada cierto tiempo se conectaría a uno de estos 1000 dominios. Bastante fino la verdad.

Edito:
Citarque sea descentralizada significa que no hay servidores de datos que sirvan como nodos mayores

Okey se me debió de pasar engelx, gracias por la respuesta. Ya no tengo dudas.

Muuucho tiempo, laaargo proyecto.

Edito: Podria generar 1000 cadenas usando una semilla única en todos los clientes obtendría los mismos dominios, ya solo sería que lanzaran peticiones a ellos y si alguno responde con la adecuada respuesta, se reconectaría la red. Muchas cosas.
#348
Hola compañeros, muchas gracias por las respuestas.

Entonces lo que buscaba era un "tracker", entiendo. Pero eso ¿no sería una red P2P centralizada? Mmmm nos estamos conectando a un servidor para obtener información de los hosts. Si cae el servidor adiós red.

Mi idea de implementación en base a mis conocimientos, sería crear un servidor, o usar un servidor web gratuito, donde los clientes hagan HTTP request  al servidor y el servidor los vaya metiendo en una tabla, con su IP, y si pasado X tiempo no llegan datos de uno se eliminaría de la tabla. Allí mostraría los usuarios de la red en una tabla con IP y puerto. Al hacer HTTP request a la página obtendrían el listado de hosts online, con los que poder compartir información.

Incluso podría dar órdenes desde el servidor web a un cliente, y hacer que este envíe un comando a los demás, ese comando quedaría intraceable ya que pasaría de nodo a nodo.

El problema es que la página web que haría de "tracker" podría fallar, o desaparecer al ser de dominio gratuito, y si es atacada caería la red, ¿cómo podría comunicar entonces a los usuarios? ¿qué más maneras se os ocurren?.

Claro que el server solo recojería las IPs que hacen HTTP request y las mostraría, y pasaría de response las que tiene en la tabla, luego los clientes harían la red.

Me gustaría tener una mejor solución que esa XD.

Saludos.

Edito: El problema es que sería muy fácil tumbarla pues el cliente se estaría conectando todo el rato al servidor web para ver quienes están conectados, alguien que tiene el cliente abre wireshark ve el server de donde extrae la info de la red y se puede cargar fácilmente el server así como la red.

OOoo mejor, se me acaba de ocurrir que cuando entre un nuevo cliente haga post al tracker, y luego mande a los hosts un "hola estoy aqui" y estos lo añadan en la tabla sin necesidad de que tengan que estar todo el tiempo comunicandose con el server, bien.
De esta manera se comunicarían solo una vez, pero si un cliente se apaga seguiría figurando en la tabla del servidor..(pero luego al bajarse la tabla y que saltase el timeout lo descartaría), pero abría que eliminarlos del server (para eso hacer un ping cada hora aunque sea podría funcionar) a ver a ver...  :rolleyes: :rolleyes:
#349
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.
#350
Hola a todos, el problema estaba en que tenía que leerlo en binario para no perder datos, puesto que como lo hacía leía menos bytes.

Código que permitió leer todos los bytes del archivo:

Código (cpp) [Seleccionar]
ifstream archivo;
archivo.open(directorio, ifstream::binary);// ifstream::in || ifstream::binary);
if (!archivo)
return true;
else{
string contenido;
archivo.seekg(0, ifstream::end);
streampos size = archivo.tellg();
char *memblock = new char[size]();
archivo.seekg(0, ifstream::beg);
archivo.read(memblock, size);
archivo.close();
contenido = string(memblock);


De todas formas gracias por las respuestas, aunque las leo ahora, lo solucioné poco después de escribir el tema, y quedé sin conexión a internet, y he estado desconectado hasta hoy, ya os digo que está solucionado, pero gracias.

Saludos.