From c5e10c274be457e148f3e7e0c346fd1815a2a355 Mon Sep 17 00:00:00 2001 From: zhengbaoyang Date: Mon, 8 Aug 2016 10:21:27 +0800 Subject: [PATCH 1/4] develog --- dump.go | 33 ++++++++++++++++++++++++++------- mitm.go | 29 ++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/dump.go b/dump.go index 5629329..4a458f0 100644 --- a/dump.go +++ b/dump.go @@ -12,7 +12,7 @@ import ( "strconv" ) -func httpDump(req *http.Request, resp *http.Response) { +func httpDump(reqDump []byte, resp *http.Response) { defer resp.Body.Close() var respStatusStr string respStatus := resp.StatusCode @@ -27,19 +27,33 @@ func httpDump(req *http.Request, resp *http.Response) { case 5: respStatusStr = Red("<--" + strconv.Itoa(respStatus)) } - fmt.Println(Green("Request:")) - fmt.Printf("%s %s %s\n", Blue(req.Method), req.RequestURI, respStatusStr) + fmt.Println(Green("Request:"), respStatusStr) + ParseReq(reqDump) + /*req, _ := ParseReq(reqDump) + for k, v := range req { + fmt.Println(k, ":::::", v) + }*/ + /*fmt.Printf("%s %s %s\n", Blue(req.Method), req.RequestURI, respStatusStr) for headerName, headerContext := range req.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) - } - if req.Method == "POST" { + }*/ + /*if req.Method == "POST" { fmt.Println(Green("URLEncoded form")) - for k, v := range req.Form { + err := req.ParseForm() + if err != nil { + logger.Println("parseForm error:", err) + } else { + for k, v := range req.Form { + fmt.Printf("%s: %s\n", Blue(k), v) + } + } + values, _ := ParsePostValues(reqDump) + for k, v := range values { fmt.Printf("%s: %s\n", Blue(k), v) } - } + }*/ fmt.Println(Green("Response:")) for headerName, headerContext := range resp.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) @@ -77,3 +91,8 @@ func httpDump(req *http.Request, resp *http.Response) { fmt.Printf("%s%s%s\n", Black("####################"), Cyan("END"), Black("####################")) } + +func ParseReq(b []byte) error { + str := string(b) + +} diff --git a/mitm.go b/mitm.go index edcb998..4817d3a 100644 --- a/mitm.go +++ b/mitm.go @@ -102,6 +102,10 @@ func (hw *HandlerWrapper) DumpHTTPAndHTTPs(resp http.ResponseWriter, req *http.R req.Header.Set("Connection", "Keep-Alive") // handle connection + reqDump, err := httputil.DumpRequest(req, true) + if err != nil { + logger.Println("DumpRequest error ", err) + } connIn, _, err := resp.(http.Hijacker).Hijack() if err != nil { logger.Println("hijack error:", err) @@ -173,17 +177,13 @@ func (hw *HandlerWrapper) DumpHTTPAndHTTPs(resp http.ResponseWriter, req *http.R } if *hw.MyConfig.Monitor { - go httpDump(req, respOut) + go httpDump(reqDump, respOut) } } func (hw *HandlerWrapper) ServeHTTP(resp http.ResponseWriter, req *http.Request) { - err := req.ParseForm() - if err != nil { - logger.Println("parseForm error:", err) - } raddr := *hw.MyConfig.Raddr if len(raddr) != 0 { hw.Forward(resp, req, raddr) @@ -344,3 +344,22 @@ func connectProxyServer(conn net.Conn, addr string) error { } return nil } + +/*func ReadNotDrain(r *http.Request) (content []byte, err error) { + content, err = ioutil.ReadAll(r.Body) + r.Body = io.ReadCloser(bytes.NewBuffer(content)) + return +} + +func ParsePostValues(req *http.Request) (url.Values, error) { + c, err := ReadNotDrain(req) + if err != nil { + return nil, err + } + values, err := url.ParseQuery(string(c)) + if err != nil { + return nil, err + } + return values, nil +} +*/ From a990253ee4b464fe7d72208f1823db61bf2bd944 Mon Sep 17 00:00:00 2001 From: zhengbaoyang Date: Tue, 23 Aug 2016 18:30:13 +0800 Subject: [PATCH 2/4] try catch post --- dump.go | 59 ++++++++++++++++++++++++++++++-------------------- gomitmproxy.go | 4 ++++ 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/dump.go b/dump.go index 4a458f0..b7f5cee 100644 --- a/dump.go +++ b/dump.go @@ -6,6 +6,7 @@ import ( "compress/flate" "compress/gzip" "fmt" + "io" "io/ioutil" "math" "net/http" @@ -28,32 +29,38 @@ func httpDump(reqDump []byte, resp *http.Response) { respStatusStr = Red("<--" + strconv.Itoa(respStatus)) } fmt.Println(Green("Request:"), respStatusStr) - ParseReq(reqDump) - /*req, _ := ParseReq(reqDump) - for k, v := range req { - fmt.Println(k, ":::::", v) - }*/ - /*fmt.Printf("%s %s %s\n", Blue(req.Method), req.RequestURI, respStatusStr) + req, _ := ParseReq(reqDump) + // for k, v := range req { + // fmt.Println(k, ":::::", v) + // } + fmt.Printf("%s %s %s\n", Blue(req.Method), req.RequestURI, respStatusStr) for headerName, headerContext := range req.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) - }*/ - /*if req.Method == "POST" { - fmt.Println(Green("URLEncoded form")) + } - err := req.ParseForm() + fmt.Printf("req:---->%#v\n", req) + if req.Method == "POST" { + fmt.Println(Green("URLEncoded form")) + fmt.Println(reqDump) + body, err := ioutil.ReadAll(req.Body) if err != nil { - logger.Println("parseForm error:", err) - } else { - for k, v := range req.Form { - fmt.Printf("%s: %s\n", Blue(k), v) - } - } - values, _ := ParsePostValues(reqDump) - for k, v := range values { - fmt.Printf("%s: %s\n", Blue(k), v) + fmt.Println("readall ", err) } + fmt.Println(string(body)) + // err := req.ParseForm() + // if err != nil { + // logger.Println("parseForm error:", err) + // } else { + // for k, v := range req.Form { + // fmt.Printf("%s: %s\n", Blue(k), v) + // } + // } + // values, _ := ParsePostValues(reqDump) + // for k, v := range values { + // fmt.Printf("%s: %s\n", Blue(k), v) + // } - }*/ + } fmt.Println(Green("Response:")) for headerName, headerContext := range resp.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) @@ -92,7 +99,13 @@ func httpDump(reqDump []byte, resp *http.Response) { fmt.Printf("%s%s%s\n", Black("####################"), Cyan("END"), Black("####################")) } -func ParseReq(b []byte) error { - str := string(b) - +func ParseReq(b []byte) (*http.Request, error) { + // func ReadRequest(b *bufio.Reader) (req *Request, err error) { return readRequest(b, deleteHostHeader) } + fmt.Println(string(b)) + fmt.Println("-----------------------") + var buf io.ReadWriter + buf = new(bytes.Buffer) + buf.Write(b) + bufr := bufio.NewReader(buf) + return http.ReadRequest(bufr) } diff --git a/gomitmproxy.go b/gomitmproxy.go index c358b15..7641918 100644 --- a/gomitmproxy.go +++ b/gomitmproxy.go @@ -31,8 +31,12 @@ func main() { conf.Log = flag.String("log", "./error.log", "log file path") conf.Monitor = flag.Bool("m", false, "monitor mode") conf.Tls = flag.Bool("tls", false, "tls connect") + help := flag.Bool("h", false, "help") flag.Parse() + if *help { + flag.PrintDefaults() + } var err error logFile, err = os.Create(*conf.Log) if err != nil { From baf79e0b3fb09353dea7c07c4c4f2ea0fc3dabc4 Mon Sep 17 00:00:00 2001 From: zhengbaoyang Date: Tue, 23 Aug 2016 19:37:11 +0800 Subject: [PATCH 3/4] =?UTF-8?q?http=20post=E8=AF=B7=E6=B1=82=E7=9A=84?= =?UTF-8?q?=E6=8A=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dump.go | 31 ++++++++----------------------- mitm.go | 11 ++++++++++- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/dump.go b/dump.go index b7f5cee..da5c07f 100644 --- a/dump.go +++ b/dump.go @@ -30,36 +30,21 @@ func httpDump(reqDump []byte, resp *http.Response) { } fmt.Println(Green("Request:"), respStatusStr) req, _ := ParseReq(reqDump) - // for k, v := range req { - // fmt.Println(k, ":::::", v) - // } - fmt.Printf("%s %s %s\n", Blue(req.Method), req.RequestURI, respStatusStr) + fmt.Printf("%s %s %s\n", Blue(req.Method), req.Host+req.RequestURI, respStatusStr) for headerName, headerContext := range req.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) } - fmt.Printf("req:---->%#v\n", req) if req.Method == "POST" { - fmt.Println(Green("URLEncoded form")) - fmt.Println(reqDump) - body, err := ioutil.ReadAll(req.Body) + fmt.Println(Green("POST Param:")) + err := req.ParseForm() if err != nil { - fmt.Println("readall ", err) + logger.Println("parseForm error:", err) + } else { + for k, v := range req.Form { + fmt.Printf("\t%s: %s\n", Blue(k), v) + } } - fmt.Println(string(body)) - // err := req.ParseForm() - // if err != nil { - // logger.Println("parseForm error:", err) - // } else { - // for k, v := range req.Form { - // fmt.Printf("%s: %s\n", Blue(k), v) - // } - // } - // values, _ := ParsePostValues(reqDump) - // for k, v := range values { - // fmt.Printf("%s: %s\n", Blue(k), v) - // } - } fmt.Println(Green("Response:")) for headerName, headerContext := range resp.Header { diff --git a/mitm.go b/mitm.go index 4817d3a..bbd8337 100644 --- a/mitm.go +++ b/mitm.go @@ -101,8 +101,14 @@ func (hw *HandlerWrapper) DumpHTTPAndHTTPs(resp http.ResponseWriter, req *http.R req.Header.Del("Proxy-Connection") req.Header.Set("Connection", "Keep-Alive") + var reqDump []byte + var err error + ch := make(chan bool) // handle connection - reqDump, err := httputil.DumpRequest(req, true) + go func() { + reqDump, err = httputil.DumpRequestOut(req, true) + ch <- true + }() if err != nil { logger.Println("DumpRequest error ", err) } @@ -177,7 +183,10 @@ func (hw *HandlerWrapper) DumpHTTPAndHTTPs(resp http.ResponseWriter, req *http.R } if *hw.MyConfig.Monitor { + <-ch go httpDump(reqDump, respOut) + } else { + <-ch } } From 44b8b2480ca29bd223f77817ce25200426b1c39c Mon Sep 17 00:00:00 2001 From: zhengbaoyang Date: Tue, 23 Aug 2016 19:43:24 +0800 Subject: [PATCH 4/4] removeaddr --- dump.go | 1 + 1 file changed, 1 insertion(+) diff --git a/dump.go b/dump.go index da5c07f..b1045f0 100644 --- a/dump.go +++ b/dump.go @@ -31,6 +31,7 @@ func httpDump(reqDump []byte, resp *http.Response) { fmt.Println(Green("Request:"), respStatusStr) req, _ := ParseReq(reqDump) fmt.Printf("%s %s %s\n", Blue(req.Method), req.Host+req.RequestURI, respStatusStr) + fmt.Printf("%s %s\n", Blue("RemoteAddr:"), req.RemoteAddr) for headerName, headerContext := range req.Header { fmt.Printf("%s: %s\n", Blue(headerName), headerContext) }