Commit ce98f2bb authored by Elger Jonker's avatar Elger Jonker Committed by Johan Bloemberg

plain http scanner, modular reporting, bundle dependencies + added to config, single thread debug

parent fb588bbc
Google[[:space:]]Chrome[[:space:]]Framework filter=lfs diff=lfs merge=lfs -text
vendor/Google[[:space:]]Chrome.app/Contents/Versions/61.0.3163.100/Google[[:space:]]Chrome[[:space:]]Framework.framework/Versions/A/Google[[:space:]]Chrome[[:space:]]Framework filter=lfs diff=lfs merge=lfs -text
/vendor/
/.idea/
.DS_Store
configuration.php
......@@ -10,9 +9,10 @@ db.sqlite3
.cache
.coverage
htmlcov
failmap_admin/scanners/data/screenshots/*
failmap_admin/map/static/images/screenshots/*
trash.txt
todo.txt
error.log
db_backup_*.sqlite3
\ No newline at end of file
db_backup_*.sqlite3
failmap_admin/map/static/images/screenshots/*
failmap_admin/scanners/resources/output/dnsrecon/*
failmap_admin/scanners/resources/output/theHarvester/*
......@@ -59,3 +59,8 @@ Be sure to active the environment before starting development every time:
. venv/bin/activate
# Thanks to
This project is being maintained by the Internet Cleanup Foundation.
Special thanks to the SIDN Fonds for believing in this method of improving privacy.
Thanks to the many authors contributing to open software.
\ No newline at end of file
This diff is collapsed.
{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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"}
\ No newline at end of file
This diff is collapsed.
......@@ -277,7 +277,7 @@ $( document ).ready(function() {
orangepercentage: function() {
return (!this.data.data) ? "0%" :
roundTo(this.data.data.now["orange"] / this.data.data.now["total_organizations"] * 100, 2) + "%";
Math.floor(roundTo(this.data.data.now["orange"] / this.data.data.now["total_organizations"] * 100, 2)) + "%";
},
unknownpercentage: function() {
......@@ -305,7 +305,8 @@ $( document ).ready(function() {
methods: {
showReport: function (OrganizationID) {
jumptoreport();
showReportData(OrganizationID, $("#history")[0].value)
showReportData(OrganizationID, $("#history")[0].value);
domainsDebounced(OrganizationID, $("#history")[0].value);
},
humanize: function(date){
return new Date(date).humanTimeStamp()
......
......@@ -2,7 +2,9 @@ from django.contrib import admin
from jet.admin import CompactInline
from .models import (Endpoint, EndpointGenericScan, Screenshot, State, TlsQualysScan,
TlsQualysScratchpad)
TlsQualysScratchpad, Url)
from failmap_admin.map.determineratings import DetermineRatings, OrganizationRating, UrlRating
from failmap_admin.scanners.scanner_tls_qualys import ScannerTlsQualys
class TlsQualysScanAdminInline(CompactInline):
......@@ -38,19 +40,66 @@ class EndpointAdmin(admin.ModelAdmin):
inlines = [TlsQualysScanAdminInline]
save_as = True # Save as new is nice for duplicating endpoints.
actions = ['rate_url', 'scan_url']
def rate_url(self, request, queryset):
for endpoint in queryset:
dr = DetermineRatings()
dr.rate_url(url=endpoint.url)
self.message_user(request, "URL(s) have been rated")
def scan_url(self, request, queryset):
urls_to_scan = []
for endpoint in queryset:
urls_to_scan.append(endpoint.url.url)
s = ScannerTlsQualys()
s.scan(urls_to_scan)
self.message_user(request, "URL(s) have been scanned")
rate_url.short_description = "Rate (url)"
scan_url.short_description = "Scan (url)"
class TlsQualysScanAdmin(admin.ModelAdmin):
list_display = ('endpoint', 'qualys_rating', 'qualys_rating_no_trust',
'scan_date', 'rating_determined_on')
list_display = ('endpoint', 'qualys_rating', 'qualys_rating_no_trust', 'qualys_message',
'scan_moment', 'rating_determined_on')
search_fields = ('endpoint__url__url', 'qualys_rating', 'qualys_rating_no_trust',
'scan_date', 'rating_determined_on')
list_filter = ('endpoint', 'qualys_rating', 'qualys_rating_no_trust',
'scan_date', 'rating_determined_on')
'scan_date', 'rating_determined_on', 'qualys_message')
fields = ('endpoint', 'qualys_rating', 'qualys_rating_no_trust',
'rating_determined_on')
readonly_fields = ('scan_date', 'scan_time', 'scan_moment')
actions = ['rate_url', 'scan_url']
def rate_url(self, request, queryset):
for tlsqualysscan in queryset:
dr = DetermineRatings()
dr.rate_url(url=tlsqualysscan.endpoint.url)
self.message_user(request, "URL(s) have been rated")
def scan_url(self, request, queryset):
urls_to_scan = []
for tlsqualysscan in queryset:
urls_to_scan.append(tlsqualysscan.endpoint.url.url)
s = ScannerTlsQualys()
s.scan(urls_to_scan)
self.message_user(request, "URL(s) have been scanned")
rate_url.short_description = "Rate (url)"
scan_url.short_description = "Scan (url)"
class TlsQualysScratchpadAdmin(admin.ModelAdmin):
list_display = ('domain', 'when')
......@@ -62,7 +111,7 @@ class TlsQualysScratchpadAdmin(admin.ModelAdmin):
class ScreenshotAdmin(admin.ModelAdmin):
list_display = ('endpoint', 'domain', 'created_on', 'filename')
search_fields = ('endpoint', 'domain', 'created_on', 'filename')
search_fields = ('endpoint__url__url', 'domain', 'created_on', 'filename')
list_filter = ('endpoint', 'domain', 'created_on', 'filename')
fields = ('endpoint', 'domain', 'created_on', 'filename', 'width_pixels', 'height_pixels')
readonly_fields = ['created_on']
......@@ -79,7 +128,7 @@ class StateAdmin(admin.ModelAdmin):
class EndpointGenericScanAdmin(admin.ModelAdmin):
list_display = ('endpoint', 'type', 'domain', 'rating',
'explanation', 'last_scan_moment', 'rating_determined_on')
search_fields = ('endpoint', 'type', 'domain', 'rating',
search_fields = ('endpoint__url__url', 'type', 'domain', 'rating',
'explanation', 'last_scan_moment', 'rating_determined_on')
list_filter = ('endpoint', 'type', 'domain', 'rating',
'explanation', 'last_scan_moment', 'rating_determined_on')
......
......@@ -21,7 +21,9 @@ class Command(BaseCommand):
# https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/
def handle(self, *args, **options):
organisations = Organization.objects.all().filter(twitter_handle__isnull=True)
null = Organization.objects.all().filter(twitter_handle__isnull=True)
empty = Organization.objects.all().filter(twitter_handle="")
organisations = list(null) + list(empty)
# todo: you can of course just ask duckduckgo
try:
......@@ -29,8 +31,9 @@ class Command(BaseCommand):
print("Twitter gemeente %s" % organisation.name)
twitter_handle = input("Type the twitter handle, including the @:")
print("U typed the following exploit: %s" % twitter_handle)
organisation.twitter_handle = twitter_handle
organisation.save()
if twitter_handle:
organisation.twitter_handle = twitter_handle
organisation.save()
except KeyboardInterrupt:
# a nice suprise when getting suicidal entering data...
trollface = """
......
......@@ -19,9 +19,13 @@ class Command(BaseCommand):
help = 'Create a screenshot'
def handle(self, *args, **options):
Command.make_new_screenshots()
logger.debug("Sleeping for half a day.")
sleep(43200) # sleep half a day
try:
while True:
Command.make_new_screenshots()
logger.debug("Sleeping for half a day.")
sleep(43200) # sleep half a day
except KeyboardInterrupt:
logger.debug("ALL DONE!")
@staticmethod
def make_new_screenshots():
......@@ -29,13 +33,16 @@ class Command(BaseCommand):
one_month_ago = datetime.now(pytz.utc) - timedelta(days=31)
# never had a screenshot or has a screenshot older than a month
eps = Endpoint.objects.all().filter(is_dead=False,
url__not_resolvable=False).filter(
(Q(screenshot__isnull=True) |
Q(screenshot__created_on__lt=one_month_ago))) # this condition is incorrect.
# never had a screenshot or only has screenshots older than a month
no_screenshots = Endpoint.objects.all().filter(is_dead=False,
url__not_resolvable=False,
screenshot__isnull=True)
outdated_screenshots = Endpoint.objects.all().filter(is_dead=False,
url__not_resolvable=False,
screenshot__created_on__lt=one_month_ago)
endpoints = list(no_screenshots) + list(outdated_screenshots)
logger.debug("Found endpoints %s" % eps.count())
logger.debug("Found endpoints %s" % len(endpoints))
# Chrome headless, albeit single threaded, is pretty reliable and fast for existing
# domains. This code is also the most updated. Waiting for firefox with screenshot
......@@ -47,5 +54,5 @@ class Command(BaseCommand):
# Warning: opening a browser might also mean it wants to play audio automatically(!)
# this can bring some nice surprises :)
for ep in eps:
for ep in endpoints:
s.make_screenshot_chrome_headless(ep)
......@@ -18,12 +18,33 @@ class Command(BaseCommand):
# def add_arguments(self, parser):
# parser.add_argument('poll_id', nargs='+', type=int)
def add_arguments(self, parser):
parser.add_argument(
'--manual', '-o',
help="Give an url to scan via command line.",
nargs=1,
required=False,
default=False,
type=bool
)
do_scan = True
do_rate = True
def handle(self, *args, **options):
while 1:
self.scan()
if options['manual']:
url = input("Type the url, without protocol:")
url = Url.objects.all().filter(url=url).first()
s = ScannerTlsQualys()
s.scan([url.url])
dr = DetermineRatings()
dr.rate_url(url=url)
dr.rate_organization(organization=url.organization)
else:
while 1:
self.scan()
def scan(self):
# todo: sort the organizations on the oldest scanned first, or never scanned first.
......@@ -78,6 +99,7 @@ class Command(BaseCommand):
@staticmethod
def scan_new_urls():
# find urls that don't have an qualys scan and are resolvable on https/443
# todo: perhaps find per organization, so there will be less ratings? (rebuilratings cleans)
urls = Url.objects.filter(is_dead=False,
not_resolvable=False,
endpoint__port=443,
......@@ -127,9 +149,31 @@ class Command(BaseCommand):
s = ScannerTlsQualys()
dr = DetermineRatings()
for url in urls:
s.scan([url.url]) # Scan here, speed up results on map.
dr.rate_url(url=url)
dr.rate_organization(organization=url.organization)
return urls
import math
# Scan the new urls per 30, which takes about 30 minutes.
# Why: so scans will still be multi threaded and the map updates frequently
# and we have a little less ratings if multiple urls are from one organization
batch_size = 30
logger.debug("Scanning new urls in batches of: %s" % batch_size)
i = 0
iterations = int(math.ceil(len(urls) / batch_size))
while i < iterations:
logger.info("New batch %s: from %s to %s" % (i, i*batch_size, (i+1)*batch_size))
myurls = urls[i*batch_size:(i+1)*batch_size]
i = i + 1
# ah yes, give "real" urls.. .not url objects.
urlstrings = []
for url in myurls:
urlstrings.append(url.url)
s.scan(urlstrings)
for url in myurls:
dr.rate_url(url=url)
for url in myurls:
dr.rate_organization(organization=url.organization)
return urls
\ No newline at end of file
www.loket
milieucentrum
xziyipt
ondernemersloket
kim
mailcamp
planonselfservice
wegwijzer
rio
geo
gateway
oostgelre
appl.gw
stadsdichter
beveiligd
beslisboom
samenwerken
gwpprod
thuiswerk
werkplek
cloud
diensten
m
west
kaderbrief
ns1.twd
redactie
castmanage3
bestanden
pki
belastingbalie
owa
sip
data
rss
oma
werkplek.gslb
flexiprint
plannen
web1
parkeren
gezond
appl.gemeentearchief
stadsarchief
ingenieursbureau
nieuwsbrief
participatiewebshop
extern
flexigeo
schiedam
noaberschap
ro-onlineprod
kc
portal
aeformsmidoffice
opendata
rotterdam
www.kollumerland
toerisme
tedoen
gemeenteraad
dacceptatieloket
beeldbank
gemeentewinkel
wifi
bestuur
amsterdam
webserver03
klimaat
extranet
onzeluchtpost
vpn
cars
roonline
eloket
crp
aalsmeer
resetww
mobile
jaarstukken
digitalecatalogus
bekendmakingen
vpn-dc1
flexinext
toegang
waterplan
parkeerbelasting
ruimtelijkeplannen
formulieren
os
jeugd
taxatieverslagenwozloket
sv14246
topscore
seg
oost
wijkprofiel
atlas
digitalecatalogus.cbk
afspreken
parkeerkaart
belangstelling
concern.ir
e-loket
ombudsman
luchtkwaliteit
atletiek
infozuil
certificaat
milieuzone
raadsinformatie
rproxy20
afval
raad
kenniscentrum
dongeradeel
wkpb
ro
schatkamers.bibliotheek
frege
gemeente
1940-1945
nha
begroting
bibliotheek
maps
allegro
qwin
access
belastingen
verkiezingen
besluitvorming
schatkamers
auth
programmabegroting
telewerken
openbareruimte
outlook
mag
archief
support
stemvanwest
mobiel
regelingen
M
digid
vvv
media
tamtam
kaart
wij
secure
gate62
wijkteam
goal
forum
onderwijs
afspraak
welstandsnota
Loket
topsport
zaken
onlineformulieren
wachtwoord
afvalkalender
oorlogsarchief
noord
portaal
cijfers
financien
historischgis
sites
jalp
email
screening
lokalelastenmeter
rproxy21
lokalelasten
ns
publiek
citrix
voorjaarsnota
www2
concern
sync
klik
rproxy22
mail2
loket
erfpacht
wonen
mail
opa
ris
ftp
webmail
uat
ares
ziggo170
regelgeving
simsite
drugs
mijntexel
kernteam
hub
appl
utrecht
alkmaar
matchpoint
sso
roonlineprod
thuiswerken
subsidie
koninginnedag
parkeervergunning
subsites
eforms
kpn190
www.ois
overleg
rekenkamer
trainingen
onderhoudspagina
wozloket
kollumerland
biebcgi
gemeentebestuur
webcams
brandweer
webwerken
beheer
dloket
een
vastgoed
afspraken
cjg
ropubliceer
geluid
mijn
desktop
boa
mx10
webservices
gd