2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Wat is de makkelijkste manier om TCP verkeer data te sniffen op Linux?

Ik wil een eenvoudige manier om alle TCP data te tonen (niet de TCP headers of iets anders) die over een interface op mijn Linux box gaan.

Bijvoorbeeld, ik wil een magisch commando dat als ik doe:

magic_commmand_I_want port=1234

dan als er een server luisterde op poort 1234 op mijn machine, en iemand deed:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Dan zou het magische commando gewoon uitprinten:

hello

Ik heb “tcpdump”, “ethereal”, “tethereal”, “tshark”, en anderen geprobeerd, maar het is niet duidelijk hoe je ze zover krijgt dat ze:

  • geen IP-adressen of andere metadata laat zien
  • alleen de “data” laat zien die verzonden wordt, niet individuele pakketten en hun headers
  • de data afdrukt zoals ze zijn, niet in hex, en niet met packet-offset markers
  • alle netwerkverkeer snuffelt (of het nu op eth0 of eth1 of lo is, enz. …)

Ja, je zou waarschijnlijk een reeks unix commando’s aan elkaar kunnen rijgen om dit te doen, maar dat is niet erg gemakkelijk om te onthouden voor de volgende keer :)

Als je een eenvoudig voorbeeld hebt van een exacte command-line die dit doet, dan zou ik dat graag willen.

Antwoorden (7)

109
109
109
2009-08-14 17:05:54 +0000

Update:

Zoals opgemerkt door Michal in de commentaren: Vanaf tcpflow versie 1.3 wordt de -e optie gebruikt om de scannernaam op te geven. Dus de fout “Ongeldige scannernaam ‘8983’” wordt afgedrukt. Het juiste commando is

sudo tcpflow -i any -C -J port 1234

(ook -J is veranderd in -g in de laatste versie)

  • *

Met dank aan yves die me wees op tcpflow “. Hier is de commandoregel:

tcpflow -i any -C -e port 1234 # as root, or with sudo

Dit doet alles wat ik wil

  • toont de data byte-voor-byte zoals het binnenkomt
  • toont geen andere metadata
  • luistert op alle interfaces (dus het vangt data op die van binnen en buiten de machine komt)

De ”-C“ vertelt het te dumpen naar de console in plaats van een bestand. De ”-e“ zet kleuren aan zodat client- server en server- client visueel te onderscheiden zijn.

Ik installeerde tcpflow door eenvoudig

sudo apt-get install tcpflow
``` te doen.
30
30
30
2009-08-13 22:48:27 +0000

socat is het gereedschap waar je naar vraagt. Het kan fungeren als een proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

dan moet je applicatie verbinding maken met poort 4444 in plaats van rechtstreeks met 1234

-v optie is voor socat om alles wat het ontvangt af te drukken op de standaard fout (stderr).

Update:

Als socat niet beschikbaar is op je machine, kun je het nog steeds emuleren op die manier met netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

caveats: deze optie is unidirectioneel. de tweede netcat instantie zal elk antwoord van je server afdrukken naar de standaard output. U kunt dan nog steeds doen:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Probeer Wireshark . Het is een uitstekende protocol-analyser voor zowel Linux als Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow is wat je wilt. Uittreksel uit de man page:

BESCHRIJVING tcpflow is een programma dat gegevens vastlegt die worden verzonden als onderdeel van TCP-verbindingen (flows), en de gegevens opslaat op een manier die handig is voor protocolanalyse of debugging. Een programma als tcpdump(4) toont een samenvatting van pakketten die op de draad worden gezien, maar slaat gewoonlijk niet de gegevens op die werkelijk worden verzonden. Daarentegen reconstrueert tcpflow de eigenlijke gegevensstromen en slaat elke stroom op in een afzonderlijk bestand voor latere analyse. tcpflow begrijpt TCP sequentienummers en zal gegevensstromen correct reconstrueren, ongeacht hertransmissies of levering buiten de volgorde.

tcpflow slaat alle vastgelegde gegevens op in bestanden met namen van de vorm

192.168.101.102.02345-010.011.012.013.45103

waarbij de inhoud van bovenstaand bestand gegevens zou zijn die verzonden zijn van host 192.168.101.102 poort 2345, naar host 10.11.12.13 poort 45103.

Zet een verbinding op van je applicatie app naar je server. Als de verbinding in werking is, is tcpflow nog steeds in staat om er gegevens van op te vangen Bijvoorbeeld:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Alle gegevens worden opgeslagen in een bestand met de naam 127.000.000.001.48842-127.000.000.001.05555.

U kunt dit nog steeds omleiden op de standaard output met de optie -Cs . Lees de manual pagina om te spelen met expressie om de paquets die je wilt vangen met tcpflow af te stemmen.

2
2
2
2009-08-13 23:15:48 +0000

ngrep is hier heel geschikt voor. Het neemt een BPF string en een optionele string om naar te zoeken binnen de pakketten, en dumpt dan de pakketinhoud naar het scherm in een behoorlijk bruikbaar formaat. Het dumpt optioneel ook naar een pcapdump bestand dat u later in Wireshark nader kunt bekijken.

0
0
0
2009-08-13 23:08:00 +0000

Kijk eens naar Chaosreader . Hoewel het een beetje meer doet dan je vraagt en een beetje anders, zou je de code ervan waarschijnlijk kunnen aanpassen om te doen wat je wilt.

-1
-1
-1
2009-08-13 22:47:31 +0000

Misschien kun je een wrapper schrijven voor tcpdump, bijvoorbeeld, die alle overbodige informatie verwijdert