ASP下一句话木马的动态拦截技术
华域联盟
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1897|回复: 29

ASP下一句话木马的动态拦截技术

  [复制链接]
发表于 2016-6-7 23:26:51 | 显示全部楼层 |阅读模式

【CHU】
信息来源: 华域联盟(www.cnhackhy.com)

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一句话木马如,攻击者通过组织好的参数访问木马,就可以让参数中的恶意脚本在服务器端执行。为了防止执行恶意脚本,可以在IIS脚本引擎中拦截EVAL函数来过滤非法请求。以下分析都在windows server 2003 x86下调试:
2 Y; Y; D/ @7 q/ G0 G: Q% Pw3wp.exe是在IIS(Internet Information Server)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。当需要解析ASP脚本时会加载vbscript.dll,通过IDA搜索vbscript.dll中和“eval”有关的函数,找到
6 m% j5 `& l9 ?% m) oview plaincopy to clipboardprint?1 r$ w$ m- G) [
4 i2 b0 B2 O1 A5 G+ U
  • VbsEval(VAR *,int,VAR *) .text 7337da95
    - _" s. U  H9 n8 g$ E5 P) o

# N. s/ @* }! u' k+ f  s在windbg中调试发现脚本执行Eval函数时都会调用到VbsEval,见下图:
7 o4 C  e/ m! lURL:4 u/ `% X0 P4 |- W5 E: }
localhost/test.asp?MH=1*2test.asp5 {& G: E9 i1 u# z, o
windbg:, U) O2 j; ]; }/ v3 T! `$ S
image001.jpg
: K* m! o: O4 R, o4 x* Q在内存中可以看到eval函数执行的脚本。现在只需要将此脚本与URL中请求参数内容对比,如果内存中执行的EVAL脚本在URL中存在则可以认为是URL请求试图调用一句话木马并执行。如上图截取的底层执行代码为1*2,判断1*2是否在localhost/test.asp?MH=1*2中存在,如果存在则直接返回恶意代码提示,最终效果如下图:& c6 Y! b' n1 B/ b+ f4 m* W
image003-300x129.png
# Q8 u6 z% x4 ?% lHOOK住vbscript!VbsEval很容易截取到要执行的脚本,现在的问题是任何脚本执行eval都要调用vbseval函数,那么怎么才能找到当前执行脚本是由哪个URL触发的呢?如果无法取到URL则不能与EVAL中执行脚本对比,过滤是无从谈起的。
* [3 X0 ?; P5 }0 c! u/ @现在从vbseval函数往上看整个脚本解释执行的流程!# O( m: c3 Z0 `! I& U! `
image005.png asp!CViperAsyncRequest::OnCall断点,堆栈回溯如下:
+ r8 w  e/ w1 V$ s# C9 x+ J/ k7 J$ a4 R image007.png
( B, _' P$ b8 F9 Y1 B' x4 r' k8 A可以看出脚本执行eval函数是通过启动线程调用回调函数来触发的。但是下新建线程的API都断不下来,需要换个思路。通过上图可以看到线程启动后最先执行函数是asp.dll里的asp!CViperAsyncRequest::OnCall,查看asp.dll的导出函数如下图: image009-300x61.png . h  y& d4 Q& L) I
通过这3个导出函数可以判断asp.dll是ISAPI中的ISA。ISA简介如下:  U! K9 ~6 ?# q* k- h* y7 @( K) r
ISA(Internet Server Application)也可称为ISAPI DLL,其功能和CGI程序的功能直接相对应  H6 J1 h- U& @' u) _* n+ l
,使用方法和CGI也类似,由客户端在URL中指定其名称而激活。! n* a# o' {0 t+ J8 M! A
ISA和服务器之间的接口主要有两个:GetExtentionVersion( )和HttpExtentionProc( )。任何/ P/ U. w: ~: w0 T" |1 N
ISA都必须在其PE文件头的引出表中定义这两个引出函数,以供Web服务器在适当的时候调用。0 w# k- t' ?; A; c" e; S% q
ISA大概工作流程如下:8 p: R% Y/ @5 W6 k. i
1、当服务器刚加载ISA时,它会调用ISA提供的GetExtentionVersion( )来获得该ISA所需要的服' j3 O  O: p  _2 H
务器版本,并与自己的版本相比较,以保证版本兼容。
$ w0 ^& R3 U' v' X0 n* b8 ]9 \2、ISA的真正入口是HttpExtentionProc( ),它相当于普通C程序的main( )函数,在这个函数中
. I; W9 D4 H! o3 D% E% ~: v: o& s: p根据不同的客户请求作不同的处理。服务器和HttpExtentionProc( )之间是通过扩展控制块(
& @" J' a$ Q8 ?  ~5 C, R6 DExtention Control Block)来进行通信的,即ECB中存放入口参数和出口参数,包括服务器提供
# y# v( p! @2 W8 T的几个回调函数的入口地址。函数原型如下:
. x1 Q1 A0 Y, i- vview plaincopy to clipboardprint?
2 d" ~( @5 b/ Y+ E7 Z" `1 K; C$ {, ]8 S" Q- l% i
  • DWORD HttpExtensionProc( EXTENSION_CONTROL_BLOCK *pECB )
    ( i% P6 W6 H! K/ v' k7 H1 m
8 I! O5 a6 C  S. ?# b3 T0 w
ECB的结构定义如下(IN表示入口参数,OUT表示出口参数):9 [' [9 K4 J. w1 p9 a
view plaincopy to clipboardprint?* g: h0 a4 J' Y1 V

( o6 S" Z' W. z1 ?
  • typedef struct _EXTENSION_CONTROL_BLOCK
  • {
  •    DWORD     cbSize;        //IN,本结构的大小,只读
  •    DWORD     dwVersion      //IN,版本号,高16位为主版本号,低16位为次版本号
  •    HCONN     ConnID;        //IN,连接句柄,由服务器分配,ISA只能读取该值
  •    DWORD     dwHttpStatusCode;                 //OUT,当前完成的事务状态
  •    CHAR      lpszLogData[HSE_LOG_BUFFER_LEN];  //OUT,需要写入到日志文件中的内容
  •    LPSTR     lpszMethod;    //IN,等价于CGI的环境变量REQUEST_METHOD
  •    LPSTR     lpszQueryString;                  //IN,等价于环境变量QUERY_STRING
  •    LPSTR     lpszPathInfo;                     //IN,等价于环境变量PATH_INFO
  •    LPSTR     lpszPathTranslated;               //IN,等价于环境变量PATH_TRANSLATED
  •    DWORD     cbTotalBytes;                     //IN,等价于环境变量CONTENT_LENGTH
  •    DWORD     cbAvailable;                      //IN,缓冲区中的可用字节数
  •    LPBYTE    lpbData;                          //IN,缓冲区指针,指向客户端发来的数据
  •    LPSTR     lpszContentType;                  //IN,等价于环境变量CONTENT_TYPE
  • //回调函数,用于返回服务器的连接信息或特定的服务器详细情况
  •    BOOL ( WINAPI * GetServerVariable )
  •       ( HCONN       hConn,
  •        LPSTR       lpszVariableName,
  •        LPVOID      lpvBuffer,
  •        LPDWORD     lpdwSize );
  •    BOOL ( WINAPI * WriteClient )      //回调函数,从客户端的HTTP请求中读取数据
  •       ( HCONN      ConnID,
  •       LPVOID     Buffer,
  •       LPDWORD    lpdwBytes,
  •       DWORD      dwReserved );
  •    BOOL ( WINAPI * ReadClient )       //回调函数,向客户端发送数据
  •       ( HCONN      ConnID,
  •       LPVOID     lpvBuffer,
  •       LPDWORD    lpdwSize );
  •    BOOL ( WINAPI * ServerSupportFunction )  //回调函数,访问服务器的一般和特定功能
  •       ( HCONN      hConn,
  •       DWORD      dwHSERRequest,
  •       LPVOID     lpvBuffer,
  •       LPDWORD    lpdwSize,
  •       LPDWORD    lpdwDataType );
  • } EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;
    % @3 X: J" h5 h# n

- i8 m. }  j  S# M在上述ECB中,服务器不但提供了当前HTTP连接的句柄和一些变量,而且提供了4个回调函数给
9 ^9 R8 x# x* \4 S( tISA调用,从而使ISA可以获得更详尽的信息。# S" {5 s; u& \) Z
上述理论看完后直接上调试器看更清楚,每一次URL请求都会经过HttpExtentionProc函数,因此下HttpExtentionProc断点,查看某一次请求中ECB的结构,如下:
* e1 m! e# l5 x3 x( F* a* G image011.png / E8 B. G; v3 p! J# S
从上图可以看出ECB中包含请求参数及脚本的物理路径,识别一句话木马时需要这两项内容。怎么才能在vbscript!VbsEval函数中取到这个ECB的结构。3 ~- Z! i- X+ G4 d; \
跟着Httpexecutionproc函数往下看4 i% G( u' E; b
image013.png $ l5 i( t& ^# e6 h
此时V2的地址是2721e90,内存数据如下:# @, A( [! Q/ t5 G$ I9 H5 `
image015.png
) e4 G( Q6 ~3 D3 W, R1 E在windbg里下vbseval断点,F5继续走断在vbseval,8 {# s* j0 N  C! w
70dc75c7 8b4624          mov     eax,dword ptr [esi+24h] ds:0023:026a1eb4=02721e90( w' F9 N9 i0 c& @* x: N
70dc75d4 8945fc          mov     dword ptr [ebp-4],eax ss:0023:0130fd88=000000008 u. L/ Z* H$ e) B6 \( c
image017-300x64.png , T- N# t- P: F2 S* h; w
堆栈回溯中可以看到在Httpexecutionproc中封装的类基址2721e90在函数asp!CViperAsyncRequest::OnCall中被用到,下asp!CViperAsyncRequest::OnCall断点继续往后跟。
. f. L( w* f. Z& F" B
  • ChildEBP RetAddr
  • 0309f560 73333f1c vbscript!VbsEval
  • 0309f574 733365d7 vbscript!StaticEntryPoint::Call+0x11
  • 0309f848 733333e0 vbscript!CScriptRuntime::Run+0x1f08
  • 0309f940 733337d1 vbscript!CScriptEntryPoint::Call+0x5c
  • 0309f998 73333b9c vbscript!CSession::Execute+0xb4
  • 0309f9e8 73331849 vbscript!COleScript::ExecutePendingScripts+0x13e
  • 0309fa04 70dc2ada vbscript!COleScript::SetScriptState+0x150
  • 0309fa30 70dc2a9c asp!CActiveScriptEngine::TryCall+0x19
  • 0309fa6c 70dc26d0 asp!CActiveScriptEngine::Call+0x31
  • 0309fa88 70dc25d4 asp!CallScriptFunctionOfEngine+0x5b
  • 0309fadc 70dc24ff asp!ExecuteRequest+0x17e
  • 0309fb44 70dc23f7 asp!Execute+0x249
  • 0309fb98 70dc2753 asp!CHitObj::ViperAsyncCallback+0x3f3
  • 0309fbb4 4a1db5ea asp!CViperAsyncRequest::OnCall+0x92  ;脚本引擎函数执行起始位置
  • 0309fbd0 77560d30 comsvcs!CSTAActivityWork::STAActivityWorkHelper+0x32
  • 0309fc1c 775617dc ole32!EnterForCallback+0xc4
  • 0309fd7c 775303b4 ole32!SwitchForCallback+0x1a3
  • 0309fda8 774dc194 ole32!PerformCallback+0x54
  • 0309fe40 7756433a ole32!CObjectContext::InternalContextCallback+0x159
  • 0309fe60 4a1db78c ole32!CObjectContext:undefinedoCallback+0x1c
    & s+ V. u7 O( I3 R$ a" o

% Q0 j; e% `4 Q将以上函数设置断点跟踪2721e90位置,最后得到vbseval函数时ECB结构的地址为:
5 }' R+ J4 B6 Y7 sdda poi(poi(poi(poi(poi(poi(ebp+8)+5c)+5c)+18)+24)+4)
; A, H" z# t$ m- J$ U6 V image019-300x87.png
, Z# }9 x4 G. e7 x4 L$ [8 s只需要将VbsEval函数HOOK住就可以截取到请求参数内容。# T# y) n9 p$ {) K& N- e/ q
通过调试找到了想要的数据后就可以动手编码实现拦截框架了。首先要找到vbseval函数的地址,通过特征码定位是个不错的选择,但是在vbseval函数体内并没有合适的特征码,如下图: image021-1024x623.png
& U5 ~; \3 z- X9 S/ ?1 L/ g2 ]下面是sub_7337D95F函数:$ d% T, L3 Y, o
image023.png ) o1 h! s" M0 a8 u, Y3 f
Compile函数原型为:
& m3 c. J3 z0 T! d- dview plaincopy to clipboardprint?% @7 r, v$ D0 u. H* X+ k! A+ R+ R
5 O4 G3 z$ e# ^$ r0 X4 \( ?. O
  • unsigned int __thiscall COleScript::Compile(void *this, int a2, const OLECHAR *psz, int a4, int a5, UINT len, int a7, int a8, int a9, int a10)- h& C2 X* c: \

1 q- b4 L( K$ q9 F( v通过调试找到Compile函数内部获取ECB及Eval内容的地址,如下:- l- n+ P" n6 K
ECB数据地址:
, `1 A$ y1 r9 V& V
  • dd poi(poi(poi(poi(ecx+5c)+18)+24)+4)
    9 ~" y% ]  s: O8 ?- m/ b: B

2 f0 \( a* [1 N image026-300x112.jpg ; y- o" [" S) v! }: b8 V
数据地址找完后剩下的就是编码实现拦截,大致思路是创建自己的ISAPI,在加载时将vbscript.dll提前加载到进程(这样可以加载完vbscript.dll后HOOK住vbseval函数,默认情况下vbscript.dll只有在访问asp页面时才会加载)。然后通过在整个内存中查找“eval code”来定位COlescript!Compile函数地址,将找到的函数地址HOOK住,在新函数中使用上面分析的地址获得相应的值。因为调用COlescript!Compile的函数不止vbseval一个,但是可以通过”eval code”来判断,只有vbseval函数会调用COlescript!Compile函数传递”eval code”字符串变量。因此先判断调用COlescript!Compile传递的参数是不是eval code,如果是则继续判断ECB结构中的请求参数(本例中“MH=1*2”)字符串是否包含VbsEval函数中要执行的脚本(本例中“1*2”),如果包含了则是非法操作,调用ECB中回调函数writeclient向浏览器输出“URL中包含EVAL脚本”等信息,最后要中断COlescript!Compile函数以防止脚本引擎继续执行恶意脚本。中断执行脚本可以将执行的脚本如”1*2″修改为”1″,这样函数可以继续执行而不用担心恶意脚本被执行。
* E/ I$ P' E' z+ L+ E需要注意的是,在将vbseval欲执行的恶意脚本内容修改成“1”后,当其它请求同一asp页面并且参数合法的情况下,vbseval函数执行的脚本仍是“1”,可能IIS在加载页面时就将脚本缓存在内存中,因此我们将缓存的页面脚本强制修改成“1”,后面再请求同一页面时会继续执行缓存中的脚本,解决办法是在HOOK函数结尾将asp文件中追加空格等无效字符串,这样IIS去动态更新脚本缓存。
, s$ f4 d' X0 n: p+ N$ A; S2 W另:x64平台下iis启动的都是32位的w3wp.exe,因此此过滤URL方法在x86、x64平台均可使用。! n7 H& D0 ?! j- i4 S
最后效果图:
- o; [& a8 r  H" A# o8 H非法情况:" q& [6 X+ _" s3 ]+ x5 p$ D
image031-300x108.png 2 N8 p; J; ~' Q& P) T

: T/ I3 a! `+ Y$ V: v正常情况:* ]; R& k( M5 J9 b5 A+ w" U( c; r
image033-300x113.png * O: N. {5 p% \: }, ^" x9 I! f

  ^/ F0 e# I6 e4 X# h0 _7 r8 X! Hx
文章来源:华域联盟

 

                                                  




上一篇:用Webshell直接杀入内网
下一篇:全方位绕过安全狗

帖子的最近访客

回复 百度谷歌雅虎搜狗搜搜有道360奇虎 天涯海角搜一下: 百度 谷歌 360 搜狗 搜搜 有道 谷粉 雅虎 必应 即刻

使用道具 举报

发表于 2016-6-27 23:38:22 | 显示全部楼层
看过必回,人品超好!" `/ x1 c2 e' g% A* B

; I7 R" V7 y7 |+ H) t8 n: _0 `9 m4 a- K5 c7 l, a

% T' Z# [# s  k0 u5 [9 o9 s9 E, u! W0 L  z. Z& c# ^! h
2 l& x4 G5 i: R/ d
+ R7 E! ~" R) V
" j3 p" \, V# c
' s) C; M  e( }; k0 Y  z5 p( b; J

/ J6 j2 ]3 Y2 w, b; i7 x% n
; `/ {: r* j" M+ R' A+ n( I) |* t' l
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />
* F/ g6 h( M5 z2 j' ^6 r7 F8 Y                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图

6 h% T+ O- V; e# p5 O
( a# L, [' Y; \+ b- N0 K8 dhttp://1jvx1.900090004.com/forum.php?mod=viewthread&tid=162549
4 D& j9 q1 ?/ U, ~  }4 nhttp://www.coah.loan/forum.php?mod=viewthread&tid=162550* n4 w, {# [% k) r* b0 e1 \
http://www.youjie100.com/forum.php?mod=viewthread&tid=538379
3 y- ^$ i' y, `+ I, t  ]http://rxjav6df.host.iisz.cn/forum.php?mod=viewthread&tid=759411
3 |2 [. s) {) q) S, n; I# K' H; V% J3 ahttp://www.jyrmw.com/forum.php?mod=viewthread&tid=17363
1 I* {+ T+ P  B1 @! q0 Fhttp://www.xiac8.com/forum.php?mod=viewthread&tid=18587% Y+ x8 W, i( M9 f% J
http://www.slsjy.net/forum.php?mod=viewthread&tid=16186
$ c4 c* n: m1 b1 _+ X" Qhttp://www.023jzb.com/thread-64958-1-1.html
/ ]$ Q" Q; Y/ Jhttp://www.vlibang.com/forum.php?mod=viewthread&tid=15014  M  f" F/ o" }% W
http://bbs.sy002.com/thread-60467-1-1.html
1 Y; c5 K* N4 v  B* hhttp://www.shaokaoliao.com/forum.php?mod=viewthread&tid=46006; Q& O  ~. U3 _% q( z$ q
http://monizhuan.com/thread-15912-1-1.html
& w% B, P2 @1 Mhttp://www.cn-jt.net/bbs/forum.php?mod=viewthread&tid=155584" M3 \' l% _, ~' q
http://www.xiaojiebai.com/forum.php?mod=viewthread&tid=16821
. n+ J" ]7 P! V6 @: ghttp://www.traveldangan.com/forum.php?mod=viewthread&tid=24319( ~0 `; U! M- O
http://cd-zjg.com/forum.php?mod=viewthread&tid=73636
2 y) _. V8 e  d/ Q' X; Whttp://www.4srepair.com/forum.php?mod=viewthread&tid=429547* l' M* q2 l3 g
http://www.wsvrk.com/forum.php?mod=viewthread&tid=12212
" S5 d: q% p5 e- p. R. D- o$ P: |! t3 thttp://www.zzsyahz.com/forum.php?mod=viewthread&tid=15311
$ e0 L8 C$ p$ D) jhttp://www.xxzutie.com/forum.php?mod=viewthread&tid=11973
kanguuyo 该用户已被删除
发表于 2016-6-10 08:56:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
花传贺 该用户已被删除
发表于 2016-6-25 09:56:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 该用户已被删除
发表于 2016-6-25 10:24:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
登洲远 该用户已被删除
发表于 2016-6-25 20:57:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 该用户已被删除
发表于 2016-6-25 20:58:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
{防腐钢管} 该用户已被删除
发表于 2016-6-25 21:16:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
潮务点 该用户已被删除
发表于 2016-6-25 21:30:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
广翠宪 该用户已被删除
发表于 2016-6-25 21:51:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2016-6-26 23:26:17 | 显示全部楼层
继续关注一下这方面的信息5 S) v/ V' z2 A* ~- f5 C- O) A

* D& a3 \9 o5 O0 t, P0 |8 J' o. A0 d$ P
. y2 B7 k& h$ u+ a

3 r4 F5 Y( _% |% }1 z) ?7 `" L  }5 h6 m7 |
$ N# b; P; S0 }9 b# x- h

' `9 E" {' C+ y6 q- U6 c) K; m
7 W9 g, l0 |! y1 t, v) C: d6 u6 E; n. ]4 b# m
# T$ j# e, U5 _& }% C/ h

, B9 N1 v8 @0 y* `9 ^. |7 p  A  h/ a# ?$ q
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />( M% E8 ~! Q5 g1 ^! I
                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图

( K  V; L! t/ e/ H) f+ F: p
  q5 S, {1 g$ u$ o+ s白癜风医院在哪
) b/ N# K/ o) Q% n( [# r( i白芍总苷胶囊治疗白癜风吗
5 \/ e8 E' c! q肢端型白癜风症状图片
" S- N2 u: h$ Q3 ~, S; ^: T白癜风怎么治疗问答% V7 `  m. @! Z
他克莫司软膏治疗面部白癜风
) M5 a1 E/ _; V9 `# C% |# Z小孩癫痫能否根治% D8 q- p6 j4 E- ^2 h* A
成人癫痫的治疗# c3 U* \, d/ m8 Q2 b1 A
控制癫痫的药物+ A* R# a3 [  `& h
寻常型白癜风症状. G# {  R, i/ G; a
有没有白癜风自我检查的仪器
$ K4 {, E( ]' V8 j8 s儿童白癜风的治疗
, ]+ h- \8 M8 N2 `1 @8 S( @中国式骗局
! A6 E( q8 r& k. v: `) j儿童白癜风吃药多久- K# S0 ]8 a) t' X- w  V
中西医结合治疗白癜风
! Q* F# X6 |" `1 B癫痫病的症状
5 B% ^2 [% w. _  ]& A# {白癜风什么症状
7 N8 w/ r' n; Y  i9 l0 ^2岁宝白癜风怎样治疗# U2 p! A/ [1 l5 P  c& ^3 F+ ~  j
扩散性白癜风的危害
: D1 z# `; |9 Y治疗癫痫最好的医院. Z# Q# C) N: i" ?& l
全国最好的癫痫医院

GMT+8, 2017-9-22 21:43 , Processed in 0.328125 second(s), 54 queries .

© 2020 华域联盟 | 蒙公网安备 15062202000105号 版权删帖举报人口

备案号: 蒙ICP备17000689号-2                                                                                                                                                                    

快速回复 返回列表