Browser Extension Pentesting Methodology
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)
Bladsy uitbreidings is geskryf in JavaScript en word deur die blaaier in die agtergrond gelaai. Dit het sy DOM maar kan met ander webwerwe se DOM's interaksie hê. Dit beteken dat dit ander webwerwe se vertroulikheid, integriteit en beskikbaarheid (CIA) kan benadeel.
Uitbreidingsuitleg lyk die beste wanneer dit gevisualiseer word en bestaan uit drie komponente. Kom ons kyk na elke komponent in diepte.
Elke inhoud skrip het direkte toegang tot die DOM van 'n enkele webblad en is dus blootgestel aan potensieel kwaadwillige invoer. Die inhoud skrip bevat egter geen toestemmings nie, behalwe die vermoë om boodskappe na die uitbreiding se kern te stuur.
Die uitbreiding se kern bevat die meeste van die uitbreiding se voorregte/toegang, maar die uitbreiding se kern kan slegs met webinhoud interaksie hê via XMLHttpRequest en inhoud skripte. Ook, die uitbreiding se kern het nie direkte toegang tot die gasheer masjien nie.
Die uitbreiding laat 'n inheemse binêre toe wat toegang tot die gasheer masjien met die gebruiker se volle voorregte kan hê. Die inheemse binêre interaksie met die uitbreiding se kern deur die standaard Netscape Plugin Application Programming Interface (NPAPI) wat deur Flash en ander blaaier plug-ins gebruik word.
Om die gebruiker se volle voorregte te verkry, moet 'n aanvaller die uitbreiding oortuig om kwaadwillige invoer van die inhoud skrip na die uitbreiding se kern en van die uitbreiding se kern na die inheemse binêre oor te dra.
Elke komponent van die uitbreiding is van mekaar geskei deur sterk beskermende grense. Elke komponent loop in 'n afsonderlike bedryfstelsel proses. Inhoud skripte en uitbreiding kerne loop in sandbox proses wat nie vir die meeste bedryfstelsel dienste beskikbaar is nie.
Boonop skei inhoud skripte van hul geassosieerde webbladsye deur in 'n aparte JavaScript hoop te loop. Die inhoud skrip en webblad het toegang tot dieselfde onderliggende DOM, maar die twee ruil nooit JavaScript wysers uit nie, wat die lek van JavaScript funksionaliteit voorkom.
manifest.json
'n Chrome uitbreiding is net 'n ZIP vouer met 'n .crx lêer uitbreiding. Die uitbreiding se kern is die manifest.json
lêer in die wortel van die vouer, wat uitleg, toestemmings, en ander konfigurasie opsies spesifiseer.
Voorbeeld:
content_scripts
Inhoudskripte word gelaai wanneer die gebruiker na 'n ooreenstemmende bladsy navigeer, in ons geval enige bladsy wat ooreenstem met die https://example.com/*
uitdrukking en nie ooreenstem met die *://*/*/business*
regex nie. Hulle voer uit soos die bladsy se eie skripte en het arbitrêre toegang tot die bladsy se Document Object Model (DOM).
Om meer URL's in te sluit of uit te sluit, is dit ook moontlik om include_globs
en exclude_globs
te gebruik.
Dit is 'n voorbeeld inhoudskrip wat 'n verduidelikknoppie aan die bladsy sal voeg wanneer die stoor-API gebruik word om die message
waarde uit die uitbreiding se stoor te verkry.
'n Boodskap word na die uitbreiding bladsye gestuur deur die inhoudskrip wanneer hierdie knoppie geklik word, deur die gebruik van die runtime.sendMessage() API. Dit is as gevolg van die inhoudskrip se beperking in direkte toegang tot API's, met storage
wat een van die min uitsonderings is. Vir funksies buite hierdie uitsonderings, word boodskappe na uitbreiding bladsye gestuur waarmee inhoudskripte kan kommunikeer.
Afhangende van die blaaier, kan die vermoëns van die inhoudskrip effens verskil. Vir Chromium-gebaseerde blaaiers is die vermoënslys beskikbaar in die Chrome Developers dokumentasie, en vir Firefox dien die MDN as die primêre bron. Dit is ook noemenswaardig dat inhoudskripte die vermoë het om met agtergrondskripte te kommunikeer, wat hulle in staat stel om aksies uit te voer en antwoorde terug te stuur.
Vir die weergave en foutopsporing van inhoudskripte in Chrome, kan die Chrome ontwikkelaar gereedskapmenu verkry word vanaf Opsies > Meer gereedskap > Ontwikkelaar gereedskap OF deur Ctrl + Shift + I te druk.
Sodra die ontwikkelaar gereedskap vertoon word, moet die Bron tab geklik word, gevolg deur die Inhoud Skripte tab. Dit stel die waarneming van lopende inhoudskripte van verskeie uitbreidings en die instelling van breekpunte om die uitvoeringsvloei te volg, in staat.
Let daarop dat Inhoud Skripte nie verpligtend is nie aangesien dit ook moontlik is om dynamies skripte in te voeg en om hulle programmaties in te voeg in webblaaie via tabs.executeScript
. Dit bied eintlik meer fynbeheer.
Vir die programmatiese invoeging van 'n inhoudskrip, moet die uitbreiding gasheer toestemmings hê vir die bladsy waarin die skripte ingevoeg moet word. Hierdie toestemmings kan verkry word deur hulle aan te vra binne die manifest van die uitbreiding of op 'n tydelike basis deur activeTab.
Voeg 'n JS-lêer in op klik:
Inspuit 'n funksie op klik:
In orde om meer URL's in te sluit of uit te sluit, is dit ook moontlik om include_globs
en exclude_globs
te gebruik.
run_at
Die run_at
veld beheer wanneer JavaScript-lêers in die webblad ingespuit word. Die verkieslike en standaard waarde is "document_idle"
.
Die moontlike waardes is:
document_idle
: Wanneer moontlik
document_start
: Na enige lêers van css
, maar voordat enige ander DOM gebou word of enige ander skrip uitgevoer word.
document_end
: Onmiddellik nadat die DOM voltooi is, maar voordat subhulpbronne soos beelde en rame gelaai is.
manifest.json
Via service-worker.js
background
Boodskappe wat deur inhoudskripte gestuur word, word deur die agtergrondbladsy ontvang, wat 'n sentrale rol speel in die koördinering van die uitbreiding se komponente. Dit is belangrik dat die agtergrondbladsy oor die uitbreiding se lewensduur volhard, en diskreet werk sonder direkte gebruikersinteraksie. Dit het sy eie Dokumentobjekmodel (DOM), wat komplekse interaksies en toestandsbestuur moontlik maak.
Belangrike Punten:
Agtergrondbladsy Rol: Dien as die senuweesentrum vir die uitbreiding, wat kommunikasie en koördinering tussen verskillende dele van die uitbreiding verseker.
Volharding: Dit is 'n altyd teenwoordige entiteit, onsigbaar vir die gebruiker, maar integraal tot die uitbreiding se funksionaliteit.
Outomatiese Generasie: As dit nie eksplisiet gedefinieer is nie, sal die blaaier outomaties 'n agtergrondbladsy skep. Hierdie outomaties gegenereerde bladsy sal al die agtergrondskripte insluit wat in die uitbreiding se manifest gespesifiseer is, wat die naatlose werking van die uitbreiding se agtergrondtake verseker.
Die gerief wat deur die blaaier verskaf word om outomaties 'n agtergrondbladsy te genereer (wanneer dit nie eksplisiet verklaar is nie) verseker dat al die nodige agtergrondskripte geïntegreer en operasioneel is, wat die uitbreiding se opstellingsproses stroomlyn.
Voorbeeld agtergrondskrip:
Dit gebruik die runtime.onMessage API om na boodskappe te luister. Wanneer 'n "explain"
boodskap ontvang word, gebruik dit die tabs API om 'n bladsy in 'n nuwe tab te open.
Om die agtergrondskrip te debug, kan jy na die uitbreiding besonderhede gaan en die dienswerker inspekteer, dit sal die ontwikkelaar gereedskap met die agtergrondskrip oopmaak:
Bladsy uitbreidings kan verskillende soorte bladsye bevat:
Aksie bladsye word vertoon in 'n afrollys wanneer die uitbreiding ikoon geklik word.
Bladsye wat die uitbreiding sal laai in 'n nuwe tab.
Opsie Bladsye: Hierdie bladsy vertoon bo-op die uitbreiding wanneer dit geklik word. In die vorige manifest was ek in staat om toegang tot hierdie bladsy te verkry in chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
of deur te klik:
Let daarop dat hierdie bladsye nie volhoubaar is soos agtergrond bladsye nie, aangesien hulle dinamies inhoud laai op noodsaaklikheid. Ten spyte hiervan, deel hulle sekere vermoëns met die agtergrond bladsy:
Kommunikasie met Inhoud Skripte: Soos die agtergrond bladsy, kan hierdie bladsye boodskappe van inhoud skripte ontvang, wat interaksie binne die uitbreiding fasiliteer.
Toegang tot Uitbreiding-Spesifieke API's: Hierdie bladsye geniet omvattende toegang tot uitbreiding-spesifieke API's, onderhewig aan die toestemmings wat vir die uitbreiding gedefinieer is.
permissions
& host_permissions
permissions
en host_permissions
is inskrywings uit die manifest.json
wat sal aandui watter toestemmings die blaaier uitbreidings het (berging, ligging...) en in watter web bladsye.
Aangesien blaaier uitbreidings so bevoorreg kan wees, kan 'n kwaadwillige een of een wat gecompromitteer is die aanvaller verskillende middele bied om sensitiewe inligting te steel en die gebruiker te spioeneer.
Kyk hoe hierdie instellings werk en hoe hulle misbruik kan word in:
BrowExt - permissions & host_permissionscontent_security_policy
'n inhoud sekuriteitsbeleid kan ook binne die manifest.json
verklaar word. As daar een gedefinieer is, kan dit kwetsbaar wees.
Die standaardinstelling vir blaaier uitbreiding bladsye is eerder beperkend:
Vir meer inligting oor CSP en potensiële omseilings, kyk:
Content Security Policy (CSP) Bypassweb_accessible_resources
Om 'n webblad toegang te gee tot 'n bladsy van 'n Bladsy-uitbreiding, moet 'n .html
bladsy byvoorbeeld, hierdie bladsy in die web_accessible_resources
veld van die manifest.json
genoem word.
Byvoorbeeld:
Hierdie bladsye is toeganklik in URL soos:
In openbare uitbreidings is die extension-id toeganklik:
Alhoewel, as die manifest.json
parameter use_dynamic_url
gebruik word, kan hierdie id dinamies wees.
Let daarop dat selfs al word 'n bladsy hier genoem, dit mag teen ClickJacking beskerm wees danksy die Content Security Policy. So jy moet dit ook nagaan (frame-ancestors afdeling) voordat jy bevestig dat 'n ClickJacking-aanval moontlik is.
Toegelaat om toegang tot hierdie bladsye te hê, maak hierdie bladsye potensieel kwesbaar vir ClickJacking:
BrowExt - ClickJackingOm te verhoed dat hierdie bladsye net deur die uitbreiding gelaai word en nie deur ewekansige URL's nie, kan ClickJacking-aanvalle voorkom.
Let daarop dat die bladsye van web_accessible_resources
en ander bladsye van die uitbreiding ook in staat is om agtergrondskripte te kontak. So as een van hierdie bladsye kwesbaar is vir XSS, kan dit 'n groter kwesbaarheid oopmaak.
Boonop, let daarop dat jy slegs bladsye wat in web_accessible_resources
aangedui is, binne iframes kan oopmaak, maar van 'n nuwe oortjie is dit moontlik om enige bladsy in die uitbreiding te benader as jy die uitbreiding ID ken. Daarom, as 'n XSS gevind word wat dieselfde parameters misbruik, kan dit misbruik word selfs al is die bladsy nie in web_accessible_resources
geconfigureer nie.
externally_connectable
Volgens die docs, verklaar die "externally_connectable"
manifest eienskap watter uitbreidings en web bladsye kan verbind met jou uitbreiding via runtime.connect en runtime.sendMessage.
As die externally_connectable
sleutel nie in jou uitbreiding se manifest verklaar is nie of dit verklaar is as "ids": ["*"]
, kan alle uitbreidings verbind, maar geen web bladsye kan verbind.
As spesifieke ID's gespesifiseer word, soos in "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, kan slegs daardie toepassings verbind.
As ooreenkomste gespesifiseer word, sal daardie web toepassings in staat wees om te verbind:
As dit as leeg gespesifiseer is: "externally_connectable": {}
, sal geen app of web in staat wees om te verbind nie.
Die minder uitbreidings en URL's wat hier aangedui word, hoe kleiner die aanvaloppervlak sal wees.
As 'n webblad kwulnerbaar is vir XSS of oorname wat in externally_connectable
aangedui word, sal 'n aanvaller in staat wees om boodskappe direk na die agtergrondskrip te stuur, wat die Inhoudskrip en sy CSP heeltemal omseil.
Daarom is dit 'n baie kragtige omseiling.
Boonop, as die kliënt 'n rogue-uitbreiding installeer, selfs al is dit nie toegelaat om met die kwulnerbare uitbreiding te kommunikeer nie, kan dit XSS-data in 'n toegelate webblad inspuit of WebRequest
of DeclarativeNetRequest
API's misbruik om versoeke op 'n geteikende domein te manipuleer deur 'n bladsy se versoek vir 'n JavaScript-lêer te verander. (Let daarop dat CSP op die geteikende bladsy hierdie aanvalle kan voorkom). Hierdie idee kom uit hierdie skrywe.
Om te kommunikeer tussen die inhoudskrip en die webblad, word posboodskappe gewoonlik gebruik. Daarom sal jy gewoonlik oproepe na die funksie window.postMessage
in die webtoepassing vind en in die inhoudskrip luisteraars soos window.addEventListener
. Let egter daarop dat die uitbreiding ook met die webtoepassing kan kommunikeer deur 'n Post Message te stuur (en daarom moet die web dit verwag) of net die web kan dwing om 'n nuwe skrip te laai.
Gewoonlik word die funksie chrome.runtime.sendMessage
gebruik om 'n boodskap binne die uitbreiding te stuur (gewoonlik hanteer deur die background
skrip) en om dit te ontvang en te hanteer, word 'n luisteraar verklaar wat chrome.runtime.onMessage.addListener
aanroep.
Dit is ook moontlik om chrome.runtime.connect()
te gebruik om 'n volgehoue verbinding te hê in plaas van om enkele boodskappe te stuur; dit is moontlik om dit te gebruik om boodskappe te stuur en te ontvang soos in die volgende voorbeeld:
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)