Skip to content

Commit 4327472

Browse files
authoredSep 28, 2017
Merge pull request #43 from ztgrace/development
Merging 1.0.2
2 parents c4e725f + 8d242b0 commit 4327472

15 files changed

+46
-31
lines changed
 

‎.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ addons:
1414
- unixodbc-dev
1515
install:
1616
- pip install -r requirements.txt
17+
- pip install -r dev-requirements.txt
1718
- pip install coverage
1819
services:
1920
- redis-server

‎changeme/core.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ def check_for_interrupted_scan(config):
393393
scanners = RedisQueue('scanners')
394394
fp_qsize = 0
395395
scanners_qsize = 0
396-
logger.warning('scanners: %s, fp: %s' % (scanners_qsize, fp_qsize))
396+
logger.debug('scanners: %s, fp: %s' % (scanners_qsize, fp_qsize))
397397
try:
398398
fp_qsize = fp.qsize()
399399
except redis.exceptions.ConnectionError:
@@ -471,7 +471,7 @@ def check_version():
471471
logger.debug("Unable to retrieve latest changeme version.")
472472
return
473473

474-
latest = res.text.split(' = ')[1].replace("'", '')
474+
latest = res.text.split('\n')[0].split(' = ')[1].replace("'", '')
475475
if not version.__version__ == latest:
476476
logger.warning('Your version of changeme is out of date. Local version: %s, Latest: %s' % (str(version.__version__), latest))
477477

‎changeme/scan_engine.py

-3
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,6 @@ def _build_targets(self):
150150

151151
fingerprints = list(set(fingerprints)) # unique the HTTP fingerprints
152152

153-
for f in fingerprints:
154-
self.logger.debug("fingerprints: %s" % f.target)
155-
156153
# Add any protocols if they were included in the targets
157154
for t in self.targets:
158155
if t.protocol and t.protocol not in self.config.protocols:

‎changeme/scanners/ftp.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def __init__(self, cred, target, username, password, config):
88

99
def _check(self):
1010
ftp = ftplib.FTP()
11-
ftp.connect(str(self.target.host), self.target.port)
11+
ftp.connect(self.target.host, self.target.port)
1212

1313
ftp.login(self.username, self.password)
1414
evidence = ftp.retrlines('LIST')

‎changeme/scanners/http_fingerprint.py

-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def __hash__(self):
3232
return hash(str(self.target) + str(self.headers) + str(self.cookies))
3333

3434
def __eq__(self, other):
35-
#if self.target == other.target and self.url == other.url and self.port == other.port and self.ssl == other.ssl and self.headers == other.headers and self.cookies == other.cookies:
3635
return self.__dict__ == other.__dict__
3736

3837
def fingerprint(self):
@@ -163,7 +162,6 @@ def build_fingerprints(targets, creds, config):
163162
if not t.port:
164163
t.port = c['default_port']
165164
t.url = url
166-
logger.debug(url)
167165

168166
hfp = HttpFingerprint(
169167
t,

‎changeme/scanners/scanner.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,14 @@
55

66
class Scanner(object):
77
def __init__(self, cred, target, config, username, password):
8+
self.logger = logging.getLogger('changeme')
89
self.cred = cred
910
self.target = target
10-
if not self.target.port:
11-
self.port = self.target.port
12-
else:
13-
self.port = self.cred['default_port']
11+
if self.target.port is None:
12+
self.target.port = self.cred['default_port']
1413
self.config = config
1514
self.username = username
1615
self.password = password
17-
self.logger = logging.getLogger('changeme')
1816

1917
def __hash__(self):
2018
return id(self)
@@ -54,7 +52,7 @@ def check_success(self):
5452
'evidence': evidence}
5553

5654
except Exception as e:
57-
self.logger.info('Invalid %s default cred %s:%s at %s' % (self.cred['name'], self.username, self.password, '%s:%s' % (self.target, str(self.port))))
55+
self.logger.info('Invalid %s default cred %s:%s at %s' % (self.cred['name'], self.username, self.password, str(self.target)))
5856
self.logger.debug('%s Exception: %s' % (type(e).__name__, str(e)))
5957
return False
6058

