Browser Extension Pentesting Methodology

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

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Tarayıcı uzantıları JavaScript ile yazılır ve tarayıcı tarafından arka planda yüklenir. Kendi DOM'una sahiptir ancak diğer sitelerin DOM'larıyla etkileşimde bulunabilir. Bu, diğer sitelerin gizliliğini, bütünlüğünü ve erişilebilirliğini (CIA) tehlikeye atabilir.

Ana Bileşenler

Uzantı düzenleri en iyi görselleştirildiğinde üç bileşenden oluşur. Her bileşeni detaylı olarak inceleyelim.

İçerik Betikleri

Her içerik betiğinin tek bir web sayfasının DOM'una doğrudan erişimi vardır ve bu nedenle potansiyel olarak kötü niyetli girdilere maruz kalabilir. Ancak, içerik betiği, uzantı çekirdeğine mesaj gönderme yeteneği dışında hiçbir izne sahip değildir.

Uzantı Çekirdeği

Uzantı çekirdeği, uzantının çoğu ayrıcalığı/erişimi içerir, ancak uzantı çekirdeği yalnızca XMLHttpRequest ve içerik betikleri aracılığıyla web içeriği ile etkileşimde bulunabilir. Ayrıca, uzantı çekirdeğinin ana makineye doğrudan erişimi yoktur.

Yerel İkili

Uzantı, kullanıcının tam ayrıcalıklarıyla ana makineye erişebilen bir yerel ikiliye izin verir. Yerel ikili, Flash ve diğer tarayıcı eklentileri tarafından kullanılan standart Netscape Eklenti Uygulama Programlama Arayüzü (NPAPI) aracılığıyla uzantı çekirdeği ile etkileşime girer.

Sınırlar

Bir saldırganın kullanıcının tam ayrıcalıklarını elde etmesi için, içerik betiğinden uzantı çekirdeğine ve uzantı çekirdeğinden yerel ikiliye kötü niyetli girdi geçirmesi gerekir.

Uzantının her bileşeni, birbirinden güçlü koruyucu sınırlarla ayrılmıştır. Her bileşen ayrı bir işletim sistemi sürecinde çalışır. İçerik betikleri ve uzantı çekirdekleri, çoğu işletim sistemi hizmetine erişilemeyen kum havuzu süreçlerinde çalışır.

Ayrıca, içerik betikleri, ayrı bir JavaScript yığınında çalışarak ilişkili web sayfalarından ayrı tutulur. İçerik betiği ve web sayfası, aynı temel DOM'a erişebilir, ancak ikisi hiçbir zaman JavaScript işaretçilerini değiş tokuş etmez, bu da JavaScript işlevselliğinin sızmasını önler.

manifest.json

Bir Chrome uzantısı, .crx dosya uzantısına sahip bir ZIP klasörüdür. Uzantının çekirdeği, düzeni, izinleri ve diğer yapılandırma seçeneklerini belirten klasörün kökünde bulunan manifest.json dosyasıdır.

Örnek:

{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}

content_scripts

İçerik betikleri, kullanıcının eşleşen bir sayfaya gezindiğinde yüklenir, bizim durumumuzda https://example.com/* ifadesine uyan herhangi bir sayfa ve *://*/*/business* regex'ine uymayan sayfalar. Sayfanın kendi betikleri gibi çalışırlar ve sayfanın Belge Nesne Modeli (DOM)'ne keyfi erişime sahiptirler.

"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],

include_globs ve exclude_globs kullanarak daha fazla URL eklemek veya hariç tutmak da mümkündür.

Bu, depolama API'sini kullanarak uzantının depolamasından message değerini almak için bir açıklama düğmesi ekleyecek bir örnek içerik betiğidir.

chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});

Bu düğmeye tıklandığında içerik betiği tarafından uzantı sayfalarına bir mesaj gönderilir, runtime.sendMessage() API kullanılarak. Bu, içerik betiğinin API'lere doğrudan erişimindeki kısıtlamadan kaynaklanmaktadır, storage bunun istisnalarından biridir. Bu istisnaların ötesindeki işlevsellikler için, mesajlar içerik betiklerinin iletişim kurabildiği uzantı sayfalarına gönderilir.

