Instalación de servidor web LAMP en Debian 12

Instalación de servidor web LAMP en Debian 12

A continuación vamos a instalar un servidor LAMP completo en Debian GNU/Linux 12 “Bookworm” (Stable). Hay algunas cosas que han cambiado respecto a otras versiones de Debian, y es que por ejemplo Debian 12 trae en sus repositorios PHP 8.2.

Instalación servidor web

Como todo servidor LAMP, lo principal es la A de Apache, para instalar Apache únicamente debemos de ejecutar:

# apt install apache2


Iniciamos el servicio al arranque y lo iniciamos:

# systemctl enable apache2
# systemctl start apache2

Y listo, ya tenemos servidor web instalado. Ahora desde nuestro navegador favorito escribimos la IP del servidor y nos debería de salir el index de Apache por defecto.

Instalación de PHP para Apache2

Por lo general hay que instalar unos paquetes específicos para luego usar conjuntamente con MariaDB y phpMyAdmin, son estos:

# apt install php8.2 libapache2-mod-php8.2 php8.2-mysql

Por lo general, cuando instalamos alguna aplicación en nuestro servidor, tipo NextCloud, Moodle o Prestashop, éstas nos pedirán algunos paquetes extra para que su funcionamiento sea el correcto. No os preocupéis por esto, por lo general estas aplicaciones avisan de manera muy clara que paquetes instalar.

Para que Apache aplique los cambios, es necesario reiniciar el servicio para que PHP esté activo.

# systemctl restart apache2

Instalación y configuración de MariaDB

Ahora vamos a instalar un servidor de bases de datos para las aplicaciones que podamos instalar en nuestro servidor web, para ello instalaremos MariaDB que está basado en MySQL.

# apt install mariadb-server

Durante la instalación, nos pedirá la contraseña de root para MySQL. Como antes, iniciamos servicio al arranque y lo iniciamos:

# systemctl enable mysql 
# systemctl start mysql

Una vez iniciado, no podremos iniciar sesión con MariaDB porque no hemos configurado aún el servidor para ello:

# mysql_secure_installation

Y esta es la salida:

root@debian:/home/zagur# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Ya hemos configurado MariaDB, ahora podemos conectarnos mediante terminal:

# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.11.3-MariaDB-1 Debian 12

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Instalación y configuración de phpMyAdmin

Como que phpMyAdmin ya no se encuentra en repositorios, si necesitamos esta aplicación web para gestionar las bases de datos, tendremos que hacerlo de forma manual.

Hackers de China apuntan a militares y gobiernos vietnamitas

Hackers de China apuntan a militares y gobiernos vietnamitas

Un grupo de hackers relacionado con un actor de amenazas de habla china ha sido vinculado a una campaña avanzada de ciberespionaje dirigida al gobierno y organizaciones militares en Vietnam.

Los ataques han sido atribuidos con baja confianza a la avanzada amenaza persistente (APT) llamada Cycldek (o Goblin Panda, Hellsing, APT 27 y Conimes), que es conocida por usar técnicas de spear-phishing para comprometer objetivos diplomáticos en el sudeste asiático, India y Estados Unidos al menos desde 2013.

Según los investigadores de Kaspersky, la ofensiva, que se observó entre junio de 2020 y enero de 2021, aprovecha un método llamado DLL side-loading para ejecutar shellcode que descifra una carga útil final apodada“FoundCore”.

La carga lateral dll ha sido una técnica probada utilizada por varios actores de amenazas como una táctica de ofuscación para eludir las defensas antivirus. Mediante la carga de archivos DLL maliciosos en ejecutables legítimos, la idea es enmascarar su actividad maliciosa bajo un sistema de confianza o proceso de software.

En esta cadena de infección revelada por Kaspersky, un componente legítimo de Microsoft Outlook carga una biblioteca maliciosa llamada “outlib.dll”, que “secuestra el flujo de ejecución previsto del programa para decodificar y ejecutar un shellcode colocado en un archivo binario, rdmin.src.”

Además, el malware viene con una capa adicional diseñada explícitamente para proteger el código del análisis de seguridad y dificultar el ingeniería inversa. Para lograr esto, el actor de amenaza detrás del malware se dice que ha limpiado la mayor parte del encabezadode la carga útil, mientras que dejando el resto con valores incoherentes.

