mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-21 22:30:46 +08:00
fix: fix some bugs (#17)
This commit is contained in:
+23
-20
@@ -126,29 +126,32 @@ func (s *Server) newZone(name string) *newdns.Zone {
|
||||
}
|
||||
log.Info("DNS record[id:%d rule:%s remote_ip:%s] has been created", r.ID, _rule.Name, ip)
|
||||
|
||||
//only send to client when this connection recorded first time.
|
||||
if _rule.PushToClient {
|
||||
if flagGroup != "" {
|
||||
var count int64
|
||||
database.DB.Where("rule_name=? and domain like ?", _rule.Name, "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
if count <= 1 {
|
||||
r.PushToClient()
|
||||
log.Trace("DNS record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
}
|
||||
} else {
|
||||
//only send to client or notify user when this connection recorded first time.
|
||||
var count int64
|
||||
if flagGroup != "" {
|
||||
database.DB.Where("rule_name=? and domain like ?", _rule.Name, "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
}
|
||||
if count <= 1 {
|
||||
if _rule.PushToClient {
|
||||
r.PushToClient()
|
||||
log.Trace("DNS record[id:%d, flag:%s] has been put to client message queue", r.ID, flag)
|
||||
if flagGroup != "" {
|
||||
log.Trace("DNS record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("DNS record[id:%d] has been put to client message queue", r.ID)
|
||||
}
|
||||
}
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
if flagGroup != "" {
|
||||
log.Trace("DNS record[id:%d, flagGroup:%s] notice has been sent", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("DNS record[id:%d] notice has been sent", r.ID)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
log.Trace("DNS record[id:%d] notice has been sent", r.ID)
|
||||
}()
|
||||
}
|
||||
|
||||
if _rule.Value != "" {
|
||||
value := rule.CompileTpl(_rule.Value, vars)
|
||||
_type := _rule.Type
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ import (
|
||||
)
|
||||
|
||||
type Rule struct {
|
||||
rule.BaseRule `yaml:""`
|
||||
rule.BaseRule `yaml:",inline"`
|
||||
Type newdns.Type `gorm:"default:1" form:"type" json:"type"`
|
||||
Value string `form:"value" json:"value"`
|
||||
TTL time.Duration `gorm:"ttl;default:10" form:"ttl" json:"ttl"`
|
||||
|
||||
+23
-19
@@ -156,26 +156,30 @@ func createRecord(_rule *Rule, flag, flagGroup, user, password, method, path, fi
|
||||
}
|
||||
log.Info("FTP record[id:%d rule:%s remote_ip:%s] has been created", r.ID, _rule.Name, ip)
|
||||
|
||||
//only send to client when this connection recorded first time.
|
||||
if _rule.PushToClient {
|
||||
if flagGroup != "" {
|
||||
var count int64
|
||||
database.DB.Where("rule_name=? and (user like ? or password like ?)", _rule.Name, "%"+flagGroup+"%", "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
if count <= 1 {
|
||||
r.PushToClient()
|
||||
log.Trace("FTP record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
}
|
||||
} else {
|
||||
//only send to client or notify user when this connection recorded first time.
|
||||
var count int64
|
||||
if flagGroup != "" {
|
||||
database.DB.Where("rule_name=? and (user like ? or password like ?)", _rule.Name, "%"+flagGroup+"%", "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
}
|
||||
if count <= 1 {
|
||||
if _rule.PushToClient {
|
||||
r.PushToClient()
|
||||
log.Trace("FTP record[id:%d, flag:%s] has been put to client message queue", r.ID, flag)
|
||||
if flagGroup != "" {
|
||||
log.Trace("FTP record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("FTP record[id:%d] has been put to client message queue", r.ID)
|
||||
}
|
||||
}
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
if flagGroup != "" {
|
||||
log.Trace("FTP record[id:%d, flagGroup:%s] notice has been sent", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("FTP record[id:%d] notice has been sent", r.ID)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
log.Trace("FTP record[id:%d] notice has been sent", r.ID)
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
+33
-34
@@ -68,11 +68,10 @@ func (s *Server) NewConnection(c *vmysql.Conn) {
|
||||
user = c.User
|
||||
schema = c.SchemaName
|
||||
validated bool
|
||||
flag string
|
||||
)
|
||||
|
||||
for _, _rule := range s.getRules() {
|
||||
flag, _, _ = _rule.Match(user)
|
||||
flag, flagGroup, vars := _rule.Match(user)
|
||||
if flag == "" {
|
||||
flag, _, _ = _rule.Match(schema)
|
||||
}
|
||||
@@ -82,6 +81,9 @@ func (s *Server) NewConnection(c *vmysql.Conn) {
|
||||
log.Trace("MySQL connection[id: %d] matched rule[rule_name: %s, flag: %s]", c.ConnectionID, _rule.Name, flag)
|
||||
s.connRulePool.Store(c.ConnectionID, _rule)
|
||||
validated = true
|
||||
c.Flag = flag
|
||||
c.FlagGroup = flagGroup
|
||||
c.Vars = vars
|
||||
break
|
||||
}
|
||||
if !validated {
|
||||
@@ -103,7 +105,6 @@ func (s *Server) ConnectionClosed(c *vmysql.Conn) {
|
||||
var clientName, clientOS, flag, flagGroup string
|
||||
|
||||
user := c.User
|
||||
schema := c.SchemaName
|
||||
supportLoadLocalData := c.SupportLoadDataLocal
|
||||
|
||||
cr, ok := s.connRulePool.Load(c.ConnectionID)
|
||||
@@ -113,13 +114,6 @@ func (s *Server) ConnectionClosed(c *vmysql.Conn) {
|
||||
}
|
||||
|
||||
_rule := cr.(*Rule)
|
||||
// flag must not be empty
|
||||
for _, s := range []string{user, schema} {
|
||||
flag, flagGroup, _ = _rule.Match(s)
|
||||
if flag != "" {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if c.ConnAttrs != nil {
|
||||
clientName = c.ConnAttrs["_client_name"] + " " + c.ConnAttrs["_client_version"]
|
||||
@@ -143,27 +137,31 @@ func (s *Server) ConnectionClosed(c *vmysql.Conn) {
|
||||
}
|
||||
log.Info("MySQL record[id:%d rule:%s remote_ip:%s] has been created", r.ID, _rule.Name, ip)
|
||||
|
||||
//only send to client when this connection recorded first time.
|
||||
if _rule.PushToClient {
|
||||
if flagGroup != "" {
|
||||
var count int64
|
||||
database.DB.Where("rule_name=? and (user like ? or schema like ?)", _rule.Name, "%"+flagGroup+"%", "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
if count <= 1 {
|
||||
r.PushToClient()
|
||||
log.Trace("MySQL record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
}
|
||||
} else {
|
||||
r.PushToClient()
|
||||
log.Trace("MySQL record[id:%d, flag:%s] has been put to client message queue", r.ID, flag)
|
||||
}
|
||||
//only send to client or notify user when this connection recorded first time.
|
||||
var count int64
|
||||
if c.FlagGroup != "" {
|
||||
database.DB.Where("rule_name=? and (user like ? or schema like ?)", _rule.Name, "%"+flagGroup+"%", "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
}
|
||||
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
log.Trace("MySQL record[id: %d] notice has been sent", r.ID)
|
||||
}()
|
||||
if count <= 1 {
|
||||
if _rule.PushToClient {
|
||||
r.PushToClient()
|
||||
if flagGroup != "" {
|
||||
log.Trace("MySQL record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("MySQL record[id:%d] has been put to client message queue", r.ID)
|
||||
}
|
||||
}
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
if flagGroup != "" {
|
||||
log.Trace("MySQL record[id:%d, flagGroup:%s] notice has been sent", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("MySQL record[id: %d] notice has been sent", r.ID)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
s.connRulePool.Delete(c.ConnectionID)
|
||||
@@ -203,12 +201,13 @@ func (s *Server) ComQuery(c *vmysql.Conn, query string, callback func(*sqltypes.
|
||||
})}
|
||||
|
||||
//choose payload
|
||||
//jdbc:mysql://127.0.0.1:3306/test?connectionAttributes=t:cc7&autoDeserialize=true
|
||||
if c.ConnAttrs["t"] != "" && _rule.Payloads[c.ConnAttrs["t"]] != "" {
|
||||
payload, _ = base64.StdEncoding.DecodeString(_rule.Payloads[c.ConnAttrs["t"]])
|
||||
if c.Vars["payload"] != "" && _rule.Payloads[c.Vars["payload"]] != "" {
|
||||
payload, _ = base64.StdEncoding.DecodeString(_rule.Payloads[c.Vars["payload"]])
|
||||
log.Trace("MySQL exploit client [%d] with payload [%s]", c.ConnectionID, c.Vars["payload"])
|
||||
} else {
|
||||
for _, v := range _rule.Payloads {
|
||||
for k, v := range _rule.Payloads {
|
||||
payload, _ = base64.StdEncoding.DecodeString(v)
|
||||
log.Trace("MySQL not found payload variable, exploit client [%d] with payload [%s]", c.ConnectionID, k)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,6 +152,10 @@ type Conn struct {
|
||||
|
||||
ConnAttrs map[string]string
|
||||
Files map[string][]byte
|
||||
|
||||
Flag string
|
||||
FlagGroup string
|
||||
Vars map[string]string
|
||||
}
|
||||
|
||||
// bufPool is used to allocate and free buffers in an efficient way.
|
||||
|
||||
+24
-20
@@ -191,27 +191,31 @@ func (s *Server) Receive(c *gin.Context) {
|
||||
}
|
||||
log.Info("HTTP record[id:%d rule:%s remote_ip:%s] has been created", r.ID, _rule.Name, ip)
|
||||
|
||||
//only send to client when this connection recorded first time.
|
||||
if _rule.PushToClient {
|
||||
if flagGroup != "" {
|
||||
var count int64
|
||||
database.DB.Where("rule_name=? and raw_request like ?", _rule.Name, "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
if count <= 1 {
|
||||
r.PushToClient()
|
||||
log.Trace("HTTP record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
}
|
||||
} else {
|
||||
r.PushToClient()
|
||||
log.Trace("HTTP record[id:%d, flag:%s] has been put to client message queue", r.ID, r.Flag)
|
||||
}
|
||||
//only send to client or notify user when this connection recorded first time.
|
||||
var count int64
|
||||
if flagGroup != "" {
|
||||
database.DB.Where("rule_name=? and raw_request like ?", _rule.Name, "%"+flagGroup+"%").Model(&Record{}).Count(&count)
|
||||
}
|
||||
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
log.Trace("HTTP record[id:%d] notice has been sent", r.ID)
|
||||
}()
|
||||
if count <= 1 {
|
||||
if _rule.PushToClient {
|
||||
r.PushToClient()
|
||||
if flagGroup != "" {
|
||||
log.Trace("HTTP record[id:%d, flagGroup:%s] has been put to client message queue", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("HTTP record[id:%d] has been put to client message queue", r.ID)
|
||||
}
|
||||
}
|
||||
//send notice
|
||||
if _rule.Notice {
|
||||
go func() {
|
||||
r.Notice()
|
||||
if flagGroup != "" {
|
||||
log.Trace("HTTP record[id:%d, flagGroup:%s] notice has been sent", r.ID, flagGroup)
|
||||
} else {
|
||||
log.Trace("HTTP record[id:%d] notice has been sent", r.ID)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
for header, value := range _rule.ResponseHeaders {
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
|
||||
func auth(c *gin.Context) {
|
||||
c.SetSameSite(http.SameSiteLaxMode)
|
||||
c.SetCookie("token", c.Request.Header["Token"][0], 0, "/revsuit/api/", c.Request.Host, true, true)
|
||||
c.SetCookie("token", c.Request.Header["Token"][0], 0, "/revsuit/api/", "", false, true)
|
||||
c.String(200, "pong")
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
log "unknwon.dev/clog/v2"
|
||||
)
|
||||
|
||||
const VERSION = "Beta0.1"
|
||||
const VERSION = "0.1.1-beta"
|
||||
|
||||
type Revsuit struct {
|
||||
config *Config
|
||||
@@ -97,7 +97,7 @@ func initLog(level string) (logLevel log.Level) {
|
||||
database.DB.Logger.LogMode(logger.Info)
|
||||
logLevel = log.LevelTrace
|
||||
case "info":
|
||||
gin.SetMode(gin.DebugMode)
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
database.DB.Logger.LogMode(logger.Info)
|
||||
logLevel = log.LevelInfo
|
||||
case "warning", "warn":
|
||||
|
||||
Reference in New Issue
Block a user