İçerik betiğinin yetenekleri tarayıcıya göre biraz değişebilir. Chromium tabanlı tarayıcılar için yetenekler listesi Chrome Geliştiriciler belgelerinde bulunabilir ve Firefox için MDN birincil kaynak olarak hizmet verir. Ayrıca içerik betiklerinin arka plan betikleriyle iletişim kurma yeteneğine sahip oldukları ve böylece eylemleri gerçekleştirebildikleri ve yanıtları geri iletebildikleri unutulmamalıdır.

Chrome'da içerik betiklerini görüntülemek ve hata ayıklamak için, Chrome geliştirici araçları menüsüne Options > More tools > Developer tools yoluyla veya Ctrl + Shift + I tuşlarına basarak erişilebilir.

Geliştirici araçları görüntülendikten sonra, Source sekmesine tıklanmalı ve ardından Content Scripts sekmesine tıklanmalıdır. Bu, çeşitli uzantılardan çalışan içerik betiklerinin gözlemlenmesine ve yürütme akışını izlemek için kesme noktaları belirlemeye olanak tanır.

Enjekte edilmiş içerik betikleri

İçerik Betiklerinin zorunlu olmadığını ve ayrıca dinamik olarak betiklerin enjekte edilebileceğini ve bunların web sayfalarına tabs.executeScript aracılığıyla programatik olarak enjekte edilebileceğini unutmayın. Bu aslında daha ayrıntılı kontroller sağlar.

Bir içerik betiğinin programatik olarak enjekte edilmesi için, uzantının betiklerin enjekte edileceği sayfaya ana bilgisayar izinlerine sahip olması gerekir. Bu izinler, uzantının manifest dosyası içinde talep edilerek veya geçici olarak activeTab aracılığıyla sağlanabilir.

Örnek activeTab tabanlı uzantı

manifest.json
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
  • Tıklama olayıyla bir JS dosyası enjekte etmek:

// content-script.js
document.body.style.backgroundColor = "orange";

//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
  • Tıklama olayına bir fonksiyon enjekte edin:

//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}

chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});

Betik İzinleri ile Örnek

// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);

// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });

İçerik Betikleri run_at

run_at alanı, JavaScript dosyalarının web sayfasına ne zaman enjekte edileceğini kontrol eder. Tercih edilen ve varsayılan değer "document_idle" değeridir.

Mümkün olan değerler şunlardır:

  • document_idle: Mümkün olduğunda

  • document_start: css dosyalarından sonra, ancak diğer DOM oluşturulmadan veya başka bir betik çalıştırılmadan önce.

  • document_end: DOM tamamlandıktan hemen sonra, ancak resimler ve çerçeveler gibi alt kaynaklar yüklenmeden önce.

manifest.json Aracılığıyla

{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}

Üzerinden service-worker.js

chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);

arkaplan

İçerik komutları tarafından gönderilen mesajlar, uzantının bileşenlerini koordine etmede merkezi bir rol oynayan arkaplan sayfası tarafından alınır. Önemli bir şekilde, arkaplan sayfası uzantının ömrü boyunca varlığını sürdürür, doğrudan kullanıcı etkileşimi olmadan gizlice çalışır. Kendi Document Object Model (DOM) 'a sahiptir, karmaşık etkileşimlere ve durum yönetimine olanak tanır.

Ana Noktalar:

  • Arkaplan Sayfa Rolü: Uzantı için sinir merkezi olarak hareket eder, uzantının çeşitli parçaları arasında iletişimi ve koordinasyonu sağlar.

  • Kalıcılık: Kullanıcı için görünmez ancak uzantının işlevselliği için ayrılmaz olan sürekli bir varlıktır.

  • Otomatik Oluşturma: Açıkça tanımlanmazsa, tarayıcı otomatik olarak bir arkaplan sayfası oluşturacaktır. Bu otomatik oluşturulan sayfa, uzantının manifestosunda belirtilen tüm arkaplan betiklerini içerecek ve uzantının arkaplan görevlerinin sorunsuz çalışmasını sağlayacaktır.

