论文具体思路
作者在传统的担保识别的基础上做了一些额外的工作例如,传统的包指纹识别,考虑ttl、windows scale、RTO等特征,但是传统的指纹识别在使用这些特征的时候只是简单的使用,不具有鲁棒性,而网络世界中的变化是非常大的,所以就也就是很多单包指纹识别工具的准确性比较低的原因。
基于RTO进行指纹识别是可能的,不仅仅是因为不同的设备实现TCP算法有区别,而且RFCs没有规定初始这个初始的RTO或者有多少个SYN-ACK必须被生成(既要生成多少个超时重传的包)
,所有有很多不同的RTO实现。
论文中用
u
j
u_j
uj和
δ
j
\delta_j
δj代表从第j个操作系统中提取到的一些传统的固定的特征向量(例如window scale,ttl等)
和RTO向量,而
x
=
(
u
;
δ
)
x=(u;\delta)
x=(u;δ)则代表从网络中观察到的一个数据包,既
δ
\delta
δ代表观察到的指纹RTO向量,
δ
j
\delta_j
δj代表第
j
j
j个操作系统的RTO指纹向量。
首先来讲讲RTO存在的问题,RTO既超时重传时间(超时重传时间不同的操作系统可能会有不同的算法,和不同的RTT初始值,所以他能用来识别操作系统)
。如果我们通过操作系统源码或者是其他途径得到了RTO的指纹库,那么这个指纹库用在实际中是否真的准确呢?不一定。因为网络环境很复杂,server响应的SYN-ACK数据包在传输过程中会有两个问题:
- 传输延迟抖动:因为一个server回复的所有SYN-ACK数据包的大小肯定是一样的,那么他本身所需要的传输时间应该是固定的,我们用
d
d
d表示。但是网络是存在延迟的,我们用
Q
m
Q_m
Qm表示,m表示第m个SYN-ACK数据包的延迟,所以最终实际的传输时间应该是
d
+
Q
m
d+Q_m
d+Qm
(这个$Q_m$值是固定的吗,既每个SYN-ACK在传输过程中的延迟时间是固定的吗?显然不是,因为网络拥堵情况不同,$Q_m$是会变化的。)
。所以说,直接使用指纹数据,是存在问题的,我们需要考虑网络延迟的问题。 - 丢包问题,数据包在传输过程中是会丢包的,这就导致可能有时候抓到的RTO超时重传向量的维度不同,而且你不知道丢失的是哪个包,我们就无法去比较。
再来看看一些传统的特征存在的问题,例如TTL,windows scale等。
- 操作系统调优是非常常见的操作,调优的过程中就可能会修改这些传统的参数,又或者是目标主机专门为了混淆操作系统识别,专门修改了。那这时候这些特征的可信度就非常低了。
传统的单包操作系统指纹识别就没有考虑上们的问题。
例如:传统的单包指纹工具识别考虑RTO的时候是按照如下公式来的:
Y
j
m
=
m
a
x
(
⌈
−
l
o
g
10
(
m
a
x
(
∣
δ
(
m
)
−
δ
j
(
m
)
∣
,
1
0
−
6
)
)
⌉
,
0
)
Y_{jm} = max(\lceil-log_{10}(max(|\delta(m)-\delta_j(m)|,10^{-6}))\rceil,0)
Yjm=max(⌈−log10(max(∣δ(m)−δj(m)∣,10−6))⌉,0)
其中的
δ
\delta
δ是RTO向量,既每次超时重传的时间间隔向量。
δ
j
(
m
)
\delta_j(m)
δj(m)代表指纹数据库中第
j
j
j个操作系统的超时重传指纹的第m维的值,
δ
(
m
)
\delta(m)
δ(m)代表我们采样到的数据的第
M
M
M维的值。
然后再
W
j
=
∑
m
=
1
∣
δ
∣
Y
j
m
W_j = \sum^{|\delta|}_{m=1}Y_{jm}
Wj=m=1∑∣δ∣Yjm
其中
W
j
W_j
Wj代表的是给第
j
j
j个操作系统打的分。
思路特别的简单,但是存在很大的问题,例如现在有这种情况:
o
b
s
e
r
v
a
t
i
o
n
δ
:
(
3.0
,
24.0
)
f
i
n
g
e
r
p
r
i
n
t
δ
1
:
(
3.0
,
12.0
)
f
i
n
g
e
r
p
r
i
n
t
δ
2
:
(
2.9
,
23.9
)
observation \ \delta:(3.0,24.0) \\ fingerprint \ \delta_1:(3.0,12.0) \\ fingerprint \ \delta_2:(2.9,23.9)
observation δ:(3.0,24.0)fingerprint δ1:(3.0,12.0)fingerprint δ2:(2.9,23.9)
显然我们观察到的值与指纹库中的
δ
2
\delta_2
δ2是比较接近的,但是计算一下会发现
d
e
l
t
a
1
delta_1
delta1的得分更高。
论文中就尝试提出一种更优的策略来确定操作系统的类别,不是通过打分,而是直接得到是第
j
j
j个操作系统的概率。因为
δ
\delta
δ和
u
u
u是相互独立的两个变量,所以既有如下表示:
p
(
x
∣
y
j
)
=
p
(
δ
∣
δ
j
)
p
(
u
∣
u
j
)
p(x|y_j) = p(\delta|\delta_j)p(u|u_j)
p(x∣yj)=p(δ∣δj)p(u∣uj)
其中的
y
j
y_j
yj为指纹库中第
j
j
j个操作系统的指纹,
x
x
x为我们从网络中得到的特征向量。
公式推导
然后再来下面讲该公式中的 p ( δ ∣ δ j ) p(\delta|\delta_j) p(δ∣δj)和 p ( u ∣ u j ) p(u|u_j) p(u∣uj)从何而来。
第一部分,RTO向量部分
从上面我们知道
Q
m
Q_m
Qm代表RTO重传的数据包中第
m
m
m次的延迟时间,d为传输固定大小的
S
Y
N
−
A
C
K
SYN-ACK
SYN−ACK数据包所需要的时间,那么我们就有如下的图:
也就是有:
δ
(
m
)
=
δ
j
(
m
)
+
Q
m
+
1
−
Q
m
,
m
=
1
,
2
,
…
,
∣
δ
j
∣
\delta(m) = \delta_j(m) + Q_{m+1} - Q_{m} , \ \ \ m=1,2,\dots,|\delta_j|
δ(m)=δj(m)+Qm+1−Qm, m=1,2,…,∣δj∣
然后其中的
Q
m
+
1
−
Q
m
Q_{m+1} - Q_{m}
Qm+1−Qm,我们将其称为延迟抖动OWD(网络情况不同出现的延迟不同导致的传输时间抖动)
。
然后有如下公式:
其中的
f
(
.
)
f(.)
f(.)是OWD的概率密度函数。(论文后面使用指数分布来表示OWD的分布,看起来好像比较何理?至于其中的参数,我们可以根据实际情况来确定。)
但是还有问题,上面的公式没有考虑到数据包丢失的情况,因为目标主机在响应SYN-ACK的时候,数据包可能会丢失,出现数据包丢失的情况下,我们的抓取到
δ
=
(
3
,
18
)
\delta = (3,18)
δ=(3,18)向量时,他是与
(
3
,
6
,
12
)
(3,6,12)
(3,6,12)这个指纹向量比较匹配呢还是与
(
2.6
,
17.9
)
(2.6,17.9)
(2.6,17.9)这个指纹向量比较匹配?为了解决这种问题,论文中定义了一种新的广义化的RTO,用
τ
\tau
τ,其表示如下:
其中的j还是代表指纹库中的第
j
j
j个操作系统。
实际上就是把
δ
\delta
δ向量中的时间间隔该用
τ
\tau
τ向量中的时间和向量来表示。
再定义
Γ
(
τ
,
τ
j
)
\Gamma(\tau,\tau_j)
Γ(τ,τj),其包含集合
{
1
,
2
,
…
,
∣
τ
j
∣
}
\{1,2,\dots,|\tau_j|\}
{1,2,…,∣τj∣}的所有子集。然后定义
γ
∈
Γ
\gamma \in \Gamma
γ∈Γ,
γ
(
m
)
=
k
\gamma(m)=k
γ(m)=k,意味着接收到的第m个syn-ack数据包实际上对应的原始位置为k,就拿下图来说:
r
(
2
)
=
3
r(2)=3
r(2)=3,也就是客户端收到的第二个包实际上是目标主机发送的第3个包。然后得到如下公式:
其中的
p
(
γ
)
p(\gamma)
p(γ)如下:
既伯努利分布,其中的
q
q
q就为发生丢包的概率。
然后再处理 p ( τ ∣ τ j , γ ) p(\tau|\tau_j,\gamma) p(τ∣τj,γ)
我们需要重新定义延迟抖动,因为之前的延迟抖动是向量两个包之间的,而我们考虑丢包之后,延迟抖动可能就不相邻了。
然后有:
最终得到:
第二部分:常用特征部分,既Window scale、TTL等
这一部分之所以要进行概率化,是因为这部分的数据是可能被修改的,我们把值被修改的情况考虑进去。
我们定义用户修改第
m
m
m个特征的概率为
π
m
\pi_m
πm(参数值,自己定义)
,然后还有
I
j
m
=
1
{
u
(
m
)
=
u
j
(
m
)
}
I_{jm}=1_{\{u(m)=u_j(m)\}}
Ijm=1{u(m)=uj(m)},既抓到的数据包的特征值和指纹中的特征值相同时
I
j
m
I_{jm}
Ijm为1,不同为0。
然后就有:
最终我们开始的公式变成了下面的公式:
通过如上公式,我们就能得到为某个操作系统的概率。
论文方法的局限性
- SYN数据包可能丢失,且我们无法验证是否丢失。除非我们允许SYN重传,但是又会引发新的问题。收到的SYN-ACK是响应的哪个SYN?或许可以用不同的SYN源端口解决。
- 如果延迟抖动过程变成了非独立的,工具的精度会下降。例如在CPU过载时,内核的会存在显著的内核调度延迟。且不同延迟抖动不是独立的。
- 现实世界中的操作系统分布并不是均衡的。
操作系统指纹识别进一步的设想
阅读了一篇论文,有限样本下的暗网指纹识别,文中使用SGAN来提升有限样本下的暗网指纹识别。利用SGAN能学习到很多没有标签的样本中的特征。
那么根据这个思路,在操作系统识别中,要想获取到没有标签的样本非常容易(获取带标签的数据难度比较大)
,所以我们是否可以利用其来提高操作系统指纹识别的准确度。
本周学习了GAN,SGAN,同时尝试去找到更多数据和获取数据的工具。