引言
近来,教育网里”端口扫描”是一个热门话题;前不久,教育网管理中心宣布”禁止端口扫描”,原因主要是大量人使用proxyhunter等端口扫描工具来搜索免费代理,造成网络拥挤不堪.其实”端口扫描”也是攻击者手中的利器,本文简要介绍我在对付”端口扫描”的策略—及时记录,然后可以视情况采取相应的手段.
一,原理
随着Internet的发展,对网络上的服务器的攻击也日益增多.攻击者的手法也日益高明,他们现在多半利用TCP/IP层的漏洞来攻击连接在Internet上的计算机.
系统管理员有许多工具来检测系统的网络安全漏洞(SATAN就是一个很著名的例子);但是这种工具也是潜在攻击者手中的利器.现在的操作系统没有能力发现这种工具的扫描,也就没有任何办法通知系统管理员.
那么我们能做些什么呢?
其实”端口扫描”都有一定的特点,一个就是它们都要向目的机的大量的知名端口发起连接请求,来判断目的机打开了那些服务,服务的版本是什么,这样攻击者才能开始寻找相应的安全漏洞进行攻击.而在被扫描的端口中,许多是没有被bind的,也就是系统说没有打开相应的服务,正当的用户是不会来连接这种端口的,但是潜在的攻击者在连接这些端口之前并不能确认这些服务是否开放,因此如果从一个或几个接近的ip来了许多对未绑定端口的连接请求,我们就有理由怀疑这是一次攻击的前奏,因此这种连接请求应该被记录下来,并通知系统管理员, 这样系统管理员就可以观察到许多由SATAN等开始的攻击,并且明白什么样的服务在攻击者眼中是由漏洞的(甚至可以得到他的攻击方法),从而采取措施进行弥补,报复或者报案.
二,实现
Linux和FreeBSD的核心代码都是公开的,因此,可以通过修改TCP/IP协议栈来记录下对未使用的网络端口的连接请求的.
下面介绍对linux 2.2.12的修改.
/usr/src/linux/net/ipv4/tcp_ipv4.c:
*****************
*** 1771, 1772 ***
+++1771, 1775 +++
no_tcp_socket:
+ /* zhangby : if the no such tcp socket , then print some msg to dmesg */
+ printk(KERN_INFO "Conn attempt on TCP port %d from %d.%d.%d.%d:%d\n", ntohs(th->dest), NIPQUAD(skb->nh.iph->saddr), ntohs(th->source));
tcp_v4_send_reset(skb);
这段程序是在过程int tcp_v4_rcv(struct sk_buff *skb, unsigned short len)中.当根据请求连接的包的内容无法取得目的端口的属主(tcp_v4_lookup),而且目的端口也不是一个代理,隧道(tcp__v4_search_proxy_openreq)时,程序流程便跳转到no_tcp_socket:处.在这里可以安全的记录下这次可疑的连接请求.
这是有关tcp的修改,下面是有关udp的修改,原理上是一致的.
/usr/src/linux/net/ipv4/udp.c:
****************
*** 1128, 1130 ***
+++ 1128, 1133 +++
if (sk == NULL) {
+ /* zhangby : if no suck udp socket , then print some msg to dmesg.*/
+ printk(KERN_INFO "Conn attempt on UDP port %d from %d.%d.%d.%d:%d\n", ntohs(uh->dest), NIPQUAD(uh->dest), ntohs(uh->source));
#ifdef CONFIG_UDP_DELAY_CSUM
if (skb->ip_summed != CHECKSUM_UNNECESSARY && (unsigned short)csum_fold(csum_partial((char*)uh, ulen, skb->csum)))
Linux和大多数UNIX系统一样,TCP/IP协议栈的实现都是从4BSD派生出来的,因此,上面的修改可以移植到其他源码公开的UNIX系统中.比如,FreeBSD中对应两个文件是tcp_input.c和udp_usrreq.c(在最新的FreeBSD kernel中已经加上类似的特性).
要注意的是,这里虽然记录下了连接的源地址,但是攻击者很容易通过IP欺骗来隐藏他的IP地址;检测”端口扫描”一个很重要的问题是要控制”记录”的流量,否则,当攻击者发起大量的连接时,将急剧消耗系统的硬盘资源,这时应该通过crontab来定时处理log文件.
下面是修改kernel后记录下的一些数据:
Port Service Total
113 Ident 253
8001 Proxy?(hehe) 107
8080 Proxy?(hehe) 126
513 Rlogin 12
131 Cisco-tna 3
2016 Bootserver 2
1993 Snmp-tcp-port 7
有些被拒绝的连接请求是正常的,例如ident服务.试图连接8001,8080端口则说明有人在搜索免费代理;至于往513,131,2016,1993的连接请求就明显是恶意的.
三,如何处理
现在,我们应该如何处理这些”端口扫描”呢?
一个很简单的处理方法是拒绝攻击方的站点,但是这将导致”拒绝访问”的攻击,想想”源地址欺骗”,而且当攻击者是利用ISP的IP来进行攻击时,这将导致其余正当用户无法正常使用;
还有一种是”回击”:同样也连接攻击者的站点,但是如果攻击者使用”源地址欺骗”,这样也会导致错误的反击.
所以,最好的处理就是通知系统管理员,让人来根据具体情况来决定对策.
RSS订阅






收 藏
推 荐