Tarayıcı tarafından otomatik olarak bir arkaplan sayfası oluşturulması (açıkça belirtilmediğinde) sağlanan kolaylık, gerekli tüm arkaplan betiklerinin entegre edilmiş ve operasyonel olduğundan emin olur, uzantının kurulum sürecini basitleştirir.

Örnek arkaplan betiği:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})

İletileri dinlemek için runtime.onMessage API kullanır. Bir "açıkla" ileti alındığında, bir sayfayı yeni bir sekmede açmak için tabs API kullanır.

Arka plandaki betiği hata ayıklamak için uzantı ayrıntılarına gidip hizmet işçisini inceleyebilirsiniz, bu arka plandaki betiği geliştirici araçlarla açacaktır:

Seçenek sayfaları ve diğerleri

Tarayıcı uzantıları çeşitli türde sayfalar içerebilir:

  • Eylem sayfaları, uzantı simgesine tıklandığında bir açılır menüde gösterilir.

  • Uzantının yeni bir sekmede yükleyeceği sayfalar.

  • Seçenek Sayfaları: Bu sayfa, tıklandığında uzantının üstünde görüntülenir. Önceki manifesterde bu sayfaya chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca adresinden veya tıklayarak erişebildim:

Bu sayfalar arka plan sayfaları gibi kalıcı değildir, gerektiğinde dinamik olarak içerik yüklerler. Bununla birlikte, bu sayfalar arka plan sayfasıyla bazı yetenekleri paylaşırlar:

  • İçerik Betikleriyle İletişim: Arka plan sayfasına benzer şekilde, bu sayfalar içerik betiklerinden iletiler alabilir, uzantı içinde etkileşimi kolaylaştırır.

  • Uzantıya Özgü API'lere Erişim: Bu sayfalar, uzantıya özgü API'lere kapsamlı erişime sahiptir, uzantı için tanımlanan izinlere tabidir.

permissions ve host_permissions

permissions ve host_permissions, tarayıcı uzantısının sahip olduğu izinleri (depolama, konum...) ve hangi web sayfalarında olduğunu belirten manifest.json dosyasındaki girişlerdir.

Tarayıcı uzantıları çok ayrıcalıklı olabileceğinden, kötü niyetli veya tehlikeye maruz kalan bir uzantı saldırganın duyarlı bilgileri çalması ve kullanıcıyı izlemesi için farklı yöntemler sağlayabilir.

Bu ayarların nasıl çalıştığını ve nasıl kötüye kullanılabileceğini kontrol edin:

pageBrowExt - permissions & host_permissions

content_security_policy

Bir içerik güvenlik politikası ayrıca manifest.json içinde belirtilebilir. Tanımlanmışsa, savunmasız olabilir.

Tarayıcı uzantısı sayfaları için varsayılan ayar oldukça kısıtlayıcıdır:

script-src 'self'; object-src 'self';

CSP ve olası bypass'lar hakkında daha fazla bilgi için kontrol edin:

pageContent Security Policy (CSP) Bypass

web_accessible_resources

Bir web sayfasının, örneğin bir .html sayfasının bir Tarayıcı Uzantısının bir sayfasına erişmesi için, bu sayfanın manifest.json dosyasındaki web_accessible_resources alanında belirtilmesi gerekmektedir. Örneğin:

{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}

Bu sayfalara şu URL'den erişilebilir:

chrome-extension://<extension-id>/message.html

Genel uzantılarda uzantı kimliği erişilebilir:

Ancak, manifest.json parametresi use_dynamic_url kullanılıyorsa, bu kimlik dinamik olabilir.

