SAMSA黑客手册1999-11北京[摘要]入侵一个系统有很多步骤,阶段性很强的“工作”,其最终的目标是获得超级用户权限——对目标系统的绝对控制。从对该系统一无所知开始,我们利用其提供的各种网络服务收集关于它的信息,这些信息暴露出系统的安全脆弱性或潜在入口;然后我们利用这些网络服务固有的或配置上的漏洞,试图从目标系统上取回重要信息(如口令文件)、或在上面执行命令,通过这些办法,我们有可能在该系统上获得一个普通的shell接口;接下来,我们再利用目标系统本地的操作系统或应用程序的漏洞试图提升我们在该系统上的权限,攫取超级用户控制;适当的善后工作包括隐藏身份、消除痕迹、安置特洛伊木马和留后门。为什么要研究网络入侵技术?《孙子兵法》有云:知己知彼、百战不殆。为了更好的防卫网络入侵,为了提高网络安全,为了网络管理员甚至系统设计者能够防患于未然,将安全隐患消灭或尽量减少,必须使大家了解网络黑客入侵技术的具体细节。因此笔者先做一个假设的替换,把自己放到一个黑客的位置,然后再诚实地从那个位置把黑客的秘密手段向大家展示。(零)、确定目标攻击的基本条件,除了攻击者和攻击技术,就是攻击对象,特定的对象(特定子网、特定主机)对特定的攻击者构成吸引力,也召唤着与之相适应的技术。0.1)目标明确攻击者明确地知道要攻击的目标,如某可恶的ISP,如某敌对观点的宣传站点,如解雇了攻击者的单位的主页,等等。0.2)区段搜索攻击者有大致的攻击范围(某一网段),但没有具体的主机作为目标,这时可以工具搜索出该网段上的所有机器,如用笔者开发的mping(multi-ping),用法如下:[synopsis]mpingnetworknetmaske.g.#mping192.168.0.0255.255.255.0第一个参数是欲搜索的网段,第二个参数是网络掩码。即可快速获取该网段上所有活动主机的IP地址。0.3)抓网从一个有很多链接的站点开始,顺藤摸瓜,自然可以找到许多域名和IP地址;0.4)到网上去找站点列表很多网页上都有大量相关站点的列表;找到一个站点列表,就可以挨个儿进行攻击尝试了!(一)、情报搜集从对攻击目标一无所知开始,通过种种尝试,获得越来越多的关于它的信息;黑客的哲学是:没有无用的信息。几乎关于攻击目标的任何知识都是可能的入侵入口,举凡操作系统类型、版本、用户名等,即使是一些表面上无害的信息,也可能通过和别的信息综合而构成暴露系统漏洞的消息。1.1)端口扫描端口扫描是通过扫描找出目标系统开放的服务端口从而推断出目标系统上运行的服务,通过这些服务可能获取进一步的知识或通往系统的路径。端口扫描的程序所在多有,可从网上免费获取,如笔者使用的一种,其输出如下:e.g.#tcp_scannumen1-655357:echo:9:discard:13:daytime:19:chargen:21:ftp:23:telnet:25:smtp:37:time:79:finger111:sunrpc:512:exec:513:login:514:shell:515:printer:540:uucp:2049:nfsd:4045:lockd:6000:xwindow:6112:dtspc:7100:fs:…#udp_scannumen1-655357:echo:9:discard:13:daytime:19:chargen:37:time:42:name:69:tftp:111:sunrpc:161:UNKNOWN:177:UNKNOWN:...大概地说,TCP和UDP端口扫描的机理都是依次(如从1号端口到n号)向目标系统的端口发出连接请求或服务请求包,若该端口上无服务程序守侯,则TCP协议层会回送一个RST(Reset)包,而UDP协议层则会回送一个ICMPPortUnreachable(端口不可达)包,如果没有收到这两种包,就说明该端口有一服务程序,再根据服务程序和著名端口号间的对应关系,既可推知目标系统上究竟运行着哪些服务了。观看端口扫描程序运行结果,如发现有下列服务:finger,sunrpc,nfs,nis(yp),tftp,ftp,telnet,http,shell(rsh),login(rlogin),smtp,exec(rexec),etc…则应引起注意。因为这些服务或者无偿向外界提供关于系统的重要知识,或者提供某种使用户可以“登录”到系统的方法,或者使得用户可以远程执行系统中的程序,所以都有可能是网络入侵的重要途径。在下面的叙述中读者将陆续看到这一点。1.2)finger如果端口扫描发现目标系统上开放了finger服务,这对攻击者来说真是福音,因为finger无偿地(即不需要任何认证手续)就向所有人提供关于系统用户的重要信息,而黑客入侵最重要的一种途径也即是冒充用户登录,所以开放finger实在是一件很危险的事。e.g.#fingerroot@victim.com[victim.com]LoginNameTTYIdleWhenWhererootSuper-Userconsole1Fri10:03:0rootSuper-Userpts/66Fri12:56foo.comrootSuper-Userpts/7Fri10:11mor.comrootSuper-Userpts/81Fri10:04:0.0rootSuper-Userpts/14Fri10:08:0.0rootSuper-Userpts/113:16Fri09:53stu.comrootSuper-Userpts/10Fri13:08sil.comrootSuper-Userpts/121Fri10:13:0.0这个例子说明,该机器上有很多人以root身份登录着,也就是说,假使黑客能够以root身份登录进去,将不至于显得过于突出了(例中所有的机器域名替换成虚构的域名,但都有现实的基础,谨此说明,下同此)。#finger@victim.com[victim.com]LoginNameTTYIdleWhenWhererootSuper-Userconsole7Fri10:03:0johnJohnathanSwiftpts/611Fri12:56foo.comjackMichaelJacksonpts/7Fri10:11mor.commaryMariahCareypts/113:21Fri09:53stu.comrootSuper-Userpts/103Fri13:08sil.comsallySallivanpts/1112Fri11:07idi.comfinger@victim.com的意思是:请victim.com报告当前登录在它上面的所有用户情况。这个例子说明目前登录在victim.com上的有root、john、mary、sally等用户,他们分别来自虚构的foo.com、mor.com等主机。#finger0@victim.com[victim.com]LoginNameTTYIdleWhenWheredaemon???....bin???....sys???....leopard???pts/5Apr2809:42foo.comjohn???pts/12Apr2909:35foo.comlilac???pts/8Apr2214:03yark???pts/9May613:55samsa.comjack???pts/9May709:54mor.comweeper???pts/9Apr2309:35sally???pts/6Apr2614:23idi.comzebra???pts/9May615:42zw.commary???pts/9May710:02stu.comfinger0@victim.com的意思是:请victim.com报告它上面所有的合法用户及其登录情况。得到了这个情报,黑客就可以挨个尝试以这些用户的身份登录系统了,通常可以利用一些有一段时间没有登录过的用户,或趁某用户不在线上时以他的身份登录,这样做的目的是以免被该用户发现,因为合法用户应该知道自己是从哪儿登录过来,并且也知道自己开了几个终端,黑客登录必然影响who或w命令输出,用户如果发现这输出与自己的情况不吻合,自然就会发现自己的帐号被人盗用了。#finger0@victim.com@mor.com[mor.com][victim.com]LoginNameTTYIdleWhenWheredaemon???....bin???....sys???....leopard???pts/5Apr2809:42foo.comjohn???pts/12Apr2909:35foo.comlilac???pts/8Apr2214:03yark???pts/9May613:55samsa.comjack???pts/9May709:54mor.comweeper???pts/9Apr2309:35sally???pts/6Apr2614:23idi.comzebra???pts/9May615:42zw.commary???pts/9May710:02stu.comfinger0@victim.com@mor.com是一种finger的级联,请求先发到mor.com,再由mor.com转给victim.com,最后的结果是victim.com给出的。#finger0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@victim.com[victim.com]unknownhost:这个命令则有可能造成某些有缺陷的fingerdaemon因资源耗尽而暂时瘫痪,也算一种DoS(DenialofService:拒绝服务)攻击吧。1.3)rusersrusers命令,remoteusers,顾名思义,即询问远程主机关于其用户的信息,跟finger有类似之处。e.g.#rusers-lnumenrootnumen:consoleMay710:0322(:0)johnnumen:pts/6May712:5626(mor.com)willnumen:pts/7May710:11(zw.com)marynumen:pts/11May709:533:37(foo.com)paulnumen:pts/10May713:0818(sil.com)列出numen上所有活动的用户。1.4)showmountNFS(NetworkFileSystem:网络文件系统)是用来提供网络文件共享的,通过安装共享目录,可以实现不登录到一台主机即可读写该机上的硬盘内容,这对攻击者来说是非常有利的。showmount命令列出一台机器上共享出来的所有目录及其信息。e.g.#showmount-enumen.comexporttableofnumen.com:/export/home(everyone)表示:numen.com把/export/home共享给所有人;#showmount-anumen.comfoo.com:/export/homemor.com:/export/home表示:foo.com和mor.com安装了numen.com共享出来的/export/home。1.5)rpcinfoRPC(RemoteProcedureCall:远程过程调用)是指从一台机器上可以直接调用另一台机器上的过程,通过使用一种称为EDR(ExternalDataRepresentation)的数据表示方法,前者把参数传给后者,后者把计算结果返回给前者。rpcinfo报告关于一台主机上提供的可供外部进程调用的过程的信息。e.g.#rpcinfo-pnumen.comprogramversprotoportservice1000004tcp111rpcbind1000004udp111rpcbind1000241ud