tcpdumpを使用していくつかのダンプを保存しました。
tcpdump -n -i eth0 -tttt -Q in > "dump01.dump"
だから私は次のような結果を得ます:
20:39:12.808672 IP 94.xx.xxx.202.49183 > 151.xx.xx.xx.61479: UDP, length 104
20:39:12.835025 IP 213.xx.xx.25.51197 > 151.xx.xx.xx.61479: Flags [P.], seq 4125053309:4125053343, ack 1004545214, win 194, length 34
20:39:12.936971 IP 222.xxx.xxx.182.59953 > 151.xx.xx.xx.61479: UDP, length 287
20:39:12.948822 IP 195.xx.xxx.30.62384 > 151.xx.xx.xx.61479: UDP, length 101
20:39:12.987527 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [P.], seq 700421627:700422382, ack 377141587, win 257, length 755
20:39:12.988554 IP 79.xxx.xxx.216.55621 > 151.xx.xx.xx.443: Flags [P.], seq 3192357072:3192357827, ack 3940752659, win 260, length 755
20:39:12.989291 IP 79.xxx.xxx.216.56517 > 151.xx.xx.xx.443: Flags [P.], seq 3172129891:3172130644, ack 3568957121, win 257, length 753
20:39:12.990879 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [.], seq 755:2207, ack 1, win 257, length 1452
20:39:12.991845 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [P.], seq 2207:3465, ack 1, win 257, length 1258
20:39:12.992794 IP 79.xxx.xxx.216.56254 > 151.xx.xx.xx.443: Flags [P.], seq 1723903877:1723904632, ack 3204952387, win 260, length 755
もちろん、IPの一部をxxx
。
今より興味深い部分は誰かによってDDoSに遭遇し、ダンプから全体の攻撃をキャプチャしましたが、このイベントのグラフを見たいと思います。残念ながら私はそれを使用しないので、-w
私のtcpdump
出力はバイナリではなく、Wiresharkはファイルのインポートを拒否します。存在しない16進データを読み取ろうとします。
Wiresharkでパケットの詳細なしでダンプをロードしたり、ファイルを変換したり、他のプログラムを使用してグラフを印刷したりする方法はありますか?
答え1
パケットのタイムスタンプにのみ興味がある場合は、16進数を使用して単一のパケットのスナップショットをコピーし、タイムスタンプのみを変更できます。タイムスタンプtext2pcap
は通常Wiresharkと同じパケットにあります。
たとえば、tcpdump -XX
いくつかのアーティファクトパケットをキャプチャし、ASCIIダンプから短いTCPパケットを選択したことがあります。
16:51:27.374569 IP 192.168.0.21.nut > 192.168.0.20.53910: Flags [R.] ...
0x0000: b827 0099 9999 80ee 7399 9999 0800 4500 ................
0x0010: 0028 06e4 4000 4006 b272 c0a8 0015 c0a8 .(..@[email protected]......
0x0020: 0014 0da5 d296 0000 0000 ee15 7872 5014 ............xrP.
0x0030: 0000 e792 0000 ......
awkでフィルタリングして、目的の形式のダンプを取得できますtext2pcap
。つまり:
awk '$1~/0x/ { $0 = substr($0,1,50); for(i=2;i<=9;i++)s = s $i }
END { gsub(/../,"& ",s); print "0000 " s }'
mypacket
結果として変数を設定します。
mypacket='0000 b8 27 00 99 99 99 80 ee 73 99 99 99 08 00 45 00 00 28 06 e4 40 00 40 06 b2 72 c0 a8 00 15 c0 a8 00 14 0d a5 d2 96 00 00 00 00 ee 15 78 72 50 14 00 00 e7 92 00 00'
その後、別のawkを使用してデータファイルの各行の列1から時刻を取得し、同じパケットに追加し、トランスレータにこのタイムスタンプを指定された形式に抽出し、Wireshark形式に適したpcapに変換するように指示します。
awk <dump -v mypacket="$mypacket" '
/79\.xxx\.xxx\.216/ { print $1 " " mypacket }' |
text2pcap -t '%H:%M:%S.' - out.pcap
-t
オプションの最後の「.」に注意してください。タイムスタンプの秒数を保存する必要があります。
答え2
出力に存在する限られた情報が可能な場合は、テキストをPCAPに変換できますtcpdump
。
#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Time::Piece;
# get this from CPAN
use File::PCAP::Writer ();
my $fpw = File::PCAP::Writer->new( { fname => 'out.pcap' } );
# read tcpdump output from files or standard input
shift @ARGV if @ARGV == 1 and $ARGV[0] eq '-';
while (readline) {
my ( $stamp, $usec ) = $_ =~ m/^(\d\d:\d\d:\d\d) [.] (\d+) \s IP \s /ax;
# blindly assume packets all from the same day that is today
my $now = localtime;
$stamp = $now->ymd . ' ' . $stamp;
my $epoch = Time::Piece->strptime( $stamp, "%Y-%m-%d %H:%M:%S" )->epoch;
# fake an empty packet. this gets timestamps into Wireshark,
# which may suffice to only graph packets per time
$fpw->packet( $epoch, $usec, 0, 0, '' );
}
次の日(または一体次の日に?)にローリングされるタイムスタンプを適切に処理し、出力に提供されたヒントに基づいてパケットを適切に偽造するには(tcpdump
たとえば、フレームの作成、IPの作成(IPを使用)アドレス)、正しいサイズとポートのTCPまたはUDPパケットの作成、ARPや他のプロトコルはどうですか?ちょっと待ってちょっと待って)。
PCAPの手間がかからない1秒あたりのパケットタイムスタンプの場合は、まずepoch-to-packets-seen-in-that-secondスクリプトを使用できます。
#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Time::Piece;
# start epoch
my $day = 1505199600;
my $counter = 0;
my $prev_secs = -1;
my $prev_ts;
shift @ARGV if @ARGV == 1 and $ARGV[0] eq '-';
while (readline) {
my ($hhmmss) = $_ =~ m/^(\d\d:\d\d:\d\d) [.] /ax;
my $secs = Time::Piece->strptime( $hhmmss, "%H:%M:%S" )->epoch;
# KLUGE assume next day
$day += 86400 if $secs < $prev_secs;
my $timestamp = $day + $secs;
if ( defined $prev_ts and $timestamp != $prev_ts ) {
say "$prev_ts $counter";
$counter = 0;
}
$counter++;
$prev_secs = $secs;
$prev_ts = $timestamp;
}
say "$prev_ts $counter";
次に、tcpdump
変換された出力をRに入力してプロットします(すべての出力が同じ秒からのものであるため、翌日のタイムスタンプを偽造しました)。
$ head -1 dumptext
20:39:12.808672 IP 94.xx.xxx.202.49183 > 151.xx.xx.xx.61479: UDP, length 104
$ tail -1 dumptext
00:31:18.123456 IP 79.xxx.xxx.216.56254 > 151.xx.xx.xx.443: Flags [P.], seq 1723903877:1723904632, ack 3204952387, win 260, length 755
$ perl torrr dumptext > dataforr
$ cat dataforr
1505273952 10
1505287878 1
$ R
> x=read.table("dataforr")
> x
V1 V2
1 1505273952 10
2 1505287878 1
> names(x)=c('date','packets')
> x$date=strptime(x$date,"%s")
> x
date packets
1 2017-09-12 20:39:12 10
2 2017-09-13 00:31:18 1
> plot(x,type='l')
>