Bu sayfalara erişime izin verilmesi, bu sayfaları potansiyel olarak savunmasız ClickJacking yapar:

pageBrowExt - ClickJacking

Bu sayfaların yalnızca uzantı tarafından yüklenmesine ve rastgele URL'ler tarafından yüklenmemesine izin vermek, ClickJacking saldırılarını önleyebilir.

externally_connectable

Belgelerde belirtildiği gibi, "externally_connectable" manifest özelliği, runtime.connect ve runtime.sendMessage aracılığıyla uzantınıza kimlerin bağlanabileceğini belirler.

  • Eğer externally_connectable anahtarı uzantınızın manifestinde belirtilmemişse veya "ids": ["*"] olarak belirtilmişse, tüm uzantılar bağlanabilir, ancak hiçbir web sayfası bağlanamaz.

  • Eğer belirli kimlikler belirtilmişse, örneğin "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], yalnızca bu uygulamalar bağlanabilir.

  • Eğer eşleşmeler belirtilmişse, bu web uygulamaları bağlanabilir:

"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • Eğer boş olarak belirtilirse: "externally_connectable": {}, hiçbir uygulama veya web sitesi bağlantı kuramaz.

Burada belirtilen daha az uzantı ve URL olduğunda, saldırı yüzeyi daha küçük olacaktır.

Eğer XSS'ye duyarlı veya ele geçirilebilir bir web sayfası externally_connectable içinde belirtilmişse, bir saldırgan mesajları doğrudan arka plan betiğine gönderebilir, İçerik Betiği ve CSP'sini tamamen atlayarak.

Bu nedenle, bu çok güçlü bir atlatmadır.

Ayrıca, istemci yanlış bir uzantı yüklerse, hatta savunmasız uzantı ile iletişim kurmasına izin verilmiyorsa, izin verilen bir web sayfasına XSS verisi enjekte edebilir veya hedeflenen bir alan adındaki istekleri manipüle etmek için WebRequest veya DeclarativeNetRequest API'larını kötüye kullanabilir ve bir sayfanın isteğini bir JavaScript dosyası için değiştirebilir. (Hedeflenen sayfadaki CSP bu saldırıları önleyebilir). Bu fikir bu yazıdan gelmektedir.

Web ↔︎ İçerik Betiği İletişimi

İçerik betiklerinin çalıştığı ortamlar ve ana sayfaların bulunduğu ortamlar birbirinden ayrılmış olup, izolasyonu sağlar. Bu izolasyona rağmen, her ikisi de sayfanın Belge Nesne Modeli (DOM) ile etkileşimde bulunma yeteneğine sahiptir, ortak bir kaynak. Ana sayfanın içerik betiği ile iletişim kurabilmesi veya dolaylı olarak içerik betiği aracılığıyla uzantı ile iletişim kurabilmesi için, her iki tarafın da erişebildiği DOM'u iletişim kanalı olarak kullanması gerekmektedir.

Mesaj Gönderme

content-script.js
var port = chrome.runtime.connect();

window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}

if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
port.postMessage(event.data.text);
}
}, false);
example.js
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);

Güvenli bir Post Message iletişimi alınan iletiğin doğruluğunu kontrol etmelidir, bunu şu şekilde kontrol edebilirsiniz:

  • event.isTrusted: Bu, yalnızca olayın bir kullanıcı eylemi tarafından tetiklendiğinde True olur

  • İçerik betiği, kullanıcının belirli bir eylem gerçekleştirmesini bekleyebilir

  • köken alanı: yalnızca belirli bir alan adı beyaz listesinden bir ileti bekleyebilir.

  • Bir regex kullanılıyorsa, çok dikkatli olunmalıdır

  • Kaynak: received_message.source !== window mesajın İçerik Betiğinin dinlediği pencereden gelip gelmediğini kontrol etmek için kullanılabilir.

Önceki kontroller, yapılsa bile, savunmasız olabilir, bu nedenle aşağıdaki sayfada potansiyel Post Message atlamalarını kontrol edin:

