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

#46
Buenas, estoy creando un instalador para una aplicación que se va a correr siempre con privilegios de administrador, sino no tendría mucho sentido.

Para ello, pido permisos UAC en el primer momento y quiero que no se vuelvan a pedir más veces después de la primera.

Resulta que pensaba que con runas.exe se podía hacer, pero me he dado cuenta de que no tiene mucho que ver, antes en otros años quizás si se podía ahora no.

C:\Users\Usuario\Desktop>runas /savecred /user:Usuario "instalador.exe"

Me pide la contraseña y lo ejecuto, ya no me la vuelve a pedir más veces, OK pero no me aporta ningún privilegio de administrador, de hecho la aplicación no se ejecuta como tal a pesar de que he dicho que se ejecute como el usuario actual y he dado mi contraseña, vamos lo que hace es una ejecución normal de doble click, solo que te pide la contraseña porque permite pasar de un usuario a otro sin cerrar sesión, luego parece que no me interesa en absoluto runas.exe para la tarea.

Lo único que se me ocurre es lanzar el mensaje de UAC en runtime en bucle o algo así.

¿Alguna idea de como conseguirlo hacer? No me refiero solo a exploits... en plan me refiero a que a través de la contraseña del usuario y el usuario en sesión, alguna manera o comando para lanzarla como administrador, algunas ideas.

Saludos
#47
Código (cpp) [Seleccionar]

wchar_t t = 0x202E;
wstring w;
w += 0x202E;
wstring b = L"C:\\Users\\Usuario\\Desktop\\prueba" + w + L".exe";
_wfopen(b.c_str() , L"wt");


Inserto el carácter multibyte de "puntero de derecha a izquierda", para hacer el spoofing sin éxito, trabjo con wchar_t (16 bits), la cadena antes de llamar a wfopen() se muestra como:

"C:\Users\Usuario\Desktop\prueba"

¿qué pasa?, un saludo.
#48
PHP / PHP IP local del cliente
16 Diciembre 2015, 19:15 PM
Ojj otra vez a escribir el post, odio el mensaje ese de que se te ha cerrado sesión justo cuando le das a enviar y tienes que iniciar sesión porque sino no te deja ni volver atrás porque te sale el login cargues lo que cargues inicias sesión y ya no puedes recuperar el mensaje OJJJ.

Bueno al tema:

Código (php) [Seleccionar]

<?php 
if(isset($_POST["ip"])){
echo "IP a la que trata de conectarse: {$_POST["ip"]}";
echo "<br>";
echo "La IP de su router es: {$_SERVER['REMOTE_ADDR']}";
echo "<br>";
echo "Su IP en su red local es: {$_SERVER['HTTP_X_FORWARDED_FOR']}";
echo "<br>";
echo "El puerto que utiliza para la conexión es: {$_SERVER['REMOTE_PORT']}";
echo "<br>";
}
?>



¿Por qué $_SERVER['HTTP_X_FORWARDED_FOR'] no contiene nada? ¿está deprecada la manera de obtener la ip local del cliente? Mi IP local es 192.168.1.34 por ejemplo, ¿por qué entonces no se muestra en el script? ¿y como conseguirla, pues me es necesaria y necesito coseguirla siempre que exista a ser posible?.

¿Alguna idea?.

Un saludo y gracias.

Edito: Reading... https://www.sitepoint.com/community/t/php-code-to-get-local-computer-ip-address/5697/9
https://en.wikipedia.org/wiki/TCP_hole_punching

Ahora entiendo, ¿puede depender de la NAT? Para conseguir conectar un equipo con otro necesito  "predictable NAT" en al menos uno de los equipos sino no se podrá producir la conexión entre ellos. Ya que el servidor no conocerá la ip local de un equipo del par que producirán conexión. Como pone en la tabla de la NAT en el último link.

Más interesante todavía entonces.
#49
Programación C/C++ / Montar P2P descentralizada
14 Diciembre 2015, 05:56 AM
Buenas, siemplemente si en una red P2P todos son cliente/servidor. ¿Cómo puede funcionar, si para hacer servidor nuestro ordenador necesitamos configurar el router entre otras cosas para que se pueda producir la conexión?.

Supongamos, que realizo una conexión al tracker y de él cargo una lista de ips y su puerto de servidor de los miembros conectados a la red P2P, entonces trataría de conectarme con ellos:

Código (cpp) [Seleccionar]
connect()

Apuntando a su IP y su puerto que he descargado, sin embargo para que esto funcione ellos deben de tener un servidor escuchando y un router configurado con NAT, u otros redireccionamientos.

¿Cómo entonces es posible que haya programas P2P que funcionen sin que toquen en nada la configuración del router?, ¿no son descentralizadas esas redes P2P, o hay otro mecanismo diferente al que expuse?, estaría bien saberlo.

Un saludo, y gracias.
#50
Se necesitan para descifrar signons.sqlite que contiene las passwords cargar las siguientes dll:

Código (cpp) [Seleccionar]

#define NSS_LIBRARY_NAME   "nss3.dll"
#define PLC_LIBRARY_NAME   "plc4.dll"
#define NSPR_LIBRARY_NAME  "nspr4.dll"
#define SQLITE_LIBRARY_NAME  "sqlite3.dll"
#define MOZCRT_LIBRARY_NAME  "mozcrt19.dll"
#define NSSU_LIBRARY_NAME  "nssutil3.dll"
#define NSSU_LIBRARY_NAME  "nssutil3.dll"
#define PLDS_LIBRARY_NAME  "plds4.dll"
#define SOFTN_LIBRARY_NAME "softokn3.dll"


Pero no encuentro donde están esas librerías he mirado en el directorio donde tengo firefox.exe la aplicación y solo aparece "nss3.dll", ¿han cambiado de nombre o están en otro sitio?. En el profilepath tampoco las he encontrado, a ver si alguien sabe algo.

Un saludo.
#51
Buenas os dejo el código:

Código (cpp) [Seleccionar]

vector<string> listar_archivos(string _directorio)
{
WIN32_FIND_DATAA ffd;
HANDLE hFind;
vector<string> retorno;

hFind = FindFirstFileA(_directorio.c_str(), &ffd);

if (hFind == INVALID_HANDLE_VALUE)
return retorno;
do{
printf("%x\n", ffd.dwFileAttributes);
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN))
retorno.push_back(ffd.cFileName);
} while (FindNextFileA(hFind, &ffd) != 0);
for each(string s in retorno)cout << s;
return retorno;
}


El problema está en que en ese directorio tengo 6 archivos con los atributos FILE_ATTRIBUTE_ARCHIVE y FILE_ATTRIBUTE_HIDDEN que puse con SetAtributtes pero sin embargo no aparecen al listarlos al final, también elimine la condición del if en el bucle y la salida era la misma no aparecen, también probé a listar archivos del desktop por ejemplo y no salía nada.

Lo que obtengo al mostrar la variable "retorno" elemento a elemento es un solo elemento que es el nombre del directorio del que quiero ver sus archivos, no sus archivos.

¿que falla?, saludos y gracias.

Vuelve edicion delicatesse:[/glow][/shadow] Acabo de solucionarlo había que añadir a el directorio "\\*" como pone aqui:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365200(v=vs.85).aspx

Un saludo.
#52
Actualmente para ejecutar ordenes en un terminal desde otro ordenador lo que utilizo es system("comando>temp.txt"); y que el ordenador que lo ejecuta me devuelva lo que contiene temp.txt, pero ¿esto no es posible hacerlo con exploits?.

Me refiero mandarle una cadena con el payload y que de alguna manera lo ejecute y tenga acceso a su terminal... no sé como iría ya por eso abro el tema.

Yo le mandaria el paquete con el payload y el lo ejecutaría, y obtendríamos una remote shell, ¿es posible? ¿necesito simular un cliente de metasploit?, ¿ideas?.

O mejor dicho ¿como crear una remote shell de A hacia B, sin usar comandos system("")?.

Saludos.
#53
Desarrollo Web / Ayuda con HTTP POST en C#
3 Diciembre 2015, 20:28 PM
Hola, estoy muy frustrado porque al cargar una página (que prefiero no decir en el tema) con el navegador sin cookies ni navegación en ella, al cargar su index y ver su código fuente me salen distintas cosas de las que obtengo con esto:

Código (c#) [Seleccionar]

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://***.com/");
               req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
               req.CookieContainer = cc;
               req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
               req.Host = "***.com";
               req.Method = "POST";
               req.Proxy = null;
               HttpWebResponse response = (HttpWebResponse)req.GetResponse();
               using (Stream responseStream = response.GetResponseStream())
               {
                   using (StreamReader sr = new StreamReader(responseStream))
                   {
                       string sub = "name=\"_token\" value=\"";
                       string responseData = sr.ReadToEnd();
                       byte[] bytes = new byte[responseData.Length * sizeof(char)];
                       System.Buffer.BlockCopy(responseData.ToCharArray(), 0, bytes, 0, bytes.Length);
                       File.WriteAllBytes("C:\\Users\\Usuario\\Desktop\\tast.txt", bytes);
                       int indice = responseData.IndexOf(sub);
                       if (indice == -1)
                       {
                           return false;
                       }
                       indice += sub.Length;
                       while(responseData[indice] != '"')
                       {
                           token += responseData[indice];
                           indice++;
                       }
                       MessageBox.Show(token);
                   }
               }
           }


