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 sehemu kubwa ya ruhusa/ufikiaji wa 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 ya mtumiaji, mshambuliaji lazima amshawishi nyongeza kupitisha ingizo la madhara 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 misingi ya 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 Modeli ya Kitu ya Hati (DOM) ya 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 haya, 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 kurekebisha script za maudhui katika Chrome, menyu ya zana za maendeleo ya 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 kudumu kuongeza script na kuziingiza kimaandishi kwenye kurasa za wavuti kupitia tabs.executeScript
. Hii kwa kweli inatoa udhibiti wa kina zaidi.
Ili kuingiza script ya maudhui kimaandishi, nyongeza inahitaji kuwa na idhini za mwenyeji kwa ukurasa ambao script zitakuwa zinaingizwa. Idhini hizi zinaweza kupatikana kwa kuziomba ndani ya hati ya nyongeza au kwa 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 zinapoinjikwa kwenye ukurasa wa wavuti. Thamani inayopendekezwa na ya kawaida ni "document_idle"
.
Thamani zinazowezekana ni:
document_idle
: Kadri inavyowezekana
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 wote wa maisha ya nyongeza, ukifanya kazi kwa siri bila mwingiliano wa moja kwa moja na mtumiaji. Una Modeli ya Kitu ya Hati (DOM) yake, 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 kuwa scripts zote muhimu za nyuma zimeunganishwa 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 makosa katika 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 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 na udhaifu.
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 umejilinda dhidi ya ClickJacking kutokana na Content Security Policy. Hivyo unahitaji kuangalia pia (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"]
, tu programu hizo 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, uso wa shambulio utakuwa mdogo.
Ikiwa ukurasa wa wavuti unaoshambuliwa na XSS au takeover umeonyeshwa katika externally_connectable
, mshambuliaji ataweza kutuma ujumbe moja kwa moja kwa script ya nyuma, akipita kabisa Script ya Maudhui na CSP yake.
Hivyo, hii ni kikosi cha kupita nguvu sana.
Zaidi ya hayo, ikiwa mteja ataweka nyongeza ya uongo, hata kama hairuhusiwi kuwasiliana na nyongeza iliyo hatarini, inaweza kuingiza data za XSS katika ukurasa wa wavuti ulio ruhusiwa au kutumia WebRequest
au DeclarativeNetRequest
APIs kudhibiti maombi kwenye kikoa kilicholengwa kubadilisha ombi la ukurasa kwa faili ya JavaScript. (Kumbuka kwamba CSP kwenye ukurasa ulio hatarini inaweza kuzuia mashambulizi haya). Wazo hili linatokana na hiki andiko.
Ili kuwasiliana kati ya script 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 script 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 kutarajia) au tu kufanya wavuti ipakue script mpya.
Kawaida kazi chrome.runtime.sendMessage
hutumiwa kutuma ujumbe ndani ya nyongeza (kawaida inashughulikiwa na script 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:
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)