In korte tijd heb ik een nieuwe phishingmail ontvangen, maar deze is anders dan de vorige, omdat hier gebruik gemaakt wordt van een bijlage. Zoals te verwachten zien we dezelfde kenmerken behorend tot een phishingmail, namelijk een onbekende afzender uit het buitenland, de vraag om een bijlage te openen met een .html extensie. Ik heb opnieuw AI gevraagd om de bijlage te analyseren en deze is tot de volgende conclusie gekomen:
De bijlage is malafide en probeert logingegevens te bemachtigen, maar de manier waarop is niet standaard. In plaats van dat deze naar een (malafide of gehackte) webserver gestuurd worden, wordt hier gebruik gemaakt van Telegram. Een Telegram-bot ontvangt de logingegevens die vervolgens weer misbruikt worden. Het voordeel hiervan is dat er geen gebruik gemaakt hoeft te worden van een webserver, die mogelijk weer als malafide wordt aangemerkt en mogelijk offline gehaald wordt. Dit zorgt voor meer zekerheid van de aanvaller om logingegevens te bemachtigen.
Ik laat ook de denkwijze achter de conlusie zien, omdat deze in het kader van AI minstens zo interessant is:
Oké, ik kijk naar deze code die de gebruiker heeft aangeleverd. Het is een HTML-document met wat JavaScript en CSS erin verwerkt. Mijn taak is om erachter te komen wat deze code doet en het stap voor stap uit te leggen.
Ten eerste merk ik dat wanneer de pagina laadt, er een formulier wordt aangemaakt met behulp van JavaScript. Het formulier heeft verschillende elementen: afbeeldingen voor logo’s, wat tekstoverspanningen, een invoerveld voor het wachtwoord en een verzendknop met het label ‘Weergeven’.
Ik zie dat er wat CSS-styling is toegepast om het formulier er op een bepaalde manier uit te laten zien. De formuliercontainer heeft een vaste breedte en hoogte, gecentreerd op de pagina met flexbox. Er staan groene lijnen bovenaan zowel de body als de formuliercontainer, wat het waarschijnlijk een specifieke visuele stijl geeft.
Vervolgens bekijk ik de JavaScript-functie createForm(). Deze functie voegt verschillende elementen toe aan de DOM. Het begint met het aanmaken van een div voor de groene lijn bovenaan de pagina. Vervolgens voegt het een afbeelding toe voor het paginalogo, die wordt opgehaald van een URL. Vervolgens wordt de formuliercontainer gemaakt en daarin worden verschillende andere elementen toegevoegd: twee logo’s (één hoofdlogo en één als een terugpijl), een titel met “Microsoft Excel”, een span met een e-mailadres opgeslagen in emltag, wat tekst die vraagt om een wachtwoord, aanvullende informatie over authenticatie, het wachtwoordinvoerveld zelf, een opmerking over wachtwoordbeveiliging en ten slotte de knop Verzenden.
Ik zie dat er een gebeurtenislistener op het wachtwoordinvoerveld staat, zodat het indrukken van Enter de formulierinzending activeert. Dat is logisch, want het verbetert de bruikbaarheid. Nu kijken we naar de functie submitForm(). Wanneer op de knop Verzenden wordt geklikt of op Enter wordt gedrukt, wordt deze functie uitgevoerd. Het extraheert de gebruikersnaam uit het scherm en het ingevoerde wachtwoord. Als er geen wachtwoord wordt opgegeven, wordt er een foutmelding weergegeven. Anders schakelt het de knop Verzenden uit door de tekst te wijzigen in “…”, wat waarschijnlijk aangeeft dat er een verzending gaande is.
Hier wordt het zorgelijk. De code stuurt een POST-verzoek met de gebruikersnaam en het wachtwoord naar een server, maar belangrijker nog, daarvoor stuurt het een bericht naar een Telegram-bot met behulp van het verstrekte token en de chat-ID. Dit bericht bevat zowel de gebruikersnaam als het wachtwoord. Dit betekent dat elke keer dat iemand zijn of haar inloggegevens in dit formulier invoert, deze automatisch naar het opgegeven Telegram-account wordt gestuurd. Dat is absoluut niet veilig of ethisch.
Na het verzenden van het Telegram-bericht probeert de code dezelfde gegevens via een POST-verzoek met behulp van FormData naar een ander eindpunt te sturen. Als dit om welke reden dan ook mislukt, zoals een netwerkfout, wordt er een foutmelding weergegeven. Ongeacht of dit lukt of niet, wordt de knop Verzenden teruggezet naar ‘Bekijken’.
Als we het allemaal bij elkaar optellen, is dit formulier ontworpen om gebruikersinloggegevens (e-mailadres en wachtwoord) te verzamelen en deze naar zowel een Telegram-bot als vermoedelijk een andere server te sturen. Het gebruik van een Telegram-bot suggereert dat degene die deze code heeft gemaakt, deze inlogpogingen in realtime wil monitoren of vastleggen.
Ik zie ook dat de JavaScript in de kop van het document wordt ingevoegd met behulp van insertAdjacentHTML, wat geen standaardpraktijk is, maar hier wel werkt omdat het dynamisch stijlen toevoegt. Dit kan echter problemen veroorzaken met de manier waarop browsers stijlen en scripts verwerken.
Wat betreft beveiligingsproblemen is het verzenden van gebruikersreferenties naar een externe service zoals Telegram zonder de juiste autorisatie of encryptie zeer riskant. Het stelt de inloggegevens van gebruikers bloot aan mogelijk misbruik, identiteitsdiefstal of ongeautoriseerde toegang. Deze praktijk schendt standaardbeveiligingsprotocollen en ethische richtlijnen voor het verwerken van gevoelige gebruikersgegevens.
Het formulier heeft ook geen veilige authenticatiemechanismen, zoals SSL/TLS-encryptie op de verbinding (omdat het HTTP gebruikt, geen HTTPS), wat het risico op onderschepping van gegevens door kwaadwillende actoren verder vergroot.
Samengevat is deze code een tool voor het verzamelen van referenties die vastgelegde inloggegevens naar een Telegram-account stuurt en vervolgens probeert te authenticeren bij een andere service. Het vormt aanzienlijke beveiligingsrisico’s voor gebruikers die hun referenties in dit formulier invoeren.
De conclusie van de analyse is als volgt:
De meegeleverde code maakt een webpagina die een wachtwoordverificatieformulier weergeeft. Hier is een stapsgewijze uitleg van wat de code doet:
- HTML-structuur: De code definieert een HTML-document met een <head>-sectie met stijlen en een <body> waar elementen dynamisch worden toegevoegd via JavaScript.
- Styling: CSS is opgenomen om verschillende componenten te stylen:
- Een groene lijn bovenaan de pagina.
- Formuliercontainer gecentreerd op de pagina met specifieke afmetingen, opvulling en lettertypen.
- Invoervelden, knoppen en tekstelementen met gedefinieerde stijlen voor een betere visuele presentatie.
- Dynamische elementen maken:
- Wanneer de pagina wordt geladen (DOMContentLoaded-gebeurtenis), wordt createForm() aangeroepen.
- Deze functie voegt verschillende elementen toe aan de body:
- Een groene lijn bovenaan.
- Een afbeelding (pagina-logo) opgehaald van een specifieke URL.
- Een formuliercontainer met meerdere onderliggende elementen, waaronder afbeeldingen (logo en terugpijl), tekstoverspanningen, invoervelden en knoppen.
- Formulierelementen:
- Logo: Geeft een afbeelding van Microsoft Excel weer.
- Pijltje terug: hiermee navigeert u naar een vorige pagina of sluit u het venster wanneer u erop klikt.
- Titeltekst: hiermee wordt ‘Microsoft Excel’ weergegeven.
- Gebruikersnaam weergeven: hiermee wordt een e-mailadres weergegeven dat is opgeslagen in emltag.
- Wachtwoordprompt: hiermee wordt de gebruiker gevraagd zijn wachtwoord in te voeren.
- Aanvullende informatie: hiermee wordt uitgelegd dat het account met een wachtwoord is beveiligd.
- Wachtwoordinvoerveld: hiermee kan de gebruiker een wachtwoord typen en verzenden. Het heeft een gebeurtenislistener voor het indrukken van Enter om het verzenden van het formulier te activeren.
- Verzendknop: met het label ‘Weergeven’ wordt authenticatie geactiveerd wanneer erop wordt geklikt.
- Formulier verzenden:
- De functie submitForm() wordt aangeroepen wanneer u op de verzendknop klikt of op Enter drukt in het wachtwoordveld.
- Haalt het ingevoerde wachtwoord op en controleert of het is opgegeven.
- Hiermee wordt een foutmelding weergegeven als er geen wachtwoord is ingevoerd.
- Hiermee wordt de verzendknop tijdelijk uitgeschakeld tijdens de verwerking.
- Verwerking van inloggegevens:
- De gebruikersnaam (weergegeven e-mailadres) en het ingevoerde wachtwoord worden verzonden naar een Telegram-bot met behulp van een POST-verzoek met de inloggegevens van de gebruiker in het bericht.
- Tegelijkertijd probeert het te authenticeren met een andere server met behulp van deze referenties via een POST-aanvraag met FormData.
- Beveiligingszorgen:
- Het verzenden van gevoelige informatie (gebruikersnaam/wachtwoord) naar externe services zoals Telegram brengt aanzienlijke beveiligingsrisico’s met zich mee.
- Ontbreekt de juiste encryptie (bijv. HTTPS), waardoor het risico op onderschepping van gegevens toeneemt.
Samengevat creëert deze code een authenticatieformulier dat gebruikersreferenties onjuist verwerkt door ze naar een service van derden en een andere server te sturen, wat ernstige beveiligingsrisico’s met zich meebrengt.