Kaspersky dijo que el método “indica un gran avance en la sofisticación para los atacantes en esta región”.

Además de dar a los atacantes control total sobre el dispositivo comprometido, FoundCore viene con capacidades para ejecutar comandos para la manipulación del sistema de archivos, manipulación de procesos, captura de capturas de pantalla y ejecución arbitraria de comandos. Las infecciones que involucran FoundCore también se encontraron para descargar dos malware adicional. El primero, DropPhone, recopila información relacionada con el entorno de la máquina víctima y la exfiltra a DropBox, mientras que el segundo, CoreLoader, ejecuta código que permite al malware frustrar la detección por productos de seguridad.

La firma de ciberseguridad teorizó los ataques originados con una campaña de spear-phishing u otras infecciones precursoras, que desencadenan la descarga de documentos RTF señuelo de un sitio web falso, lo que en última instancia conduce al despliegue de FoundCore.

Entre decenas de organizaciones afectadas, el 80% de ellas tienen su sede en Vietnam y pertenecen al gobierno o al sector militar, o están relacionadas de otro modo con la salud, la diplomacia, la educación o las verticales políticas, con otras víctimas, ocasionalmente detectadas en Asia Central y Tailandia.

“No importa qué grupo orquestó esta campaña, constituye un importante paso adelante en términos de sofisticación”, concluyeron los investigadores. “Aquí, han añadido muchas más capas de ofuscación e ingeniería inversa significativamente complicada.”

“Y esto indica que estos grupos pueden estar buscando expandir sus actividades. En este momento, puede parecer que esta campaña es más una amenaza local, pero es muy probable que la puerta trasera FoundCore se encuentre en más países de diferentes regiones en el futuro”, dijo mark Lechtik, investigador principal de seguridad de Kaspersky.

Fuente: Hackers From China Target Vietnamese Military and Government (thehackernews.com)

Hackeado el repositorio del código fuente de PHP: fuerte alarma para el lenguaje usado por casi el 80% de todos los sitios web

Hackeado el repositorio del código fuente de PHP: fuerte alarma para el lenguaje usado por casi el 80% de todos los sitios web

Este domingo 28 de marzo, hackers lograron acceder al repositorio Git interno del lenguaje de programación PHP y lograron añadir una puerta trasera al código fuente del mismo. Estamos hablando del lenguaje del lado del servidor más usado en toda la web y que se calcula está en uso en el 79.1% de todos los sitios web.

Como explican en las listas de correo de PHP, el ataque insertó dos cambios maliciosos en el repositorio php-src, y aunque aún se desconoce la causa y hay una investigación en marcha, todo apunta a que el servidor oficial git.php.net fue comprometido.

Aunque el ataque fue detectado rápido, es una enorme advertencia

El mecanismo de puerta trasera fue detectado por primera vez por Michael Voříšek, un ingeniero de software de República Checa. Si este código malicioso hubiera llegado a producción, podría permitir a los hackers ejecutar sus propios comandos PHP maliciosos en los servidores de las víctimas.

Algunos expertos creen que es posible que los atacantes querían ser descubiertos, o que se trataba de un cazador de bugs por los “mensajes” que dejó en el código. Lo que pasa es que para poder desencadenar la ejecución del código malicioso, el atacante tenía que enviar una petición HTTP a un servidor vulnerable con un user agent que comenzara con la cadena “zerodium”.

Zerodium es una plataforma famosa de ciberseguridad especializada en la adquisición y venta de exploits zero day. Zerodium ha declarado ya que no tiene nada que ver con esto, por lo que se piensa que quien sea que hackeó el código no buscaba ser nada sutil, pero no se saben sus intenciones.

Además de esto, los atacantes añadieron un mensaje en uno de los parámetros de la función que ejecuta: “REMOVETHIS: sold to zerodium, mid 2017“. Claramente se busca implicar o hacer referencia a la empresa en esto, pero nadie sabe si se vendió algo a Zerodium en 2017 ni mucho menos qué fue.

En los chats de PHP en Stack Overflow hay muchas conjeturas. Algunos creen que podría haber sido un “pobre intento” de hacking de sombrero blanco, mientras que otros incluso apuntan a un “skript-kiddie completamente inepto”.

