| Server IP : 146.190.157.162 / Your IP : 216.73.217.6 Web Server : Apache System : Linux ubuntu-s-2vcpu-4gb-amd-sfo3-01-KIT-DIGITAL 6.5.0-44-generic #44-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 7 15:10:09 UTC 2024 x86_64 User : businessweek ( 639) PHP Version : 8.2.10-2ubuntu2.2 Disable Function : exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_signal,pcntl_signal_dispatch,pcntl_getpriority,pcntl_setpriority,dl,putenv,parse_ini_file,show_source MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/wordpress-manager-v2/scripts/ |
Upload File : |
#!/bin/bash
LOG_FILE="/var/www/html/wordpress-manager-v2/logs/permissions_debug.log"
mkdir -p "$(dirname "$LOG_FILE")"
exec > >(tee -a ${LOG_FILE}) 2>&1
echo "--- Ejecución: $(date) ---"
echo "Script: $0 | Proyecto: $1"
PROJECT="$1"
SITE_BASE="/var/www/html"
SITE="$SITE_BASE/$PROJECT"
USER_OWNER="$PROJECT"
BAD_PLUGINS_REGEX="asazysac|javax-|u-short|urshort"
if [ -z "$PROJECT" ]; then
echo "Error: Debes especificar el nombre del proyecto/usuario. Uso: $0 nombre_proyecto"
exit 1
fi
if [ ! -d "$SITE" ]; then
echo "Error: El directorio $SITE no existe."
exit 1
fi
# ── 1. Quitar toda inmutabilidad previa ───────────────────────────────────────
chattr -R -i "$SITE" 2>/dev/null
# ── 2. Limpieza de plugins maliciosos conocidos ───────────────────────────────
find "$SITE/wp-content/plugins" -maxdepth 1 \
-regextype posix-extended \
-regex ".*($BAD_PLUGINS_REGEX).*" \
-exec rm -rf {} + 2>/dev/null
# ── 3. Dueño y permisos base ──────────────────────────────────────────────────
chown -R "$USER_OWNER":"$USER_OWNER" "$SITE"
find "$SITE" -type d -exec chmod 755 {} \;
find "$SITE" -type f -exec chmod 644 {} \;
# ── 4. Carpetas escribibles para acciones del admin ───────────────────────────
for WRITABLE_DIR in \
"wp-content/plugins" \
"wp-content/themes" \
"wp-content/upgrade" \
"wp-content/uploads" \
"wp-content/cache" \
"wp-content/et-cache"; do
mkdir -p "$SITE/$WRITABLE_DIR"
chown -R "$USER_OWNER":"$USER_OWNER" "$SITE/$WRITABLE_DIR"
chmod -R 755 "$SITE/$WRITABLE_DIR"
done
# uploads: grupo www-data para que Apache sirva los archivos subidos
chgrp -R www-data "$SITE/wp-content/uploads"
chmod -R 775 "$SITE/wp-content/uploads"
# ── 5. Protección de uploads contra ejecución de PHP ─────────────────────────
echo -e "<Files *.php>\n deny from all\n</Files>" > "$SITE/wp-content/uploads/.htaccess"
chown "$USER_OWNER":www-data "$SITE/wp-content/uploads/.htaccess"
chmod 644 "$SITE/wp-content/uploads/.htaccess"
chattr +i "$SITE/wp-content/uploads/.htaccess"
# Protección de wp-content raíz
echo -e "<Files *.php>\n deny from all\n</Files>" > "$SITE/wp-content/.htaccess"
chown "$USER_OWNER":"$USER_OWNER" "$SITE/wp-content/.htaccess"
chmod 644 "$SITE/wp-content/.htaccess"
chattr +i "$SITE/wp-content/.htaccess"
# ── 6. Sellar archivos críticos de la raíz ────────────────────────────────────
# Estos archivos nunca deberían cambiar en producción y son el principal
# vector de inyección del malware que hemos visto
echo '<?php define("WP_USE_THEMES", true); require __DIR__ . "/wp-blog-header.php";' > "$SITE/index.php"
chown "$USER_OWNER":"$USER_OWNER" "$SITE/index.php"
chmod 644 "$SITE/index.php"
chattr +i "$SITE/index.php"
# .htaccess raíz — solo si está limpio (sin ushort)
if [ -f "$SITE/.htaccess" ] && ! grep -q "ushort" "$SITE/.htaccess"; then
chattr +i "$SITE/.htaccess"
fi
# wp-config.php
if [ -f "$SITE/wp-config.php" ]; then
chattr +i "$SITE/wp-config.php"
fi
# Archivos PHP de la raíz (wp-login, wp-cron, etc.)
find "$SITE" -maxdepth 1 -name "*.php" ! -name "index.php" -exec chattr +i {} \;
# ── 7. wp-admin y wp-includes: permisos, NO chattr ───────────────────────────
# chattr +i en wp-admin causaba 403 en update.php y plugin-install.php
# porque WordPress necesita contexto de escritura durante instalaciones.
# La protección correcta es: dueño = usuario del sitio (no www-data),
# permisos 644/755 estándar. Esto bloquea modificaciones desde otros
# usuarios del sistema sin romper la funcionalidad del admin.
chown -R "$USER_OWNER":"$USER_OWNER" "$SITE/wp-admin"
find "$SITE/wp-admin" -type f -exec chmod 644 {} \;
find "$SITE/wp-admin" -type d -exec chmod 755 {} \;
chown -R "$USER_OWNER":"$USER_OWNER" "$SITE/wp-includes"
find "$SITE/wp-includes" -type f -exec chmod 644 {} \;
find "$SITE/wp-includes" -type d -exec chmod 755 {} \;
echo ""
echo "Proceso de cierre de alta seguridad completado para $PROJECT ($SITE)"
echo ""
echo "Resumen de protecciones aplicadas:"
echo " ✓ plugins/, themes/, upgrade/, uploads/, cache/ → escribibles por $USER_OWNER"
echo " ✓ uploads/ → grupo www-data para Apache"
echo " ✓ uploads/.htaccess → inmutable, bloquea PHP"
echo " ✓ wp-content/.htaccess → inmutable, bloquea PHP"
echo " ✓ index.php, .htaccess raíz, wp-config.php → inmutables"
echo " ✓ archivos PHP raíz → inmutables"
echo " ✓ wp-admin/, wp-includes/ → dueño $USER_OWNER, 644/755"
echo " (sin chattr: el admin WP puede instalar/actualizar sin 403)"