Guardo la respuesta en un archivo en el escritorio, y trato de buscar un token necesario para iniciar la sesión en la web, ese token no aparece al hacer este post, ¿puede tener algo que ver con algún javascript que ignoraría?.

Básicamente con navegador me aparece esto al cargar el index:

name="_token" value="

Y cuando hago el https post no me sale, recibo distinta respuesta, ¿porque?. Dejando de lado el idioma etc, no creo que tenga que ver.

Dice que no la encuentra esa substring, y es que es verdad no está en el html que descarga la app en C#, pero al cargar la pag con el navegador si sale, ¿porque?.

Saludos.

Edito: Más pistas, en la página al clicar un boton salta un pop up donde metes los datos de login:

https://***.com/#show=login

Según he leido este operador (#) se usa para incluir código de otras urls más o menos, estaría bien una aclaración, seguiré leyendo.
#54
Hacking / SQLMAP a través de proxy
3 Diciembre 2015, 00:42 AM
¿Alguna aplicación capaz de hacerlo?.

Saludos.
#55
Hola, quiero hacer una red P2P donde todos los ordenadores actuarían de servidores y clientes a la vez, cada ordenador descargaría una tabla a través de un servidor web que actuaría de tracker y luego con la lista de ips de los ordenadores conectados que facilita la tabla establecerían conexión.

Pero ¿no necesito abrir los puertos de cada router si me quiero conectar a un ordenador específico?. Cuando levnto un servidor en un ordenador salta alerta del firewall y entoces permitimos permisos (también se puede añadir la excepción de manera automatizada), pero con eso no es suficiente para que alguien se pueda conectar a nuestro servidor solo con nuestra ip verdad?.

¿Habría que hacer NAT o no? ¿alternativas?.

Ejemplo: Juan de murcia con IP XX.XX.XX.XX trata de hacer connect() a Jaime de Lisboa con IP YY.YY.YY.YY, al hacer connect indica la IP de Jaime y su puerto donde Jaime tiene escuchando su servidor.

¿Se llegaría a producir esa conexión así solo vía sockets de punto a punto?, ¿o habria falta algo más, qué?.

Un saludo y gracias.
#56
Programación C/C++ / Enviando Email C++ 2.0
25 Noviembre 2015, 22:53 PM
Parte 1.0:

https://foro.elhacker.net/programacion_cc/fallo_al_enviar_email_a_servidor-t444524.0.html

Parte 2.0:

Buenas, sigo intentando crear una función para enviar correos electronicos en C++. Por lo visto voy a necesitar una cuenta de correo ya conocida, y el servidor smtp al que pertenece esa cuenta.

Comence conectando al puerto 25 de smtp.live.com (servidor smtp de hotmail), pero tras el "HELO" saltaba a "STARTTLS", es decir el servidor rechazaba que introdujera más datos (como usuario de corre y contraseña) ya que requería usar "STARTTLS" para pasar a una conexión cifrada TLS/SSL.

Ahí es donde nació el problema por lo que abro el hilo. Pues informandome de los puertos que usa hotmail, gmail etc, traté de conectarme ("connect") a ellos con SSL y no respondía las peticiones, algo por lo que desconozco la causa actualmente:

Código (cpp) [Seleccionar]
CRYPTO_malloc_init();
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
SSL* ssl;
BIO* bio = BIO_new_ssl_connect(ctx);
if (bio == NULL) {
SSL_CTX_free(ctx);
return false;
}
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio, (host + ":465").c_str());
if (BIO_do_connect(bio) <= 0) {
BIO_free_all(bio);
SSL_CTX_free(ctx);
return false;
}


En yahoo pude comprobar que permite acceder al servidor con las credenciales en texto plano, por lo que desde un correo de yahoo podría mandar fácilmente a otro, pero iría en texto plano, y además no tengo correo yahoo vaya.

https://www.fastmail.com/help/technical/ssltlsstarttls.html

¿Por qué no no responde mis petición SSL a su puerto 465 donde se supone que usa SMTP bajo SSL?. Creo que tengo que comenzar en texto plano con HELO, y luego usar el comando STARTTLS, pero no se si es un comando y apenas encuenro documentación sobre como funciona, solo programas hechos que ya lo implementan, otras soluciones dicen que basta con conectarse directamente al puerto SSL del servidor SMTP, pero como ya dije ignora mis peticiones.

Saludos.

Edito: Ojo me trato de conectar con un cliente SSL, no con uno TLS, pero no creo que sea eso no tiene mucho sentido.

CitarSTARTTLS

220 2.0.0 SMTP server ready
il.com Hello

Después de esto ¿qué?, no me acepta conexiones SSL.. en ningun puerto..


Edito: Muy buenas chicos, he probado con gmail y funciona el SSL, ya que al parecer, el hotmail soporta solo TLS no SSL, por eso no respondía pero gmail si y ya me pide autentificacion, perfecto :), aunque una pena no poder hacerlo para hotmail.

De todas formas ¿no podría tener un servidor SMTP propio de el proovedor de internet??? Vendría de perlas, porque sino las credenciales deberían de ir dentro de la app para mandar el correo, un saludo.

Edito: Tras mucho sufrimiento me consigo loguear en gmail y me dice que vaya a la web. " Please log in via your web browser and
534-5.7.14 then try again."
#57
Software / Librerías estáticas para tor
24 Noviembre 2015, 16:38 PM
¿Existen?, ¿algo parecido?.

O hay que compilarlo y crear nuestra propia librería.. (AKA the wrong way).

Un saludo.
#58
Hola, me descargue y descomprimí "zlib-1.2.8" en el escritorio, luego accedí a "\contrib\vstudio\vc11" y abrí el ".sln", cambié todas las versiones para que se compilaran en VS13, ya que estaban para VS12 y daba error, luego también cambie todos los proyectos para que se compilaran sin "SAFETRESH", cambie que compilase a librería estática ".lib" en vez de ".dll", al compilar tenía 9 errores de externos sin resolver, todos por culpa de zlibwapi.lib, ejemplo:

CitarError   8   error LNK2019: símbolo externo _inflate_fast sin resolver al que se hace referencia en la función _inflate@8   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(inflate.obj)   miniunz

Error   3   error LNK2019: símbolo externo _inflate_fast sin resolver al que se hace referencia en la función _inflate@8   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(inflate.obj)   testzlibdll

Error   6   error LNK2019: símbolo externo _longest_match sin resolver al que se hace referencia en la función _fill_window   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(deflate.obj)   minizip

Error   5   error LNK2019: símbolo externo _match_init sin resolver al que se hace referencia en la función _lm_init   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(deflate.obj)   minizip

Error   2   error LNK2019: símbolo externo _longest_match sin resolver al que se hace referencia en la función _fill_window   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(deflate.obj)   testzlibdll

Error   1   error LNK2019: símbolo externo _match_init sin resolver al que se hace referencia en la función _lm_init   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\zlibwapi.lib(deflate.obj)   testzlibdll

Error   4   error LNK1120: 3 externos sin resolver   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\x86\TestZlibDllDebug\testzlibdll.exe   1   1   testzlibdll

Error   7   error LNK1120: 2 externos sin resolver   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\x86\MiniZipDebug\minizip.exe   1   1   minizip

Error   9   error LNK1120: 1 externos sin resolver   C:\Users\Usuario\Desktop\zlib-1.2.8\contrib\vstudio\vc11\x86\MiniUnzipDebug\miniunz.exe   1   1   miniunz


Al final mejor pongo todos, he comprobado que en todos los proyectos estuviera la librería "zlibwapi.lib", y si que lo estaba en el directorio donde se compila no en el que sale el error "x86\ZlibDllDebug", en ese directorio está "zlibwapi.lib", y es donde apuntan todos los proyectos que dicen que no la tienen. ????

He probado a mover mover la libreria a los directorios donde sale el error que no la encuentra, pero seguia saliendo el error. Es por eso que no entiendo porque me sale error de "simbolo externo" para una librería que si tiene incluida.

A ver si me podeis ayudar, un saludo y gracias.

Más cosas, me pregunto si necesito incluir algo más como directorios de cabeceras etc (como se hace siempre que se añade una librería... voy a probar pero creo que no es necesario y que no corregirá el error).
.. Lo hice y sigue dando fallos, en librerías de inclusión adicionales no tenía nada, pero tampoco lo veía necesario ya que a la hora de incluirla ponía el directorio completo, y aún poniendolo da error, sigo probando.. No hay manera, he probado a compilar un solo proyecto de los que daba error, y le he metido directorios de inclusión adicionales (las cabeceras), le he metido en directorio de librerías x86\ZlibDllDebug, y en librerías he puesto en el linker de entrada zlibwapi.lib, pero da los errores de siempre al generar, en este proyecto son 3 externos sin resolver el error que da a pesar de hacer todo eso, esos externos ya los puse anteriormente y guardan relacion con el proyecto "testzlibdll", cambiando todo eso, y el proyecto sigue dando los errores.

Ayuda pls.

Bueno bueno, quizás sea un bug:

Parece que hay que remover ZLIB_WINAPI (algo que al removerlo de primeras daba más errores), pero hay que manipular unos arhcivos.. vamos a probar..

