• 设为首页
  • 点击收藏
  • 手机APP
    手机扫一扫下载
    华域联盟APP
  • 关注官方公众号
    微信扫一扫关注
    华域联盟公众号
hotWEB访问日志自动化剖析浅谈

1.概略最近经常需求剖析WEB访问日志,从中发现非法央求,然后做相应安全检查,为了便当,所以写了一个日志 详情

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

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

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

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

x
一句话木马如,攻击者通过组织好的参数访问木马,就可以让参数中的恶意脚本在服务器端执行。为了防止执行恶意脚本,可以在IIS脚本引擎中拦截EVAL函数来过滤非法请求。以下分析都在windows server 2003 x86下调试:
) K# @/ X: r7 w- z( \" r" vw3wp.exe是在IIS(Internet Information Server)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行。当需要解析ASP脚本时会加载vbscript.dll,通过IDA搜索vbscript.dll中和“eval”有关的函数,找到) R3 C+ f3 R9 b& W8 ]  p
view plaincopy to clipboardprint?
1 p$ E* I! N0 {! f3 a- T; W
: u! \% |5 Q& L9 O
  • VbsEval(VAR *,int,VAR *) .text 7337da95
    + W3 a9 y: i+ h; p. Y  ^7 j+ y

$ ]8 p0 r; N. [( |; n; L' O* @在windbg中调试发现脚本执行Eval函数时都会调用到VbsEval,见下图:2 a2 J3 [1 [9 l; c% R
URL:
: L" x1 e% V: I+ nlocalhost/test.asp?MH=1*2test.asp
: u  V* U' a3 _+ {7 owindbg:0 G4 ?& c4 _" I/ W1 d# S' ]8 O* z. P
image001.jpg
' u6 a' j( A7 b. ?# R$ K6 b6 s+ `在内存中可以看到eval函数执行的脚本。现在只需要将此脚本与URL中请求参数内容对比,如果内存中执行的EVAL脚本在URL中存在则可以认为是URL请求试图调用一句话木马并执行。如上图截取的底层执行代码为1*2,判断1*2是否在localhost/test.asp?MH=1*2中存在,如果存在则直接返回恶意代码提示,最终效果如下图:
4 p6 Y4 w% e+ |8 I image003-300x129.png 5 R) w9 }: Q  p% Z5 T$ u- N! c- \1 H- a
HOOK住vbscript!VbsEval很容易截取到要执行的脚本,现在的问题是任何脚本执行eval都要调用vbseval函数,那么怎么才能找到当前执行脚本是由哪个URL触发的呢?如果无法取到URL则不能与EVAL中执行脚本对比,过滤是无从谈起的。, k0 g/ M. Q# \
现在从vbseval函数往上看整个脚本解释执行的流程!
9 L. E1 B2 k4 D7 M$ |- q image005.png asp!CViperAsyncRequest::OnCall断点,堆栈回溯如下:* |3 V/ `( B2 r* j$ K7 q; e4 {/ l
image007.png 4 k4 R+ u: \/ Q3 R0 h5 K
可以看出脚本执行eval函数是通过启动线程调用回调函数来触发的。但是下新建线程的API都断不下来,需要换个思路。通过上图可以看到线程启动后最先执行函数是asp.dll里的asp!CViperAsyncRequest::OnCall,查看asp.dll的导出函数如下图: image009-300x61.png
' c* I4 W% C) W% J0 z8 u0 I通过这3个导出函数可以判断asp.dll是ISAPI中的ISA。ISA简介如下:
5 e4 z- d7 E! V! z1 WISA(Internet Server Application)也可称为ISAPI DLL,其功能和CGI程序的功能直接相对应) B! y' m7 p1 o& \7 J, Y/ Z
,使用方法和CGI也类似,由客户端在URL中指定其名称而激活。
* j8 F2 u. [# y) B- A# j1 d, _ISA和服务器之间的接口主要有两个:GetExtentionVersion( )和HttpExtentionProc( )。任何
4 j- {& W$ e. u1 K1 N) i8 z$ JISA都必须在其PE文件头的引出表中定义这两个引出函数,以供Web服务器在适当的时候调用。
* I% e6 m6 z: pISA大概工作流程如下:7 J. s  Y1 O" I( }8 g
1、当服务器刚加载ISA时,它会调用ISA提供的GetExtentionVersion( )来获得该ISA所需要的服
( A$ x" D) T0 {务器版本,并与自己的版本相比较,以保证版本兼容。
, h& ~2 c- F1 x, D$ i7 L2、ISA的真正入口是HttpExtentionProc( ),它相当于普通C程序的main( )函数,在这个函数中- i7 V( u2 A* ~9 X- g7 w
根据不同的客户请求作不同的处理。服务器和HttpExtentionProc( )之间是通过扩展控制块(
' C" ^, P, M& ^6 m- CExtention Control Block)来进行通信的,即ECB中存放入口参数和出口参数,包括服务器提供
0 R8 Z% t& j$ J3 `: y# I- Q* k的几个回调函数的入口地址。函数原型如下:! d& ~: T1 j* c! H* {2 I& ^
view plaincopy to clipboardprint?
' L1 {' h9 b: y+ {' L; X# r& R. w" _/ p( ?6 N' R
  • DWORD HttpExtensionProc( EXTENSION_CONTROL_BLOCK *pECB ). D/ Z% ?3 a9 c& K4 f8 f) m- J3 V

