Ungeschützter API-Endpunkt bei HAwebsso.nl
Hintergrund
Wie einige vielleicht wissen, arbeite ich tagsüber als Arzt (Allgemeinmediziner) und nachts als Sicherheitsforscher . Eines meiner Ziele beim ethischen Hacken ist es, so viel wie möglich zu lernen, um Gesundheitsprodukte, Apps, Websites oder Infrastruktur selbst prüfen zu können. Ist es wirklich, wirklich, sicher? Ich traue keinen glänzenden Emblemen oder Zertifikaten.
Heute werfen wir einen Blick auf die Sicherheit der Nederlandse Huisartsen Genootschap (NHG) und der Landelijke Huisartsen Vereniging (LHV). Das sind Berufsverbände für Allgemeinmediziner (GP) in den Niederlanden. Der NHG setzt Standards für Hausärzte und bietet Aus- und Weiterbildung an, während der LHV die Interessen der Hausärzte vertritt und sich für die Verbesserung der Qualität und Zugänglichkeit der Primärversorgung einsetzt. Beide Organisationen spielen eine wichtige Rolle im niederländischen Gesundheitssystem und arbeiten daran, sicherzustellen, dass Patienten eine qualitativ hochwertige Versorgung durch ihre Hausärzte erhalten. Im Moment haben wir 13.000 Hausärzte in den Niederlanden.
Aufklärung, wo anfangen?
Was, wenn NHG und LHV als anfällig befunden werden, könnten wir diese 13.000 assoziierten Ärzte beeinflussen?
Sowohl der NHG als auch der LHV verfügen über zahlreiche Online-Anwendungen, mit denen sich Ärzte anmelden und mit denen sie interagieren können. Zum Beispiel HAweb.nl , eine Online-Community für Ärzte, und richtlijnen.nhg.org , die es Ärzten ermöglicht, ihre persönlichen Notizen zu den Berufsrichtlinien hinzuzufügen.
Heute klicke ich einfach auf der Hauptwebsite von LHV.nl herum und suche nach verschiedenen Subdomains und wie das Anmeldeverfahren funktioniert .
Was die meisten LHV- und NHG-Anwendungen gemeinsam haben, ist eine Single Sign-On (SSO)-Authentifizierungsmethode, die die Domäne hawebsso.nl verwendet . Es erscheint jedes Mal, wenn Sie versuchen, auf eine Anwendung zuzugreifen, die eine Autorisierung erfordert, wie haweb.nl
SSO ist eine Authentifizierungsmethode, die es Benutzern ermöglicht, mit einem einzigen Satz von Anmeldedaten auf mehrere Anwendungen und Dienste zuzugreifen . Dies beseitigt die Notwendigkeit für Benutzer, sich mehrere Sätze von Anmeldeinformationen zu merken und zu verwalten, und kann die Benutzererfahrung und Produktivität erheblich verbessern. Unternehmen verwenden SSO häufig, um den Zugriff auf mehrere Systeme und Anwendungen zu optimieren, die Sicherheit zu verbessern, indem sie die Anzahl der Orte reduzieren, an denen Benutzeranmeldeinformationen gespeichert werden, und die Kontrolle über den Zugriff auf Ressourcen zu zentralisieren. Darüber hinaus kann SSO mit anderen Sicherheitsfunktionen wie Multi-Faktor-Authentifizierung integriert werden, um eine zusätzliche Schutzebene für sensible Systeme und Daten bereitzustellen.
Die gute Nachricht ist, wenn wir das SSO hacken, haben wir Zugriff auf alles. Die schlechte Nachricht, dass die meisten der verwendeten SSO-Systeme stark kampferprobte Softwareteile sind (fühlen Sie sich frei, good newsund bad newsin diesem Satz zu tauschen).
Viel Glück beim Brechen eines kampferprobten SSO-Dienstes.
Bonus
Ein guter Trick, um schnell den möglichen Umfang des SSO-Systems zu erkennen, besteht darin, nach OpenID-Endpunkten zu suchen und sie zu besuchenhttps://hawebsso.nl/.well-known/openid-configuration
Eine andere Sache, die ich schnell überprüfe, ist, ob ich Hinweise darauf bekomme, welches System hinter dem SSO läuft. Ich schaue mir die Antwortheader dieser HTTP-Anforderung an:
So weit so gut, nichts besonderes.
Was ist mit dem Quellcode der Anmeldeseite?
Im nächsten Schritt werfen Sie einen Blick auf den Quellcode der Anmeldeseite. Gibt es Hinweise auf das System, das für das SSO verwendet wird, oder sehen wir etwas anderes Seltsames?
Admin.js
Wie wir sehen können, lädt die Anmeldeseite verschiedene Javascript-Dateien, von denen einige dem Anmeldeformular Funktionalität hinzufügen. Keine der Dateien gibt Hinweise auf das tatsächlich verwendete System, es könnte sein, dass dieses SSO-Frontend ein kundenspezifisches ist; es umschließt ein ASP-betriebenes SSO-Back-End-System.
Eine der geladenen Dateien erregte jedoch meine Aufmerksamkeit: admin.js. Wann immer wir das Wort „Admin“ sehen, möchten wir unbedingt mehr darüber erfahren.
Teil des Quellcodes in der admin.jsDatei:
$scope.GetAdmin = function () {
return $http({
method: 'GET',
url: '/api/v1/user/admin',
}).then(function (response) {
$scope.adminUser = response.data;
if ($scope.adminUser.roles != null && $scope.adminUser.roles.length > 0) {
var roles = $scope.adminUser.roles.split(",");
$scope.permissions = {
admin_level_1: roles.indexOf("Admin_level_1") > -1,
admin_level_2: roles.indexOf("Admin_level_2") > -1,
allow_edit: roles.indexOf("Admin_allow_edit") > -1,
allow_merge: roles.indexOf("Admin_allow_merge") > -1,
allow_activate: roles.indexOf("Admin_allow_activate") > -1,
allow_deactivate: roles.indexOf("Admin_allow_deactivate") > -1,
allow_make_admin: roles.indexOf("Admin_level_1") > -1,
allow_deactivate_admin: roles.indexOf("Admin_level_1") > -1,
show_field_id: roles.indexOf("Admin_show_field_id") > -1,
show_field_firstname: roles.indexOf("Admin_show_field_firstname") > -1,
show_field_insertion: roles.indexOf("Admin_show_field_insertion") > -1,
show_field_lastname: roles.indexOf("Admin_show_field_lastname") > -1,
show_field_lhv_id: roles.indexOf("Admin_show_field_lhv_id") > -1,
show_field_nhg_id: roles.indexOf("Admin_show_field_nhg_id") > -1,
show_field_emailaddress: roles.indexOf("Admin_show_field_emailaddress") > -1,
show_field_cat_override: roles.indexOf("Admin_show_field_cat_override") > -1,
congres_admin: roles.indexOf("Admin_congres") > -1
};
}
}).catch(function (response) {
$scope.addMessage(response.data, response.status, response.status == 200 ? "success" : "error");
});
}
$scope.GetAdmin();
Da ich einer der GPs mit einem SSO-Login bin, könnte ich mich anmelden und diesen Endpunkt erreichen.
Der Endpunkt überprüft nicht richtig, wer ihn anfordert, und gibt alle unsere Benutzerinformationen zurück . Einschließlich E-Mail, vollständiger Name, Passwort-Hash und einige Mitgliedschaftsdetails.
Was ist, wenn wir denselben Endpunkt erreichen und den /adminmit einer ID austauschen, wie wir sehen können, habe ich die ID 2027. Mal sehen, was passiert, wenn wir versuchen, ID zu treffen 15000: https://hawebsso.nl/api/v1/user/15000
Wir haben jetzt die Auswirkungen dieses Endpunkts aufgezeigt, er gibt alle Benutzerdaten von Personen preis, die beim SSO-Dienst hawebsso.nl registriert sind
In technischer Hinsicht nennen wir diese Art von Fehler einen IDOR ; Unsichere direkte Objektreferenzen .
Der Endpunkt /api/v1/user/1ist ein generischer Endpunkt, der von Hackern leicht entdeckt werden kann. Man könnte Wortlisten verwenden, um Endpunkte auf einem Asset wie diesem Bruteforce zu erzwingen, ein gutes Beispiel sind Assetnote.io ihre gemeinsam genutzten Wortlisten . Die Wortlistehttps://wordlists-cdn.assetnote.io/data/automated/httparchive_apiroutes_2020_11_20.txtenthält diesen spezifischen Endpunkt mit einer ID, die einen Treffer zurückgeben würde.
Ein anderer Ansatz, den der Hacker wählen könnte, besteht darin, alle verwendeten Javascript-Dateien nach Endpunkten zu durchsuchen. Zum Beispiel übernimmt LinkFinder dies für Sie.
Keine Authentifizierung erforderlich
Wir haben nun gezeigt, dass ein bestimmter Endpunkt die Benutzerdaten preisgibt, jedoch eine Authentifizierung erfordert. Könnte man diesen Endpunkt erreichen, ohne eingeloggt zu sein?
Die Antwort ist ja. Dieser Endpunkt erfordert keine Anmeldung. In technischer Hinsicht haben wir jetzt einen weiteren Fehler, Missing Authentication for Critical Function . Wenn Sie den Endpunkt in einem Browser öffnen, ohne angemeldet zu sein, werden uns alle Benutzerdetails zurückgegeben.
Passwort-Hash, wie kann man ihn knacken?
Jetzt haben wir den Hash des Passworts. Die Verwendung von Passwort-Hashes reduziert die Auswirkungen eines Datenlecks, da man zuerst den Hash knacken müsste, um das Passwort abzurufen. In der Vergangenheit konnten Passwort-Hashes wie MD5 einfach durch die Verwendung von etwas wie Rainbow Tables gebrochen werden ; Listen aller möglichen Hashes, die im Voraus berechnet werden, um den Hash zu knacken.
Heutzutage wird dies durch die Verwendung sichererer Hashing-Algorithmen und die Einbeziehung von Salzen gelöst.
Indem ich mein Passwort auf das gleiche Passwort ändere, das ich hatte, konnte ich bestätigen, dass ein neuer eindeutiger Hash generiert wird. Etwas, das uns einen Hinweis darauf gibt, dass Regenbogentabellen hier möglicherweise nicht funktionieren (z. B. wenn sie ein eindeutiges Salz pro Benutzer enthalten).
Zum Testen habe ich den folgenden Hash zum Knacken verwendet (keine Sorge, es ist mein eigener Hash, mit einem Dummy-Passwort):em1EijmR7gmSA0NC2fbbl488pWDpX6YEfPtU4BNRsu01VX9VZFRuvSBAPaaIwVe5KC0enebMfwJC1AGZVNFbRsZ+7Pa7hj718HfKfIolp/5rDgsp/52UOqawXrNGHgwCHYsd+S0gG4K+ba3zjsjg5cVXCpIrqvlJbO45DkPqZ+B/REWhOmkBdRdie76z9oWk1qp7LFa9l/4Z3TtCgucS+m0Sl66mYcWwafRZkAas5a5z15v9iweiZK4WyEbkmUFQDgAqXMAsljftoJxSP0QN/BbXUtAm0wENIGvt7PPTg7dGxdUoySbUFpmnzm/eTeCcgbEpsJhb3bwAulMVl0F3
Nach einer Weile des Hackens konnte man die meisten Hasch-Typen identifizieren, indem man sie einfach ansah, genau wie Hautkrankheiten.
098f6bcd4621d373cade4e832627b4f6 - MD5
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 - SHA-256
$2y$12$xyq65gSoKygKl5kxKYDbjeTocAh8BcbuprbohD.kkX0PZr73pH5LC - Bcrypt
Allerdings habe ich hier jetzt keine Ahnung, welcher Hash-Algorithmus verwendet wird. Nachdem ich mich an einen meiner ethischen Hackerkollegen gewandt hatte, wurde mir gesagt, dass dies wie eine base64-codierte Zeichenfolge aussah , die decodiert genau 255 Bytes lang ist.
Da wir aus unserer Recon wissen, dass ASP auf dem Server läuft, erhalten wir möglicherweise weitere Hinweise aus der von Microsoft bereitgestellten Dokumentation:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity
Später fand ich diesen (5 Jahre alten) Blog über die verschiedenen Hash-Algorithmenhttps://andrewlock.net/exploring-the-asp-net-core-identity-passwordhasher/und fand folgendes Stück interessant:ASP.NET Core Identity Version 3: PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations
Dies gibt mir einen Hinweis darauf, dass ASP standardmäßig einen geeigneten Hash-Algorithmus verwendet, einen, den ich im Moment nicht leicht knacken könnte. Einige interessante Diskussionen über PBKDF2 und die Zukunft können hier nachgelesen werden .
Fürs Erste habe ich es aufgegeben, diese Hashes zu knacken.
Ich würde jedoch gerne mehr von den Lesern dieses Blogs erfahren, können Sie meinen Hash knacken? Wenn ja, lassen Sie mich wissen, wie Sie dies tun würden. Der erste, der es knackt, erhält meinen seltenen glänzenden Glitzeraufkleber und einige andere einzigartige Beute! Wie Sie wissen, dreht sich in dieser Welt alles um Aufkleber.
Fazit
Wir haben ein Datenleck gefunden, das alle E-Mails und Passwort-Hashes, die von Hausärzten in den Niederlanden verwendet werden, preisgibt. Dieser Endpunkt war ungeschützt und erforderte keine Autorisierung. Da es sich um einen generischen Pfad handelt, könnte er von Hackern leicht erraten werden. Außerdem war der Verweis auf diesen Endpunkt in der admin.jsDatei versteckt, die auf der Anmeldeseite enthalten war, Tools wie LinkFinder hätten jeden scannenden Hacker über diesen spezifischen Endpunkt informiert.
Diskussion
Der LHV hat auf seiner Website eine Richtlinie zur verantwortungsvollen Offenlegung veröffentlicht, die es mir ermöglichte, diese Recherche durchzuführen:https://www.lhv.nl/cvd-coordinated-vulnerability-disclosure/Was ein großartiges Beispiel dafür ist, wie man ethische Hacker unterstützt.
Darüber hinaus versuchen sie, die allgemeine Sicherheit in der medizinischen Grundversorgung zu verbessern, indem sie Richtlinien zum Umgang mit Datenlecks entwickeln . Kürzlich haben sie darüber in einer der von Hausärzten gelesenen Zeitschriften veröffentlicht:https://www.syntheshis.nu/wp-content/uploads/2022/12/Synth-2022-03-Totaal.pdf(Niederländisch, Seite 22). Assoziierte Mitglieder können diese Richtlinie einsehen:https://www.lhv.nl/product/praktijkwijzer-informatiebeveiliging/
Es wäre jedoch großartig, wenn jeder auf dieses Dokument zugreifen könnte , je mehr wir teilen, desto besser können wir die Risiken bekämpfen. In der medizinischen Grundversorgung arbeite ich mit Studenten, Datenmanagern und vielen Menschen, die kein Mitglied des LHV sind; wenn ich diese Dokumente leicht teilen könnte, würde das helfen (ich ziehe es vor, keine veralteten PDFs zu teilen).
Eine weitere wichtige Sache ist, jedem Online-Asset die Richtlinie zur verantwortungsvollen Offenlegung hinzuzufügen . Zum Beispiel enthält hawebsso.nl keine Referenzen. Auch die Website NHG.org (unter Verwendung des SSO) teilt keine Richtlinien zur verantwortungsvollen Online-Offenlegung . Eine gute Sache wäre, diese Richtlinie so schnell wie möglich zu veröffentlichen und alle, die bei NHG arbeiten, mit dieser guten Praxis vertraut zu machen; sehenhttps://www.ncsc.nl/onderwerpen/cvd-beleid/cvd-beleid-opstellenlernen, wie man als Organisation vorgeht.
Ein guter Schutz vor solchen Datenlecks ist die Zwei-Faktor-Authentifizierung (2FA), HAwebsso.nl unterstützt dies, ist jedoch standardmäßig nicht aktiviert. Meine Empfehlung ist, dies zu aktivieren, um Angreifern den Zugriff auf Ihr Konto zu erschweren, wenn Ihr Passwort geleakt wurde. Außerdem ist es wichtig, Passwörter nicht wiederzuverwenden, wie in diesem Bericht gezeigt, wenn sie geleakt (und geknackt) werden könnten, könnten sie für andere Dienste missbraucht werden; Credential Stuffing .
Wie könnten wir solche Fehler vermeiden?
Dieser Fehler existierte ungefähr 3 Jahre lang, also ist das viel Zeit, ihn zu entdecken.
Es gibt verschiedene Herangehensweisen an diese Frage. Einer ist auf Management-Ebene; Holen Sie sich Zertifizierungen und übernehmen Sie Industriestandards.
Industriestandards
Heutzutage haben wir verschiedene internationale Industriestandards (z. B. ISO 27001 ) oder nationale Standards (z. B. NEN 7510 ), die beschreiben, wie die Informationssicherheit verwaltet wird. Eine großartige Möglichkeit, einige gute Informationssicherheitspraktiken in Ihre Organisation einzubetten. Implementieren Sie es, lassen Sie sich von einem Auditor bestätigen, dass alles ordnungsgemäß implementiert ist, und das Marketing kann Ihnen die gute Nachricht mitteilen, dass Sie sicher sind.
„Sir, wir sind nach ISO 27001 zertifiziert, wir sind super sicher“ – Jede Verkaufsabteilung
Wie wir heute sehen werden, hält Sie keine Zertifizierung davon ab, gehackt zu werden. Das bedeutet jedoch nicht, dass wir dies nicht tun sollten. Jeder strukturierte Weg zur Verbesserung der Sicherheit ist etwas, das es wert ist, umgesetzt zu werden.
Pen-Test-Berater versus Ethical Hacker
Ein weiterer Ansatz ist die Durchführung regelmäßiger Pen-Tests; Beauftragen Sie eine Firma und bitten Sie sie, Sie zu hacken. Dieser Fehler ist ziemlich geradlinig und es ist wahrscheinlich, dass er in einem Pen-Test entdeckt würde.
Diese Penetrationstests finden jedoch häufig in bestimmten Zeiträumen statt, es handelt sich nicht um einen kontinuierlichen Prozess. Daher könnten alle neuen Fehler in Assets, die zwischen Penetrationstests veröffentlicht werden, unbemerkt bleiben.
Eine Lösung dafür könnte darin bestehen, eine Community von ethischen Hackern zu schaffen, die Bug-Bounty-Plattformen (wie HackerOne oder BugCrowd ) verwenden und in ethische Hacker zu investieren, die Fehler in Ihren Vermögenswerten finden. Wir haben einige großartige Beispiele dafür, wie man Communities in den Niederlanden erstellt: Hack the Hague .
Bedrohungsmodellierung
Ich bin ein großer Fan der INCLUDESNODIRT.com- Methode; Bringen Sie eine Gruppe von Menschen zusammen (z. B. Entwickler, Ethical Hacker, GP, Product Owner und Datenschutzbeauftragter), füllen Sie den Fragebogen aus und machen Sie 20 Minuten lang ein Brainstorming. Wann immer Sie neue Assets einführen, Funktionen zu einer App hinzufügen oder Änderungen in Ihrer Organisation vornehmen (z. B. Fusionen und Übernahmen). In diesem Beispiel würde man sich fragen: „Ist die neue Admin-Funktionalität, die hawebsso.nl hinzugefügt wurde, ordnungsgemäß vor unbefugtem Zugriff gesichert? Wenn ja, erkläre wie.“
Ich habe die Methode noch nicht in der Produktion gesehen, würde aber gerne Geschichten von anderen hören, die sie bereits implementiert haben. Was können wir daraus lernen und funktioniert es wirklich?
Transparenz ist Vertrauen
Vom Anfang bis zum Ende dieses speziellen Fehlerberichts reagierte der Datenschutzbeauftragte von LHV sehr schnell auf meine E-Mails. Er schickte mir häufig Updates, die mir helfen, Vertrauen zu gewinnen, dass die Auswirkungen des Fehlers von allen Beteiligten verstanden werden und schnell behoben werden. Er hat großartige Arbeit geleistet und ist ein Beispiel für andere, wie man mit einem Bericht wie diesem umgeht, danke!
In jeder Organisation ist Transparenz Vertrauen. Wenn es um Datenlecks geht, haben wir gute Flussdiagramme, die uns helfen, wie wir vorgehen und die Endbenutzer transparent informieren (wie die Möglichkeit, Blogs wie diesen zu veröffentlichen).
Dieser Bericht zeigt die Macht der Masse, Transparenz und eine angemessene Offenlegungsrichtlinie ermöglichen es allen ethischen Hackern auf der Welt, Ihnen zu mehr Sicherheit zu verhelfen. Sie könnten dieses Crowd-Modell auf alle anderen Ebenen in Ihrer Organisation anwenden und Ihre Ziele schneller erreichen.
Letztendlich wollen wir alle morgen eine bessere und sicherere medizinische Grundversorgung und aus den Fehlern der Vergangenheit lernen.
Zeitplan
12.04.2022 – Fehler gefunden, dem Datenschutzbeauftragten von LHV per E-Mail
gemeldet 12.05.2022 – Antwort des Datenschutzbeauftragten zur Bestätigung des Fehlers
12.06.2022 – Aktualisierung des Datenschutzbeauftragten
12.08.2022 —
Update vom Datenschutzbeauftragten: Fehler existiert seit 3 Jahren (seit Ende 2019), keine Anzeichen von Missbrauch in den Protokollen der letzten 2 Jahre
Datenschutzbeauftragter per E-Mail
12.12.2022 – LHV & NHG informierten alle Mitglieder per E-Mail über Datenleck; Mitglieder aufgefordert, ihr Passwort zurückzusetzen.
13.12.2022 – LHV schlug einige kleinere Änderungen vor
14.12.2022 – Veröffentlichter Blog

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