http://www.tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall/

He modificado lo del fallo al leer la versión, como ponía, pero al corregir una directiva de preprocesador como pone me da error, y luego hay que eliminar las ZLIB_WINAPI, pero ¿porque este error?:

Código (cpp) [Seleccionar]
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP, WINAPI_PARTITION_APP)
//#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define IOWIN32_USING_WINRT_API 1
#endif
#endif


Elimino la linea que esta como comentario, y pongo la que dicen que hay que poner en el tuto, y me sale:

   27   IntelliSense: no se permite una llamada a función en una expresión constante   c:\Users\Usuario\Desktop\zlib-1.2.8\contrib\minizip\iowin32.c   30   5   zlibvc

¿Como puedo solucionarlo?, de todas maneras creo que esos "bugs" no tienen que ver con que no se compile el proyecto..., el problema está en que no linkea correctamente zlibwapi.lib, pero no entiendo si he comprobado mil veces que está bien linkeada PFF.

Va chicos one hand
#59
Buenas, encontré un código sobre como mandar emails entre varios, y este parecía el mejor, a pesar de que daba bastantes fallos al compilar conseguí arreglarlo y ya compila, le tengo que meter el servidor smtp (de hotmail, gmail etc) que lo tengo bien, luego la cuenta de ese servidor a la que vas a enviar el archivo (en caso de hotmail, micuenta@hotmail.com), y luego la cuenta que manda el archivo que ahí es donde tengo el problema, os dejo el código a ver si me podéis ayudar, porque me dice que lo ha mandado correctamente, pero nada llega al correo, el problema está en el correo que manda el mensaje no se que poner, he probado con mi isp pero tampoco.

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <fstream>
#include <winsock2.h>
#define CRLF "\r\n"
#pragma comment(lib, "ws2_32.lib")
using namespace std;

void ShowUsage(void);
void Check(int iStatus, char *szFunction);
void ShowUsage(void)
{
cout << "Usage: SENDMAIL mailserv to_addr from_addr messagefile" << endl
<< "Example: SENDMAIL smtp.myisp.com rcvr@elsewhere.com my_id@mydomain.com message.txt" << endl;

exit(1);
}

// Basic error checking for send() and recv() functions
void Check(int iStatus, char *szFunction)
{
if ((iStatus != SOCKET_ERROR) && (iStatus))
return;

cerr << "Error during call to " << szFunction << ": " << iStatus << " - " << GetLastError() << endl;
}

