十六进制编码
最简单的掩饰攻击方式之一就是透过更改网页地址的请求。身为系统管理员,我们经常在纪录文件中搜寻特殊字符串,或是纯文字字符。我们会查看一些与已知弱点相同的资源请求字符串。举例来说,当我们在 IIS 的纪录文件中看到下列资料,我们就知道有人试图在IIS服务器中寻找MDAC弱点:
06:45:25 10.0.2.79 GET /msadc/ 302
现在让我们从入侵者的角度来看请求字符串,以了解入侵者如何避开系统管理员的型式比对。为了知道是否有 msadc 的目录存在,入侵者可能会键入以下字符串:
[root@localhost /root]# nc -n 10.0.2.55 80
GET /msadc HTTP/1.0
这样一来会产生我们前面在纪录文件看到的结果。入侵者可以藉由十六进制ASCII码来更改请求。在这个例子中,字符串 msadc会变成 6D 73 61 64 63的十六进制ASCII码。读者可以使用 Windows 的 Charmap 程序来快速将ASCII码转换为十六进制码。在上述的网页请求,将字符串 msadc以十六进制ASCII码转换,会使请求字符串变为:
[root@localhost]# nc -n 10.0.2.55 80
GET /%6D%73%61%64%63 HTTP/1.0
IIS 的纪录文件显示:
07:10:39 10.0.2.31 GET /msadc/ 302
其实这个纪录文件与未经编码的结果是完全一样的。所以在这个例子里,编码并未给入侵者带来任何好处。然而,在 Apache 的纪录文件就是另外一回事了。我们列出入侵者会用来检查特殊 CGI 文件是否存在的指令,以及经过十六进制编码的指令:
[root@localhost]# nc -n 10.0.0.2 80
HEAD /cgi-bin/test-cgi HTTP/1.0
[root@localhost]# nc -n 10.0.0.2 80
HEAD /%63%67%69-bin/test-%63%67%69 HTTP/1.0
让我们来看看 access_log 檔:
10.10.10.10 - - [18/Oct/2000:08:22:47 -0700] "HEAD
/cgi-bin/test-cgi HTTP/1.0" 200 0
10.10.10.10 - - [18/Oct/2000:08:23:47 -0700]
"HEAD /%63%67%69-bin/test-%63%67%69 HTTP/1.0" 200 0
在两种情形中, 200 状态码告诉我们指令成功完成。然而,第二个情形中出现了十六进制码,而不是纯文字。如果我们倚赖字符串搜寻来侦测入侵行为,就无法找出此类入侵方式。很多入侵侦防系统使用了不够聪明的型式比对方法,其中有些不转换十六进制码来作字符串比对工作。所以系统管理员应该了解这种技巧,并且清楚他使用的入侵侦防软件是否够聪明,能转换十六进制码。