ing
This commit is contained in:
76
matcher/redis/redis.go
Normal file
76
matcher/redis/redis.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/overflow_discovery/match/packet"
|
||||
"git.loafle.net/overflow/overflow_discovery/model/scaninfo"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const REDIS_PING string = "*1\r\n$4\r\nping\r\n"
|
||||
|
||||
type RedisMatcher struct {
|
||||
packets []*packet.Packet
|
||||
}
|
||||
|
||||
func NewRedisMatcher() *RedisMatcher {
|
||||
|
||||
redisMatcher := &RedisMatcher{}
|
||||
|
||||
redisMatcher.packets = append(redisMatcher.packets, packet.NewPacket([]byte(REDIS_PING), len(REDIS_PING)))
|
||||
|
||||
return redisMatcher
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) ServiceName() string {
|
||||
return "Redis"
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) PacketCount() int {
|
||||
return len(t.packets)
|
||||
}
|
||||
func (t *RedisMatcher) Packet(index int) *packet.Packet {
|
||||
return t.packets[index]
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) IsError(index int, packet *packet.Packet, info scaninfo.ServiceScanInfo) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) HasResponse(index int) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) IsPrePacket() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *RedisMatcher) Match(index int, packet *packet.Packet, info scaninfo.ServiceScanInfo) bool {
|
||||
|
||||
if packet == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
resp := strings.Split(string(packet.Buffer), "\r\n")[0]
|
||||
if len(resp) <= 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
sign := string([]rune(resp)[0])
|
||||
if len(sign) <= 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if sign == "+" {
|
||||
if resp == "+PONG" || resp == "+OK" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
if sign == "-" {
|
||||
if resp == "-NOAUTH" || resp == "-ERR" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
|
||||
}
|
||||
78
matcher/redis/redisProtected.go
Normal file
78
matcher/redis/redisProtected.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/overflow_discovery/match/packet"
|
||||
"git.loafle.net/overflow/overflow_discovery/model/scaninfo"
|
||||
)
|
||||
|
||||
const (
|
||||
COMPARE_STR_1 = "-"
|
||||
COMPARE_STR_2 = "DENIED"
|
||||
)
|
||||
|
||||
type RedisProtectedMatcher struct {
|
||||
}
|
||||
|
||||
func NewRedisProtectedMatcher() *RedisProtectedMatcher {
|
||||
|
||||
redisMatcher := &RedisProtectedMatcher{}
|
||||
|
||||
return redisMatcher
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) ServiceName() string {
|
||||
return "RedisProtectedMatcher"
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) PacketCount() int {
|
||||
return 0
|
||||
}
|
||||
func (r *RedisProtectedMatcher) Packet(index int) *packet.Packet {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) IsError(index int, packet *packet.Packet, info scaninfo.ServiceScanInfo) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) HasResponse(index int) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) IsPrePacket() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (r *RedisProtectedMatcher) Match(index int, packet *packet.Packet, info scaninfo.ServiceScanInfo) bool {
|
||||
|
||||
if packet == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
switch index {
|
||||
case 0:
|
||||
str := string(packet.Buffer[:packet.Len])
|
||||
|
||||
if str == "" {
|
||||
return false
|
||||
}
|
||||
if len(str) <= 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
firstCompare := str[0:1]
|
||||
seconcdCompare := str[1 : len(COMPARE_STR_2)+1]
|
||||
|
||||
if firstCompare != COMPARE_STR_1 {
|
||||
return false
|
||||
}
|
||||
if seconcdCompare != COMPARE_STR_2 {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
|
||||
}
|
||||
37
matcher/redis/redis_test.go
Normal file
37
matcher/redis/redis_test.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package redis
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/overflow_discovery/match/packet"
|
||||
"net"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const (
|
||||
ADDR string = "192.168.1.16:26379"
|
||||
)
|
||||
|
||||
func TestRedisMatcher(t *testing.T) {
|
||||
|
||||
m := NewRedisMatcher()
|
||||
|
||||
conn, _ := net.Dial("tcp", ADDR)
|
||||
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("Redis found.")
|
||||
return
|
||||
}
|
||||
|
||||
t.Error("Redis not found")
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user