8.8 Windows系统克隆用户攻击与防范
随着计算机技术的发展和计算机的普及,还有大大小小的黑客网站和越来越简单的工具,使得目前的网络攻击变得日趋频繁,被植入木马的计算机或服务器越来越多。与此同时,系统管理员的安全意识不断提高,加上杀毒软件的发展,网络木马的生命周期越来越短。所以,攻击者在获取服务器的控制权限后,一般使用克隆用户或者通过安装SHIFT后门来达到隐藏自己的目的。下面就介绍一些常见的克隆用户,以及检查是否存在克隆用户和清除克隆用户的方法。
8.8.1 克隆账号的原理与危害
我们了解一下克隆账号的原理与危害。
1.克隆账号的原理
在注册表中有两处保存了账号的SID相对标志符,一处是注册表HKEY_LOCAL_MACHINE\SAM\AMDomains\AccountUsers下的子键名,另一处是该子键的子项F的值。但微软犯了一个错误——没有同步它们,登录时用的是后者,查询时用的是前者。当用Administrator的F项覆盖其他账号的F项后,就造成了账号是管理员权限,但查询还是原来状态的情况,这就是所谓的“克隆账号”。
安全小知识
SID,也就是安全标识符(Security Identifiers),是标识用户、组和计算机账户的唯一号码。在第一次创建该账户时,将给网络上的每一个账户发布一个唯一的SID。Windows 2000中的内部进程将引用账户的SID而不是账户的用户或组名。如果先创建账户,再删除账户,然后使用相同的用户名创建另一个账户,则新账户将不具有授权给前一个账户的权力或权限,原因是该账户具有不同的SID。
2.克隆账号的危害
当系统用户一旦被克隆,配合终端服务,就等于向攻击者开启了一扇隐蔽的后门,让攻击者可以随时进入系统。这一扇门我们看不到,因为它依靠的是微软的终端服务,并没有释放病毒文件,所以不会被杀毒软件查杀。
8.8.2 克隆用户的常用方法
1.手工克隆方法一
在Windows 2000/XP/2003/NT里,默认管理员账号的SID是固定的500(0x1f4),那么,我们可以用机器里已经存在的一个账号将SID为500的账号进行克隆。在这里,我们选择的账号是IUSR_ XODU5PTT910NHOO(XODU5PTT910NHOO为已被攻陷的服务器机器名)。为了增强隐蔽性,我们选择了这个账号。对所有用户都可以采用以下方法,只不过这个用户比较常见罢了。
这里使用的工具是PsExec,一个轻型的Telnet替代工具,它使我们无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与控制台应用程序相当的完全交互性。PsExec最强大的功能之一是在远程系统和远程支持工具(如ipconfig)中启动交互式命令提示窗口,以便显示无法通过其他方式显示的有关远程系统的信息。执行命令“psexec-i-s-d cmd”,得到一个System的CMD Shell,如图8-34所示。
图8-34 获取系统权限CMD Shell
得到一个拥有system权限的CMD Shell,然后,在该CMD Shell里运行“regedit/e admin.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4”命令,我们将SID为500(0x1f4)的管理员账号的相关信息导出,如图8-35所示。
图8-35 导出管理员注册表值
编辑admin.reg文件,将admin.reg文件的第3行“HKEY_LOCAL_MACHINE\SAM\SAM\ Domains\Account\Users\000001F4”中的“1F4”修改为IUSR_XODU5PTT910NHOO的SID,将文件中的“1F4”修改为“3EB”,如图8-36所示。
图8-36 修改注册表值
保存之后,执行命令“regedit/s admin.reg”,导入该admin.reg文件。执行“net user IUSR_XODU5PTT910NHOO n3t104d”命令,修改IUSR_XODU5PTT910NHOO的密码为n3t104d。这里建议最好使用14位的密码,也就是说,越像IUSR_XODU5PTT910NHOO的密码越好。
现在,我们就可以使用IUSR_XODU5PTT910NHOO的密码n3tl04d进行远程登录,看到和管理员一样的配置环境了,如图8-37所示。
图8-37 使用克隆账号登录3389
注意
大部分机器里IUSR_MACHINE用户的SID都为0x3E9。如果机器在最初安装的时候没有安装IIS,而是自己创建账号后再安装IIS,就有可能不是这个值了。如果不确定,可以使用“regedit/e sid.reg HKEY_ LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\IUSR_MACHINE”命令,先导出注册表,再编辑sid.reg文件,看到SID为“3EB”,如图8-38所示。
图8-38 查看注册表值
2.手工克隆方法二
另一种手工克隆账户方法是:运行regedt32.exe,展开注册表到HKEY_LOCAL_MACHINE\ SAM\SAM,依次单击菜单栏中的“编辑”→“权限”选项(Windows 2000中是“安全”→“权限”选项),弹出“SAM的权限”对话框,单击Administrators用户,勾选允许完全控制(在Windows 2000中,是在该对话框中勾选“允许将来自父系的可继承权限传播给该对象”选项),单击“确定”按钮,如图8-39所示。
图8-39 设置权限
找到HKEY_LOCAL_MACHINE\SAM\SAM\DomainsAccount\Users\00001F4,双击右边窗口中的“F”项,如图8-40所示。
图8-40 查看注册表F值
选取全部内容,单击右键,在弹出的快捷菜单中选择“复制”选项。打开HKEY_LOCAL_ MACHINE\SAM\SAM\DomainsAccount\Users\00003EB下的F项,将刚才复制的内容粘贴进去。这样,我们就将IUSR_XODU5PTT910NHOO账号克隆成了管理员。将刚才SAM目录的权限删除,以免被人发现。
3.使用mt克隆
mt.exe是一款非常强大的网络工具,它主要以命令行的方式执行,可以开启系统服务、检查用户、直接显示用户登录密码等。它就像一把双刃剑,入侵者和系统管理员都要使用它,但由于常被入侵者使用,所以被很多杀毒软件列为病毒。MT的详细测试报告可以访问http://www.antian365.com/bbs/viewthread.php?tid=2786&extra=page%3D1&frombbs=1了解。
克隆用户的用法如下,如图8-41所示。
图8-41 使用mt进行账号克隆
mt -clone <SourUser> <DestUser>
例如,“mt-clone adminstrator IUSR_XODU5PTT910NHOO”。
在这里,就是把管理员账号administrator克隆为IUSR_XODU5PTT910NHOO账号。最后,执行“net user IUSR_XODU5PTT910NHOO n3t104d”命令,修改IUSR_XODU5PTT910NHOO的密码为n3tl04d。
4.使用AIO克隆
AIO(All In One)是WinEggDrop编写的一个把很多小工具功能集成在一起的“工具”,其中有克隆用户、修改服务的启动类型、删除系统账户、检查系统隐藏服务、端口扫描和端口转发等功能。使用AIO克隆很简单,命令格式如下。
Aio.exe -Clone 正常账号 要被克隆账户 密码
命令示例如下。
Aio.exe -Clone Administrator IUSR_XODU5PTT910NHOO n3tl04d
这样,就可以用IUSR_XODU5PTT910NHOO\n3tl04d作为管理员登录了,如图8-42所示。
图8-42 使用AIO克隆
5.使用CA克隆
ca.exe是小榕编写的一个远程克隆账号工具,当然,本地克隆也没问题,其用法如下。
ca \\IP 地址 管理员用户名 管理员密码 克隆的用户 密码
示例如下,如图8-43所示。
图8-43 使用CA克隆
ca \\127.0.0.1 administrator 123456 IUSR_XODU5PTT910NHOO 123456
6.使用adhider建立隐藏账号
adhider是“锦毛鼠”编写的一个专门建立隐藏用户的工具。此工具有一个缺点,就是当服务器重启后,用户就隐藏不了,会在用户管理中显示出来,用法如下。
adhider 用户名 密码
命令示例如下。
adhider n3tl04d$\123456
如图8-44所示,创建成功后就可以使用3tl04d$\123456登录,得到和管理员权限。
图8-44 使用adhider建立隐藏账号
7.使用clone克隆
clone是由“28度的冰”编写的一个克隆工具,只支持Windows 2003和Windows XP,不支持Windows 2000。此工具有一个缺点,那就是当服务器重启后,用户就无法隐藏,会在用户管理中显示出来,如图8-45所示。
图8-45 使用clone克隆
该工具的用法如下。
Clone.exe 用户名 密码
命令示例如下。
clone n3tl04d 520mm
这时,就可以使用n3tl04d\520mm登录,得到管理员权限。
注意
在Windows 2003下使用clone克隆后,再使用MT检查,会提示没有系统权限,此时需要重启计算机或者运行一个拥有system权限的CMD才能使用MT检查。
8.8.3 克隆用户的安全检查与防范
当系统用户被克隆之后,更改管理员也无济于事,服务器上的信息和数据还是会被攻击者随意窃取。所以,必须先把克隆的用户清除,再进行其他安全检查。在检查是否存在克隆用户前,最好重启系统。采用8.8.2节介绍的第6种和第7种方法进行克隆的,就会在用户管理里显示出来了,如图8-46所示。如果发现克隆账号,可以用mt或AIO软件进行删除。
图8-46 查看用户账号
1.使用MT检查
在CMD命令行下,使用“mt -chkuser”命令检查系统克隆账号。输入命令后,会在屏幕中输出结果。主要查看ExpectedSID和CheckedSID,如果这两个值不一样,说明账号被克隆了,如图8-47所示。IUSR_XODU5PTT910NHOO用户的ExpectedSID和CheckedSID不一样,且它的CheckedSID值和管理员administrator的CheckedSID值一样,显然,IUSR_XODU5PTT910NHOO是一个克隆账号。
图8-47 使用MT检查
2.使用AIO检查
不需要在system权限下也可以使用,用法如下,如图8-48所示。
图8-48 使用AIO检查
Aio.exe –CheckClone
可以看出,n3tl04d、n3tl04d$都是克隆账号。
3.使用CCA检查
CCA是小榕编写的一款检查是否存在克隆的账号的工具,支持远程检查,但必须有管理员账号,用法如下。
cca.exe \\IP 地址 用户名 密码
检查本机是否存在克隆用户,如“cca \\127.0.0.1 administrator 123456”,如图8-49所示。
图8-49 使用CCA检查
可以看出,n3tl04d、n3tl04d$都是克隆账号。
4.使用LP_Check检查
如果系统存在克隆用户,软件将以红色字显示。不过,此工具检测不到使用adhider.exe克隆的用户,如图8-50所示。
图8-50 使用LP_Check检查
只检测到n3tl04d一个克隆用户,事实上还存在另一个克隆用户n3tl04d$,但LP_Check没有检测出来。
5.手工检查
01 检查用户
对于系统的默认用户,如guest、IUSR_XODU5PTT910NHOO等,可以使用“net user IUSR_ XODU5PTT910NHOO”命令查看最后登录日期,如图8-51所示。
图8-51 查看用户登录时间
可以看出,IUSR_XODU5PTT910NHOO登录过系统,此账号默认显示“上次登录从不”,因此可以判定账号已被克隆。
02 查看系统登录日志
Windows 2003的用户登录审核是默认开启的。发现不明的登录日志,如图8-52所示。21:46管理员并未登录系统,说明其他用户登录系统,单击就可以看到是哪个用户登录了,如图8-53所示。
图8-52 查看系统登录日志
图8-53 查看日志审核记录
n3tl04d$在21:46登录过系统,说明此账号就是被克隆的账号。如果日志中没有记录,管理员也没有删除过日志,那肯定是入侵者删除的,说明系统肯定被入侵了。
此方法的缺点就是要查看日志,如果攻击者很少登录的话就很难发现。
03 查看注册表
运行regedt32.exe,展开注册表到HKEY_LOCAL_MACHINE\SAM\SAM,依次单击菜单栏中的“编辑”→“权限”选项,会弹出“SAM的权限”对话框。单击Administrators,勾选“允许完全控制”复选框,单击“确定”按钮。找到HKEY_LOCAL_MACHINE\SAM\SAM\DomainsAccount\Users\ Names,查看是否存在不明用户,如图8-54所示。
图8-54 查看注册表中的用户
此方法只对添加新用户的克隆有效。如果克隆的是系统默认账号,如guest、IUSR_MACHINE等,需要导出两个用户的键值,然后对比F项,如果IUSR_MACHINE的F值和管理员的F项的值相同,说明已被克隆了,如图8-55所示。
图8-55 检查注册表中的F项值
可以看出,3EB的F项的值和管理员1F4的值一样,说明SID为3EB的账号是克隆账号。
6.删除克隆用户
01 还原注册表
如果是系统默认账号被克隆的话,先到一台正常计算机上用同样的方法复制相同用户下面的F项的值。如果发现IUSR_MACHINE(“MACHINE”为机器名)用户被克隆,就打开一台正常计算机的注册表,找到HKEY_LOCAL_MACHINE\SAM\SAM\DomainsAccount\Users\000003EA,导出注册表,保存为3EA.reg。回到被入侵的计算机,导入被克隆的用户注册表值为3eb.reg,接着把3ea.reg里面的F值复制,替换3eb.reg里的F值,再把里面的“ea”改为“eb”(因为两台计算机的IUSR_ MACHINE用户的SID不一样,如果一样,就不需要修改),如图8-56所示。
图8-56 还原注册表被修改的值
保存后导入注册表,然后在CMD下使用“net user IUSR_MACHINE n3tl04d520mm”命令修改密码。如果是添加用户式的克隆,可使用以下方法。
02 使用mt删除克隆用户
在CMD命令环境下输入“mt-killuser用户名”,如“mt-killuser n3tl04d”,命令运行成功后,n3tl04d账号就不存在了,如图8-57所示。
图8-57 使用mt删除克隆用户
03 使用AIO删除克隆用户
在CMD命令环境下输入“Aio.exe-DelUser用户名”,如“Aio.exe-DelUser n3tl04d”,命令运行成功后,n3tl04d用户就被删除了,如图8-58所示。
图8-58 使用AIO删除克隆账号
8.8.4 小结
由于条件限制,本节的全部操作都是在Windows 2003环境下完成的。
当发现被克隆时,有人说要重装系统,但笔者认为这是不明智的选择,特别是服务器作为虚拟主机的时候,把客户的网站都停掉造成的损失谁来负责?再说,如果入侵是服务器配置不当或者其他网站漏洞造成的,仅靠重装系统无法把原来的漏洞补上,攻击者可以照着原路再一次攻陷系统。但是,仅删除被克隆的用户也是远远不够的,还需要更改所有管理员的密码。如果计算机提供3389远程终端服务或者安装了pcAnywhere等远程控制工具,则系统需要定期检查用户账号,一旦发现克隆账号,说明系统的安全风险非常大,单独删除克隆账号的意义不大。建议使用系统备份来恢复系统,并更改系统的所有账号和密码。
8.9 操作系统密码安全设置
很多黑客的入门都是从破解系统口令开始的,因此,设置安全的系统口令在网络攻防过程就尤为重要。如果口令足够安全,即使入侵者获取了系统的密码,但由于破解密码需要花费的时间成本太高,通常也会放弃。当我们设置系统口令时,大都会用自己熟悉的单词或一些习惯使用的数字,如电话号码、生日等,这在便于自己记忆的同时,也为入侵者打开了方便之门。本节就如何设置操作系统密码,分别从攻击(社会工程学对口令的攻击,内网渗透,暴力破解)和防护(主要是策略)两个方面进行研究。
8.9.1 系统密码安全隐患与现状
我们一起了解一下系统密码设置的安全隐患及现状。
1.口令设置上的漏洞
中国杀毒网记载了一个有趣的心理试验:随机抽出100名在校大学生,要求他们分别写下两个单词,并告诉他们这两个单词是用于计算机的口令,非常重要,且将来的使用率也很高,要求他们尽量慎重考虑,结果却出人意料。
• 用自己的中文拼音者最多,有37人。
• 用常用英文单词的有23人,其中许多人都用了具有特定意义的单词,如anything、hello、good、happy等。
• 用计算机中经常出现的单词有18人,这些单词中包括操作系统的常用命令,如system、command、copy、harddisk、mouse等。
• 用自己的出生日期有7人,其中年、月、日各不相同,但有3人使用了中国常用的日期表示方法。
上述测试中两个单词相同的有21人,相近的有33人。通过这些结果,如果满足字典攻击的条件,使用字典攻击成功的可能性就非常高,我们称之为口令设置上的漏洞。
2.社会工程学对口令的攻击
黑客在入侵过程中会利用Google、百度等搜索引擎充分收集被攻击对象的各种资料,在攻击中这些资料将起到辅助作用。
笔者研究发现,在很多网络安全的事故中,数据库服务器、FTP服务器、文件服务器、远程终端等均设置为相同的密码,利用社会工程学进行口令猜测,这样做不但可以方便地渗透内网计算机,而且可以获取被入侵者的电子邮箱、QQ等账号所对应的密码。
3.内网渗透中对口令的攻击
内网渗透的思想源于特洛伊木马的思想。堡垒最容易从内部攻破,入侵者为了获得口令可谓煞费苦心,在他们江郎才尽的时候,打入“敌人”内部常常能让他们感到柳暗花明。为了能够成功渗透内网,入侵者通常采用如下手段。
• 利用传统手法,如SQL注入、漏洞溢出等,得到一个分站的服务器权限,然后,根据在分站上收集的电子邮箱信息、FTP信息、网络拓扑信息、管理员常用的管理工具等渗透主站。
• 通过传送具有诱惑性的木马获得内网机器的控制权限,这应该算是社会工程学与漏洞的结合。例如,0day,也就是Word、PDF或IE 0day发挥作用的地方。很多人拿到IE 0day就直接挂马,其实IE 0day还有更高的价值,那就是发送邮件,如果管理员被欺骗并点击了入侵者发送邮件里的URL,后果就很难预料了。BTV-7就曾介绍淘宝网发生的账号盗用事件,通过“网络钓鱼”欺骗店主在假的“淘宝网”输入用户账号和密码。
• 社会工程学的又一次完美诠释。通过各种手段取得内网管理员或用户的信任,获得他的信息,如QQ、电子邮箱等,抓住他的弱点,降低他的心理防线,在成熟的时候发送URL或在打包的软件里捆绑木马等,内网将面临又一次的攻击。
4.暴力破解对口令的冲击
当其他道路行不通的时候,入侵者就会尝试暴力破解。对弱口令来说,暴力破解相对较容易;相反,那些设置了很多策略的强口令就需要完备的字典、性能先进的硬件和大量的时间来支持,基本上很难破解。
8.9.2 系统密码安全设置策略
系统密码安全设置策略如下。
1.通过组策略加固密码设置
在“开始”→“运行”窗口中输入“gpedit.msc”并按“回车”键,就可以打开“组策略”设置窗口,如图8-59所示。
图8-59 打开组策略设置窗口
在“组策略”窗口的左侧展开“计算机配置”→“Windows设置”→“安全设置”→“账户策略”→“密码策略”选项,在右边窗格中就会出现一系列的密码设置项。经过这里的配置,可以建立一个完备的密码策略,使密码得到最大限度的保护,如图8-60所示。
图8-60 修改密码默认策略
2.密码必须符合复杂性要求
如果启用了这个策略,那么在设置和更改一个密码时,系统将会按照下面的规则检查密码是否有效。
• 密码不能包含用户的账户名,不能包含用户姓名中超过2个连续字符的部分。
• 至少6个字符长。
• 包含以下4类字符中的3类字符:英文大写字母(A到Z);英文小写字母(a到z);10个基本数字(0到9);非字母字符(如“!”、“$”、“#”、“%”)。
在更改或创建密码时将执行复杂性要求。启用了这个策略,相信密码就会比较安全了,因为系统会强制使用这种安全性高的密码。如果在创建或修改密码时没有达到这个要求,系统会给出提示并要求重新输入符合要求的安全密码。
3.密码长度最小值
此安全设置确定用户账户密码包含的最少字符数。可以将值设置为介于1和14个字符之间,或者将字符数设置为“0”以确定不需要密码,这是系统的默认值。从安全的角度考虑,允许不需要密码的用户存在是非常危险的。建议密码长度不小于6位。
4.密码最长存留期
此安全设置确定在系统要求用户更改某个密码之前可以使用该密码的期间(以天为单位)。可以将密码设置为在某些天数(介于1到999之间)后到期,或者将天数设置为0(密码永不过期)。如果密码最长使用期限介于1到999天之间,密码最短使用期限必须小于密码最长使用期限。如果将密码最长使用期限设置为0,则可以将密码最短使用期限设置为介于0到998天之间的任何值。
注意
最佳操作是将密码设置为30到90天后过期,具体取决于用户的环境。这样,攻击者用来破解用户密码及访问网络资源的时间将受到限制。
5.强制密码历史
这个设置决定了保存用户曾经用过的密码个数。很多人都知道经常更换密码是个好方法,这样可以提高密码的安全性,但由于个人习惯,更换的常常是有限的几个密码。配置这个策略可以让系统记住用户曾经使用的密码,如果更换的新密码与系统“记忆”中的重复,系统就会给出提示。默认情况下,这个策略不保存用户的密码,用户可以根据自己的习惯进行设置,建议保存5个以上(最多可以保存24个)的密码。
6.密码最短使用期限
此安全设置确定在用户更改某个密码之前必须使用该密码一段时间(以天为单位)。可以设置一个介于1到998之间的值,或者将天数设置为0(允许立即更改密码)。
密码最短使用期限必须小于密码最长使用期限,除非将密码最长使用期限设置为0(密码永不过期)。如果将密码最长使用期限设置为0,则可以将密码最短使用期限设置为介于0到998之间的任何值。
如果希望“强制密码历史”有效,则需要将密码最短使用期限设置为大于0的值。如果没有设置密码最短使用期限,用户则可以循环选择密码,直到获得期望的旧密码。默认设置没有遵从此建议,以便管理员能够为用户指定密码,然后要求用户在登录时更改由管理员定义的密码。如果将密码历史设置为0,用户将不必选择新密码。因此,默认情况下将“强制密码历史”的值设置为1。
7.为域中所有用户使用可还原的加密来存储密码
使用此安全设置确定操作系统是否使用可还原的加密来储存密码。此策略为某些应用程序提供支持,这些应用程序使用的协议需要用户密码进行身份验证。使用可还原的加密储存密码与储存纯文本密码在本质上是相同的。因此,除非应用程序需求比保护密码信息更重要,否则不要启用此策略。
从上面这些设置项中我们不难得到一个最为简单有效的密码安全方案,即首先启用“密码必须符合复杂性要求”策略,然后设置“密码最短存留期”,最后开启“强制密码历史”。设置完成后,在“控制面板”中重新设置管理员的密码,这时的密码不仅本身是安全的(不低于6位且包含不同类别的字符),而且以后修改密码时也不易出现与以前重复的情况,这样的系统密码安全性非常高。
8.9.3 密码设置技巧
密码设置技巧总结如下。
• 密码的位数不要少于6位,笔者设置的密码为32位。最好使用大写字母、小写字母、特殊符号和数字的集合。
• 不要以任何单词、生日、数字、手机号、姓名或者拼音字母作为密码。
• 密码中的英文字母最好有大小之分。
• 不要用a、b、c等比较小顺序的字母或数字开头,因为用字典暴力破解一般都是从数字或英文字母排序开始的,字母或数字顺序越小,破解机率就越高。
• 也可以用一句话来设定密码,如“我是谁,我是我”。
• 不要让别人很容易地得到你的信息,包括身份证号码、电话号码、手机号码等。
• 定期更改密码。
• 不要把密码写在别人可以看到的地方,最好记在脑子里,更不能把自己的密码告诉别人(这样对自己、对别人都是不负责任的)。
8.9.4 系统密码安全检查与防护
要经常查看系统的用户是否正常,是否被添加了新的用户,或者被提升了权限。
在“开始”→“运行”窗口中输入“cmd”并按“回车”按钮,在窗口中输入命令“net user”以查看是否被添加了新用户,然后输入命令“net localgroup administrators”以查看是否有用户被提升了管理员权限。如图8-61所示,在本例中仅存在一个管理员Administrator,如果存在多个管理员权限的用户,则说明系统极有可能被人入侵了。
图8-61 查看管理员组中的用户
8.9.5 系统用户登录日志检测
日志文件作为操作系统中的一个特殊文件,在安全方面具有无可替代的价值。它每天都为我们忠实地记录系统所发生一切事件,利用它可以快速对潜在的系统入侵进行记录和预测。下面将介绍如何使用日志管理器来设置和查看安全事件。
01 打开日志管理器
依次单击“开始”→“程序”→“管理工具”→“事件查看器”选项,如图8-62所示。
图8-62 打开事件查看器
02 设置日志属性
如图8-63所示,在“系统属性”对话框的“常规”选项卡中可以对日志的大小、时间进行设置,如果发现日志记录不是在这个范围内,那么系统可能就被人“闯入”,而且修改了日志。
图8-63 修改日志默认设置
03 使用筛选器记录日志审核结果
打开筛选器,对日志中的事件类型等进行筛选。如图8-64所示,选中所有的时间类型,这样系统中发生的事件将会自动记录在案。
图8-64 使用筛选器记录事件
属性设置好后,就可以查看日志了,从中我们可以发现入侵者的蛛丝马迹。为了预防入侵者对日志的破坏,我们还要定期对日志进行备份,如果有需要,还可以恢复之前的日志文件。
8.10 使用chkrootkit和rkhunter检查Linux后门
Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较常见的是Rootkit一般和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。技术是双刃剑,我们研究它的目的在于,通过我们的研究用这项技术来保护系统,使系统更加健壮,充分发挥技术的正面应用。好多人有一个误解,他们认为Rootkit是获得系统root访问权限的工具。实际上,Rootkit是攻击者用来隐藏自己的踪迹和保留root访问权限的工具。通常情况下,攻击者通过远程攻击获得root访问权限,或者通过密码猜测或密码强制破译的方式获得系统的访问权限。进入系统后,如果他还没有获得root权限,就通过某些安全漏洞获得系统的root权限。接着,攻击者会在侵入的主机中安装Rootkit,然后通过Rootkit的后门检查系统是否有其他用户登录,如果只有攻击者自己,攻击者就开始着手清理日志中的有关信息。通过Rootkit嗅探器获得其他系统的用户和密码之后,攻击者就会利用这些信息入侵其他系统。
最早Rootkit用于善意用途,但后来被黑客用在入侵和攻击他人的计算机系统上,计算机病毒、间谍软件等也常使用Rootkit来隐藏踪迹,因此,Rootkit已被大多数的防毒软件归类为具有危害性的恶意软件。Linux、Windows、Mac OS等操作系统都有可能成为Rootkit的攻击目标。
Rootkit出现于20世纪90年代初,在1994年2月的一篇安全报告中首先使用了Rootkit这个名词。这篇安全报告是CERT-CC的CA-1994-01,题目是Ongoing Network Monitoring Attacks,最新的修订时间是1997年9月19日。从出现至今,Rootkit的技术发展非常迅速,应用越来越广泛,检测难度也越来越大。
Rootkit是一种奇特的程序,它具有隐身功能:无论静止时(作为文件存在),还是活动时,(作为进程存在),都不会被察觉。换句话说,这种程序可能一直存在于我们的计算机中,但我们却浑然不知,这一功能正是许多人梦寐以求的——无论是计算机黑客,还是计算机取证人员。黑客可以在入侵后置入Rootkit,窥探敏感信息,或等待时机,伺机而动;取证人员可以利用Rootkit实时监控嫌疑人员的不法行为——Rootkit不仅能搜集证据,还有利于及时采取行动!
8.10.1 使用chkrootkit检查Linux后门
使用chkrootkit检查Linux后门的过程介绍如下。
1.下载chkrootkit源码
chkrootkit的官方网站为http://www.chkrootkit.org,目前官方网站已经不提供源程序下载,早期官方下载地址(ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz)已经失效,但可以通过其镜像站点(http://www.chkrootkit.org/mirrors/)进行下载,下载地址为http://www.spenneberg.org/chkrootkit-mirror/files/chkrootkit.tar.gz,目前的版本为0.48,更新于2007年12月17日,后期没有再进行开发。
2.解压下载的安装包
运行如下命令解压下载的安装包。
tar -zxvf chkrootkit.tar.gz
3.编译安装
使用make sense命令进行编译,示例如下。
cd chkrootkit-0.48
make sense
把编译好的文件部署到“/usr/local/”目录中,并删除遗留的文件,示例如下。
cd ..
cp -r chkrootkit-0.48 /usr/local/chkrootkit
rm -r chkrootkit-0.48
至此,安装完毕。安装好的chkrootkit程序位于“/usr/local/chkrootkit/chkrootkit”目录下。
4.进行检查
使用chkrootkit命令必须以root权限进行,示例如下。
Usage: ./chkrootkit [options] [test ...]
chkrootkit命令有以下一些参数可以配合使用。
• -h:显示帮助信息。
• -V:显示版本信息。
• -l:显示测试内容。
• -d:Debug模式,显示检测过程中的相关指令程序。
• -q:安静模式,只显示有问题的部分。
• -x:高级模式,显示所有检测结果。
• -r dir:设置指定的目录为根目录。
• -p dir1:dir2:dirN:检测指定目录。
• -n:跳过NFS连接的目录。
01 查看感染结果,示例如下,此时即可对系统Rootkit进行全面扫面,并滚动显示结果。
./chkrootkit | grep INFECTED
02 检查受木马感染的ps、ls命令,以及网络接口是否处于混杂模式,示例如下。
./chkrootkit ps ls sniffer
03 以专家模式进行Rootkit检查,示例如下。
./chkrootkit–x | more
04 查看结果。一共有4种结果,分别是“NFECTED”、“not infected”、“not found”和“Vulnerable but disabled”。INFECTED:测试已确定可能被已知的Rootkit修改,即被感染。
• not infected:测试没有发现任何已知的Rootkit签名。
• not tested:未进行测试,可能的情况有试验是特定的操作系统、该测试依赖于外部程序时不可用、一些特定的命令行选项中给出(例如“-r”)。
• not found:被测试的命令不可用。
• Vulnerable but disabled:该命令被感染,但没有使用。
8.10.2 使用rkhunter检查Linux后门
rkhunter的中文名叫“Rootkit猎手”(Rootkit Hunter),可以发现大约58个已知的Rootkit和一些嗅探器和后门程序。它通过执行一系列的脚本来确认计算机是否已经感染Rootkit,如检查Rootkit使用的基本文件,可执行二进制文件的错误文件权限,检测内核模块等。
rkhunter由Michael Boelen开发,是开源(GPL)软件。rkhunter的最新版本为1.4.2,官方下载地址为http://sourceforge. net/projects/rkhunter/files/。
1.解压并安装
运行如下命令解压rkhunter安装包。
tar -zxvf rkhunter-1.4.2.tar.gz
cd rkhunter-1.3.4
运行如下命令安装rkhunter。
#./installer.sh --layout default --install
使用“./installer.sh-h”命令查看其帮助信息,示例如下。
Usage: ./installer.sh <parameters>
• --help (-h):显示帮助。
• --examples:显示安装实例。
• --layout<value>:选择安装模板(安装必选参数)。
• --striproot:带路径的自定义布局(维护者包)。
• --install:根据选择目录安装。
• --show:显示安装路径。
• --remove:卸载rkhunter。
• --version:显示安装版本。
2.rkhunter的操作
(1)常规rootkit检测
二进制可执行文件rkhunter安装到“/usr/local/bin”目录下,需要以root身份运行该程序。可以通过运行下面的命令检测机器是否已感染rootkit。
# rkhunter -c
程序运行后,主要执行下面一系列的检查。
01 MD5校验测试,检测任何文件是否被改动。
02 检测rootkit使用的二进制和系统工具文件。
03 检测特洛伊木马程序的特征码。
04 检测大多数常用程序的文件异常属性。
05 执行一些系统相关的测试(因为rkhunter可支持多个系统平台)。
06 扫描任何混杂模式下的接口和后门程序常用的端口。
07 检测如“/etc/rc.d/”目录下的所有配置文件、日志文件、任何异常的隐藏文件等。例如,在检测“/dev/.udev”和“/etc/.pwd.lock”文件时候收到系统警告。
08 对一些使用常用端口的应用程序进行版本测试,如Apache Web Server、Procmail等。
完成上面的检测后,屏幕上会显示扫描结果,其中包括可能被感染的文件、不正确的MD5校验文件和已被感染的应用程序。
(2)未知的错误检测
执行未知的错误检测,示例如下。
./rkhunter -c -scan-knownbad-files
(3)更新rkhunter数据库
rkhunter通过一个含有rootkit名字的数据库来检测系统的rootkits漏洞,所以经常更新该数据库非常重要。可以通过下面命令来更新该数据库。
# rkhunter -update
8.11 Windows下PHP+MySQL+IIS的安全配置
本节的学习目的是达到万网、新网等专业级个人或者企业服务器级别的安全。这里有非常多的小技巧,希望读者能够熟练掌握。
8.11.1 NTFS权限的简单介绍
下面介绍NTFS权限的基本概念。
1.NTFS介绍
Windows的文件或者目录权限都是利用NTFS的功能来实现访问规则的。
NTFS(New Technology File System)是Windows NT操作环境和Windows NT高级服务器网络操作系统环境的文件系统。NTFS的目标是提供以下特性:可靠性,通过可恢复能力(事件跟踪)和热定位的容错特征实现;增加一个功能性的平台;对POSIX需求的支持;消除FAT和HPFS文件系统中的限制。
NTFS提供长文件名、数据保护和恢复,并通过目录和文件许可实现安全性。NTFS支持大硬盘和在多个硬盘上存储文件(称为跨越分区)。例如,一个大公司的数据库可能大得必须跨越不同的硬盘。NTFS提供内置的安全性特征,它控制文件的隶属关系和访问。从DOS或其他操作系统上不能直接访问NTFS分区上的文件。如果要在DOS下读写NTFS分区文件,可以借助第三方软件。如今,在Linux系统中已可以使用NTFS-3G进行对NTFS分区的完美读写,不必担心数据丢失。这是Windows NT安全性系统的一部分,但是只有在使用NTFS时才是这样。
2.使用convert命令转换FAT32分区为NTFS分区
如果服务器使用的是FAT32分区,那么强烈建议修改成NTFS分区。如果把系统安装在C盘并且是FAT32分区,那么默认这台服务器上所有的用户都具有修改权限,也就是说,任何人都能删除或者修改C盘上的重要文件。这样的情况我们当然是不希望看到,所以在这里需要把FAT32修改成NTFS的磁盘格式。
这里使用的命令是convert,它的基本语法很好理解。把C盘的FAT32分区修改成NTFS分区,如图8-65所示,在这里输入“Y”就开始自动转换了。
图8-65 使用convert转换磁盘分区
提示
Windows 2003开始安装时最好用NTFS分区快速格式化,不要使用FAT32分区,如图8-66所示,以避免麻烦。
图8-66 使用convert命令将FAT32分区转换成NTFS格式
8.11.2 NTFS详解之磁盘配额
下面我们了解一下NTFS磁盘配额的基本概念及用法。
1.NTFS磁盘配额介绍
NTFS与FAT32相比增加了一些功能,如图8-67和图8-68所示。NTFS的主要功能有安全、磁盘配额等。
图8-67 NTFS分区磁盘功能
图8-68 FAT32分区磁盘功能
了解一下磁盘配额的基本含义。想象一下,如果任何人都可以随意占用服务器的硬盘空间,服务器硬盘能支撑多久?所以,限制和管理用户使用的硬盘空间是非常重要的,无论是文件服务、FTP服务还是电子邮件服务,都要求对用户使用的磁盘容量进行控制,以避免对资源的滥用。Windows 2003中的磁盘配额(Disk Quotas)能够简单高效地实现这个功能,相比其他配额软件,它具有“原装”的优势。所谓磁盘配额就是管理员可以对本域中的每个用户所能使用的磁盘空间进行配额限制,即每个用户只能使用最大配额范围内的磁盘空间。磁盘配额监视个人用户卷的使用情况,因此,每个用户对磁盘空间的利用都不会影响同一卷上其他用户的磁盘配额。
2.启用磁盘配额
图8-69 启用磁盘配额管理
默认情况下磁盘配额是关闭的,我们需要开启磁盘配额功能并进行相关的配置。一般将磁盘空间限制为希望提供给普通用户或者网站的容量。例如,提供100MB的空间,但允许在此基础上使用超过20MB的空间,在这里就可以设置成如图8-69所示的情况。警告等级其实就是网站的容量如果超过100MB的话,最多可以使用120MB。下面的两个选项就比较简单了,主要是日志记录功能,如果网站使用的是虚拟机,这个功能比较有用。
3.使用磁盘配额阻止黑客入侵
下面重点介绍一个非常实用的阻止黑客把木马程序或者后门程序传到服务器上的方法。当然,这是有前提的:如果是企业网站,也就是说更新不频繁的情况下,可以使用这个好方法来阻止黑客进行上传文件等操作。
如图8-70所示,勾选“拒绝将磁盘空间给超过配额限制的用户”这个选项,同时把将磁盘空间限制为1kb,同时设置将警告空间限制为1kb,然后勾选“用户超出配额限制时记录事件”和“用户超过警告时记录事件”这两个选项。这样,如果系统中有其他用户超出了分区的警告等级和配额限制,系统将把这些事件自动记录到系统日志当中,这非常有利于管理员对系统分区空间的监控。如图8-70和图8-71所示,我们可以看到没有启用限额和启用磁盘配额以后的区别,启用磁盘配额以后,无法向这个分区写入大于配额的文件,并且这个配置对系统中所有的用户生效,包括Administrators组中的用户。
图8-70 未启用磁盘配额
图8-71 启用磁盘配额管理
如图8-72所示,Administrator组中的用户也不能写入文件了。我们不是启动了日志记录功能了吗?看一下警告内容。右键单击“我的电脑”图标,从弹出快捷菜单中选择“管理”选项,然后依次单击“系统工具”→“事件查看器”→“系统”选项,查看日志记录,如图8-73所示。
图8-72 管理员也无法复制文件
图8-73 使用事件管理器查看事件
技巧
(1)启动IIS需要的账号是“IUSR_计算机名”,如果我们建立网站的话,对应的访问者应该也是这个账号,所以,这里可以设置成“IUSR_计算机名”用户不能写入文件,但是其他用户能够写入文件。
(2)开启FTP服务,然后给FTP服务一个普通的账号和密码,把Web服务器的对应目录的读写权限赋予这个普通用户,然后利用磁盘配额功能让这个用户可以写入,这样就达到了一个非常高的安全性。怎么做呢?如图8-74所示,单击“配额项”按钮,然后依次选择“配额”→“新建配额项”选项,将弹出用户选择窗口。选择FTP用户ftpuser,然后把磁盘空间限制设置成100MB,如图8-75所示。同理,选择“IUSR_计算机”这个账号,把磁盘限额的空间设置成1kb。到这里,我们的设置基本上完成了。
图8-74 配置磁盘配额给FTP用户
图8-75 为ftpuser设置访问磁盘空间大小
再说一下这样做的目的。我们利用IIS提供的Web服务器的启动权限是“IUSR_计算机”这个用户,也就是说,普通用户就是利用这个账号访问的。同时,我们不希望访问用户利用黑客手段对服务器进行文件上传等操作,这时就可以利用磁盘配额功能添加ftpuser账号,这个账号可以利用FTP软件对Web目录进行服务器的维护工作,这样就达到了非常高的安全标准。
8.11.3 NTFS详解之Windows权限
下面我们了解一下NTFS分区Windows权限的基本概念及用法。
1.NTFS访问规则控制
NTFS的另一个非常重要的功能是对磁盘或者文件和文件夹的访问规则进行控制,即Windows的权限。Windows的权限大体上可以分为完全控制、修改、读取和运行,以及列出文件夹目录、读取、写入、特别的权限。同时,权限有4个特性,分别是继承性、累加性、优先性、交叉性。
2.NTFS的7种权限
(1)完全控制权限
“完全控制”就是对目录拥有不受限制的完全访问,其地位就像Administrators在所有组中的地位一样。选中“完全控制”选项,下面的5个属性选项将被自动选中。
(2)修改权限
“修改”则像“Power users”。选中该选项,下面的4个属性选项将自动被选中。当下面的任何一项没有被选中时,修改条件将不再成立。
(3)读取和运行权限
“读取和运行”就是允许读取和运行目录下的任何文件,“列出文件夹目录”和“读取”是“读取和运行”的必要条件。
(4)列出文件夹目录权限
“列出文件夹目录”是指只能浏览该卷或目录下的子目录,不能读取,也不能运行。
(5)读取权限
“读取”是指能够读取该卷或目录下的数据。
(6)写入权限
“写入”就是能向该卷或目录中写入数据。
(7)特别的权限。
“特别的权限”则是对以上的6种权限进行了细分。
3.NTFS的特性
(1)权限的继承性
权限的继承性就是下级文件夹的权限设置在未重设之前是继承其上一级文件的权限设置的,更明确地说,就是如果一个用户对某一文件夹具有“读取”的权限,那么这个用户对这个文件夹的下级文件夹同样具有“读取”的权限,除非打断这种继承关系,重新设置。但要注意,这仅是对静态的文件权限来讲,对文件或文件夹的移动或复制,其权限的继承性依照如下原则进行。
• 在同一NTFS分区内复制或移动:在同一NTFS分区内复制时,它的访问权限是和原文件或文件夹的访问权限不一样的。但在同一NTFS分区内移动一个文件或文件夹时,其访问权限保持不变,即继承移动前的访问权限。
• 在不同NTFS分区间复制或移动:在不同NTFS分区间复制文件或文件夹,访问权限会随之改变,复制的文件不是继承原权限,而是继承目标(新)文件夹的访问权限。同样,如果是在不同的NTFS分区间移动文件或文件夹,则访问权随着移动而改变,即继承移动后所在文件夹的权限。
• 从NTFS分区复制或移动到FAT分区:因为FAT格式的文件或文件夹根本没有权限设置项,所以原来的文件或文件夹也就不再有访问权限配置了。
(2)权限的累加性
NTFS文件或文件夹的权限累加性具体表现在以下方面。
• 工作组权限由组中各用户权限累加决定:如一个组Group1中有两个用户User1、User2,他们对某文件或文件夹的访问权限分别为“只读”和“写入”,那么组Group1对该文件或文件夹的访问权限就为User1和User2的访问权限之和,实际上是取其最大的那个,即“只读+写入=写入”。
• 用户权限由所属组权限的累加决定:如一个用户User1同时属于组Group1和Group2,而Group1对某一文件或文件夹的访问权限为“只读”,而Group2对这一文件或文件夹的访问权限为“完全控制”,则用户User1对该文件或文件夹的访问权限为两个组权限累加所得,即“只读+完全控制=完全控制”。
(3)权限的优先性
权限的这一特性包含两种子特性:一是文件的访问权限优先于文件夹的权限,也就是说,文件权限可以越过文件夹的权限,不顾上一级文件夹的设置;二是“拒绝”权限优先于其他权限,也就是说,“拒绝”权限可以越过所有其他权限,一旦选择了“拒绝”权限,则其他权限不能起任何作用,相当于没有设置。下面就具体讲解一下这两种子特性。
• 文件权限优先于文件夹权限:如果用户USER1对文件夹Folder A的访问权限为“只读”,在这个文件夹下有一个File1文件,则可以对这个文件File1设置权限为“完全控制”,而不顾它的上一级文件Folder A的权限设置情况。
• “拒绝”权限优先其他权限:如果一个用户User1同时属于组Group1和组Group2,其中组Group1对文件File1(或文件夹)的访问权限为“完全控制”,而用户Group2对文件File1的访问权限设置为“拒绝访问”,那么根据这个特性,User1对文件File1的访问权限为“拒绝访问”,而不管工作组Group1对这个文件设置了什么权限。
(4)访问权限和共享权限的交叉性
当同一文件夹在为某一用户设置了共享权限的同时,又为用户设置了该文件夹的访问权限,且所设权限不一致时,它的取舍原则是取两个权限的交集,即最严格、最低的权限。例如,文件夹Folder A为用户User1设置的共享权限为“只读”,同时,文件夹Folder A为用户User1设置的访问权限为“完全控制”,那么用户User1的最终访问权限为“只读”。当然,这个文件夹只能是在NTFS文件格式的分区中,FAT格式的分区中不存在“访问”权限(因为FAT文件格式的文件夹没有本地访问权限的设置)。
8.11.4 变态Windows权限配置
图8-76 普通磁盘用户的权限
下面介绍变态Windows权限配置的相关内容。
1.常见提权方法
如果想把Windows权限配置得变态,必须了解现在常见的提权方法。网上有很多提权方法和视频,这里就不多说了。
2.设置用户的磁盘权限
介绍具体的权限之前,我们看一下普通的磁盘的权限。如图8-76所示,这里包括Everyone和Users账户,他们的权限是可以查看目录的内容。因为系统盘的内容不希望被其他人看到,所以必须禁止这些权限,在这里把Everyone和Users用户删除,只留下Administrator和SYSTEM。同理,把D、E、F盘都设置成这样的权限。
注意
这里的服务器只有4个磁盘,所以设置成了4个。如果有多个磁盘,一定要把所有的磁盘都设置成和C盘相同的权限。除了Web目录中的一些目录设置成可写以外,其他地方绝对不允许有可写目录存在。当然,有个例外是c:\windows\temp目录,因为很多程序需要把文件上传到这里,下面会讲解如何详细配置c:\windows\ temp目录。
3.设置c:\Documents and Settings的权限
设置c:\Documents and Settings的权限时,同样只保留Administrator和SYSTEM权限。虽然设置了“Documents and Settings”目录的权限,但是目录下的文件还是具有自己的权限,如图8-77所示。所以,这里还需要继续修改。在“Documents and Settings”的“Administrator”目录下可以看到默认权限只有Administrator、Administrators和SYSTEM,所以这里不需要修改了。继续看“All Users”目录,默认权限不小,所以还是保留Administrator和SYSTEM。了解了上面的步骤以后,依次对“All Users”下面的所有目录(注意:这里是所有目录)都只保留Administrator和SYSTEM权限。
图8-77 设置c:\Documents and Settings的权限
4.设置c:\program and files目录的权限
同理,c:\program and files目录也只保留Administrator和SYSTEM权限。但是,我们必须把“Common Files”这个目录设置成如图8-78所示的权限。
图8-78 设置c:\program and files目录的权限
5.设置inetsrv目录的权限
如果服务器安装了IIS,会在c:\windows\system32目录下创建一个“inetsrv”目录,这里有个文件夹叫“ASP Compiled Templates”,如图8-79所示,IIS的启动用户“IUSR_计算机名”具有完全控制权限。因为这个目录很少有人注意,所以一直成为提权的杀手锏。我们必须把这个目录的“IUSR_计算机名”这个用户删除。
图8-79 删除IIS_WPG完全控制权限
6.设置c:\windows\temp目录的权限
c:\windows\temp目录的设置需要考虑的因素非常多。首先,许多应用程序把上传的临时目录设置成这里,所以这个目录必须有可写权限,但是如果设置成可写,黑客能够通过在这里上传cmd.exe等程序进行提权。其次,一些服务器的虚拟管理软件,如hzhost默认把Session写入这里,这样就造成了安全隐患。因为Session中可能包含虚拟机的用户和密码,所以读权限也要谨慎设置。最后,这里也是系统的临时文件夹,很多程序的运行依赖这里。
权衡利弊,我们需要根据具体的情况具体配置。对企业或者个人服务器没有安装hzhost等软件的情况,设置成如图8-80所示的权限,把所有用户删除,保留Administrator和SYSTEM,然后添加Everyone修改、读取及运行,列出文件目录、读取、写入权限。
图8-80 设置c:\windows\temp目录的权限
到这里,我们就完成了NTFS的基本配置,这样设置的安全性会大大提高。
8.12 Windows下PHP+MySQL+IIS安全平台的高级配置
经过前面的学习可以了解IIS+MySQL+PHP的基本配置过程和Windows的基本权限设置,下面介绍PHP的安全配置、Web目录的安全配置及IIS的高级安全配置。
这里设置的最终目标是Web站点只运行PHP,不支持ASP和ASP.NET,让特定的目录或者子网站不能执行PHP脚本。例如,将图片目录设置成不能运行PHP,这样就算网站有被登录后台的危险,黑客能够上传文件,最终也不能执行WebShell;就算黑客拿到了WebShell,也无法读目录或者文件,不能执行命令。换句大话就是:强大的WebShell在黑客手上没有任何利用价值。
8.12.1 php.ini文件
为什么把php.ini放在最前面写呢?由于Web网站是PHP的,很多默认的选项是不安全的,给黑客留下了非常多的可利用机会,所以,首先必须要把php.ini设置得变态些,这样就能阻止一般脚本黑客的攻击了。
我们先来了解php.ini的基本概念。空白字符和以分号开始的行被简单地忽略,设置指令的格式如下。
directive = value
• 指令名(directive):是大小写敏感的,所以“foo=bar”不同于“FOO=bar”。
• 值(value):可以是用引号界定的字符串(如“foo”)、一个数字(整数或浮点数,如0、1、34、 -1、33.55)、一个PHP常量(如E_ALL、M_PI)、一个INI常量(如On、Off、none)、一个表达式(如“E_ALL& ~E_NOTICE”)。
还有一个是设置布尔值,“1”表示“On”(开启),“0”表示“Off”(关闭)。php.ini分了很多部分,如模块部分、PHP全局配置、数据库配置等。如图8-81所示是一个基本的php.ini。
图8-81 php.ini文件参数
8.12.2 php.ini参数的安全设置
了解了基本的概念以后,我们就可以开始高级配置之旅。下面分别介绍php.ini中涉及安全的重要参数。
第一个重要的参数是register_globals。这个配置影响PHP如何接收传递过来的参数。register_ globals的意思是注册为全局变量,所以当它开启的时候,传递过来的值会被注册为全局变量直接使用,而当它关闭的时候,我们需要到特定的数组里去得到它。从众多PHP漏洞来看,一大部分是在register_globals开启的时候被利用的,所以强烈建议将这个参数修改成“Off”。PHP的最高版现在都是默认设置为“Off”,如果使用的版本比较低,一定要修改这个参数。
第二个重要的参数是magic_quotes_gpc。如果把magic_quotes_gpc参数设置成“Off”,那么PHP就不会对“'”(单引号)、“"”(双引号)、“\”(反斜线)和空字符进行转义,这样就可能造成服务器非法注入。但是,如果把magic_quotes_gpc设置成“On”,如果$_POST、$_GET、$_COOKIE提交的变量中有上面4种字符,PHP就会给它们加上“\”,这样可以大大提高PHP的安全。强烈推荐将magic_quotes_gpc设置为“On”。
第三个比较重要的参数是display_errors。之所以说这个参数重要,是因为没有不会犯错误的开发者,PHP的display_errors参数就是帮助开发者定位和确定这些错误的。可是,如果PHP提供的这些信息被黑客了解,那就不妙了。某网站因为没有对display_errors进行设置,导致Web目录泄露。这对于黑客来说可是非常重要的信息,因为很多时候的渗透都需要知道Web目录,如WebShell的写入等,所以强烈推荐把这个参数设置成“Off”。
第四个重要的参数是safe_mode,也就是我们常说的安全模式。PHP的安全模式是一个非常重要的内嵌安全机制,能够控制PHP中的一些函数,如system()等,同时对很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件进行操作,如/etc/passwd。但是,默认的php.ini是没有打开安全模式的,可以使用命令“safe_mode = on”将它打开。
第五个参数是open_basedir。使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,在一定程度上降低了WebShell的危害。一般可以设置为只能访问网站目录,命令为“open_basedir = E:\test”。
第六个参数是disable_functions。使用disable_functions参数可以限制一些对于系统来说威胁很大的函数,如我们在第一部分中看到的phpinfo()函数可以看到关于PHP的环境变量等,还可以利用system、exec等函数执行系统命令等。在这里我们推荐过滤的函数有disable_functions=phpinfo、passthru、exec、system、chroot、scandir、chgrp、chown、shell_exec、proc_Open、proc_get_status、ini_alter、ini_alter、ini_restore、dl、pfsockopen、openlog、syslog、readlink、symlink、popepassthru、stream_socket_server。如果对某个函数不了解,可以使用搜索引擎得到函数的相关介绍,然后决定服务器是否禁止。
第七个参数是com组件。Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode)仍然允许攻击者使用COM()函数来创建系统组件,进而执行任意命令。漏洞出现的原因是,在安全模式下的PHP平台虽然system()、pathru()函数被禁止,但是com.allow_dcom参数的设置依旧为“True”,以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令。如果是默认的Apache设置或者Web服务器以Loacalsystem权限或Administrators权限运行,攻击者可以使用这个漏洞来提升权限。所以,我们必须要关闭com.allow_dcom这个参数(默认值是“True”,需要把这个参数修改成“com.allow_dcom=false”)。
第八个参数是expose_php。这个参数决定是否暴露PHP被安装在服务器上。如图8-82所示,如果这个参数设置为“On”,就会把PHP的版本等泄露,推荐值是“Off”。
图8-82 是否暴露PHP
参数基本上介绍完了。当然,php.ini还有其他内容需要配置,但大部分都与安全无关,而是与PHP运行的效果有关,如优化等。如果读者感兴趣,可以参考PHP的官方手册。
注意
修改php.ini以后,必须重新启动IIS,否则设置的内容将不会生效。
8.12.3 IIS指定目录运行或者不运行PHP
配置完php.ini,虽然已经相当安全了,但最重要的设置还是在IIS上。IIS可以限制某些用户的登录,同时可以通过为数据增加SSL(安全套接层)来增强数据在传输过程中的安全性。可以利用IIS限制某些应用程序,如PHP的执行规则让PHP只能运行在指定的目录中,而其他的目录中是不能执行PHP的,这个规则可以运行文件上传目录、读取图片文件,但不能运行PHP文件。
如图8-83所示,可以看到网站和网站的资源,画线部分是网站目录,2008.php是程序文件。
图8-83 网站目录和文件
在网站根目录中新建一个目录,如“images”目录,然后在“images”目录下建立一个2009.php文件,内容是phpinfo的内容,如图8-84所示,能够正常访问并执行,说明程序运行了。
图8-84 运行2009.php程序
要达到的目的是让这个目录不支持PHP的执行,有以下两种方法。
第一种是打开IIS信息服务管理器和网站,找到新建的目录,打开目录的属性对话框,如图8-85所示,在“执行权限”下拉列表中有3个选项,分别是“无”、“纯脚本”和“脚本和可执行文件”。这里选择“无”选项,然后单击“确定”按钮。刷新页面,重新运行2009.php程序,如图8-86所示,页面就无法运行了。
图8-85 设置执行权限
图8-86 不能运行2009.php程序
第二种办法是利用应用程序池来配置,具体的实现方法如图8-87所示,单击“创建”按钮,即可创建一个和网站名字相同的应用程序池。
图8-87 创建应用程序池
单击“配置”按钮,出现如图8-88所示的“应用程序配置”文本框,将“应用程序扩展”列表框中的“.php”扩展删除,就不能运行PHP脚本了。
图8-88 配置应用程序池
再次刷新,运行程序,就会出现404错误,而图片仍然可以访问,如图8-89所示。
图8-89 访问图片正常
当然,上面的配置也可以用于特定的服务器。例如,公司规模比较大,需要建立一个专门的图片服务器来缓解主服务器的负载时,可以使用这个方法。
8.12.4 身份验证高级配置
给特定的目录集成了Windows 2003的身份验证功能,如后台的设置等。一个常见的场景如下。
如果后台目录是admin,这里有2个验证用户和密码。第一道防护是服务器上的集成身份验证,就是在服务器上添加一个用户,然后设置一个非常变态的密码。第二道防护是网站本身的用户名和密码。当然,这两道防护的密码一定不能相同,否则就没有效果。我们来实现一下这个功能。例如,我们要配置的目录是admin,打开“admin属性”文本框,如图8-90所示,切换到“目录安全性”选项卡。
图8-90 设置目录安全
单击“身份验证和访问控制”设置区的“编辑”按钮,如图8-91所示,勾选“集成Windows身份验证”选项,取消勾选“启用匿名访问”选项,然后单击“确定”按钮。
图8-91 设置身份验证方法
再次访问就出现了如图8-92的对话框,要求输入Windows服务器上的用户和密码。新建一个本地用户,然后把其权限设置为最低。
图8-92 授权最小权限用户访问
依次单击“开始”→“运行”选项,输入“cmd”,然后在CMD环境中输入“net user test test/add”命令,添加test用户到系统中。下面需要降低test用户的权限,右键单击“我的电脑”图标,在弹出的快捷菜单中选择“管理”选项,如图8-93所示,右键单击新建的test用户,在弹出的快捷菜单中选择“属性”选项,为其中设置用户密码永不过期,然后选择“拨入”选项,设置拒绝访问。单击“确定”按钮回到刚才的目录中,输入新建的用户名和密码就可以正常查看网页了。
图8-93 设置用户权限
8.12.5 设置服务器只支持PHP脚本
设置服务器只支持PHP脚本,如图8-94所示,只留下“.php”的扩展名就可以了,其他全部删除。当然,如果服务器需要支持ASP和ASP.NET,可以只留下ASP、ASP.NET和PHP就行了,其他全部删除。
图8-94 仅支持PHP脚本
8.12.6 Web目录的变态权限配置
网站的目录是e:\test。打卡改目录的属性对话框,如图8-95所示,在“test属性”对话框中将“IUSR_计算机名”添加进来,这个账号是IIS匿名用户的访问账号(注意:框中部分一定不要选择,否则黑客就能上传WebShell到网站目录了)。但是这样设置仍然不够,如网站需要上传图片的时候就无法操作了,这个时候我们需要把图片目录设置成可写权限,如图8-96所示。同时,结合前面的设置,把这个目录设置成不能执行PHP,这样就实现了目录的变态配置。
图8-95 为特定目录网络用户授权
图8-96 设置图片目录不运行脚本
8.13 Linux操作系统root账号密码获取防范技术研究
Linux操作系统由于其开源性、低成本等特点,在商业上运用越来越多,很多公司都采用LAMP(Linux+Apache+MySQL+PHP)典型架构。相对于Windows操作系统的密码获取技术而言,Linux的密码获取比较困难。在Windows中,不论设置多么复杂的密码,都可以通过彩虹表、键盘记录、mimikatz_trunk域名注入获取密码等技术获取包括Windows 2008 Server在内的所有操作系统密码。但在Linux操作系统中,如果设置一个非常复杂的密码,破解成功的几率相对较低。在获得网站WebShell权限的前提下,通过提权等方法可以获得系统权限,通过查看“/etc/shadow”文件的内容可以获取Linux操作系统的用户名和加密密码,但获取最高权限root用户的密码就比较困难。直接添加账号容易被发现,所以获取root账号的密码非常必要。
本节的主要研究内容包括:使用普通用户权限记录root密码,使用SSH后门方法记录root密码,安装Rootkit后门程序记录root账号密码,通过John工具破解shadow密码,专用Sulog后门记录SU密码。
8.13.1 Linux密码原理
简单介绍一下Linux密码的原理。
1.Linux密码构成
在Linux系统中,涉及系统登录密码的重要文件有两个,分别是“/etc/passwd”和“/etc/shadow”,第一个文件记录用户信息,第二个文件真正保存用户密码信息。在“/etc/passwd”文件中,每一行表示一个用户的信息,一行有7个段位,每个段位用冒号分割。下面是一个Linux系统中的“/etc/passwd”文件的两行,其格式为“username:x:UID:GID:username full:username home:shell type”。
• 第1字段:用户名(也称为登录名)。
• 第2字段:口令,显示为x,表示其实密码已被映射到“/etc/shadow”文件中。
• 第3字段:UID。
• 第4字段:GID。
• 第5字段:用户名全称,这是可选的,可以不设置。
• 第6字段:用户的根目录所在位置。
• 第7字段:用户所用Shell的类型,常见为“/bin/bash”。
“/etc/shadow”文件是“/etc/passwd”的影子文件,这个文件并不是由“/etc/passwd”产生的,这两个文件应该是对应互补的。shadow的内容包括用户名及被加密的密码,以及其他“/etc/passwd”文件中不能包括的信息,如用户的有效期限等。这个文件只有root权限可以读取和操作。“/etc/shadow”文件的内容包括9个段位,每个段位之间用冒号分割。通过研究发现,即使两个账号的密码相同,其密码加密值也不一样。各个字段的含义如下。
• 第1字段:用户名(也称为登录名),“/etc/shadow”文件中的用户名和“/etc/passwd”文件中的用户名是相同的,这样就把passwd和shadow中使用的用户记录联系在一起,这个字段是非空的。
• 第2字段:密码(已被加密)。如果有些用户在这个字段是x,表示这个用户不能登录系统。这个字段是非空的。
• 第3字段:上次修改口令的时间。这个时间是从1970年1月1日起到最近一次修改口令的时间间隔(以天为单位)。用户可以通过passwd来修改用户的密码,然后查看“/etc/shadow”文件中此字段的变化。
• 第4字段:两次修改口令的最短间隔天数,也就是说,用户必须经过多少天才能修改其口令,如果设置为0则禁用此功能。此项功能的用处不是太大,默认值是从“/etc/login.defs”文件定义中获取的,PASS_MIN_DAYS中有定义。
• 第5字段:两次修改口令的最长间隔天数。该功能能够增强管理员管理用户口令的时效性,即增强了系统的安全性。系统默认值是在添加用户时从“/etc/login.defs”文件的定义中获取的,在PASS_MAX_DAYS中定义。
• 第6字段:设置提前多少天警告用户口令将过期。当用户登录系统后,系统登录程序提醒用户口令将要作废。系统默认值是在添加用户时从“/etc/login.defs”文件的定义中获取,在PASS_WARN_AGE中定义。
• 第7字段:口令过期之后多少天禁用此用户。此字段表示用户口令作废多少天后系统会禁用此用户,也就是说,系统不再让此用户登录,也不会提示用户过期,而是完全禁用。
• 第8字段:用户过期日期。此字段指定了用户作废的天数(从1970年1月1日开始的天数),如果这个字段的值为空,则账号永久可用。
• 第9字段:保留字段,目前为空,以备将来Linux发展之用。
某系统root账号在“etc/shadow”文件中的表现方式为“root:$1$kbIAhX/R$PiLL1U.n6bivtIr4o Ti2y0:15377:0:99999:7:::”。
2. Linux密码文件位置
绝大部分Linux操作系统的密码文件名称为shadow,但也有一些特殊的Linux/UNIX操作系统的密码文件名称为passwd,而且密码文件所在位置也不一样。下面是一些常见Linux系统的密码文件位置。
• Linux:/etc/shadow。
• SystemV Release 4.2:/etc/security。
• SystemV Release 4.0:/etc/shadow。
• SunOS 5.0:/etc/shadow。
• SCO UNIX:/tcb/auth/files/。
• OSF/1:/etc/passwd。
• HP-UX:/.secure/etc/passwd。
• BSD 4.x:/etc/master.passwd。
• AIX3:/etc/security/passwd。
• IRIX5:/etc/shadow。
8.13.2 Linux系统采用的加密算法
下面介绍Linux系统采用的加密算法。
1.查看密码的加密算法
Linux账户的密码加密后存放于“/etc/shadow”文件中。Linux操作系统的密码采用的加密方式,取决于“/etc/pam.d/system-auth”或者“/etc/pam.d/passwd”文件中的定义,通过“more/etc/pam.d/system-auth”或者“authconfig--test| grep hashing”命令可以获取操作系统使用哪种加密算法,目前有SHA-256、SHA-512和MD5加密算法。
在Red Hat Enterprise Linux Server中,可以通过“authconfig--test| grep hashing”命令获取当前系统账号的密码加密算法,如图8-97所示。
图8-97 获取Red Hat Enterprise Linux Server系统账号加密算法
2.Linux/UNIX采用5种加密算法
Linux/UNIX操作系统目前采用5种加密算法,可以通过加密后的密码值来识别,主要是通过账号后面的$X进行判断。 $1表示MD5加密算法,$2表示使用Blowfish加密算法,$5表示使用SHA-256加密算法,$6表示使用SHA-512加密算法,其余为标准的DES。例如,“root: $1$kbIAhX/R$PiLL1U. n6bivtIr4oTi2y0:15377:0:99999:7:::”的加密算法为MD5。
3.Linux密码操作
对于Linux密码操作,主要有增加、删除和修改,第一次添加用户时需要设定一个密码,修改密码使用“passwd”,删除用户时系统将自动删除设置的密码。读取密码加密文件的用户必须具备root权限,通过“cat/etc/shadow”命令可以读取shadow文件的内容。
8.13.3 获取Linux root密码方法研究
Linux Root账号和密码的获取方法主要有4种,分别是键盘记录、嗅探、替换关键程序及暴力破解。目前没有非常完美的密码获取方法。
1.键盘记录获取法
根据操作系统内核版本,编译一个修改过的SSH或者内核键盘记录软件,早期的键盘记录软件有Keylogger、Keylog等。在root账号下通过编译键盘记录程序或者执行编译好的键盘记录程序,当root用户登录时,程序自动捕获root账号输入的密码。此方法需要有root权限,但可以做得极为隐秘。例如,使用内核键盘记录功能增加模块隐藏、文件隐藏、链接隐藏等功能,以增强程序的隐秘性。
2.嗅探
在Windows操作系统中可以使用Cain嗅探FTP、POP3、SSH等应用程序登录的口令,在Linux中可以使用Dsniff嗅探root账号的登录口令。通过在相同网段中的被控机器上发送ARP欺骗数据包,将目标机器的流量导入被控主机,并分析其密码(如FTP、SSH)。如果被控服务器是Linux服务器,目前通过开源软件比较难抓取SSH的密码(需要进行中间人攻击,Dsniff不具备中间人攻击的能力,而Windows下的Cain已实现伪造证书进行中间人攻击),所以,可以变通地通过抓取其他服务的密码获取root密码,如FTP、SMB。Linux中FTP通常使用操作系统认证,抓取FTP密码就等于抓取了系统的密码。
3.替换关键程序法
目前有两种方法,一种是网上使用的fakesu.c程序,另一种是获取root权限后替换SU程序。
(1)fakesu.c程序法
网上使用的kpr-fakesu.c(简称fakesu.c)程序由koper(koper@linuxmail.org)开发,程序最新版本为V0.9beta167。该程序是在WebShell权限或者拥有普通账号的权限下,通过修改该程序中的配置文件,当前用户使用SU命令时,捕获具有root账号权限的密码,如图8-98所示。该程序可以将密码发送到指定邮箱,也可以在本地生成文件,但这个方法的所有内容都是伪造的,所以有明显的缺点,具体如下。
图8-98 通过fakesu.c程序获取root账号密码
• 密码提示和鉴权结果与实际系统的不一致,容易被发现。
• 由于程序鉴权过程是伪造的,所以,无论输入的密码是否正确,都会将结果发送到指定的电子邮箱。
• 成功记录密码后会删除.bash_profile文件。该文件被删除后会出现一些异常。
通过研究该程序,笔者进行了如下优化。
• 根据语义环境定义密码提示信息,通过测试实际环境获取其“真实”的SU密码输入错误的提示信息。
• 修改程序中存在的缺陷,在获取密码后还原最初的环境。
(2)替换SU程序法
获取root权限后,通过替换SU程序来获得root密码,该方法通过提取SU的源程序重新编译SU,效果较好,且不容易被发现。该方法的前提是必须获取root权限。
4.暴力破解法
(1)在线网站破解法
通过提权或者其他方法获取root权限后,通过查看“/etc/shadow”文件的内容,将加密的密文提取出来,访问cmd5网站进行破解。需要注意的是,提取的密文为第2字段,如“root: $1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0:15377:0:99999:7:::”中的密文为“$1$kbIAhX/R$PiLL1U.n6bivtIr4oTi2y0”,将其放入cmd5网站进行破解即可,如图8-99所示。使用该方法可以破解简单的密码,对于高强度的密码,该网站基本无能为力。
图8-99 通过cmd5网站在线破解Linux密码
(2)John软件破解法
John the Ripper Password Cracker(简称John)是一款Linux专用密码破解工具,网站地址为http://www.openwall.com/john/。目前该软件的最新版本为1.9.7,可以通过John暴力密码破解工具进行密码破解,方法和步骤如下。
01 tar zxvf john-1.7.9.tar.gz。
02 cd src。
03 make。
04 make clean generic(或者make clean SYSTEM)。
05 cd run。
06 ./unshadow/etc/passwd/etc/shadow>passwd.txt。
07 chmod 600 passwd.txt。
08 ./john passwd.txt。
09 ./john-show passwd.txt。
(3)SSH暴力破解
Secure Shell(缩写为“SSH”)由IETF的网络工作小组(Network Working Group)制定。SSH是一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。SSH是目前较可靠的、专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP地址欺骗。SSH是Linux下最常见的一个服务,绝大多数操作系统安装后都会配置该服务。通过连接SSH服务远程管理计算机,其默认端口为22. Freebuf网站投稿者H3lvin的研究表明,10年前,一台服务器放在网络上,大概数周的时间才会被黑客光顾,而现在,一台服务器在网络中几个小时之内就会有黑客尝试攻击,且SSH暴力破解攻击经久不衰。
目前,SSH暴力破解主要有两种方式:一种是专业暴力破解软件;另一种是通过Python等语言编写的脚本暴力破解程序。常见的专业暴力破解软件有thc-hydra和relaxscan. thc-hydra的最早版本为7.6(下载地址为https://www.thc.org/thc-hydra/),是一款著名的暴力破解工具,其常见SSH暴力破解命令为“hydra-l root-P/home/Linux/passwd.dic-e ns-f-vV target_ip ssh2”。Relaxscan是专门针对SSH账号进行暴力的工具,linuxfly网站提供了该程序的详细使用方法。SSH账号脚本暴力工具通过编程模拟实际登录进行暴力破解,常见的有theRandy撰写的SSH暴力破解程序,在Linux下通过执行“python sshCommand2.py-H 10.10.1.36-u root-F dictionary. txt”命令对IP地址为10.10.1.36的服务器的root账号进行密码暴力破解。Google支持多协议破解工具脚本项目“patator”,该脚本程序也支持SSH账号暴力破解。
8.13.4 Linux root账号密码防范技术
针对可能出现的获取Linux root账号的技术,可以通过安全防范技术和安全规范等进行防范,本节给出一些可供参考的方法和策略。
1.安全技术防范
(1)设置强健的账号密码安全策略
针对获取shadow值后进行密码破解,可以采取对系统普通账号和root账号设置强健的密码安全策略,定期执行安全检测和维护来防范。密码位数至少10位以上,设置密码包含大小写字母、数字和特殊字符。对服务器文件读写进行监控,日志文件异地安全保存。
(2)定期升级系统补丁和应用程序补丁
对高风险业务程序做降权处理,尽量以低权限运行,如JBoss和Structs等,确保即使出现高危漏洞也不会危及root权限。及时更新系统补丁和应用程序补丁,关注安全业界高危漏洞,防范通过Web应用程序漏洞直接获取root权限。
(3)定期对系统进行Rootkit专用检测
针对Rootkit程序可以通过Rootkit检测程序来防范,互联网上有Rootkit Hunter和Chkrootkit两款开源软件,可以检测绝大部分已知的Rootkit、嗅探和后门程序。
2.SSH账号防暴力破解
有关防范SSH账号被暴力破解,网上已经有很多方法,如修改SSH默认端口、采用RSA公钥认证、使用IPTables脚本、使用SSHD日志过滤、使用tcp_wrappers过滤及使用knockd等方法。
3.建立完善的入侵应急响应制度
对重点系统和重要系统定期聘请专业安全公司进行系统风险评估和安全检测,发现系统存在的漏洞和弱点,针对这些弱点和漏洞进行改进。同时,建立入侵应急响应制度,针对各种可能出现的入侵情况,建立相应的处理措施。
8.13.5 小结
本节介绍了Linux密码的基本原理,介绍了常见的Linux root密码获取的4种方法,最后针对这些可能获取Linux root账号的方法给出了安全防范技术和防范策略。通过这些安全技术和策略,可以大大降低系统被攻击后获取最高root账号权限的风险,对Linux操作系统的安全维护和检测具有一定的参考价值。