From 7d696e99d0f40d73f4c0e96e68161a521dd7b817 Mon Sep 17 00:00:00 2001 From: eliyaha02 Date: Sun, 20 Dec 2020 01:47:05 +0200 Subject: [PATCH] wordpress security scan --- README.md | 18 +++ requirements.txt | 2 + wordpress-security-scan.png | Bin 0 -> 41081 bytes wordpress_project.py | 236 ++++++++++++++++++++++++++++++++++++ wordpress_scan.py | 26 ++++ 5 files changed, 282 insertions(+) create mode 100644 requirements.txt create mode 100644 wordpress-security-scan.png create mode 100644 wordpress_project.py create mode 100644 wordpress_scan.py diff --git a/README.md b/README.md index d7f0b4d..860bc81 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ # wordpress-security-scan Python tool for scanning wordpress websites and checking the security level on the website + + + +## Installation + +```console +# clone the repository +$ git clone https://github.com/eliyaha02/wordpress-security-scan + +# change the working directory to wordpress-security-scan +$ cd wordpress-security-scan + +# install the requirements +$ pip install -r requirements.txt + +# run the script +$ python wordpress-scan.py +``` diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..052956f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests +art diff --git a/wordpress-security-scan.png b/wordpress-security-scan.png new file mode 100644 index 0000000000000000000000000000000000000000..d6080bdf9b1a8b013d2935022a9751a0a3f50773 GIT binary patch literal 41081 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
QMSwye4gwwwP2M0H>< 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") + print("your generator line no hidden. This is a wordpress system, version " + generator_to_end[find_wordpress:find_wordpress_tow - 2]) + else: + find_wp = source_code.find("wp-") + if find_wp == -1: + print("We'm sorry, but we were unable to identify this wordpress system") + return False + else: + print("your generator line is hidden. well done!") + print("-------------------------------------------------------") + + +def https_and_hsts(): + """ + Checks if the website uses https and if so, does it also use htsts + """ + find_https = url.find("://") + rest_url = url[find_https:] + http_url = "{0}{1}{2}".format("http", rest_url, "/") + check_https = requests.get("{0}{1}".format("https",rest_url)) + status_code = check_https.status_code + + if (url[find_https-1] == check_https.url[find_https-1]) or (str(status_code) == "200"): + http_request = requests.get(http_url) + if http_request.url == http_url: + print("Your website uses https, but not hsts. it's bad!") + else: + print("Your website uses https and hsts. very good!") + else: + print("Your website not uses https. it's very bad!") + print("-------------------------------------------------------") + + +def search_important_headers(): + """ + Checks if the website uses important headers + """ + list_important_headers = ['X-Frame-Options', 'Referrer-Policy', 'Permissions-Policy', + 'X-XSS-Protection', 'Strict-Transport-Security', 'X-Content-Type-Options'] + list_headers_not_defined = [] + http_request = requests.get(url) + list_headers = http_request.headers + for header in list_important_headers: + if header not in list_headers: + list_headers_not_defined.append(header) + if len(list_headers_not_defined) > 0: + print("You need to define the following headers: {0}".format(list_headers_not_defined)) + else: + print("All headers are defined. very good work!") + print("-------------------------------------------------------") + + +def discovery_admin_panel(): + """ + Checks whether admin panel is visible or not + """ + admin_panel = "/wp-admin" + website = requests.get("{0}{1}".format(url,admin_panel)) + if website.status_code == 200: + print("Your admin panel is visible. it's bad!") + else: + print("Your admin panel is hidden. Well done!") + print("-------------------------------------------------------") + + +def discovery_wordpress_with_robots_file(): + """ + Checks if the robots.txt file reveals that it is a wordpress system + """ + robots = "/robots.txt" + http_request = requests.get("{0}{1}".format(url,robots)) + if http_request.status_code == 200: + find_wp = http_request.text.find("wp-") + if find_wp != -1: + print("The robots.txt file reveals that your system is wordpress") + else: + print("The robots.txt file reveals that your system is wordpress") + print("-------------------------------------------------------") + print("") + + + +def discovery_usernames_with_author_query(): + """ + Checks if the author query returns usernames or is blocked + """ + author = "/?author=" + number_of_users = input("We will perform an author query. Enter the number of usernames we will scan: ") + + list_of_users = [] + for number in range(int(number_of_users)): + if number == 0: + continue + url_author = requests.get("{0}{1}{2}".format(url, author, number)) + result = url_author.url + if url != result: + if url_author.status_code == 404: + continue + find_username = result.rfind("author/") + list_of_users.append(result[find_username + len("author/"):-1]) + else: + print("Excellent! Author query blocked!") + break + print("The author query was not blocked. Usernames found: " + "".join(list_of_users)) + print("-------------------------------------------------------") + + +def discovery_users_with_wp_json(): + """ + Checks if wp-json returns usernames or is blocked + """ + list_of_users = [] + syntax_wp_json = "/wp-json/wp/v2/users" + request_wp_json = requests.get("{0}{1}".format(url, syntax_wp_json)).text + find_users = request_wp_json.find("name") + if find_users != -1: + lines = request_wp_json.split("url") + for line in lines: + find_name = line.find("name") + if find_name != -1: + cut_from = find_name+len("name")+3 + cut_to = line.rfind(",")-1 + username = line[cut_from:cut_to] + list_of_users.append(username) + print("The wp-json is not blocked. Usernames found: {0}".format("".join(list_of_users))) + else: + print("The wp-json has been blocked. good work!") + print("-------------------------------------------------------") + + +def checker_xmlrpc(): + """ + Checks if xmlrpc.php is open or blocked + """ + xmlrpc = "/xmlrpc.php" + https_request = requests.get("{0}{1}".format(url, xmlrpc)) + if https_request.status_code == 405: + print("xml-rpc is not disabled. it's bad!") + else: + print("xml-rpc is disabled. well done!") + print("-------------------------------------------------------") + + +def find_exposed_folders(): + """ + Checks if there are wordpress folders that are visible to everyone + """ + folders = ["/wp-content/uploads", "/wp-includes", "/.git"] + list_of_exposed_folders = [] + for folder in folders: + get_folder = requests.get("{0}{1}".format(url, folder)) + if get_folder.status_code == 200: + list_of_exposed_folders.append("{0}{1}".format(folder, ", ")) + if len(list_of_exposed_folders) > 0: + print("The folders found: {0}".format("".join(list_of_exposed_folders)) + ". it's bad!") + else: + print("No exposed folders found. good work!") + print("-------------------------------------------------------") + + +def discovery_plugins(): + """ + Searches for plugins installed on the wordpress site, + by searching the readme.txt file. The search is only on the 36 most vulnerable and important plugins + """ + list_of_plugins = ["elementor", "wordfenc", "wp-hide-security-hardening", "wp-sri", "wpforms-lite", + "wps-hide-login", "litespeed-cache", "comment-from-csrf-protection", "all-in-one-wp-mugration", + "gutenberg", "woocommerce", "ultimate-member", "yoast-seo", "ninja-Forms", "nextgen gallery", + "jetPack", "all-in-one-seo-pack", "contact-form-7", "patch-for-revolution-slider", + "gravity-Forms", + "timthumb", "wp-symposium-pro", "wptf-image-Gallery", "google-mp3-audio-player", + "wp-database-backup", + "wp-e-commerce-shop-styling", "candidate-application-Form", "wp-Mobile-Detector", + "ajax-pagination", + "newsletter", "google-photos-gallery", "tinymce-thumbnail-gallery", "dukapress", + "wp-file-manager", + "history-collection", "work-the-flow-file-upload"] + list_of_plugins_found = [] + url_plugins = "{0}{1}".format(url, "/wp-content/plugins/") + readme = "/readme.txt" + + if requests.get(url_plugins).status_code == 200: + for plugin in list_of_plugins: + get_readme = requests.get("{0}{1}{2}".format(url_plugins, plugin, readme)) + status_code = get_readme.status_code + if status_code != 404: + list_of_plugins_found.append(plugin) + + if len(list_of_plugins_found) < 1: + print("No plugins found") + else: + print("plugins found: {0}".format(list_of_plugins_found)) + + for plugin in list_of_plugins_found: + plugin_get = requests.get("{0}{1}{2}".format(url_plugins, plugin, readme)) + find_changelog = plugin_get.text.rfind("Changelog") + if find_changelog == -1: + find_changelog = plugin_get.text.rfind("Change") + output = plugin_get.text[find_changelog:find_changelog + 30] + find_version_one = output.find(".") + find_version_two = output.rfind(".") + print("{0}, version {1}".format(plugin, output[find_version_one - 2:find_version_two + 2])) + else: + print("We are sorry, but we were unable to identify the system as a wordpress system") + print("-------------------------------------------------------") + print("finish!") + + diff --git a/wordpress_scan.py b/wordpress_scan.py new file mode 100644 index 0000000..c5fb767 --- /dev/null +++ b/wordpress_scan.py @@ -0,0 +1,26 @@ +from wordpress_project import * + + +def main(): + welcome() + + if discovery_version() == False: + print("finish!") + + else: + https_and_hsts() + search_important_headers() + discovery_admin_panel() + discovery_wordpress_with_robots_file() + discovery_usernames_with_author_query() + discovery_users_with_wp_json() + checker_xmlrpc() + find_exposed_folders() + discovery_plugins() + + +if __name__ == '__main__': + try: + main() + except: + print("There is a problem. Try again!")