📄 nat爆破者:在不同nat后的主机间建立tcp连接.txt
字号:
(c)NB:5000→NA:m,LSR:X,SYN:Q
这两个SYN包是由TCP的connect()函数调用所产生。
这两个SYN在NAT的NA和NB上各自创建了预期的映射。
3.调用Case1(m,5000)
5.7 情况4:<随机的,可预测的,no LSR>
A X B
|-------2a----->| |
|-------------->| |
|-------------->| |
|┆ | |
|-------------->|-------3------>|
|<--------------|-------4-------|
|<--------------|---------------|
|<--------------|---------------|
| |┆ |
|<--------------|---------------|
|-------5------>| |
| |-------6------>|
| Case2|(m,5000) |
图5:情况4
情况4的环境是<随机的,可预测的,no LSR>。我们已经为这个依靠于随机的且不拒绝一个带了残废的且对应于在NAT后主机在前面的初始连接的ACK或者校验和域的TCP包的NAT环境开发了一个方案。这方案被呈现在图5中并解释如下。
1.X做了关于5.1节描述的端口预测。X不能预测到NA的下一端口,但能预测到NB的下一端口是5000,并经由已经存在的连接告知A和B。
2.A发送T个SYN包到B,这些包不是被对方的NAT所抛弃就是由于TTL过期而被抛弃。
i = 0
While i < T
NA:rand →NB:5000, SYN:anything
i = i+1
End While
这会在NAT NA上创建T个映射,B将最后用SYN+ACK猜到的就是其中一个。
3.X通知B开始发送SYN+ACK包到NA
4.B发送许多SYN+ACK包到NA直到有一个到达A
i = 1024
While A 还没报告成功
NB:5000 →NA:i,
SYN+ACK:,anything,anything, Payload:i
i = i+1
End While
5.A报告穿过NAT的包负荷。
NA:3999→X:1234,工作于端口m
A通过监听来自NB的任何SYN+ACK包的数据报,将可看到这个残废的SYN+ACK包。
6.X告诉B连接到A的端口m
B现在知道SYN包可以发向哪里。
7.调用Case2(m,5000)
在步骤2中A所发送的T个SYN包是独立于任何TCP的connect()函数调用。他们仅仅是使用在NAT上创建了T个映射的libnet库所产生的包。另一方面,Case2调用的步骤2所产生的SYN包是由A和B的TCP的connect()函数调用所产生的。这情况4环境的方案依靠于随机生成端口的NAT的行为。这方案依靠于拒绝带有错误的如序列号或者校验和域的TCP包的中间件。
T值能够被选择,像B在生成T个SYN+ACK到随机目的端口号后有95%的机会猜到一个正确的外部端口。其实,A的NAT随机地选择T的数目(它的外部端口数),这时B必须一直维持猜测直到在A的NAT可选集中B选择到了一个。我们能够使用一个概率分析来构造一个高效的且最小工作量被A和B所预算的设想。设PrG是B猜到在T个实验中最少一个是正确的概率。价设A的NAT已经在[1025,65535]的范围中选择了T个不同的端口号,如果B选择T个不同的端口号,在A的NAT可选集中B不能选择到一个号的可能性是
Pr_G =n-T/n * n-1-T/n-1 * n-2-T/n-2 * . . . * n-(T -1)-T/n-(T -1)
其中n是可能选择的端口数(n=65535-1024=64511)。
T-1
Pr_G =∏n-i-T/n-i
i=0
反之,在T个实验中猜到一个是正确的可能性是
PrG = 1-Pr_G
像之前的规定,T可能被选择如
PrG > 95%
T-1
1-∏n-i-T/n-i> 95%
i=0
计算T的量为T=439的这个乘积。
439-1
1-∏64511-i-439/64511-i=0.9506> 95%
i=0
这结果说明如果A发送439个使在A的NAT外部端口得到不同的随机的映射的SYN包,并且B发送许多不同的随机的到目的端口的SYN+ACK包,B在它发送第440个AYN+ACK包之前就有大于95%的机会正确地猜测到439个外部端口映射的其中一个。
仅仅发送T个SYN包的原因是这至少要使用两个资源,第一个是网络带宽的使用量,第二是在NAT上创建映射的数量。
5.8 情况5:<随机的,随机的,LSR>
┌─────┐ ┌─────┐
│NA端口了解| │NB端口了解|
└─────┘ └─────┘
│ ↑ ↑ │
│ \ / │
│ \/ │
│ /\ │
↓ / \ ↓
┌─────┐ ┌─────┐
│ A │ │ B │
└─────┘ └─────┘
图6:资源图表死锁
A X B
|-------2a----->|<------2b------|
|<------2c------|-------2c----->|
|-------3a----->|<------3b------|
| Case1|(m,n) |
图7:情况5
在情况5中的环境是<随机的,随机的,LSR>。为了允许X同步到A和B,B必须要知道NA预先发送它的SYN包时所选的端口号。为了确定NA选择的端口,X不得不看A的SYN包。A的SYN包不能被发送直到X确定NB所选的端口号为止。这个死锁被制成图6的插图。A控制NA端口资源以致不外发SYN包,有效的预防了X知道NA所选的端口号。同样的,B也控制NB端口资源。在他们能够释放所控制资源之前,每端都需要对方的端口。我们让A和B各发送两个SYN包可松散源路由穿过X且不连接到TCP connect()调用的方案来预防这个死锁。这两个SYN包在各自的NAT上创建了所需的映射并允许X获得两个资源,同时等同于情况1和2的类似方式连接。我们情况5的方案展示在图7中并解释如下。
1.X做了关于5.1节述的端口预测。X不能预测到NA或者NB的下一端口并经由已经存在的连接告知A和B。
2.A和B都发送一个SYN包松散源路由穿过X
(a)NA:m→NB:anything SYN:anything,LSR:X
(b)NB:n→NA:anything SYN:anything,LSR:X
(c)X报告m给B并报告n给A。
这两个SYN将在各自的NAT上创建所需的映射。
3.A和B发送一个SYN到对方松散源路由穿过X
(a)NA:m→NB:n,LSR:X,SYN:P
(b)NB:n→NA:m,LSR:X,SYN:Q
因为一致转换,即使目标端口和之前的步骤有所不同,NAT仍然为这个包利用所使用的相同映射(因此相同的外部端口号)。
4.调用Case1(m,n)
注意,SYN包发送步骤2不是关联到任何TCP的connect()函数调用,而更合适的,步骤3的SYN包发送应归于一个TCP的connect()函数调用。同理,Case1的调用中SYN+ACK包发送步骤3不绑定到TCP的accept()函数子程序。
5.9 情况6:<随机的,随机的,no LSR>
A X B
|-------2------>|<------2-------|
|-------------->|<--------------|
|-------------->|<--------------|
|┆ |┆ |
|-------------->|<--------------|
|-------3-------|-------------->|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -