当前位置: 操作系统/服务器>linux
本页文章导读:
▪IIS配置文件隐患
本文的内容是如何利用IIS本身的一些特性建立后门。当然,这主要是一份供网络管理员和网络安全工作人员参考的“Know Your Enemy”类文档,作者希望这篇文章能够对检查.........
▪远程分析IIS设置
提起微软公司IIS web服务器的安全问题,很多人立刻就会联想到那些为人们所称颂的致命 漏洞: UNICODE , CGI 解析, .ida,idq, .Printer远程溢出等. 这些伟大的漏洞恐怕是我等.........
▪apache五合一程序建立PHP+CGI运行环境
apache五合一下载http://switch.dl.sourceforge.net/sourceforge/phpdev5/dev5beta3.exe 另外需要本机安装apache四合一http://telia.dl.sourceforge.net/sourceforge/phpdev5/phpdev4_4A.exe 因为在五合一中没有.........
[1]IIS配置文件隐患
来源: 互联网 发布时间: 2013-12-24
本文的内容是如何利用IIS本身的一些特性建立后门。当然,这主要是一份供网络管理员和网络安全工作人员参考的“Know Your Enemy”类文档,作者希望这篇文章能够对检查和清除后门有所帮助,而并不鼓励或赞同利用本文的技巧进行违法活动。
首先简单介绍一下IIS的配置文件MetaBase.bin。这个文件位于%SystemRoot%\system32\inetsrv\MetaBase.bin,包含了几乎所有IIS的配置信息,是非常重要的系统文件。简单的说,我们在“intenet服务管理器”中所作的一切设置最终都会被保存在MetaBase.bin中。在日常的系统管理中除了通过“intenet服务管理器”来对MetaBase.bin进行操作外,Windows还提供了一个脚本adsutil.vbs可以对MetaBase.bin进行操作。
MetaBase的结构类似于注册表,也是树形结构,有类似键、值、项的概念。事实上在IIS3和PWS中,MetaBase的内容就是存储在注册表中的。MetaBase有两个主键:LM和Schema。其中,Schema保存了系统默认的一些配置,通常不需要修改,一旦改错也非常危险,所以无论是“intenet服务管理器”还是adsutil.vbs都没有提供修改Schema的机制。LM中包含了IIS的HTTP服务,FTP服务,SMTP服务等的配置信息。其中,LM/W3SVC/下是我们要用到的HTTP服务的配置信息。
几个下面会提到的值:
LM/W3SVC/InProcessIsapiApps,进程内启动ISAPI。这是一个数组,里面包含的是一组指向一些ISAPI的路径。在这个数组里面的ISAPI运行的时候都是由inetinfo.exe直接启动的,继承inetinfo.exe的local system权限;而不在其中的ISAPI则是由svchost.exe派生的dllhost.exe进程启动的,运行的身份是IWAM_NAME,当然,这是IIS默认的安全级别“中”的情况下,如果设为低,那么所有ISAPI都会由inetinfo.exe直接派生。另外,如果设定的时候不指定路径,而是仅指定一个扩展名,那么任何路径下的同名ISAPI在被调用的时候都会以system权限执行。
ScriptMaps,脚本映射。在某个目录下设定该值后,则向该目录请求的特定扩展名的文件会交给指定的ISAPI执行。需要强调的是,设定ScriptMaps的目录并不一定要真实存在的,只要在MetaBase中某个HTTP实例的root键下建了一个子键,对该字键同名目录的HTTP请求IIS会认为是合法的,并会交由映射的ISAPI处理。这也算是IIS的一个问题吧。
CreateProcessAsUser,在某个目录下指定改值为0,则该目录下的应用程序会继承inetinfo.exe的local system权限。
AccessWrite,决定某个目录是否允许写入,也就是WEBDAV的PUT方法。
AccessExecute,决定某个目录是否允许执行应用程序。
后门思路:
创建一个特定扩展名的脚本映射,指向我们的ISAPI,并把该ISAPI添加到InProcessIsapiApps列表中。那么我们向服务器请求该扩展名类型文件时就会在服务器上以local system权限执行该ISAPI,且所请求的文件并不需要是真实存在的。
技巧:
1、既然并不需要真的建一个目录来设定ScriptMaps,那么就可以只写一个键,并给这个键加上ScriptMaps。这样,从“intenet服务管理器”里是看不出这个目录的,更看不到这个ScriptMaps。
2、虽然“intenet服务管理器”里面看不出来,但是有经验的管理员可能习惯于偶尔用adsutil.vbs enum /p来看一下:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root/evildir]
这样就暴露了。
因为我们设的那个键并不是真实存在的虚拟目录,只是配置文件中的一个字符串,所以可以使用0x08这样的字符来做键值。0x08是Backspace键对应的16进制值,控制台上显示的效果是向左边删除一个字符,其实就是把“/”给删了:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root]
面对这种输出,一般人是不会留意的。
当然也可以设为类似_vti_script,_vti_bin这样的名字,只要不设KeyType,在“intenet服务管理器”中是看不见的。
因为系统中本身InProcessIsapiApps中有一个\WINNT\System32\msw3prt.dll,是.printer的映射,一般用不上。我们可以删掉D:\WINNT\System32\msw3prt.dll的值,换上\WINNT\System32\inetsrv\msw3prt.dll。
3、美中不足的是HTTP请求会留下痕迹,但是HTTP也有好处,那就是可以随便用一个代理服务器做跳板。另外,也可以用插入0x0D 0x0A来伪造日志的方法,(详见《Apache,IIS等多种http服务器允许通过发送回车符伪造日志》一文)这就是构造目录的技巧了。
具体实现:
当然可以用adsutil.vbs手工来加。不过需要注意,adsutil.vbs只能设,不能改,所以用adsutil.vbs的时候一定要把原先的也加上,否则原先的就会丢失。不同条目之间用空格分开。
先用下面命令取得当前的InProcessIsapiApps列表:
adsutil.vbs get /W3SVC/InProcessIsapiApps
取到之后把自己的ISAPI路径也加进去。
adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\System32\idq.dll" "C:\WINNT\System32\inetsrv\httpext.dll" ………………
ScriptMaps的设定同InProcessIsapiApps。
当然这样比较麻烦,也无法写入0x08这样的键值,所以我干脆自己写个VBS一次性搞定。至于那个做后门的ISAPI,能实现的功能就完全取决于想象力了。这里是一个简单例子的屏幕拷贝:
# nc 10.11.0.26 80
POST /%08/anything.tom
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.
C:\WINNT\system32>whoami
NT AUTHORITY\SYSTEM
C:\WINNT\system32>exit
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 08 Jan 2003 06:49:37 GMT
更隐蔽的方法是写一个特殊的ISAPI,并注册为解析asp的。通常情况下,该程序把收到的请求转给系统原来的asp.dll,并把结果返回,当收到一个特殊POST请求时就启动自己的后门代码,这样日志里面也不会有什么显示。审核时也很难发现。
除了上面所述利用脚本映射的方法外,还可以赋予某个虚拟目录AccessWrite和AccessExecute权限。需要运行后门的时候利用WEBDAV上载ISAPI,然后运行,使用完了再删除。(是否能删除?还是需要restart W3SVC ?我没有试验。)如果上载的不是DLL而是EXE文件,那么把该目录下的CreateProcessAsUser设为0也可以获得local system权限,这个方法早有人撰文论述。但AccessWrite和AccessExecute的改变都可以在“intenet服务管理器”中看出来,隐蔽性就差了。
[2]远程分析IIS设置
来源: 互联网 发布时间: 2013-12-24
提起微软公司IIS web服务器的安全问题,很多人立刻就会联想到那些为人们所称颂的致命
漏洞: UNICODE , CGI 解析, .ida,idq, .Printer远程溢出等. 这些伟大的漏洞恐怕是我等scripts
kidding的最爱了,利用他们可以很轻松的拿到较高的系统权限。但是这篇文章并非是讨论这些致命的漏洞的,只是比较详细的介绍了如何远程判断IIS 服务器的各种设置,如目录权限,认证方法等等,文中有些东西已经很老了,但是新的东西还是值得一看的。 希望本文能够起到一个抛砖引玉的作用。好了,废话少说,Go~!
远程确定目录权限
让我们打开一个IIS服务器来看看。在IIS 服务管理器中,选择一个目录,看他的属性
在目录属性项有有这么一些选项(日志访问和索引此资源不计):
脚本资源访问:对网站的脚本可以读取原文件。
读取 读取目录里面的静态资源。
写入 用户可以建立以及删除资源
目录浏览 用户可以浏览目录内容。
应用程序设置的执行许可中有三个选项:
无 只能访问静态页面
纯脚本 只允许允许脚本如ASP脚本
脚本和可执行程序 可以访问和执行各种文件类型
那么,如何确定服务器上面的这些开关设置呢? 别着急,一个一个来。
执行权限
如何确定某个目录是否开了执行权限呢?很简单,向服务器发送一个下面得请求:
http://iis-server/dir/no-such-file.dll
/dir/为要判断得目录,no-such-file.dll是随便取得一个名字,服务器上面没有这个文件。
服务器对我们得请求会返回一个信息。如果返回的是一个500错误:
HTTP 500 - 内部服务器错误 (Internal Server error)
那么就说明这个目录的执行权限是开着的。 对于服务器,能不开执行权限的就不要开。特别是虚拟目录的执行权限,大家想一想UNICODE和二次解码漏洞的利用过程就明白了。
如果服务器返回的是一个 404 错误:
HTTP 404 - 未找到文件
那么就说明这个目录的执行权限没有开。
写权限
测试一个目录对于web用户是否具有写权限,采用如下方法:
telnet 到服务器的web端口(80)并发送一个如下请求:
PUT /dir/my_file.txt HTTP/1.1
Host: iis-server
Content-Length: 10 <enter><enter>
这时服务器会返回一个100( 继续)的信息:
HTTP/1.1 100 Continue
Server: Microsoft-IIS/5.0
Date: Thu, 28 Feb 2002 15:56:00 GMT
接着,我们输入10个字母:
AAAAAAAAAA
送出这个请求后,看服务器的返回信息,如果是一个 201 Created响应:
HTTP/1.1 201 Created
Server: Microsoft-IIS/5.0
Date: Thu, 28 Feb 2002 15:56:08 GMT
Location: http://iis-server/dir/my_file.txt
Content-Length: 0
Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND,
PROPPATCH, SEARCH, LOCK, UNLOCK
那么就说明这个目录的写权限是开着的,反之,如果返回的是一个 403 错误,那么写权限就是
没有开起来,如果需要你认证,并且返回一个 401(权限禁止) 的响应的话,说明是开了写权限,但是匿名用户不允许。 如果一个目录同时开了”写”和“脚本和可执行程序”的话,那么web用户就可以上传一个程序并且执行它,恐怖哦%^#$!~
纯脚本执行权限
这样的目录就太多了。很多不需要给执行权限的目录也被管理员给了脚本执行权限,我记得在
shotgun的一篇文章里面他说过:最小的权限+最少的服务= 最大的安全 ; 一点也没有错。给目录任何多余的权限都是没有必要的。判断一个目录是否可以执行纯脚本文件也很简单,发送一个如下一个请求:
http://iis-server/dir/no-such-file.asp
返回404文件不存在说明有执行权限,返回403则是没有开。
浏览目录权限
判断一个目录是否允许浏览可能需要一点点小技巧,但是,在网站的默认首页(如:default.asp)不存在的话,那么就再简单不过了。 在浏览器里面输入:
http://iis-server/dir/
如果权限开着的,那么会返回200响应,并且列出当前目录里面的内容,反之,没有列出目录的话就是关了。 但是,如果默认页面default.asp存在呢?敲入上面的地址就直接打开这个页面了。别急,
WebDAV 里面有一个请求方法叫:PROFIND。这个方法使得我们可以从服务器资源里面得到一些如文件名,创建时间,最后修改时间等等的信息。利用它我们也可以绕过 default.asp 来判断目录浏览权限的情况, telnet到IIS-server的web端口,发送如下请求:
PROPFIND /dir/ HTTP/1.1
Host: iis-server
Content-Length: 0
这时,服务器会送回一个207 Multi Status的响应,如果目录是允许浏览的,那么同时会列出目录里面的资源以及他们的属性。如果目录浏览不允许,返回的信息就会少的多。目录浏览一般来说只能算是一个低危险等级的漏洞,比如一个images目录,里面除了图片没有别的东西了,那对于服务器的安全就没有什么危害,但是,如果目录里面放了一个管理页面adminpage.asp或者一些数据库连接信息文件,可能会导致你的服务器拱手相让给入侵者。
读权限
判断这点很容易,发一个带 txt文件的请求就可以:
http://iis-server/dir/no-such-file.txt
如果返回一个 404 文件不存在的响应,就说明读权限是开着的,反正,返回403错误则说明都权限没有开。早几年接触安全的人一定知道 ::$DATA泄露ASP源代码的漏洞,其实如果一个目录里面权势asp脚本的话,那么读权限也可以不用开的,ASP只需要脚本执行权限就可以了。
IIS 认证方法的判断
这个漏洞是最近才公布出来的,IIS服务器支持匿名访问,基本认证和使用NTLM方式的windows集成认证,如果客户端发送一个包含认证信息的请求,IIS就会强行的尝试用这些认证信息取认证,并且放回不会的响应。这样我们就能够确定IIS的认证的配置。
要确定IIS是否支持基本认证,可以telnet到服务器的80端口,发送如下请求:
GET / HTTP/1.1
Host: iis-server
Authorization: Basic c3lzdGVtOm1hbmFnZXIA
这是一个基本认证的请求,里面包含了一个base 64编码的用户ID和PASS,Basic后面那串字符经过base 64解码以后就是 system:manager 。如果服务器返回一个401信息,则说明基本认证选项是开着的。如果返回200信息,则有2种可能,基本认证选项没有开或者是服务器存在一个用户名是
system的用户名,并且密码是manager (猜中的话,行大运啦)。
要确定NTLM选项是否开启则可以向IIS发送如下请求
GET / HTTP/1.1
Host: iis-server
Authorization: NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA=
同样,如果返回401消息,则说明支持NTLM,返回200说明不NTLM认证选项没有开启。
对于大多数网站来说,这两种认证方式都是不需要开起的来,他们有可能泄露一些服务器的重要信息。
泄露内部IP地址信息
如果IIS服务器在一个使用NAT的防火墙里面的话,通常都有个内部地址如10.x.x.x。
如果IIS开启了基本认证选项,那么发送如下一个简单的请求就可以得到服务器的内部IP:
GET / HTTP/1.1
Host:
Authorization: Basic c3lzdGVtOm1hbmFnZXIA
服务器将返回一个如下响应:
HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Fri, 01 Mar 2002 15:45:32 GMT
WWW-Authenticate: Basic realm="10.1.1.2"
Connection: close
Content-Length: 3245
Content-Type: text/html
那个10.1.1.2就是机器的内部ip地址,本来realm的值是客户端提供给的一个主机头,但这里它是空的,所以IIS就选择了本机的IP地址来代替。同样的,利用PROPFIND,WRITE,MKCOL等请求的返回信息,也能泄露主机的一些信息,如我们向服务器提请下面这样一个请求:
PROPFIND / HTTP/1.1
Host:
Content-Length: 0
在IIS配置成使用主机名(见后)的情况下,则不会暴露主机的IP地址,但是会暴露NetBIOS名。事实上我们可以利用IIS的认证获得更多的信息,如所在域的名字,方法是向服务器发送如下带NTLM认证的请求:
GET / HTTP/1.1
Host: iis-server
Authorization: NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA
服务器会返回一个信息:
HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Fri, 01 Mar 2002 16:24:58 GMT
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAADAAMADAAAAAFgoKgeGvyVuvy67U
AAAAAAAAAAEQARAA8AAAAUwBDAFkATABMAEEAAgAMAFMAQwBZAEwATABBAAEA
DABTAEMAWQBMAEwAQQAEAAwAUwBDAFkATABMAEEAAwAMAFMAQwBZAEwATABB
AAAAAAA=
Content-Length: 3245
Content-Type: text/html
那一长串字符就包含了主机名和NT所在域的名字的base 64 编码。
临时解决方法:在cmd下进入c:\inetpub\adminscripts或者是adminiscript所在目录执行一下命令
adsutil set w3svc/UseHostName True
net stop iisadmin /y
net start w3svc
默认应用程序映射判断
判断默认映射是否存在比较简单,这里只简单的给出了在映射存在的情况下对于相应请求的响应:
扩展名: .printer
请求: http://iis-server/foo.printer
响应: HTTP 500 - 内部服务器错误
扩展名:.idc
请求:http://iis-server/foo.idc
响应: code 500 Internal Server Error
扩展名:.idq
请求:http://iis-server/foo.idq
响应码:200 OK
响应:找不到 IDQ 文件 D:\dir\\foo.idq
扩展名:.ida
请求: http://iis-server/foo.ida
响应码:200 OK
响应: 找不到 IDQ 文件 D:\dir\foo.ida
扩展名:.htr
请求: http://iis-server/foo.htr
响应: HTTP 404 - 未找到文件
扩展名:.htw
请求: http://iis-server/foo.htw
响应码: 200 OK
响应: QUERY_STRING 的格式无效
扩展名:.stm
请求: http://iis-server/foo.stm
响应: HTTP 404 - 未找到文件
扩展名:.shtm
请求: http://iis-server/foo.shtm
响应: HTTP 404 - 未找到文件
扩展名:.shtml
请求: http://iis-server/foo.ida
响应:HTTP 404 - 未找到文件
判断操作系统是否为个人版本(Professional/Workstation )
IIS安装在windows2000专业版和NT workstation上面时候,同时进行的连接数最大为10个,利用这一点我们可以简单判断操作系统版本:创建10个 HTTP 1.1的持续连接,第11个连接请求将放回403错误信息。
后话:由于各种原因,我所在的公司关门大吉了,没有工作,心就乱糟糟的,所以翻译的时候也是砍头去尾的,大家不要骂我,我拿去黑客防线骗稿费的啦。如果有不明白的地方可以参考以下几篇:
http://www.nextgenss.com/papers/iisrconfig.pdf 英文原文
http://www.nextgenss.com/advisories/iisauth.txt
http://www.nextgenss.com/advisories/iisip.txt
[3]apache五合一程序建立PHP+CGI运行环境
来源: 互联网 发布时间: 2013-12-24
apache五合一下载http://switch.dl.sourceforge.net/sourceforge/phpdev5/dev5beta3.exe
另外需要本机安装apache四合一http://telia.dl.sourceforge.net/sourceforge/phpdev5/phpdev4_4A.exe
因为在五合一中没有包含perl解释器,需要借用四合一安装包中的perl。
估计下一个版本会修正这一点的。
instsrv.exe下载:http://smallhome.51.net/instsrv.exe
首先在本机或肉鸡上安装phpdev4_4A.exe
默认解压缩到C:\就行了,我们只是使用C:\phpdev下的perl文件夹,然后安装dev5beta3.exe,可以把它装到教深的文件目录内,本例中为c:\winnt\system32\phpdev5
安装完毕
先把c:\phpdev下perl文件夹复制到c:\winnt\system32\phpdev5\Apache下
然后选择install phpdev5 now
再进入c:\winnt\system32\phpdev5\Apache\conf文件夹,编辑里面的httpd.conf文件
建议复制到本机用UltraEdit修改,不要使用记事本.
找到280行(相对于UltraEdit而言)
Port 80
可以改为你希望的端口
316行
ServerName localhost
把localhost改为肉鸡的ip,不过不改我发现也能正常运行
第324行
DocumentRoot "C:/WINNT/system32/phpdev5/www/" 默认根目录设置
在369行
Allow from localhost 127.0.0.1
后加一行
Allow from all
第588行
Alias /site/ "C:/WINNT/system32/phpdev5/www/phpwebsite_en/"
改为
Alias /site/ "C:/WINNT/system32/phpdev5/www/"
因为默认/phpwebsite_en/是放php程序的地方,要访问还得加上这一后缀,所以改为根目录
同样下面606行
Alias /public/ "C:/WINNT/system32/phpdev5/www/public/"
也改为Alias /public/ "C:/WINNT/system32/phpdev5/www/"
(注:598行private私人文件夹不用改
另关于phpmyadmin我还没有测试过,不过为了安全默认是不启用它的)
对于cgi的支持按他的默认设置即可。但记得我们的perl位置c:\winnt\system32\phpdev5\Apache\perl\perl.exe
记得在所有上传的cgi文件头改为
#!c:\winnt\system32\phpdev5\Apache\perl\perl.exe
为了运行自己的程序可以先删除www目录下的文件
最后把修改的httpd.conf文件替换
重新启动phpdev5即可
修改完httpd.conf后仅重启apache即可,phpdev5的控制面版上有这个选项,如图,把apache安装为服务后,右下脚托盘图标关掉即可.
另外mysql面版也有安装为服务选项,但建议不去使用它,反正我是没有成功过
可以到cmd下
\mysql\bin\>mysqld-nt.exe --install,并执行;
打开“开始”按钮下的“程序”=》“管理工具”=》“服务”,找到“mysql”服务,启动它;或者用net start mysql启动
修改密码。
格式:mysqladmin -u用户名 -p旧密码 password 新密码
1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令
mysqladmin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
最新技术文章: