Translated ['src/pentesting-web/account-takeover.md'] to es

This commit is contained in:
Translator 2025-04-20 14:57:38 +00:00
parent 69a3270cc5
commit 3bda5475b8
2 changed files with 72 additions and 22 deletions

View File

@ -4,20 +4,20 @@
## **Problema de Autorización**
Se debe intentar cambiar el correo electrónico de una cuenta, y el proceso de confirmación **debe ser examinado**. Si se encuentra **débil**, el correo electrónico debe ser cambiado al del objetivo y luego confirmado.
Se debe intentar cambiar el correo electrónico de una cuenta, y el proceso de confirmación **debe ser examinado**. Si se encuentra **débil**, el correo electrónico debe ser cambiado al del víctima previsto y luego confirmado.
## **Problema de Normalización de Unicode**
1. La cuenta del objetivo `victim@gmail.com`
1. La cuenta del víctima previsto `victim@gmail.com`
2. Se debe crear una cuenta usando Unicode\
por ejemplo: `vićtim@gmail.com`
Como se explicó en [**esta charla**](https://www.youtube.com/watch?v=CiIyaZ3x49c), el ataque anterior también podría realizarse abusando de proveedores de identidad de terceros:
- Crear una cuenta en el proveedor de identidad de terceros con un correo electrónico similar al del objetivo usando algún carácter unicode (`vićtim@company.com`).
- Crear una cuenta en el proveedor de identidad de terceros con un correo electrónico similar al del víctima usando algún carácter unicode (`vićtim@company.com`).
- El proveedor de terceros no debería verificar el correo electrónico.
- Si el proveedor de identidad verifica el correo electrónico, tal vez puedas atacar la parte del dominio como: `victim@ćompany.com` y registrar ese dominio y esperar que el proveedor de identidad genere la versión ascii del dominio mientras la plataforma del objetivo normaliza el nombre de dominio.
- Iniciar sesión a través de este proveedor de identidad en la plataforma del objetivo que debería normalizar el carácter unicode y permitirte acceder a la cuenta del objetivo.
- Si el proveedor de identidad verifica el correo electrónico, tal vez puedas atacar la parte del dominio como: `victim@ćompany.com` y registrar ese dominio y esperar que el proveedor de identidad genere la versión ascii del dominio mientras la plataforma del víctima normaliza el nombre de dominio.
- Iniciar sesión a través de este proveedor de identidad en la plataforma del víctima que debería normalizar el carácter unicode y permitirte acceder a la cuenta del víctima.
Para más detalles, consulta el documento sobre Normalización de Unicode:
@ -31,9 +31,9 @@ Si el sistema objetivo permite que el **enlace de restablecimiento sea reutiliza
## **Pre Toma de Control de Cuenta**
1. El correo electrónico de la víctima debe ser utilizado para registrarse en la plataforma, y se debe establecer una contraseña (se debe intentar confirmarla, aunque carecer de acceso a los correos electrónicos de la víctima podría hacer esto imposible).
2. Se debe esperar hasta que la víctima se registre usando OAuth y confirme la cuenta.
3. Se espera que el registro regular sea confirmado, permitiendo el acceso a la cuenta de la víctima.
1. El correo electrónico del víctima debe ser utilizado para registrarse en la plataforma, y se debe establecer una contraseña (se debe intentar confirmarla, aunque carecer de acceso a los correos del víctima podría hacer esto imposible).
2. Se debe esperar hasta que el víctima se registre usando OAuth y confirme la cuenta.
3. Se espera que el registro regular sea confirmado, permitiendo el acceso a la cuenta del víctima.
## **Configuración Incorrecta de CORS para Toma de Control de Cuenta**
@ -61,7 +61,7 @@ xss-cross-site-scripting/
## **Same Origin + Cookies**
Si encuentras un XSS limitado o una toma de control de subdominio, podrías jugar con las cookies (fijándolas, por ejemplo) para intentar comprometer la cuenta de la víctima:
Si encuentras un XSS limitado o una toma de control de subdominio, podrías jugar con las cookies (fijándolas, por ejemplo) para intentar comprometer la cuenta del víctima:
{{#ref}}
hacking-with-cookies/
@ -75,7 +75,7 @@ reset-password.md
## **Manipulación de Respuesta**
Si la respuesta de autenticación podría ser **reducida a un simple booleano, solo intenta cambiar false a true** y ver si obtienes algún acceso.
Si la respuesta de autenticación podría ser **reducida a un simple booleano, solo intenta cambiar falso a verdadero** y ver si obtienes algún acceso.
## OAuth para Toma de Control de Cuenta
@ -105,8 +105,8 @@ De [este informe](https://dynnyd20.medium.com/one-click-account-take-over-e50092
- El atacante solicita cambiar su correo electrónico por uno nuevo.
- El atacante recibe un enlace para confirmar el cambio de correo electrónico.
- El atacante envía el enlace a la víctima para que lo haga clic.
- El correo electrónico de la víctima se cambia al indicado por el atacante.
- El atacante envía el enlace al víctima para que lo haga clic.
- El correo electrónico del víctima se cambia al indicado por el atacante.
- El atacante puede recuperar la contraseña y tomar el control de la cuenta.
Esto también ocurrió en [**este informe**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea).

View File

@ -471,16 +471,66 @@ window.search = window.search || {};
showResults(true);
}
var branch = lang === "en" ? "master" : lang
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
.then(response => response.json())
.then(json => init(json))
.catch(error => { // Try to load searchindex.js if fetch failed
var script = document.createElement('script');
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
script.onload = () => init(window.search);
document.head.appendChild(script);
});
(async function loadSearchIndex(lang = window.lang || 'en') {
/* ───────── paths ───────── */
const branch = lang === 'en' ? 'master' : lang;
const baseRemote = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/${branch}`;
const remoteJson = `${baseRemote}/searchindex.json`;
const remoteJs = `${baseRemote}/searchindex.js`;
const localJson = './searchindex.json';
const localJs = './searchindex.js';
const TIMEOUT_MS = 5_000;
/* ───────── helpers ───────── */
const fetchWithTimeout = (url, opt = {}) =>
Promise.race([
fetch(url, opt),
new Promise((_, r) => setTimeout(() => r(new Error('timeout')), TIMEOUT_MS))
]);
const loadScript = src =>
new Promise((resolve, reject) => {
const s = document.createElement('script');
s.src = src;
s.onload = resolve;
s.onerror = reject;
document.head.appendChild(s);
});
/* ───────── 1. remote JSON ───────── */
try {
const r = await fetchWithTimeout(remoteJson);
if (!r.ok) throw new Error(r.status);
return init(await r.json());
} catch (e) {
console.warn('Remote JSON failed →', e);
}
/* ───────── 2. remote JS ───────── */
try {
await loadScript(remoteJs);
return init(window.search);
} catch (e) {
console.warn('Remote JS failed →', e);
}
/* ───────── 3. local JSON ───────── */
try {
const r = await fetch(localJson);
if (!r.ok) throw new Error(r.status);
return init(await r.json());
} catch (e) {
console.warn('Local JSON failed →', e);
}
/* ───────── 4. local JS ───────── */
try {
await loadScript(localJs);
return init(window.search);
} catch (e) {
console.error('Local JS failed →', e);
}
})();
// Exported functions
search.hasFocus = hasFocus;