On this page
基于统计学的C2流量检测
On this page
1. 基础统计学知识
中位数
- 中位数是想要表示一个数据集中间位置的数据。
比如一组数字 (1, 1, 2, 2, 4, 6, 9) 的中位数为 2
- 中位数是想要表示一个数据集中间位置的数据。
绝对中位差
中位数是想要表示一个数据集中间位置的数据,那么每个数据与中位数的差值,反映了这些数据偏离中间位置的程度,在这个偏离程度中取中位数得到的就是绝对中位差。
比如一组数字 (1, 1, 2, 2, 4, 6, 9) 的中位数为 2这组数字相对于2的偏差为:(1, 1, 0, 0, 2, 4, 7),中位数为 1所以绝对中位差为 1
偏度
- 衡量随机变量概率分布的不对称性,是相对于平均值不对称程度的度量,通过对偏度系数的测量,我们能够判定数据分布的不对称程度以及方向。
- 偏度的衡量是相对于正态分布来说,正态分布的偏度为0,即若数据分布是对称的,偏度为0。若偏度大于0,则分布右偏(正偏度),即分布有一条长尾在右;若偏度小于0,则分布为左偏(负偏度),即分布有一条长尾在左(如上图);同时偏度的绝对值越大,说明分布的偏移程度越严重。
2. C2流量vs正常流量
假设beacon的配置为: | Sleep时间 | jitter | 实际sleep时间 | | --------- | ------ | ------------- | | 300s | 20% | 240s~360s |
- 访问的时间间隔为240s-360s
假设正常用户随机浏览相同网页
- 访问的时间间隔为60s-600s
- 基于上述的假设和统计学知识,可以画出图:
- beacon中位数(Median): 319
- 正常用户中位数(Median): 236
- beacon绝对中位差(MAD): 21
- 正常用户绝对中位差(MAD): 95
可以得出结论:
- beacon:偏正态分布,绝对中位差比较小
- 正常用户:偏正/负偏度分布,绝对中位差比较大
参考RITA (Real Intelligence Threat Analytics)的算法,通过请求的时间间隔和数据包大小的统计信息,得出可疑的C2的请求:
- 偏度
- 绝对中位差
- 频率
实现的代码片段如下
//计算偏度//store the diff slice lengthdiffLength := len(diff)//diffLength-1 is used since diff is a zero based slicetsLow := diff[util.Round(.25*float64(diffLength-1))]tsMid := diff[util.Round(.5*float64(diffLength-1))]tsHigh := diff[util.Round(.75*float64(diffLength-1))]tsBowleyNum := tsLow + tsHigh - 2*tsMidtsBowleyDen := tsHigh - tsLow//tsSkew should equal zero if the denominator equals zero//bowley skew is unreliable if Q2 = Q1 or Q2 = Q3if tsBowleyDen != 0 && tsMid != tsLow && tsMid != tsHigh {tsSkew = float64(tsBowleyNum) / float64(tsBowleyDen)}//计算绝对中位差tsMadm := devs[util.Round(.5*float64(diffLength-1))]//计算频率bucketDivs, freqList, freqCount, histScore := getTsHistogramScore(a.tsMin, a.tsMax, res.TsList)
3. 参考资料
- https://infosecjupyterthon.com/2021/sessions/day2-5-C2_Beaconing_Detection_using_Statistical_Analysis.html
- https://github.com/activecm/rita
Edit this page
Last updated on 4/9/2023