Compare commits

...
7 Commits
Author SHA1 Message Date
Paul 8cbf30aa0d Fix GPG 2018-10-01 23:45:46 +02:00
Paul fc244f4009 Update oAuth tokens to be up-to-date 2018-10-01 22:12:35 +02:00
Paul 0f8ac914f8 Use Postgres 2018-10-01 21:17:02 +02:00
Paul 5c8f930bbd Add encryptie 2018-02-07 14:40:46 +01:00
Paul 5b31b09881 oauth 2018-02-07 09:54:48 +01:00
Paul d6bb65aa7f Add oauth 2018-02-07 09:51:49 +01:00
Paul e1e357e3ef Oauth worknig 2018-02-07 09:40:55 +01:00
10 changed files with 66 additions and 64 deletions

No files matched your search

+1
View File
@@ -2,3 +2,4 @@
__pycache__ __pycache__
/venv /venv
db.sqlite3 db.sqlite3
/securityquiz/secrets.py
+2
View File
@@ -1,3 +1,5 @@
django django
django-oauth-toolkit django-oauth-toolkit
django-cors-headers django-cors-headers
pyopenssl
psycopg2
+4
View File
@@ -0,0 +1,4 @@
DB_HOST = ''
DB_NAME = ''
DB_USER = ''
DB_PASSWORD = ''
+11 -9
View File
@@ -9,7 +9,10 @@ https://docs.djangoproject.com/en/1.6/ref/settings/
""" """
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os, sys import os
import sys
from . import secrets
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) BASE_DIR = os.path.dirname(os.path.dirname(__file__))
CLOSED = False CLOSED = False
@@ -26,7 +29,7 @@ DEBUG = False
if 'runserver' in sys.argv: if 'runserver' in sys.argv:
DEBUG = True DEBUG = True
ALLOWED_HOSTS = ['websec.paulwagener.nl'] ALLOWED_HOSTS = ['websec.paulwagener.nl', '127.0.0.1']
# Application definition # Application definition
@@ -43,7 +46,7 @@ INSTALLED_APPS = (
'corsheaders', 'corsheaders',
) )
MIDDLEWARE_CLASSES = ( MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
@@ -64,8 +67,11 @@ WSGI_APPLICATION = 'securityquiz.wsgi.application'
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.postgresql',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': secrets.DB_NAME,
'USER': secrets.DB_USER,
'PASSWORD': secrets.DB_PASSWORD,
'HOST': secrets.DB_HOST
} }
} }
@@ -101,7 +107,6 @@ TEMPLATES = [
'django.template.context_processors.debug', 'django.template.context_processors.debug',
'django.template.context_processors.request', 'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
'securityquiz.settings.closed',
'django.contrib.messages.context_processors.messages', 'django.contrib.messages.context_processors.messages',
], ],
}, },
@@ -111,6 +116,3 @@ TEMPLATES = [
STATICFILES_DIRS = ( STATICFILES_DIRS = (
PROJECT_PATH + '/static', PROJECT_PATH + '/static',
) )
def closed(request):
return {'CLOSED': CLOSED}
+9 -14
View File
@@ -1,17 +1,12 @@
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
owEBXgKh/ZANAwACAdVV8vX6nhxaAawuYglwbGFpbi50eHRVdLQaVGhlIE5hcndo owEBdgGJ/pANAwAIAQXMoUhwzjSpAawvYgpzZWNyZXQudHh0W7KUz1RoZSBOYXJ3
YWwgQmFjb25zIGF0IE1pZG5pZ2h0CokCHAQAAQIABgUCVXS0GgAKCRDVVfL1+p4c aGFsIEJhY29ucyBhdCBNaWRuaWdodAqJATMEAAEIAB0WIQTUzObaA3ShseyNi1AF
Wl31EACZ0itLnfLQrkFYGEa8DxgG6O101oc350JekBI7mIm1x556M3dIkyDTSqPd zKFIcM40qQUCW7KUzwAKCRAFzKFIcM40qQd2B/sEA5s/TiXM7GFplw2ocxegoIJS
1gY+5wE3iklSnqPAfRSskclQ5SahK7mIjRw8NoCpWGRdFT/2u15lZofqGMV23T1R TfqeGJoYJt0r5W6j+p2TQ07nH0vadqBpqEIgK9f3VQvUL89Triq0PLp6AgNdB+GR
hEuxxNlZwcWEWDg2Ixx6OqE836Qm+ITaS12ok5qDZFxj4hd4C7uinAv5CWKIyvwl a2M29x8hCEAZQX+Aj74YKfnso0F0EqP3e+Oj5oDrixstnPoy/hXlVbtnR9zvIJXh
l5ZwwWB4p+NT6JxY6p5Pw0J5xPVCE+pAFesPUwAYydQ5CabgdfRyjc6iMQz+GRFD Eme/pxHkIHnc4a2JojEQQIxu7WvYoXKcrGYPyX0/pvyWGAHIKcPtFNcnO2oF3rp7
Qs7kWuZ2JKPWm+2h0UQa38Id66fd4l38x16+rerIEG8XTMlfiXgtCPT9Rkdxb8lD GRzhc3tydqkIwevosHOsf4T0UoDb/4PAUvkfgbnSdbvGhAdLQtAMWl860lQRQ/WG
bZQJefupCPP/EAQnZOPzHFbZ32PaOnp0DTLi641W24rb0hwD2LPHIRh+KPWfwaVl oJaWC0hUOxzbSoHZeBH8+J8871e+jwE+j+6vk9lVj6Bz4c6O3mUOhxL+dkTw
+1BSEGE3STDjN0CGaTE1KDM5p5TEhML4/LwRucdp+y8c3f1gyWNd8ChnA9aCFr5w =FLte
h4FIpE1gAd6XANkVGCIHlZ0Lzxu022zjNFPW2sQeFJy1ZEqBAAwaOlnceztTyx6c
J+TNey4lYy2F4hVn/QxYF5kMUIEw22y4tMmwX4tOVkgg5I0X+mf2Csosbfz7Xsn3
0i4utcTqwmVov3obPQj1QprBeSMXoYSJMyUCO7eIE9eqeGy0uMO6xkG3Z2QGsZNS
aAzu9msSLIc5cQWx9Pva9pafC/sFIyJWudBlf8UEkeIFSll9FQ==
=h6Mi
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
+4 -4
View File
@@ -30,15 +30,15 @@
<li> <li>
<a href="/wachtwoorden">Wachtwoorden</a> <a href="/wachtwoorden">Wachtwoorden</a>
</li> </li>
<!--<li> <li>
<a href="/oauth">OAuth</a> <a href="/oauth">OAuth</a>
</li>--> </li>
<li> <li>
<a href="/certificaten">Certificaten</a> <a href="/certificaten">Certificaten</a>
</li> </li>
<!-- <li> <li>
<a href="/encryptie">Encryptie</a> <a href="/encryptie">Encryptie</a>
</li>--> </li>
</ul> </ul>
Moeilijkheidsgraad: Moeilijkheidsgraad:
+6 -4
View File
@@ -224,7 +224,7 @@
<p> <p>
<p>Haal van de keyserver onze publieke sleutel op met sleutel-ID <p>Haal van de keyserver onze publieke sleutel op met sleutel-ID
<b>B69F77232CE5546445137725D555F2F5FA9E1C5A</b> (GPG noemt dit ook wel de user-ID). We hebben met onze private sleutel <b>D4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9</b> (GPG noemt dit ook wel de user-ID). We hebben met onze private sleutel
een tekst versleuteld in een tekst versleuteld in
<a href="static/secret.txt.asc" target="_blank">dit bestand</a>. Gebruik de publieke sleutel om dit bestand te ontsleutelen.</p> <a href="static/secret.txt.asc" target="_blank">dit bestand</a>. Gebruik de publieke sleutel om dit bestand te ontsleutelen.</p>
@@ -282,7 +282,7 @@
<p>Op die manier ontstaat er een web van vertrouwensrelaties. En als jij Tony vertrouwd, en Tony vertrouwd Steve. Dan <p>Op die manier ontstaat er een web van vertrouwensrelaties. En als jij Tony vertrouwd, en Tony vertrouwd Steve. Dan
kan je indirect ervan uitgaan dat de naam van de sleutel van Steve klopt. Op die manier kan je indirect een hele kan je indirect ervan uitgaan dat de naam van de sleutel van Steve klopt. Op die manier kan je indirect een hele
hoop sleutels vertrouwen. Op onze keyserver zie je bijvoorbeeld hoop sleutels vertrouwen. Op onze keyserver zie je bijvoorbeeld
<a href="http://websec.paulwagener.nl:11371/pks/lookup?op=vindex&search=0XB69F77232CE5546445137725D555F2F5FA9E1C5A" target="_blank">wie er allemaal direct onze sleutel vertrouwd.</a> <a href="http://websec.paulwagener.nl:11371/pks/lookup?op=vindex&search=0XD4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9" target="_blank">wie er allemaal direct onze sleutel vertrouwd.</a>
</p> </p>
<img src="static/img/web_of_trust.gif"> <img src="static/img/web_of_trust.gif">
@@ -292,7 +292,7 @@
sleutel weer opnieuw te versturen naar de keyserver.</p> sleutel weer opnieuw te versturen naar de keyserver.</p>
<div class="question"> <div class="question">
<span class="question-string">Gebruik je eigen sleutel om onze sleutel (sleutel-ID: B69F77232CE5546445137725D555F2F5FA9E1C5A) en de sleutel van <span class="question-string">Gebruik je eigen sleutel om onze sleutel (sleutel-ID: D4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9) en de sleutel van
drie medestudenten te ondertekenen. Upload je ondertekening terug naar de keyserver. Plak je eigen sleutel-ID als drie medestudenten te ondertekenen. Upload je ondertekening terug naar de keyserver. Plak je eigen sleutel-ID als
antwoord hier.</span> antwoord hier.</span>
{% include "points.html" with points=answers.answer_encryption_sign_keys.points max="5" %} {% include "points.html" with points=answers.answer_encryption_sign_keys.points max="5" %}
@@ -309,4 +309,6 @@
<a href="http://xkcd.com/364/" target="_blank"> <a href="http://xkcd.com/364/" target="_blank">
<img src="http://imgs.xkcd.com/comics/responsible_behavior.png"> <img src="http://imgs.xkcd.com/comics/responsible_behavior.png">
</a> </a>
{% endblock %}
+4 -2
View File
@@ -29,11 +29,13 @@
<li> <li>
<a href="/?wachtwoorden">Wachtwoorden</a> <a href="/?wachtwoorden">Wachtwoorden</a>
</li> </li>
<li>
<!-- <a href="/?certificaten">Certificaten</a>
</li>
<li> <li>
<a href="/?oauth">OAuth</a> <a href="/?oauth">OAuth</a>
</li> </li>
<!--
<li> <li>
<a href="/?certificaten">Certificaten</a> <a href="/?certificaten">Certificaten</a>
</li> </li>
+9 -31
View File
@@ -111,12 +111,6 @@
<img src="static/img/oauth_register.png" style="width: 50%"> <img src="static/img/oauth_register.png" style="width: 50%">
</figure> </figure>
<div class="question">
<span class="question-string">Wat is de client_id die je hebt geregistreerd?</span>
{% include "points.html" with points=answers.answer_oauth_client_id.points max="5" %}
<input class="question-input" name="answer_oauth_client_id" value="{{ answers.answer_oauth_client_id.string }}"></input>
</div>
<p>Elke OAuth server heeft twee endpoints (lees: URL's): de authorisatie endpoint en de token endpoint. Hieronder zie je de <p>Elke OAuth server heeft twee endpoints (lees: URL's): de authorisatie endpoint en de token endpoint. Hieronder zie je de
endpoints van een aantal bekende servers:</p> endpoints van een aantal bekende servers:</p>
@@ -128,8 +122,8 @@
</tr> </tr>
<tr> <tr>
<td>Deze cursus</td> <td>Deze cursus</td>
<td>http://websec.paulwagener.nl/o/authorize/</td> <td>https://websec.paulwagener.nl/o/authorize/</td>
<td>http://websec.paulwagener.nl/o/token/</td> <td>https://websec.paulwagener.nl/o/token/</td>
</tr> </tr>
<tr> <tr>
<td>GitHub</td> <td>GitHub</td>
@@ -179,13 +173,11 @@
<p>Voor deze site is de authorisatie URL: <p>Voor deze site is de authorisatie URL:
<br> <br>
<span class="url">http://websec.paulwagener.nl/o/authorize/?client_id=(CLIENT_ID)&amp;response_type=token</span> <span class="url">https://websec.paulwagener.nl/o/authorize/?client_id=(CLIENT_ID)&amp;response_type=token</span>
</p> </p>
<div class="question"> <div class="question">
<span class="question-string">Authoriseer met je eigen client id. Welke access token heb je gekregen?</span> <span class="question-string">Authoriseer met je eigen client id. Welke access token heb je gekregen?</span>
{% include "points.html" with points=answers.answer_oauth_implicit_access_token.points max="5" %}
<input class="question-input" name="answer_oauth_implicit_access_token" value="{{ answers.answer_oauth_implicit_access_token.string }}"></input>
</div> </div>
<p class="hint"> <p class="hint">
@@ -194,8 +186,6 @@
<div class="question"> <div class="question">
<span class="question-string">Hoeveel seconden is deze token code geldig?</span> <span class="question-string">Hoeveel seconden is deze token code geldig?</span>
{% include "points.html" with points=answers.answer_oauth_implicit_access_token_expires.points max="5" %}
<input class="question-input" name="answer_oauth_implicit_access_token_expires" value="{{ answers.answer_oauth_implicit_access_token_expires.string }}"></input>
</div> </div>
<p>De access token kan je nu gebruiken om een request te doen naar <p>De access token kan je nu gebruiken om een request te doen naar
@@ -211,8 +201,6 @@
<div class="question"> <div class="question">
<span class="question-string">Wat is de geheime code die gestuurd wordt als je de API aanroept?</span> <span class="question-string">Wat is de geheime code die gestuurd wordt als je de API aanroept?</span>
{% include "points.html" with points=answers.answer_oauth_api_hello.points max="10" %}
<input class="question-input" name="answer_oauth_api_hello" value="{{ answers.answer_oauth_api_hello.string }}"></input>
</div> </div>
<p class="hint"> <p class="hint">
@@ -246,8 +234,6 @@
<div class="question"> <div class="question">
<span class="question-string">Welke authorisatie code heb je gekregen?</span> <span class="question-string">Welke authorisatie code heb je gekregen?</span>
{% include "points.html" with points=answers.answer_oauth_authorization_code.points max="5" %}
<input class="question-input" name="answer_oauth_authorization_code" value="{{ answers.answer_oauth_authorization_code.string }}"></input>
</div> </div>
<img src="static/img/oauth_authorization_code.png" style="width: 25%; float: right"> <img src="static/img/oauth_authorization_code.png" style="width: 25%; float: right">
@@ -283,8 +269,6 @@
<div class="question"> <div class="question">
<span class="question-string">Copy paste de response die je hebt gekregen waar de refresh token in staat</span> <span class="question-string">Copy paste de response die je hebt gekregen waar de refresh token in staat</span>
{% include "points.html" with points=answers.answer_oauth_refresh_token.points max="5" %}
<textarea class="question-input" name="answer_oauth_refresh_token">{{ answers.answer_oauth_refresh_token.string }}</textarea>
</div> </div>
<img src="static/img/oauth_refresh_token.png" style="float: right; width: 25%"> <img src="static/img/oauth_refresh_token.png" style="float: right; width: 25%">
@@ -300,9 +284,9 @@
<p>Bij Google hebben we een OAuth client geregistreerd en de volgende gegevens gekregen:</p> <p>Bij Google hebben we een OAuth client geregistreerd en de volgende gegevens gekregen:</p>
<code style="display: block;"> <code style="display: block;">
Client id: 799427728270-ahr6bg713mtkh2htskbmqko8hpheq1md.apps.googleusercontent.com<br> Client id: 507532281075-92u6kon3r2kpesqbadmt29cnlvtpjbkh.apps.googleusercontent.com<br>
Client secret: 3W9FcQefBmhX7CT1FgzqiCdR<br> Client secret: yTmMOl9GfCFl-F4QoESfi7HT<br>
Refresh token: 1/WfdEEjWgj5Lm8p6wZzoTCeirQz7e4hMDIxvOkdvSjsU<br></code> Refresh token: 1/EpIRGrHcCV8wi54zGwJoKUklSTkndrJvj1mixqNrgkY"<br></code>
<p>Met deze gegevens kunnen we weer een POST doen naar de token endpoint (voor Google: https://accounts.google.com/o/oauth2/token) <p>Met deze gegevens kunnen we weer een POST doen naar de token endpoint (voor Google: https://accounts.google.com/o/oauth2/token)
om een access token te genereren. Dit keer hoeven we geen redirect_uri mee te sturen en moeten we de grant_type parameter om een access token te genereren. Dit keer hoeven we geen redirect_uri mee te sturen en moeten we de grant_type parameter
@@ -314,16 +298,14 @@
<img src="static/img/oauth_google_refresh.png" class="screenshot" style="width: 70%; margin: 20px; display: block"> <img src="static/img/oauth_google_refresh.png" class="screenshot" style="width: 70%; margin: 20px; display: block">
<p>Gebruik de access token die je krijgt om een API call te doen naar <p>Gebruik de access token die je krijgt om een API call te doen naar
<span class="url">https://www.googleapis.com/calendar/v3/calendars/websecpaulwagener@gmail.com/events</span>. Vergeet niet weer de juiste <span class="url">https://www.googleapis.com/calendar/v3/calendars/websec.paulwagener@gmail.com/events</span>. Vergeet niet weer de juiste Authorization
Authorization header te gebruiken om je access token in te zetten! Als je het goed doet krijg je alle events uit onze Google header te gebruiken om je access token in te zetten! Als je het goed doet krijg je alle events uit onze Google Calender
Calender te zien in JSON formaat.</p> te zien in JSON formaat.</p>
<img src="static/img/oauth_google_call_api.png" class="screenshot" style="width: 70%; margin: 20px; display: block"> <img src="static/img/oauth_google_call_api.png" class="screenshot" style="width: 70%; margin: 20px; display: block">
<div class="question"> <div class="question">
<span class="question-string">Wat is de code die in de Geheime afspraak staat? </span> <span class="question-string">Wat is de code die in de Geheime afspraak staat? </span>
{% include "points.html" with points=answers.answer_oauth_calendar_secret_code.points max="10" %}
<input class="question-input" name="answer_oauth_calendar_secret_code" value="{{ answers.answer_oauth_calendar_secret_code.string }}"></input>
</div> </div>
<p>Genoeg tutorial, tijd voor het echte werk! We gaan handmatig het hele OAuth proces doorlopen voor een Google API. Dat mag <p>Genoeg tutorial, tijd voor het echte werk! We gaan handmatig het hele OAuth proces doorlopen voor een Google API. Dat mag
@@ -350,8 +332,6 @@
<div class="question"> <div class="question">
<span class="question-string">Beschrijf de HTTP requests die je hebt gemaakt om de token te krijgen EN de API te gebruiken (en ook de uitkomst van die <span class="question-string">Beschrijf de HTTP requests die je hebt gemaakt om de token te krijgen EN de API te gebruiken (en ook de uitkomst van die
requests). Gevoelige data mag je met ***** censureren.</span> requests). Gevoelige data mag je met ***** censureren.</span>
{% include "points.html" with points=answers.answer_oauth_google_requests.points max="15" %}
<textarea class="question-input" name="answer_oauth_google_requests" style="height: 200px">{{ answers.answer_oauth_google_requests.string }}</textarea>
</div> </div>
<h3>Mini webapp</h3> <h3>Mini webapp</h3>
@@ -364,8 +344,6 @@
<div class="question"> <div class="question">
<span class="question-string">Plak de broncode van je webapplicatie in het tekstvak</span> <span class="question-string">Plak de broncode van je webapplicatie in het tekstvak</span>
{% include "points.html" with points=answers.answer_oauth_web_app.points max="20" %}
<textarea class="question-input" name="answer_oauth_web_app" style="height: 200px">{{ answers.answer_oauth_web_app.string }}</textarea>
</div> </div>
{% endblock %} {% endblock %}
+16
View File
@@ -6,9 +6,25 @@ from quiz.models import LetsEncryptChallenge
from oauth2_provider.views.generic import ProtectedResourceView from oauth2_provider.views.generic import ProtectedResourceView
import datetime import datetime
import pytz import pytz
from django.contrib.auth import login
from django.contrib.auth.models import User
def home(request, url): def home(request, url):
if not request.user.is_authenticated:
try:
user = User.objects.get()
except User.DoesNotExist:
user = User.objects.create_user(
'cursist', 'cursist@websec.paulwagener.nl', 'cursist')
user.save()
login(request, user)
# Make sure there is always a user
if url == 'sql' or url == '': if url == 'sql' or url == '':
template = 'sql.html' template = 'sql.html'
elif url == 'xss': elif url == 'xss':