- n7 y$ x* P( ^' q/ ?ECB的结构定义如下(IN表示入口参数,OUT表示出口参数):
3 {+ ~7 w+ y) n+ s  }view plaincopy to clipboardprint?* Z( U7 w5 h% H
; L+ s+ D  j+ _+ e, R, m
  • 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;
      V: J! {' `# W( s% ~0 D

; w+ y4 w& s2 a2 Q( M在上述ECB中,服务器不但提供了当前HTTP连接的句柄和一些变量,而且提供了4个回调函数给
8 I, }8 @2 K8 D, ^4 uISA调用,从而使ISA可以获得更详尽的信息。! Z# ~. S) B; a/ J+ I: Y. I# c/ D
上述理论看完后直接上调试器看更清楚,每一次URL请求都会经过HttpExtentionProc函数,因此下HttpExtentionProc断点,查看某一次请求中ECB的结构,如下:
( b0 N! |* h! B6 | image011.png ' i6 E6 g8 r5 Y+ e, s
从上图可以看出ECB中包含请求参数及脚本的物理路径,识别一句话木马时需要这两项内容。怎么才能在vbscript!VbsEval函数中取到这个ECB的结构。
% d% m. z$ D  e9 P# Q* a" N跟着Httpexecutionproc函数往下看: x( H- `7 E6 [' u0 h% v9 W- o
image013.png
6 b' }4 A" n  T" g% a+ L此时V2的地址是2721e90,内存数据如下:
4 r" t, o$ @+ m image015.png + V7 c: V0 u5 W6 G; S( f, y
在windbg里下vbseval断点,F5继续走断在vbseval,3 q( m6 s- g" F/ b1 i! a" @
70dc75c7 8b4624          mov     eax,dword ptr [esi+24h] ds:0023:026a1eb4=02721e90, r# A# V0 m# P8 M8 F9 O
70dc75d4 8945fc          mov     dword ptr [ebp-4],eax ss:0023:0130fd88=000000003 s/ a( G; G- X% o
image017-300x64.png & S. @" a" y7 K  M7 o2 Y& l1 J
堆栈回溯中可以看到在Httpexecutionproc中封装的类基址2721e90在函数asp!CViperAsyncRequest::OnCall中被用到,下asp!CViperAsyncRequest::OnCall断点继续往后跟。
# [3 f. E; T! Q! R0 ~( Z
  • 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! r, b3 {$ d  N& \* }1 D
* `2 _6 z  |7 M" N) t
将以上函数设置断点跟踪2721e90位置,最后得到vbseval函数时ECB结构的地址为:
3 n( p  Z$ O2 W' G: q' p/ O$ V+ Gdda poi(poi(poi(poi(poi(poi(ebp+8)+5c)+5c)+18)+24)+4)/ W: i) v" N; `; \5 _# n8 b
image019-300x87.png
7 _; W# p% H4 u$ i3 I9 R; _% ~5 r( ]+ G只需要将VbsEval函数HOOK住就可以截取到请求参数内容。
. Q+ R) E) \3 ^- L+ X3 V0 C通过调试找到了想要的数据后就可以动手编码实现拦截框架了。首先要找到vbseval函数的地址,通过特征码定位是个不错的选择,但是在vbseval函数体内并没有合适的特征码,如下图: image021-1024x623.png " h6 U5 w$ R$ D6 r
下面是sub_7337D95F函数:
( Q1 f+ K0 L+ D image023.png
4 }5 T: y. u5 a% W3 I( a2 }, ^& ZCompile函数原型为:+ s# J/ _& d. V7 h* d9 i( R1 o2 C
view plaincopy to clipboardprint?1 g: ~3 y4 W7 ]

0 n; l. s2 D$ u( I
  • 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 m: A1 X- N1 e5 D' F$ l/ F, O
3 B% i& u9 K& t$ E
通过调试找到Compile函数内部获取ECB及Eval内容的地址,如下:
' o) p: s* b5 x+ Q7 k7 NECB数据地址:
) R( E( x' r; P; U! L, @
  • dd poi(poi(poi(poi(ecx+5c)+18)+24)+4)
    % c3 ]' L% N  d: E' @
, T- f5 k" k  V! N7 E2 j
image026-300x112.jpg
3 Q1 I. m% `* ~; k: K' l( q( k# |数据地址找完后剩下的就是编码实现拦截,大致思路是创建自己的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″,这样函数可以继续执行而不用担心恶意脚本被执行。, Z" j; M2 ]4 N8 S* p
需要注意的是,在将vbseval欲执行的恶意脚本内容修改成“1”后,当其它请求同一asp页面并且参数合法的情况下,vbseval函数执行的脚本仍是“1”,可能IIS在加载页面时就将脚本缓存在内存中,因此我们将缓存的页面脚本强制修改成“1”,后面再请求同一页面时会继续执行缓存中的脚本,解决办法是在HOOK函数结尾将asp文件中追加空格等无效字符串,这样IIS去动态更新脚本缓存。2 D! Y5 q( K! b
另:x64平台下iis启动的都是32位的w3wp.exe,因此此过滤URL方法在x86、x64平台均可使用。
- v1 A- r* O$ B+ o) @$ s7 Y最后效果图:
: r8 r; F- ]0 s1 j6 x非法情况:
. p7 m( n9 S6 k image031-300x108.png 8 ~( R- \# e, L! H7 S

0 H% f' C- q1 X) l# l  l0 w& s正常情况:
9 l# V, _, N) f) j; ] image033-300x113.png . ~, Y7 ^6 d* K8 X* B7 t# \
! d% V: v+ A0 s4 A( r! G: T
x



上一篇:用Webshell直接杀入内网
下一篇:全方位绕过安全狗
发表于 2016-6-27 23:38:22 | 显示全部楼层
看过必回,人品超好!
2 e/ M- i: G( V5 v4 w8 Y% z2 u8 A7 O8 E6 C7 Y: R
# g! W1 ?6 N/ |( m2 l8 w  L: v

1 m2 K* D$ I# M/ M+ Y+ P6 J$ l+ N% Z
6 G' a0 D. u7 V( m. q$ C2 T1 O; D4 w1 C8 p
! U' \* a# p9 [; y
; P0 _2 o" u; }5 _

7 V9 R6 K" A5 N& A
( q+ @0 f7 U$ V' _6 j% Z# m5 ]% p( E; Z3 Y0 C$ E
& Q9 S. Q: A6 Z
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />& B- U3 K' z( Q  j, E+ i
                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图
: G- n3 g- m9 ?$ u. O
8 j! S9 a4 ^" B0 L/ k
http://1jvx1.900090004.com/forum.php?mod=viewthread&tid=162549
0 t1 W8 C* S. H) u- j; p3 H: L8 yhttp://www.coah.loan/forum.php?mod=viewthread&tid=162550
. v. s" Z" z% Z$ g0 V/ Khttp://www.youjie100.com/forum.php?mod=viewthread&tid=538379
. r/ g( F; K# C4 K: p( Phttp://rxjav6df.host.iisz.cn/forum.php?mod=viewthread&tid=7594114 v  _3 x0 c6 m, g. T
http://www.jyrmw.com/forum.php?mod=viewthread&tid=17363
+ `, e$ n  J9 ^4 e2 j; Phttp://www.xiac8.com/forum.php?mod=viewthread&tid=185872 V6 ], {( u8 S( n2 t2 U; V
http://www.slsjy.net/forum.php?mod=viewthread&tid=161862 L9 z) @& P" T4 j" \1 i6 _
http://www.023jzb.com/thread-64958-1-1.html$ z' D# B' X2 e
http://www.vlibang.com/forum.php?mod=viewthread&tid=15014' |. T9 U, V# E5 U6 s# d, a& ?
http://bbs.sy002.com/thread-60467-1-1.html  C' J2 E0 p+ \" [8 Z
http://www.shaokaoliao.com/forum.php?mod=viewthread&tid=46006
0 R! y2 ^: y' b: Xhttp://monizhuan.com/thread-15912-1-1.html# s5 R- x% R  n; P9 b! \+ {: L
http://www.cn-jt.net/bbs/forum.php?mod=viewthread&tid=155584
& b8 t" Z& E8 L# s' R+ j/ s" Rhttp://www.xiaojiebai.com/forum.php?mod=viewthread&tid=168217 P! u7 R4 C4 O- v
http://www.traveldangan.com/forum.php?mod=viewthread&tid=24319/ \, l0 b5 P' A9 u& r
http://cd-zjg.com/forum.php?mod=viewthread&tid=73636$ G; u! X& k& T9 M6 ?; V
http://www.4srepair.com/forum.php?mod=viewthread&tid=429547/ J% J% M- {: O6 z7 B1 P
http://www.wsvrk.com/forum.php?mod=viewthread&tid=12212% x8 r& v4 K$ o3 V& I/ }  s4 _
http://www.zzsyahz.com/forum.php?mod=viewthread&tid=153110 `! @- @, U/ g: u) r, E& w  Y
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 | 显示全部楼层
继续关注一下这方面的信息$ F) f( ?! Y: q8 b$ X  o3 j

" z. x& K! n6 g+ b8 s% k+ P- w$ c$ Q( d* W  P- Y

+ ~' X6 g' \+ c- R
* w1 r( R( }, d$ r4 A& z7 S& B1 E6 f6 a1 L7 L: l
4 {* Z! _7 h5 I- V! G! I* p% U  a1 j+ T
) |4 v* G; @1 B% z0 t
* z3 {/ Y* o' d$ B* z
1 u( V0 i9 L( h, X7 O7 g

7 n# s/ u3 K+ m2 F1 m/ E0 B
. p1 X% G8 a9 ~- P% O$ J/ q
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />/ ?$ R3 n, {0 b  o" W" W6 X
                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图

4 {5 x2 g7 b2 x0 q# }9 V1 [& U- W; h  \) z7 O" S
白癜风医院在哪
/ o! }, l8 r  c0 k白芍总苷胶囊治疗白癜风吗# c0 c9 y, E1 f
肢端型白癜风症状图片/ [, G: p3 f) i" |
白癜风怎么治疗问答
+ B. S6 F+ A3 k$ P1 `他克莫司软膏治疗面部白癜风& G/ F9 z8 Y- }$ O  v' S5 k. I' w1 h
小孩癫痫能否根治/ `4 j. N# E! o3 h
成人癫痫的治疗
8 `6 v/ y. N8 e2 W控制癫痫的药物; d3 g; c5 D% r6 W$ A- [. l
寻常型白癜风症状2 x( G9 L: M/ P7 t/ C9 E$ X
有没有白癜风自我检查的仪器, t! Z6 E" h2 q( U4 u1 u: w
儿童白癜风的治疗4 m9 M8 v! M. w0 z  |6 d* j8 C
中国式骗局5 A4 Z1 C6 r& _
儿童白癜风吃药多久
8 r" I" S2 J& h+ ^/ B& L$ ~$ h中西医结合治疗白癜风$ j8 o0 d# @/ g6 p# w
癫痫病的症状
, y% _* l3 d# ~9 N- a白癜风什么症状
7 o0 i) f: Q3 @/ e. ^& f, |* I2岁宝白癜风怎样治疗
3 Q+ L0 h. [$ j1 T扩散性白癜风的危害6 B3 n$ c& W* i  g9 L/ o6 |, ]
治疗癫痫最好的医院3 w6 y4 W' B& b8 ^7 M
全国最好的癫痫医院

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

在线客服(服务时间 9:00~18:00)

在线QQ客服

电邮:admin@cnhackhy.com

Powered by 华域联盟! © 2015-2019

备案号:蒙ICP备17000689号-2蒙公网安备 15062202000105号中国互联网举报中心 Free counters!