Dette indlæg er alene udtryk for skribentens egen holdning.

Packet generate 101: packetfu

23. juli 2012 kl. 19:47
Artiklen er ældre end 30 dage

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 (https://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 https://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):

  1. #!/usr/bin/env ruby
  2. # Used mainly to test for memory leaks and to demo the preferred ways of
  3. # reading and writing packets to and from pcap files.
  4. #require './examples' # For path setting slight-of-hand
  5. require 'packetfu'
  6. include PacketFu
  7. puts "Generating packets... (#{Time.now.utc})"
  8. File.unlink("/tmp/out.pcap") if File.exists? "/tmp/out.pcap"
  9. start_time = Time.now.utc
  10. count = 0
  11. 100.times do
  12. @pcaps = []
  13. 1000.times do
  14. u = UDPPacket.new
  15. u.ip_src = [rand(2**32-1)].pack("N")
  16. u.ip_dst = [rand(2**32-1)].pack("N")
  17. u.recalc
  18. @pcaps << u
  19. end
  20. pfile = PcapFile.new
  21. res = pfile.array_to_file(:filename => "/tmp/out.pcap", :array => @pcaps, :append => true)
  22. count += res.last
  23. puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
  24. 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:

  1. #!/usr/bin/env ruby
  2. # Used mainly to test for memory leaks and to demo the preferred ways of
  3. # reading and writing packets to and from pcap files.
  4. #require './examples' # For path setting slight-of-hand
  5. require 'packetfu'
  6. include PacketFu
  7. def usage
  8. if ARGV[0].nil?
  9. raise ArgumentError, "You need an IP address to start with."
  10. elsif !Process.euid.zero?
  11. raise SecurityError, "You need to be root to run this."
  12. end
  13. end
  14. usage unless target_ip = ARGV[0] # Need a target IP. - ja sorry bruges ikke endnu, men I forstår
  15. #usage unless Process.euid.zero? # Need to be root.
  16. IPAddr.new(target_ip) # Check to see it's really an IP address, and not a herring or something.
  17. #$packetfu_default = PacketFu::Config.new(PacketFu::Utils.whoami?).config
  18. puts "Generating packets... (#{Time.now.utc})"
  19. File.unlink("tcpflood.pcap") if File.exists? "tcpflood.pcap"
  20. start_time = Time.now.utc
  21. count = 0
  22. 100.times do
  23. @pcaps = []
  24. 1000.times do
  25. u = TCPPacket.new
  26. u.tcp_flags.syn=1
  27. ts_val = Time.now.to_i + rand(0x4fffffff)
  28. #u.ip_src = [rand(2**32-1)].pack("N")
  29. #u.ip_dst = [rand(2**32-1)].pack("N")
  30. u.ip_saddr = "10.0.10.20"
  31. u.ip_daddr = "10.0.10.30"
  32. u.tcp_dport=80
  33. #u.tcp_opts="mss:1460,sack.ok,ts:0x10674348,nop,ws:512"
  34. u.tcp_options="MSS:1460,SACKOK,TS:#{ts_val};0,NOP,WS:512"
  35. u.recalc
  36. @pcaps << u
  37. end
  38. pfile = PcapFile.new
  39. res = pfile.array_to_file(:filename => "tcpflood.pcap", :array => @pcaps, :append => true)
  40. count += res.last
  41. puts "Wrote #{count} packets in #{Time.now.utc - start_time} seconds"
  42. 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.

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

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

  1. Kernel net/sys statistics for eth2, t=8.00s
  2. RX: 0.000 MiB/t 0 pkts/t 0 drops/t 0 errors/t
  3. TX: 658.223 MiB/t 9326989 pkts/t 0 drops/t 0 errors/t --- Note: opdateres hvert 8. sekund
  4.  
  5. RX: 0.000 MiB 0 pkts 0 drops 0 errors --- Note: akkumulerede data
  6. TX: 11978.994 MiB 169741693 pkts 0 drops 0 errors
  7.  
  8. SYS: 4342 cs/t 2.7% mem 4 running 0 iowait
  9. CPU0: 0.0% usr/t 0.1% sys/t 99.9% idl/t 0.0% iow/t
  10. CPU1: 0.2% usr/t 1.0% sys/t 98.8% idl/t 0.0% iow/t
  11. CPU2: 0.0% usr/t 0.0% sys/t 100.0% idl/t 0.0% iow/t
  12. CPU3: 0.0% usr/t 0.0% sys/t 100.0% idl/t 0.0% iow/t
  13. CPU4: 0.0% usr/t 2.7% sys/t 97.3% idl/t 0.0% iow/t
  14. CPU5: 17.4% usr/t 81.5% sys/t 1.1% idl/t 0.0% iow/t
  15. CPU6: 0.0% usr/t 0.0% sys/t 100.0% idl/t 0.0% iow/t
  16. 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.

Artiklen fortsætter efter annoncen

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 https://www.secdev.org/projects/scapy/ og det er bestemt også et dejligt værktøj og kan en hel masse mere!

Ingen kommentarer endnu.  Start debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger