← Advisories

FaceSentry Access Control System 6.4.8 Remote Command Injection

Critical
Advisory ID
ZSL-2019-5523
Release Date
30 June 2019
Vendor
Affected Version
Firmware 6.4.8 build 264 (Algorithm A16), Firmware 5.7.2 build 568 (Algorithm A14), Firmware 5.7.0 build 539 (Algorithm A14)
Tested On
Linux 4.14.18-sunxi (armv7l) Ubuntu 16.04.4 LTS (Xenial Xerus), Linux 3.4.113-sun8i (armv7l), PHP/7.0.30-0ubuntu0.16.04.1, PHP/7.0.22-0ubuntu0.16.04.1, lighttpd/1.4.35, Armbian 5.38, Sunxi Linux (sun8i generation), Orange Pi PC +
Summary

FaceSentry 5AN is a revolutionary smart identity management appliance that offers entry via biometric face identification, contactless smart card, staff ID, or QR-code. The QR-code upgrade allows you to share an eKey with guests while you're away from your Office and monitor all activity via the web administration tool. Powered by standard PoE (Power over Ethernet), FaceSEntry 5AN can be installed in minutes with only 6 screws. FaceSentry 5AN is a true enterprise grade access control or time-and-attendance appliance.

Description

FaceSentry suffers from an authenticated OS command injection vulnerability using default credentials. This can be exploited to inject and execute arbitrary shell commands as the root user via the 'strInIP' and 'strInPort' parameters (POST) in pingTest and tcpPortTest PHP scripts.

/pingTest.php: -------------- 8: if (!isAuth('TestTools','R')){ 9: echo "No Permission"; 10: include("footer.php"); 11: exit; 12: } 13: 14: if(isset($_POST["strInIP"])){ 15: $strInIP = $_POST["strInIP"]; 16: }else{ 17: $strInIP = ""; 18: } 19: 20: $strOperationResult = ""; 21: if ($strInIP != ""){ 22: 23: $out = array(); 24: exec("sudo ping -c 4 $strInIP",$out); 25: $result = ""; 26: foreach($out as $line){ 27: $result = $result.$line."<br>"; 28: } -------------------------------------------------------------------------------- /tcpPortTest.php: ----------------- 14: if (isset($_POST["strInIP"])){ 15: $strInIP = $_POST["strInIP"]; 16: }else{ 17: $strInIP = ""; 18: } 19: if (isset($_POST["strInPort"])){ 20: $strInPort = $_POST["strInPort"]; 21: }else{ 22: $strInPort = ""; 23: } .. .. 53: $strOperationResult = ""; 54: if ($strInIP != "" and $strInPort != ""){ 55: $fp = fsockopen($strInIP, $strInPort, $errno, $errstr, 10); 56: system("date>>".TCP_PORT_TEST); 57: if (!$fp) { 58: $strOperationResult = getDisplay("TestTools.TCPPortTestFail")." $errstr ($errno)"; 59: system("echo -e \"Unable to connect to $strInIP:$strInPort\">>".TCP_PORT_TEST); 60: } else { 61: fclose($fp); 62: $strOperationResult = getDisplay("TestTools.TCPPortTestSucces"); 63: system("echo -e \"Successfully connected to $strInIP:$strInPort\">>".TCP_PORT_TEST); 64: } 65: }
Proof of Concept
Disclosure Timeline
28.05.2019Vulnerability discovered.
29.05.2019Vendor contacted.
12.06.2019No response from the vendor.
13.06.2019Vendor contacted.
27.06.2019No response from the vendor.
28.06.2019Vendor contacted.
29.06.2019No response from the vendor.
30.06.2019Public security advisory released.
Credits
Vulnerability discovered by Gjoko Krstic
References
Changelog
30.06.2019Initial release
04.07.2019Added reference [1], [2], [3] and [4]
23.03.2026Added reference [5]