现在,大量的网络服务器开始使用Linux操作系统,Linux服务器的安全性也开始受到关注。
来源:中关村在线 作者:彭文波
现在,大量的网络服务器开始使用Linux操作系统,Linux服务器的安全性也开始受到关注。对Linux服务器攻击的定义是:攻击是一种旨在妨碍、损害、削弱、破坏Linux服务器安全的未授权行为,攻击的范围可以从服务拒绝直至完全危害和破坏Linux服务器。对Linux服务器攻击有许多种类,从攻击深度的角度说明,我们可以把攻击分为四级:服务拒绝攻击(DoS)、本地用户获取了非授权的文件的读写权限、远程用户获得特权文件的读写权限、远程用户获得根权限。下面,我们将选取一些有针对性的经典工具,一一加以说明。
1、溢出:从开源代码开始
Linux系统中最常见的缺陷就是缓冲区溢出,缓冲区以前可能被定义为"包含相同数据类型的实例的一个连续计算机内存块"。极其常见的缓冲区种类是简单的字符数组,溢出就是数据被添加到分配给该缓冲区的内存块之外。由此,我们可以看到,作为开源系统,Linux系统中的代码检查就显得十分重要。对于攻击者和管理员来说,谁首先重视它,就在一定程度上取得了主动权。
(1)SPIKE
SPIKE是immunitysec公司的Dave Aitel写的一个黑盒进行安全测试的工具。SPIKE提供了各种各样的构造函数。例如s_binary可以构造二进制数据,s_string可以构造字符串,s_unistring可以构造UNICODE字符串等。SPIKE的另一个优势是Dave Aitel的Fuzz理论,它可以构造一些特殊的数字或者字符串作为程序的输入,检查程序是否能够处理这些异常数据。此外,SPIKE里边提供了常见的协议支持,例如SUN RPC和MS RPC。
(2)Lint
Lint能够检查的部分错误列表:可能的空指针;在释放内存之后使用了该指针;赋值次序问题;拼写错误等。通常,一个C/C++的编译器假设程序是正确的,而Lint恰恰相反,因此,它优于编译器执行的一般性检查。Lint还可以贯穿多个文件来执行它的错误检查和代码分析,这是编译器做不到的。比较流行的Lint 程序有:PC-lint是一个由Gimpel Software提供的支持C/C++的商用程序;Splint (原来的 LCLint) 是一个GNU免费授权的 Lint程序,但是只支持C不支持C++。
运行 Lint时,和正常的编译器一样,只要把直接加入的makefile 中就可以了。通过配置选项、代码注释等方法可以控制和校准Lint的输出。例如,这里有一个返回NULL指针的函数,Splint可以通过下面的注释 /*@null@*/ 来识别:
/*@null@*/ void *test(void)
{
// a function that returns NULL!
return NULL;
}
这样做有两个目的:防止Splint为这个返回Null指针的函数告警;保证Splint 检查任何调用该函数的代码中使用该函数的返回指针是有效的。
(3)Flawfinder
Flawfinder 是一款用Python编写的c、c++程序安全审核工具,可以检查潜在的安全风险。它通过搜索检测文件源代码从而得到潜在的安全漏洞,支持检测数据库,以HTML格式生成报告。
2、嗅探器:Linux上的"狗鼻子"
Sniffer是一种常用的收集有用数据方法,它几乎能得到任何以太网上的传送的数据包。这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。这些嗅探器很容易被入侵者完成入侵以后种植在受害者服务器当中,有的只是简单的用来捕捉用户名和密码,有的则非常强大可记录所有的网络数据流。Linux操作系统下有很多这样的优秀工具,下面,我们来具体看看。
(1)tcpdump
这是一个专业的网络管理工具,而且这个工具也留下了不少网络攻击故事。它能把匹配规则的数据包的包头显示出来,使用TCPDump去查找网络问题或者去监视网络上的状况.。tcpdump的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。以rpm包的形式安装是最简单的安装方法,通过rpm命令可以直接安装。以超级用户登录后,使用命令:#rpm -ivh tcpdump.rpm,就可以顺利安装了。
Tcpdump采用命令行的方式使用,它的命令格式为:
tcpdump [-adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
其中,"-a"表示将网络地址和广播地址转变成名字;"-d"表示将匹配信息包的代码以人们能够理解的汇编格式给出;"-e"表示在输出行打印出数据链路层的头部信息;"-c"表示在收到指定的包的数目后,tcpdump就会停止;"-F"表示从指定的文件中读取表达式,忽略其它的表达式;"-i"表示指定监听的网络接口;"-r"表示从指定的文件中读取包(这些包一般通过-w选项产生);"-w"表示直接将包写入文件中,并不分析和打印出来;"-T"表示将监听到的包直接解释为指定的类型的报文,常见的类型有远程过程调用和snmp简单网络管理协议。
tcpdump的表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,网络上所有的信息包将会被截获。在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host、net、port等。第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src等,这些关键字指明了传输的方向。第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。除了这三种类型的关键字之外,其他重要的关键字如下:gateway、broadcast、less、greater,还有三种逻辑运算"或、非、与",这些关键字可以形成强大的组合条件来满足人们的需要。例如,想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
下面我们介绍几种典型的tcpdump命令的输出信息。比如,使用如下命令:
#tcpdump --e host ice
其中,ice 是一台装有linux的主机,她的MAC地址是2E:19:24:28:AF:1A。H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 2E:19:24:28:AF:1A ip 60: h219.33357 > ice.telnet 0:0(0) ack 22535 win 8760 (DF)
分析:21:50:12是显示的时间,847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包。2E:19:24:28:AF:1A是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
再比如,使用命令:
#tcpdump arp
到的输出结果是:
22:32:42.802509 eth0 > arp who-has route tell ice (2E:19:24:28:AF:1A)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (2E:19:24:28:AF:1A)
分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 2E:19:24:28:AF:1A是主机ICE的MAC地址。此外,这个软件还可以分析UDP等数据包等,结合LINUX环境熟练使用后,我们就可以充分发挥它的威力。
(2)Hunt
Hunt具有直观的命令追踪和会话录制功能,它以tar.gz的格式发布,文件下载后,首先需要解压缩。运行Hunt后,将启动一个很直观的菜单,界面如下:
--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> w
0) 192.168.0.1 [1049] --> 192.168.0.2 [23]
choose conn> 0
dump [s]rc/[d]st/[b]oth [b]> b
注:上面的输入(黑色字体部分)指示hunt来记录0号连接,并输出源和目的信息,则hunt将活动信息到终端屏幕上。可以看到,hunt的输出非常直观明了,易于阅读。hunt还提供有以下工具:允许指定任意一个感兴趣的连接,而不是记录所有的东西;允许指定任意一个连接,而不仅仅是以SYN刚刚开始的连接;提供活动会话劫持。
(3)Linsniffer
linsniffer是一个简单实用的嗅探器。它主要的功能是捕捉用户名和密码。
软件下载后,使用下面的命令来编译和运行linsniffer:
$cc linsniffer.c -o linsniffer
$linsniffer
启动以后linsniffer将创建一个空文件:tcp.log来存储嗅探结果。在测试中我创建一个名为cndes的用户,密码为123456。然后使用该用户来登录Linux服务器,并进行一些常见的用户操作。这是一个典型的用户操作过程。下面,我们看看linsniffer产生的嗅探结果:
gnss => linux.test.net [21]
USER cndes
PASS 123456
SYST
PORT 172,16,0,1,4,192
LIST -al
PORT 172,16,0,1,4,193
LIST
PORT 172,16,0,1,4,194
LIST -F
CWD lg
PORT 172,16,0,1,4,195
LIST -F
输出内容十分直观。我们可以分析如下:首先,它记录到Linux主机的FTP连接:gnss => linux.test.net [21]。然后,linsniffer捕获了用户名和密码。最后,linsniffer记录了cndes使用的每一个命令。输出结果非常清楚,非常适合窃听密码及记录常见的活动。不过,这个软件不太适合进行更加复杂的分析。
(4)Linux-sniff
linux_sniffer提供相对更复杂的探测结果。首先,使用如下命令编译linux_sniffer
$cc linux_sniffer.c -o linuxsniff
下面是被linux_sniffer记录的一次telnet会话过程:
GNSS 2# telnet 192.168.0.1
Connected to 192.168.0.1.
login: cndes
password:
[cndes@linux2 cndes]$ w
19:55:29 up 58 min, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 7:44pm 27.00s 0.17s 0.06s -bash
root tty2 7:46pm 1:56 0.24s 0.01s linuxsniff
root tty3 7:44pm 10:43 0.17s 0.07s -bash
cndes ttyp0 gnss 7:55pm 1.00s 0.26s 0.04s w
[cndes@linux2 cndes]$ who
root tty1 May 20 19:44
root tty2 May 20 19:46
root tty3 May 20 19:44
cndes ttyp0 May 20 19:55 (gnss)
[cndes@linux2 cndes]$ finger -l
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Thu May 20 19:44 (PDT) on tty1 35 seconds idle
On since Thu May 20 19:46 (PDT) on tty2 2 minutes 4 seconds idle
On since Thu May 20 19:44 (PDT) on tty3 10 minutes 51 seconds idle
No mail.
No Plan.
Login: cndes Name: Caldera OpenLinux User
Directory: /home/cndes Shell: /bin/bash
On since Thu May 20 19:55 (PDT) on ttyp0 from gnss
No mail.
No Plan.
(5)Ettercap
Ettercap是一款局域网环境下的网络监视、拦截和记录工具,支持多种主动或被动的协议分析,有数据插入、过滤、保持连接同步等功能,还有一个能支持多种嗅探模式套件,能够检查网络环境是否是交换局域网,并且能使用主动或被动的操作系统指纹识别技术,让本地攻击者充分了解当前局域网的情况。
(6)DSniff
DSniff是由Dug Song开发的一个网络审计、测试和嗅探软件套件,其中,dsniff、filesnarf、mailsnarf、msgsnarf、rlsnarf和webspy可以用于监视网络上我们感兴趣的数据,如口令、e-mail、文件等。arpspoof、dnsspoof和macof则可以很容易地载取到攻击者通常难以获取的网络信息,如二层交换数据。
(7)Ethereal
Ethereal是一款免费的网络协议分析程序,支持Unix、Windows。借助这个程序,我们可以直接从网络上抓取数据进行分析,也可以对其他嗅探器抓取的数据进行分析,查看每一个数据包的摘要和详细信息。Ethereal有多种强大的特征,如支持几乎所有的协议、丰富的过滤语言、易于查看TCP会话经重构后的数据流等。
(8)sniffit
sniffit是一个TCP/IP/ICMP协议数据报监听器,它能给出这些协议数据报的详细技术信息及符合监听条件的数据报的各种不同的格式。sniffit可以进行方便的配置实现对接入的数据报进行过滤。而配置文件允许非常确定地指定需要处理的数据报。缺省情况下,sniffit可以处理以太和PPP设备,也可以用在其他的设备上。
由于Linux系统下嗅探器的优秀功能和强大的杀伤力,因此,新的软件层出不穷,而各个优秀软件的改进版本或增强版也不断涌现,读者朋友可以在实际使用中多多收集。
3、入侵检测系统攻击及口令破解
(1)Crack
Crack是破解软件中的开山鼻祖,破解UNIX口令的著名工具,现在已经成为了检查网络口令弱点的工业标准。它由Alec D.E.Muffett编写,工作原理十分简单。我们知道加密口令是不会被解开的,这是因为加密算法是不可逆的。所以,一般的口令入侵是通过生成口令进行加密去匹配原口令密码,或直接从网上截获明文口令。Crack 程序中包含了几个很大的字典库,进行解破时它会按照一定的规则将字词进行组合,然后对之进行加密,再与要解破的加密口令匹配。在使用中,如果口令文件很小,时间和资源都不成问题,但是如果口令文件比较大,则要花费很长的时间和耗费相当的资源。
(2)Fragroute
这个软件和DSniff出自一家,这个工具开发的本意是去测试入侵检测系统、防火墙、基本的TCP/IP栈的行为,因此,它是一个能够破坏入侵检测系统的强大工具。此外,它还能够截取、修改和重写向外发送的报文,实现了大部分的IDS攻击功能。Fragroute有一个简单的规则设置语言,通过它,可以实现延迟、复制、丢弃、碎片、重叠、打印、重排、分割、源路由或其他一些向目标主机发送数据包的攻击。
(3)John the Ripper
John the Ripper是一个十分强大、灵活、快速的多平台哈希口令破解器,它设计的主要目的是用于检查Unix系统的弱口令,支持几乎所有Unix平台上经crypt函数加密后的口令哈希类型,也支持Kerberos AFS和Windows NT/2000/XP LM哈希等。