Browser Extension Pentesting Methodology
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Extensions za kivinjari zimeandikwa kwa JavaScript na zinapakiwa na kivinjari katika hali ya nyuma. Ina DOM yake lakini inaweza kuingiliana na DOM za tovuti nyingine. Hii inamaanisha kwamba inaweza kuhatarisha usiri, uadilifu, na upatikanaji (CIA) wa tovuti nyingine.
Muundo wa nyongeza unaonekana bora unapofikiriwa na unajumuisha vipengele vitatu. Hebu tuangalie kila kipengele kwa undani.
Kila script ya maudhui ina ufikiaji wa moja kwa moja kwa DOM ya ukurasa mmoja wa wavuti na hivyo inakabiliwa na ingizo linaloweza kuwa na madhara. Hata hivyo, script ya maudhui haina ruhusa zaidi ya uwezo wa kutuma ujumbe kwa msingi wa nyongeza.
Msingi wa nyongeza unajumuisha ruhusa nyingi za nyongeza, lakini msingi wa nyongeza unaweza kuingiliana tu na maudhui ya wavuti kupitia XMLHttpRequest na scripts za maudhui. Pia, msingi wa nyongeza haina ufikiaji wa moja kwa moja kwa mashine mwenyeji.
Nyongeza inaruhusu binary asilia ambayo inaweza kufikia mashine mwenyeji kwa ruhusa kamili ya mtumiaji. Binary asilia inaingiliana na msingi wa nyongeza kupitia Kiolesura cha Programu ya Plugin ya Netscape ya kawaida (NPAPI) inayotumiwa na Flash na nyongeza nyingine za kivinjari.
Ili kupata ruhusa kamili za mtumiaji, mshambuliaji lazima amshawishi nyongeza kupitisha ingizo la hatari kutoka kwa script ya maudhui hadi msingi wa nyongeza na kutoka kwa msingi wa nyongeza hadi binary asilia.
Kila kipengele cha nyongeza kimewekwa mbali na kingine kwa mipaka yenye ulinzi mkali. Kila kipengele kinakimbia katika mchakato tofauti wa mfumo wa uendeshaji. Scripts za maudhui na msingi wa nyongeza zinakimbia katika mchakato wa sandbox ambao haupatikani kwa huduma nyingi za mfumo wa uendeshaji.
Zaidi ya hayo, scripts za maudhui zimej separated kutoka kwa kurasa zao za wavuti kwa kukimbia katika heap tofauti ya JavaScript. Script ya maudhui na ukurasa wa wavuti zina ufikiaji wa DOM sawa ya msingi, lakini hizo mbili hazibadilishani viashiria vya JavaScript, kuzuia kuvuja kwa kazi za JavaScript.
manifest.json
Nyongeza ya Chrome ni tu folda ya ZIP yenye .crx file extension. Msingi wa nyongeza ni manifest.json
faili katika mzizi wa folda, ambayo inaelezea muundo, ruhusa, na chaguzi zingine za usanidi.
Example:
content_scripts
Content scripts zina pakiwa kila wakati mtumiaji anapohamia kwenye ukurasa unaolingana, katika kesi yetu ukurasa wowote unaolingana na https://example.com/*
na usiozingatia regex ya *://*/*/business*
. Zinatekelezwa kama vile skripti za ukurasa wenyewe na zina ufikiaji wa kiholela kwa Document Object Model (DOM) wa ukurasa.
Ili kujumuisha au kutengwa kwa URLs zaidi, pia inawezekana kutumia include_globs
na exclude_globs
.
Hii ni mfano wa skripti ya maudhui ambayo itaongeza kitufe cha maelezo kwenye ukurasa wakati API ya hifadhi inatumika kupata thamani ya message
kutoka kwenye hifadhi ya nyongeza.
Ujumbe unatumwa kwa kurasa za nyongeza na script ya maudhui wakati kitufe hiki kinapobonyezwa, kupitia matumizi ya runtime.sendMessage() API. Hii ni kutokana na kikomo cha script ya maudhui katika ufikiaji wa moja kwa moja wa APIs, ambapo storage
ni miongoni mwa ubaguzi wachache. Kwa kazi zaidi ya ubaguzi hizi, ujumbe unatumwa kwa kurasa za nyongeza ambazo script za maudhui zinaweza kuwasiliana nazo.
Kulingana na kivinjari, uwezo wa script ya maudhui unaweza kutofautiana kidogo. Kwa kivinjari kinachotegemea Chromium, orodha ya uwezo inapatikana katika Chrome Developers documentation, na kwa Firefox, MDN inatumika kama chanzo kikuu. Pia ni muhimu kutambua kwamba script za maudhui zina uwezo wa kuwasiliana na script za nyuma, na kuwapa uwezo wa kutekeleza vitendo na kurudisha majibu.
Ili kuona na kufanyia kazi script za maudhui katika Chrome, menyu ya zana za maendeleo za Chrome inaweza kufikiwa kutoka Chaguo > Zana zaidi > Zana za maendeleo AU kwa kubonyeza Ctrl + Shift + I.
Baada ya zana za maendeleo kuonyeshwa, tab ya Chanzo inapaswa kubonyezwa, ikifuatiwa na tab ya Script za Maudhui. Hii inaruhusu kuangalia script za maudhui zinazotumika kutoka nyongeza mbalimbali na kuweka alama za kuvunja ili kufuatilia mtiririko wa utekelezaji.
Kumbuka kwamba Script za Maudhui si lazima kwani pia inawezekana kuiingiza script kwa dynamically na kuziingiza kimaandishi katika kurasa za wavuti kupitia tabs.executeScript
. Hii kwa kweli inatoa udhibiti wa kina zaidi.
Kwa kuingiza script ya maudhui kimaandishi, nyongeza inahitaji kuwa na idhini za mwenyeji kwa ukurasa ambao script zitakuwa zinaingizwa. Idhini hizi zinaweza kupatikana ama kwa kuziomba ndani ya hati ya nyongeza au kwa msingi wa muda kupitia activeTab.
Ingiza faili la JS kwa kubonyeza:
Weka kazi kwa kubonyeza:
Ili kujumuisha au kutengwa kwa URLs zaidi, pia inawezekana kutumia include_globs
na exclude_globs
.
run_at
Sehemu ya run_at
inasimamia wakati faili za JavaScript zinapoinjizwa kwenye ukurasa wa wavuti. Thamani inayopendekezwa na ya default ni "document_idle"
.
Thamani zinazowezekana ni:
document_idle
: Wakati wowote iwezekanavyo
document_start
: Baada ya faili zozote kutoka css
, lakini kabla ya DOM nyingine yoyote kujengwa au script nyingine yoyote kuendeshwa.
document_end
: Mara moja baada ya DOM kukamilika, lakini kabla ya rasilimali ndogo kama picha na fremu kupakiwa.
manifest.json
Kupitia service-worker.js
background
Meseji zinazotumwa na scripts za maudhui zinapokelewa na ukurasa wa nyuma, ambao unachukua jukumu kuu katika kuratibu vipengele vya nyongeza. Kwa kuzingatia, ukurasa wa nyuma unadumu wakati wa maisha ya nyongeza, ukifanya kazi kwa siri bila mwingiliano wa moja kwa moja na mtumiaji. Una mfano wake wa Hati ya Kitu (DOM), ikiruhusu mwingiliano tata na usimamizi wa hali.
Mambo Muhimu:
Jukumu la Ukurasa wa Nyuma: Inafanya kazi kama kituo cha neva kwa nyongeza, kuhakikisha mawasiliano na uratibu kati ya sehemu mbalimbali za nyongeza.
Uendelevu: Ni kiumbe kilichopo kila wakati, kisichoonekana kwa mtumiaji lakini muhimu kwa utendaji wa nyongeza.
Uundaji Otomatiki: Ikiwa haijafafanuliwa wazi, kivinjari kitaunda kiotomatiki ukurasa wa nyuma. Ukurasa huu ulioundwa kiotomatiki utajumuisha scripts zote za nyuma zilizotajwa katika hati ya nyongeza, kuhakikisha uendeshaji wa bila mshono wa kazi za nyuma za nyongeza.
Urahisi unaotolewa na kivinjari katika kuunda kiotomatiki ukurasa wa nyuma (wakati haujafafanuliwa wazi) unahakikisha kwamba scripts zote muhimu za nyuma zimejumuishwa na zinafanya kazi, zikifanya mchakato wa kuweka nyongeza kuwa rahisi.
Mfano wa script ya nyuma:
Inatumia runtime.onMessage API kusikiliza ujumbe. Wakati ujumbe wa "explain"
unapopokelewa, inatumia tabs API kufungua ukurasa katika tab mpya.
Ili kubaini skripti ya nyuma unaweza kwenda kwenye maelezo ya nyongeza na kukagua huduma ya mfanyakazi, hii itafungua zana za maendeleo na skripti ya nyuma:
Nyongeza za kivinjari zinaweza kuwa na aina mbalimbali za kurasa:
Kurasa za Kitendo zinaonyeshwa katika orodha ya kushuka wakati ikoni ya nyongeza inabonyezwa.
Kurasa ambazo nyongeza it pakia katika tab mpya.
Kurasa za Chaguo: Ukurasa huu unaonyeshwa juu ya nyongeza wakati unabonyezwa. Katika hati ya awali Katika kesi yangu niliweza kufikia ukurasa huu katika chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
au kubonyeza:
Kumbuka kwamba kurasa hizi si za kudumu kama kurasa za nyuma kwani zinapakia maudhui kwa mahitaji. Licha ya hili, zinashiriki uwezo fulani na ukurasa wa nyuma:
Mawasiliano na Skripti za Maudhui: Kama ilivyo kwa ukurasa wa nyuma, kurasa hizi zinaweza kupokea ujumbe kutoka kwa skripti za maudhui, kurahisisha mwingiliano ndani ya nyongeza.
Upatikanaji wa APIs za Maalum za Nyongeza: Kurasa hizi zinafurahia upatikanaji mpana wa APIs za maalum za nyongeza, kulingana na ruhusa zilizofafanuliwa kwa nyongeza.
permissions
& host_permissions
permissions
na host_permissions
ni entries kutoka manifest.json
ambazo zitaonyesha ni ruhusa zipi nyongeza za kivinjari zina (hifadhi, eneo...) na katika kurasa zipi za wavuti.
Kama nyongeza za kivinjari zinaweza kuwa na mamlaka makubwa, moja mbaya au moja iliyovunjwa inaweza kumruhusu mshambuliaji njia tofauti za kuiba taarifa nyeti na kupeleleza mtumiaji.
Angalia jinsi mipangilio hii inavyofanya kazi na jinsi inaweza kutumika vibaya katika:
BrowExt - permissions & host_permissionscontent_security_policy
sera ya usalama wa maudhui inaweza kutangazwa pia ndani ya manifest.json
. Ikiwa kuna moja iliyofafanuliwa, inaweza kuwa hatari.
Mipangilio ya default kwa kurasa za nyongeza za kivinjari ni ya kukatisha tamaa:
Kwa maelezo zaidi kuhusu CSP na uwezekano wa kupita angalia:
Content Security Policy (CSP) Bypassweb_accessible_resources
ili kuruhusu ukurasa wa wavuti kufikia ukurasa wa Kiongezeo cha Kivinjari, ukurasa wa .html
kwa mfano, ukurasa huu unahitaji kutajwa katika uwanja wa web_accessible_resources
wa manifest.json
.
Kwa mfano:
Hizi kurasa zinapatikana katika URL kama:
Katika nyongeza za umma, extension-id inapatikana:
Hata hivyo, ikiwa parameter ya manifest.json
use_dynamic_url
inatumika, id hii inaweza kuwa ya dinamik.
Kumbuka kwamba hata kama ukurasa umeelezewa hapa, unaweza kuwa ulindwa dhidi ya ClickJacking kutokana na Content Security Policy. Hivyo unahitaji pia kuangalia (sehemu ya frame-ancestors) kabla ya kuthibitisha kuwa shambulio la ClickJacking linawezekana.
Kuruhusiwa kufikia kurasa hizi kunafanya kurasa hizi kuwa na uwezekano wa kuwa na udhaifu wa ClickJacking:
BrowExt - ClickJackingKuruhusu kurasa hizi kupakuliwa tu na nyongeza na si kwa URL za nasibu kunaweza kuzuia shambulio la ClickJacking.
Kumbuka kwamba kurasa kutoka web_accessible_resources
na kurasa nyingine za nyongeza pia zina uwezo wa kuwasiliana na scripts za nyuma. Hivyo ikiwa moja ya kurasa hizi ina udhaifu wa XSS inaweza kufungua udhaifu mkubwa zaidi.
Zaidi ya hayo, kumbuka kwamba unaweza kufungua tu kurasa zilizoonyeshwa katika web_accessible_resources
ndani ya iframes, lakini kutoka kwenye tab mpya inawezekana kufikia ukurasa wowote katika nyongeza ukijua extension ID. Hivyo, ikiwa XSS inapatikana ikitumia vigezo sawa, inaweza kutumika hata kama ukurasa haujawekwa katika web_accessible_resources
.
externally_connectable
Kulingana na docs, Mali ya "externally_connectable"
katika manifest inatangaza ni nyongeza zipi na kurasa za wavuti zinaweza kuungana na nyongeza yako kupitia runtime.connect na runtime.sendMessage.
Ikiwa funguo ya externally_connectable
haijatangazwa katika manifest ya nyongeza yako au imetangazwa kama "ids": ["*"]
, nyongeza zote zinaweza kuungana, lakini hakuna kurasa za wavuti zinaweza kuungana.
Ikiwa IDs maalum zimeelezwa, kama katika "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, ni hizo programu pekee zinaweza kuungana.
Ikiwa mifano imeelezwa, programu hizo za wavuti zitakuwa na uwezo wa kuungana:
Ikiwa imeelezwa kama tupu: "externally_connectable": {}
, hakuna programu au wavuti itakayoweza kuungana.
Idadi ndogo ya nyongeza na URL zilizoorodheshwa hapa, ndiyo ndogo zaidi ya uso wa shambulio itakuwa.
Ikiwa ukurasa wa wavuti unaotetereka kwa XSS au takeover umeonyeshwa katika externally_connectable
, mshambuliaji ataweza kutuma ujumbe moja kwa moja kwa skripti ya nyuma, akipita kabisa Skripti ya Maudhui na CSP yake.
Hivyo, hii ni kikosi cha kupita chenye nguvu sana.
Zaidi ya hayo, ikiwa mteja ataweka nyongeza ya uongo, hata kama hairuhusiwi kuwasiliana na nyongeza inayotetereka, inaweza kuingiza data za XSS katika ukurasa wa wavuti ulioidhinishwa au kutumia WebRequest
au DeclarativeNetRequest
APIs kubadilisha maombi kwenye kikoa kilicholengwa kubadilisha ombi la ukurasa kwa faili ya JavaScript. (Kumbuka kwamba CSP kwenye ukurasa uliohisiwa inaweza kuzuia mashambulizi haya). Wazo hili linatokana na hiki andiko.
Ili kuwasiliana kati ya skripti ya maudhui na ukurasa wa wavuti, ujumbe wa baada ya kawaida hutumiwa. Hivyo, katika programu ya wavuti mara nyingi utapata simu za kazi window.postMessage
na katika skripti ya maudhui wasikilizaji kama window.addEventListener
. Tafadhali kumbuka, hata hivyo, kwamba nyongeza inaweza pia kuwasiliana na programu ya wavuti ikituma Ujumbe wa Post (na hivyo wavuti inapaswa kuutarajia) au tu kufanya wavuti ipakue skripti mpya.
Kawaida kazi chrome.runtime.sendMessage
hutumiwa kutuma ujumbe ndani ya nyongeza (kawaida inashughulikiwa na skripti ya background
) na ili kupokea na kushughulikia inatangazwa msikilizaji akitumia chrome.runtime.onMessage.addListener
.
Pia inawezekana kutumia chrome.runtime.connect()
kuwa na muunganisho wa kudumu badala ya kutuma ujumbe mmoja mmoja, inawezekana kuitumia kutuma na kupokea ujumbe kama katika mfano ufuatao:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)