发新话题
打印

freebsd PF的TARP补丁

freebsd PF的TARP补丁

  TARPit补丁 for PF on FreeBSD


功能:
当端口扫描时返回所有端口开放状态

系统: PF防火墙
FreeBSD 6-Current测试通过
OpenBSD 3.6未测试

安装方法:
1. 截取以下一段内容,建立新文件pf.c.diff ;或者在如下地址下载:

===============================================
2858c2858,2859
< !(th->th_flags & TH_RST)) {
---
> (!(th->th_flags & TH_RST) ||
> !(th->th_flags & TH_FIN))) {
2860c2861
<
---
>
2864c2865
< ack++;
---
> return (PF_DROP);
2867c2868
< ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0,
---
> ntohl(th->th_ack), ack, TH_SYN|TH_ACK, 0, 0,
===============================================

http://phoenix.freedemon.org//network//pf.c.diff

2. 补丁方法:
# cd /sys/contrib/pf/net/
# patch -p0 pf.c <pf.c.diff

Hmm... Looks like a normal diff to me...
Patching file pf.c using Plan A...
Hunk #1 succeeded at 2858.
Hunk #2 succeeded at 2861.
Hunk #3 succeeded at 2865.
Hunk #4 succeeded at 2868.
done

3. 重新配置内核,确认编译进了pf相关选项;
device pf
device pflog
device pfsync


4. 重新编译内核和内核模块;
# cd /sys/i386/conf/
# config GENERIC
# cd ../compile/GENERIC
# make depend && make && make modules && make install


5. 查看/etc/rc.conf,确认打开了pf启动选项;
pf_enable="YES"

6. 编辑pf配置文件/etc/pf.conf,在初始化段加入以下选项:
set block-policy return

7. BUG:
>>-alpha版本,未广泛测试,慎重使用
>>肮脏的代码,直接修改了RETURN规则,使用时替换block return (tcp)动作
>>注意备份好原版pf.c
>>正在写完全版的tarp功能
在黑客想入侵一个系统之前,一般都会进行第一步动作,段口扫描。通过段口扫
描就可以获取到目标主机上开放的网络端口或者应用服务,然后再瞄准目标有的
放矢。所以对于一个联网的系统,能够暴露在外面的信息越少越好,所以我们一
般会用各种防火墙或TCPwarpper等访问控制方法来限制外部连接,缩小可能被
攻击的范围。

在防火墙的标准响应动作中,当拒绝连接时,有两种响应方法:( deny 或 drop )。
他们最大的区别就是,deny显得更为礼貌一些。例如当接收到一个被限制访问
的TCP请求时,他会礼貌的回应一个[TCP RESET]包,告诉别人这个端口的访问
是非法的;而如果是UDP请求,则会回应ICMP-UDP-PORT-Unreached消息。
而drop方法则显得更为粗暴,他会直接丢弃来访数据报,不作任何回应。

两种动作在防火墙规则中各有好处,deny可以告诉合理来访者更多信息,便于
防火墙规则调试;而drop更省网络带宽资源,也显得更安全一些。

但当对于一个端口扫描器来说,他们都已经告诉攻击者太多的信息了,至少无论
那种结果,攻击者等待一段时间以后,都会得到他们想要的--开放端口列表。就
如同下面这样:
===============================================
C:\Documents and Settings\freedemon>sl lucifer
ScanLine (TM) 1.01
Copyright (c) Foundstone, Inc. 2002
http://www.foundstone.com

Scan of 1 IP started at Thu Mar 24 11:50:23 2005

-------------------------------------------------------------------------------
10.0.0.8
Responded in 10 ms.
10 hops away
Responds with ICMP unreachable: No
TCP ports: 21 22 79 80 1025
UDP ports:

-------------------------------------------------------------------------------

Scan finished at Thu Mar 24 11:50:50 2005

1 IP and 267 ports scanned in 0 hours 0 mins 27.02 secs
===============================================

一个简单的扫描之后,我们就获得了所有开放端口表,然后就可以根据端口情况
猜测对应运行的应用程序,然后再寻找对应的漏洞进行远程攻击。那么我们给攻
击者另一种选择,当他大喊一声“芝麻开门”之后,忽然发现所有的门都向他开了,
在几万个门之中,他该向哪里走?

在Linux中,netfilter有一个Patch-O-Magic补丁,叫TARPIT,功能就是当访问一
个不允许的端口时,防火墙会返回一个正常的SYN+ACK包响应,但是TCP-Window
为0,这样在扫描器一端就会显示端口正常打开,但是无法发送数据;而之后所有
的数据防火墙就可以直接drop掉。

不幸的是,在其他大多数防火墙上,并没有实现这个非标准功能,Windows上那
个号称可以抗Syn-flood和能够Tarp的8sign防火墙,测试了下,根本无效。最后只
好自己写一个出来。

Tarp for pf on FreeBSD 迷你补丁,只能运行在PF防火墙上,FreeBSD 6-Current
测试通过,应该在OpenBSD PF上也可以运行,不过还没空测试。

1. 截取以下一段内容,建立新文件pf.c.diff ;或者在如下地址下载:
===============================================
2858c2858,2859
< !(th->th_flags & TH_RST)) {
---
> (!(th->th_flags & TH_RST) ||
> !(th->th_flags & TH_FIN))) {
2860c2861
<
---
>
2864c2865
< ack++;
---
> return (PF_DROP);
2867c2868
< ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0,
---
> ntohl(th->th_ack), ack, TH_SYN|TH_ACK, 0, 0,
===============================================
http://phoenix.freedemon.org//network//pf.c.diff

2. 补丁方法:
[p6oenix]# cd /sys/contrib/pf/net/
[p6oenix]# patch -p0 pf.c <pf.c.diff

Hmm... Looks like a normal diff to me...
Patching file pf.c using Plan A...
Hunk #1 succeeded at 2858.
Hunk #2 succeeded at 2861.
Hunk #3 succeeded at 2865.
Hunk #4 succeeded at 2868.
done

3. 重新配置内核,确认编译进了pf相关选项;
4. 查看/etc/rc.conf,确认打开了pf启动选项;
5. 编辑pf配置文件/etc/pf.conf,在初始化段加入以下选项:
set block-policy return

之后所有的pf BLOCK策略,除非显示指定drop动作的,其他都会自动生效为
TARP动作,所有到这些端口的连接和端口扫描行为都将得到端口打开的信息,
直到连接超时。

看一下补丁效果:
===============================================
C:\Documents and Settings\Administrator>sl lucifer
ScanLine (TM) 1.01
Copyright (c) Foundstone, Inc. 2002
http://www.foundstone.com

Scan of 1 IP started at Thu Mar 24 12:12:06 2005

-------------------------------------------------------------------------------
10.0.0.8
Responded in 0 ms.
10 hops away
Responds with ICMP unreachable: No
TCP ports: 7 9 11 13 15 19 21 23 25 43 49 53 66 67 68 70 79 80 81 88 89 98 109 1
10 111 113 118 119 139 143 150 156 179 256 257 258 259 264 389 396 427 443 445 4
57 465 512 513 514 515 524 540 563 587 593 636 691 799 900 901 1024 1025 1026 10
27 1028 1029 1030 1031 1100 1214 1243 1313 1352 1433 1494 1498 1521 1524 1525 15
29 1541 1542 1720 1723 1745 1755 1813 1944 2000 2001 2003 2049 2080 2140 2301 24
47 2766 2779 2869 2998 3128 3268 3300 3306 3372 3389 4000 4001 4002 4045 4321 44
44 4665 4899 5000 5222 5556 5631 5632 5678 5800 5801 5802 5900 5901 6000 6112 63
46 6347 6588 6666 6667 7000 7001 7002 7070 7100 7777 7947 8000 8001 8010 8080 80
81 8100 8383 8888 9090 10000 12345 20034 27374 30821 32768 32769 32770 32771 327
72 32773 32774 32775 32776 32777 32778 32779 32780 32781 32782 32783 32784 32785
32786 32787 32788 32789 32790
UDP ports:

-------------------------------------------------------------------------------

Scan finished at Thu Mar 24 12:12:31 2005

1 IP and 267 ports scanned in 0 hours 0 mins 24.47 secs
===============================================

扫描显示所有端口全都开放......

再看一下应用连接:
===============================================
开放端口时
C:\Documents and Settings\Administrator>finger toor@lucifer
[lucifer.freedemon.org]
Login: toor Name: Bourne-again Superuser
Directory: /root Shell: /bin/sh
Last login Thu Mar 24 12:49 (UTC) on ttyp5 from 212.212.112.2
No Mail.
No Plan.

===============================================
使用Tarp规则时
C:\Documents and Settings\Administrator>finger toor@lucifer

[lucifer.freedemon.org]
> Finger: read::对方将连接复位
===============================================

当然,对于完全防范黑客的端口扫描攻击,这种攻击并不完善,还有一些缺点,
也可以获得详细的端口信息,例如:
1. 查看返回得详细数据包信息,通过对比TCP-Window值和TCP标志位,其实还是
可以判断出那些端口真正开放的;不过目前为止没有哪个成品扫描器那么做的,
通过hping-3的脚本功能也许可以......

2. 获取和查看应用系统的Banner返回信息,也可以判断出对应端口是否真正运行
应用和何种应用。

改进计划:
1. 我可是好几百年没写过程序了,今天花了几分钟时间写出的patch,如果运行
不稳定出错了可别怪我;
2. 目前只是针对TCP的,其实对UDP也可以有相应实现,有空再改;
3. 针对hping等更智能的扫描器,也有些不稳定的处理方法,例如把Window值
改为正常的,如2048等...但目前不知道会有什么负面效果;
4. 目前这个补丁只简单的替换了BLOCK规则是的return动作,比较dirty,等有
空了大改,给pf加上一个真正的tarpit动作吧。
测试了以下类型端口扫描

TCP Connect()扫描
: nmap -sT , scanline

TCP SYN扫描
: nmap -sS
C:\Documents and Settings\Administrator>nmap -sS -p 79,80 lucifer

Starting nmap 3.75 ( http://www.insecure.org/nmap ) at 2005-03-24 12:43 中国标准
时间
Interesting ports on lucifer (10.0.0.8):
PORT STATE SERVICE
79/tcp open finger
80/tcp open http

Nmap run completed -- 1 IP address (1 host up) scanned in 1.983 seconds

TCP FIN扫描
: nmsp -sF

C:\Documents and Settings\Administrator>nmap -sF -p 79,80 lucifer

Starting nmap 3.75 ( http://www.insecure.org/nmap ) at 2005-03-24 12:58 中国标准
时间
Interesting ports on lucifer (10.0.0.8):
PORT STATE SERVICE
79/tcp open finger
80/tcp open http

Nmap run completed -- 1 IP address (1 host up) scanned in 1.653 seconds

TCP Xmas扫描
: nmap -sX

C:\Documents and Settings\Administrator>nmap -sX -p 79,80 lucifer

Starting nmap 3.75 ( http://www.insecure.org/nmap ) at 2005-03-24 13:01 中国标准
时间
Interesting ports on lucifer (10.0.0.8):
PORT STATE SERVICE
79/tcp open finger
80/tcp open http

Nmap run completed -- 1 IP address (1 host up) scanned in 1.652 seconds

TCP Null扫描
: nmap -sN

C:\Documents and Settings\Administrator>nmap -sN -p 79,80 lucifer

Starting nmap 3.75 ( http://www.insecure.org/nmap ) at 2005-03-24 13:02 中国标准
时间
Interesting ports on lucifer (10.0.0.8):
PORT STATE SERVICE
79/tcp open finger
80/tcp open http

全部正常处理,显示端口打开。
请记住:linux也有你一份!
发新话题