‎changeme/scanners/ssh.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def __init__(self, cred, target, username, password, config):
1111
def _check(self):
1212
c = paramiko.SSHClient()
1313
c.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) # ignore unknown hosts
14-
c.connect(hostname=str(self.target), username=self.username, password=self.password)
14+
c.connect(hostname=self.target.host, port=self.target.port, username=self.username, password=self.password)
1515
stdin, stdout, stderr = c.exec_command('uname -a')
1616
evidence = stdout.readlines()[0]
1717
c.close()

‎changeme/scanners/ssh_key.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def _check(self):
1919

2020
c = paramiko.SSHClient()
2121
c.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) # ignore unknown hosts
22-
c.connect(hostname=str(self.target), username=self.username, pkey=key)
22+
c.connect(hostname=self.target.host, port=self.target.port, username=self.username, pkey=key)
2323
stdin, stdout, stderr = c.exec_command('uname -a')
2424
evidence = stdout.readlines()[0]
2525
c.close()

‎changeme/target.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
import logging
33
from netaddr import IPNetwork
44
from netaddr.core import AddrFormatError
5+
import re
56
from os.path import isfile
67
import shodan
7-
import re
8+
import socket
89

910
class Target(object):
1011
def __init__(self, host=None, port=None, protocol=None, url=None):
@@ -20,6 +21,7 @@ def __init__(self, host=None, port=None, protocol=None, url=None):
2021
self.port = None
2122
self.protocol = protocol
2223
self.url = url
24+
self.ip = None
2325

2426
def __eq__(self, other):
2527
return self.__dict__ == other.__dict__
@@ -47,6 +49,17 @@ def __str__(self):
4749

4850
return str(target)
4951

52+
def get_ip(self):
53+
if self.ip is None:
54+
regex = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
55+
result = regex.match(self.host)
56+
if not result:
57+
self.ip = socket.gethostbyname(self.host)
58+
else:
59+
self.ip = self.host
60+
61+
return self.ip
62+
5063
@staticmethod
5164
def parse_target(target):
5265
logger = logging.getLogger('changeme')

‎changeme/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '1.0.1'
1+
__version__ = '1.0.2'
22
contributors = [
33
"ztgrace",
44
"the-c0d3r",

‎creds/snmp/common.yml

-4
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ auth:
3030
password: private
3131
- username:
3232
password: all
33-
- username:
34-
password: public
3533
- username:
3634
password: ANYCOM
3735
- username:
@@ -124,8 +122,6 @@ auth:
124122
password: password
125123
- username:
126124
password: pr1v4t3
127-
- username:
128-
password: private
129125
- username:
130126
password: Private
131127
- username:

‎creds/snmp/public_private.yml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
auth:
2+
credentials:
3+
- username:
4+
password: public
5+
- username:
6+
password: private
7+
category: snmp
8+
default_port: 161
9+
name: publicprivate
10+
contributor: ztgrace

‎dev-requirements.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mock
2+
mock-ssh-server
3+
responses==0.7.0

‎requirements.txt

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ python-libnmap
1414
pyyaml
1515
redis
1616
requests
17-
responses
1817
selenium
1918
shodan
2019
sqlalchemy

‎tests/snmp.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ def reset_handlers():
1414

1515
snmp_args = deepcopy(cli_args)
1616
snmp_args['protocols'] = 'snmp'
17-
snmp_args['name'] = 'apc'
17+
snmp_args['name'] = 'publicprivate'
1818
snmp_args['target'] = 'demo.snmplabs.com'
1919
@mock.patch('argparse.ArgumentParser.parse_args', return_value=argparse.Namespace(**snmp_args))
2020
def test_snmp(mock_args):
21-
try:
22-
reset_handlers()
23-
core.main()
24-
except:
25-
pass
21+
reset_handlers()
22+
se = core.main()
23+
assert se.found_q.qsize() == 2
2624

2725

2826
snmp_args = deepcopy(cli_args)
29-
snmp_args['name'] = 'apc'
27+
snmp_args['name'] = 'publicprivate'
3028
snmp_args['target'] = 'snmp://demo.snmplabs.com'
3129
@mock.patch('argparse.ArgumentParser.parse_args', return_value=argparse.Namespace(**snmp_args))
3230
def test_snmp_proto(mock_args):
3331
reset_handlers()
34-
core.main()
32+
se = core.main()
33+
assert se.found_q.qsize() == 2
34+

0 commit comments

Comments
 (0)
Please sign in to comment.