Memantau lalu lintas HTTP menggunakan tcpdump

42

Untuk memantau lalu lintas HTTP antara server dan server web, saya saat ini menggunakan tcpdump. Ini berfungsi dengan baik, tapi saya ingin menyingkirkan beberapa data yang berlebihan dalam output (saya tahu tentang tcpflowdan wireshark, tetapi mereka tidak tersedia di lingkungan saya).

Dari tcpdumphalaman manual:

Untuk mencetak semua paket HTTP IPv4 ke dan dari port 80, yaitu hanya mencetak paket yang berisi data, tidak, misalnya, paket SYN dan FIN dan paket ACK saja.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Perintah ini

sudo tcpdump -A 'src example.com dan tcp port 80 dan (((ip [2: 2] - ((ip [0] & 0xf) << 2)) - ((tcp [12] & 0xf0) >> 2) )! = 0) '

menyediakan output berikut:

19: 44: 03.529413 IP 192.0.32.10.http> 10.0.1.6.52369: Bendera [P.], seq 918827135: 918827862, ack 351213824, win 4316, opsi [nop, nop, TS val 4093273405 ecr 869959372], panjang 727

E ..... @ ....... .... P..6.0 ......... D ...... __ .. e = 3 ...__ HTTP / 1.1 200 OK Server: Apache / 2.2.3 (Red Hat) Tipe-Konten: teks / html; charset = UTF-8 Tanggal: Sab, 14 Nov 2009 18:35:22 GMT Umur: 7149
Panjang Konten: 438

<HTML> <HEAD> <TITLE> Contoh Halaman Web </TITLE> </HEAD> <body>
<p> Anda telah mencapai halaman web ini ... </p> </BODY> </HTML>

Ini hampir sempurna, kecuali untuk bagian yang disorot. Apa ini, akhirnya - yang lebih penting - bagaimana saya menyingkirkannya? Mungkin itu hanya sedikit perubahan pada ekspresi di akhir perintah?

otto.poellath
sumber

Jawaban:

39

tcpdump mencetak paket lengkap. "Sampah" yang Anda lihat sebenarnya adalah header paket TCP.

Anda tentu dapat memijat output dengan skrip perl, tetapi mengapa tidak menggunakan tshark, versi tekstual wireshark saja?

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

dibutuhkan argumen yang sama dengan tcpdump (library yang sama) tetapi karena ini merupakan alat analisa, ia dapat melakukan pemeriksaan paket yang mendalam sehingga Anda dapat memperbaiki filter Anda lebih banyak lagi, yaitu

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'

Aleksandar Ivanisevic
sumber
1
Terima kasih - setelah mencoba semua saran, tshark sepertinya alat terbaik untuk pekerjaan itu. Saat ini saya menggunakan "tshark -d tcp.port == 8070, http -R 'http.request atau http.response'". Sekarang seandainya saya bisa mendapatkan tshark untuk "mengikuti aliran tcp" seperti wireshark (Ini banyak ditanyakan, tetapi saya masih belum menemukan jawabannya). "-V" menampilkan info tentang paket TCP dan IP dan sebagainya, yang saya tidak tertarik. Tapi saya rasa saya bisa menghapusnya menggunakan skrip.
otto.poellath
4
Anda juga dapat mencari "GET" dalam filter menangkap dengan mencocokkan nilai-nilai ASCII untuk setiap karakter: tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420. Saya menambahkan sebuah halaman ke situs web Wireshark beberapa waktu lalu yang membantu Anda membuat filter penangkap string yang cocok: wireshark.org/tools/string-cf.html
Gerald Combs
18

Lihatlah ngrep - mungkin ada gunanya bagi Anda.

sebagai referensi untuk orang lain httpry [server tampaknya turun sekarang tapi saya harap ini sementara] dan tshark juga berguna untuk analisis protokol pasif - pertama hanya untuk http, kedua - untuk lebih banyak lagi.

pQd
sumber
2
+1 untuk ngrep. Alat yang sangat berguna.
tylerl
ngrep dan httpry terlihat sangat berguna, tetapi ngrep tidak mengetahui HTTP dan AFAIK, httpry hanya berfungsi dengan header HTTP dan tidak dapat menampilkan data payload.
otto.poellath
@sapporo - yakin - ngrep adalah protokol agnostik, tetapi Anda dapat menambahkan filter pcap "port 80" dan mendapatkan .. dalam lalu lintas http [kebanyakan kasus] saja.
pQd
Imo, ngrep 100000x lebih baik daripada tcpdump
Daniel W.
5

Coba httpry atau justniffer

Justniffer bekerja dengan baik pada paket tcp yang menyusun ulang retrasmisi dan fragmentasi ip

Mole24
sumber
1
Terima kasih! justniffer adalah apa yang saya cari (saya pikir itu satu-satunya alat yang disebutkan yang sangat sederhana dan mengukur durasi permintaan).
gkop
1

Saya akan menyarankan menggunakan tcpdump command line dumbed yang menyimpan semuanya dalam file pcap untuk proses posting. Bergantung pada apa yang sebenarnya Anda cari dalam mendiagnosis tcpflow, sangat bagus untuk menyatukan kembali komunikasi dalam cara yang koheren untuk analisis.

Beberapa informasi bagus lainnya termasuk beberapa penggunaan untuk httpry dapat ditemukan di: http://taosecurity.blogspot.com/2008/06/logging-web-traffic-with-httpry.html

ScottZ
sumber
0

Apakah server web yang Anda gunakan tidak menghasilkan log? Tentunya itu akan menjadi cara yang jauh lebih baik untuk memantau lalu lintas HTTP, ada banyak alat untuk menganalisis data dan server web mana pun yang kompeten harus menghasilkan log yang andal.

James Hannah
sumber
4
Jelas. Saya membayangkan dia sudah memikirkan itu. Kadang-kadang berguna untuk memantau data aktual yang dikirim antara titik A dan titik B.
tylerl
0

Ada beberapa alat yang tersedia di pasaran yang dirancang khusus untuk memantau HTTP Traffic. Fiddler2 ( http://www.fiddler2.org ) dan HTTP Debugger Pro adalah contoh dari alat tersebut.


sumber
4
Terima kasih atas saran Anda. Sayangnya, kedua alat tersebut tampaknya hanya berfungsi pada Windows. Saya tidak menyebutkannya, tetapi saya mencari sesuatu yang bekerja di Linux.
otto.poellath