Documentation ¶
Overview ¶
Package tlsLayer provides facilities for tls, including sniffing.
Index ¶
- Constants
- Variables
- func GenerateRandomCertKeyFiles(cfn, kfn string) error
- func GenerateRandomTLSCert() []tls.Certificate
- func GenerateRandomeCert_Key() (certPEM []byte, keyPEM []byte)
- func GetCertArrayFromFile(certFile, keyFile string) (certArray []tls.Certificate, err error)
- func GetLastTlsRecordTailIndex(p []byte) (last_cursor int, count int)
- func GetTlsRecordNextIndex(p []byte) int
- type Client
- type ComSniff
- type Conn
- type DetectReader
- type DetectWriter
- type Recorder
- type Server
- type SniffConn
- type TeeConn
- func (tc *TeeConn) Close() error
- func (tc *TeeConn) LocalAddr() net.Addr
- func (tc *TeeConn) Read(b []byte) (n int, err error)
- func (tc *TeeConn) RemoteAddr() net.Addr
- func (tc *TeeConn) SetDeadline(t time.Time) error
- func (tc *TeeConn) SetReadDeadline(t time.Time) error
- func (tc *TeeConn) SetWriteDeadline(t time.Time) error
- func (tc *TeeConn) Write(b []byte) (n int, err error)
Constants ¶
const ( CutType_big byte = iota + 1 CutType_small CutType_fit )
Variables ¶
var OnlyTest bool
var PDD bool //print tls detect detail
Functions ¶
func GenerateRandomCertKeyFiles ¶
会调用 GenerateRandomeCert_Key 来生成证书,并输出到文件
func GenerateRandomTLSCert ¶
func GenerateRandomTLSCert() []tls.Certificate
会调用 GenerateRandomeCert_Key 来生成证书,并生成包含该证书的 []tls.Certificate
func GenerateRandomeCert_Key ¶
使用 ecc p256 方式生成证书
func GetCertArrayFromFile ¶
func GetCertArrayFromFile(certFile, keyFile string) (certArray []tls.Certificate, err error)
若 certFile, keyFile 有一项没给出,则会自动生成随机证书
func GetTlsRecordNextIndex ¶
Types ¶
type ComSniff ¶
type ComSniff struct { IsTls bool DefinitelyNotTLS bool SpecialCommandBytes []byte //目前规定,使用uuid作为special command UH utils.UserHaser //为了在服务端能确认一串数据确实是有效的uuid,需要使用 UserHaser SniffedHostName string // contains filtered or unexported fields }
func (*ComSniff) GetFailReason ¶
type DetectReader ¶
DetectReader 对每个Read的数据进行分析,判断是否是tls流量
type DetectWriter ¶
DetectReader 对每个Read的数据进行分析,判断是否是tls流量
func (*DetectWriter) SimpleWrite ¶
func (dw *DetectWriter) SimpleWrite(p []byte) (n int, err error)
直接写入,而不进行探测
func (*DetectWriter) Write ¶
func (dw *DetectWriter) Write(p []byte) (n int, err error)
发现,数据基本就是 23 3 3, 22 3 3,22 3 1 , 20 3 3 一个首包不为23 3 3 的包往往会出现在 1184长度的包的后面,而且一般 1184长度的包 的开头是 22 3 3 0 122,且总是在Write里面发生. 所以可以直接推测这个就是握手包; 实测 22 3 3 0 122 开头的,无一例外都是 1184长度,且后面接多个 开头任意的 Write 也有一些特殊情况,比如 22 3 1 首部的包,往往是 517 长度,后面也会紧跟着一些首部不为 22/23 的 Write.
23 3 3 也是有可能 发生后面不为22/23的write,长度 不等. 我们和Read过滤一样,先过滤握手包,再找到 第一个23 3 1-3 的数据包.
总之,我们在客户端的 Write 操作,就是 外界试图使用我们的 Write 写入数据. 所以在socks5后面 使用的这个 Write, 应该是把 服务端的响应 写回 socks5,比如 serverhello 之类 服务端的 Write 操作,也是读 serverhello.
type Recorder ¶
和TeeConn配合的是Recorder, 每次调用Write就会记录一个新Buffer
func NewRecorder ¶
func NewRecorder() *Recorder
func (*Recorder) ReleaseBuffers ¶
func (wr *Recorder) ReleaseBuffers()
调用时,要保证目前没有任何人 正在 Write,否则会报错
func (*Recorder) StartRecord ¶
func (wr *Recorder) StartRecord()
StartRecord后,Recorder就会开始记录数据。默认Recorder就是开启状态;
所以此方法仅用于之前 Stop过
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
type SniffConn ¶
type SniffConn struct { net.Conn //这个 Conn本DetectConn 中不会用到,只是为了能让CopyConn支持 net.Conn W *DetectWriter R *DetectReader RawConn *net.TCPConn // 这个是为了让外界能够直接拿到底层的连接 }
用于 探测 承载数据是否使用了tls, 它先与 底层tcp连接 进行 数据传输,然后查看传输到内容
可以参考 https://www.baeldung.com/linux/tcpdump-capture-ssl-handshake
func NewSniffConn ¶
可选两个参数传入,优先使用rw ,为nil的话 再使用oldConn,作为 DetectConn 的 Read 和Write的 具体调用的主体 is_secure 表示,是否使用更强的过滤手段(越强越浪费时间)
type TeeConn ¶
实现net.Conn,专门用于 tls 检测步骤 每次 Read TeeConn, 都会从OldConn进行Read,然后把Read到的数据同时写入 TargetWriter(NewTeeConn 的参数)
这个TeeConn设计时,专门用于 给 tls包一个 假的 net.Conn, 避免它 主动close我们的原Conn
tls的Read是我们要关心的,Write则没有必要套Tee
func (*TeeConn) SetDeadline ¶
暂时先什么也不做。事实上,这里 如果deadline到期了 需要能够通知外界,