int main()
{
int         iProtocolPort = 0;
char        szSmtpServerName[64] = "";
char        szToAddr[64] = "";
char        szFromAddr[64] = "";
char        szBuffer[4096] = "";
char        szLine[255] = "";
char        szMsgLine[255] = "";
SOCKET      hServer;
WSADATA     WSData;
LPHOSTENT   lpHostEntry;
LPSERVENT   lpServEntry;
SOCKADDR_IN SockAddr;

// Check for four command-line args
//ShowUsage();

// Load command-line args
strcpy(szSmtpServerName, "smtp.live.com");//smtp de hotmail
strcpy(szToAddr, "mirealemail@hotmail.com");//mi email real de hotmail
strcpy(szFromAddr, "micasa@noseque.com");//mi direcion ip?dominio?isp? que poner aqui

// Create input stream for reading email message file
//ifstream MsgFile(argv[4]);

// Attempt to intialize WinSock (1.1 or later)
if (WSAStartup(MAKEWORD(1, 1), &WSData))
{
cout << "Cannot find Winsock v" << 1 << "." << 1 << " or later!" << endl;

return 1;
}

// Lookup email server's IP address.
lpHostEntry = (hostent*)gethostbyname(szSmtpServerName);
if (!lpHostEntry)
{
cout << "Cannot find SMTP mail server " << szSmtpServerName << endl;

return 1;
}

// Create a TCP/IP socket, no specific protocol
hServer = socket(PF_INET, SOCK_STREAM, 0);
if (hServer == INVALID_SOCKET)
{
cout << "Cannot open mail server socket" << endl;

return 1;
}
// Get the mail service port
lpServEntry = (servent*)getservbyname("mail", 0);

// Use the SMTP default port if no other port is specified
if (!lpServEntry)
iProtocolPort = htons(IPPORT_SMTP);
else
iProtocolPort = lpServEntry->s_port;

// Setup a Socket Address structure
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = iProtocolPort;
SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

// Connect the Socket
if (connect(hServer, (PSOCKADDR)&SockAddr, sizeof(SockAddr)))
{
cout << "Error connecting to Server socket" << endl;

return 1;
}

// Receive initial response from SMTP server
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");

// Send HELO server.com
sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO");

// Send MAIL FROM: <sender@mydomain.com>
sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM");

// Send RCPT TO: <receiver@domain.com>
sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO");

// Send DATA
sprintf(szMsgLine, "DATA%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA");
sprintf(szMsgLine, "%s%s", "HOLA PROBANDO A ENVIAR UN EMAIL", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() message-line");

// Send blank line and a period
sprintf(szMsgLine, "%s.%s", CRLF, CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message");

// Send QUIT
sprintf(szMsgLine, "QUIT%s", CRLF);
Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT");
Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT");

// Report message has been sent
cout << "Sent " << "ARCHIVO" << " as email message to " << szToAddr << endl;

// Close server socket and prepare to exit.
closesocket(hServer);

WSACleanup();

return 0;
}


Saludos y gracias.

Edito: Bueno bueno, tras mucho leer. Parece que todo indica a que tengamos que loguearnos en una cuenta conocida que tengamos en un servidor smtp, y desde allí mandar un email a la cuenta que queramos dentro o fuera del dominio.

Esto sabía que se podía hacer, pero es lo último a lo que quería llegar, porque imaginaros una app que manda emails con notificaciones, necesitaría contener la cuenta que va a mandar el mensaje en su interior y la podrían extraer con ingeniería inversa y acceder al usuario y contraseña del correo que usa la app para mandar los emails.

Yo estoy intentando buscar otra forma de mandarlo, a través de nuestra ip y nuestro servidor de isp o algo así, o levantar nuestro propio servidor smtp y mandar mensajes con nuestra isp como dominio y nuestra ip como usuario, no sé, desconozco el tema, estoy buscando ideas.

¿Alguna alternativa a que tenga que loguearme en un server smtp(gmail, hotmail...), y mandarlo desde el tras loguearme?, estaría bien por muchos motivos.

Saludos.

Edito: De hecho entonces no entiendo este código que parecía funcionar cuando lo busqué, pues aquí no introduce la contraseña, no se loguea en la cuenta para mandar el email, aunque tampoco debería hacerlo si le estamos diciendo mande a un destinatario, y si nosotros estamos usando nuestro dominio como origen del mensaje.

Creo que el protocolo también falla, de el ejemplo, ¿no?. ¿Pero entonces necesito estrictamente autentificarme en otro correo ya conodico y enviarlo desde ahí o no?.
#60
Redes / Seguridad red P2P y servidores SSL
16 Noviembre 2015, 12:38 PM
Buenos dias, estoy tratando de montar una red P2P anónima y segura en C++. Que se conecte a un tracker y de ahí cargue un listado de clientes que estén usando la red y trate de conectarse a ellos mandandoles un mensaje hello...

El tracker les pasaría entre 10 y 15 nodos a cada uno que haga una petición buscando nodos, en función de la cercanía de estos.

Luego, tenemos que levantar un servidor en cada cliente nodo, que escuche peticiones ssl seguras. Una pregunta es ¿Para levantar un servidor hace falta hacer NAT con el router no?. Es decir, si yo tengo 2 nodos, uno tiene levantado un servidor y trato de conectarme usando su ip y su puerto de escucha, no funcionaría si no configuro previamente el router no?. ¿Qué alternativa se puede hacer?.

Más, yo como dueño de la red debería tener una llave maestra para acceder a ella y que nadie más pueda hacerlo, aquí entra la seguridad de la red, muy importante. A ver.. una vez tengo el tracker tenemos los nodos, usamos un protocolo para que se conecten los nodos entre si, y luego habrá que usar otro protocolo que si lo identifican los nodos saben que es el del administrador y entonces ofrecen más servicios como instalacion etc, lo que sea vaya.

Esa sería un poco la idea, también estaría bien que cada nodo se conecte a otro nodo a través de 3 o 4 nodos intermediarios cono en TOR, estaría bien escuchar más ideas, sobre todo de seguridad para esta red.

Un saludo.

PD: que alguien lo mueva a seguridad que se me olvido, y si alguien se anima me puede mandar MP y podemos crear un git donde subir el code etc.

Saludos.
#61
He buscado funciones, he intentado hacerla paso a paso y no funciona, ¿alguien puede decirme como calcular el tcp checksum a partir de el array de bytes del paquete y otra variable con su tamaño?, estaría muy bien, mientras habrá que buscar.  :-* :-*

Código con el que traté de implementarlo por mi cuenta:

Código (cpp) [Seleccionar]
//http://www.arcesio.net/checksum/checksumTCP.html
u_char* tcp_checksum(u_char* datos, int tamaño)
{
u_char checksum[2];
uint16_t sumando = 0, sumanda = 0;
bitset<17> total;
for (int i = 26; i < 33; i++)//del 26 al 33 ip origen y destino se suman
{
sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
total = sumando + sumanda;
sumando += sumanda;
if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
sumando++;
i++;
}
sumanda = (uint16_t)(0x06);//sumamos el tipo paquete tcp
total = sumando + sumanda;
sumando += sumanda;
if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
sumando++;
sumanda = (uint16_t)(tamaño - 34);// ((datos[38] << 8) + datos[39]);//sumamos el tamaño del paquete.
//sumanda = (uint16_t)((datos[38] << 8) + datos[39]);//sumamos el tamaño del paquete.
total = sumando + sumanda;
sumando += sumanda;
if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
sumando++;
//YA TENEMOS CALCULADO EL PSEUDO HEADER.
for (int i = 34; i < 40; i++)//del 34 al 41, 3 campos tcp header.
{
sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
total = sumando + sumanda;
sumando += sumanda;
if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
sumando++;
i++;
}
for (int i = 42; i < tamaño; i++)//sumamos resto.
{
sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
total = sumando + sumanda;
sumando += sumanda;
if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
sumando++;
i++;
}
sumando = sumando & 0xFFFF;
sumando = ~sumando;
checksum[0] = (sumando >> 8) & 0x00FF;
checksum[1] = sumando & 0x00FF;
return checksum;
}


Lo saqué de aqui como hacerlo:

http://www.arcesio.net/checksum/checksumTCP.html

Pero no funciona, pues al comparar mis tcp checksums con los de wireshark no coinciden, ¿alguna ayuda?. ¿que tengo mal?.

Gracias.

He estado mirando y tengo mal en la linea que hago la suma del tamaño del paquete, ese no es su tamaño. Pero aun asi sigue fallando.

¿en la línea 20 que habría que poner?.

Edito: Haber sumo primero la ip origen y destino, el numero de protocolo 0x06 (pasandolo a u_short como todos los sumandos), y luego le sumo la linea en duda del tamaño del tcp header y sus datos.

Luego a eso le tengo que sumarla suma del campo tcp header de u_short en u_short e igual con el payload, ¿pero porque no funciona?.

Ejemplo salida:

Código (cpp) [Seleccionar]
if (pkt_data[23] == 0x06){
u_char origen[4];
u_char destino[4];
memcpy(origen, const_cast<u_char*>(pkt_data + 26), sizeof(u_char)* 4);
memcpy(destino, const_cast<u_char*>(pkt_data + 30), sizeof(u_char)* 4);

in_addr a;
in_addr b;
a.S_un.S_addr = inet_addr((char*)origen);
b.S_un.S_addr = inet_addr((char*)destino);
printf("%x%x==", pkt_data[50], pkt_data[51]);
printf("%x%x==", tcp_check(const_cast<u_char*>(pkt_data), header->caplen, inet_addr((char*)origen), inet_addr((char*)destino))[0],
tcp_check(const_cast<u_char*>(pkt_data), header->caplen, inet_addr((char*)origen), inet_addr((char*)destino))[1]);
printf("%x%x", tcp_checksum(const_cast<u_char*>(pkt_data), header->caplen)[0],
tcp_checksum(const_cast<u_char*>(pkt_data), header->caplen)[1]);
cout << endl;
}


Citarbee==d4f9==014
4eb4==d4f9==014
675a==d4f9==014

Me sale el checksum siempre 014 ???

Por cierto la otra funcion que pruebo, que no es mía tampoco funciona es:

Código (cpp) [Seleccionar]
u_char* tcp_check(u_char *buff, size_t len, u_long src_addr, u_long dest_addr)
{
uint16_t *buf = (uint16_t*)buff;
uint16_t ip_src = (uint16_t)src_addr, ip_dst = (uint16_t)dest_addr;
         uint32_t sum;
         size_t length = len;
         // Calculate the sum                                            //
         sum = 0;
         while (len > 1)
         {
                 sum += *buf++;
                 if (sum & 0x80000000)
                         sum = (sum & 0xFFFF) + (sum >> 16);
                len -= 2;
        }

        if (len & 1)
                // Add the padding if the packet lenght is odd          //
                 sum += *((uint8_t *)buf);

        // Add the pseudo-header                                        //
         sum += (ip_src++);
        sum += ip_src;
         sum += (ip_dst++);
         sum += ip_dst;
         sum += htons(IPPROTO_TCP);
        sum += htons(length);

         // Add the carries                                              //
         while (sum >> 16)
                 sum = (sum & 0xFFFF) + (sum >> 16);

u_char ret[2];
        // Return the one's complement of sum 
ret[0] = ((uint16_t)(~sum) >> 8) & 0x00FF;
ret[1] = (uint16_t)(~sum) & 0x00FF;//
        // return ((uint16_t)(~sum));
return ret;
}
//http://minirighi.sourceforge.net/html/tcp_8c-source.html
#62
Programación C/C++ / La magia del string.find()
13 Noviembre 2015, 15:07 PM
Se solucionó, tenía que ver con esa igualdad que haces dentro de una condicion a la que hay que meter entre parentesis...

fue algo mágico de todas maneras:

Código que funciona:

Código (cpp) [Seleccionar]
void filtrar_pregunta_http(u_char* _datos, int _tamaño)
{
string paquete = string(reinterpret_cast<char*>(_datos), _tamaño);
int tamaño = _tamaño;
int pos = 0;
while ((pos = paquete.find("https://", pos)) != string::npos){
paquete.replace(pos, 5, "http");
tamaño--;
}
cout << "pos: " << pos << endl;
if ((pos = paquete.find("Accept-Encoding: ")) != string::npos){
int pas = pos;
while (paquete[pas] != '\n'){
printf("%c", paquete[pas]);
pas++;
}
paquete.erase(pos, pas - pos + 1);
}
cout << paquete.c_str() << endl;
}
#63
Hola, estaba probando con openssl a realizar una conexión https visto que no conseguí curl, de hecho no me hace falta si se usar openssl que de momento no es el caso.

Lo primero una duda, cuando me conecto con google.com de la forma:

Código (cpp) [Seleccionar]
int sd;
struct hostent *host;
struct sockaddr_in addr;

host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(80);     /* set the desired port */
addr.sin_addr.s_addr = *(long*)(host->h_addr); /* and address */
connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
//send .. recv..


Los datos que obtengo son descifrados, esto es porque me conecto a el puerto 80 que usa HTTP ¿verdad?, ¿pero google no forzaba a usar https?, no entiendo porque una conexión normal no me la cifra, ¿será que es la primera interacción?.

Me he puesto a probar una conexión https siguiendo un tutorial, que encontré aquí:

http://www.informit.com/articles/article.aspx?p=22078&seqNum=3

Muy bueno por cierto, porque hay poca documentación sobre openssl y ejemplos.

Código (cpp) [Seleccionar]
SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms();   /* load & register cryptos */
SSL_load_error_strings();     /* load all error messages */
method = (SSL_METHOD*)SSLv2_client_method();   /* create client instance */
ctx = SSL_CTX_new(method);         /* create context */
int sd;
struct hostent *host;
struct sockaddr_in addr;

host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(80);     /* set the desired port */
addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
SSL *ssl;
ssl = SSL_new(ctx);    /* create new SSL connection state */
SSL_set_fd(ssl, sd);   /* attach the socket descriptor */
SSL_connect(ssl);          /* perform the connection */
SSL_write(ssl, "ola que ase", 0);
char rec[1000];
SSL_read(ssl, rec, 0);
cout << rec;


Me salta un error en ejecución en SSL_set_fd(ssl, sd);, donde he pasado de segundo argumento un socket, ¿que se supone que tengo que pasar ahí?.

¿Se supone que hago una conexión http y luego paso a https? ¿o como va?.

Seguiré probando, un saludo.

Edito: Bueno he estado probando y resulta que le pasaba el primer argumento null, el segundo argumento creo que es lo que devuelve connect, fui probando porque devolvia null y probando variable a variable hasta que ví que me faltaba una función de inicializar la librería tal que:

SSL_library_init();

Tras ponerlo no dio error, pero devolvió basura, seguiré probando a ver. Creo que es porque nunca he usado write() a ver de que va..

Código (cpp) [Seleccionar]
char *post = "POST / HTTP/1.1\r\ncontent-type:application/x-www-form-urlencoded;charset=utf-8\r\nhost: google.com\r\n";

SSL_METHOD *method;
SSL_CTX *ctx;
SSL_library_init();
OpenSSL_add_all_algorithms();   /* load & register cryptos */
SSL_load_error_strings();     /* load all error messages */
method = const_cast<SSL_METHOD*>(SSLv2_client_method());   /* create client instance */
ctx = SSL_CTX_new(method);         /* create context */
int sd, server;
sockaddr_in addr;
WSADATA wsa;
WSAStartup(MAKEWORD(2, 0), &wsa);
if (sd = socket(AF_INET, SOCK_STREAM, 0) == SOCKET_ERROR)
cout << "error crear socket";/* create TCP socket */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(80);     /* set the desired port */
addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
if (server = connect(sd, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR){
cout << "error conectar: " << WSAGetLastError();/* connect */
}
cout << "conectado";
SSL *ssl;
ssl = SSL_new(ctx);    /* create new SSL connection state */
SSL_set_fd(ssl, server);   /* attach the socket descriptor */
SSL_connect(ssl);          /* perform the connection */
SSL_write(ssl, post, strlen(post));
char rec[1000];
SSL_read(ssl, rec, 0);
cout << rec;
/*...*/
SSL_free(ssl);              /* release SSL state */
#64
Pues eso, he tratado de compilarlo para VS13 pero necesito otras 3 librerías para compilarlo, traté de compilarlas y tuve errores, y pase de hacerlo era mucho lío por una jodida librería y es que no sabía hacerlo.

¿Como puedo conseguir una librería estática de curl descargandola?, y sino se puede ¿que pasos he de seguir para compilarla con sus dependencias?.

Un saludo.
#65
Si char* tiene un caracter nulo en mitad de la secuencia al construir la string se corta allí:

Código (cpp) [Seleccionar]
char *e = "aisjiajisfj\0buenas";
cout << string(e);


Y pierdo el poder convertir el char* en string, ¿no hay alguna solución para poderlo hacer?.

Saludos.

Bueno, quizás si nos aseguramos de lo que vamos a leer no contiene caracteres nulos hasta el final.
#66
Seguridad / Dudilla SSLStrip
5 Noviembre 2015, 18:28 PM
¿SSLStrip utiliza en algún momento SSL?

¿Como funciona?, el servidor recibe peticiones https en ese caso sslstrip lanza una peticion https a la página en cuestion y devuelve la página en texto plano a la victima, O ¿recibe las peticiones https de las victimas y las manda como http al servidor y el servidor las devuelve en texto plano?.

Cual de las 2 cosas utiliza, para no https es simplemente webscrapear y reenviar mensajes, pero cuando la victima se conecta a https o tiene un link que va a https, el link lo cambiamos a http, si se conecta a http y es redirigido a https la peticion entrará en nuestro server sslstrip en ese caso hacemos conexión con el atacante, y devolvemos datos cifrados a la victima, ¿así funciona?.

Otra cosa, nosotros podríamos descifrar una página con https con su clave pública o certificado que no dan no?, como hacen los navegadores cuando navegamos por https, los datos nos llegan cifrados pero los vemos ya en texto plano, para ello que utilizaron para desencriptarlo ¿algo predefinido en el navegador que programando no tendríamos acceso o simplemente con la clave pública y el certificado que nos dan bastaría para descifrar los datos?. Porque según leí, la clave pública no puede descifrar datos, entonces ¿como desciframos los datos en las conexiones https?.

Edito: Bueno he estado analizando código y según parece cuando lanzan peticion https se conecta con https y devuelve la respuesta en http, y remueve los links https por http.

Lo que me hace pensar que el HSTS sea algo que tienen los navegadores que dice "estos dominios siempre https y sino alerta", entonces sslstrip2 para bypassear es lo que hace ¿es?..

¿Falsificar dominios?, en plan si preguntamos por facebook.com nos redirige a webfacebook.com por ejemplo y entonces bypasea la lista de dominios con HSTS en el navegador y no sale alerta, ¿es eso lo que hace?, ¿o no es necesario cambiar el dominio?.

Saludos.
#67
Buenas, tengo una duda y es la siguiente:

Si creo una dll que muestra un mensaje, y la inyecto a un proceso ¿necesito solo el pid del proceso no?, en plan creo una dll que dice "hola mundo", la inyecto en svchost.exe ¿y listo?, ¿o tengo que hacer ingeniería inversa de svchost.exe?.

Si svchost.exe corre como system, el programa que ejecuto en mi dll correría como system?, puedo conseguir que lo haga a través del token de svchost.exe? ya que se supone lo ejecuta ese proceso si la inyecto a el.

La idea es saber si con este proceso podré tener permisos de administrador (o system que son como los de administrador pero con más opciones aún  si no me equivoco) siempre para mi dll, pues mi dll necesita permisos de administrador siempre.

¿Con inyección de dll puedo conseguir permisos de administrador sin que salga el uac para siempre?, es decir windows se reiniciaría y el programa de mi dll correría en system sin mensajes ni nada, ¿no?.

Un saludo.
#68
Código (cpp) [Seleccionar]
void enseñar_mensaje(string ventana, string mensaje, u_int icono)
{
wchar_t *caca = L"iaifhidhifhdi";
MessageBox(NULL, caca,(LPCWSTR)ventana.c_str(), icono | MB_OK);
}


El problema es que no hay manera de pasar de string wchar_t* o a wstring, ¿alguna idea?.

Saludos y gracias.

Bueno parece que hay muchos codes por stackoverflow cuando lo solucione pasaré la respuesta, de todas formas estaría bien meterle una scrollbar, un saludo.

Edito: solucionado, que aproveche:

Código (cpp) [Seleccionar]
void enseñar_mensaje(string ventana, string mensaje, u_int icono)
{
int len;
int slength = (int)ventana.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, 0, 0);
wstring ven(len, L'\0');
MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, &ven[0], len);
slength = (int)mensaje.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, 0, 0);
wstring men(len, L'\0');
MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, &men[0], len);
MessageBox(NULL, men.c_str(), ven.c_str(), icono | MB_OK);
}
#69
Hola a todos, ya me aproximo al problema con el cifrado/descifrado AES.

