diff --git a/src/SUMMARY.md b/src/SUMMARY.md index abe382dcf..be4d4275a 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -837,9 +837,14 @@ - [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md) - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) -- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.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) + - [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md) + - [ios CVE-2021-30807-IOMobileFrameBuffer](binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md) + - [ios Corellium](binary-exploitation/ios-exploiting/ios-corellium.md) + - [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md) + - [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md) + # ЁЯдЦ AI - [AI Security](AI/README.md) diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md index 0bf70a7c4..05bea2576 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -3,56 +3,56 @@ {{#include ../banners/hacktricks-training.md}} > [!WARNING] -> рдЗрд╕ рддрдХрдиреАрдХ рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) рдореЗрдВ рдореВрд▓ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦреЗрдВред +> рдЗрд╕ рддрдХрдиреАрдХ рдХреА рдЧрд╣рди рд╕рдордЭ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦреЗрдВ [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) -## Enhancing Race Condition Attacks +## Race Condition рд╣рдорд▓реЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдирд╛ -Race conditions рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдзрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрдиреБрд░реЛрдз рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрднрд╛рд▓реЗ рдЬрд╛рдПрдВ, **рдЙрдирдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рдордп рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЕрдВрддрд░ рдХреЗ рд╕рд╛рдетАФрдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, 1ms рд╕реЗ рдХрдо**ред +race conditions рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдзрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрдИ requests рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдВ, рдФрд░ рдЙрдирдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЯрд╛рдЗрдо рдореЗрдВ **рдмрд╣реБрдд рдХрдо рдЕрдВрддрд░ тАФ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ 1ms рд╕реЗ рдХрдо** рд╣реЛред -рдпрд╣рд╛рдВ рдХреБрдЫ рддрдХрдиреАрдХреЗрдВ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ: +рдпрд╣рд╛рдБ рдЖрдк Requests рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрдХрдиреАрдХреЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: #### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization -- **HTTP/2**: рдПрдХрд▓ TCP рдХрдиреЗрдХреНрд╢рди рдкрд░ рджреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдиреЗрдЯрд╡рд░реНрдХ рдЬрд┐рдЯрд░ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рднрд┐рдиреНрдирддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рджреЛ рдЕрдиреБрд░реЛрдз рдПрдХ рд╕реБрд╕рдВрдЧрдд race condition exploit рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред -- **HTTP/1.1 'Last-Byte Sync'**: 20-30 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧреЛрдВ рдХреЛ рдкреВрд░реНрд╡-рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рдПрдХ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкрд╣реБрдВрдЪрдиреЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред +- **HTTP/2**: рдПрдХрд▓ TCP рдХрдиреЗрдХреНрд╢рди рдкрд░ рджреЛ requests рднреЗрдЬрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ network jitter рдХрд╛ рдкреНрд░рднрд╛рд╡ рдХрдо рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, server-side рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рджреЛ requests рдПрдХ рд╕реНрдерд┐рд░ race condition exploit рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред +- **HTTP/1.1 'Last-Byte Sync'**: 20-30 requests рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ fragment рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рд╕рд╛рде рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ server рдкрд░ рдПрдХ рд╕рд╛рде рдЖрдЧрдорди рд╣рд╛рд╕рд┐рд▓ рд╣реЛрддрд╛ рд╣реИред -**Last-Byte Sync рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░реА** рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: +**Preparation for Last-Byte Sync** рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: -1. рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЗрдбрд░ рдФрд░ рдмреЙрдбреА рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ред +1. headers рдФрд░ body рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрддрд┐рдо byte рдХреЛ рдЫреЛрдбрд╝рдХрд░ рднреЗрдЬрдирд╛, stream рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ред 2. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж 100ms рдХреЗ рд▓рд┐рдП рд░реБрдХрдирд╛ред -3. рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдХреЛ рдмреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Nagle рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TCP_NODELAY рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ред -4. рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЧрд░реНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдВрдЧ рдХрд░рдирд╛ред +3. рдЕрдВрддрд┐рдо frames рдХреЛ рдмреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TCP_NODELAY рдХреЛ disable рдХрд░рдирд╛ рддрд╛рдХрд┐ Nagle's algorithm рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рд╕рдХреЗред +4. рдХрдиреЗрдХреНрд╢рди рдХреЛ warm up рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ping рдХрд░рдирд╛ред -рд░реЛрдХреЗрдВ рдЧрдП рдлреНрд░реЗрдо рдХрд╛ рдЕрдЧрд▓рд╛ рднреЗрдЬрдирд╛ рдПрдХрд▓ рдкреИрдХреЗрдЯ рдореЗрдВ рдЙрдирдХреА рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ Wireshark рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ RC рд╣рдорд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред +рдмрд╛рдж рдореЗрдВ рд░реЛрдХреЗ рдЧрдП frames рдХреЛ рднреЗрдЬрдиреЗ рдкрд░ рдЙрдирдХрд╛ рдЖрдЧрдорди рдПрдХ single packet рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ Wireshark рдХреЗ рдЬрд░рд┐рдП verify рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ static files рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ RC attacks рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗред -### Adapting to Server Architecture +### Server Architecture рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреВрд▓рди -рд▓рдХреНрд╖реНрдп рдХреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░реВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдордп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдорд╣рддреНрд╡рд╣реАрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реНрд╡-emptive рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХрдиреЗрдХреНрд╢рди рдЧрд░реНрдо рдХрд░рдирд╛, рдЕрдиреБрд░реЛрдз рд╕рдордп рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред +рд▓рдХреНрд╖реНрдп рдХреА architecture рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред Front-end servers requests рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ route рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ timing рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреА рд╣реИред рдорд╣рддреНрд╡рд╣реАрди requests рдХреЗ рдЬрд░рд┐рдП preemptive server-side connection warming request timing рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред #### Handling Session-Based Locking -PHP рдХреЗ рд╕рддреНрд░ рд╣реИрдВрдбрд▓рд░ рдЬреИрд╕реЗ рдврд╛рдВрдЪреЗ рд╕рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рддреНрд░ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред +PHP рдЬреИрд╕реЗ frameworks рдХрд╛ session handler рд╕рддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ requests рдХреЛ serialize рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд vulnerabilities рдЫрд┐рдк рд╕рдХрддреА рд╣реИрдВред рд╣рд░ request рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ session tokens рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ circumvent рдХрд░ рд╕рдХрддрд╛ рд╣реИред #### Overcoming Rate or Resource Limits -рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рдЧрд░реНрдо рдХрд░рдирд╛ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИ, рддреЛ dummy рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдмрд╛рдврд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рджрд░ рдпрд╛ рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛ рд╡рд┐рд▓рдВрдм рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдПрдХрд▓-рдкреИрдХреЗрдЯ рд╣рдорд▓реЗ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╡рд┐рд▓рдВрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ race conditions рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИред +рдпрджрд┐ connection warming рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИ, рддреЛ dummy requests рдХреЗ рдмрд╛рдврд╝ рдХреЗ рдЬрд░рд┐рдП web servers рдХреЗ rate рдпрд╛ resource limits рджреНрд╡рд╛рд░рд╛ рджреЗрд░реА рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдмреВрдЭрдХрд░ trigger рдХрд░рдирд╛ single-packet attack рдХреЛ рд╕реБрдЧрдо рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ server-side delay рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ race conditions рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрддрд╛ рд╣реИред ## Attack Examples -- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: рдЖрдк рдЕрдиреБрд░реЛрдз рдХреЛ **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`) рдкрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЙрд╕ рдорд╛рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк **`%s`** рдХреЗ рд▓рд┐рдП рдмреНрд░реВрдЯ рдлреЛрд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` рдФрд░ рдлрд┐рд░ рдбреНрд░реЙрдк рдбрд╛рдЙрди рд╕реЗ **`examples/race-single-packer-attack.py`** рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ: +- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: рдЖрдк request рдХреЛ **Turbo intruder** рдХреЛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), рдЖрдк request рдореЗрдВ рдЙрд╕ value рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк brute force рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ **`%s`** рдЬреИрд╕реЗ `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` рдФрд░ рдлрд┐рд░ drop down рд╕реЗ **`examples/race-single-packer-attack.py`** рдЪреБрдиреЗрдВ:
-рдпрджрд┐ рдЖрдк **рд╡рд┐рднрд┐рдиреНрди рдорд╛рди рднреЗрдЬрдиреЗ** рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рдПрдХ рд╢рдмреНрдж рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: +рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ values рднреЗрдЬрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк code рдХреЛ рдЗрд╕ рддрд░рд╣ modify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ clipboard рд╕реЗ рдПрдХ wordlist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: ```python passwords = wordlists.clipboard for password in passwords: engine.queue(target.req, password, gate='race1') ``` > [!WARNING] -> рдпрджрд┐ рд╡реЗрдм HTTP2 рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ HTTP1.1) рддреЛ `Engine.THREADED` рдпрд╛ `Engine.BURP` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, `Engine.BURP2` рдХреЗ рдмрдЬрд╛рдпред +> рдЕрдЧрд░ рд╡реЗрдм HTTP2 рдХреЛ рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ (рдХреЗрд╡рд▓ HTTP1.1) рддреЛ `Engine.THREADED` рдпрд╛ `Engine.BURP` рдХрд╛ рдЙрдкрдпреЛрдЧ `Engine.BURP2` рдХреА рдмрдЬрд╛рдп рдХрд░реЗрдВред -- **Tubo Intruder - HTTP2 рдПрдХрд▓-рдкреИрдХреЗрдЯ рд╣рдорд▓рд╛ (рдХрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯ)**: рдпрджрд┐ рдЖрдкрдХреЛ 1 рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдкрд░ рдХрдИ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ RCE рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рддреЛ рдЖрдк `race-single-packet-attack.py` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: +- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: рдпрджрд┐ рдЖрдкрдХреЛ 1 endpoint рдкрд░ рдПрдХ request рднреЗрдЬрдиреА рд╣реЛ рдФрд░ рдлрд┐рд░ RCE рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп endpoints рдкрд░ рдХрдИ requests рднреЗрдЬрдиреА рд╣реЛрдВ, рддреЛ рдЖрдк `race-single-packet-attack.py` script рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt) # send all the queued requests for this attempt engine.openGate(currentAttempt) ``` -- рдпрд╣ **Repeater** рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ, Burp Suite рдореЗрдВ рдирдП '**Send group in parallel**' рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред -- **limit-overrun** рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рдореВрд╣ рдореЗрдВ **рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз 50 рдмрд╛рд░** рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред -- **connection warming** рдХреЗ рд▓рд┐рдП, рдЖрдк **group** рдХреЗ **рд╢реБрд░реБрдЖрдд** рдореЗрдВ рдХреБрдЫ **рдЕрдиреБрд░реЛрдз** рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдХреБрдЫ рдЧреИрд░-рд╕реНрдерд┐рд░ рднрд╛рдЧ рдкрд░ рд╣реЛрдВред -- **delaying** рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП **рдПрдХ рдЕрдиреБрд░реЛрдз рдФрд░ рджреВрд╕рд░реЗ** рдХреЗ рдмреАрдЪ **рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг** рдореЗрдВ 2 рдЙрдк-рд░рд╛рдЬреНрдп рдЪрд░рдгреЛрдВ рдореЗрдВ, рдЖрдк **рджреЛрдиреЛрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрд░реЛрдз рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ**ред -- **multi-endpoint** RC рдХреЗ рд▓рд┐рдП, рдЖрдк **request** рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ **hidden state** рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж **50 requests** рдЬреЛ **hidden state** рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред +- рдпрд╣ **Repeater** рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ, Burp Suite рдХреЗ рдирдП '**Send group in parallel**' рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред +- **limit-overrun** рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рдореВрд╣ рдореЗрдВ **рдЙрд╕реА рдЕрдиреБрд░реЛрдз рдХреЛ 50 рдмрд╛рд░** рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред +- **connection warming** рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рдореВрд╣ рдХреЗ **beginning** рдореЗрдВ web server рдХреЗ рдХрд┐рд╕реА non static рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ **requests** рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред +- рджреЛ рдЙрдк-рд╕реНрдЯреЗрдЯреНрд╕ рд╡рд╛рд▓реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдФрд░ рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ **between** рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ **delaying** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛрдиреЛрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрддрд┐рд░рд┐рдХреНрдд **requests** рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред +- рдПрдХ **multi-endpoint** RC рдХреЗ рд▓рд┐рдП рдЖрдк рд╡рд╣ **request** рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ **goes to the hidden state**, рдФрд░ рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЙрд╕ рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдЯреЗрдЯ рдХреЛ **exploits the hidden state** рдХрд░рдиреЗ рд╡рд╛рд▓реЗ **50 requests** рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
-- **Automated python script**: рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдИрдореЗрд▓ рдмрджрд▓рдирд╛ рд╣реИ рдЬрдмрдХрд┐ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдирдП рдИрдореЗрд▓ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдЯреЛрдХрди рдЕрдВрддрд┐рдо рдИрдореЗрд▓ рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ (рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдореЗрдВ рдПрдХ RC рджреЗрдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдЬрд╣рд╛рдВ рдПрдХ рдИрдореЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рд▓реЗрдХрд┐рди рд╕рддреНрдпрд╛рдкрди рдкреБрд░рд╛рдиреЗ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдИрдореЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рднрд░рд╛ рд╣реБрдЖ рдерд╛)ред\ -рдЬрдм рдкреНрд░рд╛рдкреНрдд рдИрдореЗрд▓ рдореЗрдВ "objetivo" рд╢рдмреНрдж рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдмрджрд▓реЗ рдЧрдП рдИрдореЗрд▓ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ рдФрд░ рд╣рдо рд╣рдорд▓реЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред +- **Automated python script**: рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ email рдмрджрд▓рдирд╛ рд╣реИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЙрд╕реЗ verify рдХрд░рддреЗ рд░рд╣рдирд╛ рд╣реИ рдЬрдм рддрдХ рдирдП email рдХрд╛ verification token рдЕрдВрддрд┐рдо email рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ (рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ RC рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд╣рд╛рдБ email рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ рд▓реЗрдХрд┐рди verification рдкреБрд░рд╛рдиреЗ рдИрдореЗрд▓ рдкрд░ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ email рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ variable рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА populated рдерд╛)ред\ +рдЬрдм рдкреНрд░рд╛рдкреНрдд рдИрдореЗрд▓реНрд╕ рдореЗрдВ рд╢рдмреНрдж "objetivo" рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдмрджрд▓реЗ рдЧрдП рдИрдореЗрд▓ рдХрд╛ verification token рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдо рд╣рдорд▓рд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред ```python # https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun # Script from victor to solve a HTB challenge @@ -217,22 +217,22 @@ h2_conn.close_connection() response = requests.get(url, verify=False) ``` -### рдПрдХрд▓ рдкреИрдХреЗрдЯ рд╣рдорд▓реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ +### Single Packet Attack рдореЗрдВ рд╕реБрдзрд╛рд░ -рдореВрд▓ рд╢реЛрдз рдореЗрдВ рдпрд╣ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╣рдорд▓реЗ рдХреА рд╕реАрдорд╛ 1,500 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, [**рдЗрд╕ рдкреЛрд╕реНрдЯ**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) рдореЗрдВ рдпрд╣ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХрд▓ рдкреИрдХреЗрдЯ рд╣рдорд▓реЗ рдХреА 1,500-рдмрд╛рдЗрдЯ рд╕реАрдорд╛ рдХреЛ **IP рд▓реЗрдпрд░ рдлреНрд░реИрдЧреНрдореЗрдВрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TCP рдХреА 65,535 B рд╡рд┐рдВрдбреЛ рд╕реАрдорд╛** рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХрд▓ рдкреИрдХреЗрдЯ рдХреЛ рдХрдИ IP рдкреИрдХреЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рднреЗрдЬрдирд╛, рдЬрд┐рд╕рд╕реЗ рдкреИрдХреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдлреНрд░реИрдЧреНрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗред рдЗрд╕ рддрдХрдиреАрдХ рдиреЗ рд╢реЛрдзрдХрд░реНрддрд╛ рдХреЛ рд▓рдЧрднрдЧ 166ms рдореЗрдВ 10,000 рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред +рдореВрд▓ рд░рд┐рд╕рд░реНрдЪ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ attack рдХреА рд╕реАрдорд╛ 1,500 bytes рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ IP layer fragmentation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ single packet attack рдХреА 1,500-byte рд╕реАрдорд╛ рдХреЛ TCP рдХреА 65,535 B window limitation рддрдХ рдмрдврд╝рд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдПрдХ single packet рдХреЛ рдХрдИ IP packets рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рднреЗрдЬрдирд╛, рдЬрд┐рд╕рд╕реЗ рддрдм рддрдХ packet рдХрд╛ рдкреБрдирдГ рд╕рдВрдпреЛрдЬрди рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╕рднреА fragments server рддрдХ рди рдкрд╣реБрдБрдЪ рдЬрд╛рдПрдБред рдЗрд╕ рддрдХрдиреАрдХ рдиреЗ researcher рдХреЛ рд▓рдЧрднрдЧ 166ms рдореЗрдВ 10,000 requests рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдзрд╛рд░ RC рдореЗрдВ рд╣рдорд▓реЗ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реИрдХрдбрд╝реЛрдВ/рд╣рдЬрд╛рд░реЛрдВ рдкреИрдХреЗрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреБрдЫ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реАрдорд╛рдПрдБ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп HTTP рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ Apache, Nginx рдФрд░ Go рдореЗрдВ `SETTINGS_MAX_CONCURRENT_STREAMS` рд╕реЗрдЯрд┐рдВрдЧ 100, 128 рдФрд░ 250 рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рдЬреИрд╕реЗ NodeJS рдФрд░ nghttp2 рдореЗрдВ рдпрд╣ рдЕрд╕реАрдорд┐рдд рд╣реИред\ -рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ Apache рдПрдХрд▓ TCP рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдХреЗрд╡рд▓ 100 HTTP рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ (рдЗрд╕ RC рд╣рдорд▓реЗ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛)ред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдзрд╛рд░ рдЙрди RC рдорд╛рдорд▓реЛрдВ рдореЗрдВ attack рдХреЛ рдЕрдзрд┐рдХ reliable рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ/рд╣рдЬрд╝рд╛рд░реЛрдВ packets рдХреЛ рдПрдХ рд╕рд╛рде рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдХреБрдЫ software рд╕реАрдорд╛рдПрдБ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп HTTP servers рдЬреИрд╕реЗ Apache, Nginx рдФрд░ Go рдореЗрдВ `SETTINGS_MAX_CONCURRENT_STREAMS` рд╕реЗрдЯрд┐рдВрдЧ рдХрдбрд╝рд╛рдИ рд╕реЗ 100, 128 рдФрд░ 250 рдкрд░ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рдЬреИрд╕реЗ NodeJS рдФрд░ nghttp2 рдореЗрдВ рдпрд╣ unlimited рд╣реИ.\ +рдЗрд╕рдХрд╛ рдореВрд▓ рдорддрд▓рдм рд╣реИ рдХрд┐ Apache рдХреЗрд╡рд▓ рдПрдХ single TCP connection рд╕реЗ 100 HTTP connections рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ (рдЬреЛ рдЗрд╕ RC attack рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ)ред -рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main) рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ repo рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/Ry0taK/first-sequence-sync/tree/main -## рдХрдЪреНрдЪрд╛ BF +## Raw BF -рдкрд┐рдЫрд▓реЗ рд╢реЛрдз рд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЫ рдкреЗрд▓реЛрдб рдереЗ рдЬреЛ рдХреЗрд╡рд▓ рдкреИрдХреЗрдЯ рдХреЛ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рдереЗ рддрд╛рдХрд┐ рдПрдХ RC рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХреЗред +рдкрд┐рдЫрд▓реЗ research рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдРрд╕реЗ payloads рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рдереЗ рдЬреЛ рдХреЗрд╡рд▓ packets рдХреЛ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рдереЗ рддрд╛рдХрд┐ RC рдкреИрджрд╛ рд╣реЛ рд╕рдХреЗред -- **рд░реАрдкреАрдЯрд░:** рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред -- **рдЗрдВрдЯреНрд░реВрдбрд░**: **Intruder** рдХреЛ **рдЕрдиреБрд░реЛрдз** рднреЗрдЬреЗрдВ, **рд╡рд┐рдХрд▓реНрдк рдореЗрдиреВ рдореЗрдВ** **рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛** рдХреЛ **30** рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ **Null payloads** рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд▓реЛрдб рдЪреБрдиреЗрдВ рдФрд░ **30** рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред -- **рдЯрд░реНрдмреЛ рдЗрдВрдЯреНрд░реВрдбрд░** +- **Repeater:** рдкрд┐рдЫрд▓реЗ рд╕реЗрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред +- **Intruder**: **request** рдХреЛ **Intruder** рдкрд░ рднреЗрдЬреЗрдВ, **Options menu** рдХреЗ рдЕрдВрджрд░ **number of threads** рдХреЛ **30** рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, payload рдХреЗ рд░реВрдк рдореЗрдВ **Null payloads** рдЪреБрдиреЗрдВ рдФрд░ **30** рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред +- **Turbo Intruder** ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -283,71 +283,71 @@ asyncio.run(main()) ### Limit-overrun / TOCTOU -рдпрд╣ рд░реЗрд╕ рдХрдВрдбреАрд╢рди рдХрд╛ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд╣рд╛рдБ **рдХрдордЬреЛрд░рд┐рдпрд╛рдБ** рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ **рдкреНрд░рдХрдЯ** рд╣реЛрддреА рд╣реИрдВ рдЬреЛ **рдЖрдкрдХреЛ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдмрд╛рд░ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ**ред рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╡реЗрдм рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рд╣реА рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдХреЛрдб рдХрд╛ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдПрдХ рдмрд╣реБрдд рдЖрд╕рд╛рди рдЙрджрд╛рд╣рд░рдг [**рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) рдпрд╛ [**рдЗрд╕ рдмрдЧ**](https://hackerone.com/reports/759247)** рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред** +рдпрд╣ race condition рдХрд╛ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд╣рд╛рдБ **vulnerabilities** рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ **рдкреНрд░рдХрдЯ** рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдХрд░рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ **рд╕реАрдорд┐рдд** рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡реЗрдм рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рд╣реА рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдХреЛрдб рдХреЛ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) рдпрд╛ [**this bug**](https://hackerone.com/reports/759247)**.** -рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд▓реЗ рдХреЗ рдХрдИ рд░реВрдк рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: +рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд▓реЗ рдХреЗ рдХрдИ рд░реВрдк рд╣реИрдВ, рдЬреИрд╕реЗ: -- рдПрдХ рдЙрдкрд╣рд╛рд░ рдХрд╛рд░реНрдб рдХреЛ рдХрдИ рдмрд╛рд░ рднреБрдирд╛рдирд╛ -- рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдХрдИ рдмрд╛рд░ рд░реЗрдЯрд┐рдВрдЧ рджреЗрдирд╛ -- рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдХреЗ рдмреИрд▓реЗрдВрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирдХрдж рдирд┐рдХрд╛рд▓рдирд╛ рдпрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ -- рдПрдХ рд╣реА CAPTCHA рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ -- рдПрдВрдЯреА-рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рджрд░ рд╕реАрдорд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ +- рдПрдХ gift card рдХреЛ рдХрдИ рдмрд╛рд░ redeem рдХрд░рдирд╛ +- рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд░реЗрдЯ рдХрд░рдирд╛ +- рдЕрдкрдиреЗ account balance рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рд╢рд┐ withdraw рдпрд╛ transfer рдХрд░рдирд╛ +- рдПрдХ рд╣реА CAPTCHA solution рдХреЛ reuse рдХрд░рдирд╛ +- Bypassing an anti-brute-force rate limit ### **Hidden substates** -рдЬрдЯрд┐рд▓ рд░реЗрд╕ рдХрдВрдбреАрд╢рдиреЛрдВ рдХрд╛ рд╢реЛрд╖рдг рдЕрдХреНрд╕рд░ рдЫрд┐рдкреЗ рд╣реБрдП рдпрд╛ **рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдорд╢реАрди рдЙрдк-рд░рд╛рдЬреНрдпреЛрдВ** рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ: +рдХрдард┐рди race conditions рдХрд╛ рдлрд╛рдпрджрд╛ рдЕрдХреНрд╕рд░ рдЙрди рдЫреЛрдЯреЗ рд╕рдордп-рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк hidden рдпрд╛ **unintended machine substates** рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВ: -1. **рд╕рдВрднрд╛рд╡рд┐рдд рдЫрд┐рдкреЗ рд╣реБрдП рдЙрдк-рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ** -- рдЙрди рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдпрд╛ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБред рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ: -- **рд╕реНрдЯреЛрд░реЗрдЬ**: рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ, рдмрдЬрд╛рдп рдЙрди рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╣реИрдВред -- **рдПрдХреНрд╢рди**: рдЙрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдирдП рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╢реЛрд╖рдг рдпреЛрдЧреНрдп рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВред -- **рдХреАрдЗрдВрдЧ**: рд╕рдлрд▓ рд╣рдорд▓реЗ рдЖрдорддреМрд░ рдкрд░ рдЙрд╕реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░ рдХреА рдЧрдИ рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдпрд╛ рд░реАрд╕реЗрдЯ рдЯреЛрдХрдиред -2. **рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ** -- рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдкрд░ рд░реЗрд╕ рдХрдВрдбреАрд╢рди рд╣рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рдХрд┐рд╕реА рднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рди рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВред рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдХрдордЬреЛрд░реА рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВред -3. **рдХрдордЬреЛрд░реА рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВ** -- рд╣рдорд▓реЗ рдХреЛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рджреЛред рдЗрд╕ рдЪрд░рдг рдореЗрдВ рд╕рдЯреАрдХ рд╕рдордп рдХреЗ рдХрд╛рд░рдг рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред +1. **Identify Potential Hidden Substates** +- рд╢реБрд░реБрдЖрдд рдЙрди endpoints рдХреА рдкрд╣рдЪрд╛рди рд╕реЗ рдХрд░реЗрдВ рдЬреЛ critical рдбреЗрдЯрд╛ рдЬреИрд╕реЗ user profiles рдпрд╛ password reset рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ modify рдпрд╛ interact рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ: +- **Storage**: рдЙрди endpoints рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдЬреЛ server-side persistent data рдХреЛ manipulate рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЙрдирдкрд░ рдЬреЛ client-side data рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред +- **Action**: рдРрд╕реЗ operations рдЦреЛрдЬреЗрдВ рдЬреЛ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ тАФ рдирдП рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдРрд╕реЗ рдСрдкрд░реЗрд╢рди exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред +- **Keying**: рд╕рдлрд▓ рд╣рдорд▓реЛрдВ рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рд╡рд╣реА identifier рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ username рдпрд╛ reset tokenред +2. **Conduct Initial Probing** +- рдкрд╣рдЪрд╛рдиреЗ рдЧрдП endpoints рдкрд░ race condition рд╣рдорд▓реЗ рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд▓рди рдХреЛ observe рдХрд░реЗрдВред рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд responses рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ vulnerability рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВред +3. **Demonstrate the Vulnerability** +- рд╣рдорд▓реЗ рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рдЕрдХреНрд╕рд░ рдмрд╕ рджреЛред рдЗрд╕ рдЪрд░рдг рдореЗрдВ precise timing рдХреЗ рдХрд╛рд░рдг рдХрдИ рдкреНрд░рдпрд╛рд╕ рдпрд╛ automation рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред ### Time Sensitive Attacks -рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдордп рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рд╕реБрд░рдХреНрд╖рд╛ рдЯреЛрдХрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЯреЛрдХрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред +рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдордп рдореЗрдВ рд╕рдЯреАрдХрддрд╛ vulnerabilities рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм security tokens рдХреЗ рд▓рд┐рдП timestamps рдЬреИрд╕реЗ predictable рддрд░реАрдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╣реЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, timestamp рдкрд░ рдЖрдзрд╛рд░рд┐рдд password reset tokens simultaneous requests рдХреЗ рд▓рд┐рдП identical tokens рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -**рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:** +To Exploit: -- рд╕рдЯреАрдХ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдПрдХрд▓ рдкреИрдХреЗрдЯ рд╣рдорд▓рд╛, рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдорд╛рди рдЯреЛрдХрди рдПрдХ рдХрдордЬреЛрд░реА рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред +- рд╕рдЯреАрдХ timing рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕реЗ single packet attack, рдПрдХ рд╕рд╛рде password reset requests рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред identical tokens vulnerability рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИрдВред -**рдЙрджрд╛рд╣рд░рдг:** +Example: -- рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдЯреЛрдХрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдореЗрд▓ рдЦрд╛рддреЗ рдЯреЛрдХрди рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рджреЛрд╖ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред +- рдПрдХ рд╣реА рд╕рдордп рдкрд░ рджреЛ password reset tokens request рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдпрджрд┐ tokens рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ token generation рдореЗрдВ рджреЛрд╖ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред -**рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **ред** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.** ## Hidden substates case studies ### Pay & add an Item -рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ **рднреБрдЧрддрд╛рди** рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ **рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд** рдЖрдЗрдЯрдо **рдЬреЛрдбрд╝реЗрдВ** рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП **рдЖрдкрдХреЛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА**ред +Check this [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) to see how to **pay** in a store and **add an extra** item you that **won't need to pay for it**. ### Confirm other emails -рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ **рдПрдХ рдИрдореЗрд▓ рдкрддреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореЗрдВ рдмрджрд▓реЗрдВ** рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдирдП рдмрджрд▓реЗ рдЧрдП рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред +рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдкрд░ рдХрд┐рд╕реА email address рдХреЛ verify рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ email рдореЗрдВ change рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдирдП email рдХреЛ verify рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред ### Change email to 2 emails addresses Cookie based -[**рдЗрд╕ рд╢реЛрдз**](https://portswigger.net/research/smashing-the-state-machine) рдХреЗ рдЕрдиреБрд╕рд╛рд░ Gitlab рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ **рдПрдХ рдИрдореЗрд▓ рдХреЗ рдИрдореЗрд▓ рд╕рддреНрдпрд╛рдкрди рдЯреЛрдХрди рдХреЛ рджреВрд╕рд░реЗ рдИрдореЗрд▓ рдкрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ**ред +According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ takeover рдХреЗ рд▓рд┐рдП vulnerable рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдПрдХ email рдХрд╛ email verification token рджреВрд╕рд░реЗ email рдкрд░ **send** рдХрд░ рд╕рдХрддрд╛ рдерд╛ред -**рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **ред** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.** ### Hidden Database states / Confirmation Bypass -рдпрджрд┐ **2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЦрди** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **рдЬрд╛рдирдХрд╛рд░реА** рдХреЛ **рдбреЗрдЯрд╛рдмреЗрд╕** рдХреЗ рдЕрдВрджрд░ **рдЬреЛрдбрд╝рдиреЗ** рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ **рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо** рдФрд░ **рдкрд╛рд╕рд╡рд░реНрдб** рдХреЛ **рд▓рд┐рдЦрд╛** рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ **рдлрд┐рд░ рдЯреЛрдХрди** рдХреЛ рдирдП рдмрдирд╛рдП рдЧрдП рдЦрд╛рддреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП **рдЦрд╛рддреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рд╢реВрдиреНрдп рд╣реИ**ред +рдпрджрд┐ рдХрд┐рд╕реА database рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП **2 different writes** рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рдордп-рдЦрд┐рдбрд╝рдХреА рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛ рд╣реА database рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, user рдмрдирд╛рддреЗ рд╕рдордп рдкрд╣рд▓реЗ **username** рдФрд░ **password** рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж newly created account рдХреЛ confirm рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП token рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯреЗ рд╕рдордп рд▓рд┐рдП account confirm рдХрд░рдиреЗ рдХрд╛ **token null** рд╣реЛ рд╕рдХрддрд╛ рд╣реИред -рдЗрд╕рд▓рд┐рдП **рдПрдХ рдЦрд╛рддрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рддреБрд░рдВрдд рдЦрд╛рд▓реА рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдХрдИ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛** (`token=` рдпрд╛ `token[]=` рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд┐рдиреНрдирддрд╛) рдПрдХ рдЦрд╛рддреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдИрдореЗрд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред +рдЗрд╕рд▓рд┐рдП рдПрдХ account register рдХрд░рдирд╛ рдФрд░ рддреБрд░рдВрдд account confirm рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА token рдХреЗ рд╕рд╛рде рдХрдИ requests рднреЗрдЬрдирд╛ (`token=` рдпрд╛ `token[]=` рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп variation) c**onfirm an account** рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк email рдХреЛ control рдирд╣реАрдВ рдХрд░рддреЗред -**рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **ред** +**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.** ### Bypass 2FA -рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд╕uedo-рдХреЛрдб рд░реЗрд╕ рдХрдВрдбреАрд╢рди рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕рдордп рдореЗрдВ **2FA рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛** рдЬрдмрдХрд┐ рд╕рддреНрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +The following pseudo-code is vulnerable to race condition because in a very small time the **2FA is not enforced** while the session is created: ```python session['userid'] = user.userid if user.mfa_enabled: @@ -355,24 +355,26 @@ session['enforce_mfa'] = True # generate and send MFA code to user # redirect browser to MFA code entry form ``` -### OAuth2 рд╕реНрдерд╛рдпреА рд╕реНрдерд╛рдпреАрддрд╛ +### OAuth2 рдХреА рд╢рд╛рд╢реНрд╡рдд рд╕реНрдерд┐рд░рддрд╛ -рдХрдИ [**OAUth рдкреНрд░рджрд╛рддрд╛**](https://en.wikipedia.org/wiki/List_of_OAuth_providers) рд╣реИрдВред рдпреЗ рд╕реЗрд╡рд╛рдПрдБ рдЖрдкрдХреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рддрд╛ рдиреЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, **рдХреНрд▓рд╛рдЗрдВрдЯ** рдХреЛ **рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди** рдХреЛ **OAUth рдкреНрд░рджрд╛рддрд╛** рдХреЗ рдЕрдВрджрд░ рдЙрдирдХреЗ рдХреБрдЫ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА **рдЕрдиреБрдорддрд┐** рджреЗрдиреА рд╣реЛрдЧреАред\ -рддреЛ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧрд┐рди рд╣реИ рдЬреИрд╕реЗ google/linkedin/github... рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рдкреГрд╖реНрда рдкрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: "_рдПрдкреНрд▓рд┐рдХреЗрд╢рди \ рдЖрдкрдХреА рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?_" +рдХрдИ [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers) рдореМрдЬреВрдж рд╣реИрдВред рдпреЗ рд╕реЗрд╡рд╛рдПрдБ рдЖрдкрдХреЛ рдПрдХ application рдмрдирд╛рдиреЗ рдФрд░ рдЙрди users рдХреЛ authenticate рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ provider рдиреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рд╣реИред +рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **client** рдХреЛ **permit your application** рдХрд░рдХреЗ **OAUth provider** рдХреЗ рдЕрдВрджрд░ рдЙрдирдХреЗ рдХреБрдЫ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред\ +рддреЛ, рдЕрдм рддрдХ рдпрд╣ рдмрд╕ google/linkedin/github... рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧрд┐рди рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рдкреЗрдЬ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реЛрддрд╛ рд╣реИ: "_Application \ wants to access you information, do you want to allow it?_" -#### `authorization_code` рдореЗрдВ рд░реЗрд╕ рдХрдВрдбреАрд╢рди +#### Race Condition in `authorization_code` -**рд╕рдорд╕реНрдпрд╛** рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдк **рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ** рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ **`authorization_code`** рдХреЛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрд╣ **рдПрдкреНрд▓рд┐рдХреЗрд╢рди OAUth рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рд░реЗрд╕ рдХрдВрдбреАрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП **`authorization_code`** рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ AT/RT (_Authentication Token/Refresh Token_) рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗред рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ рддрд╛рдХрд┐ **рдХрдИ рдЦрд╛рддреЗ рдмрдирд╛рдП рдЬрд╛ рд╕рдХреЗрдВ**ред рдлрд┐рд░, рдпрджрд┐ рдЖрдк **рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЬреЛрдбрд╝реА AT/RT рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЕрднреА рднреА рдорд╛рдиреНрдп рд░рд╣реЗрдВрдЧреА**ред +рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрднрд░рддреА рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ **accept it** рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ **`authorization_code`** malicious application рдХреЛ рднреЗрдЬ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) рдЖрдкрдХреЗ account рдХреЗ рд▓рд┐рдП **`authorization_code`** рд╕реЗред рдореВрд▓рддрдГ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ application рдХреЛ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ рддрд╛рдХрд┐ рдпрд╣ **create several accounts** рдХрд░ рд╕рдХреЗред рдпрджрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ application рдХреЛ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдЬреЛрдбрд╝реА AT/RT рд╣рдЯрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЬреЛрдбрд╝реАрдпрд╛рдБ рдЕрднреА рднреА valid рд░рд╣реЗрдВрдЧреАред -#### `Refresh Token` рдореЗрдВ рд░реЗрд╕ рдХрдВрдбреАрд╢рди +#### Race Condition in `Refresh Token` -рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк **рдПрдХ рдорд╛рдиреНрдп RT рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ** рддреЛ рдЖрдк **рдХрдИ AT/RT рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рдФрд░ **рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рднреА **рдХрдИ RTs рдорд╛рдиреНрдп рд░рд╣реЗрдВрдЧреАред** +рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ valid RT рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ abuse рдХрд░рдХреЗ рдХрдИ AT/RT рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдпрджрд┐ user malicious application рдХреЗ permissions рд░рджреНрдж рдХрд░ рджреЗ, рддрдм рднреА рдХрдИ RTs valid рдмрдиреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред -## **RC рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдореЗрдВ** +## **RC in WebSockets** -[**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) рдореЗрдВ рдЖрдк рдПрдХ PoC рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Java рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ **рд╕рдорд╛рдирд╛рдВрддрд░** рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП **рд░реЗрд╕ рдХрдВрдбреАрд╢рдВрд╕ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ** рдХрд░рддрд╛ рд╣реИред +- [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) рдореЗрдВ рдЖрдк Java рдореЗрдВ рдПрдХ PoC рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ websocket messages рдХреЛ parallel рдореЗрдВ рднреЗрдЬрдХрд░ Web Sockets рдореЗрдВ рднреА Race Conditions рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред +- BurpтАЩs WebSocket Turbo Intruder рдХреЗ рд╕рд╛рде рдЖрдк **THREADED** engine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ multiple WS connections spawn рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ payloads parallel рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ concurrency рдХреЗ рд▓рд┐рдП `config()` (thread count) рдХреЛ tune рдХрд░реЗрдВ; рдЬрдм serverтАСside state рдХреЛ WS handlers рдХреЗ рдкрд╛рд░ race рдХрд░рдирд╛ рд╣реЛ рддреЛ рдпрд╣ рдЕрдХреНрд╕рд░ рдПрдХ single connection рдкрд░ batching рд╕реЗ рдЕрдзрд┐рдХ reliable рд╣реЛрддрд╛ рд╣реИред рджреЗрдЦреЗрдВ [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). -## рд╕рдВрджрд░реНрдн +## References - [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247) - [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html) @@ -380,5 +382,8 @@ session['enforce_mfa'] = True - [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) - [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions) - [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) +- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine) +- [WebSocketTurboIntruder тАУ GitHub](https://github.com/d0ge/WebSocketTurboIntruder) +- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/websocket-attacks.md b/src/pentesting-web/websocket-attacks.md index c985ae651..1357aa66f 100644 --- a/src/pentesting-web/websocket-attacks.md +++ b/src/pentesting-web/websocket-attacks.md @@ -2,21 +2,21 @@ {{#include ../banners/hacktricks-training.md}} -## What are WebSockets +## WebSockets рдХреНрдпрд╛ рд╣реИрдВ -WebSocket рдХрдиреЗрдХреНрд╢рди рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ **HTTP** рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ **рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ** рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рджреНрд╡рд┐рджрд┐рд╢реАрдп рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдмрд┐рдирд╛ рд▓реЗрди-рджреЗрди рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗред рдпрд╣ WebSockets рдХреЛ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╛рдпрджреЗрдордВрдж рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ **рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛ рдпрд╛ рд╕рд░реНрд╡рд░-рдкреНрд░рд╛рд░рдВрднрд┐рдд рд╕рдВрдЪрд╛рд░** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓рд╛рдЗрд╡ рд╡рд┐рддреНрддреАрдп рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдоред +WebSocket рдХрдиреЗрдХреНрд╢рдВрд╕ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ **HTTP** рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ **рд▓рдВрдмреА рдЕрд╡рдзрд┐ рд╡рд╛рд▓реЗ** рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд▓реЗрдирджреЗрди-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рд╕рдордп рджреНрд╡рд┐рджрд┐рд╢ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ WebSockets рдЙрди рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ **рдХрдо рд╡рд┐рд▓рдореНрдмрддрд╛ рдпрд╛ рд╕рд░реНрд╡рд░-рдкреНрд░реЗрд░рд┐рдд рд╕рдВрдЪрд╛рд░** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рд▓рд╛рдЗрд╡ рдлрд╛рдЗрдиреЗрдВрд╢рд┐рдпрд▓ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдореНрд╕ред -### Establishment of WebSocket Connections +### WebSocket рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд╛рдкрдирд╛ -WebSocket рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг [**рдпрд╣рд╛рдВ**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc) рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, WebSocket рдХрдиреЗрдХреНрд╢рди рдЖрдорддреМрд░ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: +WebSocket рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ [**here**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, WebSocket рдХрдиреЗрдХреНрд╢рди рдЖрдорддреМрд░ рдкрд░ client-side JavaScript рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: ```javascript var ws = new WebSocket("wss://normal-website.com/ws") ``` -`wss` рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ WebSocket рдХрдиреЗрдХреНрд╢рди рдХреЛ **TLS** рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ `ws` рдПрдХ **рдЕрд╕реБрд░рдХреНрд╖рд┐рдд** рдХрдиреЗрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред +The `wss` рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ WebSocket рдХрдиреЗрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ **TLS** рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЬрдмрдХрд┐ `ws` рдПрдХ **unsecured** рдХрдиреЗрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред -рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдПрдХ рд╣реИрдВрдбрд╢реЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд╢реЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: +рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, browser рдФрд░ server рдХреЗ рдмреАрдЪ HTTP рдкрд░ рдПрдХ handshake рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Handshake рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ browser рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ server рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: -рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХ рд╣реИрдВрдбрд╢реЗрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ: +Browser рдПрдХ handshake рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ: ```javascript GET /chat HTTP/1.1 Host: normal-website.com @@ -26,88 +26,205 @@ Connection: keep-alive, Upgrade Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2 Upgrade: websocket ``` -рд╕рд░реНрд╡рд░ рдХрд╛ рд╣реИрдВрдбрд╢реЗрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: +Server рдХрд╛ handshake response: ```javascript HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk= ``` -рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИред +рдХрдиреЗрдХреНрд╢рди рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИред -**WebSocket рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ:** +**WebSocket Handshake рдХреЗ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ:** -- `Connection` рдФрд░ `Upgrade` рд╣реЗрдбрд░ WebSocket рд╣реИрдВрдбрд╢реЗрдХ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред -- `Sec-WebSocket-Version` рд╣реЗрдбрд░ рд╡рд╛рдВрдЫрд┐рдд WebSocket рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ `13` рд╣реЛрддрд╛ рд╣реИред -- `Sec-WebSocket-Key` рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ Base64-рдХреЛрдбрд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд╢реЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ, рдЬреЛ рдХреИрд╢рд┐рдВрдЧ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╛рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдпрд╛ рдХреИрд╢ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред -- рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ `Sec-WebSocket-Accept` рд╣реЗрдбрд░ `Sec-WebSocket-Key` рдХрд╛ рдПрдХ рд╣реИрд╢ рд╣реИ, рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ WebSocket рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред +- `Connection` рдФрд░ `Upgrade` рд╣реЗрдбрд░ WebSocket handshake рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред +- `Sec-WebSocket-Version` рд╣реЗрдбрд░ рдЗрдЪреНрдЫрд┐рдд WebSocket рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдпрддрдГ `13`ред +- Base64-encoded рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди `Sec-WebSocket-Key` рд╣реЗрдбрд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рд░ handshake рдЕрдиреВрдард╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ caching proxies рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рдорд╛рди authentication рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛; рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ response рдХрд┐рд╕реА misconfigured server рдпрд╛ cache рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред +- рд╕рд░реНрд╡рд░ рдХреЗ response рдореЗрдВ `Sec-WebSocket-Accept` рд╣реЗрдбрд░ `Sec-WebSocket-Key` рдХрд╛ рдПрдХ hash рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ WebSocket рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред -рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рд╣реИрдВрдбрд╢реЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рдЬреЛ рдХреБрд╢рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддреА рд╣реИред +рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ handshake рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рднрд╛рд╡реА рд░реАрдпрд▓-рдЯрд╛рдЗрдо рд╕рдВрдЪрд╛рд░ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред ### Linux рдХрдВрд╕реЛрд▓ -рдЖрдк `websocat` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ websocket рдХреЗ рд╕рд╛рде рдПрдХ рдХрдЪреНрдЪрд╛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк `websocat` рдХрд╛ рдЙрдкрдпреЛрдЧ WebSocket рдХреЗ рд╕рд╛рде рдПрдХ raw connection рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```bash websocat --insecure wss://10.10.10.10:8000 -v ``` -рдпрд╛ рдПрдХ websocat рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП: +рдпрд╛ websocat рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП: ```bash websocat -s 0.0.0.0:8000 #Listen in port 8000 ``` -### MitM websocket connections +### MitM websocket рдХрдиреЗрдХреНрд╢рди -рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ **HTTP websocket** рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рдЖрдк [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ MitM рд╣рдорд▓рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред\ -рдПрдХ рдмрд╛рд░ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдкрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реЛ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХрд┐рд╕реА **HTTP websocket** рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рддреЛ рдЖрдк [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдХреЗ client рдФрд░ server рдХреЗ рдмреАрдЪ MitM attack рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.\ +рдЬрдм client рдЖрдкрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рддрдм рдЖрдк рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v ``` -### Websockets enumeration +### Websockets рд╕реВрдЪреАрдХрд░рдг -рдЖрдк **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ websockets рдореЗрдВ рдЬреНрдЮрд╛рдд** **vulnerabilities** **рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬрдиреЗ, рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред** +You can use the **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **to discover, fingerprint and search for known** **vulnerabilities** in websockets automatically. ### Websocket Debug tools -- **Burp Suite** MitM websockets рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдирд┐рдпрдорд┐рдд HTTP рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред -- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite рдПрдХреНрд╕рдЯреЗрдВрд╢рди** рдЖрдкрдХреЛ Burp рдореЗрдВ Websocket рд╕рдВрдЪрд╛рд░ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, **history** рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ, **interception rules** рд╕реЗрдЯ рдХрд░рдХреЗ, **match and replace** рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, **Intruder** рдФрд░ **AutoRepeater** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред -- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**" рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдпрд╣ рдЙрдкрдХрд░рдг, рдЬреЛ Node.js рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, **рдХреИрдкреНрдЪрд░, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ, рдХрд╕реНрдЯрдо** рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕рднреА WebSocket рдФрд░ Socket.IO рд╕рдВрдЪрд╛рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред -- [**wsrepl**](https://github.com/doyensec/wsrepl) рдПрдХ **рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ websocket REPL** рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреЗрдирдЯреНрд░реЗрд╢рди рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ **incoming websocket messages** рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдирдП рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХреЛ **automating** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдврд╛рдВрдЪрд╛ рд╣реИред -- [**https://websocketking.com/**](https://websocketking.com/) рдпрд╣ **websockets** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд╡реЗрдм рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **рд╡реЗрдм** рд╣реИред -- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░/рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмреАрдЪ, рдпрд╣ **websockets** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд╡реЗрдм рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **рд╡реЗрдм** рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред +- **Burp Suite** рдирд┐рдпрдорд┐рдд HTTP рд╕рдВрдЪрд╛рд░ рдХреА рддрд░рд╣ рд╣реА Websocket рд╕рдВрдЪрд╛рд░ рдореЗрдВ MitM рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред +- The [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite extension** рдЖрдкрдХреЛ Burp рдореЗрдВ Websocket рд╕рдВрдЪрд╛рд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ тАФ рдЬреИрд╕реЗ рдХрд┐ **history** рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, **interception rules** рд╕реЗрдЯ рдХрд░рдирд╛, **match and replace** рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ **Intruder** рд╡ **AutoRepeater** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред +- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Short for "**WebSocket/Socket.io Proxy**", рдпрд╣ tool, Node.js рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛, рдПрдХ user interface рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк **capture, intercept, send custom** messages рдХрд░ рд╕рдХреЗрдВ рдФрд░ client рддрдерд╛ server рдХреЗ рдмреАрдЪ рд╕рднреА WebSocket рдФрд░ Socket.IO рд╕рдВрдЪрд╛рд░ рджреЗрдЦ рд╕рдХреЗрдВред +- [**wsrepl**](https://github.com/doyensec/wsrepl) рдПрдХ **interactive websocket REPL** рд╣реИ рдЬреЛ рдЦрд╛рд╕рдХрд░ penetration testing рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк **incoming websocket messages and sending new ones** рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХреЛ **automating** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдлреНрд░реЗрдорд╡рд░реНрдХ рджреЗрддрд╛ рд╣реИред +- [**https://websocketking.com/**](https://websocketking.com/) рдпрд╣ рдПрдХ **web to communicate** рд╣реИ рдЬреЛ **websockets** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд╡реЗрдмреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред +- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ communications/protocols рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рдпрд╣ **web to communicate** рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЕрдиреНрдп рд╡реЗрдмреНрд╕ рдХреЗ рд╕рд╛рде **websockets** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -## Decrypting Websocket +## Websocket рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ - [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript) - [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/) ## Websocket Lab -[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ websockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реЗрдм рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ рдФрд░ [**рдЗрд╕ рдкреЛрд╕реНрдЯ**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) рдореЗрдВ рдЖрдк рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +In [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) рдореЗрдВ рдЖрдкрдХреЛ websockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡реЗрдм рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ in [**this post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) рдЖрдк рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред ## Websocket Fuzzing -Burp рдПрдХреНрд╕рдЯреЗрдВрд╢рди [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) рдЕрдм WebSocket рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рднреА рдлрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА [**рдпрд╣рд╛рдВ**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner) рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред +The burp extension [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) рдЕрдм WebSocket messages рдХреЛ рднреА fuzz рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ [**here**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner) рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред + +### WebSocket Turbo Intruder (Burp extension) + +PortSwigger's WebSocket Turbo Intruder Turbo IntruderтАУstyle Python scripting рдФрд░ highтАСrate fuzzing рдХреЛ WebSockets рдкрд░ рд▓рд╛рддрд╛ рд╣реИред рдЗрд╕реЗ BApp Store рд╕реЗ рдпрд╛ source рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рджреЛ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: + +- Turbo Intruder: custom engines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХрд▓ WS endpoint рдкрд░ highтАСvolume messagingред +- HTTP Middleware: рдПрдХ local HTTP endpoint expose рдХрд░рддрд╛ рд╣реИ рдЬреЛ bodies рдХреЛ persistent connection рдкрд░ WS messages рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рднреЗрдЬрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА HTTPтАСbased scanner WS backends рдХреЛ probe рдХрд░ рд╕рдХрддрд╛ рд╣реИред + +Basic script pattern to fuzz a WS endpoint and filter relevant responses: +```python +def queue_websockets(upgrade_request, message): +connection = websocket_connection.create(upgrade_request) +for i in range(10): +connection.queue(message, str(i)) + +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@MatchRegex(r'{\"user\":\"Hal Pline\"') +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +рдПрдХ рд╕рдВрджреЗрд╢ рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗ рддреЛ рд╢реЛрд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `@MatchRegex(...)` рдЬреИрд╕реЗ decorators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред + +### Bridge WS behind HTTP (HTTP Middleware) + +рдПрдХ рд╕реНрдерд╛рдпреА WS рдХрдиреЗрдХреНрд╢рди рдХреЛ wrap рдХрд░реЗрдВ рдФрд░ HTTP рдмреЙрдбреАрдЬрд╝ рдХреЛ WS messages рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рднреЗрдЬреЗрдВ, рддрд╛рдХрд┐ HTTP scanners рдХреЗ рд╕рд╛рде automated testing рдХреА рдЬрд╛ рд╕рдХреЗ: +```python +def create_connection(upgrade_request): +connection = websocket_connection.create(upgrade_request) +return connection + +@MatchRegex(r'{\"user\":\"You\"') +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +рдлрд┐рд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ HTTP рднреЗрдЬреЗрдВ; body WS рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: +```http +POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1 +Host: 127.0.0.1:9000 +Content-Length: 16 + +{"message":"hi"} +``` +рдпрд╣ рдЖрдкрдХреЛ WS backends рдХреЛ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдФрд░ тАЬinterestingтАЭ events (рдЙрджрд╛., SQLi errors, auth bypass, command injection behavior) рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред + +### Socket.IO handling (handshake, heartbeats, events) + +Socket.IO WS рдХреЗ рдКрдкрд░ рдЕрдкрдирд╛ framing рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп query parameter `EIO` (рдЙрджрд╛., `EIO=4`) рдХреЗ рдЬрд░рд┐рдП рдкрд╣рдЪрд╛рдиреЗрдВред рд╕рддреНрд░ рдХреЛ Ping (`2`) рдФрд░ Pong (`3`) рдХреЗ рд╕рд╛рде рдЬреАрд╡рд┐рдд рд░рдЦреЗрдВ рдФрд░ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдХреА рд╢реБрд░реБрдЖрдд `"40"` рд╕реЗ рдХрд░реЗрдВ, рдлрд┐рд░ рдРрд╕реЗ рдЗрд╡реЗрдВрдЯ emit рдХрд░реЗрдВ: `42["message","hello"]`. + +Intruder рдЙрджрд╛рд╣рд░рдг: +```python +import burp.api.montoya.http.message.params.HttpParameter as HttpParameter + +def queue_websockets(upgrade_request, message): +connection = websocket_connection.create( +upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4"))) +connection.queue('40') +connection.queue('42["message","hello"]') + +@Pong("3") +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@PingPong("2", "3") +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +HTTP рдПрдбрд╛рдкреНрдЯрд░ рд╡реЗрд░рд┐рдПрдВрдЯ: +```python +import burp.api.montoya.http.message.params.HttpParameter as HttpParameter + +def create_connection(upgrade_request): +connection = websocket_connection.create( +upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4"))) +connection.queue('40') +connection.decIn() +return connection + +@Pong("3") +def handle_outgoing_message(websocket_message): +results_table.add(websocket_message) + +@PingPong("2", "3") +def handle_incoming_message(websocket_message): +results_table.add(websocket_message) +``` +### Detecting serverтАСside prototype pollution via Socket.IO + +PortSwiggerтАЩs safe detection technique рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП, Express internals рдХреЛ pollute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЬреИрд╕рд╛ payload рднреЗрдЬреЗрдВ: +```json +{"__proto__":{"initialPacket":"Polluted"}} +``` +рдпрджрд┐ greetings рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ (рдЙрджрд╛., echo рдореЗрдВ "Polluted" рд╢рд╛рдорд┐рд▓ рд╣реИ), рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдиреЗ server-side prototypes рдореЗрдВ prototype pollution рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рднрд╛рд╡ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп sinks рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ; Node.js prototype pollution рд╕реЗрдХреНрд╢рди рдореЗрдВ рдореМрдЬреВрдж gadgets рдХреЗ рд╕рд╛рде correlate рдХрд░реЗрдВред рджреЗрдЦреЗрдВ: + +- Check [NodeJS тАУ __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) for sinks/gadgets and chaining ideas. + +### WebSocket race conditions with Turbo Intruder + +рдбрд┐рдлрд╝реЙрд▓реНрдЯ engine рдПрдХ рд╣реА connection рдкрд░ messages рдХреЛ batch рдХрд░рддрд╛ рд╣реИ (рдЙрдЪреНрдЪ throughput, рд▓реЗрдХрд┐рди races рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм)ред THREADED engine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ multiple WS connections spawn рд╣реЛрдВ рдФрд░ payloads рдХреЛ parallel рдореЗрдВ рднреЗрдЬрдХрд░ logic races (doubleтАСspend, token reuse, state desync) рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред example script рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ concurrency рдХреЛ `config()` рдореЗрдВ рдЯреНрдпреВрди рдХрд░реЗрдВред + +- Learn methodology and alternatives in [Race Condition](race-condition.md) (see тАЬRC in WebSocketsтАЭ). + +### WebSocket DoS: malformed frame тАЬPing of DeathтАЭ + +рдРрд╕реЗ WS frames craft рдХрд░реЗрдВ рдЬрд┐рдирдХрд╛ header рдмрд╣реБрдд рдмрдбрд╝реА payload length declare рдХрд░реЗ рдкрд░ body рдирд╣реАрдВ рднреЗрдЬреЗрдВред рдХреБрдЫ WS servers length рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ buffers preтАСallocate рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ; рдЗрд╕реЗ `Integer.MAX_VALUE` рдХреЗ рдХрд░реАрдм рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ OutтАСOfтАСMemory рдФрд░ remote unauth DoS рд╣реЛ рд╕рдХрддрд╛ рд╣реИред example script рджреЗрдЦреЗрдВред + +### CLI and debugging + +- Headless fuzzing: `java -jar WebSocketFuzzer-.jar ` +- Enable the WS Logger to capture and correlate messages using internal IDs. +- Use `inc*`/`dec*` helpers on `Connection` to tweak message ID handling in complex adapters. +- Decorators like `@PingPong`/`@Pong` and helpers like `isInteresting()` reduce noise and keep sessions alive. + +### Operational safety + +HighтАСrate WS fuzzing рдХрдИ connections рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣рдЬрд╛рд░реЛрдВ messages рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред Malformed frames рдФрд░ high rates рд╡рд╛рд╕реНрддрд╡рд┐рдХ DoS рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рд╡рд╣реАрдБ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдБ рдЕрдиреБрдорддрд┐ рд╣реЛред ## Cross-site WebSocket hijacking (CSWSH) -**Cross-site WebSocket hijacking**, рдЬрд┐рд╕реЗ **cross-origin WebSocket hijacking** рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ WebSocket рд╣реИрдВрдбрд╢реЗрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рднреЗрджреНрдпрддрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм WebSocket рд╣реИрдВрдбрд╢реЗрдХ рдХреЗрд╡рд▓ **HTTP cookies** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ **CSRF tokens** рдпрд╛ рд╕рдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЗред +**Cross-site WebSocket hijacking**, рдЬрд┐рд╕реЗ **cross-origin WebSocket hijacking** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** рд╣реИ рдЬреЛ WebSocket handshakes рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрдордЬреЛрд░реА рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм WebSocket handshakes рдХреЗрд╡рд▓ **HTTP cookies** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ authenticate рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ **CSRF tokens** рдпрд╛ рд╕рдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реЛрддреЗред -рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕рдХреЛ рдПрдХ **malicious web page** рд╣реЛрд╕реНрдЯ рдХрд░рдХреЗ рд╢реЛрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХрдордЬреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ WebSocket рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд┐рдд рдХреЗ рд╕рддреНрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ рдореЗрдВ CSRF рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХрдореА рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред +Attackers рдЗрд╕реЗ рддрдм exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдПрдХ **malicious web page** рд╣реЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ vulnerable application рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ cross-site WebSocket connection рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ connection victim рдХреЗ application session рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ session handling рдореЗрдВ CSRF рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХрдореА рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред -рдЗрд╕ рд╣рдорд▓реЗ рдХреЗ рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реИрдВ: +рдЗрд╕ attack рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: -- Websocket **authentication рдХреЛ cookie рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП** -- рдХреБрдХреА рдХреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЖрдорддреМрд░ рдкрд░ **`SameSite=None`** рд╣реИ) рдФрд░ Firefox рдореЗрдВ **Firefox Total Cookie Protection** рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Chrome рдореЗрдВ **blocked third-party cookies** рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред -- Websocket рд╕рд░реНрд╡рд░ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдореВрд▓ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) +- The websocket **authentication must be cookie based** +- The cookie must be accessible from the attackers server (this usually means **`SameSite=None`**) and no **Firefox Total Cookie Protection** enabled in Firefox and no **blocked third-party cookies** in Chrome. +- The websocket server must not check the origin of the connection (or this must be bypasseable) -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: +Also: -- рдпрджрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдХ рд╕реНрдерд╛рдиреАрдп рдХрдиреЗрдХреНрд╢рди (localhost рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рддреЛ рд╣рдорд▓рд╛ **рд╕рдВрднрд╡ рд╣реЛрдЧрд╛** рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдЗрд╕реЗ рд░реЛрдХрддреА рдирд╣реАрдВ рд╣реИ (рдЪреЗрдХ рдХрд░реЗрдВ [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)) +- If the authentication is based on a local connection (to localhost or to a local network) the attack **will be possible** as no current protection forbids it (check [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)) ### Simple Attack -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм **websocket** рдХрдиреЗрдХреНрд╢рди **рд╕реНрдерд╛рдкрд┐рдд** рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ **cookie** **рд╕рд░реНрд╡рд░** рдХреЛ **рднреЗрдЬреА** рдЬрд╛рддреА рд╣реИред **рд╕рд░реНрд╡рд░** рдЗрд╕реЗ **рд╡рд┐рд╢рд┐рд╖реНрдЯ** **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛** рдХреЛ рдЙрд╕рдХреЗ **websocket** **рд╕рддреНрд░** рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рднреЗрдЬреА рдЧрдИ рдХреБрдХреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм **establishing** рдПрдХ **websocket** connection рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ **cookie** server рдХреЛ **sent** рдХреА рдЬрд╛рддреА рд╣реИред **Server** рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рднреЗрдЬреА рдЧрдИ **cookie** рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рд░ **specific** **user** рдХреЛ рдЙрд╕рдХреЗ **websocket** **session** рд╕реЗ relate рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред -рдлрд┐рд░, рдпрджрд┐ **рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП** **websocket** **рд╕рд░реНрд╡рд░** **рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИ** рдпрджрд┐ рдПрдХ msg "**READY"** рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ **simple XSS** рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ (рдХреНрдпреЛрдВрдХрд┐ **cookie** **рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ** рдкреАрдбрд╝рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рднреЗрдЬреА** рдЬрд╛рдПрдЧреА) **"READY"** рднреЗрдЬрдиреЗ рд╕реЗ **рдмрд╛рддрдЪреАрдд** рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ **рдкреНрд░рд╛рдкреНрдд** рдХрд░ рд╕рдХреЗрдЧрд╛ред +рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣ **websocket** **server** рдХрд┐рд╕реА user рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕реЗ msg рдЬрд┐рд╕рдореЗрдВ "**READY**" рд╣реЛ рднреЗрдЬрд╛ рдЬрд╛рдП, рддреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг **XSS** рдЬреЛ connection рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ (cookie рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ victim user рдХреЛ authorize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬреА рдЬрд╛рдПрдЧреА) рдФрд░ "**READY**" рднреЗрдЬрддреА рд╣реИ, рд╡рд╣ рдмрд╛рддрдЪреАрдд рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ retrieve рдХрд░ рдкрд╛рдПрдЧреА.: ```html @@ -148,43 +265,50 @@ xhttp.send() return messageEvent } ``` -рдЕрдм `wsHook.js` рдлрд╝рд╛рдЗрд▓ рдХреЛ [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ **рдЗрд╕реЗ рд╡реЗрдм рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реЗрдЬреЗрдВ**ред\ -рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдкрд░, рдЖрдк websocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЧрдП рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЪреБрд░рд╛ рд╕рдХреЗрдВрдЧреЗ: +рдЕрдм `wsHook.js` рдлрд╛рдЗрд▓ рдХреЛ [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ **рдЗрд╕реЗ рд╡реЗрдм рдлрд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд╕реЗрд╡ рдХрд░реЗрдВ**.\ +рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рдХреЗ рдФрд░ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рд╡рд╛ рдХрд░ рдЖрдк рднреЗрдЬреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ websocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреБрд░рд╛ рдкрд╛рдПрдБрдЧреЗ: ```javascript sudo python3 -m http.server 80 ``` ### CSWSH рд╕реБрд░рдХреНрд╖рд╛ -CSWSH рд╣рдорд▓рд╛ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдПрдХ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдкреГрд╖реНрда рд╕реЗ рдЬреБрдбрд╝реЗрдЧрд╛** рдЬреЛ **рдПрдХ рд╡реЗрдмреНрд╕реЛрдХрдЯ рдХрдиреЗрдХреНрд╢рди** рдЦреЛрд▓реЗрдЧрд╛ рдЙрд╕ рд╡реЗрдм рдкреГрд╖реНрда рдкрд░ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХреБрдХреАрдЬрд╝ рднреЗрдЬрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЙрд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░реЗрдЧрд╛ред +The CSWSH attack рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдПрдХ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА malicious page рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛** рдЬреЛ рдЙрд╕ рд╡реЗрдм рдкреЗрдЬ рдХреЗ рд▓рд┐рдП **рдПрдХ websocket connection рдУрдкрди рдХрд░реЗрдЧрд╛** рдЬрд╣рд╛рдБ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдЙрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ cookies рднреЗрдЬрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЙрд╕рдХреЗ рд░реВрдк рдореЗрдВ authenticate рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЬрдХрд▓, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ: -- **рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕рд░реНрд╡рд░ рдХрд╛ рдореВрд▓ рдЪреЗрдХ рдХрд░рдирд╛**: рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЬреБрдбрд╝ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред -- **рдкреНрд░рдорд╛рдгрди рдЯреЛрдХрди**: рдХреБрдХреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгрди рдХреЗ рдмрдЬрд╛рдп, рд╡реЗрдмреНрд╕реЛрдХрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдХ рдЯреЛрдХрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕реЗ рдПрдХ рдПрдВрдЯреА-CSRF рдЯреЛрдХрди) -- **SameSite рдХреБрдХреА рд╡рд┐рд╢реЗрд╖рддрд╛**: `SameSite` рдорд╛рди рдХреЗ рд╕рд╛рде рдХреБрдХреАрдЬрд╝ `Lax` рдпрд╛ `Strict` рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░реА рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдкреГрд╖реНрда рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рднреЗрдЬреА рдЬрд╛рдПрдВрдЧреА, рдЗрд╕рд▓рд┐рдП, рдХреБрдХреА рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгрди рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Chrome рдЕрдм рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛ рдХреБрдХреАрдЬрд╝ рдХреЛ **`Lax`** рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдПрдХ рдХреБрдХреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рддреЛ рдкрд╣рд▓реЗ 2 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорд╛рди **`None`** рд╣реЛрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЙрд╕ рд╕реАрдорд┐рдд рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдХрдордЬреЛрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдпрд╣ рднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрд╛рдп рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред -- **Firefox рдХреБрд▓ рдХреБрдХреА рд╕реБрд░рдХреНрд╖рд╛**: рдХреБрд▓ рдХреБрдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреБрдХреАрдЬрд╝ рдХреЛ рдЙрд╕ рд╕рд╛рдЗрдЯ рдкрд░ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдореВрд▓ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдЗрдЯ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рдХреБрдХреА рднрдВрдбрд╛рд░рдг рд╡рд┐рднрд╛рдЬрди рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд┐рдВрдХ рди рдХрд░ рд╕рдХреЗрдВред рдпрд╣ **CSWSH рдХреЛ рдЕрдиреБрдкрдпреЛрдЧреА** рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд▓рд╛рд╡рд░ рдХреА рд╕рд╛рдЗрдЯ рдХреЛ рдХреБрдХреАрдЬрд╝ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред -- **Chrome рддреГрддреАрдп-рдкрдХреНрд╖ рдХреБрдХреАрдЬрд╝ рдЕрд╡рд░реЛрдз**: рдпрд╣ рднреА рдкреНрд░рдорд╛рдгрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреБрдХреА рдХреЛ рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рднрд▓реЗ рд╣реА `SameSite=None` рд╣реЛред +- **Websocket server checking the origin**: Websocket server рдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕ рд╕реНрд░реЛрдд рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреЗрдЬ рдЙрд╕реЗ рдХрдиреЗрдХреНрдЯ рди рдХрд░ рд╕рдХреЗрдВред +- **Authentication token**: Cookie рдкрд░ рдЖрдзрд╛рд░рд┐рдд authentication рдХреЗ рдмрдЬрд╛рдп, websocket connection рдХреЛ рдРрд╕реЗ token рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯ рдХрд░реЗ рдФрд░ attacker рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реЛ (рдЬреИрд╕реЗ рдПрдХ anti-CSRF token)ред +- **SameSite Cookie attribute**: `SameSite` рдорд╛рди `Lax` рдпрд╛ `Strict` рд╡рд╛рд▓реЗ cookies external attacker рдХреЗ рдкреЗрдЬ рд╕реЗ victim рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рднреЗрдЬреЗ рдЬрд╛рдпреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП cookie рдЖрдзрд╛рд░рд┐рдд authentication рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧреАред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Chrome рдЕрдм рдЙрди cookies рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ **`Lax`** рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдпрд╣ flag рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрд┐рд╕реА cookie рдХреЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдкрд╣рд▓реЗ 2 рдорд┐рдирдЯ рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХрд╛ рдорд╛рди **`None`** рд╣реЛрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдЙрд╕ рд╕реАрдорд┐рдд рдЕрд╡рдзрд┐ рдореЗрдВ рдХрдордЬреЛрд░ рд░рд╣реЗрдЧрд╛ (рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрд╛рдп рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред +- **Firefox Total Cookie Protection**: Total Cookie Protection cookies рдХреЛ рдЙрд╕реА рд╕рд╛рдЗрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╡реЗ рдмрдирд╛рдП рдЧрдП рдереЗред рдореВрд▓рддрдГ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдЗрдЯ рдХреА рдЕрдкрдиреА cookie storage partition рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ third parties рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд▓рд┐рдВрдХ рди рдХрд░ рд╕рдХреЗрдВред рдЗрд╕рд╕реЗ attackers рд╕рд╛рдЗрдЯ рдХреЛ cookies рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг **CSWSH рдЕрдиреБрдкрдпреЛрдЧреА** рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред +- **Chrome third-party cookies block**: рдпрд╣ рднреА authenticated рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ cookie рдХреЛ websocket server рдкрд░ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рднрд▓реЗ рд╣реА `SameSite=None` рд╣реЛред -## рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ +## Race Conditions -рд╡реЗрдмреНрд╕реЛрдХрдЯ рдореЗрдВ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рднреА рдПрдХ рдЪреАрдЬ рд╣реИрдВ, [рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ](race-condition.md#rc-in-websockets)ред +WebSockets рдореЗрдВ Race Conditions рднреА рд╣реЛрддреЗ рд╣реИрдВ, [рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреЗрдЦреЗрдВ](race-condition.md#rc-in-websockets). ## рдЕрдиреНрдп рдХрдордЬреЛрд░рд┐рдпрд╛рдБ -рдЪреВрдВрдХрд┐ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдПрдХ рддрдВрддреНрд░ рд╣реИрдВ **рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП**, рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, **рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдЬреИрд╕реЗ XSS, SQLi рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдм рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред** +рдЪреВрдБрдХрд┐ Web Sockets рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдкрд░ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдореИрдХреЗрдирд┐рдЬрд╝реНрдо рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд┐рд╕ рддрд░рд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, **Web Sockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреНрдп рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдЬреИрд╕реЗ XSS, SQLi рдпрд╛ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдм vuln рдХреЛ exploit рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ websocket рд╕реЗ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЗрдирдкреБрдЯ рд╕рд░реНрд╡рд░/рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИред** -## **рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕реНрдордЧрд▓рд┐рдВрдЧ** - -рдпрд╣ рдХрдордЬреЛрд░реА рдЖрдкрдХреЛ **рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИ рдпрд╣ рдорд╛рдирдХрд░ рдХрд┐ **рд╡реЗрдмреНрд╕реЛрдХрдЯ рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛** (рднрд▓реЗ рд╣реА рдпрд╣ рд╕рдЪ рди рд╣реЛ)ред рдпрд╣ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ **рдЫрд┐рдкреЗ рд╣реБрдП рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ: +## **WebSocket Smuggling** +рдпрд╣ vulnerability рдЖрдкрдХреЛ reverse proxies restrictions рдХреЛ bypass рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рдХрд░ рдХрд┐ рдПрдХ **websocket communication рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЧрдИ рдереА** (рднрд▓реЗ рд╣реА рдРрд╕рд╛ рди рд╣реБрдЖ рд╣реЛ)ред рдЗрд╕рд╕реЗ рдПрдХ attacker рдХреЛ hidden endpoints рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкреЗрдЬ рджреЗрдЦреЗрдВ: {{#ref}} h2c-smuggling.md {{#endref}} -## рд╕рдВрджрд░реНрдн +## References - [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages) - [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/) +- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine) +- [WebSocket Turbo Intruder тАУ BApp Store](https://portswigger.net/bappstore/ba292c5982ea426c95c9d7325d9a1066) +- [WebSocketTurboIntruder тАУ GitHub](https://github.com/d0ge/WebSocketTurboIntruder) +- [Turbo Intruder background](https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack) +- [Server-side prototype pollution тАУ safe detection methods](https://portswigger.net/research/server-side-prototype-pollution#safe-detection-methods-for-manual-testers) +- [WS RaceCondition PoC (Java)](https://github.com/redrays-io/WS_RaceCondition_PoC) +- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py) +- [PingOfDeathExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/PingOfDeathExample.py) {{#include ../banners/hacktricks-training.md}}