Mientras la investigación continua y se está realizando una revisión más minuciosa del código fuente de PHP, se ha decidido que el mantenimiento de una infraestructura Git propia es un riesgo de seguridad innecesario y por lo tanto el servidor git.php.net se va a descontinuar.

A partir de ahora los repositorios en GitHub que antes eran solo mirrors, pasarán a ser los principales, por lo que los cambios deberán enviarse directamente a GitHub en lugar de a git.php.net.

El código malicioso que se añadió al código fuente se hizo a través de las cuentas de dos de los miembros del equipo core de PHP, Rasmus Lerdorf and Nikita Popov, pero ya ambos expresaron no estar involucrados. Además, el equipo usa autenticación de doble factor para sus cuentas, por eso creen que se trató de un fallo crucial en el servidor Git principal en lugar de la violación de alguna cuenta individual.

Aunque el incidente fue resuelto rápidamente, en la práctica hubiese afectado a una pequeña porción de los sistemas que usan servidores PHP, puesto que suele ser usual que la mayoría se tarden mucho tiempo en actualizar a la última versión.

Esto es otro problema que viene plagando a la web hace tiempo, el cómo un enorme porcentaje de las webs en Internet usan una versión de PHP que no tiene soporte, y aunque ha mejorado en los últimos años, todavía casi el 40% de todas las webs que usan PHP usan una versión antigua y sin soporte.

Fuente: Genbeta.com

Hackeado el repositorio del código fuente de PHP: fuerte alarma para el lenguaje usado por casi el 80% de todos los sitios web

Ver Imagen ocultando la url con PHP

El día de hoy necesitaba cargar una imagen pero que no se vea su ubicación real, leyendo y leyendo info obviamente de PHP me encontré con la funcion chunk_split() el cual se relaciona con base64_encode, el cual nos permite codificar en base64 la imagen y así mostrarla como si hicieras un simple <img src=”imagen.jpg”>

El código para esta función es:


// Seleccionamos la imagen que queremos codificar, también puedes poner la dirección donde se encuentra la 
imagen $imagen = file_get_contents("path + mi_imagen.jpg");
//Codificamos la imagen en base64 
$imagen_base64 = chunk_split(base64_encode($imagen));
// Para mostrar la imagen codificada sería lo siguiente 
echo '< img src="data:image/jpg;base64,'.$imagen_base64.'" />';

Se vería así:

[view_image64 type=jpg]2016/01/lluvia-1.jpg[/view_image64]

voilà!

Con eso tenemos la imagen, en codificación base64 sin necesidad de mostrar la url real de dicha imagen.

Saludos! 😀

Función Obtener IP en YII Framework Components

Función Obtener IP en YII Framework Components

Hola, hace rato no posteaba nada, he estado con hartas cosas he ahí el motivo, ahora les mostraré una función que utilizo en mis sistemas creados en YII para obtener la IP de quien se logea o realiza alguna acción en el sistemilla.

Es bastante sencilla y solo hay que alojarla en un nuevo archivo que se debe crear en la carpeta components obviamente que esta clase debe ser extención de controladores globales.

En la carpeta Components creado el siguiente archivo llamado Funcion.php (en realidad el nombre que deseen ponerle al archivo), el cual tendría el siguiente contenido.

<?php
class Funcion extends CController
{
  public static function obtenerIP()
  {
     if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
     {
        $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : ( ( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : "unknown" );
        $entries = preg_split('/[, ]/', $_SERVER['HTTP_X_FORWARDED_FOR']);
   
        reset($entries);
        while (list(, $entry) = each($entries)) {
           $entry = trim($entry);
           if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) ) {
              $private_ip = array(
                    '/^0\./', 
                    '/^127\.0\.0\.1/', 
                    '/^192\.168\..*/', 
                    '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/', 
                    '/^10\..*/');
              $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);
              if ($client_ip != $found_ip){
                 $client_ip = $found_ip;
                 break;
              }
           }
        }
     } else { $client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ? $_SERVER['REMOTE_ADDR'] : ( ( !empty($_ENV['REMOTE_ADDR']) ) ? $_ENV['REMOTE_ADDR'] : "unknown" ); }
     return $client_ip;
  }
}
?>

Ahora para llamar la función es simple desde el controllador agregas la siguiente línea:

$model->ip = Funcion::ObtenerIP();

Y estaríamos listo.

Saludos! 😀