El cifrado y descifrado está bien, el problema es lo que escribe en el archivo, pues aparecen bytes que no deberían estar.

Aquí muestro el contenido 2 cadenas que voy a escribir en el archivo una detrás de la otra, las 2 contienen lo mismo por ello son iguales. Son dos bloques de 48 bytes.
En total el archivo tiene 96 bytes perfecto.

Bytes primer bloque a escribir en el archivo en modo binario / append:
Citar94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Bytes segundo bloque a escribir en el archivo en modo binario / append:
Citar94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Ahora bien, tras escribir una, y escribir la otra encima de la una, aparecen unos bytes de por medio que no deberían de salir:

Bytes de los dos bloques que aparecen al leer el archivo de nuevo en modo in / binary:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36 205 253 253 253 253 173 0 0 54 208 248 159 44 173 0 0 128 183 93 0 144 92 93 0 8 236 93 0 192 0 93 0 32 208 249 136 35 173 0 8 184 182 93 0 64 98 93 0

Luego al descifrar, salen cosas corruptas normal, además descifra todo correctamente menos los bytes corruptos, pero ¿porque salen?, os dejo el código donde hago la prueba:

Código (cpp) [Seleccionar]
void almacen::escribir_cifrado(bytes _datos)
{
ofstream archivo;
archivo.open(directorio, ofstream::app | ofstream::binary);
_datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
for (int i = 0; i < get<TAMAÑO>(_datos); i++)
{
cout << (int)get<CONTENIDO>(_datos)[i] << " ";
}
cout << endl << endl;
archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
archivo.close();

ifstream archivo2;
archivo2.open(directorio, ifstream::in | ifstream::binary);
archivo2.seekg(0, ifstream::end);
int man = archivo2.tellg();
archivo2.seekg(0, ifstream::beg);
cout << man;
char *contenido = new char[man]();
archivo2.read(contenido, man);

archivo2.close();
for (int i = 0; i < man; i++)
{
cout << (int)get<CONTENIDO>(_datos)[i] << " ";
}
system("pause");
}


Las cadenas encriptadas están bien, pero al obtenerlas ya bien sea causa de porque fueron escritas en el fichero de forma errónea, o porque al leer se corrompieron lo que recibo no concuerda con lo que dije que escribiera.

¿Qué podrá pasar?, un saludo.

Edito: Descartamos que escribe mal en el archivo porque esto es o que tine al abrir con el bloc de notas:

Citar^ù3ÊZÙôœçáB–ÿ uº°û˜pl'I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$^ù3ÊZÙôœçáB–ÿ uº°û˜pl'I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$

Como se puede observar, los 2 bloques son iguales, y empiezan por "^ù3ÊZ", luego parece que escribe bien, el problema está en la lectura y la carga en un buffer.
#70
Programación C/C++ / basura al final de cadena
30 Octubre 2015, 18:41 PM
Código (cpp) [Seleccionar]
void escribe()
{
FILE *a = NULL;
a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "ab");
u_char *o = (u_char*)"BUENOS DIASSS";
fwrite(o, sizeof(u_char), strlen("BUENOS DIASSS"), a);
fclose(a);
a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "rb");
fseek(a, 0, SEEK_END);
int c = ftell(a);
cout << c;
fseek(a, 0, SEEK_SET);
u_char *d = new u_char[c]();
fread(d, sizeof(u_char), c, a);
cout << (char*)d;
fclose(a);
}


Llamo a esta funcion 6 veces, salida:

CitarBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSS²²²²-¿B-óÙc
Porque hay basura?

Y cada vez va saliendo más.
#71
Programación C/C++ / Problema con cifrado AES
30 Octubre 2015, 14:18 PM
Hola de nuevo, tengo un archivo donde introduzco montones de datos cifrados de uno en uno, y luego lo descifro a la vez todo y muestro una cadena.

El texto descifrado está casi bien, pero muestra basura en el texto descifrado del principio de los montones.

"hoy hace un buen dia" -> cifro : "isewug0uwe0igj" -> al descifrar "iqh39h buen dia".

Esto pasa con todos los montones de datos que descifro menos con el primero que se mantiene intacto, os dejo el código para que me podáis ayudar:

