ing
This commit is contained in:
94
service/matcher/cassandra/cassandra.go
Normal file
94
service/matcher/cassandra/cassandra.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package cassandra
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
|
||||
"git.loafle.net/overflow/overflow_discovery/service/matcher"
|
||||
)
|
||||
|
||||
type cassandra struct {
|
||||
Version uint8
|
||||
Flags uint8
|
||||
Stream uint16
|
||||
Opcode uint8
|
||||
Length uint32
|
||||
}
|
||||
|
||||
type CassandraMatcher struct {
|
||||
matcher.Matchers
|
||||
}
|
||||
|
||||
func (m *CassandraMatcher) ServiceName() string {
|
||||
return "Cassandra"
|
||||
}
|
||||
|
||||
func (m *CassandraMatcher) IsPrePacket() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CassandraMatcher) HasResponse(index int) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *CassandraMatcher) IsError(info matcher.MatchInfo, index int, packet *matcher.Packet) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CassandraMatcher) Match(info matcher.MatchInfo, index int, packet *matcher.Packet) bool {
|
||||
|
||||
if packet == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
reader := new(bytes.Buffer)
|
||||
reader.Write(packet.Buffer)
|
||||
|
||||
c := cassandra{}
|
||||
if err := binary.Read(reader, binary.BigEndian, &c); err != nil {
|
||||
return false
|
||||
}
|
||||
if c.Version != 0x84 {
|
||||
return false
|
||||
}
|
||||
if c.Flags != 0x00 {
|
||||
return false
|
||||
}
|
||||
if c.Stream != 0x00 {
|
||||
return false
|
||||
}
|
||||
if c.Opcode != 0x06 {
|
||||
return false
|
||||
}
|
||||
|
||||
//var itemcount uint16
|
||||
|
||||
//if binary.Read(reader, binary.BigEndian, &itemcount) != nil {
|
||||
// return false
|
||||
//}
|
||||
//
|
||||
//if itemcount != 0 && itemcount != 2 {
|
||||
// return false
|
||||
//}
|
||||
|
||||
return true
|
||||
|
||||
}
|
||||
|
||||
func NewMatcher() matcher.Matcher {
|
||||
|
||||
m := &CassandraMatcher{}
|
||||
c := cassandra{
|
||||
Version: 4,
|
||||
Flags: 0,
|
||||
Stream: 0,
|
||||
Opcode: 5,
|
||||
Length: 0,
|
||||
}
|
||||
writer := new(bytes.Buffer)
|
||||
binary.Write(writer, binary.LittleEndian, c)
|
||||
|
||||
m.AddPacket(matcher.NewPacket(writer.Bytes(), writer.Len()))
|
||||
|
||||
return m
|
||||
}
|
||||
74
service/matcher/cassandra/cassandra_test.go
Normal file
74
service/matcher/cassandra/cassandra_test.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package cassandra
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"git.loafle.net/overflow/overflow_discovery/service/matcher"
|
||||
)
|
||||
|
||||
func TestCassandra(t *testing.T) {
|
||||
|
||||
m := NewMatcher()
|
||||
|
||||
conn, err := net.Dial("tcp", "192.168.1.16:19042")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
for i := 0; i < m.PacketCount(); i++ {
|
||||
|
||||
pack := m.Packet(i)
|
||||
conn.Write(pack.Buffer)
|
||||
bytes := make([]byte, 1024)
|
||||
n, _ := conn.Read(bytes)
|
||||
p := matcher.NewPacket(bytes, n)
|
||||
|
||||
if m.Match(nil, i, p) {
|
||||
t.Log("Cassandra found")
|
||||
return
|
||||
}
|
||||
|
||||
t.Error("Cassandra not found")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestCassandraTLS(t *testing.T) {
|
||||
|
||||
m := NewMatcher()
|
||||
|
||||
conn, err := tls.Dial(
|
||||
"tcp",
|
||||
"192.168.1.16:19042",
|
||||
&tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
ServerName: "192.168.1.16",
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer conn.Close()
|
||||
|
||||
for i := 0; i < m.PacketCount(); i++ {
|
||||
|
||||
pack := m.Packet(i)
|
||||
conn.Write(pack.Buffer)
|
||||
bytes := make([]byte, 1024)
|
||||
n, _ := conn.Read(bytes)
|
||||
p := matcher.NewPacket(bytes, n)
|
||||
|
||||
if m.Match(nil, i, p) {
|
||||
t.Log("Cassandra found")
|
||||
return
|
||||
}
|
||||
|
||||
t.Error("Cassandra not found")
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user