If we are interested, let's say only in the HTTP traffic than the command line 'tshark' has only limited capabilities in a way to present us the data for review and investigation.
We can still play with the various options: '-Tfields' and multiple '-e' but still don't get the complete headers output.
The complete list that can be used with '-e' can be found here .
Alternatively we can experiment with the '-Tpdml' that will create alike XML file. But even with all this flexibility we still can't print a custom name header like in this curl request bellow:
curl -H "Rado: my_value" -v -o /tmp/page.html http://rtomaszewski.blogspot.com/2011/04/tshark-in-network-troubleshooting.html
To solve this little problem we have created a small program written in python. It takes the output from 'tshark -S -V' and parses it to present the data in a way we want.
Example how to use it:
# tshark -r /tmp/net.pcap -R http -V | parse.py -d # tshark -r /tmp/net.pcap -R http -V | parse.py # tshark -nn -s0 -i any -w /tmp/net.pcap -f tcp -R http -l -S -V | parse.py # tshark -nn -s0 -i any -w /tmp/net.pcap -f tcp -R http -l -S -V | parse.py -d
An example output from the 'parse.py' when running on the command line:
$ curl -H "Rado: my_value" -v -o /tmp/page.html http://rtomaszewski.blogspot.com/2011/04/tshark-in-network-troubleshooting.html * About to connect() to rtomaszewski.blogspot.com port 80 (#0) * Trying 209.85.229.132... connected * Connected to rtomaszewski.blogspot.com (209.85.229.132) port 80 (#0) > GET /2011/04/tshark-in-network-troubleshooting.html HTTP/1.1 > User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15 > Host: rtomaszewski.blogspot.com > Accept: */* > Rado: my_value > % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0< HTTP/1.1 200 OK < Content-Type: text/html; charset=UTF-8 < ETag: "b6d5837e-31bb-4473-95af-da3c1d466295" < X-Content-Type-Options: nosniff < X-XSS-Protection: 1; mode=block < Server: GSE < Age: 1202 < Date: Sun, 10 Apr 2011 19:14:00 GMT < Expires: Sun, 10 Apr 2011 19:14:00 GMT < Last-Modified: Sun, 10 Apr 2011 19:03:05 GMT < Cache-Control: public, must-revalidate, proxy-revalidate, max-age=0 < Transfer-Encoding: chunked < { [data not shown] 100 49993 0 49993 0 0 28925 0 --:--:-- 0:00:01 --:--:-- 57529* Connection #0 to host rtomaszewski.blogspot.com left intact * Closing connection #0
# tshark -nn -s0 -i wlan0 -w /tmp/net.pcap -R http -f tcp -S -V | ./parse.py Running as user "root" and group "root". This could be dangerous. Capturing on wlan0 Internet Protocol, Src: 192.168.43.111 (192.168.43.111), Dst: 209.85.229.132 (209.85.229.132) Transmission Control Protocol, Src Port: 38391 (38391), Dst Port: 80 (80), Seq: 1, Ack: 1, Len: 226 [Stream index: 1] GET /2011/04/tshark-in-network-troubleshooting.html HTTP/1.1\r\n User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15\r\n Host: rtomaszewski.blogspot.com\r\n Accept: */*\r\n Rado: my_value\r\n Internet Protocol, Src: 209.85.229.132 (209.85.229.132), Dst: 192.168.43.111 (192.168.43.111) Transmission Control Protocol, Src Port: 80 (80), Dst Port: 38391 (38391), Seq: 49070, Ack: 227, Len: 1375 [Stream index: 1] HTTP/1.1 200 OK\r\n Content-Type: text/html; charset=UTF-8\r\n ETag: "b6d5837e-31bb-4473-95af-da3c1d466295"\r\n X-Content-Type-Options: nosniff\r\n X-XSS-Protection: 1; mode=block\r\n Server: GSE\r\n Age: 1202\r\n Date: Sun, 10 Apr 2011 19:14:00 GMT\r\n Expires: Sun, 10 Apr 2011 19:14:00 GMT\r\n Last-Modified: Sun, 10 Apr 2011 19:03:05 GMT\r\n Cache-Control: public, must-revalidate, proxy-revalidate, max-age=0\r\n Transfer-Encoding: chunked\r\n 2 packets capturedThe program can be downloaded form here: parse.py Additionally the source code of this short tool can be seen here:
#!/usr/bin/python # ## tested on python 2.6.5 # # author : radoslaw tomaszewski import sys import re import inspect class ParseTsharkOut: no=0 debugYes=0 ipRe=None tcpRe=None protRe=None ipInfo=[] tcpInfo=[] protInfo=[] auxStart=0 tcpAuxStart=0 protAux=1 def __init__(self): self.ipRe="Internet Protocol,(.*)$" self.tcpRe=["Transmission Control Protocol,(.*)$", " (\[Stream index:.*)$"] self.protRe=["Hypertext Transfer Protocol", " ([^\[ ].*)$", "^$| *(\\\\r|\\\\n)"] def debug(self, s): if self.debugYes : parent=inspect.stack()[1][3] #parent=inspect.stack() print("debug:[" + str(parent) + "] " + s.rstrip()) def usage(self): print("todo") def ipParse(self,s): self.debug(s) tmp=re.match(self.ipRe, s) # tmp=re.match("..", s) if tmp is None : return 0 else: self.ipInfo.append(tmp.group(0)) return 1 def tcpParse(self,s): self.debug(s) ret=0 tmp=re.match(self.tcpRe[self.tcpAuxStart], s) if tmp is None : return 0 else: self.tcpInfo.append(tmp.group(0)) ret=self.tcpAuxStart self.tcpAuxStart=(self.tcpAuxStart + 1 ) % 2 return ret def protParse(self,s): self.debug(s) if ( self.protAux ) : if re.match(self.protRe[0], s): self.protAux=0 return 0 else : if re.match(self.protRe[2], s): self.protAux=1 self.show() return 1 tmp=re.match(self.protRe[1], s) if tmp is None : return 0 else: self.protInfo.append(tmp.group(0)) return 0 def parse(self, s): funcs=[self.ipParse, self.tcpParse, self.protParse] if funcs[self.auxStart](s): self.auxStart= ( self.auxStart + 1 ) % 3 def show(self): self.debug("start") for i in self.ipInfo: print(i) for i in self.tcpInfo: print(i) for i in self.protInfo: print(i) print("") self.ipInfo=[] self.tcpInfo=[] self.protInfo=[] def main(self): try: if sys.argv[1] == '-d': self.debugYes=1 self.debug("debuging is turn on") except (IndexError): None self.debug("main start") for l in sys.stdin: self.parse(l) return 0 if __name__ == "__main__": sys.exit(ParseTsharkOut().main())
aaa
No comments:
Post a Comment