Clase que cifra, la clase "bytes" es un typedef tuple<u_char*,int> contenido y tamaño de los datos cifrados o descifrados.

Código (cpp) [Seleccionar]
bool encriptador_AES::inicializar_AES(string _contraseña, int _rondas)
{
u_char key[32], iv[32];
u_int salto[2] = { MINIMO_SALTO, MAXIMO_SALTO };
if (EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (u_char*)&salto, (u_char*)_contraseña.c_str(), _contraseña.length(), _rondas, key, iv) != 32)
return false;
EVP_CIPHER_CTX_init(&en);
EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_init(&de);
EVP_DecryptInit_ex(&de, EVP_aes_256_cbc(), NULL, key, iv);
return true;
}

bytes encriptador_AES::encriptar_AES(u_char *_entrada, int _tamaño)
{
int c_len = _tamaño + AES_BLOCK_SIZE, f_len = 0;
u_char *salida = (u_char*)malloc(c_len);
EVP_EncryptInit_ex(&en, NULL, NULL, NULL, NULL);
EVP_EncryptUpdate(&en, salida, &c_len, _entrada, _tamaño);
EVP_EncryptFinal_ex(&en, salida + c_len, &f_len);
return bytes(salida, c_len + f_len);
}

string encriptador_AES::desencriptar_AES(u_char *_entrada, int _tamaño)
{
int p_len = _tamaño, f_len = 0;
u_char *salida = (u_char*)malloc(p_len);
EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL);
EVP_DecryptUpdate(&de, salida, &p_len, _entrada, _tamaño);
EVP_DecryptFinal_ex(&de, salida + p_len, &f_len);
string ret;
for (int i = 0; i < p_len + f_len; i++) ret += salida[i];
delete salida;
return ret;
}


Clase almacen que escribe en un fichero en binario los datos cifrados y los lee y los descifra:

Código (cpp) [Seleccionar]
almacen::almacen(string _directorio)
{
directorio = _directorio;
cifrador.inicializar_AES(CLAVE_AES, 5);
}

void almacen::escribir_cifrado(bytes _datos)
{
ofstream archivo;
archivo.open(directorio, ofstream::app | ofstream::binary);
_datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
archivo.close();
}

string almacen::leer_descifrado()
{
//probar que vaya parte a parte mejor, en vez de entera.
ifstream archivo;
archivo.open(directorio, ifstream::in | ifstream::binary);
archivo.seekg(0, ifstream::end);
streampos tamaño = archivo.tellg();
char *contenido = new char[tamaño]();
archivo.seekg(0, ifstream::beg);
archivo.read(contenido, tamaño);
archivo.close();
string ret = cifrador.desencriptar_AES((u_char*)contenido, tamaño);
delete contenido;
return ret;
}


En una función introduzco el texto para que sea cifrado de esta manera, siendo contenido un string con los datos en texto plano:

_archivo.escribir_cifrado(bytes((u_char*)contenido.c_str(), contenido.length()));

De esta manera se escriben los datos cifrados en el archivo.

Pasado un rato abro el programa y descifro:

Código (cpp) [Seleccionar]
int main(){
almacen o("C:\\Users\\username\\Desktop\\PRUEBA.txt");
cout << o.leer_descifrado();
}


Me muestra el primer bloque entero, y los demás parcialmente enteros, se come el principio de cada bloque y muestra basura, ¿quizás deba de añadir tras añadir un bloque cifrado al archivo?, nose.

Os dejo este link, donde me he basado para implementar el cifrado AES:

http://snipplr.com/view/83706/aes-encryptiondecryption-demo-program-using-openssl-evp-apis/

Muchas gracias y un saludo, se agradece la ayuda, cualquier cosa que necesitéis la subiré.

Ejemplo de salida descifrada:

CitarFecha: Fri Oct 30 14:19:35 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: hjghjghjgh ║;!=úìõ│¡Ð╣ã830 14:19:37 2015
Proceso: cmd.exe
Pesta±a: C:\WINDOWS\system32\cmd.exe
Contenido: ghjghjghjghÍ 3'KÏü¢sCbÌûhð30 14:19:38 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: ghjghjgh

Como véis el primer bloque está entero, el segundo muesra basura en vez de mostrar "\nFecha: Fri Oct 30 ", así ocurre con el resto de bloques posteriores.

¿Puede ser fallo al escribir y leer? ¿o fallo al cifrar y descifrar?
#72
Programación C/C++ / Error sobre cifrado AES
28 Octubre 2015, 18:44 PM
Buenas, reestructuraré la pregunta:

Utilizo un archivo donde guardo datos, esos datos me interesa que estén cifrados, para ello siempre que escribo algo en el (un grupo de datos) lo cifro antes de escribirlo en él.

Cuando escribo datos paso un tuple<u_char*,int> "bytes", pues AES necesita el tamaño para cifrarlo, lo escribe en el archivo y al final siempre deja un "\0", a veces cuando va a escribir por segunda vez (sobre lo escrito anteriormente) salta un error en ejecución, sobre la línea del ofstream.write : "se produjeron daños en un montón".

Código:

Código (cpp) [Seleccionar]
void almacen::escribir_cifrado(bytes _datos)
{
ofstream archivo;
archivo.open(directorio, ofstream::app | ofstream::binary);
_datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
-> archivo.write((char*)&(get<CONTENIDO>(_datos)[0]), get<TAMAÑO>(_datos));
archivo.close();
}



Aparte al descifrarlo, leo todo el archivo en binario, y lo mando descifrar, pero solo descifra el primer bloque de datos, he mostrado todos los bytes como ints y me cortaba en el primer '\0', he probado a suprimirlos y persiste el problema, ¿que puede ser? ¿dónde está el fallo?.

Código (cpp) [Seleccionar]
string almacen::leer_descifrado()
{
ifstream archivo;
archivo.open(directorio, ifstream::in | ifstream::binary);
archivo.seekg(0, ifstream::end);
streampos tamaño = archivo.tellg();
char *contenido = new char[tamaño]();
archivo.seekg(0, ifstream::beg);
archivo.read(contenido, tamaño);
archivo.close();
string ret = cifrador.desencriptar_AES((u_char*)contenido, tamaño);
delete contenido;
return ret;
}


Una pregunta:

¿Los sucesivos montones de datos que meto cifrados tengo que descifrarlos uno a uno (pues estan separados por \0), o puedo leerlo todo pasarlo a descifrar y ya lo debería de hacer?, ¿ambas funcionan? ¿tengo que descifrar por bloques?. Es AES.

Saludos y gracias.

EDICION DELICATESSE:

Código (cpp) [Seleccionar]
string encriptador_AES::desencriptar_AES(u_char *_entrada, int _tamaño)
{
int p_len = _tamaño, f_len = 0;
u_char *salida = (u_char*)malloc(p_len);
EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL);
EVP_DecryptUpdate(&de, salida, &p_len, _entrada, _tamaño);
EVP_DecryptFinal_ex(&de, salida + p_len, &f_len);
for (int i = 0; i < _tamaño; i++)
cout << salida[i];
return string((char*)salida);
}


Al pasar salida a (char*) en el primer \0 se corta la cadena y por eso mostraba solo el primer bloque, porque al final de cada bloque se añade un \0, solucionado pues era una chorrada, pero costo un poco encontrarla XD.
#73
Seguridad / Duda acerca de claves RSA
27 Octubre 2015, 17:03 PM
Hola, no entiendo la seguridad de las claves publicas/privada.

Supongamos que genero una clave privada como hace facebook.com que va sobre SSL, entonces que tengo que hacer yo para generar una clave pública para facebook.com y poder descifrar los datos del otro extremo, ¿acaso facebook me da una clave pública o la genero yo?, y si es asi ¿como?.

La verdad quiero implementar una red p2p, y para poder hacer actualizaciones sobre la misma necesito una clave RSA y firmar los datos que mande en este caso comandos para que otro no pueda hacerlo sin la clave, ya tengo openssl, pero sigo sin entender como debería hacerlo.

Supongamos que los usuarios tienen clave pública, y yo tengo la privada, entonces yo les mando comandos a ellos, ellos con su clave pública descifran y ven el comando luego lo ejecutan, pero si hacen ingeniería inversa al usuario podrían crearme una clave privada que funcione con las claves públicas del bot no?.

¿Como debería de establecer esa conexión segura insuplantable a no ser que tuvieran mi clave?.

He estado leyendo y buscando pero no me queda claro como se genera la clave pública, quien la manda y como se acepta, pues si otro que no soy yo manda su clave publica y ya tiene su clave privada podría conectarse también.

Saludos, seguiré viendo poco a poco, gracias.
#74
En los medios occidentales no hay nada que hable de esto, me pregunto si será verdad, RT parece afirmar que estados unidos destruyo la central térmica de Alepo y varios transformadores dejando sin luz a 2,5 millones de personas, en la capital del gobierno sirio de Al assad. Vergonzoso.

https://actualidad.rt.com/actualidad/189668-coalicion-eeuu-siria-medios
http://www.diario-octubre.com/?p=19802

Saludos.
#75
Programación C/C++ / Duda acerca de macros
26 Octubre 2015, 11:25 AM
Hola, tengo un archivo de cabecera donde defino numerosas macros para el proyecto, a partir de la directiva de preprocesador #define.

