pgsql matcher
This commit is contained in:
parent
66e8215c82
commit
49eddff2e5
156
matcher/pgsql/pgsql.go
Normal file
156
matcher/pgsql/pgsql.go
Normal file
|
@ -0,0 +1,156 @@
|
|||
package pgsql
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"loafle.com/overflow/collector/core/scan/service/matcher/packet"
|
||||
"loafle.com/overflow/collector/discovery/types"
|
||||
)
|
||||
|
||||
const (
|
||||
RESPONSE_TYPE_ERR uint8 = 0x45
|
||||
)
|
||||
|
||||
type pgsql struct {
|
||||
Len uint32
|
||||
MessageType uint16
|
||||
_ uint16
|
||||
Name [5]byte
|
||||
NameValue byte
|
||||
Db [9]byte
|
||||
DBValue byte
|
||||
Encoding [16]byte
|
||||
EncodingValue [5]byte
|
||||
DateStyle [10]byte
|
||||
DateStyleValue [4]byte
|
||||
TimeZone [9]byte
|
||||
TimeZoneValue [11]byte
|
||||
ExtraDigits [19]byte
|
||||
ExtraDigitsValue uint16
|
||||
End byte
|
||||
}
|
||||
|
||||
type pgsqlErrResponse struct {
|
||||
ResponseType uint8
|
||||
Len [4]byte
|
||||
Severity [6]byte
|
||||
_ byte
|
||||
Code [6]byte
|
||||
_ byte
|
||||
Message [53]byte
|
||||
}
|
||||
|
||||
type PostgreSQLMatcher struct {
|
||||
packets []*packet.Packet
|
||||
}
|
||||
|
||||
func NewPostgreSQLMatcher() *PostgreSQLMatcher {
|
||||
|
||||
pgSqlMatcher := &PostgreSQLMatcher{}
|
||||
|
||||
pg := pgsql{}
|
||||
|
||||
pg.Len = 0x00000065
|
||||
pg.MessageType = 0x0003
|
||||
|
||||
var name [5]byte
|
||||
copy(name[:], "user")
|
||||
pg.Name = name
|
||||
pg.NameValue = 0x00
|
||||
|
||||
var db [9]byte
|
||||
copy(db[:], "database")
|
||||
pg.Db = db
|
||||
pg.DBValue = 0x00
|
||||
|
||||
var encoding [16]byte
|
||||
copy(encoding[:], "client_encoding")
|
||||
pg.Encoding = encoding
|
||||
|
||||
var encodingValue [5]byte
|
||||
copy(encodingValue[:], "UTF8")
|
||||
pg.EncodingValue = encodingValue
|
||||
|
||||
var dateStyle [10]byte
|
||||
copy(dateStyle[:], "DateStyle")
|
||||
pg.DateStyle = dateStyle
|
||||
|
||||
var dateStyleValue [4]byte
|
||||
copy(dateStyleValue[:], "ISO")
|
||||
pg.DateStyleValue = dateStyleValue
|
||||
|
||||
var timeZone [9]byte
|
||||
copy(timeZone[:], "TimeZone")
|
||||
pg.TimeZone = timeZone
|
||||
|
||||
var timeZoneValue [11]byte
|
||||
copy(timeZoneValue[:], "Asia/Seoul")
|
||||
pg.TimeZoneValue = timeZoneValue
|
||||
|
||||
var extraDigit [19]byte
|
||||
copy(extraDigit[:], "extra_float_digits")
|
||||
pg.ExtraDigits = extraDigit
|
||||
|
||||
pg.ExtraDigitsValue = 0x3200
|
||||
|
||||
writer := new(bytes.Buffer)
|
||||
binary.Write(writer, binary.BigEndian, pg)
|
||||
|
||||
pgSqlMatcher.packets = append(pgSqlMatcher.packets, packet.NewPacket(writer.Bytes(), writer.Len()))
|
||||
|
||||
return pgSqlMatcher
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) ServiceName() string {
|
||||
return "PostgreSQL"
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) PacketCount() int {
|
||||
return len(t.packets)
|
||||
}
|
||||
func (t *PostgreSQLMatcher) Packet(index int) *packet.Packet {
|
||||
return t.packets[index]
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) IsError(index int, packet *packet.Packet, info *types.ServiceScanInfo) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) IsNoResponse(index int) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) IsPrePacket() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *PostgreSQLMatcher) Match(index int, packet *packet.Packet, info *types.ServiceScanInfo) bool {
|
||||
|
||||
if packet == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
reader := new(bytes.Buffer)
|
||||
reader.Write(packet.Buffer)
|
||||
|
||||
pg := pgsqlErrResponse{}
|
||||
if err := binary.Read(reader, binary.BigEndian, &pg); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if pg.ResponseType != RESPONSE_TYPE_ERR {
|
||||
return false
|
||||
}
|
||||
|
||||
severity := string(pg.Severity[1:])
|
||||
if severity != "FATAL" && severity != "ERROR" {
|
||||
return false
|
||||
}
|
||||
|
||||
if string(pg.Code[1:]) != "28000" {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
}
|
71
matcher/pgsql/pgsql_test.go
Normal file
71
matcher/pgsql/pgsql_test.go
Normal file
|
@ -0,0 +1,71 @@
|
|||
package pgsql
|
||||
|
||||
|
||||
import (
|
||||
"loafle.com/overflow/collector/core/scan/service/matcher/packet"
|
||||
"net"
|
||||
"testing"
|
||||
"crypto/tls"
|
||||
)
|
||||
|
||||
func TestPG(t *testing.T) {
|
||||
m := NewPostgreSQLMatcher()
|
||||
|
||||
conn, err := net.Dial("tcp", "192.168.1.88:5432") //107
|
||||
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 := packet.NewPacket(bytes, n)
|
||||
|
||||
if m.Match(i, p, nil) {
|
||||
t.Log("PostgreSQL found")
|
||||
return
|
||||
}
|
||||
|
||||
t.Error("PostgreSQL not found")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSqlTLS(t *testing.T) {
|
||||
conn, err := tls.Dial(
|
||||
"tcp",
|
||||
"192.168.1.107:5432",
|
||||
&tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
ServerName: "192.168.1.107",
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
defer conn.Close()
|
||||
|
||||
m := NewPostgreSQLMatcher()
|
||||
for i := 0; i < m.PacketCount(); i++ {
|
||||
|
||||
pack := m.Packet(i)
|
||||
conn.Write(pack.Buffer)
|
||||
bytes := make([]byte, 1024)
|
||||
n, _ := conn.Read(bytes)
|
||||
p := packet.NewPacket(bytes, n)
|
||||
|
||||
if m.Match(i, p, nil) {
|
||||
t.Log("PostgreSQL found")
|
||||
return
|
||||
}
|
||||
|
||||
t.Error("PostgreSQL not found")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user