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

USERCENTER

SEARCHSITE

搜索

查看: 2010|回复: 29

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

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

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

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

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

x
一句话木马如,攻击者通过组织好的参数访问木马,就可以让参数中的恶意脚本在服务器端执行。为了防止执行恶意脚本,可以在IIS脚本引擎中拦截EVAL函数来过滤非法请求。以下分析都在windows server 2003 x86下调试:" F- s# o  r7 q8 P" s, ^5 M4 O7 q0 v/ G
w3wp.exe是在IIS(Internet Information Server)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。当需要解析ASP脚本时会加载vbscript.dll,通过IDA搜索vbscript.dll中和“eval”有关的函数,找到7 K7 @& p- j: n5 k( c
view plaincopy to clipboardprint?  c: |$ L  o2 [% u7 q

/ A( a# J5 g4 i4 _- l' I/ P/ @
  • VbsEval(VAR *,int,VAR *) .text 7337da95
    # J- @( {/ ]# s  m. Z! q/ O( e

6 R0 X1 @6 Z8 P. W3 I; ]在windbg中调试发现脚本执行Eval函数时都会调用到VbsEval,见下图:
( n* T5 l3 ~$ S0 K2 nURL:/ [( h. m8 p* |$ ?$ {# f* i6 v% r
localhost/test.asp?MH=1*2test.asp
7 z: P5 o# t" G6 A: f) ~windbg:% O* B/ h. ^  W: U/ {" f4 J7 {
image001.jpg
0 ?, |! e- C$ I, _/ l# r$ X在内存中可以看到eval函数执行的脚本。现在只需要将此脚本与URL中请求参数内容对比,如果内存中执行的EVAL脚本在URL中存在则可以认为是URL请求试图调用一句话木马并执行。如上图截取的底层执行代码为1*2,判断1*2是否在localhost/test.asp?MH=1*2中存在,如果存在则直接返回恶意代码提示,最终效果如下图:! g" i; R  y6 r5 ^5 S- M
image003-300x129.png ; S4 E! N& D7 y3 b' m7 b, K1 E
HOOK住vbscript!VbsEval很容易截取到要执行的脚本,现在的问题是任何脚本执行eval都要调用vbseval函数,那么怎么才能找到当前执行脚本是由哪个URL触发的呢?如果无法取到URL则不能与EVAL中执行脚本对比,过滤是无从谈起的。
0 {5 D7 j% x) T; z' n  L- i现在从vbseval函数往上看整个脚本解释执行的流程!
* ~( v( ^# a" k; h& T1 T% K. @ image005.png asp!CViperAsyncRequest::OnCall断点,堆栈回溯如下:: I: W7 Y# l$ S! k
image007.png
- M5 o# W2 S* L) _0 |' q# B; l5 y可以看出脚本执行eval函数是通过启动线程调用回调函数来触发的。但是下新建线程的API都断不下来,需要换个思路。通过上图可以看到线程启动后最先执行函数是asp.dll里的asp!CViperAsyncRequest::OnCall,查看asp.dll的导出函数如下图: image009-300x61.png ; r% I6 p- w( A) I6 n; M
通过这3个导出函数可以判断asp.dll是ISAPI中的ISA。ISA简介如下:+ `7 W% J: m7 z' P4 h) u; k5 z1 X6 I
ISA(Internet Server Application)也可称为ISAPI DLL,其功能和CGI程序的功能直接相对应
, Q4 Y7 b! B3 H5 z* }- e,使用方法和CGI也类似,由客户端在URL中指定其名称而激活。
3 e; @) L* A. V* U' M4 c4 ]$ r1 tISA和服务器之间的接口主要有两个:GetExtentionVersion( )和HttpExtentionProc( )。任何
* n# o! q. T& ^6 O( N4 |ISA都必须在其PE文件头的引出表中定义这两个引出函数,以供Web服务器在适当的时候调用。! ]8 S. P5 A8 O" F2 H9 A* x; t2 C
ISA大概工作流程如下:! _( ]* |) s8 J. I& m6 @2 k
1、当服务器刚加载ISA时,它会调用ISA提供的GetExtentionVersion( )来获得该ISA所需要的服
: H9 Z, n% ^0 F5 ?务器版本,并与自己的版本相比较,以保证版本兼容。
9 S* y8 t8 V1 y# O# }0 |2、ISA的真正入口是HttpExtentionProc( ),它相当于普通C程序的main( )函数,在这个函数中
% b* ]! H$ x; P! _& ?: X/ W7 J  n根据不同的客户请求作不同的处理。服务器和HttpExtentionProc( )之间是通过扩展控制块(
7 [2 W$ y3 H5 Q2 {- bExtention Control Block)来进行通信的,即ECB中存放入口参数和出口参数,包括服务器提供; n+ m  y) O- `! ^2 B& V8 L
的几个回调函数的入口地址。函数原型如下:: h* ~0 D# ^8 M* |( T& [
view plaincopy to clipboardprint?, u8 r! U4 L' a' b7 ]2 f5 [
( I" t2 Q( K( N9 d  N
  • DWORD HttpExtensionProc( EXTENSION_CONTROL_BLOCK *pECB )+ ?! U4 S5 W1 Z, X

/ {& |, ^9 ?9 D  L" Z& s$ T" ^ECB的结构定义如下(IN表示入口参数,OUT表示出口参数):
- u. g$ O& s+ O- m& nview plaincopy to clipboardprint?
4 @: o+ h  H9 t( @( `+ @2 u
3 z+ c- z4 b3 r; e
  • 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;
    4 }* N7 E) ~; p9 b& }

! q* `% e- E' [: J: e3 d' i8 P在上述ECB中,服务器不但提供了当前HTTP连接的句柄和一些变量,而且提供了4个回调函数给' e4 T& Z5 q/ _$ n. [
ISA调用,从而使ISA可以获得更详尽的信息。
  q( V, |& z: a5 S$ C3 V! Q上述理论看完后直接上调试器看更清楚,每一次URL请求都会经过HttpExtentionProc函数,因此下HttpExtentionProc断点,查看某一次请求中ECB的结构,如下:
( a8 d! R3 ]' s# G  B! { image011.png 1 p! L: t2 z+ b5 S1 u- U, A
从上图可以看出ECB中包含请求参数及脚本的物理路径,识别一句话木马时需要这两项内容。怎么才能在vbscript!VbsEval函数中取到这个ECB的结构。3 t) @- d7 N7 R
跟着Httpexecutionproc函数往下看  C6 N- w" W; `! e; u2 N+ O% l/ |
image013.png
- e0 v. D4 z2 t此时V2的地址是2721e90,内存数据如下:- {6 R# e9 E. R6 M6 R
image015.png
/ {( ]4 h0 F& P5 F0 ^0 E6 T) J在windbg里下vbseval断点,F5继续走断在vbseval,
1 e7 J, @& S5 r% t7 t1 U70dc75c7 8b4624          mov     eax,dword ptr [esi+24h] ds:0023:026a1eb4=02721e90
- \' ^2 [' L% G; {. G7 Z8 m7 a70dc75d4 8945fc          mov     dword ptr [ebp-4],eax ss:0023:0130fd88=00000000
0 @# E' W' k9 A' u image017-300x64.png
1 o8 i2 t5 ^0 d/ w# w堆栈回溯中可以看到在Httpexecutionproc中封装的类基址2721e90在函数asp!CViperAsyncRequest::OnCall中被用到,下asp!CViperAsyncRequest::OnCall断点继续往后跟。8 y9 b' |  y  I7 D
  • 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) l) d8 O& @+ X8 Y+ O3 {0 [
. g# U, b. R+ L' ]3 A
将以上函数设置断点跟踪2721e90位置,最后得到vbseval函数时ECB结构的地址为:
3 a& J. s; F# K* N3 wdda poi(poi(poi(poi(poi(poi(ebp+8)+5c)+5c)+18)+24)+4)
+ b  X6 K! E+ p& h1 w: i$ U! l image019-300x87.png
4 D/ g* Z- I7 n. u* l只需要将VbsEval函数HOOK住就可以截取到请求参数内容。* z# c) z3 `0 m; Z
通过调试找到了想要的数据后就可以动手编码实现拦截框架了。首先要找到vbseval函数的地址,通过特征码定位是个不错的选择,但是在vbseval函数体内并没有合适的特征码,如下图: image021-1024x623.png
8 D0 q) T: Z. R3 n' b6 _下面是sub_7337D95F函数:# R, z4 W1 o8 V7 L1 B$ T1 S# w
image023.png 9 l+ ]* E6 D5 X8 s+ ^
Compile函数原型为:- K+ r- \4 l$ p4 j
view plaincopy to clipboardprint?; Y7 L* J( ]# `3 }/ l; `+ X

( E8 o: l/ _, x2 D3 X8 {1 b
  • 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)
    5 w. w4 g: d( Z0 Y. t) L

2 l/ o- ?" N6 C$ v9 f; t通过调试找到Compile函数内部获取ECB及Eval内容的地址,如下:
1 v) u5 ]# U( P1 S3 ~0 eECB数据地址:, X* R3 x6 g; x/ Y& B! Q
  • dd poi(poi(poi(poi(ecx+5c)+18)+24)+4)
    6 ]: Z5 j1 y6 b( L/ M
% f: g5 e2 v$ H/ W5 p" |! U
image026-300x112.jpg . }& |0 r" o' _
数据地址找完后剩下的就是编码实现拦截,大致思路是创建自己的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″,这样函数可以继续执行而不用担心恶意脚本被执行。
8 [9 g5 _. r! T需要注意的是,在将vbseval欲执行的恶意脚本内容修改成“1”后,当其它请求同一asp页面并且参数合法的情况下,vbseval函数执行的脚本仍是“1”,可能IIS在加载页面时就将脚本缓存在内存中,因此我们将缓存的页面脚本强制修改成“1”,后面再请求同一页面时会继续执行缓存中的脚本,解决办法是在HOOK函数结尾将asp文件中追加空格等无效字符串,这样IIS去动态更新脚本缓存。
- h  P- [: B$ Z/ y8 `- ^另:x64平台下iis启动的都是32位的w3wp.exe,因此此过滤URL方法在x86、x64平台均可使用。* k2 `% G( r2 z+ x3 g1 T
最后效果图:
9 {- U, O1 i  v0 h非法情况:
  G. T' R& z2 |! J0 l. l- [. \( p image031-300x108.png
: m% G7 ^8 v/ z5 M. F6 o# t2 D/ _& U' @
正常情况:
# X) k5 z; D6 V9 L. t image033-300x113.png
% P: f9 M) I( Y4 q( ~+ J$ u5 ]5 ], p& c" P
x
文章来源:华域联盟

 

                                                  




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

帖子的最近访客

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

使用道具 举报

发表于 2016-6-27 23:38:22 | 显示全部楼层
看过必回,人品超好!
! c1 F1 T) D3 b9 }2 p  c$ I( _- c. I9 f5 j( V: y7 `
3 F# T% R+ A  u2 h; f4 N  f

  m: U* W7 V7 p! T: h
8 B4 H7 ~6 P( g8 R% S6 h6 i: t4 A
- V# Q& P# s0 N
  y, i2 z9 c! @5 F% w) O3 i+ R3 f2 q

# G3 B0 R0 w1 j4 f: x6 w+ T
- C* h9 |& H+ e! J+ ~: e9 c0 d  A+ N2 N. |: ~7 q& ^
4 n8 o9 t- D8 u, A# z
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />
5 t8 N& ?2 p( t2 f                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图

8 c6 G9 k0 E9 m: h5 [+ f: u
, f5 g; H# i+ _' j9 X( bhttp://1jvx1.900090004.com/forum.php?mod=viewthread&tid=162549
! ?- b. W! X3 o1 v& Nhttp://www.coah.loan/forum.php?mod=viewthread&tid=162550
7 u. f; x9 F2 Bhttp://www.youjie100.com/forum.php?mod=viewthread&tid=538379, |1 j) i" V  E" A3 e5 m; z0 l
http://rxjav6df.host.iisz.cn/forum.php?mod=viewthread&tid=759411
6 x% g% m% a! J% r2 Nhttp://www.jyrmw.com/forum.php?mod=viewthread&tid=173639 T7 p0 H6 e6 X; n! ]- s( W2 c( d
http://www.xiac8.com/forum.php?mod=viewthread&tid=18587) ~1 r# q- K' |% ^9 e1 y) M
http://www.slsjy.net/forum.php?mod=viewthread&tid=16186
% \* |; j, Z8 ]1 a. p' q) bhttp://www.023jzb.com/thread-64958-1-1.html  `- ^6 n4 [( Y: S9 Y& ~
http://www.vlibang.com/forum.php?mod=viewthread&tid=150140 H. D' O) r5 x6 D9 X# K- b
http://bbs.sy002.com/thread-60467-1-1.html
. M. B$ S8 ~0 ^5 ]8 Ohttp://www.shaokaoliao.com/forum.php?mod=viewthread&tid=46006
. T! U% }" p; a3 R+ p, ^http://monizhuan.com/thread-15912-1-1.html
, x6 |1 \8 o% b) jhttp://www.cn-jt.net/bbs/forum.php?mod=viewthread&tid=155584
6 N+ F  {/ d+ O' B1 Z( Chttp://www.xiaojiebai.com/forum.php?mod=viewthread&tid=16821
( G/ I  }2 r9 p- C+ ]http://www.traveldangan.com/forum.php?mod=viewthread&tid=24319
% E4 P  W/ R/ m  R  G/ W  [( jhttp://cd-zjg.com/forum.php?mod=viewthread&tid=736365 X" `2 P2 T: a9 _: J: ?
http://www.4srepair.com/forum.php?mod=viewthread&tid=429547
1 a. X( ]( Q) \: b' ohttp://www.wsvrk.com/forum.php?mod=viewthread&tid=12212
! X& D' ^0 C  ~& _+ f  z: w! ihttp://www.zzsyahz.com/forum.php?mod=viewthread&tid=15311+ K. n9 x3 `. _, o
http://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 | 显示全部楼层
继续关注一下这方面的信息/ z3 O5 v- a( x! j6 U  V
1 d0 _- p2 b+ d" J
0 F8 a% f3 D* \$ E9 p  U

8 ?( Y- u) Z$ p. ~
% i- s5 z* ]- T7 |( w* C% D  G: X  {3 m& D
. T# L& v1 T: k9 f: h5 T8 `8 m
% F- c# K% s" l8 [  o4 o; j

4 Z# T6 F" S" z+ A( y
5 @7 K; U! v" R* @1 ?( \5 k( ~, W- s: m& e8 d6 |# ^$ z
% J! d. c; O8 i9 a. r) D& h# _
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />
. \. I! w& d' s' A5 X- r( _                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图
* `% C+ j7 n. E1 a9 [! Y

' k$ {' t' N! g! L! ~白癜风医院在哪
9 g& }* s/ h8 w, m- j4 u白芍总苷胶囊治疗白癜风吗
6 G( |7 ?: [* z肢端型白癜风症状图片
7 a" x: J5 l& s6 `+ X5 `白癜风怎么治疗问答
  X- E+ |  a! i他克莫司软膏治疗面部白癜风
3 ?6 X  R5 R6 p$ [! N7 l小孩癫痫能否根治
2 k( ?8 m+ U- F( m  I# e# s成人癫痫的治疗
$ @' ]3 P8 F1 t控制癫痫的药物- Y& m3 j. H8 t! b" M/ t
寻常型白癜风症状
3 d% t0 ]+ j4 x有没有白癜风自我检查的仪器
' L& U  L% E% R- C- x+ z" Q儿童白癜风的治疗
$ P" \) h1 b! j1 |. @& ^; \  t中国式骗局. M! G) }7 f( K- S6 E: `0 w
儿童白癜风吃药多久5 u9 s1 T4 n. K1 d$ J
中西医结合治疗白癜风+ m# l+ }1 [6 F0 Z, f
癫痫病的症状
0 h" M/ D) W7 _2 ?& V3 s+ C白癜风什么症状
# |6 U8 t" U, h, l2岁宝白癜风怎样治疗; y- f  a/ m: U
扩散性白癜风的危害
' Q! e  ]' T3 [* N1 g  ]- g& @治疗癫痫最好的医院
; O2 _" k; Z. Q7 z+ ]% L6 O0 ]全国最好的癫痫医院

GMT+8, 2017-11-22 19:05 , Processed in 0.281250 second(s), 55 queries .

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

备案号: 蒙ICP备17000689号-2                                                                                                                                                                    

快速回复 返回列表