网络安全 频道

从漏洞及攻击分析到NIDS规则设计

//如果不是数字跳到41fd99

//对时间的正确性进行检验
.text:0041FD4F                 cmp     [ebp+var_5C], 7BCh          
.text:0041FD56                 jl      short loc_41FD91           //年小于1980跳
.text:0041FD58                 cmp     dword ptr [ebp-5Ch], 81Bh
.text:0041FD5F                 jg      short loc_41FD91            //年大于2075跳
.text:0041FD61                 cmp     dword ptr [ebp-60h], 1
.text:0041FD65                 jl      short loc_41FD91
.text:0041FD67                 cmp     dword ptr [ebp-60h], 0Ch  
.text:0041FD6B                 jg      short loc_41FD91            //月分只能是1-12
.text:0041FD6D                 cmp     dword ptr [ebp-64h], 1
.text:0041FD71                 jl      short loc_41FD91
.text:0041FD73                 cmp     dword ptr [ebp-64h], 1Fh
.text:0041FD77                 jg      short loc_41FD91            //号数只能是1-31
.text:0041FD79                 cmp     dword ptr [ebp-6Ch], 0
.text:0041FD7D                 jl      short loc_41FD91
.text:0041FD7F                 cmp     dword ptr [ebp-6Ch], 3Bh
.text:0041FD83                 jg      short loc_41FD91
.text:0041FD85                 cmp     dword ptr [ebp-70h], 0
.text:0041FD89                 jl      short loc_41FD91
.text:0041FD8B                 cmp     dword ptr [ebp-70h], 3Bh    //分秒只能是0-59
.text:0041FD8F                 jle     short loc_41FD99            //时间都合法了跳到41FD99                                                             
[3] 判断时间区域后面是否有+-号

.text:0041FD99 
.text:0041FD99 loc_41FD99:                             ; CODE XREF: sub_41FAE8+14Aj
.text:0041FD99                                         ; sub_41FAE8+2A7j
.text:0041FD99                 cmp     [ebp+var_88], 0
.text:0041FDA0                 jz      loc_41FE30         //对于mdtm 20020201112233+111 autexec.bat这样的命令不跳
.text:0041FDA6                 movsx   eax, [ebp+var_9EE] //处理时间区域后的一个字串
.text:0041FDAD                 cmp     eax, 20h
.text:0041FDB0                 jz      short loc_41FE1C   //为空格跳
.text:0041FDB2                 movsx   eax, [ebp+var_9EE]
.text:0041FDB9                 cmp     eax, 2Dh
.text:0041FDBC                 jz      short loc_41FDC3   //为减号跳!
.text:0041FDBE                 cmp     eax, 2Bh
.text:0041FDC1                 jnz     short loc_41FE1C   //不为加号跳到41FE1C!          

[4] 对时间区域有+-号的情况进行处理

.text:0041FDC3 loc_41FDC3:                             
.text:0041FDC3                 xor     edi, edi
.text:0041FDC5                 lea     eax, [ebp+var_84]    //得到时间区域的最后两位(ebp-84)
.text:0041FDCB                 lea     esi, [ebp+var_9EE]   //得到+号开始的地址
.text:0041FDD1                 jmp     short loc_41FDDA
.text:0041FDD3 loc_41FDD3:                            
.text:0041FDD3                 mov     dl, [esi]            
.text:0041FDD5                 inc     edi                  //edi为记数器
.text:0041FDD6                 mov     [eax], dl
.text:0041FDD8                 inc     eax
.text:0041FDD9                 inc     esi
.text:0041FDDA 
.text:0041FDDA loc_41FDDA:                            
.text:0041FDDA                 movsx   ecx, byte ptr [esi]
.text:0041FDDD                 cmp     ecx, 20h
.text:0041FDE0                 jnz     short loc_41FDD3           //遇到空格退出

//----------------------上面就是漏洞代码程序本意是把时间区域加号后面的四个字节放在ebp-84变量中
//但没有对长度进行检查,所以不但会覆盖ebp-84,如果是一个超长字串的话还会把ebp-54,ebp-78等变理覆盖!

Q&A

[1]为什么执行到loc_41FE30处会产生程序异常呢?
   因为ebp-78这个变量的值本来是要改变文件时间的文件名的地址,但是由于在loc_41FDC3处
对变量ebp-84的操作中会覆盖它的值,如果我们输入命令
quote mdtm 20020102112233+aaaaaaaaaaaaaaaaaaaaaaaaaa /autoexec.bat
那么这时ebp-78的值就成了61616161,而这个地址是不能仿问的,当然就产生异常了.

[2]产生异常后我们怎么执行代码呢?
   在分析刚开始的时候我们已经知道程序正常的异常处理程序入口在ebp-50中,那么我们只能把
系统中有jmp ebx的代码的地址放到ebp-50中就可以了.然后ebp-54中放入nop nop jmp 6(9090EB04)

[3]要发送多少个A才能刚好覆盖ebp-50,ebp-54呢?
   84h-54h=30h=48d

====================================================================

从以上的分析中我们可以抽取出要造成攻击的FTP请求报文所必须具有的特征:
1. 目标端口为FTP服务控制端口(通常是21)的TCP包
2. 包含MDTM命令
3. 命令参数以14个数字字节开始
4. 数字字节的前4字节表示年份的数字介于1980到2075之间
5. 年份后的2字节表示月份的数字介于1到12之间
6. 月份后的2字节表示日期的数字介于1到31之间
7. 日期后的2字节表示分钟的数字介于0到59之间
8. 分钟后的2字节表示秒的数字介于0到59之间
9. 数字字节后紧跟“+”或“-”字符
10. “+”或“-”字符之后紧跟48字节以上的非空格数据
11. 非空格数据后必须有一个或多个空格以分隔第二个参数
12. 空格后的包含至少一个字节的非空格字节做为第二个参数

这些特征形成特征集A。

对照Snort规则描述的特征集C,我们可以看到这两个特征集远不是重合的关系,只能算是有一个不大的交集,以此规则检测攻击出现误报和漏报几乎是必然的。

比如,带有如下payload的报文将导致误报:
“MDTM 1+abc”

带有如下payload的有效攻击报文将导致漏报:
“MDTM   20021122334455+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A”

既然已经分析清楚特征集A,在正则表达式强大描述能力的支持下,我们对Snort的规则进行改进使之与特征集A尽可能地接近,可以把匹配规则修改成如下这个样子:

alert tcp $EXTERNAL_NET any -> $HOME_NET 21 (msg:"FTP MDTM command overflow attempt"; flow:to_server,established; content:"MDTM"; nocase; pcre:"/MDTM\s+\d{14}[+-][^ ]{48,}\s+.+/smi"; reference:bugtraq,9751; reference:cve,2004-0330; classtype:attempted-admin; sid:2416; rev:5;)

这个规则匹配了特征集A中1、2、3、9、10、11、12编号的特征,这个改进后的规则形成的特征集C为特征集A的一个子集,此规则可能会导致误报而不可能产生漏报。

由此可见,漏洞及攻击分析在NIDS规则设计过程中具有极端重要性,它是规则设计的起点和基础,只有清楚地定义了攻击的特征集A,才有可能有针对性的设计出准确高效的NIDS检测规则。

0
相关文章