diff --git a/lib/core/parse.py b/lib/core/parse.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/plugins/1024.py b/lib/plugins/1024.py new file mode 100644 index 0000000..1e3fb65 --- /dev/null +++ b/lib/plugins/1024.py @@ -0,0 +1,24 @@ +import re + + +__product__ = "1024-CMS" +__description__ = ( + "1024 is one of a few CMS's leading the way with " + "the implementation of the AJAX technology into " + "all its areas. This includes dynamic administration " + "and user interaction. 1024 offers you to ability to " + "set up your own community forums, download area, news " + "posts, member management and more." +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r".1024cms.", re.I), + re.compile(r"<.+>powered.by.1024.cms<.+.>", re.I), + re.compile(r"1024.cms", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/360.py b/lib/plugins/360.py new file mode 100644 index 0000000..65ebe35 --- /dev/null +++ b/lib/plugins/360.py @@ -0,0 +1,23 @@ +import re + + +__product__ = "360 Web Manager" +__description__ = ( + "1024 is one of a few CMS's leading the way with the " + "implementation of the AJAX technology into all its " + "areas. This includes dynamic adminstration and user " + "interaction. 1024 offers you to ability to set up your " + "own community forums, download area, news posts, member management and more." +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"powered.by.360.web.manager", re.I), + re.compile(r"360webmanager.software", re.I), + re.compile(r"http(s)?.\S{2}(www.)?360webmanager(.com)?", re.I), + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/3com.py b/lib/plugins/3com.py new file mode 100644 index 0000000..baf07a4 --- /dev/null +++ b/lib/plugins/3com.py @@ -0,0 +1,25 @@ +import re + + +__product__ = "3COM-NBX" +__description__ = ( + "3COM NBX phone system. The NBX NetSet utility is a web " + "interface in which you configure and manage the NBX " + "system. NBX systems present the NBX NetSet utility " + "through an embedded web server that is integrated in system software." +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"nbx.netset", re.I), + re.compile(r"<.+>nbx.netset<.+.>", re.I), + re.compile(r"3com.corporation", re.I), + re.compile(r"nbx.corporation", re.I), + re.compile(r"http(s)?.//(www.)?nbxhelpdesk.com", re.I), + re.compile(r"nbx.help.desk", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/3dcart.py b/lib/plugins/3dcart.py new file mode 100644 index 0000000..2993e7c --- /dev/null +++ b/lib/plugins/3dcart.py @@ -0,0 +1,23 @@ +import re + +import lib.core.common + + +__product__ = "3dcart" +__description__ = ( + "The 3dcart Shopping Cart Software is a complete e-commerce solution for anyone." +) + + +def search(html, **kwargs): + html = str(html) + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r"3dcart.stats", re.I), + re.compile(r"/3dvisit/", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.SET_COOKIE, "")) is not None: + return True diff --git a/lib/plugins/4d.py b/lib/plugins/4d.py new file mode 100644 index 0000000..49e86af --- /dev/null +++ b/lib/plugins/4d.py @@ -0,0 +1,19 @@ +import re + +import lib.core.common + + +__product__ = "4D" +__description__ = ( + "4D web application deployment server" +) + + +def search(html, **kwargs): + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r"/^4D_v[\d]{1,2}(_SQL)?\/([\d\.]+)$/", re.I), + ) + for plugin in plugin_detection_schema: + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.SERVER, "")) is not None: + return True diff --git a/lib/plugins/4images.py b/lib/plugins/4images.py new file mode 100644 index 0000000..9de508c --- /dev/null +++ b/lib/plugins/4images.py @@ -0,0 +1,23 @@ +import re + + +__product__ = "4images" +__description__ = ( + "4images is a powerful web-based image gallery " + "management system. Features include comment system, " + "user registration and management, password protected " + "administration area with browser-based upload and HTML " + "templates for page layout and design." +) + + +def search(html, **kwargs): + html = str(html) + plugin_protection_schema = ( + re.compile(r"http(s)?.//(www.)?4homepages.\w+", re.I), + re.compile(r"powered.by.<.+>4images<.+.>", re.I), + re.compile(r"powered.by.4images", re.I) + ) + for plugin in plugin_protection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/68classified.py b/lib/plugins/68classified.py new file mode 100644 index 0000000..841143c --- /dev/null +++ b/lib/plugins/68classified.py @@ -0,0 +1,19 @@ +import re + + +__product__ = "68-Classifieds-Script" +__description__ = ( + "68 Classifieds Script - Requires PHP" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"http(s)?.//(www.)?68classifieds.com", re.I), + re.compile(r"68.classifieds.script", re.I), + re.compile(r"68.classifieds", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/__init__.py b/lib/plugins/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/plugins/aardvark.py b/lib/plugins/aardvark.py new file mode 100644 index 0000000..cb0694c --- /dev/null +++ b/lib/plugins/aardvark.py @@ -0,0 +1,19 @@ +import re + + +__product__ = "Aardvark-Topsites-PHP" +__description__ = ( + "Aardvark Topsites PHP is a free topsites script built on PHP and MySQL" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"powered.by.aardvark.topsites.php", re.I), + re.compile(r"aardvark.topsites.php", re.I), + re.compile(r"http(s)?.//(www.)?aardvarktopsitesphp.com", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/abyss.py b/lib/plugins/abyss.py new file mode 100644 index 0000000..081b207 --- /dev/null +++ b/lib/plugins/abyss.py @@ -0,0 +1,20 @@ +import re + +import lib.core.common + + +__product__ = "Abyss-Web-Server" +__description__ = ( + "Abyss Web Server is a compact web server available " + "for Windows, Mac OS X, Linux, and FreeBSD operating systems" +) + + +def search(html, **kwargs): + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r"/^Abyss\/([^\s]+)/", re.I), + ) + for plugin in plugin_detection_schema: + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.SERVER, "")) is not None: + return True diff --git a/lib/plugins/accellion.py b/lib/plugins/accellion.py new file mode 100644 index 0000000..f4fb2cc --- /dev/null +++ b/lib/plugins/accellion.py @@ -0,0 +1,22 @@ +import re + +import lib.core.common + + +__product__ = "Accellion-Secure-File-Transfer" +__description__ = ( + "Accellion Secure File Transfer (SFT)" +) + + +def search(html, **kwargs): + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r"/sfcurl.deleted./", re.I), + re.compile(r"/\/courier\/[\d]+@\/mail_user_login\.html\?$/", re.I), + ) + for plugin in plugin_detection_schema: + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.LOCATION, "")) is not None: + return True + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.SET_COOKIE, "")) is not None: + return True diff --git a/lib/plugins/atomfeed.py b/lib/plugins/atomfeed.py new file mode 100644 index 0000000..49e736c --- /dev/null +++ b/lib/plugins/atomfeed.py @@ -0,0 +1,19 @@ +import re + + +__product__ = "Atom Feed" +__description__ = ( + "Atom Feeds allow software programs to check for updates published on a website" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"bmc.\w+.remedy.\w+.mid.\w+.tier.\w+.\d+.\d+...login<.+.>", re.I), + re.compile(r".bmc.remedy.action.request.system.", re.I), + re.compile(r"class.[\'\"]?caption[\'\"]?.\W{1,3}\w+..[0-9]{4}.bmc.software[,]?.inc[orporated]?.", re.I) + ) \ No newline at end of file diff --git a/lib/plugins/bomgar.py b/lib/plugins/bomgar.py new file mode 100644 index 0000000..af5a608 --- /dev/null +++ b/lib/plugins/bomgar.py @@ -0,0 +1,27 @@ +import re + +import lib.core.common + + +__product__ = "Bomgar" +__description__ = ( + "Bomgar simplifies support by letting technicians control " + "remote computers, servers, smartphones and network devices " + "over the internet or network. With Bomgar, a support rep can " + "see what customers see or control their computers for support" +) + + +def search(html, **kwargs): + html = str(html) + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(".bomgar.", re.I), + re.compile(r"http(s)?.//(www.)?bomgar.com", re.I), + re.compile(r"alt.[\'\"]?remote.support.by.bomgar[\'\"]?", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.SERVER, "")) is not None: + return True + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/googleapi.py b/lib/plugins/googleapi.py new file mode 100644 index 0000000..8166217 --- /dev/null +++ b/lib/plugins/googleapi.py @@ -0,0 +1,20 @@ +import re + + +__product__ = "Google API" +__description__ = ( + "Google APIs is a set of application programming interfaces (APIs) developed by Google " + "which allow communication with Google Services and their integration to other services" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"src.[\'\"]?http(s)?.//googleapis.com", re.I), + re.compile(r"src.[\'\"]?http(s)?.//ajax.googleapis.com", re.I), + re.compile(r".googleapis.", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/html5.py b/lib/plugins/html5.py new file mode 100644 index 0000000..0ef8a3a --- /dev/null +++ b/lib/plugins/html5.py @@ -0,0 +1,20 @@ +import re + + +__product__ = "HTML5" +__description__ = ( + "HTML5 is a markup language used for structuring and presenting " + "content on the World Wide Web. It is the fifth and current major " + "version of the HTML standard." +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r".html5.", re.I), + re.compile(r"\bhtml\d+", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/ihtml.py b/lib/plugins/ihtml.py new file mode 100644 index 0000000..8ff8f26 --- /dev/null +++ b/lib/plugins/ihtml.py @@ -0,0 +1,25 @@ +import re + +import lib.core.common + + +__product__ = "iHTML" +__description__ = ( + "iHTML is a server side internet/web programming and scripting " + "language in used by thousands of sites worldwide to deliver " + "cost effective dynamic database driven web sites" +) + + +def search(html, **kwargs): + html = str(html) + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r".ihtml.", re.I), + re.compile(r"\bihtml.", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.X_POWERED_BY, "")) is not None: + return True diff --git a/lib/plugins/jquery.py b/lib/plugins/jquery.py new file mode 100644 index 0000000..05e2132 --- /dev/null +++ b/lib/plugins/jquery.py @@ -0,0 +1,20 @@ +import re + + +__product__ = "JQuery" +__description__ = ( + "A fast, concise, JavaScript that simplifies how to traverse " + "HTML documents, handle events, perform animations, and add AJAX" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"src.[\'\"]?http(s)?.//ajax.googleapis.com.ajax.libs.jquery.\d.\d.\d", re.I), + re.compile(r".jquery.", re.I), + re.compile(r"jquery.min.js", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/opengraph.py b/lib/plugins/opengraph.py new file mode 100644 index 0000000..03cd086 --- /dev/null +++ b/lib/plugins/opengraph.py @@ -0,0 +1,25 @@ +import re + + +__product__ = "Open-Graph-Protocol" +__description__ = ( + "The Open Graph protocol enables you to integrate " + "your Web pages into the social graph. It is currently " + "designed for Web pages representing profiles of real-world " + "things. Things like movies, sports teams, celebrities, " + "and restaurants. Including Open Graph tags on your Web page, " + "makes your page equivalent to a Facebook Page" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r".og.title.", re.I), + re.compile(".fb.admins.", re.I), + re.compile(r".og.type.", re.I), + re.compile(r".fb.app.id.", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/plugins/openxchange.py b/lib/plugins/openxchange.py new file mode 100644 index 0000000..729567f --- /dev/null +++ b/lib/plugins/openxchange.py @@ -0,0 +1,24 @@ +import re + +import lib.core.common + + +__product__ = "Open-Xchange-Server" +__description__ = ( + "Open Xchange Mail Server" +) + + +def search(html, **kwargs): + html = str(html) + headers = kwargs.get("headers", None) + plugin_detection_schema = ( + re.compile(r"open.xchange.server", re.I), + re.compile(r"javascript.to.access.the.open.xchange.server", re.I), + re.compile(r"/^http(s)?://(www.)?[^\/]+\/ox6\/ox\.html$/", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True + if plugin.search(headers.get(lib.core.common.HTTP_HEADER.LOCATION, "")) is not None: + return True diff --git a/lib/plugins/rssfeed.py b/lib/plugins/rssfeed.py new file mode 100644 index 0000000..b4d02af --- /dev/null +++ b/lib/plugins/rssfeed.py @@ -0,0 +1,20 @@ +import re + + +__product__ = "RSS Feed" +__description__ = ( + "RSS (Rich Site Summary) is a type of web feed which allows " + "users to access updates to online content in a standardized, " + "computer-readable format" +) + + +def search(html, **kwargs): + html = str(html) + plugin_detection_schema = ( + re.compile(r"type.[\'\"]?application/rss.xml[\'\"]?", re.I), + re.compile(r"title.[\'\"]?rss.feed[\'\"]?", re.I) + ) + for plugin in plugin_detection_schema: + if plugin.search(html) is not None: + return True diff --git a/lib/tamper_scripts/multispace2comment_encode.py b/lib/tamper_scripts/multispace2comment_encode.py new file mode 100644 index 0000000..e69de29