<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pcap on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Pcap on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Sun, 10 Jan 2010 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/pcap/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Follow HTTP Stream (with decompression)</title>
      <link>https://blog.bramp.net/post/2010/01/10/follow-http-stream-with-decompression/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/01/10/follow-http-stream-with-decompression/</guid>
      <description><p>I was using <a href="http://www.wireshark.org/">Wireshark</a> to capture an exchange of HTTP packets, however, some of the HTTP responses were using “content-encoding: gzip”, which meant I couldn’t view them decompressed in the “Follow TCP Stream”. Wireshark does decompress them in Packet Details view, but it is hard to follow the full stream like this.</p>
<p>The solution was to write some <a href="http://www.python.org/">Python</a> which made use of the <a href="http://code.google.com/p/dpkt/">dpkt library</a>. My code naively reassembles the TCP flow and then assumes traffic on port 80 is HTTP. Therefore there is much room for improvement, but here is the code anyway.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Turns a pcap file with http gzip compressed data into plain text, making it</span>
</span></span><span class="line"><span class="cl"><span class="c1"># easier to follow.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">dpkt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">tcp_flags</span><span class="p">(</span><span class="n">flags</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">ret</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_FIN</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;F&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_SYN</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;S&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_RST</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;R&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_PUSH</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;P&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_ACK</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;A&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_URG</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;U&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_ECE</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;E&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">tcp</span><span class="o">.</span><span class="n">TH_CWR</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">+</span> <span class="s1">&#39;C&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">ret</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_http_stream</span><span class="p">(</span><span class="n">stream</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">stream</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;HTTP&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Response</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span><span class="o">.</span><span class="n">status</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span><span class="o">.</span><span class="n">method</span><span class="p">,</span> <span class="n">http</span><span class="o">.</span><span class="n">uri</span>
</span></span><span class="line"><span class="cl">		<span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">http</span><span class="p">):]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_pcap_file</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="c1"># Open the pcap file</span>
</span></span><span class="line"><span class="cl">	<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;market.pcap&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">pcap</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">pcap</span><span class="o">.</span><span class="n">Reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c1"># I need to reassmble the TCP flows before decoding the HTTP</span>
</span></span><span class="line"><span class="cl">	<span class="n">conn</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span> <span class="c1"># Connections with current buffer</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">ts</span><span class="p">,</span> <span class="n">buf</span> <span class="ow">in</span> <span class="n">pcap</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">eth</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ethernet</span><span class="o">.</span><span class="n">Ethernet</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">eth</span><span class="o">.</span><span class="n">type</span> <span class="o">!=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ethernet</span><span class="o">.</span><span class="n">ETH_TYPE_IP</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">continue</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">ip</span> <span class="o">=</span> <span class="n">eth</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">ip</span><span class="o">.</span><span class="n">p</span> <span class="o">!=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">ip</span><span class="o">.</span><span class="n">IP_PROTO_TCP</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">continue</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">tcp</span> <span class="o">=</span> <span class="n">ip</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="n">tupl</span> <span class="o">=</span> <span class="p">(</span><span class="n">ip</span><span class="o">.</span><span class="n">src</span><span class="p">,</span> <span class="n">ip</span><span class="o">.</span><span class="n">dst</span><span class="p">,</span> <span class="n">tcp</span><span class="o">.</span><span class="n">sport</span><span class="p">,</span> <span class="n">tcp</span><span class="o">.</span><span class="n">dport</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="c1">#print tupl, tcp_flags(tcp.flags)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># Ensure these are in order! TODO change to a defaultdict</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">tupl</span> <span class="ow">in</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">+</span> <span class="n">tcp</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">tcp</span><span class="o">.</span><span class="n">data</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># TODO Check if it is a FIN, if so end the connection</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c1"># Try and parse what we have</span>
</span></span><span class="line"><span class="cl">		<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">stream</span> <span class="o">=</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="n">stream</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;HTTP&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Response</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="c1">#print http.status</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">http</span> <span class="o">=</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="c1">#print http.method, http.uri</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">http</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="c1"># If we reached this part an exception hasn&#39;t been thrown</span>
</span></span><span class="line"><span class="cl">			<span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">http</span><span class="p">):]</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">del</span> <span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">conn</span><span class="p">[</span> <span class="n">tupl</span> <span class="p">]</span> <span class="o">=</span> <span class="n">stream</span>
</span></span><span class="line"><span class="cl">		<span class="k">except</span> <span class="n">dpkt</span><span class="o">.</span><span class="n">UnpackError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">pass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="o">=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span> <span class="s2">&#34;</span><span class="si">%s</span><span class="s2"> &amp;lt;pcap filename&amp;gt;&#34;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">parse_pcap_file</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span></code></pre></div><p><strong>Please note</strong>, I had to make a couple of changes to the dpkt library, which I have submitted <a href="http://groups.google.com/group/dpkt/browse_thread/thread/5315199f9749b91a">back for review</a>. Those changes can be found in the following patches <a href="/patches/dpkt-pcap-snaplen.patch">1</a> <a href="/patches/dpkt-http-len.patch">2</a> <a href="/patches/dpkt-http-gz.patch">3</a>. I will update this code if/when the patches get accepted.</p>
</description>
    </item>
    
  </channel>
</rss>
