📄 420.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="316.htm">上一层</a>][<a href="421.htm">下一篇</a>]
<hr><p align="left"><small>我们能察觉什么? <br>
<br>
端口扫描通常指攻击者尝试很多的目的地端口,其中包括没有listen()的端口。 <br>
<br>
端口扫描行为的一个重要特征是“短时期内有很多来自相同的信源地址传向不同的 <br>
<br>
目的地端口的包”。 <br>
<br>
另一个特征是“到未listen()端口的SYN”。 <br>
<br>
显然,有很多方法可以检测端口扫描,最笨的方法就是记录所有的包头,存到一个 <br>
<br>
文件里,然后手工分析。 <br>
<br>
这些不同的方法有他们各自的优点和不利。 <br>
<br>
对于端口扫描这种攻击来说,攻击者总是可以做到在获得扫描结果的同时,使自己 <br>
<br>
很难被发现或者说很难被逆向寻踪。 <br>
<br>
为了隐藏攻击,攻击者可以慢慢地进行扫描。 <br>
<br>
除非目标系统通常闲着(这样对一个没有listen()的端口的一个包都会引起管理员 <br>
<br>
的注意(这种情况太少见)),有很大时间间隔的端口扫描是很难被识别的。 <br>
<br>
隐藏源地址的方法是发送大量的欺骗性的端口扫描包(1000个),其中只有一个是 <br>
<br>
从真正的源地址来的。 <br>
<br>
这样,即使全部包(1000)都被察觉,被记录下来,也没有人知道哪个是真正的信 <br>
<br>
源地址。 <br>
<br>
我们能发现的仅仅是“我们曾经被扫描过”。 <br>
<br>
当然,前面讨论的攻击方式要求攻击者必须有更多的网络资源。 <br>
<br>
因此,一些攻击者可能不使用这样的复杂化和/或慢的攻击,这种方法太费时间了 <br>
<br>
。有很多人还是采用传统的端口扫描方法。所以,这使我们还是可以发现一些端口 <br>
<br>
扫描。 <br>
<br>
我们的目的并不是检测所有的端口扫描(这不可能),而是在确保自己安全的前提 <br>
<br>
下,发现尽可能多种类的端口扫描。 <br>
<br>
----[我们能信赖什么信息? <br>
<br>
明显地,信源地址能被欺骗,所以,除非其他的证据可以利用,我们不能信赖它。 <br>
<br>
<br>
<br>
不过,有时端口扫描仪会泄漏一些信息,能被用来追踪一个欺骗性的端口扫描。 <br>
<br>
例如,如果我们收到的包在我们本端有255的IP TTL,我们可以肯定地知道他们从 <br>
<br>
我们的局域网中发出,根本不用看IP包中的源地址域。 <br>
<br>
不过,如果TTL是250,我们仅仅可以知道攻击者离我们最多5跳(5次路由),至于 <br>
<br>
到底在什么地方,谁也不知道。 <br>
<br>
另外, 开始TTL和源端口号能给我们一些线索:扫描器类型(半开扫描),或者, <br>
<br>
攻击者使用的操作系统(完整的TCP连接扫描)。 <br>
<br>
这些都不是确定的。 <br>
<br>
例如,nmap设置TTL为255,bind源端口到49724上,另一方面,Linux(PC机用的免 <br>
<br>
费UNIX操作系统)内核的TTL为64上。 <br>
<br>
信息源(E-箱子)选择 <br>
<br>
为了检测TCP端口扫描(包括半开扫描),我们必须能够直接处理TCP和IP包。 <br>
<br>
在基于网络的IDS中,我们将使用混杂模式来获得TCP和IP包。 <br>
<br>
这就涉及到SNI论文中描述的问题: <br>
<br>
错误的正和错误的否定都是可能。 <br>
<br>
不过,因为检测所有端口扫描是不可能的,所以这种攻击方法还是可以接受的。 <br>
<br>
对于基于主机的IDS,得到包有两种主要的方法: <br>
<br>
从生的TCP或IP socket读,或者直接从内核获得数据(通过可装载的模块或核补丁 <br>
<br>
)。 <br>
<br>
当使用生的TCP socket 时,可以消除掉很多SNI中提到的问题,因为我们仅仅读那 <br>
<br>
些内核识别的包。 <br>
<br>
不过,这是被动的分析(我们可能错过包),而且是一个fail-open系统。 <br>
<br>
虽然这种方法对于端口扫描来说是足够了,如果我们以后选择检测其他的攻击这不 <br>
<br>
是好设计。 <br>
<br>
如果我们使用生的IP socket 作为替代,(一些系统没有生的TCP sockets),我 <br>
<br>
们就会有那些“SNI问题”了。 <br>
<br>
在我的例子代码中,我在使用生的TCP插座。 <br>
<br>
最可靠的IDS必须有来自目标系统内核的支持。这使得IDS可以获得全部必须的的信 <br>
<br>
息,甚至可以做到fail-close。 <br>
<br>
这种IDS的最大的缺点是内核模块和补丁不可移植。 <br>
<br>
(A-box)签字的选择攻击 <br>
<br>
有很多方法可以识别端口扫描; <br>
<br>
它们的区别在于错误的正和错误的否定的数量。 <br>
<br>
尽可能低地当还合理地低低地保持错误的否定的时候,我们选的攻击签字应该保持 <br>
<br>
错误的正。 <br>
<br>
对此目前没有定论。 <br>
<br>
在我的意见中,这应该取决于攻击的危险性(错误的否定成本),和检测攻击的行 <br>
<br>
为(错误的正成本)。 <br>
<br>
这些成本由于站点不同而不同,所以,IDS应该是用户可调节的。 <br>
<br>
为scanlogd,我使用下列特征来界定端口扫描攻击: <br>
<br>
“一:必须有一定数量的端口被某一个源地点扫描。二:两个端口被扫描的时间间 <br>
<br>
隔有限”。 <br>
<br>
我们将这两个特征量化为两个可以修改的常量:COUNT和DELAY。 <br>
<br>
当一个TCP端口收到了一个没有置ACK位的包时,我们认为他收到的是一次扫描。 <br>
<br>
记录结果(D-箱子) <br>
<br>
我们的前提是:一:不考虑存储位置;二:存储容量受限。 <br>
<br>
当当存储容量用尽的时候,结果将被丢弃。 <br>
<br>
更常见的是记录结束或者新记录覆盖了旧记录。 <br>
<br>
一个明显的攻击将使日志里面塞满了无用信息,之后再进行真正的攻击时IDS就已 <br>
<br>
经无能为力了。 <br>
<br>
对于端口扫描,欺骗的“端口扫描”能被用来填满日志,真正的攻击就是后继的真 <br>
<br>
正的端口扫描,这很可能是成功的扫描。 <br>
<br>
这例子表明写的不好的端口扫描工具却导致了丢失对真正的入侵的记录,---这 <br>
<br>
样的东东还不如不写。 <br>
<br>
引入针对攻击类型的概率限制可以解决这个问题。(比如——每20秒的信息不能超 <br>
<br>
过5个——)。概率限制发生时,把这个事件记录下来,同时暂时地停止记录这种 <br>
<br>
类型的攻击。 <br>
<br>
对于那些不能被欺骗的攻击,作为替代,可以改用源地址限制。 <br>
<br>
端口扫描能欺骗,攻击者因此可以不暴露他的实际地址,但是这种方法不能使他隐 <br>
<br>
藏其他的攻击。如果我们不使用概率限制,他就会使用别的方法达到这个目的。 <br>
<br>
这是我在scanlogd中实现的。 <br>
<br>
解决这个问题的另外一个方法是给每一种攻击一个各自的日志限额。 <br>
<br>
这些解决方案可以被同时实现。 <br>
<br>
如何对付端口扫描? <br>
<br>
(R-箱子) <br>
<br>
一些IDS能对他们检测到的攻击进行反应。 <br>
<br>
这些反应通常包括:来防止更进一步的攻击和/或得到有关攻击者的额外的信息。 <br>
<br>
<br>
<br>
不巧,这些特点经常被聪明的攻击者滥用。 <br>
<br>
典型的反应包括封锁攻击的主机。(比如修改Internet 防火墙的访问列表)。 <br>
<br>
不过,如果攻击是欺骗性的,会导致我们封锁无辜的IP。这一点,就会用来制造 <br>
<br>
DoS攻击。 <br>
<br>
而且,就算攻击不是欺骗性的,也有可能导致DoS。 <br>
<br>
这是因为IP地址经常是很多人共用的。 <br>
<br>
比如拨号上网时,用户的IP是由服务商动态分配的。 <br>
<br>
有两三实现上的问题: <br>
<br>
Internet 防火墙存取表,路径选择表,以及其他等等都不是无限大小的。 <br>
<br>
另外,还有CPU使用率问题。 <br>
<br>
如果IDS不注意这些问题,这会导致这个网络的DoS(比如Internet 防火墙down掉 <br>
<br>
)。 <br>
<br>
我认为这种情况是几乎不应该出现的。 <br>
<br>
端口扫描就是这样。 <br>
<br>
另一个常见的行动是回连攻击者的主机以获得额外的信息。 <br>
<br>
对于那些可以欺骗的攻击,我们可能被用来攻击第三方。 <br>
<br>
我们最好不为这样的攻击(包括端口扫描)做任何事。 <br>
<br>
不过,对于非欺骗性的攻击,可以在一定预防措施前提下实现下列功能。 <br>
<br>
首先,我们应该注意不浪费资源,包括带宽(无论攻击概率如何,必须限制请求概 <br>
<br>
率和数据量),中央处理器时间和内存(应该有超时机制,并且我们每次不能有太 <br>
<br>
多请求)。 <br>
<br>
显然,这表明攻击者可以使我们的一些请求失效,但是对此我们毫无办法。 <br>
<br>
详情请参见ftp://ftp.win.tue.nl/pub/security/murphy.ps.gz。 <br>
<br>
这篇Wietse Venema的文章详细叙述了他的著名的 TCP Wrapper 程序包中类似的脆 <br>
<br>
弱性。 <br>
<br>
为这些原因,scanlogd只是记录下发生的端口扫描除此之外,什么都不作。 <br>
<br>
剩下的事情由使用者自行处理。 <br>
<br>
我通常只是检查我的庞大的扫描日志。 <br>
<br>
----[数据结构,算法 <br>
<br>
当选择排序或查询等算法时,人们一般都是为了优化典型的情况。 <br>
<br>
不过,IDS必须考虑最坏的情况: <br>
<br>
<br>
<br>
攻击者能向我们IDS提供他伪造的任何数据。 <br>
<br>
如果IDS是fail-open的,攻击者将能绕过它。如果它是fail-close,这个完全的保 <br>
<br>
护的系统会被攻击者引发DoS。 <br>
<br>
举例来说: <br>
<br>
在scanlogd中,我使用哈希表来存放源地址。 <br>
<br>
在一般的情况下,哈希表可以很好的工作。平均的查询时间比二分法好。 <br>
<br>
不过,攻击者可以生成特定的假地址来产生哈希冲突,结果使这个哈希表变成了线 <br>
<br>
性表,查询效率就迅速降低。 <br>
<br>
如果我们有很多个哈希表入口(一般的哈希size都至少23),这会导致scanlogd无 <br>
<br>
法及时读取新的包。 <br>
<br>
而且,这会导致scanlogd消耗大量的CPU时间。 <br>
<br>
我通过限制哈希冲突(每一个哈希表项的最大长度)来解决这个问题。方法是最老 <br>
<br>
的元素最先被丢弃。 <br>
<br>
这对端口扫描来说可接受(我们说过,不能检测所有的扫描),但是对检测其他的 <br>
<br>
攻击来说不可以接受。 <br>
<br>
如果我们考虑到其他类型的攻击,我们就要换一种算法,比如二分查找。 <br>
<br>
如果我们使用内存函数(比如libc的malloc(3)和free(3)),攻击者可以能以类似 <br>
<br>
的方法寻找其弱点。 <br>
<br>
如果我们被高流量冲击,我们的程序可能会占用大量的CPU时间或者会出现内存泄 <br>
<br>
漏。 <br>
<br>
可靠的IDS应该有自己的内存管理函数(libc的内存管理方案因系统的不同而不同 <br>
<br>
),并且很小心的使用动态内存分配的. <br>
在scanlogd这样简单的工具中,我没有使用动态内存分配。 <br>
上面的问题也会出现在操作系统的内核设计中。 <br>
例如,在操作系统中使用哈希表来查找已经建立的连接和正在listen()的端口等。 <br>
<br>
有当然,还有一些系统的限制使前面提到的极端情况尽量不出现,但是我们必须关 <br>
注这些可能的问题。 <br>
----[IDS,并且其他过程 <br>
对于被安装在通用操作系统上的基于网络的IDS,以及全部基于主机的IDS,IDS和 <br>
系统中其他进程可能会有一些交互。 <br>
攻击者可以利用一些操作系统里的DoS脆弱性,在IDS(当然只在它是fail-open的 <br>
时候)没有察觉的前提下是其失效。 <br>
这可以通过内核漏洞(比如teardrop)或者其他进程的漏洞(比如一个没有连接数 <br>
量限制和资源限制的inet 的 UDP服务。) <br>
同样地,编写得很烂的基于主机的IDS会导致DoS,也可以被用于搞瘫一个系统上的 <br>
其他某些进程。 <br>
----[例子 <br>
<br>
<br>
http://www.false.com/security/scanlogd/.为将来的版本能看见 <br>
信源地址可能是假的,除非有其他的证据可以利用,否则别对着攻击者采取任何行 <br>
动。 <br>
<br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="316.htm">上一层</a>][<a href="421.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -