6.858 Fall 2011 Lab 5: Browser security

Handed out: Friday, October 28, 2011
Due: Friday, November 11, 2011 (11:59pm)

Introduction

This lab will introduce you to browser-based attacks, as well as to how one might go about preventing them. For this lab, you will be using the zoobar web application that you were working on in previous labs. Be sure that you have a functional zoobar web site running in your VM, as per the previous lab assignments, before you start working on this lab.

When working on the exercises, you may find the following hints and tools useful:

Before you begin working on these exercises, please use Git to commit your Lab 3 solutions, fetch the latest version of the course repository, and then create a local branch called lab5 based on our lab5 branch, origin/lab5:

httpd@vm-6858:~$ cd lab 
httpd@vm-6858:~/lab$ git commit -am 'my solution to lab3' 
[lab3 c54dd4d] my solution to lab3
 1 files changed, 1 insertions(+), 0 deletions(-)
httpd@vm-6858:~/lab$ git pull 
Already up-to-date.
httpd@vm-6858:~/lab$ git checkout -b lab5 origin/lab5 
Branch lab5 set up to track remote branch lab5 from origin.
Switched to a new branch 'lab5'
httpd@vm-6858:~/lab$ make
httpd@vm-6858:~/lab$ sudo rm -r /jail
httpd@vm-6858:~/lab$ sudo make setup
...

Now you can start the zookws web server, as follows.

httpd@vm-6858:~$ sudo ./zookld &

Open your browser and go to the URL http://zoobar-server-ip:8080/. You should see the zoobar web application. We have set up a clone at zoobar.csail.mit.edu:8080.

You will craft a series of attacks against the zoobar web site you have been working on in previous labs that exploit vulnerabilities in the website's design. Each attack presents a distinct scenario with unique goals and constraints, although in some cases you may be able to re-use parts of your code.

We will run your attacks after wiping clean the database of registered users (except the user named "attacker"), so do not assume the presence of any other users in your submitted attacks.

Your attacks will run in a restricted network environment that can only connect to zoobar.csail.mit.edu:8080 running the zoobar code, and to pdos.csail.mit.edu.

Important: be sure that all of the attacks you develop for this lab work on the unmodified zoobar web site (i.e. the one without any of the privilege separation that you implemented in labs 2 and 3). While we expect that privilege separation would not impact the exploitability of most of the browser-based vulnerabilities that are explored in this lab, we want to be sure that we can grade your submissions consistently. Note that the unmodified website allows for HTML profiles, not Python profiles.

We will grade your attacks with default settings using the current version of Mozilla Firefox on Ubuntu 11.04 (as installed on, e.g., the Athena workstations) browser at the time the project is due. We chose this browser for grading because it is widely available and can run on a variety of operating systems. There are subtle quirks in the way HTML and JavaScript are handled by different browsers, and some attacks that work or do not work in Internet Explorer or Chrome (for example) may not work in Firefox. In particular, you should use the Mozilla way of adding listeners to events. We recommend that you test your code on Firefox before you submit, to ensure that you will receive credit for your work.

For exercises 1 and 3, you will need a server-side script to automatically email information captured by your client-side JavaScript code to the TAs for grading. We have provided this script for you. Please review the instructions at http://pdos.csail.mit.edu/6.858/2011/labs/sendmail.php and use that URL in your attack scripts to send emails. You may send as many emails as you like while working on the project, but please do not attack or abuse the email script.

Exercise 1: Cookie Theft. Construct an attack that will steal a victim's cookie for the zoobar site when the victim's browser opens a URL of your choosing. (You do not need to do anything with the victim's cookie after stealing it, for the purposes of this exercise, although in practice an attacker could use the cookie to impersonate the victim, and issue requests as if they came from the victim.)

For exercise 1, you will want the server to reflect back certain character strings to the victim's browser. However, the HTTP server performs URL decoding on your request before passing it on to the zoobar code. Thus, you'll need to make sure that your attack code is URL encoded. For example, use + instead of space and %2b instead of +. Here is a URL encoding reference and a handy conversion tool. You can also use quoting functions in the python urllib module to URL encode strings.

Exercise 2: Cross-Site Request Forgery. Construct an attack that transfers credits from a victim to the attacker, when the victim's browser opens an HTML document of your choosing. Do not exploit cross-site scripting vulnerabilities (where the server reflects back attack code), such as the one involved in exercise 1 above, or logic bugs in transfer.py that you fixed in lab 3.

For exercise 2, you will need to synthesize an HTTP POST request from your HTML page. To do so, consider creating an HTML form whose action attribute points to .../index.cgi/transfer, and which contains <input> fields with the necessary names and values. Look at the source of the HTML that's generated by index.cgi/transfer to get an idea of what this form should look like. You can submit a form by using JavaScript to invoke the click method on the submit button, or the submit method on the form itself.

Exercise 3: Side Channels and Phishing. Construct an attack that will steal a victim's credits, if the user is already logged in (using the attack from exercise 2), or ask the victim for their username and password, if they are not logged in.

Exercise 4: Profile Worm. Create a worm that will transfer 1 zoobar from the victim to the attacker, and spread to the victim's zoobar site profile, when the victim views the profile of another infected user.

For exercise 4, you may need to create an iframe and access data inside of it. You can use the DOM methods document.createElement and document.body.appendChild to do so. Getting access to form fields in an iframe differs by browser, and only works for frames from the domain (the Same Origin Policy). In Firefox, you can do iframe.contentDocument.forms[0].zoobars.value = 1;. Another approach may be to use XMLHttpRequest instead of an iframe.

Challenge: Password Theft. Create an attack that will steal the victim's username and password, even if the victim is diligent about only entering their password when the URL address bar shows zoobar.csail.mit.edu:8080.

For this final attack, you may find that using alert() to test for script injection does not work; Firefox blocks it when it's causing an infinite loop of dialog boxes. Try other ways to probe whether your code is running, such as document.loginform.login_username.value=42.

Deliverables

Create files named answer-1.txt, answer-2.html, answer-3.html, answer-4.txt, and if you are doing the challenge, answer-chal.html, containing each of your attacks. Feel free to include any comments about your solutions in the answers.txt file (we would appreciate any feedback you may have on this assignment).

Submit your project by running make handin and uploading the resulting lab5-handin.tar.gz file.

Beware of Race Conditions: Depending on how you write your code, all four of these attacks attacks could potentially have race conditions that affect the success of your attacks. Attacks that fail on the grader's browser during grading will receive less than full credit. To ensure that you receive full credit, you should wait after making an outbound network request rather than assuming that the request will be sent immediately.

Run make handin to generate the lab5-handin.tar.gz file and submit it as per instructions. You're done!

Acknowledgments

Thanks to Stanford's CS155 course staff for the original version of this assignment.