这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5、IIS6、IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解。通过对底层机制的了解,可以让我们对 ASP.net 有更深的理解。
IIS 5 的 ASP.net 请求处理过程
对图的解释:
IIS 5.x 一个显著的特征就是 Web Server 和真正的 ASP.NET Application 的分离。作为 Web Server 的IIS运行在一个名为 InetInfo.exe 的进程上,InetInfo.exe 是一个Native Executive,并不是一个托管的程序,而我们真正的 ASP.NET Application 则是运行在一个叫做 aspnet_wp 的 Worker Process 上面,在该进程初始化的时候会加载CLR,所以这是一个托管的环境。
ISAPI: 指能够处理各种后缀名的应用程序。 ISAPI 是下面单词的简写 :Internet Server Application Programe Interface,互联网服务器应用程序接口。
IIS 5 模式的特点:
IIS6 的 ASP.net 请求处理过程
对图的解释:
IIS 5.x 是通过 InetInfo.exe 监听 Request 并把Request分发到Work Process。换句话说,在IIS 5.x中对Request的监听和分发是在User Mode中进行,在IIS 6中,这种工作被移植到kernel Mode中进行,所有的这一切都是通过一个新的组件:http.sys 来负责。
注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。
在User Mode下,http.sys接收到一个基于 aspx 的http request,然后它会根据IIS中的 Metabase 查看该基于该 Request 的 Application 属于哪个Application Pool, 如果该Application Pool不存在,则创建之。否则直接将 request 发到对应Application Pool 的 Queue中。
每个 Application Pool 对应着一个Worker Process:w3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase 中维护着 Application Pool 和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有,就创建这样一个进程)。在 worker process 初始化的时候,加载ASP.NET ISAPI,ASP.NET ISAPI 进而加载CLR。最后的流程就和IIS 5.x一样了:通过AppManagerAppDomainFactory 的 Create方法为 Application 创建一个Application Domain;通过 ISAPIRuntime 的 ProcessRequest处理Request,进而将流程进入到ASP.NET Http Runtime Pipeline。
大家应该都还没有忘记三年前在Serv-U5.004版的之前所有版本的"Serv-U FTPMDTM命令缓冲区溢出"与"Serv-U FTP服务器LIST命令超长-l参数远程缓冲区溢出漏洞"吧,这个漏洞让很多服务器管理员立坐不安,也让很多大型的站点、甚至电信级的服务器沦陷了...随着Serv-U新版本的推出,这个漏同已经不存在了;虽然溢出不存在了,但黑客永远也没有停止,所以伴随着来的又是Serv-U5.0到6.0之黑客常用的本地提升权限缺陷。(注:最常见的就如webshell+su提权,我在 Baidu输入"Serv-U提权"关键词,搜索结果“百度一下,找到相关网页约34,000篇,用时0.001秒 ”)因此,解决Serv-U的安全问题迫在眉睫。
Serv-U提权虽然严格来说这个不应该算是Serv-U的重大漏洞,但只要因管理员的配置不当将会产生严重的后果;下面LeeBolin就来为大家介绍下如何安全配置 Serv-U,才能保证Serv-U甚至服务器的安全,跟我来.“go,go,go...”(最近CS玩多了,嘻嘻 :P)
Serv-U防溢出提权攻击解决办法解决办法正文:
一、大家知道Liunx系统和Unix系统比Windows安全的一个重要原因在于:Linux和Unix的系统服务不使用root权限,而是使用权限比较低的另外一个单独用户,比如web服务使用了nobody这个用户。而Serv-U默认是以system身份运行的,而System这个系统内置账户对本机有完全操作的权限;因此如果攻击者利用Serv-U程序的漏洞而获得了可执行shell的那,那么他将可以随意控制操作系统里任何一个目录了
二、我们根据一的讲解知道了为什么Serv-U提权与溢出攻击可怕的原因了,那么我们该如何防止这一类攻击的发生呢?答案就是降底Serv-U的运行权限与控制Serv-U的“Acls”可访问目录...好,下面就一步一步跟我来吧!
三、Serv-U安全配置
1、首先请保持合用Serv-U的最新版本(目前新版为6.4...)。然后在安装Serv-U的时候尽量不要选择默认的安装目录,比如俺将Serv-U 安装在D:/Pro_LeeBolin^_^/Serv-U#$2008$/...(因为这样复杂的目录名可防止Hacker的猜解)
2、然后将Serv-U取消MDTM命令的执行,修改Serv-U FTP Banner并开启好Serv-U的FTP日志保存到非系统盘,日志选择记录好Serv-U命名用了那些命令与DLL,并为Serv-U设置一个强壮的本地管理密码(因提权多是因为Serv-U的默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P所造成的,呵呵 $_$),你还可以选择将Serv-U的FTP账户信息保存到注册表,不要存在Serv-U目录下的ini文中,这样更加安全。
3、我们再开启"计算机管理"新建一个用户Serv-UAdmin,设置好密码。将用户退出Users组,不加入任何组。并在用户的“终端服务配置文件”选项里取消“允许登录到终端服务器。并且禁止Serv-UAdmin用户的本地登陆。进入控制面板 -> 管理工具 -> 本地安全策略 -> 本地策略 -> 用户权利指派 -> 拒绝本地登陆。(备注:这个用户我们将它来作为俺们Serv-U的服务运行账号,嘿嘿)[(AD^_^:游刃在技术鬼神边缘,打造服务器安全神话!创世纪网络技术前瞻,成就互联网革命先驱!服务器安全讨论区[S.S.D.A]) ]
4、开始运行"Services.msc"打开win的服务管理器,找开Serv-U Ftp Server的Serv-U服务;打开“登陆”对话框。当前默认的为“本地系统帐户”。我们将其修改为我们在3中新建的Serv-UAdmin用户,并输入密码。
5、下面的工作就是设置Serv-U的运行与FTP目录的ACLs权限了:
①C:/Documents and Settings/Serv-UAdmin 目录加入Serv-UAdmin的权限,允许读取与写入..
②D: /Pro_LeeBolin^_^/Serv-U#$2008$/ Serv-U的安装目录加入Serv-UAdmin的权限,允许读取与运行。(如果选择了账户保存在ini文件的话,这里就需要增加修改与删除权限,因增删FTP账户时需要删改权才成,否则不能增删FTP账户哟^_^)
③ 如果Serv-U账户选择存在注册表的话。运行regedt32.exe,打开注册表编辑器。找到[HKEY_LOCAL_MACHINE/ SOFTWARE/Cat Soft]分支。在上面点右键,选择权限,然后点高级,取消允许父项的继承权限传播到该对象和所有子对象,删除除admins外的所有的账号。仅添加 Serv-UAdmin账号到该子键的权限列表,并给予完全控制权限。(如果选择了账户信息保存在ini文件中的话可略过此步。)
④ 现在就来设置WEB目录的ACLs了,比如我的虚拟主机总目录为E:/Leebolin$(%;那么我们将此WEB目录加入 Serv-UAdmin账号的权限即可,这样FTP就可以访问我们的WEB目录进行上传下载了,呵.(由于Serv-U并没有以system运行,所以这里只存留admins与serv-uadmin的权限就OK了。)
⑥如果是asp/php/html脚本的话,WEB目录只需要 admins & serv-uadmin & IUSR_XX即可(这里的IUSR_XX是指站点的匿名单用户账号...关于站点的安全与asp.Net的安全请参考我以前的文章:《FSO安全隐患解决办法》、《ASP木马Webshell之安全防范解决办法》、《ASP.NET木马及Webshell安全解决方案》、《服务器安全检查十大要素》)
四、到目前为止,我们的Serv-U已经简单的做到了防提权,防溢出了。为什么呢?因为能常远程溢出 overflow的话,都是通过得一shell 而进行进一步的hacking,而我们现在的Serv-U不是以system运行,所以即使执行了overflow指命,也并不能得到什么...防提权就不用我解释了:因为我们的Serv-Uadmin没有任何系统级的ACLs访问权限..
五、今天的Serv-U防溢出提权攻击解决办法就为大家介绍到这里,您看到此处后,你会了吗?
后记:其实服务器、系统的安全是个整体的概念;有可能你其它一小点的疏忽就可以让你的网站、甚至服务器沦陷。因此安全策略必需走防患未然的道路,任何一个小地方都不能马虎、今天关于防Serv-U的安全配置小技巧就为大家介绍到这里...其它方面的服务器安全配置经验我们在下一篇文章再见吧:-) (注:由于本人才疏学浅,如文中有错误实为在所难免,还请各位看官见谅!旨在抛砖引玉,如果您有更好的办法请别忘了在服安论坛跟贴^0^,先行谢过!)
关于本文版权:本文版权归[服务器安全讨论区]与[本文作者]共同所有,您可以任意转载,但务必请保留文章的完整性与信息来源及作者信息等链接;但不欢迎转载者除去本版权信息。
关于本文作者:李泊林/LeeBolin 服安科技资深系统工程师、专业网络安全顾问。已成功为国内多家大中型企业,ISP服务商提供了完整的网络安全解决方案。尤其擅长于整体网络安全方案的设计、大型网络工程的策划、以及提供完整的各种服务器系列安全整体解决方案。[S.S.D.A 服务器安全讨论区] www.31896.net E-mail:bolin.lee#gmail.com QQ:24460394 您对本文有任何建议与疑问可以来信或者QQ在线与作者进行交流;或者到服安论坛与作者进行讨论!
1、用防火墙关闭不须要的任何端口,别人PING不到服务器,威胁自然减少了一大半
防止别人ping的方法:
1)命令提示符下打
echo 1 > /proc/sys/net/ipv4/icmp_ignore_all
2)用防火墙禁止(或丢弃)icmp 包
iptables -A INPUT -p icmp -j DROP
3)对所有用ICMP通讯的包不予响应
比如PING TRACERT
2、更改SSH端口,最好改为10000以上,别人扫描到端口的机率也会下降
vi /etc/ssh/sshd_config
将PORT改为1000以上端口
同时,创建一个普通登录用户,并取消直接root登录
useradd 'username'
passwd 'username'
vi /etc/ssh/sshd_config
在最后添加如下一句:
PermitRootLogin no #取消root直接远程登录
3、删除系统臃肿多余的账号:
userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher userdel ftp 如果你不允许匿名FTP,就删掉这个用户帐号 groupdel adm groupdel lp groupdel news groupdel uucp groupdel games groupdel dip groupdel pppusers
4、更改下列文件权限,使任何人没有更改账户权限:
chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow
5、chmod 600 /etc/xinetd.conf
6、关闭FTP匿名用户登陆