Montag, 6. August 2018

Save Your Cloud: Gain Root Access to VMs in OpenNebula 4.6.1


In this post, we show a proof-of-concept attack that gives us root access to a victim's VM in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cloud Management Platform OpenNebula, which means that we can read and write all its data, install software, etc. The interesting thing about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack is, that it allows an attacker to bridge cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gap between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cloud's high-level web interface and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 low-level shell-access to a virtual machine.

Like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest blogpost of this series, this is a post about an old CSRF- and XSS-vulnerability that dates back to 2014. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interesting part is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability itself but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit that we were able to develop for it.

An attacker needs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following information for a successful attack.
  • ID of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM to attack
    OpenNebula's VM ID is a simple global integer that is increased whenever a VM is instantiated. The attacker may simply guess cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ID. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can execute JavaScript code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of Sunstone, it is possible to use OpenNebula's API and data structures to retrieve this ID based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired VM or its IP address.
  • Operating system & bootloader
    There are various ways to get to know a VMs OS, apart from simply guessing. For example, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM runs a publicly accessible web server, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM could be leaked in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTTP-Header Server (see RFC 2616). Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r option would be to check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 images or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 template cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM was created from. Usually, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name and description of an image contains information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 installed OS, especially if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image was imported from a marketplace.
    Since most operating systems are shipped with a default bootloader, making a correct guess about a VMs bootloader is feasible. Even if this is not possible, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r approaches can be used (see below).
  • Keyboard layout of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM's operating system
    As with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VMs bootloader, making an educated guess about a VM's keyboard layout is not difficult. For example, it is highly likely that VMs in a company's cloud will use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keyboard layout of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 country cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 company is located in.

Overview of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Attack

The key idea of this attack is that neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Sunstone nor noVNC check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r keyboard related events were caused by human input or if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were generated by a script. This can be exploited so that gaining root access to a VM in OpenNebula requires five steps:
  1. Using CSRF, a persistent XSS payload is deployed.
  2. The XSS payload controls Sunstone's API.
  3. The noVNC window of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM to attack is loaded into an iFrame.
  4. The VM is restarted using Sunstone's API.
  5. Keystroke-events are simulated in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iFrame to let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader open a root shell.

Figure 1: OpenNebula's Sunstone Interface displaying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 terminal of a VM in a noVNC window.

The following sections give detailed information about each step.

Executing Remote Code in Sunstone

In Sunstone, every account can choose a display language. This choice is stored as an account parameter (e.g. for English LANG=en_US). In Sunstone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LANG parameter is used to construct a Setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LANG parameter to a different string directly manipulates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script tag. This poses an XSS vulnerability. By setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LANG parameter to LANG="onerror=alert(1)//, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting script tag looks as follows:
<> src="locale/"onerror=alert(1)///"onerror=alert(1)//.js?v=4.6.1" type="text/javascript">
For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web browser, this is a command to fetch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script locale/ from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. However, this URL points to a folder, not a script. Therefore, what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server returns is no JavaScript. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser, this is an error, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser executes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onerror statement: alert(1). The rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 line (including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second alert(1)) is treated as comment due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 forward slashes.

When a user updates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language setting, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser sends an XMLHttpRequest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form
{ "action" : { "perform" : "update", "params" : { "template_raw" : "LANG=\"en_US\"" } } }
to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server (The original request contains more parameters. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se parameters are irrelevant for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technique, we omitted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m for readability.). Forging a request to Sunstone from some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r web page via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's browser requires a trick since one cannot use an XMLHttpRequest due to restrictions enforced by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser's Same-Origin-Policy. Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, using a self-submitting HTML form, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's browser issue a POST request that is similar enough to an XMLHttpRequest so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server accepts it.

An HTML form field like
<> name='deliver' value='attacker' />
is translated to a request in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of deliver=attacker. To create a request changing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's language setting to en_US, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTML form has to look like
<> name='{"action":{"perform":"update","params":{"template_raw":"LANG' value='\"en_US\""}}}' />
Notice that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 equals sign in LANG=\"en_US\" is inserted by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name=value format.

Figure 2: OpenNebula's Sunstone Interface displaying a user's attributes with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malicious payload in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LANG attribute.

Using this trick, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LANG parameter for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's account to "onerror=[remote code]//, where [remote code] is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's exploit code. The attacker can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r insert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete exploit code into this parameter (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no length limitation) or include code from a server under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's control. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user reloads Sunstone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server delivers HTML code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client that executes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's exploit.

Prepare Attack on VM

Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overwritten language parameter, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's browser does not load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 localization script that is required for Sunstone to work. Therefore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker achieved code execution, but Sunstone breaks and does not work anymore. For this reason, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker needs to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language back to a working value (e.g. en_US) and reload cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page in an iFrame. This way Sunstone is working again in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iFrame, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iFrame from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outside. In addition, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack code needs to disable a watchdog timer outside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iFrame that checks whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Sunstone is correctly initialized.

From this point on, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Sunstone API with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privileges of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim. This way, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can gacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r all required information like OpenNebula's internal VM ID and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keyboard layout of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM's operating system from Sunstone's data-structures based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IP address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired VM.

Compromising a VM

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Sunstone API cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can issue a command to open a VNC connection. However, this command calls window.open, which opens a new browser window that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker cannot control. To circumvent this restriction, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can overwrite window.open with a function that creates an iFrame under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's control.

Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 noVNC-iFrame has loaded, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can send keystrokes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dispatchEvent function. Keystrokes on character keys can be simulated using keypress events. Keystrokes on special keys (Enter, Tab, etc.) have to be simulated using pairs of keydown and keyup events since noVNC filters keypress events on special keys.

Getting Root Access to VM

To get root access to a VM cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can reboot a victim's VM using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Sunstone API and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM's bootloader by interrupting it with keystrokes. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can inject commands into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader, it is possible to use recovery options or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 single user mode of Linux based operating systems to get a shell with root privileges. The hardest part with this attack is to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timing right. Usually, one only has a few seconds to interrupt a bootloader. However, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hard reboot feature, which instantly resets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM without shutting it down gracefully, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reboot command and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interrupting keystroke can be roughly estimated.

Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader is unknown, it is possible to use a try-and-error approach. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variety of bootloaders is small, one can try for one particular bootloader and reset cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack was unsuccessful. Alternatively, one can capture a screenshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 noVNC canvas of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM a few seconds after resetting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM and determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader.

A video of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack can be seen here. The browser on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right hand side shows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's actions. A second browser on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left hand side shows what is happening in OpenNebula. The console window on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom right shows that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no user-made keyboard input while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack is happening.


This bug has been fixed in OpenNebula 4.6.2.

This result is a collaborative work togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with Mario Heiderich. It has been published at ACM CCSW 2015. The paper can be found here.

Beliebte Posts