http_proxy_script.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package http_proxy
  2. import (
  3. "net/http"
  4. "github.com/bettercap/bettercap/log"
  5. "github.com/bettercap/bettercap/session"
  6. "github.com/robertkrimen/otto"
  7. "github.com/evilsocket/islazy/plugin"
  8. )
  9. type HttpProxyScript struct {
  10. *plugin.Plugin
  11. doOnRequest bool
  12. doOnResponse bool
  13. doOnCommand bool
  14. }
  15. func LoadHttpProxyScript(path string, sess *session.Session) (err error, s *HttpProxyScript) {
  16. log.Debug("loading proxy script %s ...", path)
  17. plug, err := plugin.Load(path)
  18. if err != nil {
  19. return
  20. }
  21. // define session pointer
  22. if err = plug.Set("env", sess.Env.Data); err != nil {
  23. log.Error("Error while defining environment: %+v", err)
  24. return
  25. }
  26. // run onLoad if defined
  27. if plug.HasFunc("onLoad") {
  28. if _, err = plug.Call("onLoad"); err != nil {
  29. log.Error("Error while executing onLoad callback: %s", "\nTraceback:\n "+err.(*otto.Error).String())
  30. return
  31. }
  32. }
  33. s = &HttpProxyScript{
  34. Plugin: plug,
  35. doOnRequest: plug.HasFunc("onRequest"),
  36. doOnResponse: plug.HasFunc("onResponse"),
  37. doOnCommand: plug.HasFunc("onCommand"),
  38. }
  39. return
  40. }
  41. func (s *HttpProxyScript) OnRequest(original *http.Request) (jsreq *JSRequest, jsres *JSResponse) {
  42. if s.doOnRequest {
  43. jsreq := NewJSRequest(original)
  44. jsres := NewJSResponse(nil)
  45. if _, err := s.Call("onRequest", jsreq, jsres); err != nil {
  46. log.Error("%s", err)
  47. return nil, nil
  48. } else if jsreq.WasModified() {
  49. jsreq.UpdateHash()
  50. return jsreq, nil
  51. } else if jsres.WasModified() {
  52. jsres.UpdateHash()
  53. return nil, jsres
  54. }
  55. }
  56. return nil, nil
  57. }
  58. func (s *HttpProxyScript) OnResponse(res *http.Response) (jsreq *JSRequest, jsres *JSResponse) {
  59. if s.doOnResponse {
  60. jsreq := NewJSRequest(res.Request)
  61. jsres := NewJSResponse(res)
  62. if _, err := s.Call("onResponse", jsreq, jsres); err != nil {
  63. log.Error("%s", err)
  64. return nil, nil
  65. } else if jsres.WasModified() {
  66. jsres.UpdateHash()
  67. return nil, jsres
  68. }
  69. }
  70. return nil, nil
  71. }
  72. func (s *HttpProxyScript) OnCommand(cmd string) bool {
  73. if s.doOnCommand {
  74. if ret, err := s.Call("onCommand", cmd); err != nil {
  75. log.Error("Error while executing onCommand callback: %+v", err)
  76. return false
  77. } else if v, ok := ret.(bool); ok {
  78. return v
  79. }
  80. }
  81. return false
  82. }