pagePostMessage Vulnerabilities

Iframe

Başka bir iletişim yolu olası bir şekilde Iframe URL'leri aracılığıyla olabilir, bir örnek bulabilirsiniz:

pageBrowExt - XSS Example

DOM

Bu "tam olarak" bir iletişim yolu değil, ancak web ve içerik betiği web DOM'a erişebilir. Dolayısıyla, eğer içerik betiği bazı bilgileri okuyorsa, web DOM'una güveniyorsa, web bu verileri değiştirebilir (çünkü web'e güvenilmemeli veya web XSS'e duyarlı olabilir) ve İçerik Betiği tehlikeye girebilir.

Bir DOM tabanlı XSS örneğiyle bir tarayıcı uzantısını tehlikeye atmak için aşağıdaki örneği bulabilirsiniz:

pageBrowExt - XSS Example

Bellek/Kod İçinde Hassas Bilgiler

Bir Tarayıcı Uzantısı, hassas bilgileri belleğinde saklarsa, bu bilgiler dökülebilir (özellikle Windows makinelerinde) ve bu bilgiler için arama yapılabilir.

Bu nedenle, Tarayıcı Uzantısının belleği güvenli kabul edilmemeli ve kimlik bilgileri veya mnemonik ifadeler gibi hassas bilgilerin saklanmaması gerekmektedir.

Tabii ki, hassas bilgileri kod içine koymayın, çünkü bu bilgiler genel olacaktır.

Tarayıcıdan belleği dökmek için işlem belleğini dökebilirsiniz veya tarayıcı uzantısının ayarlarına gitmek için İçeriği İncele -> Bellek bölümünde Anlık görüntü al ve hassas bilgileri aramak için CTRL+F tıklayın.

İçerik Betiği ↔︎ Arka Plan Betiği İletişimi

Bir İçerik Betiği, runtime.sendMessage() veya tabs.sendMessage() fonksiyonlarını kullanarak bir kereye mahsus JSON-serileştirilebilir bir ileti gönderebilir.

Yanıtı işlemek için dönen Promise'ı kullanın. Ancak, geriye dönük uyumluluk için hala bir geri çağrıyı son argüman olarak iletebilirsiniz.

Bir içerik betiğinden bir istek göndermek şöyle görünebilir:

