new: http and https proxy modules can now define an onCommand callback to handle custom session commands (closes #182)

This commit is contained in:
evilsocket 2018-03-19 18:02:43 +01:00
parent 77f8e070bc
commit 86ba73f5bb
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
3 changed files with 59 additions and 5 deletions

View file

@ -14,6 +14,7 @@ type HttpProxyScript struct {
*ProxyScript
onRequestScript *otto.Script
onResponseScript *otto.Script
onCommandScript *otto.Script
}
func LoadHttpProxyScriptSource(path, source string, sess *session.Session) (err error, s *HttpProxyScript) {
@ -26,9 +27,9 @@ func LoadHttpProxyScriptSource(path, source string, sess *session.Session) (err
ProxyScript: ps,
onRequestScript: nil,
onResponseScript: nil,
onCommandScript: nil,
}
// compile call to onRequest if defined
if s.hasCallback("onRequest") {
s.onRequestScript, err = s.VM.Compile("", "onRequest(req, res)")
if err != nil {
@ -37,7 +38,6 @@ func LoadHttpProxyScriptSource(path, source string, sess *session.Session) (err
}
}
// compile call to onResponse if defined
if s.hasCallback("onResponse") {
s.onResponseScript, err = s.VM.Compile("", "onResponse(req, res)")
if err != nil {
@ -46,6 +46,14 @@ func LoadHttpProxyScriptSource(path, source string, sess *session.Session) (err
}
}
if s.hasCallback("onCommand") {
s.onCommandScript, err = s.VM.Compile("", "onCommand(cmd)")
if err != nil {
log.Error("Error while compiling onCommand callback: %s", err)
return
}
}
return
}
@ -91,6 +99,13 @@ func (s *HttpProxyScript) doResponseDefines(res *http.Response) (err error, jsre
return
}
func (s *HttpProxyScript) doCommandDefines(cmd string) (err error) {
if err = s.VM.Set("cmd", cmd); err != nil {
log.Error("Error while defining cmd: %s", err)
}
return
}
func (s *HttpProxyScript) OnRequest(original *http.Request) (jsreq *JSRequest, jsres *JSResponse) {
var err error
@ -145,3 +160,24 @@ func (s *HttpProxyScript) OnResponse(res *http.Response) (jsreq *JSRequest, jsre
return nil, nil
}
func (s *HttpProxyScript) OnCommand(cmd string) bool {
if s.onCommandScript != nil {
s.Lock()
defer s.Unlock()
if err := s.doCommandDefines(cmd); err != nil {
log.Error("Error while running bootstrap onCommand definitions: %s", err)
return false
}
if ret, err := s.VM.Run(s.onCommandScript); err != nil {
log.Error("Error while executing onCommand callback: %s", err)
return false
} else if v, err := ret.ToBoolean(); err == nil {
return v
}
}
return false
}