有关active-scans-drafts
复现过程,在机器:10.21.238.242
,文件夹:/home/k8s/zhenyong/TLS1.3collect/ccr/active-scans-drafts/
有关具体的过程,我当时没有总结,可以借鉴技术,但是我觉得分析TLS的应该没办法用上了。
前言
最近继续做之前的工作,因为前一段时间回家了一趟:D,就空了一段时间,现在想捡起来真的需要很大力气。
我现在只想总结一下每个函数的用途,因为针对前面步骤代码的解析已经很详细了,大多数知识点都已经讲到,以后遗忘的话就去看吧,现在的主要目的是看懂代码在做什么,大体结构看懂,等用的时候再深入看也来的及,我觉得留一点盲点也无可厚非。
aggregate1.go
- 总结:
代码整体结构与之前的类似,同样具有互斥的操作以及通道处理数据;
不同之处,多了很多其它处理,比如:func (s InputSample) to_aggregated() *AggregatedSample
函数,是将信息进行整合成AggregatedSample
结构。
除此之外,还对具有相同域名的进行了整合,merge函数就是最好的写照。判断其中的“tls-ver-bitmaps”,full和sh不知道是啥意思,
main函数
定义主要的变量,通过 line_from_stdin
,开启协程读入标准输入
通过通道读入,然后反序列化成结构体。
通过定义结构体:
type Worker struct {
key Key
queue chan *InputSample
just_hit_queue_limit bool
running bool
prefix string
part string
aggregate map[string]*AggregatedSample
close_once sync.Once
}
来控制整个处理工作,其中的queue
表示通道,将反序列化后的结构体:
type InputSample struct {
Domain string `json:"domain"`
IP string `json:"ip"`
Timestamp time.Time `json:"timestamp"`
Error bool `json:"error"`
ErrorMsg string `json:"errormsg,omitempty"`
Version *VersionInfo `json:"tls,omitempty"`
}
送入通道current_worker.queue <- &sample
,通过worker_func
做一定处理并写入文件。同时由一个工作管理map来保证互斥处理:
type WorkManager struct {
lock sync.RWMutex //读写互斥锁
workerMap map[Key]*Worker
}
最终处理完成,关闭所有通道。
其中有一些其它的处理方式可以总结一下:
- 一开始定义了一个信号通道,用于结束程序:
sig_chan := make(chan os.Signal, 1)
signal.Notify(sig_chan, os.Interrupt)
然后判断信号通道读出内容,就结束处理、输入。
worker_func
除掉将异常信息存储起来的函数,还有其它几个主要处理数据的函数,下面一一介绍。
- 几个函数的包含关系:
aggregate_with_file ------> locked_aggregate_with_file--------> do_aggregate
- 函数编写的技巧:
可在函数内编写函数:
do_aggregate := func(domain string, new_sample *AggregatedSample) {
old_sample, ok := work.aggregate[domain]
if ok {
old_sample.merge(new_sample)
} else {
// just store
work.aggregate[domain] = new_sample
}
}
比如上面这个函数,是在worker_func
里面的函数。
-
aggregate_with_file
不太明白filename_lock
的作用。好像是表示锁上文件,或者说互斥读写的意思。
然后里面主要调用了locked_aggregate_with_file
,并把最终汇总的结构体赋值给work。 -
locked_aggregate_with_file
作者将文件分为:filename
、filename_tmp
、filename_lock
首先从work.queue
通道中读取数据,并调用聚合函数do_aggregate
将同一个域中的信息聚合,使用到一个方法就是merge
,具体里面的操作还没完全看懂。因为第一次读进来里面
之后新建filename_tmp
文件,然后将聚合后的数据写入其中,并压缩。
再之后将filename_tmp
改名为filename
。
再再之后解压filename_tmp
文件并反序列化文件,再一次聚合数据,将同一个域中的数据聚合到一块。这样就是最终的输出了。
其中还有to_aggregated
方法,将原本的数据进行聚合,聚合成:
type AggregatedSample struct {
MostRecentSuccess *TimeVersionIP `json:"tls-full,omitempty"`
MostRecentPartial *TimeVersionIP `json:"tls-SH,omitempty"`
Bitmaps Bitmaps `json:"tls-ver-bitmaps"`
SeenRefuse bool `json:"443_refused"` //可见拒绝
}
type TimeVersionIP struct {
IP string `json:"ip"`
Timestamp time.Time `json:"timestamp"`
VersionInfo *VersionInfo `json:"tls,omitempty"`
}
方便后面进行处理,具体细节先不深究,里面有一些版本对应的表也还没完全看懂,需要之后进一步看。
涉及到的知识点,我已经在:https://editor.youkuaiyun.com/md/?articleId=108754675 总结了。
tls13version_aggregate1_run.py
python脚本的主要作用就是递归读入压缩文件,并将文件解压缩并调用golang程序将数据标准输入到golang程序,不得不佩服人家的代码功底。
其中涉及到的知识点我已经在:https://editor.youkuaiyun.com/md/?articleId=108725409 中总结了。欢迎学习。