Sniffer::HTTP

Max Maischein

Frankfurt.pm

Was ist Sniffer::HTTP ?

Geschrieben von Max Maischein

HTTP-Transfers einfach mitschneiden

 1:  use warnings;
 2:  use strict;
 1:  use Sniffer::HTTP;
 1:  my $sniffer = Sniffer::HTTP->new(
 2:    request  => sub { my ($req,$conn) = @_; 
 3:                          print $req->uri,"\n" if $req },
 4:    response => sub { my ($res,$req,$conn) = @_; 
 5:                      print $res->code,"\n" },
 6:  );
 7:  $sniffer->run();

Warum?

  • Fehlersuche in Web Applikationen

  • Downloaden von Inhalten

  • FireFox hat die "Live HTTP Headers" Erweiterung, die im Prinzip das selbe liefert, aber halt nicht in Perl.

  • HTTP::Proxy ist im Prinzip genau das selbe, funktioniert aber unbequem, während man entwickelt - man kann nicht browsen, wenn der Proxy abstürzt.

Struktur von HTTP::Proxy

 1:                                    Internet
 2:                                       ||
 3:  +-------------------------------+    ||
 4:  | Rechner                       |    ||
 5:  |                               |    ||
 6:  |                               |    ||            +-Server-----+
 7:  | +-Browser--+   +-----------+  |    ||  Anfrage   |            |
 8:  | |          |---|           | -|--> || ---------> |            |
 9:  | |          |   |HTTP::Proxy|  |    ||            |            |
10:  | |          |<--|           | -|<-- || <--------- |            |
11:  | +----------+   +-----------+  |    ||  Antwort   +------------+
12:  +-------------------------------+    ||

Struktur von Net::Pcap

 1:                                    Internet
 2:                                       ||
 3:  +-------------------------------+    ||
 4:  | Rechner                       |    ||
 5:  |                  libpcap      |    ||
 6:  |                    ^  ^       |    ||            +-Server-----+
 7:  | +-Browser--+       |  |       |    ||  Anfrage   |            |
 8:  | |          |-------+--|-----> |--> || ---------> |            |
 9:  | |          |          |       |    ||            |            |
10:  | |          |<---------+------ |<-- || <--------- |            |
11:  | +----------+                  |    ||  Antwort   +------------+
12:  +-------------------------------+    ||

Struktur (in Perl)

  • HTTP::Proxy ist schwerfällig

  • Net::Pcap liefert die Ethernet-Pakete

  • Sniffer::HTTP kombiniert Net::Pcap und LWP

  • LWP hat HTTP::Request und HTTP::Response

  • $req->as_string

Synopsis (nochmal)

 1:  use warnings;
 2:  use strict;
 1:  use Sniffer::HTTP;
 1:  my $sniffer = Sniffer::HTTP->new(
 2:    request  => sub { my ($req,$conn) = @_;
 3:                      print $req->uri,"\n" if $req },
 4:    response => sub { my ($res,$req,$conn) = @_;
 5:                      print $res->code,"\n" },
 6:  );
 7:  $sniffer->run();

Wofür ist das praktisch?

  • Man kann alle Verbindungen des eigenen Browsers überwachen.

  • Man kann die Daten mitschneiden, ohne daß das laufende Programm angehalten werden muß (Flash!)

  • Testen bzw. Mitschneiden von Server-Antworten

Beispielsitzung

Starten:

 1:  C:\Projekte\Sniffer-HTTP>perl bin\live-http-headers.pl

Request für http://frankfurt.pm.org/

 1:  >>>
 2:  GET http://frankfurt.pm.org/ HTTP/1.1
 3:  Connection: keep-alive
 4:  ...
 5:  Host: frankfurt.pm.org
 6:  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7
 7:  Keep-Alive: 300

Beispielsitzung

Antwort: Redirect

 1:  <<<
 2:  Connection: Keep-Alive
 3:  Date: Mon, 07 Nov 2005 19:44:17 GMT
 4:  Location: http://frankfurt.perlmongers.de/
 5:  Server: Apache/2.0
 6:  Content-Length: 216
 7:  Content-Type: text/html; charset=iso-8859-1
 8:  Keep-Alive: timeout=15, max=100

Live Demo

...

Beispielsitzung

Request für <http://frankfurt.perlmongers.de/>

 1:  >>>
 2:  GET http://frankfurt.perlmongers.de/ HTTP/1.1
 3:  Connection: keep-alive
 4:  ...
 5:  Host: frankfurt.perlmongers.de
 6:  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7
 7:  Cookie: prefs=
 8:  Keep-Alive: 300

Beispielsitzung

Antwort: Website

 1:  <<<
 2:  Connection: Keep-Alive
 3:  Date: Mon, 07 Nov 2005 19:44:18 GMT
 4:  Transfer-Encoding: chunked
 5:  Server: Apache/1.3.33 (Unix)
 6:  Content-Type: text/html; charset=ISO-8859-1
 7:  Keep-Alive: timeout=2, max=200
 8:  Set-Cookie: prefs=; path=/; expires=Sat, 06-Nov-2010 19:44:18 GMT

Wofür sollte man Sniffer::HTTP nicht verwenden?

  • Am Arbeitsplatz

  • Kriminelle Aktivitäten

  • Testen von Programm-Antworten (wg. Zeitstempel etc.)

  • Testen von "echter" User-Interaktion (HTTP::Recorder ist da besser, basiert aber auf HTTP::Proxy)

Voraussetzungen

  • Sniffer::HTTP basiert auf Net::Pcap, und kann daher live-Mitschnitte von der Netzwerkkarte lesen.

  • Es geht aber auch das Auslesen von Dateien.

  • Sehr praktisch für das Testen von Server-Code gegen fest definierte Clients, aber anfällig gegen Veränderung des Protokolls bzw. Test- Szenarios.

Hilfreiche Dinge:

  • HTTP::Recorder

  • HTTP::Request::FromTemplate

  • Live HTTP Headers (FireFox)

  • Ethereal

Danke

Fragen ?