Packet generate 101: packetfu

I en kommentar til sidste blogindlæg skriver Jørgen Larsen:

Nu er dette område ikke lige min kernekompetence, men til Packet/Traffic Generator kunne man overveje Ostinato (http://code.google.com/p/ostinato/)? Det virker i hvert tilfælde lovende.

Bestemt, Ostinato har nogle sjove features og ser pæn ud - desværre ikke helt intuitiv at komme igang med, men hvis man følger screencast og gør det samme virker det. Derefter er det mulighederne for at klikke rundt i GUI og lave pakker, derved komplementerer det Wireshark http://www.wireshark.org/ godt.

Et andet spændende projekt er dog PacketFu https://github.com/todb/packetfu som kan bruges til at arbejde med pakker på lavt niveau, med et højniveau sprog :-)

Der er en del eksempler i PacketFu eksempelvis 100kpackets.rb der har følgende indhold (forkortet):

#!/usr/bin/env ruby
# Used mainly to test for memory leaks and to demo the preferred ways of
# reading and writing packets to and from pcap files.
#require './examples' # For path setting slight-of-hand
require 'packetfu'
include PacketFu
puts "Generating packets... (#{Time.now.utc})"
File.unlink("/tmp/out.pcap") if File.exists? "/tmp/out.pcap"
start_time = Time.now.utc
count = 0
100.times do
   @pcaps = []
    1000.times do 
     u = UDPPacket.new
      u.ip_src = [rand(2<strong>32-1)].pack("N")
     u.ip_dst = [rand(2</strong>32-1)].pack("N")
     u.recalc
       @pcaps << u
  end
    pfile = PcapFile.new
   res = pfile.array_to_file(:filename => "/tmp/out.pcap", :array => @pcaps, :append => true)
  count += res.last
  puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
end

Dette eksempel skriver en fil med 100.000 pakker ned i en PCAP fil, med tilfældig afsender og modtager IP-adresse. Hvis vi så ændrer dette til TCP og føjer lidt til får vi:

#!/usr/bin/env ruby
# Used mainly to test for memory leaks and to demo the preferred ways of
# reading and writing packets to and from pcap files.
#require './examples' # For path setting slight-of-hand
require 'packetfu'
include PacketFu
def usage
        if ARGV[0].nil?
                raise ArgumentError, "You need an IP address to start with."
        elsif !Process.euid.zero?
                raise SecurityError, "You need to be root to run this."
        end
end
usage unless target_ip = ARGV[0]                # Need a target IP. - ja sorry bruges ikke endnu, men I forstår 
#usage unless Process.euid.zero?                 # Need to be root.
IPAddr.new(target_ip)                                                           # Check to see it's really an IP address, and not a herring or something.
#$packetfu_default = PacketFu::Config.new(PacketFu::Utils.whoami?).config
puts "Generating packets... (#{Time.now.utc})"
File.unlink("tcpflood.pcap") if File.exists? "tcpflood.pcap"
start_time = Time.now.utc
count = 0
100.times do
    @pcaps = []
    1000.times do 
     u = TCPPacket.new
          u.tcp_flags.syn=1
      ts_val = Time.now.to_i + rand(0x4fffffff)
      #u.ip_src = [rand(2<strong>32-1)].pack("N")
        #u.ip_dst = [rand(2</strong>32-1)].pack("N")
        u.ip_saddr = "10.0.10.20"
        u.ip_daddr = "10.0.10.30"
        u.tcp_dport=80
     #u.tcp_opts="mss:1460,sack.ok,ts:0x10674348,nop,ws:512"
      u.tcp_options="MSS:1460,SACKOK,TS:#{ts_val};0,NOP,WS:512"
        u.recalc
       @pcaps << u
  end
    pfile = PcapFile.new
   res = pfile.array_to_file(:filename => "tcpflood.pcap", :array => @pcaps, :append => true)
  count += res.last
  puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
end

Uddata er således 100k pakker med TCP som skrives ned i en fil, som straks kan smides ud på netkortet med tcpreplay, se forrige blog-indlæg.

hlk@xpc02:~/packetfactory$ cat run-tcp-flood 
#! /bin/sh
sudo /pentest/sniffers/tcpreplay/tcpreplay-edit 
  --enet-dmac=80:ee:73:16:e1:57 -C -t -i eth2 -K -l 1000 
   /home/hlk/packetfactory/tcpflood.pcap 

Samtidig brugte jeg så ifpps fra netsniff-ng http://netsniff-ng.org/ (sudo ifpps -d eth2) som gav mig:

  Kernel net/sys statistics for eth2, t=8.00s
  RX:            0.000 MiB/t          0 pkts/t          0 drops/t          0 errors/t  
  TX:          658.223 MiB/t    9326989 pkts/t          0 drops/t          0 errors/t  --- Note: opdateres hvert 8. sekund
 
  RX:            0.000 MiB            0 pkts            0 drops            0 errors ---   Note: akkumulerede data
  TX:        11978.994 MiB    169741693 pkts            0 drops            0 errors
 
  SYS:            4342 cs/t        2.7% mem             4 running          0 iowait
  CPU0:           0.0% usr/t       0.1% sys/t       99.9% idl/t         0.0% iow/t
  CPU1:           0.2% usr/t       1.0% sys/t       98.8% idl/t         0.0% iow/t
  CPU2:           0.0% usr/t       0.0% sys/t      100.0% idl/t         0.0% iow/t
  CPU3:           0.0% usr/t       0.0% sys/t      100.0% idl/t         0.0% iow/t
  CPU4:           0.0% usr/t       2.7% sys/t       97.3% idl/t         0.0% iow/t
  CPU5:          17.4% usr/t      81.5% sys/t        1.1% idl/t         0.0% iow/t
  CPU6:           0.0% usr/t       0.0% sys/t      100.0% idl/t         0.0% iow/t
  CPU7:          15.0% usr/t      85.0% sys/t        0.0% idl/t         0.0% iow/t

NB: den skriver i MiB, men med -t 8 giver den en update hvert 8 sekund og derfor er det 658Mbit - og bemærk det således er 9326989 pakker på 8 sekunder, dvs 1.165.873 pps på et 10Gbit Intel 82599 netkort.

Det er således et rimeligt fint lille DoS man kan lave sig med PacketFu og tcpreplay, og der kan sendes direkte fra Ruby/PacketFu - men ikke med samme hastighed som tcpreplay giver mig.

Hvor kan man bruge dette?

Jeg sidder i denne uge på thecamp.dk og leger med netværk og skal blandt andet se på "port security" på nogle switche jeg har med, og det er nu en del nemmere at fabrikere STP (spanning tree protocol) pakkerne end at koble en hel masse udstyr sammen.

Hvilke pakker vil I have fabrikeret?

Et helt andet værktøj, som jeg har på todolisten er et andet PacketFu eksempel Uniqpcap.rb der snildt og enkelt sammenligner PCAP filer.

PS Det traditionelle værktøj til dette er Scapy http://www.secdev.org/projects/scapy/ og det er bestemt også et dejligt værktøj og kan en hel masse mere!

Kommentarer (0)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Log ind eller Opret konto for at kommentere