Pero para definir strings no puedo usar la directiva, por ello creo que es mejor usar "extern const string variable_global", pero en un archivo de cabecera no puedo inicializarla.

Entonces surge el problema.

Si la inicializo en otro archivo sea cual sea, quedará inicializada con ese  valor para todos los demás ¿no?.

Si en el main inicializo todas, o a partir de otra función, esa variable queda definida ya para todos los .cpp ¿no?

Saludos y gracias.

Edito: O poner en el archivo header las variables como:

Código (cpp) [Seleccionar]
extern const string str1;
extern const string str2;


Y en el .cpp poner:

Código (cpp) [Seleccionar]
extern const string str1 = "idudifu";
extern const string str2="difaodhfio";


Al compilar el proyecto y añadir el header en todos los .cpp estos podrán usar las macros ya inicializadas no?

Edito: O bueno siempre se puede usar la opción sencilla y mala, de declararlas directamente en el header como string o lo que sean e incluir el header para cada .cpp que lo necesite, en ese caso se compilarán para cada .cpp varias veces (supongo que #define hará lo mismo), pero sería mucho más sencillo.

He probado a declarar el extern y me ha dado 300 fallos not the way.
#76
En plan quiero hacer una función en js que cuando se ejecute mande una cadena de texto como "hola mundo" a un servidor remoto, en este caso a localhost.

¿Se puede hacer? ¿alguna idea?

Buscare mientras.

Gracias y un saludo.

Edito: XD quizás :

Código (javascript) [Seleccionar]
function send(var cadena)
{
url = encodeURI("http://"+ "127.0.0.1" + "/cadena);
$("#selector").load(url);
}


El problema de esto es que quiero que lo mande en plan sockets, porque el servidor se corre en localhost, y es un server en cpp que estoy haciendo y no podrá tomar esta orden... mm ¿como podría mandarle datos?.

El servidor escucha todo lo que se le mande, pero con este método no mandamos cosas al server solo nos conectamos a el y solicitamos un archivo de este..mm
#77
Programación C/C++ / Clase contenedora de bytes
18 Octubre 2015, 17:30 PM
Buenas, necesito escribir en un archivo y busco una clase contenedora de bytes, como por ejemplo podría ser vector<byte>, pero me vendría mejor una clase especializada, al igual que lo es string para cadenas de caracteres.

¿alguno sabe que clase es la que busco o si existe?, me vendría bien con métodos como find() etc.

Un saludo.
#78
Buenas, alguien lo ha instalado y me podría ayudar, ¿que necesito exactamente conseguir?.

Necesito una librería (estática) y que parte del código debería incluir, y ¿no puedo conseguir la librería ya compilada?, ¿porque se necesita una librería para cada versión de MVS?.

Saludos.

Me he bajado de aqui:

http://www.npcglib.org/~stathis/blog/precompiled-openssl/

Las librerias estaticas .lib para visual studio 13 y las he incluido como hice con winpcap, pero da error en los #include dince que no encuentra archivo.

Saludos.

La pregunta es ¿porque tengo que ejecutar un batch para compilarla, ¿porque no la dan ya compilada para la version de visual studio?.

EDICION DELICATESSE: ¡Conseguido!, me baje las compiladas, tenía un error en el directorio de include, era ...\include y tenía ...\include\openssl por eso no me reconocía las cabeceras, era una tontería, aunque sigo preguntandome porque hay varias versiones de compilación para cada MVS XD, no debería de valer una para todos.

Poner la de 32 bits, y librería estática mejor.

Saludos.
#79
La pregunta es, ¿cual de las 2 debería de hacer?

¿En este caso sería indiferente verdad?, puesto que vector<victima> _victimas es fijo, cuando lo paso como parametro reserva memoria en el metodo, y si hago cambios fuera del método no afectan al argumento que he pasado ¿no?, distinto de si fuera un puntero.

Código (cpp) [Seleccionar]
lista_victimas::lista_victimas(vector<victima> _victimas)
{
victimas = _victimas;
//copy(_victimas.begin(), _victimas.end(), back_inserter(victimas));
}


Cuando acaba un método, sus parametros se borran de memoria ¿no?. En este caso, ¿que hago, igualar punteros contenidos o que?.

Código (cpp) [Seleccionar]
void funcion(lista_victimas *_lista)
lista_victimas lista;
//añado miembros.
mvictimas->lock();
_lista = new lista_victimas(lista.obtener_victimas());
mvictimas->unlock();


Ese código , asignaría en _lista otro puntero en la heap, pero que ocurriría con el que ya había.

Si en cambio igualo _lista = &lista; al perderse &lista al salir de la funcion que ocurriría con _lista despues?.

Saludos, estoy algo liado.
#80
La idea es saber si se puede crear una aplicación que actúe como teléfono, ya bien sea creando su propio número o suplantando otro...

Skype permite hacer llamadas a telefonos por internet, hay programas que permiten hacer llamadas de telefono, ¿no se puede crear un servidor que haga de teléfono, capaz de recibir mensajes SMS etc?.

¿es posible de alguna forma?.

Saludos.
#81
Para cuando se de el caso de que un parametro de una función se llame igual que una variable declarada en la función, y no tener que renombrar una de ellas, me vendría bien un this de los de java.

A ver si encuentro algo mientras.

Saludos.

http://stackoverflow.com/questions/6905598/c-equivalent-to-java-this

Código (cpp) [Seleccionar]
void envenenamiento_activo(lista_victimas *lista)
{
lista_victimas *lista;
this->lista = lista;


CitarError: this solo se puede usar en una función miembro no estática.

Si no se puede hacer con una clase static, es como si no se puede hacer para mi código.
#82
Programación C/C++ / La broma del sizeof(mac)
3 Octubre 2015, 13:47 PM
Resulta que al hacer sizeof(mac), obtengo 4 bytes, cuando una mac tiene 6 bytes, uno para cada u_char si no me equivoco.

Código (cpp) [Seleccionar]
u_char *mac_gateway = new u_char[6]();

u_long num_gateway = inet_addr(adaptador->GatewayList.IpAddress.String);


if (num_gateway == INADDR_NONE){
Sleep(REINTENTAR_MITM * 1000);
continue;
}

if (!enviar_arp(adaptador->GatewayList.IpAddress.String,
adaptador->IpAddressList.IpAddress.String, mac_gateway)){
Sleep(REINTENTAR_MITM/2 * 1000);
continue;
}

for (int i = 0; i < 6; i++)
printf("%d=%x ", i,mac_gateway[i]);

system("pause");

for (int i = 0; i < 4; i++)
printf("%d=%x ", i, ip_gateway[i]);
system("pause");
cout << sizeof(mac_gateway) << sizeof(mac_atacante);


Me salen que todas las macs tienen 4 bytes WTF, la ip son 4 bytes, pero las macs no se supone que tienen 6?.

Me he quedado un poco loco con esto. Haber si sabéis algo.

Gracias, un saludo.

Edito: Que broma es esta:

Código (cpp) [Seleccionar]

u_char *mac = new u_char[500]();
cout << sizeof(mac);

Citar4
#83
Redes / Calcular tamaño campos paquete DNS
1 Octubre 2015, 21:10 PM
Hola a todos, necesito hacer 2 cosas con los paquetes dns response.

Primera: modificar todos sus campos de ip, para poder hacer dns spoofing, para ello hay que saber en que posición están los bytes de las ips.

Segunda: obtener el dominio que contienen y la ip real del mismo. Para ello necesito saber donde estan los bytes del dominio y de la ip real.

Con el wireshark he ido probando y es bastante jodido. De momento solo quiero extraer el dominio y la ip que me da el dns response, puede haber más de uno, y cada campo con distintos tamaños (locura).

(C++): En construcción.. A ver quien consigue calcularme el tamaño de cada query y response dns.

Saludos.

Edito: Lo que me rompió los esquemas fueron las "answers", que parecía que siempre tenían 16 bytes, hasta que pumm, había una que incluía el dominio en ella, me refiero al atributo CNAME: ... ,entonces todo se vino abajo. ¿se puede saber si van a incluir el dominio o no? Se puede observar que solo la primera answer lleva el CNAME, las demás no, es como resolver una ecuación de 100 incognitas XD.

Edito: Quizás este proyecto pueda ayudarme:

https://github.com/maurotfilho/dns-spoof/blob/master/dns-spoof.c
#84
Hola, tengo un problema con el MITM, cuando las victimas se van a conectar a mi servidor el servidor recibe la respuesta y reenvia la petición al servidor destino a través de un send(), luego recibe la respuesta de ese servidor y la reenvía la víctima tal cual.

El problema es que cuando haya 30 víctimas ¿como tendré que programar esto?, ¿tendría que crear un subproceso para cada cliente conectado al servidor? ¿sería viable? ¿alguna otra posible solución?.

Os dejo el code, que cambiaríais??.

Código (cpp) [Seleccionar]
while (*on_mitm){

int victima;
sockaddr_in addr;
addr.sin_family = AF_INET;
int len = sizeof(addr);

if ((victima = accept(servidor, (struct sockaddr*)&addr, &len)) == INVALID_SOCKET){
closesocket(victima);
Sleep(100);
continue;
}
else{
cout << "conectadoo";
setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
setsockopt(victima, SOL_SOCKET, SO_SNDTIMEO, (char*)&tiempo_espera, sizeof(timeval));

u_char *ip_victima = new u_char[4]();
u_long num_victima = inet_addr(inet_ntoa(addr.sin_addr));

if (num_victima == INADDR_NONE){
closesocket(victima);
Sleep(100);
break;
}

ip_victima = (u_char*)&num_victima;//busco en la lista ultima.

string respuesta;
char *bloque = new char[3000]();
setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
while (int res = recv(victima, bloque, 3000, 0) > 0)
respuesta += string(bloque);

cout << "recibido";
if (respuesta.length() == 0){
closesocket(victima);
Sleep(100);
break;
}

int cliente;
sockaddr_in cli_local;

cout << respuesta << endl;
respuesta = eliminar_encoding(respuesta, true);
cout << respuesta << endl;

if ((cliente = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
cout << "falla socket" << GetLastError();
Sleep(REINTENTAR_PROXY * 1000);
continue;
}

cli_local.sin_family = AF_INET;
cli_local.sin_port = htons(80);
cli_local.sin_addr.s_addr = inet_addr("217.160.43.9");

if (connect(cliente, (struct sockaddr*)&cli_local, sizeof(cli_local)) == SOCKET_ERROR){
cout << "error conectar" << GetLastError();
closesocket(cliente);
}
else{
if (send(cliente, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR){
cout << "error enviar" << GetLastError();
closesocket(cliente);
}
else{
respuesta = "";
while (recv(cliente, bloque, 3000, 0) > 0)
respuesta += string(bloque);

if (respuesta.length() == 0){
closesocket(cliente);
closesocket(victima);
Sleep(100);
break;
}

cout << "respuesta server: " << respuesta << endl;
respuesta = eliminar_encoding(respuesta, false);
cout << respuesta << endl;

if (send(victima, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR)
cout << "fallo reenvio a cliente " << GetLastError();
else
cout << "se envio al cliente";
}
}
}
Sleep(100);
}


Saludos.
#85
Código (cpp) [Seleccionar]
string respuesta;
char *bloque = new char[3000]();
while (int res = recv(victima, bloque, 3000, 0) > 0)
respuesta += string(bloque);


... mientras que esto es instantáneo? : recv(victima, bloque, 3000, 0);

¿No hay algún timeout para que salga?, o ¿no se puede hacer algo?.

Saludos.
#86
Programación C/C++ / Threads y travesuras en C++
26 Septiembre 2015, 20:31 PM
Hola a todos,

hasta ahora cuando he trabajado con subprocesos he trabajado con async(), pero es lo mismo que un thread o mejor?. Además no son autenticos thread ¿no?.

Lo digo porque cuando programaba en C# y creaba un nuevo thread en el administrador de tareas salían 2 ejecutables con el nombre del programa el normal y el del thread, sin embargo en cpp ¿como se crea un thread así?.

También el mutex me vuelve un poco loco, da muchos errores, la verdad me esta costando trabajar con procesos bastante XD. ¿Dónde lo declaro para que haya uno único para todo el programa.

Simplemente lo necesito para hacer el reescaneo de hosts ya que allí actualizo la lista de victimas, meto mutex actualizo lista y unlock(), y en todas las partes del programa que se accede a la lista lo mismo lock() y unlock() al salir, es horrible.

Saludos.
#87
Hola a todos, tengo una duda sobre clonación de una web, ¿cómo se hace si queremos clonar para 10 victimas distinas?.

La idea es hacer un MITM, después hacer DNS spoofing a todas las víctimas diciendo que al dominio sugerido le corresponde mi IP.

Después tendré que montar un servidor ¿en puerto 80 o puede ser otro puerto?, en el que se conecten las víctimas, ese servidor actuaría de cliente pediría datos a los dominios reales que sugirió la víctima y los devolvería a las víctimas modificados si así lo deseamos.

Pero.. Si hay 10 víctimas, y cada una carga 5 pestañas de varios dominios diferentes ¿que habría que hacer?, ¿puedo hacer que mi servidor a parte de diferenciar a las víctimas que diferencie si cargan para una pestaña u otra?, más o menos.

¿La solución está en montar un servidor en el puerto 80 del atacante?, ¿eso podría clonar páginas para varias víctimas aunque soliciten mismos dominios etc?.

Solo quiero saber si es físicamente posible, antes de entrar a programar.

Saludos.
#88
Hacking / ¿Funciona el DNS spoofing?
22 Septiembre 2015, 18:33 PM
Buenas, lo acabo de implementar y me salen alertas en el navegador de la victima, avisos de cloudfare para páginas normales (raras que he probado unas pocas) y de google si es google.

Seguiré investigando, seguramente se pueda bypassear, justo lo acababa de conseguir y sale esto XDD, me daba error al principio de que era un byte menos en la ip, luego error del checksup udp en el paquete dns que no sabía que existia y lo dejaba igual, luego un error en un for del checksup udp y ya funciona, hace dns req, y mando la dns response falsificada con otra ip para el dominio que solicito, pero salen alertas.

¿Alguien sabe porque? ¿Si ya no funciona? ¿que tipo de seguridad tiene? ¿Y si se puede bypassear?.

Saludos.

Edito:

Error:

Error 1001 DNS resolution error

Me dice que he solicitado una página que está en la red cloudflare. Vaya, todas deben de estar en esa red menos google visto lo visto :/.

Edito:

https://www.cloudflare.com/ddos

Vaya vaya, esto tiene mala pinta, cuando la victima va a la página "facebook.com" con una ip spoofeada "89.212.23.1", pasa por el servidor cloudflare si pertenece a la red de este, entonces cloudflare lo detecta y envía un mensaje de alerta en su lugar.

AAAMIGOS.

Supongo que se podrá hacer bypass creando un servidor http en el atacante y que cuando cargue "facebook.com" le pasamos la ip del atacante, entonces no saldrá fuera del router y no pasará por cloudflare, se conectaría a nosotros creyendo que es facebook, ya solo quedaría tener preparada una página falsa de facebook en nuestro ordenador, que hayamos cargado previamente de la verdadera con peticiones del atacante.

Saludos.

Edito: Bueno, creo que ya se para lo que vale el dns2proxy... seguramente que para esto.
#89
Hola, básicamente quiero que todos los paquetes salientes hacia el router con destino puerto 80 sean redirigidos hacia mí (localhost) y el puerto escogido como por ejemplo el 10000, hacer este comando pero para windows:

iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port <listenPort>

Pero probando con netsh, lo más parecido que encuentro es esto:

netsh interface portproxy add v4tov4 listenport=80 listenaddress=192.168.0.156 connectport=10000 connectaddress=192.168.0.156

Que se supone que redirige los paquetes que van a puerto 80 con destino cualquiera, hacia mi ip en la red, pero a pesar de hacerlo las páginas cargan y tengo conexión luego no redirige puesto que llega al router y salen, ¿que puedo hacer?.

Saludos.

La investigación apunta a: https://social.technet.microsoft.com/Forums/windows/en-US/6be8d1f0-f01b-47cf-beae-4d2cfc9c4111/redirect-all-local-port-80-traffic-to-remote-proxy-server?forum=w7itpronetworking

https://technet.microsoft.com/es-es/library/cc731131(v=ws.10).aspx

Con esto no crea ningún servidor proxy y todas páginas cargan por igual:

set proxy="http=myproxy:80" bypass-list="*.com"

No hay manera.. ¿?

C:\Users\cabra>netsh interface portproxy show all

Escuchar en ipv4:       Conectar a ipv4:

Dirección       Puerto      Dirección       Puerto
--------------- ----------  --------------- ----------
localhost       80          localhost       123


Estoy probando con wireshark filtrando los puertos a los que redirijo y no llega ningun paquete, PUTO WINDOWS! :*****

Recomiendo está página para hacer pruebas:

http://raunomagi.blogspot.com.es/2012/05/port-forwarding-on-windows-computers.html

Interesante, he probado esto:

C:\WINDOWS\system32>netsh interface portproxy add v4tov4 listenport=80 listenaddress=localhost connectport=10000 connectaddress=localhost


C:\WINDOWS\system32>netsh interface portproxy show all

Escuchar en ipv4:       Conectar a ipv4:

Dirección       Puerto      Dirección       Puerto
--------------- ----------  --------------- ----------
localhost       80          localhost       10000


Y al conectar con un cliente en mi puerto 80 funcionaba, lo que hace es establecer un servidor en puerto 80 para conexiones de puerto 10000? Esto no es port fordwarding!, bueno seguiré probando a ver si comprendo un poco más.

.. http://stackoverflow.com/questions/24646165/netsh-port-forwarding-from-local-port-to-local-port-not-working

Todo esto lo que hace es modificar la entrada hacia el pc no la salida, lo que hace crea un server en un puerto escuchando, y redirige a otro puerto, lo que busco es que redirija la salida hacia mi, de manera que no habrá paquetes que salgan hacia el router, pero parece que no es el camino.
#90
Pues eso, he redirigido los paquetes TCP del puerto 80 al puerto 123 (por ejemplo) y ahora quiero leerlos con un socket o no se con qué por eso creo el hilo. Para poder trabajar con ellos y continuar con mi proyecto de hacking etico.

Saludos.