Skip to content

Commit be655d8

Browse files
committed
Version 1.0.4 Update
1 parent 7022037 commit be655d8

24 files changed

+528
-54
lines changed

CHANGELOG

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Version 1.0.4 [17-07-2018]
2+
- added joomla deep scan and version detection
3+
- minor core update
4+
- removed some junk code from wordpress deepscan
15
Version 1.0.3 [06-07-2018]
26
- clear-result argument added
37
- fixed all bruteforce modules

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<p align='center'>
22
<img src="https://i.imgur.com/n2U6nVH.png" alt="Logo"> <br>
3-
<img src="https://img.shields.io/badge/Version-1.0.2%20Beta-brightgreen.svg?style=style=flat-square" alt="version">
3+
<img src="https://img.shields.io/badge/Version-1.0.4-brightgreen.svg?style=style=flat-square" alt="version">
44
<img src="https://img.shields.io/badge/python-3-orange.svg?style=style=flat-square" alt="Python Version">
55
<img src="https://img.shields.io/aur/license/yaourt.svg?style=style=flat-square" alt="License">
66
</p>
@@ -10,6 +10,7 @@
1010
1111
## Release History
1212
```
13+
- Version 1.0.4 [17-07-2018]
1314
- Version 1.0.3 [06-07-2018]
1415
- Version 1.0.2 [06-07-2018]
1516
- Version 1.0.1 [19-06-2018]
@@ -23,6 +24,7 @@
2324
- Detects Version
2425
- Detects Users (3 Detection Methods)
2526
- Looks for Version Vulnerabilities and much more!
27+
- Advance Joomla Scans
2628
- Modular bruteforce system
2729
- Use pre made bruteforce modules or create your own and integrate with it
2830

VersionDetect/detect.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@ def start(id, url, ua, ga, source):
22
if id == "wp":
33
# trust me more will be added soon
44
import VersionDetect.wp as wpverdetect
5-
wpver = wpverdetect.start(id, url, ua, ga, source):
5+
wpver = wpverdetect.start(id, url, ua, ga, source)
66
return wpver
7+
elif id == 'joom':
8+
import VersionDetect.joom as joomverdetect
9+
joomver = joomverdetect.start(id, url, ua, ga, source)
10+
return joomver

VersionDetect/joom.py

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
## Joomla version detection
2+
## Rev 1
3+
4+
import cmseekdb.basic as cmseek
5+
import re
6+
def start(id, url, ua, ga, source):
7+
version = '0'
8+
cmseek.info('detecting joomla version')
9+
10+
# version detection stats here
11+
if ga == '1':
12+
# Detect version via generator meta tag
13+
cmseek.statement('Detecting version using generator meta tag [Method 1 of 4]')
14+
regex_1 = re.findall(r'content=(?:\"|\')Joomla! (.*?) - Open Source Content Management(?:\"|\')', source)
15+
if regex_1 != []:
16+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + regex_1[0] + cmseek.cln)
17+
return regex_1[0]
18+
19+
if version == '0':
20+
# Detections using the xml files
21+
xml_files = ['administrator/manifests/files/joomla.xml','language/en-GB/en-GB.xml','administrator/components/com_content/content.xml','administrator/components/com_plugins/plugins.xml','administrator/components/com_media/media.xml','mambots/content/moscode.xml']
22+
cmseek.statement('Detecting version using xml files [Method 2 of 4]')
23+
for xml_file in xml_files:
24+
xml_source = cmseek.getsource(url + '/' + xml_file, ua)
25+
if xml_source[0] == '1':
26+
regex_2 = re.findall(r'<version>(.*?)</version>', xml_source[1])
27+
if regex_2 != []:
28+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + regex_2[0] + cmseek.cln)
29+
return regex_2[0]
30+
31+
# Detection method 3
32+
if version == '0':
33+
other_files = ['language/en-GB/en-GB.xml','templates/system/css/system.css','media/system/js/mootools-more.js','language/en-GB/en-GB.ini','htaccess.txt','language/en-GB/en-GB.com_media.ini']
34+
cmseek.statement('Detecting version using advanced fingerprinting [Method 3 of 4]')
35+
for file in other_files:
36+
file_source = cmseek.getsource(url + '/' + file, ua)
37+
if file_source[0] == '1':
38+
# Regex find
39+
regex_3 = re.findall(r'<meta name="Keywords" content="(.*?)">', file_source[1])
40+
if regex_3 != []:
41+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + regex_3[0] + cmseek.cln)
42+
return regex_3[0]
43+
44+
# Joomla version 1.6
45+
j16 = ['system.css 20196 2011-01-09 02:40:25Z ian','MooTools.More={version:"1.3.0.1"','en-GB.ini 20196 2011-01-09 02:40:25Z ian','en-GB.ini 20990 2011-03-18 16:42:30Z infograf768','20196 2011-01-09 02:40:25Z ian']
46+
for j in j16:
47+
rsearch = re.search(j,file_source[1])
48+
if rsearch is not None:
49+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + '1.6' + cmseek.cln)
50+
return '1.6'
51+
52+
# Joomla version 1.5
53+
j15 = ['Joomla! 1.5','MooTools={version:\'1.12\'}','11391 2009-01-04 13:35:50Z ian']
54+
for j in j15:
55+
rsearch = re.search(j,file_source[1])
56+
if rsearch is not None:
57+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + '1.5' + cmseek.cln)
58+
return '1.5'
59+
60+
# Joomla version 1.7
61+
j17 = ['system.css 21322 2011-05-11 01:10:29Z dextercowley','MooTools.More={version:"1.3.2.1"','22183 2011-09-30 09:04:32Z infograf768','21660 2011-06-23 13:25:32Z infograf768']
62+
for j in j17:
63+
rsearch = re.search(j,file_source[1])
64+
if rsearch is not None:
65+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + '1.7' + cmseek.cln)
66+
return '1.7'
67+
68+
# Joomla version 1.0
69+
j10 = ['(Copyright (C) 2005 - 200(6|7))','47 2005-09-15 02:55:27Z rhuk','423 2005-10-09 18:23:50Z stingrey','1005 2005-11-13 17:33:59Z stingrey','1570 2005-12-29 05:53:33Z eddieajau','2368 2006-02-14 17:40:02Z stingrey','1570 2005-12-29 05:53:33Z eddieajau','4085 2006-06-21 16:03:54Z stingrey','4756 2006-08-25 16:07:11Z stingrey','5973 2006-12-11 01:26:33Z robs','5975 2006-12-11 01:26:33Z robs']
70+
for j in j10:
71+
rsearch = re.search(j,file_source[1])
72+
if rsearch is not None:
73+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + '1.0' + cmseek.cln)
74+
return '1.0'
75+
76+
# Joomla version 2.5
77+
j25 = ['Copyright (C) 2005 - 2012 Open Source Matters','MooTools.More={version:"1.4.0.1"']
78+
for j in j25:
79+
rsearch = re.search(j,file_source[1])
80+
if rsearch is not None:
81+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + '2.5' + cmseek.cln)
82+
return '2.5'
83+
84+
# Detection using README file
85+
if version == '0':
86+
cmseek.statement('Detecting version from README file [Method 4 of 4]')
87+
readme_file = url + '/README.txt'
88+
readme_source = cmseek.getsource(readme_file, ua)
89+
if readme_source[0] == '1':
90+
regex_4 = re.findall(r'package to version (.*?)', readme_source[1])
91+
if regex_4 != []:
92+
cmseek.success('Joomla version detected, version: ' + cmseek.bold + regex_4[0] + cmseek.cln)
93+
return regex_4[0]
94+
95+
# if we fail ¯\_(ツ)_/¯
96+
return version

VersionDetect/wp.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## WordPress version detection
2+
## Rev 1
3+
14
import cmseekdb.basic as cmseek
25
import re
36

cmseek.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
parser.add_argument('-v', '--verbose', help="increase output verbosity", action="store_true")
2424
parser.add_argument("--version", help="Show CMSeeK version", action="store_true")
2525
parser.add_argument("--update", help="Update CMSeeK", action="store_true")
26-
parser.add_argument("--random-agent", help="Use a random user agent", action="store_true")
26+
parser.add_argument('-r', "--random-agent", help="Use a random user agent", action="store_true")
2727
parser.add_argument('--user-agent', help='Specify custom user agent')
2828
parser.add_argument('-u', '--url', help='Target Url')
2929
parser.add_argument('--clear-result', action='store_true')

cmseekdb/basic.py

+29-19
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def banner (txt):
6868
print(whitebg + black + bold)
6969
print(" [+] " + txt + " [+] " + cln)
7070
else:
71-
print(cln + bold + lbluebg + black + " Author: " + cln + bold + " https://twitter.com/r3dhax0r" + blackbg + white + "\n GitHub: " + cln + bold + " https://github.com/Tuhinshubhra \n" + cln + bold + violetbg + white + " Group : " + cln + bold + " Virtual Unvoid Defensive @virtuallyunvoid" + cln + '\n')
71+
print(cln + bold + lbluebg + black + " Author: " + cln + bold + " https://twitter.com/r3dhax0r" + blackbg + white + "\n GitHub: " + cln + bold + " https://github.com/Tuhinshubhra \n" + cln + '\n')
7272
print(cln + "\n")
7373
return
7474

@@ -102,22 +102,22 @@ def help():
102102
# The help screen
103103
print(
104104
"""
105-
CMSeeK Version {0}
106-
Coded By: @r3dhax0r
107-
108-
Usage: cmseek.py (for a guided scanning) OR cmseek.py -u <target_url> [...]
109-
110-
Arguments:
111-
112-
-u URL, --url URL Target Url
113-
-h, --help Show this help message and exit
114-
-v, --verbose Increase output verbosity
115-
--version Show CMSeeK version and exit
116-
--update Update CMSeeK (Requires git)
117-
--random-agent Use a random user agent
118-
--user-agent USER_AGENT Specify custom user agent
119-
--clear-result Delete all the scan result
120-
""".format(cmseek_version))
105+
CMSeeK Version {0}
106+
Coded By:{1} @r3dhax0r {2}
107+
108+
Usage: cmseek.py (for a guided scanning) OR cmseek.py -u <target_url> [...]
109+
110+
Arguments:
111+
112+
-u URL, --url URL Target Url
113+
-h, --help Show this help message and exit
114+
-v, --verbose Increase output verbosity
115+
--version Show CMSeeK version and exit
116+
--update Update CMSeeK (Requires git)
117+
-r, --random-agent Use a random user agent
118+
--user-agent USER_AGENT Specify custom user agent
119+
--clear-result Delete all the scan result
120+
""".format(cmseek_version,red, cln))
121121
bye()
122122

123123
def signal_handler(signal, frame):
@@ -146,7 +146,7 @@ def statement(msg):
146146
print("[+] " + msg)
147147

148148
def error(msg):
149-
print(bold + red + "[] " + msg)
149+
print(bold + red + "[x] " + msg) # switched to x from ❌ ..
150150

151151
def warning(msg):
152152
print(bold + yellow + "[!] " + cln + msg)
@@ -433,7 +433,7 @@ def getsource(url, ua): ## (url, useragent) return type: ({0/1/2},{error/source
433433
)
434434
cj = CookieJar()
435435
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
436-
with opener.open(ckreq, timeout=4) as response:
436+
with opener.open(ckreq, timeout=8) as response:
437437
scode = response.read().decode()
438438
headers = str(response.info())
439439
rurl = response.geturl()
@@ -444,6 +444,16 @@ def getsource(url, ua): ## (url, useragent) return type: ({0/1/2},{error/source
444444
r = ['2', e, '', ''] ## 'error code', 'error message', 'empty'
445445
return r
446446

447+
def check_url(url,ua):
448+
request = urllib.request.Request(url)
449+
request.add_header('User-Agent', ua)
450+
request.get_method = lambda: 'HEAD'
451+
try:
452+
urllib.request.urlopen(request)
453+
return '1'
454+
except urllib.request.HTTPError:
455+
return '0'
456+
447457
def wpbrutesrc(url, user, pwd):
448458
redirecto = url + '/wp-admin/'
449459
url = url + '/wp-login.php'

cmseekdb/cmss.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@
153153
joom = {
154154
'name':'Joomla',
155155
'url':'https://joomla.org',
156-
'vd':'0',
157-
'deeps':'0'
156+
'vd':'1',
157+
'deeps':'1'
158158
}
159159
oc = {
160160
'name':'OpenCart',

cmseekdb/core.py

+17
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import importlib
77
from datetime import datetime
88

9+
import VersionDetect.detect as version_detect # Version detection
910
import deepscans.core as advanced # Deep scan and Version Detection functions
1011
import cmseekdb.basic as cmseek # All the basic functions
1112
import cmseekdb.sc as source # Contains function to detect cms from source code
@@ -49,9 +50,13 @@ def main_proc(site,cua):
4950
else:
5051
cmseek.statement("CMS Version is detectable, detecting CMS Version")
5152
### Detect version
53+
cms_version = version_detect.start(c1[1], site, cua, '1', scode)
5254
print('\n')
5355
cmseek.result('',"CMS Name: " + cmseek.bold + cmseek.fgreen + cka['name'] + cmseek.cln)
5456
cmseek.update_log('cms_name',cka['name']) # update log
57+
if cms_version != '0':
58+
cmseek.result('',"CMS Version: " + cmseek.bold + cmseek.fgreen + cms_version + cmseek.cln)
59+
cmseek.update_log('cms_version',cms_version) # update log
5560
cmseek.result('',"CMS Link: " + cmseek.bold + cmseek.fgreen + cka['url'] + cmseek.cln)
5661
cmseek.update_log('cms_url',cka['url']) # update log
5762
# return
@@ -79,9 +84,13 @@ def main_proc(site,cua):
7984
else:
8085
cmseek.statement("CMS Version is detectable, detecting CMS Version")
8186
### Detect version
87+
cms_version = version_detect.start(c21[1], site, cua, '1', scode)
8288
print('\n')
8389
cmseek.result('',"CMS Name: " + cmseek.bold + cmseek.fgreen + cka['name'] + cmseek.cln)
8490
cmseek.update_log('cms_name',cka['name']) # update log
91+
if cms_version != '0':
92+
cmseek.result('',"CMS Version: " + cmseek.bold + cmseek.fgreen + cms_version + cmseek.cln)
93+
cmseek.update_log('cms_version',cms_version) # update log
8594
cmseek.result('',"CMS Link: " + cmseek.bold + cmseek.fgreen + cka['url'] + cmseek.cln)
8695
cmseek.update_log('cms_url',cka['url']) # update log
8796
# return
@@ -107,10 +116,14 @@ def main_proc(site,cua):
107116
cmseek.update_log('cms_url',cka['url']) # update log
108117
else:
109118
cmseek.statement("CMS Version is detectable, detecting CMS Version")
119+
cms_version = version_detect.start(c22[1], site, cua, '1', scode)
110120
### Detect version
111121
print('\n')
112122
cmseek.result('',"CMS Name: " + cmseek.bold + cmseek.fgreen + cka['name'] + cmseek.cln)
113123
cmseek.update_log('cms_name',cka['name']) # update log
124+
if cms_version != '0':
125+
cmseek.result('',"CMS Version: " + cmseek.bold + cmseek.fgreen + cms_version + cmseek.cln)
126+
cmseek.update_log('cms_version',cms_version) # update log
114127
cmseek.result('',"CMS Link: " + cmseek.bold + cmseek.fgreen + cka['url'] + cmseek.cln)
115128
cmseek.update_log('cms_url',cka['url']) # update log
116129
return
@@ -139,11 +152,15 @@ def main_proc(site,cua):
139152
cmseek.result('',"CMS Link: " + cmseek.bold + cmseek.fgreen + cka['url'] + cmseek.cln)
140153
cmseek.update_log('cms_url',cka['url']) # update log
141154
else:
155+
cms_version = version_detect.start(c22[1], site, cua, '0', scode)
142156
cmseek.statement("CMS Version is detectable, detecting CMS Version")
143157
### Detect version
144158
print('\n')
145159
cmseek.result('',"CMS Name: " + cmseek.bold + cmseek.fgreen + cka['name'] + cmseek.cln)
146160
cmseek.update_log('cms_name',cka['name']) # update log
161+
if cms_version != '0':
162+
cmseek.result('',"CMS Version: " + cmseek.bold + cmseek.fgreen + cms_version + cmseek.cln)
163+
cmseek.update_log('cms_version',cms_version) # update log
147164
cmseek.result('',"CMS Link: " + cmseek.bold + cmseek.fgreen + cka['url'] + cmseek.cln)
148165
cmseek.update_log('cms_url',cka['url']) # update log
149166
return

cmseekdb/sc.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def generator(s): ## CMS Check using generator meta tags
7878
# Ametys CMS
7979
r = ['1','amcms']
8080
return r
81-
elif '<meta name="generator" content="Joomla! - Open Source Content Management' in hstring:
81+
elif '<meta name="generator" content="Joomla! - Open Source Content Management' in hstring or '<meta name="description" content="Joomla! - the dynamic portal engine and content management system"' in hstring:
8282
# Joomla
8383
r = ['1', 'joom']
8484
return r

cmseekdb/test.py

-3
This file was deleted.

current_version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.3
1+
1.0.4

deepscans/core.py

+4
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ def start(id, url, ua, ga, source):
33
# for now this is the only cms... but not for long!
44
import deepscans.wp.init as wpscan
55
wpscan.start(id, url, ua, ga, source)
6+
if id == 'joom':
7+
# told ya... not for long
8+
import deepscans.joom.init as joomscan
9+
joomscan.start(id, url, ua, ga, source)

deepscans/joom/__init__.py

Whitespace-only changes.

deepscans/joom/admin_finder.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import threading
2+
import cmseekdb.basic as cmseek
3+
4+
joom_admin_found = 0
5+
joom_admins = []
6+
7+
def check_admin(url,file,ua):
8+
global joom_admin_found, joom_admins
9+
file_check = cmseek.check_url(url + '/' + file, ua)
10+
if file_check == '1':
11+
cmseek.success('Admin login page found: ' + cmseek.bold + cmseek.fgreen + url + '/' + file + cmseek.cln)
12+
joom_admin_found += 1
13+
joom_admins.append(file)
14+
15+
def start(url, ua):
16+
admin_files = ['administrator','admin','panel','webadmin','modir','manage','administration','joomla/administrator','joomla/admin']
17+
threads = [threading.Thread(target=check_admin, args=(url, file ,ua)) for file in admin_files]
18+
for thread in threads:
19+
thread.start()
20+
for thread in threads:
21+
thread.join()
22+
23+
global joom_admin_found, joom_admins
24+
return [joom_admin_found, joom_admins]

0 commit comments

Comments
 (0)