(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

Uzantıdan bir istek gönderme (genellikle bir arka plan betiği) Bir İçerik Betiği, fonksiyonları kullanabilir, ancak hangi sekmeye gönderileceğini belirtmeniz gerekir. Seçilen sekmedeki içerik betiğine mesaj göndermenin bir örneği:

// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

Alıcı tarafında, mesajı işlemek için bir runtime.onMessage olay dinleyicisi kurmanız gerekmektedir. Bu, içerik betiği veya uzantı sayfasından aynı şekilde görünmektedir.

// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);

Öne çıkarılan örnekte, sendResponse() senkron bir şekilde yürütüldü. sendResponse()'ın asenkron yürütülmesi için onMessage olay işleyicisini değiştirmek için return true; dahil etmek hayati önem taşır.

Birden fazla sayfanın onMessage olaylarını alacağı senaryolarda, belirli bir olay için sendResponse()'ı yürüten ilk sayfa yanıtı etkili bir şekilde iletebilecek tek sayfa olacaktır. Aynı olaya yönelik herhangi bir sonraki yanıt dikkate alınmayacaktır.

Yeni uzantılar oluşturulurken, tercih, geri aramalar yerine söz verilere olmalıdır. Geri aramaların kullanımıyla ilgili olarak, sendResponse() fonksiyonu yalnızca senkron bağlamda doğrudan yürütülüyorsa veya olay işleyicisi asenkron bir işlemi belirtiyorsa true döndürüyorsa geçerli kabul edilir. Hiçbir işleyicinin true döndürmemesi durumunda veya sendResponse() fonksiyonu bellekten kaldırılırsa (çöp toplama), sendMessage() fonksiyonuyla ilişkilendirilen geri arama varsayılan olarak tetiklenir.

Tarayıcıda Bir Uzantı Yükleme

  1. Tarayıcı Uzantısını İndirin ve açın

  2. chrome://extensions/ adresine gidin ve Geliştirici Modu'nu etkinleştirin

  3. Paketlenmemiş yükleyin düğmesine tıklayın

Firefox'da about:debugging#/runtime/this-firefox adresine gidin ve Geçici Eklenti Yükle düğmesine tıklayın.

Mağazadan kaynak kodunu alma

Bir Chrome uzantısının kaynak kodu çeşitli yöntemlerle elde edilebilir. Aşağıda her seçenek için detaylı açıklamalar ve talimatlar bulunmaktadır.

Komut Satırı Aracılığıyla ZIP Olarak Uzantı İndirme

Bir Chrome uzantısının kaynak kodu, komut satırını kullanarak ZIP dosyası olarak indirilebilir. Bu, belirli bir URL'den ZIP dosyasını almak için curl'ün kullanılmasını ve ardından ZIP dosyasının içeriğini bir dizine çıkarmayı içerir. İşte adımlar:

  1. "extension_id" yerine gerçek uzantı kimliğini yazın.

  2. Aşağıdaki komutları çalıştırın:

extension_id=your_extension_id   # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"

CRX Viewer websitesini kullanın

https://robwu.nl/crxviewer/

CRX Viewer uzantısını kullanın

Başka bir pratik yöntem, açık kaynaklı bir proje olan Chrome Extension Source Viewer'ı kullanmaktır. Bu uzantıyı Chrome Web Mağazası'ndan yükleyebilirsiniz. Görüntüleyicinin kaynak kodu GitHub deposunda bulunmaktadır.

Yerel olarak yüklenen uzantının kaynağını görüntüleyin

Yerel olarak yüklenen Chrome uzantıları da incelenebilir. İşte yapmanız gerekenler:

  1. "Profile Path" alanını bulmak için chrome://version/ adresine giderek Chrome yerel profil dizinine erişin.

  2. Profil dizini içindeki Extensions/ alt klasörüne gidin.

  3. Bu klasör genellikle okunabilir bir formatta kaynak kodlarıyla birlikte tüm yüklenmiş uzantıları içerir.

Uzantıları tanımlamak için ID'lerini isimlerine eşleyebilirsiniz:

  • Her uzantının ID'lerini görmek için about:extensions sayfasında Geliştirici Modunu etkinleştirin.

  • Her uzantının klasörü içindeki manifest.json dosyası, uzantıyı tanımanıza yardımcı olan okunabilir bir name alanı içerir.

Bir Dosya Arşivleyici veya Açıcı Kullanın

Chrome Web Mağazasına gidin ve uzantıyı indirin. Dosyanın uzantısı .crx olacaktır. Dosya uzantısını .crx'den .zip'e değiştirin. ZIP dosyasının içeriğini çıkarmak için WinRAR, 7-Zip vb. gibi herhangi bir dosya arşivleyicisini kullanın.

Chrome'da Geliştirici Modunu Kullanın

Chrome'u açın ve chrome://extensions/ adresine gidin. Sağ üst köşede "Geliştirici modunu" etkinleştirin. "Paketlenmemiş uzantıyı yükle..." üzerine tıklayın. Uzantının dizinine gidin. Bu, kaynak kodu indirmese de zaten indirilmiş veya geliştirilmiş bir uzantının kodunu görüntülemek ve değiştirmek için kullanışlıdır.

Güvenlik Denetim Kontrol Listesi

Tarayıcı Uzantılarının sınırlı saldırı yüzeyine sahip olmalarına rağmen, bazıları zafiyetler veya potansiyel sıkılaştırma iyileştirmeleri içerebilir. Aşağıdakiler en yaygın olanlardır:

Araçlar

  • Sağlanan bir Chrome web mağazası bağlantısından herhangi bir Chrome uzantısını çeker.

  • manifest.json görüntüleyici: uzantının manifest dosyasının JSON düzgünleştirilmiş bir sürümünü basitçe görüntüler.

  • Parmak İzi Analizi: web_accessible_resources tespiti ve Chrome uzantısı parmak izi oluşturma JavaScript'inin otomatik oluşturulması.

  • Potansiyel Clickjacking Analizi: web_accessible_resources yönergesiyle uzantı HTML sayfalarının tespiti. Bu sayfalar, sayfaların amacına bağlı olarak clickjacking'e karşı potansiyel olarak savunmasız olabilir.

  • İzin Uyarıları Görüntüleyici: bir kullanıcının uzantıyı yüklemeye çalıştığında görüntülenecek tüm Chrome izin uyarılarının bir listesini gösterir.

  • Tehlikeli Fonksiyon(lar): bir saldırgan tarafından kötüye kullanılabilecek tehlikeli fonksiyonların konumunu gösterir (örneğin, innerHTML, chrome.tabs.executeScript gibi fonksiyonlar).

  • Giriş Noktası(lar): uzantının kullanıcı/dış giriş aldığı yerleri gösterir. Bu, bir uzantının yüzey alanını anlamak ve uzantıya kötü niyetli şekilde oluşturulmuş veri göndermek için potansiyel noktaları aramak için kullanışlıdır.

  • Tehlikeli Fonksiyon(lar) ve Giriş Noktası(lar) tarayıcıları şunları içerir:

  • Uyarı oluşturan ilgili kod parçası ve satır.

  • Sorunun açıklaması.

  • Kodu içeren tam kaynak dosyasını görüntülemek için "Dosyayı Görüntüle" düğmesi.

  • Uyarı verilen dosyanın yolu.

  • Uyarı verilen dosyanın tam Chrome uzantısı URI'si.

  • Dosyanın türü, Arka Plan Sayfası betiği, İçerik Betiği, Tarayıcı Eylemi vb.

  • Eğer zafiyetli satır bir JavaScript dosyasında ise, dahil edildiği tüm sayfaların yolları ve bu sayfaların türleri, ve web_accessible_resource durumu.

  • İçerik Güvenlik Politikası (CSP) analizcisi ve atlatma denetleyicisi: Uzantınızın CSP'sindeki zayıflıkları belirler ve whitelistlenmiş CDN'ler vb. nedeniyle CSP'nizi atlamak için potansiyel yolları aydınlatır.

  • Bilinen Zafiyetli Kütüphaneler: Retire.js kullanarak bilinen-zafiyetli JavaScript kütüphanelerinin kullanımını kontrol eder.

  • Uzantıyı indirme ve biçimlendirilmiş sürümleri indirme.

  • Orijinal uzantıyı indirme.

  • Uzantının güzelleştirilmiş sürümünü indirme (otomatik olarak düzeltilmiş HTML ve JavaScript).

  • Tarama sonuçlarının otomatik önbelleğe alınması, bir uzantı taraması yapmak ilk seferinde biraz zaman alabilir. Ancak ikinci kez, uzantı güncellenmediyse sonuçlar önbelleğe alındığından neredeyse anlık olacaktır.

  • Bağlantılabilir Rapor URL'leri, Tarnish tarafından oluşturulan bir uzantı raporuna başka birine kolayca bağlantı sağlar.

Proje Neto, Firefox ve Chrome gibi popüler tarayıcılar için tarayıcı eklentilerinin ve uzantılarının gizli özelliklerini analiz etmek ve açığa çıkarmak için tasarlanmış Python 3 paketidir. Bu paket, paketlenmiş dosyaları açmak için otomatikleştirilmiş bir süreç olan manifest.json, yerelleştirme klasörleri veya JavaScript ve HTML kaynak dosyaları gibi ilgili kaynaklardan bu özellikleri çıkarmayı otomatikleştirir.

Referanslar

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

HackTricks'i desteklemenin diğer yolları:

Last updated