E-ZINE
#07 Abril de 2008
1
INDICE
Redactores Unknownmind Hernandgr Epsilon77 Jhon Jairo Hernández Lordjackob
Diagramación
Adminstración y Seguridad en Wordpress
3
Blind SQL Injection, un enemigo oculto de los desarolladores Web
15
Seguridad en Aplicaciones Web
18
Creando un Compilador con JAVA
25
Hardening By Dino
30
José Julián Orozco García Tel: 312 2614571
Diseño Zyrus www.zyrusweb.com
Web
www.dragonjar.org
2
Adminisrtración y Seguridad en Wordpress Acerca del autor
2. ¿Qué es Wordpress?
Mi nombre es Unknownmind soy de Colombia tengo 22 años. Soy estudiante de Química Pura de sexto semestre pero también me autodenomino un Geek de Internet y más del diseño Web. Actualmente estoy profundizando en el manejo de los CMS (Content Management System) especialmente en Wordpress, Joomla y phpBB. Espero este manual sea de gran ayuda para los actuales y futuros Blogers de la Red.
WordPress es un sistema de gestión de contenidos enfocado a la creación de blogs. Desarrollado en PHP y MySQL, bajo licencia GPL, tiene como fundador a Matt Mullenweg. WordPress fue creado a partir del desaparecido b2/cafelog y se ha convertido junto a Movable Type en el CMS más popular de la blogosfera. Las causas de su enorme crecimiento son, entre otras, su licencia, su facilidad de uso y sus características como gestor de contenidos. También una de las causas, es su enorme comunidad de desarrolladores y diseñadores, que se encargan de crear plugins y themes para la comunidad.
Hoy en día es interesante instalar y gestionar tu propio Blog ya que es una manera de expresarte a través de Internet. Además no solo puedes utilizarlo como una herramienta de expresión individual sino también utilizarlo como una herramienta para formar una comunidad online. Este manual tiene como objetivo enseñar a un usuario de cualquier nivel en este campo de la informática a Instalar y administrar un Blog en Wordpress así como también manejar una seguridad digna para evitar intrusiones y/o violaciones a tu información. Espero les sea de su agrado….
3. Estructura de Wordpress
1. ¿Qué es un Blog?
Un blog, o en español también una bitácora, es un sitio web periódicamente actualizado que recopila cronológicamente textos o artículos de uno o varios autores, apareciendo primero el más reciente, donde el autor conserva siempre la libertad de dejar publicado lo que crea pertinente. El término blog proviene de las palabras web y log (‘log’ en inglés = diario). El término bitácora, en referencia a los antiguos cuadernos de bitácora de los barcos, se utiliza preferentemente cuando el autor escribe sobre su vida propia como si fuese un diario, pero publicado en Internet en línea.
3
• Fácil instalación, actualización y personalización. • Sigue las recomendaciones del W3C. • Separa el contenido y el diseño en XHTML y CSS. • Posee herramientas de comunicación entre blogs (Trackback, Pingback, etc). • Importación desde Movable Type y Typepad, Textpattern, Greymatter, Blogger, Dotclear, Livejournal, Blogware y desde cualquier RSS. • Se está trabajando para poder importar desde pMachine y Nucleus. • Fácil integración con el foro bbPress de los mismos creadores de Wordpress. • Integración con el foro Vanilla de Lussumo factible. • Integración con Ajax 4. Funcionalidades de Wordpress
• Puede haber múltiples autores. • Permite ordenar artículos y páginas estáticas en categorías, subcategorías y etiquetas (“tags”). • Capacidad de crear páginas estáticas a través de la base de datos (a partir de la versión 1.5). • 3 estados para un post: Publicado, Borrador,
• • • • • • • • • •
Esperando Revisión(Nuevo en Wordpress 2.3) y Privado (sólo usuarios registrados) además de uno adicional: Protegido con contraseña. Publicación mediante email. Guardado automático temporizado del artículo como Borrador (A partir de la versión 2.2). Permite comentarios. Permite permalinks (enlaces permanentes y fáciles de recordar) mediante mod_rewrite. Distribución de los artículos mediante RDF, RSS 0.92, RSS 2.0 y Atom 1.0. Distribución de las discusiones (mediante RSS 2.0 y ATOM 1.0). Gestión y distribución de enlaces. Admite plugins. Widgets para los Themes. Uso de Etiquetas para cada post
La última versión de Xampp actualmente es la 1.6.6a. Para descargar Xampp lo puedes descargar del sitio oficial u otros enlaces. Sitio Oficial: http://www.apachefriends.org/en/ xampp.html Descarga Directa: http://superb-east.dl.sourceforge. net/sourceforge/xampp/xampp-win32-1.6.6a.zip La instalación de Xampp es muy sencilla. Cuando hemos descargado la aplicación, la descomprimimos y la ejecutamos.
5. Herramientas de Instalación
Para instalar nuestro Blog Wordpress necesitamos un espacio en donde instalarlo, este debe tener un sitio mínimo de 50 Mb, una base de datos y que soporte o intérprete el lenguaje PHP. Si buscamos por Internet hay muchas opciones de hosting gratuitos con estas características y muchas más. Pero la idea de este manual es mostrar que es posible instalar tu propio Blog y visualizarlo en tu propio servidor local. 5.1 ¿Qué es Xampp? XAMPP es un servidor independiente de plataforma, software libre, que consiste principalmente en la base de datos MySQL, el servidor Web Apache y los interpretes para lenguajes de script: PHP y Perl. El nombre proviene del acrónimo de X (para cualquiera de los diferentes sistemas operativos), Apache, MySQL, PHP, Perl. El programa esta liberado bajo la licencia GNU y actúa como un servidor Web libre, fácil de usar y capaz de interpretar páginas dinámicas. Actualmente XAMPP esta disponible para Microsoft Windows, GNU/Linux, Solaris, y MacOS X.
El lenguaje por defecto de la instalación que aparece es English [Inglés], en español esta versión todavía no se encuentra disponible, ya se esta desarrollando la versión 1.6.6 estable tal ves esta versión lleve el paquete del idioma Español. Lo importante es que la interfaz de administración si esta en español, lo veremos más adelante. Simplemente en la instalación de esta aplicación debes entender cada paso, si es posible léelo así no sepas inglés. Casi siempre se aplica next – next –next a todo pero mira este paso:
6. Instalando Wordpress
Aquí arrancamos con la instalación de Wordpress, actualmente (Mayo de 2008) la ultima versión es wordpress 2.5.1. Que puede descargarse del sitio oficial http://wordpress.org http://wordpress.org/latest.zip 4
Si llegas a este paso observa muy bien que debes seleccionar las opciones Install Apache as service y Install MYSQL as service. Te preguntarás ¿Por que
no Filezilla?, bueno pues Filezilla es un cliente FTP que solo utilizarías si instaláramos nuestro Blog en un Server de Internet, por eso no lo necesitamos… Luego de esto damos clic en Install. Luego de instalar aparece una ventana como esta:
Luego dale finalizar y después de una que otra ventana de cmd.exe se estará ejecutando normalmente nuestro servidor local. Es importante que mientras se este instalando Xampp no cierres ninguna de las ventanas anteriormente descritas ya que si las cierras, cerraras algún servicio importante que evite avanzar en este manual. Luego dale clic en si y listo no es más.
Esta imagen significa que esta corriendo correctamente nuestro servidor local XAMPP. Ya tenemos instalado Xampp ahora abriremos un navegador: Explorer, Firefox, Opera o el que quieras, en mi caso abriré Firefox y en el campo de la url escribiré localhost. Elegimos nuestro idioma y listo. Bueno ahora conoceremos mas cosillas importantes para instalar nuestro Blog, Vamos a la ubicación donde instalamos Xampp. En mi caso C:\. Si entramos a la carpeta htdocs fíjate muy bien en la carpeta. Esta carpeta contendrá todos los archivos de nuestro Blog. 5
Todos los archivos que ubiquemos dentro de esta carpeta se visualizarán en http://localhost/archivo 6.2 Instalando nuestro Blog Como ya hemos descargado el paquete de Wordpress simplemente se descomprime para utilizar su contenido. Debe quedar descomprimido de tal manera que si entramos a la carpeta Wordpress se vea este contenido:
Ahora copiemos o cortemos esta carpeta dentro de la carpeta htdocs de Xampp. Y podemos cambiar el nombre de la Carpeta por accesibilidad. En mi caso le pondré Unknownmind.
1. Nombre de la base de datos 2 Nombre de usuario de la base de datos 3. Password e la base de datos 4. Host de la base de datos 5. El prefijo (si usted quiere controlar más de un WordPress en una sola base de datos)
Ahora nos vamos de nuevo a nuestro navegador y actualizamos o escribimos http://localhost/Unknownmind, recuerda que Unknownmind es el nombre de mi carpeta…Debes aplicarla a la tuya, ejemplo http:// localhost/dragon.
Una de las funcionalidades de Wordpress es que permite el registro de usuarios y para esta función necesitamos una base de datos, además es un requisito de instalación. ¿Cómo crearemos una base de datos? Pues para eso esta Xampp. En nuestro navegador nos vamos de nuevo a localhost y si observamos muy bien en la parte izquierda se encuentran estas herramientas:
Damos clic en Create a Configuration File Traducción: Bienvenidos a WordPress. Antes de comenzar, necesitamos alguna información sobre la base de datos. Usted tendrá que conocer los ítems siguientes antes de proceder.
6
Damos clic en phpMyadmin:
Aquí podemos crear la base de datos que necesitamos y muchas más si queremos. Para crear una base de datos escribe el nombre y da clic en crear, como lo muestra la imagen.
Ya hemos creado nuestra base de datos. Ahora nos devolvemos al navegador donde vamos a instalar wordpress y damos clic en Let`s go. Ahora nos encontramos con un formulario el cual solo se debe poner el nombre de la base de datos que hace poco creamos, en mi caso myblog, user name: root, password: lo dejaremos en blanco, database Host: localhost
Luego si los datos son correctos daremos clic a Submit
La imagen anterior nos indica que los datos del formulario son correctos y continuamos con la instalación. Clic en Run the install. Llenaremos los datos de nuestro Blog como el Título y nuestro E-mail. Clic en Install Wordpress.
Felicitaciones tu Blog Wordpress ha sido instalado Username: admin. Password: J4RpX0yHTNAa Ahora ya tenemos nuestro nombre de usuario y nuestro password ahora simplemente los utilizamos para acceder como Administradores de nuestro Blog. Y observaremos nuestro panel de administrador.
En este último campo Table Prefix nos piden el prefijo de las tablas de la base de datos, pues ahora ya empezaremos a tratar la seguridad de este CMS, para evitar intrusiones o injecciones SQL a nuestro Blog lo que recomiendo es cambiar el prefijo por defecto wp_ por uno menos convencional. Ejemplo: blog_ este sería el primer paso de seguridad en nuestro Blog que empieza en su Instalación.
7
Después de entrar al panel de administración sería indispensable que cambies el password por uno más accesible pero no menos seguro… Entonces para eso nos vamos a Usuarios
Unknownmind y observamos el archivo llamado wp-config.php damos clic derecho y elegimos abrir con WORDPAD… Aparecerá este código:
Damos clic en admin y más abajo observamos una parte del formulario el cual permite cambiar nuestro password
Existe una parte que define nuestro lenguaje entonces modificaremos esa línea así: define (‘WPLANG’, ‘es_ES’); Simplemente agregamos es_ES, luego cerramos y guardamos los cambios. Luego de cambiar el password damos clic en actualizar perfil 7.0 Cambiando el idioma a Español Considero que no es necesario cambiar el idioma de English a Spanish en este mundo lleno de oportunidades, pero como es cuestión de vida o muerte para algunos Blogers (Incluyéndome) cambiaremos el lenguaje del Blog a Español. Como primer paso descargaremos el paquete del lenguaje español que se encuentra en este sitio http://carrero.es/wp-content/uploads/2008/03/wp-25castellano.zip después de descargar y descomprimir el paquete observamos la carpeta Includes y dentro de esta carpeta otra llamada Languajes. Esta última carpeta debemos copiarla y pegarla en la siguiente ruta: C:\Xampp\htdocs\Unknownmind\wp-includes. Es decir pegaremos la carpeta Languajes dentro de la carpeta includes. Luego iremos a la carpeta de nuestro Blog en mi caso la carpeta 8
De esta manera nuestro panel de administración y nuestro Blog en general cambia automáticamente al lenguaje Español. . Ve al panel de administración y dale actualizar. Ahora ya tenemos nuestro panel de administración actualizado.
7.1 Instalando un Theme En general un Theme es una plantilla de diseño para una página Web en nuestro caso para nuestro Blog. Si observamos la página principal de nuestro Blog http://localhost/Unknownmind se encontrará una plantilla que viene por defecto con Wordpress. La ubicación donde se instalan los themes es C:\ xampp\htdocs\Unknownmind\wp-content\themes. Ahora instalar un theme es tan sencillo como instalar Xammp . Vamos a descargar un Theme a nuestro gusto. Ten en cuenta Colores, diseño, letra, etc. Bueno yo ya elegí el mío se llama Mandigo y lo he modificado.
Recomiendo esta página para descargar themes de Wordpress. http://www.wpthemesfree.com El cual puedes elegir entre colores, número de columnas, los 10 mejores votados, etc. Cuando hayas descomprimido el paquete del theme lo ubicas en C:\Xampp\htdocs\Unknownmind\ wp-content\themes. Luego nos vamos al panel de administración y donde dice Diseño:
ahí estará todos los themes que tengamos ya instalados. Simplemente lo seleccionas y se mostrará. Cuando selecciones el Tema. Vas al sitio http:// localhost/Unknownmind
do a instalar un theme. Haré un pequeño ejemplo de instalación, la verdad no se con que plugin hacerlo… Lo haré con el plugin de encuestas…Que se llama Wp-Polls Descargalo de http://wordpress.org/extend/plugins/ wp-polls/ Cuando ya lo hemos descargado, lo descomprimimos y lo subimos a la carpeta C:\xampp\htdocs\Unknownmind\wp-content\plugins, luego vas al panel de administración en la parte derecha se encuentra el link Plugins Buscas el plugin y lo activas.
Bueno ya he activado el plugin que agrega una o varias encuestas a mi Blog. Ahora vamos a agregarlo para que sea visible en nuestro Blog. Automáticamente después de activas este plugin, aparecerá un nuevo botón llamado Polls
Ahí esta ya el Theme instalado y listo. 7.2 Instalando un plugin Un plugin es una aplicación que interactúa con nuestro Blog para aportarle una función o utilidad, generalmente muy específica. Un ejemplo agregar un álbum de fotos, un formulario de contacto, un modulo de encuestas, etc. Hay demasiados en páginas de desarrolladores de Wordpress incluyendo su página principal. http://wordpress.org/extend/ plugins/. Bueno en general instalar un plugin es muy pareci9
Puedes observar que ahí se encuentran todas las opciones de nuestro plugin de encuestas. Como primera medida crearé una encuesta para mostrar, clic en Add Poll. Tengo que aclarar que cada plugin que descargues viene con su respectivo archivo readme en donde se encuentra toda la información para la instalación y su uso. Si lees el archivo readme de el plugin de encuestas te das cuenta que debes agregar un código a tu theme actual. Para eso debemos ir a la pestaña Diseño (donde se encuentran todos nuestros themes) y en la pestaña Editor de temas, como se muestra a continuación:
Puedes ver al lado izquierdo los códigos y al lado derecho las plantillas… Cada plantilla u archivo tiene un código diferente o similar que hace que tu Blog se vea y se comporte de tal manera. Al lado derecho busquemos un archivo llamado sidebar.php o barra lateral y demos clic en él. Al lado derecho se encontrará el código del sidebar de tu theme. Ahora para agregar la encuesta debes agregar este código a tu sidebar.php:
Polls
Si observas muy bien al lado izquierdo de nuestro editor de temas, es muy fácil identificar cada código con cada visualización del theme. Por ejemplo el código que corresponde al calendario que se ve en mi Blog es este: . Ahora debajo de este código pegaré el del plugin de la encuesta y guardaré mi archivo sidebar.php:
Como segundo ejemplo de la instalación de un plugin, es más dedicada a los amantes del Futbol (como yo ) se trata de un plugin para observar los resultados e información de los juegos de la EUROCOPA 2008. Primero descargaremos el plugin de aquí http://downloads.wordpress.org/plugin/wp-em-08. zip Luego lo descomprimimos y ubicamos el archivo en C:\xampp\htdocs\Unknownmind\wp-content\ plugins. Entramos al panel de administración y activamos el plugin Luego de activarlo, como ya lo habiamos hecho con el anterior plugin agregamos este código en nuestro sidebar de nuestro theme…Recordemos la pestaña Diseño Editor de temas Sidebar o barra lateral:
El código anterior muestra los partidos próximos y el siguiente muestra los partidos en vivo, lógicamente aparecen todos en ceros por la EUROCOPA no a empezado… Lastima que mi equipo Inglaterra no este…
Luego de Actualizar el archivo, tendremos nuestro plugin listo en nuestro Blog. Y ya nuestros visitantes pueden interactuar con él…
10
estandares Web 7.3 Servicios recomendados para tu Blog De la poca experiencia que tengo en el desarrollo Web he utilizado excelentes servicios para mi Blog, así como también excelentes plugins. De esta manera hago una recopilación de todos ellos, para darle un toque profesional, dinámico y adaptable a la Web 2.0…. 1. http://tester.jonasjohn.de/ [Recomendado] Son 100 Herramientas para testear tu sitio Web tipo validación xhtml, links rotos, etc 2. http://linkbun.ch/ Excelente herramienta que agrupa una cantidad de enlaces en uno solo... 3. http://www.artviper.net/colorfinder.php Obtener todos los colores que posee una Web. Muy util cuando guiamos nuestro diseño de otros sitios 4. http://www.sprymedia.co.uk/article/Design Recopilación de herramientas basadas en Javascript 5. http://www.mylivesignature.com Si tienes un Blog o Web personal puedes agregarle una firma digital personalizada 6. http://logogenerador.com/ Crea tus Logos 2.0 Online [Recomendado] 7. http://logogenerador.com/ Javascript que nos permite convertir texto a .png 8. http://www.designoogle.com/ Buscador de temas y artículos que nos pueden servir para inspirarnos en diseño 9. http://www.superscreenshot.com/ Herramienta online que nos permitirá tomar capturas Web al instante con diferentes resoluciones de pantalla 10. http://code.google.com/p/ie7-js/ Script para que Iexplorer se comporte acorde a los 11
11. http://cloford.com/resources/colours/500col. htm Mas de 500 Colores en Hexadecimal 12. http://moourl.com/ Acorta URls demasiado largas 13. http://xhtml-css.com/ Validar tu código xhtml y css 14. http://www.genfavicon.com/es/ Generador de favicones 15. http://www.genfavicon.com/es/ Contador de usuarios Online en tu Web 16. http://www.formstylegenerator.com/ generador de estilos para formularios 17. http://www.quickribbon.com/index.php Generador de tiras diagonales 18. http://www.andanza.com/index.htm Ver tu Blog desde cualquier dispositivo Móvil 19. http://fawnt.com/ Fuentes gratuitas 20. Muy util para los foros http://www.bbcode-to-html.com/ Convertir bbcode a html... 21. http://dryicons.com/free-icons/ Recopilación de excelente iconos descargables bajo licencia Creative Commons 3.0 Algunos Plugins Akismet: Controla el Spam Calendar: Agrega un calendario dinámico flickrRSS: Agrega un álbum de fotos de tu cuenta Flickr Google XML Sitemaps: Crea un sitemap del Blog Jalenack’s Wordspew: Agrega un pequeño tagboard (Chat) PopStats: Estadísticas completas de tu sitio WP-ContactForm: Formulario de contacto WP-Polls: Encuestas en tu Blog
WP-ServerInfo: Información del Server que aloja tu Blog WP-Sticky: Deja post estáticos WP Dash Note: Pequeña agenda en el panel de administración WP-SWFObject: Para agregar mp3 y animaciones en flash a tu Blog
• • •
8. Seguridad en Wordpress Bueno en realidad la seguridad informática no es un tema aparte en nuestro Blog, algunos Blogers descuidan en un 99.9% la seguridad de su CMS. ¿De quien nos defendemos? De Lammers, de defacers, de intrusiones de crackers, de espías de información, etc. A muchos Geeks o diseñadores Web no les gustan los CMS con la excusa de que son todos vulnerables… Buuuu que mentira…. 8.1 Consejos de seguridad obvios Aquí van algunos consejos de seguridad obvios para nuestro Blog • Es indispensable actualizar la versión de nuestro Blog ya que para este tipo de CMS existen muchas vulnerabilidades el cual en manos de un Scripkiddie o un defacer es una delicia informática. Actualizar el Blog es sencillo simplemente guarda el archivo wp-config.php y un backup de tus post posteriormente reemplaza todos los archivos de la vieja versión por la nueva y luego reemplaza el archivo wp-config que guardaste por el nuevo. • Las vulnerabilidades provienen muchas veces de los plugin por esta razón se deben actualizar (reemplazar) la versión vieja de un plugin. La versión 2.5.1 de Wordpress nos da un aviso cuando los plugins están desactualizados. Para algunos Blogers es molesto pero es por la seguridad del Blog. • Realiza constantemente Backups de tus post • Utiliza la mayor cantidad que puedas de Plugins de seguridad que minimicen la inseguridad de tu Blog. • Recuerda cambiar el nick por default de la administración y crea un password más seguro. • Sabemos que un Blog es una bitácora de nuestra vida. Pero es importante no expresar en 12
• •
nuestro Blog datos muy pero muy personales, esto se presta a Ingeniería social. Si tu Blog es personal lo ideal sería que tú seas el único administrador, a menos que creas administradores de confianza. No distribuyas información delicada a través de tu Blog Recuerda el aumento de Blogs es directamente proporcional al robo de identidad. Por esta razón insisto en mantener tu información personal delicada fuera de tu Bitácora. Crea post privados (con password) para información de importancia media. No sigas solamente estos Tips, busca los que más puedas por Internet. Te recomiendo http:// www.blogsecurity.net
8.2 Cambio del prefijo de las tablas antes de la instalación Bueno este paso prácticamente lo observamos detalladamente cuando instalamos nuestro Blog Wordpress… El prefijo que viene predeterminado es wp_ simplemente lo cambiamos por otro diferente… Existe un plugin que cambiar el prefijo de las tablas después que hemos instalado wordpress y no lo cambiamos…Lamentablemente es incompatible con wordpress 2.5. Más adelante sale la versión compatible… 8.3 Cambio del nombre de usuario El nombre de usuario por defecto que Wordpress crea es admin. Es necesario cambiarlo, para evitar ataques de fuerza bruta a nuestro Blog. No solamente cambiar el nombre de usuario sino también el password. Para cambiar el nombre de usuario admin debemos entrar al panel de administración e iremos a usuarios el cual nos mostrará los usuarios registrados de nuestro Blog, si observamos estará nuestro nombre de usuario admin el cual hay que modificar. Ahora crearemos otro usuario, en mi caso Unknownmind y un tipo de password como unkn$wn08*, no olvides los privilegios de este nuevo usuario el cual debe hacer Administrador. Luego nos vamos de nuevo a usuario y eliminamos el usuario admin. Ahora ya hemos creado el usuario Unknownmind que es administrador del Blog. Como estamos logeados como admin, simplemente damos salir y nos logeamos como el nuevo administrador. Posteriormente le atribuimos todas las entradas y enlaces al nuevo administrador. Para cambiar nuestra contraseña simplemente nos vamos a usuarios y luego perfil. Para un mayor control en seguridad de usuarios existe un plugin llamado role-manager el cual define y maneja múltiples perfiles de suscriptor. Aquí se ubica el link de la descarga y la instalación. Pero debo aclarar que este plugin no es compatible con wordpress 2.5
13
Descárgalo de http://www.im-web-gefunden.de/ wp-content/downloads/plugins/role-manager.zip Después de la instalación observaremos una modificación en el panel de administración. Si observamos la pestaña Roles nos encontramos con los diferentes niveles de usuario y estamos en la capacidad de modificar sus roles…un poco más abajo observamos una opción para crear nuevos roles de usuario. 8.4 Restringir wp-content y wp-includes Para este paso vamos a limitar el acceso a estas dos carpetas solamente tendrá acceso imágenes, CSS y algunos archivos JavaScript. Dentro de las carpetas wp-content y wp-includes se encuentran los archivos .htaccess los cuales modificaremos de esta manera en su contenido: Order Allow,Deny Deny from all
Allow from all
Esto aplica para Blogs alojados en un servidor en Internet y para sitios de un solo Blog, ya que si tenemos varios blogs generarán algunos problemas. 8.5 Restringir wp-admin Esto aplica cuando nuestro Blog se encuentra alojado en un host en Internet: Si controlas un Blog de un solo usuario podemos restringir el acceso al directorio wp-admin vía IP. Para esto necesitamos que nuestra IP sea IP estática. Si vamos por FTP a nuestro directorio wp-admin buscamos el archivo llamado .htaccess Abrimos el archivo .htaccess y escribimos Order deny,allow Allow from 0.0.0.0 #Esta es tu IP estática Deny from all
Si ha sido correcto el cambio, todas las IPs que entren a http://www.tublog.com/wp-admin/ no podrán acceder, solamente tu IP en este caso 0.0.0.0, el cual es el parámetro que debes cambiar puede acceder completamente a este directorio que es muy importante para nuestro Blog.
Si se quiere agregar más seguridad modifiquemos el archivo .htaccess dentro del directorio wp-admin de esta manera: AuthUserFile /srv/www/user1/.htpasswd #this file should be outside your webroot. AuthType Basic AuthName “Blog” require user youruser #making this username difficult to guess can help mitigate password brute force attacks. Donde se debe modificar youruser el cual tendrá acceso total a este directorio. 8.6 Restringir acceso al wp-login y wpadmin evitando fuerza bruta El plugin llamado Login LockDown es un plugin que nos permite bloquear a un usuario que intenta logearse en wp-login o wp-admin. Lo descargamos de su Web principal http://www.bad-neighborhood. com/loginlockdown-1.1.zip al activar el plugin y si nos ubicamos en el panel de administración en OpcionesLogin LockDown, podemos ver las opciones de este plugin. Si observamos el panel podemos apreciar que se puede controlar el número de intentos para poder acceder al login de nuestro Blog o al panel de administración. En caso de que en esos intentos se falle el sistema bloquea tu IP temporalmente, el tiempo de bloqueo es de tu preferencia. 8.7 Banear usuarios El plugin wp-ban tiene como objetivo el baneo de IPs, de esa manera se mejora la seguridad de nuestro Blog. Puede Banear una IP o un rango de IPs. Este plugin lo podemos descargar en http://lesterchan.net/portfolio/programming.php. En nuestro panel de administración nos ubicamos en Gestionar -Ban. Cuando se Bannea una IP o un rango de IPs, si pertenece a un visitante cuando entre a nuestro Blog en la Web principal mostrará un mensaje del motivo del Banneo, que también podemos modificar.
14
8.8 Wpids BlogSecurity ha desarrollado PHPIDS el cual es un plugin que trabaja como un sistema de detención de intrusos, cada intrusión es logeada en la base de datos y esto nos ayuda a tomar medidas de rastreo del intruso. http://php-ids.org/downloads/ La verdad no he tenido tiempo de probar su funcionamiento o errores… Pero cumplo con informar… 8.9 Wordpress Online Security Scanner Wordpress Online Security Scanner es un plugin el cual lo podemos instalar temporalmente. Lo descargamos de http://blogsecurity.net/wordpress/tools/ wp-scanner/ y lo activamos: Al activarlo vamos a esta URL http://blogsecurity. net/cgi-bin/wp-scanner.cgi de esta manera escaneamos nuestro Blog de algunas vulnerabilidades que comprometen la seguridad del mismo. Es importante que después del escaneo borremos el plugin ya que un intruso puede escanear nuestro Blog y saber nuestras vulnerabilidades así como también el mismo scan de wordpress nos da la documentación para corregir la vulnerabilidad. Cuando ya este activado el plugin vamos a esta URL http://blogsecurity.net/cgi-bin/wp-scanner.cgi y escaneamos nuestro Blog... 9. Agradecimientos Agradezco a mi esposa y a mi hija por su paciencia al realizar este manual, ya que fueron 10 días realizándolo frente al computer. Agradezco a las personas que expresen su gratitud a este manual. http://unknownmind.chemx3.com. PD: Sin contar los otros días de modificación por el cambio de la versión de wordpress 2.5 10. Bibliografía http://es.wikipedia.org/ http://www.dragonjar.org http://www.blogsecurity.net
BLIND SQL INJECTION, UN ENEMIGO OCULTO DE LOS DESARROLLADORES WEB INTRODUCCION
Hola a todos los lectores, soy epsilon77 integrante de la comunidad DragonJAR, y en esta oportunidad, les traigo un pequeño artículo, sobre esta técnica de hacking que es relativamente nueva respecto a otras. En esta entrega hablare, un poco sobre esta técnica que cada vez coge mas fuerza en la red, y como se puede evitar esta «vulnerabilidad». ahora si mas preámbulo vamos a lo que nos interesa. Los ataques sql injection han ido en aumento en estos últimos años, esto es debido a que con la llegada de la web 2.0 han aumentado las aplicaciones web, que intervenienen con bases de datos, además de esto, se han publicado muchos documentos explicando como hacer un ataque de este tipo, y esta información a llegado a manos equivocadas, q han logrado hacer de las suyas. Muchos expertos en seguridad, han unido esfuerzos para poder encontrar solución a esta vulnerabilidad, sin embargo, las soluciones mas eficaces, para esto es concienciar y capacitar a las programadores, sobre este ataque, mostrarles como funciona, y lo peligroso que puede llegar a ser. Algunos programadores creen que la solución a este problema es evitando mostrar errores, que dan información al atacante, por que existe la técnica blind sql injection, que lo que hace es hacer sql injection sin saber nada sobre la base de datos, sin necesitar errores, ni nada por el estilo, el objetivo de este documento es informar un poco sobre que es tas técnica y como funciona. ¿QUE ES SQL INJECTION?
Antes que nada debemos hablar sobre que es sql injection. esta es una técnica, que nos permite ingresar sentencias o comandos arbitrarios dentro de una consulta, con el fin de manejar los procesos de una aplicación web, y poder acceder a la información que 15
hay en las bases de datos de esa aplicación, generalmente estas sentencias se introducen en campos de login y password o en la barra de direcciones. Cuando el navegador ejecuta dichos comando y los procesa, la respuesta es un error, este error nos brinda información sobre la base de datos.
Sin embargo, el objetivo de este artículo no es hablar sobre sql injection si quieren mas información pueden ir a: http://es.wikipedia.org/wiki/ Inyecci%C3%B3n_SQL ¿QUE ES BLIND SQL INJECTION?
Muchos desarrolladores creen que la forma de evitar ataques de sql injection es poner una pagina personalizada en ves del error que nos muestra el navegador, esto es, si inyectamos unas sentencias, nos mostrara una pagina cualquiera, pero no el error, esto es FALSO por que para este tipo de «seguridad» se utiliza la técnica BLIND SQL INJECTION, pero en si que es esto? si traducimos la expresión nos dirá algo así como «sql injection a ciegas», esto significa que con esta técnica podemos, inyectar las sentencias y comandos, pero sin la posibilidad de ver ningún resultado en el navegador (error), con esta técnica el atacante puede visualizar, extraer e incluso modificar información de la base de datos Para hacer un ataque sql injection a ciegas se debe crear un vector de ataque, este vector solo será de verdadero o falso, con este vector se centrara todo el ataque y nos permitirá conseguir la información deseada, mas adelante les mostrare en un ejemplo como hacer el ataque.
BUSCANDO APLICACIONES VULNERABLES Para hacer un ataque de este tipo el atacante debe hacer un estudio similar al que se hace en los ataques sql injection, para determinar en que porción del código de la aplicación no esté realizando una comprobación correcta de los parámetros de entrada, la verdad esto resulta muchas veces más complicado que hacer el ataque, por que por mas analisis que hagamos nunca podremos concluir que un parámetro va ser 100% vulnerable, siempre va haber un margen de error, entonces explicare con un pequeño ejemplo: tenemos la pagina: www.victima.com/secciones.php?id=3
podemos ver claramente que el parámetro que se envía es id y el valor de ese parámetro en este caso es 3, para hacer el análisis de forma correcta, vamos a inyectar 2 sentencias que no hacen ningún cambio en el resultado estas las llamaremos sentencias(-), y 2 sentencias que si provocan cambios en el resultado y a estas las llamaremos (+). Ahora si comencemos hacemos las sentencias(-) así:
estamos frente a una potencial víctima xD. EMPIEZA EL ATAQUE!!!!
Ya tenemos una pagina de verdadero que es la sentencias(-) y la de falso que es la sentencias(+), con esto ya podemos crear, el vector de ataque. Entonces por ejemplo si queremos saber si la tabla user existe inyectamos lo siguiente: www.victima.com/secciones.php?id=3 and exists (select * from user)
Si al ejecutar esta sentencia, nos da el mismo resultado que cuando ejecutamos sentencias(-), quiere decir que si existe la tabla, si por el contrario nos da el mismo resultado que cuando ejecutamos sentencias(+), quiere decir que la tabla no existe, o que tenemos mal escrita la sentencia, por que debemos recordar que aunque el mysql sea un estándar, hay varias diferencias entre sus versiones. Ya tenemos el nombre la tabla de los usuarios,. ahora vamos averiguar el nombre del administrador del sistema, antes que nada debemos saber de que tamaño es, es decir cuantos caracteres tiene, para esto hacemos eso ejecutamos la siguiente sentencia: www.victima.com/secciones.php?id=3 length(user())
www.victima.com/secciones.php?id=3 and 1=1 www.victima.com/secciones.php?id=3 +100-100
podemos ver claramente que en ambas sentencias, no se producen cambios ya que se inyectan valores verdaderos, y validos. hacemos sentencias(+) asi: www.victima.com/secciones.php?id=3 and 1=2 www.victima.com/secciones.php?id=-1 or 1=1
Con estas sentencias si se cambia el resultado ahora interpretemos los resultados, si ejecutamos la pagina normalmente, es decir sin inyectar ninguna sentencia, y nos devuelve el mismo resultado que cuando inyectamos las sentencias(-) podemos concluir que los parámetros si se están ejecutando, ahora bien si ejecutamos las sentencias(+) y nos muestra una pagina de error personalizada que no nos deja ver ningún tipo de información sobre la base de datos, entonces esto es un buen síntoma, 16
and
10>
que hace esta sentencia? compara si el tamaño del nombre del usuario es menor a 10, si el resultado que nos arroja es el mismo, de las sentencias(-) quiere decir que si se cumple la condición y que el tamaño del nombre del usuario es menor a 10, ya sabemos que esta entre 1 y 10, entonces acortamos la búsqueda, en ves de 10 ponemos 8 por ejemplo y así sucesivamente hasta que el resultado de la sentencia sea igual al resultado arrojado por las sentencias(+), cuando esto ocurra quiere decir que ese es el tamaño de la cadena. Ahora si por el contrario, cuando ingresamos la sentencia: www.victima.com/secciones.php?id=3 length(user())
and
10>
Nos arroja el mismo resultado que las sentencias(+) quiere decir que el tamaño de la cadena es mayor a 10. Listo ya tenemos el tamaño de la cadena, ahora vamos a buscar la cadena, inyectando esta sen-
de como funciona: tencia: www.victima.com/secciones.php?id=3 tring(user(),1,1))
and 300>ASCII(subs
Con esta inyección, lo que hacemos es comparar si el ASCII de la primera letra del nombre del usuario es menor que 300, obviamente esta inyección nos arrojara el mismo resultado que la sentencias(-), por qué? pueden mirar la tabla ASCII y se darán cuenta por que xD. Después iríamos acotando la búsqueda mas o menos así: www.victima.com/secciones.php?id=3 and 100>ASCII(substring(us er(),1,1)) —> sentencias(+) www.victima.com/secciones.php?id=3 and 120>ASCII(substring(us er(),1,1)) —> sentencias(-)
si analizamos estos resultados podemos ver claramente que el ASCII de la primera letra esta entre 100 y 120, seguimos acortando la búsqueda: www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(+) www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(-) www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(-) www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(-) www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(-) www.victima.com/secciones.php?id=3 ring(user(),1,1)) —> sentencias(+)
and 110>ASCII(subst and 115>ASCII(subst and 114>ASCII(subst and 113>ASCII(subst and 112>ASCII(subst and 111>ASCII(subst
ya sabemos que el ASCII de la primera letra es 111 que equivale a la letra «O», y así seguiríamos, obteniendo todos los caracteres, cabe aclarar que esto no puede funcionar debido a las versiones del servidor, a lo mejor faltaran algunas comillas o paréntesis. ALGUNAS HERRAMIENTAS!!!
Como pudimos ver, el proceso puede ser largo y tedioso para sacar información por este método, pero para ello, se ha creado diferente software todo con el fin automatizar esta tarea, voy a mostrar, algunas de ellas, que en mi criterio me parecen las más interesantes: * lSQL NINJA: Esta es una herramienta free, bajo la licencia GPL, es un escáner que busca vulnerabilidades a nivel de base de datos, es muy poderosa ya que te permite hacer fingerprint, fuerza bruta, escalada de privilegios, entre otras, en la pagina oficial, se puede descargar y además ver un videotutorial 17
Web oficial: http://sqlninja.sourceforge.net/ Ir a videotutorial: http://sqlninja.sourceforge.net/ sqlninjademo.html * BOBCAT: Esta es una herramienta que automatiza el proceso, es utilizada por analistas de seguridad, algunas características importantes, son: muestra facilimente el mapa de la base de datos, tiene interfaz grafica, es interesante vale la pena probarla Xd Web oficial: http://www.northern-monkee.co.uk/ projects/bobcat/bobcat.html CÓMO PROTEGERNOS!!
Hay varias formas de protegernos ante esta vulnerabilidad, quizás la defensa mas importante es que todos nos concienticemos, y aprendamos una programación mas segura. Igualmente también podemos procurar, que el cliente nunca suministre datos para modificar la sintaxis de comandos SQL, es decir, aislar la aplicación web desde SQL completo. Podemos implementar una interfaz segura como la de JDBC o ADO’s estas interfaces, ayudan a que nuestra aplicación sea mas segura, además tienen otras ventajas como de fácil manejo entre otras. Finalmente debemos reforzar todos estos consejos haciendo pruebas de penetración a nuestra aplicación para saber que bug presenta y poder repararlo, para esto podremos utilizar, las herramientas mencionadas anteriormente o similares. Bueno esto ha sido todo, espero que les haya gusREFERENCIAS: • www.dragonjar.org • www.google.com • www.hernanracciatti.com.ar
SEGURIDAD EN APLICACIONES WEB POR: hernandgr
De la mano de la evolución de nuevas tecnologías, tanto en hardware como a nivel lógico, es decir, programas, sistemas operativos, protocolos, lenguajes, y herramientas de programación, etc. el desarrollo de software también ha tenido un progreso que ha aprovechado todas las ventajas que estas nuevas tendencias pueden ofrecerle. Es así pues como hemos pasado por diversos modelos de desarrollo de software: las aplicaciones de escritorio individuales en un principio, luego el desarrollo de otros modelos como el cliente/servidor, y finalmente con el auge de la Internet y la expansión de la red de redes se dio la posibilidad del desarrollo de aplicaciones en entorno web, que permiten el acceso desde cualquier lugar del mundo a recursos centralizados o distribuidos en servidores, sólo teniendo como requisito un PC o un dispositivo móvil con un navegador web y una conexión a Internet disponible. El desarrollo de aplicaciones web ha ampliado y ha abierto muchas posibilidades de negocio mediante todas las ventajas y la flexibilidad que ofrece, pero a su vez, también ha crecido la amenaza que puede tener la información y los recursos que están expuestos para su acceso. Muchas veces el proceso de desarrollo de software se concentra mucho en la funcionalidad del mismo, y no da la suficiente importancia a otros aspectos que también la deben tener, entre ellos la seguridad. Este artículo pretende mencionar y dar a conocer cuáles son algunas de las principales amenazas a las que se ve expuesta una aplicación web, sus implicaciones y prevenciones. 1. Inyección SQL:
Cuando se hace una inyección SQL en una aplicación, se inserta un comando SQL que se ejecuta en el servidor para alterar su funcionamiento normal o para obtener datos de éste. Un ejemplo. Supongamos un formulario de Login común que tiene dos campos de texto para ingresar información 18
de un usuario y una contraseña.
La página que recibe estos datos puede contener una consulta como de este estilo para validar al usuario: Consulta=”SELECT * FROM tbl_usuario WHERE nomUsuario=’”+nombreUsuario+”’”
Entonces agregando la siguiente información en el campo usuario: Tendríamos que al enviar la página, si no se validan adecuadamente los datos, obtendríamos la siguiente consulta SQL. Consulta=”SELECT * FROM tbl_usuario WHERE nomUsuario=’a’ or 1=1; delete from tbl_usuario; —” Si se ejecuta esta consulta en el servidor de bases de datos, el resultado obtenido sería la eliminación de la información contenida en la tabla tbl_usuario. Aunque en realidad esto sólo funcionaría si los privilegios del usuario con el que corre la aplicación tiene permitido eliminar tablas. Esta es sólo una muestra de lo que se puede hacer, pero las posibilidades que se tienen al encontrar esta vulnerabilidad son muchas. La mejor forma de prevenir un ataque de Inyección SQL es validar completamente todos los datos de entrada de una aplicación antes de hacer cualquier operación sobre la base de datos. No se debe permitir el ingreso de caracteres potencialmente peligrosos como [*], [%], [;], [“], [‘], etc. Y lo más importante es que esta validación debe hacerse en el lado del servidor. Las validaciones Javascript utilizadas comúnmente en el lado del cliente no son suficientes, pues los datos enviados al servidor pueden ser modificados fácilmente utilizando diversas herramientas. La información susceptible de ser modificada puede ser campos en formularios, campos ocultos o cookies de usuario.
Otra forma efectiva de protegerse de una Inyección SQL es el uso de procedimientos almacenados en la base de datos, pues así se evita la ejecución de un comando ya previamente compilado en la aplicación, y se permite hacer un manejo de los parámetros en el motor de base de datos, aunque cabe advertir que esto no es 100% seguro, la inyección SQL puede seguir ocurriendo si el procedimiento no es bien desarrollado. 2. XSS Cross Site Scripting o Ejecución Inter Sitio. Este tipo de ataque es cuando se permite ejecutar código
script como Javascript, VBScript, Flash o cualquier otro tipo de código activo que interpreta el navegador. El problema se debe normalmente, a que como en la Inyección SQL no se validan correcta y completamente todos los datos de entrada. Aquí vemos un sencillo ejemplo de cómo se procesa un dato de entrada que es escrito en el navegador, y que no es validado. Los ataques XSS pueden usarse para robar datos como cookies o identificadores de sesión del usuario, que pueden contener información confidencial y ser usados para robar la identidad de su usuario original. Las maneras de proteger una aplicación de estos ataques en un principio debe ser validar los datos y evitar caracteres que puedan ser usados para ataques XSS, como <, >, (, ), #, &. Así mismo, validar y filtrar los datos que se van a mostrar. Así mismo, como usuario al navegar por páginas potencialmente peligrosas que puedan utilizar un ataque de este tipo para robar datos de los usuarios, se debe prevenir la ejecución de scripts malignos, por ejemplo mediante el uso de herramientas como las extensiones de Firefox 19
AdBlock y NoScript.
3. Identificación del Servidor Web
La identificación del servidor web en el que está funcionando una aplicación puede ser usada para buscar vulnerabilidades que puedan afectar a la plataforma. Una vez afectado el servidor, puede estar en peligro de ser manipulada la información allí alojada.
La información del Servidor Web se consigue verificando los encabezados que devuelve una página al hacerle una petición al servidor. Existen herramientas que ayudan a obtener dicha identificación, como por ejemplo la extensión ServerSpy de Firefox. Esto se puede prevenir configurando el servidor para que no muestre su encabezado o para que muestre uno modificado. Cabe aclarar que esta prevención no es una solución completa, pues también existen herramientas que pueden identificar el servidor sin depender del encabezado, como el software httprint. 4. Denial of Service (DoS)
La denegación de servicio ocurre cuando un servidor o recurso web es usado en forma exagerada o es objeto de peticiones desmesuradas que pueden terminar por desbordar su capacidad o tráfico y provocar errores en los servicios. Una denegación de servicio se puede prevenir mediante el uso de esquemas de seguridad como firewalls que eviten la exposición directa de un ser-
vidor y que filtre los contenidos que recibe y que envía. Aunque cabe resaltar que como estamos hablando de seguridad en aplicaciones web. Un firewall tradicional no es suficiente, también es conveniente usar un firewall de aplicación, como ModSecurity, el cual corre como un módulo del servidor web Apache y provee protección contra diversos ataques a aplicaciones web. 5. Mala administración de un sitio web
Es común ver como páginas que hacen uso de plataformas virtuales disponibles a todo el mundo, como wordpress, joomla o el célebre PHPNuke, entre otras, son objeto de ataques que se aprovechan de vulnerabilidades descubiertas en algunas versiones, y que por el simple descuido de sus administradores de no actualizar dicha plataforma, se exponen a ser víctimas de ataques que pueden ser sencillamente realizados con herramientas como exploits que se encuentran fácilmente en Internet. La recomendación es mantener siempre el software actualizado con las versiones disponibles que corrigen las vulnerabilidades descubiertas. Aspectos de seguridad.
Luego enviar al correo electrónico del usuario un enlace que le permita acceder a un sitio donde ingresar una nueva contraseña. Dicho sitio no debe tener un periodo muy prolongado de validez, pasado un lapso de tiempo debe caducar. Un ejemplo práctico de vulnerabilidades en aplicaciones web Para ilustrar algunos ejemplos de vulnerabilidades que pueden presentar Aplicaciones Web, usaremos como muestra el Hacme Casino, una aplicación de FoundStone, una división de McAfee®. El Hacme Casino es una aplicación dirigida a todos los desarrolladores y personas que desean probar y conocer acerca de la seguridad en aplicaciones web, mediante una serie de vulnerabilidades expuestas que pueden ser explotadas y conocer cómo funcionan. La descarga del Hacme Casino se puede hacer desde http://www.foundstone.com/us/resources/ proddesc/hacmecasino.htm. En este sitio se incluye una guía de usuario en idioma inglés que puede ser descargada para saber cómo se instala la aplicación y cómo se pone en funcionamiento, así como para
* Las contraseñas deben permanecer siempre encriptadas en la base de datos, de forma que nadie pueda visualizar el texto de la contraseña. * El envío de contraseñas a través de
páginas también debe ser encriptado para evitar que personas que rastreen los datos con herramientas como sniffers puedan obtenerlos.
* Después de varios intentos equivocados de acceder a una aplicación es conveniente implementar medidas que permitan prevenir que no se es víctima de un bombardeo o ataque automatizado, por ejemplo, el uso de CAPTCHA. * El modo ideal para implementar un recordatorio de contraseña, sería no mostrar una contraseña nueva directamente en pantalla. En primer lugar es bueno que el usuario proporcione datos personales o que responda una pregunta secreta que permita identificarlo. 20
conocer todas las vulnerabilidades y la forma en que pueden ser explotadas. La instalación es muy sencilla, simplemente se trata de ejecutar el instalador que se descarga desde la pagina y una vez instalado, ejecutar el servidor de prueba para la aplicación. Para esta práctica también se requiere usar un Proxy para analizar algunas peticiones HTTP. En la guía de usuario del Hacme recomiendan Paros Proxy, el cual será el que vamos a usar también.
SELECT * FROM USUARIOS WHERE (USUARIO=’<usuario>’ AND PASS=’<pass>’)
Al ingresar la sentencia que utilizamos en el campo de usuario, tendríamos como resultado: SELECT * FROM USUARIOS WHERE (USUARIO=» OR 1=1 —AND PASS=»)
Esta sentencia es válida a nivel SQL puesto que devuelve un resultado positivo, y en caso de que no se valide bien si el usuario y el password realmente son válidos, permitirá el ingreso a la aplicación. En el caso del Hacme Casino, nos permitirá el ingreso con el usuario “Andy Aces”
Una vez iniciado el servidor del Hacme Casino, estará disponible en el puerto 3000, y se puede ingresar a la aplicación a través del explorador web en la dirección http://localhost:3000
Obteniendo “Chips” para jugar
La primera vulnerabilidad: Inyección SQL Al tratar de ingresar cualquier nombre de usuario y/o password que sean inválidos obtendremos un mensaje de error. Pero al intentar introducir una sentencia básica para provocar una inyección SQL veremos la primera vulnerabilidad expuesta en el Hacme Casino. Si utilizamos la sentencia “ ‘) or 1=1— « podremos ganar el acceso a la aplicación con un usuario valido. Si analizamos el por qué de esto, suponemos que por ejemplo, se tiene una consulta SQL en la base de datos del tipo: 21
Los chips vienen siendo como las monedas con las que un usuario tiene derecho a jugar. Viendo en las opciones que tiene un usuario, éste puede hacer una transferencia de chips a otros usuarios. De qué forma es posible obtener chips?... El usuario con el que nos logueamos a través de la Inyección SQL no tiene ningún fondo a transferir, pero si se analiza la petición que se envía cuando intentamos transferir chips, usando la ayuda del Proxy, veremos lo siguiente:
Aquí observamos que se transfieren tres parámetros: transfer, login[] y commit. Con estos parámetros
es posible construir un enlace que nos transfiera fondos a nosotros. Es decir, si somos el usuario “Andy Aces”, y deseamos que nos transfieran 1000 chips, podemos construir la siguiente URL: http://127.0.0.1:3000/account/transfer_chips?tran sfer=1000&login[]=andy_ aces&commit=Transfer+Chips Cómo se puede explotar esto?... Si logramos a través de ingeniería social que otros usuarios logueados en la aplicación hagan clic en ese enlace, y disponen de los fondos suficientes, en este caso 1000 chips, estos serán transferidos a nosotros. Esta es una forma de hacer phising, gran mal que abunda hoy en la red, y que ha causado muchos daños a raíz de las vulnerabilidades aprovechadas
y los usuarios incautos. Veamos un ejemplo de cómo funciona en el Hacme Casino: En primer lugar, nos logueamos en la aplicación con otro usuario que será la “victima” a la cual se le descontarán los chips. El Hacme trae otro usuario llamado “bobby_blackjack” con contraseña “twenty_one”, así que procedemos a usar este login. Una vez que este usuario está logueado, si pulsa en la URL que construimos para obtener los chips, en
caso de no ser validada la transferencia de manera correcta, los fondos serán transferidos. En el Hacme lógicamente es una vulnerabilidad existente. Después de verificar los perfiles de los usuarios “Andy Aces” y “Bobby BlackJack” comprobamos que la transferencia ha sido realizada: Ahora el usuario “Andy Aces” tiene 1000 chips transferidos irregularmente desde la cuenta de “Bobby BlackJack”. La forma de ganar o ganar jugando BlackJack En el juego del BlackJack, existe un bug que permitirá que por lo menos el jugador no se arriesgue a perder su dinero si no está seguro de lo que va a hacer.
Cuando entramos a la parte del BlackJack, escribimos el valor a apostar, pero se observa que el dinero no es aumentado ni reducido de tu cuenta hasta que completas el juego, y si luego hacemos clic, por ejemplo, en el enlace al Lobby, simplemente se sale sin modificar la cantidad de chips. Por lo que el bug es sencillo: si no estás seguro de ganar, simplemente te sales e intentas de nuevo… La forma de evitar esto es validar que una vez que se haga la apuesta, se tenga que completar el juego obligatoriamente, o en su defecto, si el jugador se retira del juego, penalizarlo con la pérdida de su apuesta. Incrementando el número de chips: Cuando estamos jugando blackjack, y hacemos la apuesta, siempre tenemos dos opciones en el juego: Hit para que nos den otra carta, o Stay para quedarnos como estamos, y calcular quien gana.
22
Analizando con el Proxy Paros las acciones que ocurren cuando pulsamos Hit o Stay, vemos que se producen dos llamadas Ajax: Hit:
una apuesta de 100 chips, y que sumando lo que se ganó, el jugador dispone en total de 1080 chips… pero qué pasa si enviamos de nuevo la petición de Stay para recalcular de nuevo si ganamos o perdimos?... probamos a ingresar la URL que se genera con la petición para la opción Stay: http:// localhost:3000/blackjack/hit_or_stay?act=S
Después de ingresar esta URL y generar la petición, revisamos el perfil del jugador, y vemos lo siguiente:
Stay:
Ahora el jugador dispone de 1180 chips, es decir, nos sumaron de nuevo la ganancia del mismo juego. Esto significa que podríamos ingresar la URL http://localhost:3000/blackjack/hit_or_stay?act=S después de que ganemos una vez, y nos sumarán cada vez que la ingresemos el valor que ganamos.
De estas dos peticiones, surgen estas dos URL: http://localhost:3000/blackjack/hit_or_ stay?act=H http://localhost:3000/blackjack/hit_or_ stay?act=S
Cuando se genera la petición para la acción Stay, se da un cálculo según si se gana o se pierde, esto es, se aumentan o se disminuyen el número de chips. Cuál es la vulnerabilidad aquí?... Vamos a hacer un juego de blackjack hasta que logremos ganar una vez. En esta imagen podemos observar que se ganó 23
Este es un error de lógica de programación, que muestra el tipo de problemas a los que puede dejar expuesta una aplicación con un código que no se controla totalmente. Si bien las peticiones AJAX van “por debajo” de la aplicación, esto no quiere decir que no sean accesibles desde otra parte, de aquí la importancia de tener en cuenta todos estos detalles en el proceso de desarrollo para evitar este tipo de vulnerabilidades. Previniendo amenazas de seguridad en el proceso de desarrollo de software El proceso de desarrollo de software debe prever la mayoría de los aspectos y funcionalidades que va a tener una aplicación, y tratar de describirlas con el mayor detalle posible en sus fases iniciales
Referencias
de análisis y diseño con el fin de facilitar la etapa de construcción del software. El costo de prevenir un error será menor en la medida que sea detectado más temprano. Un análisis y diseño responsables deben contemplar todas las posibles amenazas de seguridad que puede sufrir una aplicación, categorizarlas y definir el riesgo que se puede correr en caso de ser afectado por una de ellas. Por ejemplo, unas metodologías para modelar y cuantificar los riesgos de seguridad en una aplicación que referencia Microsoft® en sus prácticas de seguridad son los métodos STRIDE y DREAD. Spoofing: Posibilidad de acceder con identidad falsa. Tampering: Posibilidad de modificación de datos. Repudiation: Posibilidad de poder probar una agresión ante un intento de denegación. Information revealed: Posibilidad de acceder a información confidencial. Denial of service: Posibilidad de disminución del servicio de la aplicación. Elevation of privilege: Posibilidad de que un atacante obtenga permisos de usuario privilegiado. Damage: Magnitud del daño que se puede recibir Reproducibility: En qué circunstancias se puede reproducir el ataque Exploitability: Dificultad para realizar el ataque Affected Users: Cantidad de usuarios que pueden verse afectados en un ataque Discoverability: Dificultad para descubrir la vulnerabilidad Finalmente, a modo de conclusión es bueno comentar que si bien nunca habrá nada 100% perfecto debido a que somos seres humanos, la seguridad depende mucho de los buenos hábitos que tenga un equipo de desarrollo para tratar de minimizar los impactos de la seguridad en las aplicaciones.
24
Este artículo fue realizado en base a información obtenida de las siguientes fuentes: * Wikipedia – http://es.wikipedia.org/ * Open Web Application Security Project - http://www. owasp.org/ * Microsoft® Developer Network - http://msdn2.microsoft. com/es-es/default.aspx * FoundStone http://www.foundstone.com/us/resources/ proddesc/hacmecasino.htm. * Paros Proxy http://www.parosproxy.org * Modsecurity http://www.modsecurity.org/ * La Comunidad DragonJAR – http://www.dragonjar.org
Creando un Compilador con JAVA por: lordjackob
[email protected]
Introducción Siendo un poco generales podemos decir que un compilador es un programa que lee un programa escrito en un lenguaje determinado (lenguaje fuente), y lo traduce en un programa equivalente pero en otro lenguaje objeto (puede ser otro lenguaje de programación o bien lenguaje maquina). Programa fuente
Programa objeto Mensajes de error
Los compiladores por lo general se clasifican como de una pasada, de múltiples pasadas, de carga y ejecución, de depuración o de optimación. Dependiendo de cómo fueron construidos y de la función que deben realizar. Aparentemente el proceso de desarrollo de un compilador es complejo pero en general, las características de los compiladores son las mismas. La teoría de los compiladores se rige en gran medida por teoremas, axiomas y reglas de las matemáticas, en este artículo no nos vamos a enfocar en el análisis de dichas reglas matemáticas, nos enfocaremos mas en el aprender a crear un compilador, teniendo en cuenta algunas reglas matemáticas y comenzando por crear una estructura básica, desde la cual podamos crear nuestro compilador e ir agregándole diferentes módulos. He elegido el lenguaje de programación Java para nuestro cometido, en esta primer entrega vamos a realizar un compilador básico mediante el cual podamos ejecutar sentencias sencillas tales como: las operaciones básicas (suma, resta, multiplicación y división), también le agregaremos a nuestro compilador operadores lógicos (i lógico, o lógico y negación) y operadores relacionales (mayor, menor, igual, mayor o igual, menor o igual, diferente), 25
teniendo en cuenta que en compilación 0(cero) es false, y diferente de 0(cero) es true. En posteriores ediciones agregaremos a dicho compilador todo lo relacionado con el manejo de variables y tipos de datos, estructuras de control tales como: goto, if – else, for y while, además esperamos también poder implementar funciones (métodos) tocando temas tales como recursividad, los cuales son muy importantes en el desarrollo de los compiladores. Para realizar el compilador necesitamos: conocimientos básicos sobre el lenguaje Java, una maquina virtual para la compilación y posterior ejecución de nuestro compilador y un poco de paciencia. Modelo de análisis y síntesis de la compilación.
La compilación puede ser dividida en análisis y síntesis, donde la parte del análisis divide el programa fuente en sus componentes y crea una representación intermedia del programa fuente, el cual es tomado posteriormente por la parte de síntesis para construir el programa objeto. Definiciones: Identificador: también llamado variable. Expresión: también conocido como proposición. Token: elemento básico indivisible.(if, else, var, =, !, >, entre otros), el cual puede estar compuesto por uno o varios caracteres. Lexema: cadena de texto (proposición) de la cual se deben sacar uno o varios token (Posición = inicial + velocidad * 60) dependiendo de la proposición. Lexer: también conocido como analizador léxico, es el que se encarga de tomar los lexemas y extraer los tokens (en este artículo será tratado como una clase). Parser: es el que se encarga de tomar ese conjunto de tokens y le da una representación en forma de árbol almacenándolos en un bytecode, recorriendo toda la cadena de caracteres y formando el árbol de forma recursiva (en este artículo será tratado como una clase). Bytecode: vector (o array) en el cual será almacenado dicho árbol.
Stack: es el lugar de memoria en el cual se van a almacenar los valores correspondientes a los resultados de operaciones tales como asignación, suma, resta, entre otros, el resultado de la operación permanece en la cima del stack y es el resultado de procesar la información que se encuentra en el bytecode. VirtualMachine: es el que se encarga de procesar la información contenida en el bytecode y colocar los valores correspondientes a las operaciones (suma, resta, asignación, etc) en el stack y así mismo generar el resultado de la operación realizada (en este artículo será tratado como un clase).
Ejemplo: después de agrupar los componentes léxicos en el análisis jerárquico se agrupan según la prioridad que tienen. Como bien sabemos la multiplicación tiene mayor prioridad que la suma, es por ello que en la estructura de árbol se ubica en la parte inferior, así es la operación que se debe realizar primero. 3. Análisis semántico: es en esta fase donde el compilador revisa el programa para tratar de encontrar errores y reúne información sobre los datos para posteriormente generar el código objeto. Finalmente el bytecode quedaría así:
Análisis del programa fuente
El análisis de programa fuente se divide en tres fases las cuales son: lineal, jerárquico y semántico. 1. Análisis lineal: (realizado por el lexer) también conocido como léxico o de exploración, es en el que se identifican los elementos de la cadena de caracteres ingresada y se agrupan en componentes léxicos (por lo general los espacios no se toman en cuenta). Ejemplo: tomamos la siguiente proposición de asignación: Posición = inicial + velocidad * 60 y se agrupa en componentes léxicos. 1. identificador (Posición). 2. símbolo de asignación (=). 3. identificador (inicial). 4. signo de suma (+). 5. identificador (velocidad). 6. signo de multiplicación (*). 7. numero (60). 2. Análisis jerárquico: (realizado por el parser) también conocido como sintáctico, es en éste donde se toman los componentes léxicos y se unen en frases gramaticales, las cuales serán utilizadas por el compilador para posteriormente d a r u n a salida.
26
Nota 1: finalmente quien interpreta el árbol sintáctico creado por la interacción entre el parser y el lexer, es la maquina virtual, la cual es la que finalmente calcula y arroja los resultados. Nota 2: la información extraída de la cadena de caracteres ingresada, siempre será manejada como caracteres, solo será manejada como numérico, al ser procesada la información en la maquina virtual. Reglas recursivas para construir un árbol sintáctico
Para poder pasar de una expresión a una árbol sintáctico debemos tener en cuenta las siguientes reglas de recursividad: - Cualquier identificador es una expresión. - Cualquier número es una expresión. - Si expresion_a y expresion_b son expresiones, entonces también lo son: expresion_a + expresion_b expresion_a * expresion_b (expresion_a) - Si identificador_a es identificador y expresion_a es expresión, entonces: identificador_a = identificador_a es proposición. - Si expresion_a es expresión y porposicion_a es proposición, entonces: While(expresion_a)do proposición_a
Ejemplo: ¿cómo debería recorrer el compilador una expresión del tipo: «1+2*3», formando el árbol con la gramática antes vista?
If(expresion_a)then proposición_a Son proposiciones. Gramática para el análisis de expresiones recursivo por la izquierda.
Para formar un árbol sintáctico a partir de una expresión utilizaremos un algoritmo recursivo por la izquierda, donde iremos analizando la expresión de inicio a fin y luego nos devolveremos armando nuestro bytecode de fin a inicio (recursividad). El siguiente algoritmo, muestra como debería ser el recorrido por las expresiones mediante nuestro compilador, este algoritmo se recorre de manera recursiva enfocado a comenzar el análisis de la expresión por la izquierda y en este artículo será la base para nuestro compilador. 1. Declaraciones à EOI //end off input; 2. | expresion; declaraciones 3. Expresion à termino expresion’ 4. Expresion’ à + termino expresion’ //carácter suma 5. | fin 6. Termino à factor termino’ 7. Termino’ à * factor termino’ //carácter producto 8. | fin 9. Factor à numero 10. | (expresión) //paréntesis
27
Nota: como bien sabemos el árbol se estructuraría desde el parser, pero se utilizaría el lexer en los lugares donde se detectan números y símbolos (+,-,*,/,entre otros).
¿Cómo debería quedar estructurado el bytecode para la expresión: «1+2*3»? El bytecode quedaría estructurado de la forma anterior donde los números del 0 al 8 son las posiciones en el bytecode y la palabra push se utiliza para que en el momento en el cual la maquina virtual comience a procesar dicho bytecode; sepa que los valores de la posición 1, 3, y 5 los debe poner en el stack, y la palabra prt se utiliza para que la maquina virtual muestre el valor que se encuentra almacenado en la cima del stack, en el momento en el cual encuentra la misma. ¿Cómo debería procesar la maquina virtual el bytecode anterior para la expresión: «1+2*3»? Primero debemos tener en cuenta que cuando se encuentra la palabra push, el compilador pone el valor siguiente del bytecode en el stack. Cuando encuentra la palabra multiplicación, debe tomar los valores de la cima y el anterior del stack, quitarlos e insertar el resultado de la multiplicación en la cima de dicho stack (de manera igual ocurre con la suma y demás operaciones matemáticas).Finalmente cuando encuentra la palabra prt toma el valor de la cima y lo muestra por pantalla.
Programación
¿Por donde debemos comenzar? Lo primero que necesitamos para comenzar a programar es entender bien como se forma el árbol a partir del algoritmo antes descrito, además debemos tener bien claro que hace quien, es decir: debemos tener bien claro que con el lexer lo que queremos es identificar cada uno de los elementos que conforman esa cadena de caracteres (código fuente de nuestro lenguaje, ej: «1+2*3») que fue ingresada para que nuestro compilador la ejecute, el parser es quien basado en los resultados del lexer construye el árbol y lo almacena en un array llamado bytecode, tal cual cómo va a ser ejecutado más tarde por la maquina virtual, la cual almacena dichos resultados en el stack. El flujo del programa debería seguir más o menos los siguientes pasos: 1. Leer línea de código (desde el parser o el lexer). 2. Realizar la estructuración del bytecode desde el parser, utilizando el lexer, para la detección de simbolos o cadenas en el instante que sea necesario (como fue visto en el ejemplo anterior). 3. Se invoca la maquina virtual enviándole el bytecode. 4. Desde la maquina virtual se procesa el bytecode detectando lo que en cada posición se indica y almacenando en el stack el resultado de cada operación. 5. Fin. Código
En este apartado vamos a mostrar cómo se debería realizar dicho compilador, haciendo un análisis en toda la estructura del mismo, y siendo consecuentes con lo que se mencionó anteriormente. En este apartado vamos a ver cómo realizar un compilador para sentencias con números enteros y operaciones básicas tales como suma, resta, mul28
tiplicación y división, posteriormente daremos las indicaciones pertinentes para que el lector agregue a dicha estructura tanto operadores relacionales como lógicos. Dicha estructura puede ser modificada conforme el lector lo desee. Pasando de la teoría a la práctica, he decido crear cuatro clases para nuestro cometido; una llamada compilador, para colocar constantes comunes que pueden ser requeridas por las demás clases, además de otras 3 clases de las cuales ya hemos hablado (lexer, parser y virtualmachine). Compilador
En esta definimos como constantes, las palabras claves que utilizaremos en diferentes clases, básicamente las que utilizaremos en nuestro bytecode y para procesar luego en la virtualmachine.
Lexer
En esta clase analizaremos la información que el compilador exija mediante un método llamado lexer.
Parser
Creamos la clase parser, y la preparamos para la lectura de nuestras líneas de código.
Ahora vamos a realizar el seguimiento al método correr, mediante la cual iniciamos el recorrido por el código de nuestro compilador, el cual, al finalizar dará como resultado el bytecode con la estructura de árbol que necesitamos. Desde el método correr podemos ver como se crea la estructura que antes buscábamos, es decir: la estructura que se sugiere en el algoritmo recursivo por la izquierda.
Después de recorrer las funciones antes descritas, tendremos como resultado de dicho trabajo el bytecode, con toda la estructura que debería interpretar nuestra maquina virtual. Virtual machine: En esta nos encargaremos de analizar lo valores que tenemos en el bytecode y procesarlos como sea debido. 29
Nota: de manera similar se implementa la resta, la multiplicación y la división. Ejercicio: para implementar los operadores relacionales y los operadores lógicos, hay que tener en cuenta que los operadores relacionales tienen mayor importancia que los operadores lógicos. Ahora: primero se deben reconocer en el lexer, los elementos necesarios para dichos operadores, es decir (&&,||,~,>,<,>=,<=,==, !=), luego en el parser debemos agregar las funciones necesarias, es decir: en la función correr se debe llamar primero a operadores lógicos y desde operadores lógicos a operadores relacionales (ya saben, por eso de la importancia precedencia), además en la clase compilador debemos agregar las constantes relacionadas con los operadores que vamos a incluir y finalmente se debe modificar la virtualmachine para que pueda procesar dichos elementos. Nota: el código fuente tanto de lo expuesto en este artículo como del ejercicio lo pueden encontrar adjunto a este documento y/o en http://lordjackob.blogspot.com/. Saludos.
HARDENING Nickname: Dinosaurio Nombre: Jhon Jairo Hernández E-mail:
[email protected] Para la Comunidad Dragonjar.org Un cordial saludo para todos los Dragonautas y lectores de este segundo número de la E-Zine. Una vez superada la prueba de fuego de tan noble causa, rescatada por algunos buenos usuarios de la Comunidad DragonJAR en el lanzamiento del primer número. Y aunque sus gestores han querido darle la titularización de versión beta, creo que este fue una suma de fuerzas, voluntades y experiencias con un producto maravilloso, por que permitió abrir un espacio de esparcimiento y opinión en la comunidad. Espacio que impulsa nuevamente un segundo número, para lograr un producto de alta calidad o por lo menos de buen contenido. En esta oportunidad, me han invitado a escribir un artículo y participar de dicha edición, lo cual me hace sentir honrado y orgulloso del buen trabajo y desempeño de este equipo, tanto en el desarrollo, edición y diseño de la misma. Siendo sincero………. No sabía que escribir para entregar un buen contenido temático que permitiera cautivar la atención del lector y para tal fin consideré varios temas interesantes, que fueran de nivel o altura al contenido que buscan los lectores hoy en día. Analizando sobre lo que sería bueno tratar y entregar como un verdadero valor agregado para la suma de conocimiento de los lectores de este número de la E-zine, decidí tomar un tema que viene resonando de gran popularidad y aplicabilidad en el mundo informático y especialmente en el proceso de aseguramiento de las plataformas de Sistemas. Sin más preámbulo, por que de seguro ya visualizo a mis amigos con gestos de impaciencia sobre de mis largos textos con un pensamiento profundo... «¿Con qué nos saldrá Dino ahora?». Aclaro desde un comienzo, que el tema a tratar, 30
no es abarcado de la manera más profunda como quisiera, esto debido a mi escaso conocimiento. Además que no quiero que se me queme la neurona. Es el tema de HARDENING, solo espero que les guste, lo hice con cariño y aprecio para todos. Erase una vez en un pueblo muy lejano…………………………………. Recuerdo de una mañana como cualquier inicio de jornada laboral, de mis primeras acciones dentro de lo que tengo programado fue la de sentarme a mi computador y conectarme a la Red a revisar mis correos y de paso revisar foros de los cuales participo e iniciar mi plan de trabajo. Oh! Sorpresa que me llevo, cuando en mi MSN aparecía una ventana en la cual desplegaba un mensaje de un experto en seguridad ( del cual le profeso un gran respeto y admiración!) , susodicho individuo (ya parezco policía con estos términos ) que en el momento llevaba a cabo un proceso de aseguramiento de plataformas que hacían parte del plan de continuidad del negocio que debía ejecutar con servidores y dispositivos de Checkpoint, su FireWall debía ser afinado e integrado para tal fin, y se encontraba en el dilema de realizar la actualización de la versión del NOS del Firewall, en esta labor tenía inconvenientes con el Update de la actualización de su versión de Linux, debido a que no había una versión más actualizada, después de intercambiar mensajes tratando de colaborar con su labor, le perdí el rastro en esa mañana. Al día siguiente nuevamente nos encontramos en el MSN y su respuesta para la finalización del proceso que había realizado fue «REALICE UN PROCESO DE HARDENING DE TODA LA PLATAFORMA». Creo que fue el momento en que me dije a mi Mismo MI MISMO: No es solo un término más o frase de un Tecnicista, es realmente una buena práctica de Seguridad, de la cual debo conocer un poco más………
amenazas y hacerle la vida más difícil al atacante» HARDENING!!!. Ahora continuemos contándoles un poco del proPara su definición técnica tomare la expresada ceso de Hardening!. por dos expertos: Que actividades debemos desarrollar para aseEscrito por el evangelista seguridad Roberta Bra- gurar nuestros Sistemas: gg «Adoptar un enfoque proactivo para la seguridad Actividades de la red por el endurecimiento de Windows de I) Los procesos de arranque (del bootstrapping los sistemas contra los ataques antes de que ocu- del sistema) rran.» II) Los servicios o demonios que se ejecuten en Por Luis Montenegro, Windows y Security MVP el inicio y apagado del sistema 2007 III) Aseguramiento de Sistemas de archivos «Haciéndole la vida difícil al atacante. Ese es el (comúnmente denominados File System en *NIX y concepto que está detrás del Hardening de sistemas volúmenes en Netware - Novell) operativos. Hardening es una acción compuesta IV) Uso de opciones de límites y forzar cuentas por un conjunto de actividades que son llevadas a de usuario cabo por el administrador de un sistema operativo V) Políticas del sistema, filtrados y Acls para reforzar al máximo posible la seguridad de su VI) Protección a ataques físicos o de Hardware equipo. (Seguridad Física) Su propósito, entorpecer la labor del atacante y gaVII) Actualización de Firmware, BIOS, Softpaq, nar tiempo para poder minimizar las consecuencias contraseñas de arranque de los equipos, desactide un inminente incidente de seguridad e incluso, vación de unidades externas en servidores como en algunos casos, evitar que éste se concrete en pen drive o memorias USB, disqueteras, unidades su totalidad.» de Cd/DvD, opticas. Y no podía faltar la de Wikipedia (Que de seguro VIII) Protección y renombre de cuentas ya la están buscando!!!) de Administración y deshabilitar o invalidar cuentas «En computación, el endurecimiento suele ser estándares, invitado, uso de cuentas limitadas. el proceso de asegurar un sistema. Esta labor es IX) Restricción de Instalación de Software y especialmente hecha para proteger los sistemas Hardware de acuerdo a las políticas de seguridad. contra los atacantes. Esto suele incluir la eliminación X) Habilitar los sistemas de Auditorias y Monitode nombres de usuario o innecesarios de acceso y reo de logs. la inhabilitación o supresión de los servicios inneXI) Asegurar consolas de administración, pantacesarios. llas de logeo, terminales virtuales y accesos remotos. Existen diversos métodos de endurecimiento de XII) Políticas y procedimientos de administración los sistemas Unix y Linux. Esto puede implicar, de cuentas de usuario, grupos, TCBS (Truste Base entre otras medidas, la aplicación de un parche Computing), módulos de autenticación agregables para el kernel como Exec Shield o PaX; cierre de y relaciones de confianza. los puertos de red abierta, y el establecimiento de XIII) Administración de paquetes de instalación, sistemas de detección de intrusiones, cortafuegos parches (Patchs), upgrades, updates, módulos y sistemas de prevención de intrusiones. También instalables, integridad de archivos y permisos en el hay endurecimiento guiones y herramientas como sistema. Bastille Linux y Apache / PHP Hardener que puede, XIV) Aseguramiento de las Herramientas de Depor ejemplo, desactivar características innecesarios sarrollo y compiladores. en los archivos de configuración o realizar varias XV) Aseguramiento de Núcleos (Kernel) del sisotras medidas de protección. « tema. Para mí: XVI) Instalación y afinación de Firewalls, Kits de «Es simplemente el proceso de afinación del per- Seguridad (Antivirus, antispyware, antimalware, formance y aplicación de las características de un anti hackers, anti banners) Sistemas de Detección producto en un 110% para disminuir los vectores de de Intrusos y Sensores como IDS, IPS, HIDS, 31
NIDS. XVII) Uso de Herramientas para Pen-Testing y Monitoreo. XVIII) Configuración de Protocolos, Puertos y Servicios (Solo los necesarios). XIX) Implementación de esquemas de seguridad, DMZ, Front End / Back End, Router apantallados, proxys, Firewalls. XX) Políticas de Procedimientos de Respaldo y de Disaster Recovery. Dadas a conocer estas actividades pasaré a explicar las dos primeras actividades(actividad I y actividad II) con uno de los sistemas operativos populares de gran estabilidad y acelerado crecimiento, al que le están apostando grandes como IBM, HP, Novell, Oracle, etc. El del maravilloso mundo del pingüino. El fabuloso Linux. Limitaremos el alcance de este artículo a los dos primeros puntos, debido a que es un tema muy extenso, que tiene mucha tela por cortar y esta E-zine no daría abasto para cubrirlo, por lo tanto ruego excusas al no entregar en detalle las demás actividades, por lo expuesto anteriormente. Actividad I Los procesos de arranque (del bootstrapping del sistema). Debemos asegurar los procesos de arranque del sistema, con la finalidad de limitar la intervención o intrusión del os usuarios, evitando la injection de software o escalada de privilegios en nuestro boot, el cual actúa como un prompt mas del sistema indicándonos que el sistema está listo para cargar, en el cual podemos pasar parámetros u órdenes que alteren el funcionamiento y estabilidad de nuestro sistema operativo. Ej.: Si quisiéramos cargar un SO en LiLo (Linux Loader) solo tendríamos que presionar la tecla [TAB] en el prompt de LiLO y nos mostrara las etiquetas de los sistemas que podemos iniciar o simplemente la tecla [SHIFT] Podemos evitar situaciones como estas: Pasar a modo mono usuario o de mantenimiento Linux single Ó Linux –b
Permitirá a un usuario iniciar en modo de mante32
nimiento con un /sbin/sulogin La opción: init=/bin/sh
Permiten obtener una Shell de root, como también pueden iniciarse desde un disquete. Y bastaría con remontar nuestros discos en modo de rw y voala! Nuestra seguridad totalmente comprometida. Que vaina no!!. Por lo tanto es recomendable cambiar algunas opciones de nuestros archivos de configuración dependiendo de nuestro, cargador LilO, Grub o LoadLin. Tales como: prompt timeout=50 default=linux boot=/dev/hda map=/boot/map install=/boot/boot.b message=/boot/message linear
# permite especificar una contraseña que se debe introducir antes de que el sistema arranque password=secretpassword #Exigirá la contraseña si se entra un parámetro como single restricted Si se desea aplicar la restricción con alguna imagen del kernel se puede usar, esta aplica cada vez que se desee arrancar con esta imagen: image=/boot/vmlinuz-2.6.XX-XX label=linux initrd=/boot/initrd-2.6.XX-XX.img read-only append=»root=LABEL=/»
Recuerden que para que los cambios sean actualizados en su lilo, deben ejecutar # /sbin/lilo
Esta contraseña se añade en Lilo.conf en texto claro, por lo tanto se deben aplicar los permisos adecuados para que sólo con los privilegios de root pueda verse la contraseña. # chown root:root /etc/lilo.conf # chmod 0600 /etc/lilo.conf
También es recomendable no mantener muchas versiones del kernel, en general solo mantener la ultima y la actual con la finalidad de no dejar a disposición tantos kernel como le sea posible cargar en una sesión del sistema. Por favor no olvidemos
activar las máximos niveles de seguridad que tengamos a disposición, como habilitar password de BIOS o de lectura con dispositivos Biometricos , Smart Card y deshabilitar el arranque por unidades externas como disquetes, Unidades Opticas de Cd o DvD, USB, BOX HD USB, etc. Al igual que LiLo, su hermanito Grub también sufre de problemas de seguridad y permite que se le pasen parámetros y sean ejecutados, por lo tanto debemos de asegurar con una contraseña encriptado en MD5 la cual no permite que sea solo con una leída al archivo /etc/grub.conf. Veamos: # grub grub> md5crypt Password: ******** Encrypted: $1$2FXKzQ0$I6k7iy22wB27CrkzdVPe70 grub> quit
Ejecutamos el Shell de Grub y posteriorment md5crypt, luego el password y este genera un hash de md5 y este es introducido en el archivo de configuración del grub /etc/grub.conf default=1 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz password —md5 $1$2FXKzQ0$I6k7iy22wB27CrkzdVPe70 title Red Hat Linux (2.6.7) root (hd0,0) kernel /vmlinuz-2.6.7 ro root=LABEL=/ initrd /initrd-2.6.7.img
Esto nos evitara enormes dolores de cabeza, ya que al reiniciar la maquina y se desea introducir un parámetro, este nos exigirá que entremos su password (Obligatoriamente por haber añadido la línea del password —md5 $1$2FXKzQ0$I6k7iy22wB27CrkzdVPe70).
Si desea añadirle un menú a Grub, para que sea mostrado después del password, solo cambiemos la línea del password –md5 por esta: password —md5 $1$2FXKzQ0$I6k7iy22wB27CrkzdVPe70 /boot/grub/ administrator-menu.lst
Al igual que Lilo podemos también proteger una imagen con Grub: default=1 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz password —md5 $1$2FXKzQ0$I6k7iy22wB27CrkzdVPe70 title Red Hat Linux (2.6.7) lock root (hd0,0)
33
kernel /vmlinuz-2.6.7 ro root=LABEL=/ initrd /initrd-2.6.7.img
Recuerden que este debe quedar con los permisos apropiados: # chown root:root /etc/grub.conf # chmod 0600 /etc/grub.conf
Para Grub (/boot/grub/grub/conf ) existen parámetros importantes como: Hiddenmenu default 0 password
Es recomendable cambiar los niveles de ejecución run-level, forzando a que se requiera el password del root cuando se entre en estado de mantenimiento o monousuario, cambiando el archivo /etc/inittab asi: s:S:respawn:/sbin/sulogin to /etc/inittab De igual forma en este archivo evitemos que el sistema sea reiniciado pr+n esionando las comunes teclas CTRL-ALT-DEL antecediéndole un signo de comentario # #ca::ctrlaltdel:/sbin/shutdown -t5 -rf now
Como ven son algunas reglas básicas de Hardening en Linux, les reitero que esto es en la medida que una persona tenga acceso físico a la maquina y pueda ser manipulada, debe tenerse mucho cuidado con los accesos remotos que se realicen a la maquina si es que cumple este rol, puesto que puede afectar nuestro arranque remoto o soporte remoto si es que lo utilizamos. Actividad II Los servicios o demonios que se ejecuten en el inicio y apagado del sistema Si, así como se indica en su titulo, llana y sencillamente es deshabilitar aquellos servicios que no van a tener uso, para disminuir los vectores de ataques, las amenazas cerrando las brechas del atacante. Revisemos minuciosamente en: /Etc/inittab El archivo inittab es una tabla que le permite al sistema indicar de manera ordenada como debe arrancar. El formato utilizado por este archivo es el siguiente: servicename:runlevels:label:command -option –option sysacc:235:acct:/usr/sbin/acct -q -d ~~:S:wait:/sbin/sulogin
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
Veamos esto un poco más en detalle: id: identificador de cada secuencia con una entrada
de 4 caracteres máximo. Nivel-de-Ejecucion: Indica el nivel de corrida en que va a efectuarse la acción indicada acción: Indica qué acción se llevará a cabo proceso: Indica el proceso a ejecutar. En *nix toda acción genera al menos 1 proceso. Cabe anotar que en las últimas versiones de Ubuntu este fue reemplazado por el «upstart» y los niveles son controlados con los archivos en / etc/event.d. Boot scripts in /etc/init.d Servicios tales como: Service Description Remove? anacron A variation on the cron tool Yes apmd Advanced Power Management Yes atd Daemon to the at scheduling tool Yes autofs Automount Yes crond The cron daemon No
34
cups Printing functions Yes functions Shell-script functions for init scripts No gpm Mouse support for text applications Yes irda IrDA support Yes (unless you have IrDA devices) isdn ISDN support Yes (unless you use ISDN) keytable Keyboard mapping No kudzu Hardware probing Yes lpd Printing daemon Yes netfs Mounts network file systems Yes nfs NFS services Yes nfs lock NFS locking services Yes ntpd Network Time Protocol daemon No pcmcia PCMCIA support Yes portmap RPC connection support Yes random Snapshots the random state No rawdevices Assigns raw devices to block devices Yes rhnsd Red Hat Network daemon Yes snmpd Simple Network Management Protocol Yes (SNMP) support Snmtptrap SNMP Trap daemon Yes Sshd Secure Shell (SSH) daemon No winbind Samba support Yes xfs X Font Server Yes ypbind NIS/YP client support Yes
¿Cuáles deshabilitar? Solo a criterio de su implementación active o desactive el servicio que requiera, en realidad hay servicios que no se usan y quedan activos dejando una vulnerabilidad latente, si no va a usar Samba, para que activar Winbind, servicios como apmd poco son usados en servidores en ambientes de producción a diferencia del uso en equipos móviles como portátiles en donde la administración de la energía juega un papel importante, igualmente si utilizo lpd solamente para que dejar activo cups o lpr. Para parar dichos servicios puede usar la utilidad de administración de cada Distro, tales como Yast en SuSE, Yum en Fedora, Scoadmin en SCO Unix, Smit en AIX, de igual forma utilizar líneas de comando como #chkconfig ó #update-rc.d. Para ver la lista con chkconfig: # chkconfig —list Kdcrotate 0:off 1:off 2:off 3:off 4:off 5:off 6:off ntpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off courier-imap 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Nos indica: El Servicio Nivel del Servicio:Y si esta en off/on Para parar el servicio:
# chkconfig —del
nombre-del-servicio
Para iniciar el servicio: # chkconfig –add
nombre-del-servicio
Después de eliminado los servicios, si estos no van a ser utilizados posteriormente, podemos entrar a borrarlos de /etc /rc.d/init.d Y no olvidar verificar la permisividad de los archivos nuevamente: # chown root:root /etc/rc.d/init.d/* # chmod -R 700 /etc/rc.d/init.d/*
The inetd/xinetd daemons Comúnmente llamado los Demonios maestros, Como anécdota recuerdo el día que le comente al Gerente de Sistemas de una Compañía (Empresa) en la cual laboraba con el cargo de Administrador del Sistema, teniendo a mi cargo tres (3) servidores *NIX y unos 100 usuarios, plataforma conectada en Modo Multiusuario y de Red, pero volvamos a lo que quiero comentar porque ya me disperse con esta anécdota. Gerente de Sistemas: JJH Necesitamos que se efectué el Backup Diario a Medio día y realice verificación de la integridad de Datos, debe ser automático!. Por favor Investigue de que manera podemos armar un Shell Script y automatice la tarea. Administrador del Sistema (JJH) Eso se puede hacer utilizando los Demonios (Daemons) del Crontab y At, automatizamos el Shell para que se programen las tareas de Respaldos de Seguridad (BackUp) y realizamos las pruebas. Gerente de Sistemas: ¿Cómo así? Y a Ud. ¿Quien le dijo que eso se llama así? Administrador del Sistema (JJH) Pensé entre mí: «Ah kab*** piensa que por que ha hecho más cursos y especializaciones que uno, tiene que sabérselas todas! Uffff» Y le dije: Pues es la traducción que hago de los Manuales del Sistema Unix (Era poco de los buenos soportes que se encontraban en esa época año 1994 y podíamos consultar. 35
Internet aun no tomaba auge!!) Gerente de Sistemas: ¿Cómo así? No señor averigüé bien como se llama esa vaina, hágala y documéntela. Administrador del Sistema: Me dije a Mi mismo Si el Mismo: Ahora la hago y lo dejo como el ternero (Ya sabrán cómo, no sean mal pensados) con las ganas de mam*** perdón de chuparme como vampiro el conocimiento por que lo hago y no le muestro los resultados para que se dé cuenta que el Habito no hace al Monje!. Bueno pero sigamos con el Hardening porque después de esa anécdota y experiencia de vida ya deben estar llorando y enviándome mis condolencias!! Continúo con los Demonios Maestros, para los Neófitos como YO, debemos entender un Demonio como un proceso que se ejecuta en Background (en segundo plano) con la finalidad de iniciar las solicitudes de conexión que llegan al servidor y son asignados un puerto de Conexión por ejemplo: ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd # # Shell, login, exec, comsat and talk are BSD protocols. # shell stream tcp nowait root /usr/sbin/tcpd in.rshd login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #comsat dgram udp wait root /usr/sbin/tcpd in.comsat talk dgram udp wait nobody.tty /usr/sbin/tcpd in.talkd
Sera que servicios como telnet o rlogin abiertos me servirán de mucho??? Solo juzguen Uds. Que hay disponible aquí (para quien no entienda solo escribir en google vulnerabilidades de telnet o rlogin) De ahí nace una versión en algunas Distros denominada Xinetd su objetivo primordial es mejorar el uso de los servicios en los controles de acceso y contrarrestar DOS (Denial Of Service), en fin mejorar la administración de los servicios. Un vistazo a su archivo de configuración service nntp { socket_type = stream protocol = tcp wait = no user = news group = news server = /usr/bin/env
server_args = POSTING_OK=1 PATH=/usr/sbin/:/usr/ bin:/sbin/:/bin +/usr/sbin/snntpd logger -p news.info bind = 127.0.0.1 }
de instalación y remoción de software para eliminar el demonio. No olviden realizar un test de los servicios con un #ps –a
Continuemos…. La idea es revisar los servicios que se inician en este demonio y desactivar aquellos que impliquen un riesgo inminente por su activación y no uso dentro del Sistema Operativo, aumentando el riesgo y alternativas de ataque. «Como quien dice que lo que no se usa se atrofia o lo que no sirve estorba» Si no vamos a hacer uso de estos servicios, tampoco los ofrezcamos para ampliar los vectores de ataques. Solo adiciona a la línea un # y esta quedara como comentario:
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #login stream tcp nowait root /usr/sbin/tcpd in.rlogind
La recomendación apropiada es desactivar los demonios de inetd/Xinetd y lanzar los servicios que se necesitan con scripts hechos a la medida. Verifiquemos si el demonio esta en ejecución: $ ps -A | grep ‘xinetd\|inetd’ 2106 ? 00:00:00 xinetd Luego paramos el proceso: $ /etc/rc.d/init.d/xinetd stop
Y nuevamente nuestro amigo chkconfig nos dará la mano: $ chkconfig —del xinetd
NOTA: Ya sabrán para que se ejecuta, si no con el dolor del alma a devolverse unas líneas atrás y leer nuevamente para que es esta vaina, porque MIguelito =YO, no lo repetiré! Para culminar nuestra labor con los archivos de configuración del Demonio: # rm -f /etc/rc.d/init.d/xinetd # rm -f /etc/xinetd/conf # rm -f /etc/xinetd.d
Y reinicie nuevamente su Sistema: #Shutdown –r now
NOTA: También pueden utilizar las herramientas 36
Ó #netstat
–a
TCP wrappers
¿Qué cosa tan rara es esta? Expliquemos entonces; los TCPwrappers permiten controlar el acceso y los servicios de red para diagnosticar los problemas y aplicar el correctivo necesario. Vienen del maravilloso mundo de *NIX, nacen de la necesidad de modificar el comportamiento del Sistema operativo sin tener que modificar su funcionamiento. Bueno lo voy a explicar con plastilina con base en la redacción anterior sobre inetd( si no recuerdas vas a tener que devolverte a este punto inetd/xinetd) Vamos con la Analogía Muchas personas van a nuestra oficina a buscarnos para diversos asuntos, en la puerta de nuestro edificio se encuentra un señor muy colaborador, altamente servicial diría YO (que a veces se creen dueños de los Edificios o Empresas) comúnmente llamado vigilante o portero. Este señor permite la entrada y flujo de personas en nuestra Empresa indicando donde quedan nuestras oficinas, una vez ingresa la persona que te busca por X ó Y motivos (posiblemente por esa platica que no le has pagado!!) y se encuentra con la recepcionista o secretaria de tu oficina, la cual discreta y diplomáticamente nos avisara quien llego y como no tienes los $$$ para pagar, el paso siguiente será la negación, labor que se la encomendamos a nuestra secretaria para que finiquite la visita no deseada. Ah vieron!!! que fácil era entenderlo, ahora un poco mas informático o Geeks como les gusta a Uds. El mismo ejemplo Desde nuestro computador enviamos un correo por medio de un cliente de correo como Outlook, Eudora, etc. La cual realizara una conexión por el puerto 110 al servidor, una conexión POP. Este a su vez jugando un papel importante nuestro amigo (El señor Portero) inetd (espero que lo hayan leído), le dirá al Servidor que servicio debe utilizarse y responder a las conexiones que demonio y que
puerto debe responder. Entonces es aquí en donde entra en acción nuestro gran aliado el señor TCP Wrapper (Secretaria) Filtrando los paquetes IP, que conexiones puedan ser aceptadas o rechazadas dependiendo de su identidad y origen. ¡!!Hombre creo que más claro que lo que canta un gallo no se puede. Como les dije con plastilina! A continuación solo descárgalo de aquí: ftp://ftp.porcupine.org/pub/security/tcp_ wrappers_7.6.tar.gz Lo descomprimes, #gunzip -c tcp_wrappers_7.6.tar.gz | tar xf ó # gunzip tcp_wrappers_7.6.tar.gz ó # tar xvf tcp_wrappers_7.6.t
Luego: #make linux
Su resultado dejando como resultado cinco binarios ? tcpd. Es el demonio del TCP-Wrappers. ? tcpdmatch. Predice como el tcpd manejaría una petición en específico. ? tcpdchk. Verifica las reglas de control de acceso contenidas en los archivos /etc/hosts.allow y /etc/ hosts.deny. ? safe-finger. Versión de finger para implementar el finger reversivo. ? try-from. Programa que permite probar si el sistema es capaz de reconocer qué máquina la esta contactando Copiar los archivos al directorio donde se encuentran los demonios de los servicios de o /usr/sbin
2106 ? 00:00:00 xinetd # kill -HUP 2106
Firewalls
Nuevamente teniendo en cuenta el lector, vamos a describir que es un Firewall para los Newbies como YO. Sigo…. Un Firewall (FW) es un componente de Hardware (generalmente Appliance) o de Software que permite filtrar el trafico entre Internet , Extranet con la Intranet o red Empresarial. La analogía más practica: Es el muro que se crea para evitar el paso de fuego entre diferentes Bodegas para evitar la expansión del fuego y este no sea más perjudicial. Así como ese muro impide la propagación del fuego para evitar mas tragedias, el FW en computación evita que los males de Internet (Dialers, DoS, Virus, Troyanos, Hijackers, Malware, Spyware, Accesos no autorizados, etc) y del Exterior afecte nuestra plataforma informática. Si desean mas información los invito a leer RFC 2979 Para terminar este definición, hablemos de los
#mv tcpd tcpdmatch tcpdchk try_from safe_finger /usr/sbin
Modificar el #vim /etc/inetd.conf Y aquí modificar todos los servicios que deseamos proteger por tcpd. Asi: pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d imap stream tcp nowait root /usr/sbin/tcpd imapd Y #vim /etc/syslog.conf
En donde agregaremos la siguiente línea local0.info /usr/local/adm/tcpd.log
Para mantener un log de las conexiones hechas por tcpd Este archivo de registro lo podemos crear con touch. #touch /usr/local/adm/tcpd.log
El demonio debe ser reiniciado, pararlo y reiniciarlo, como explique anteriormente. O también con: $ ps -A | grep ‘xinetd\|inetd’
37
distintos tipos de FW, para esto voy a citar a uno de los que más saben en Internet , el señor Wikipedia ( Y eso que es relativamente nuevo, pero sabeeeeeee) : Tipos de cortafuegos Cortafuegos de capa de red o de filtrado de paquetes. Funciona a nivel de red (nivel 3) de la pila de protocolos (TCP/IP) como filtro de paquetes IP. A este nivel se pueden realizar filtros según los distintos campos de los paquetes IP: dirección IP origen, dirección IP destino. A menudo en este tipo de cortafuegos se permiten filtrados según campos de
nivel de transporte (nivel 4) como el puerto origen y destino, o a nivel de enlace de datos (nivel 2) como la dirección MAC. Cortafuegos de capa de aplicación Trabaja en el nivel de aplicación (nivel 7) de manera que los filtrados se pueden adaptar a características propias de los protocolos de este nivel. Por ejemplo, si se trata de tráfico HTTP se pueden realizar filtrados según la URL a la que se está intentando acceder. Un cortafuegos a nivel 7 de tráfico HTTP, es normalmente denominado Proxy y permite que los computadores de una organización entren a internet de una forma controlada. Cortafuegos personales Es un caso particular de cortafuegos que se instala como software en un computador, filtrando las comunicaciones entre dicho computador y el resto de la red y viceversa
Pero tengamos en cuenta que no es la Panacea, es solo un elemento del esquema de seguridad. Para visualizar, veamos el Modelo de Defensa en Profundidad: En resumen nunca dependamos de un solo elemento, en lo posible implementar un modelo de capas de seguridad como el anterior. Si deseas un poco más de info de los FW, te invito a leer: http://www.ietf.org/rfc/rfc2979.txtComparativas de firewalls personales Pero veamos el Hardening a los FW Los FW Pueden constituirse como la primera línea de defensa en su red, generalmente se ubican sobre un servidor de seguridad, son amenudo basados en Hardware con dispositivos de Checkpoint, Cisco, SonicWall, SmootWall,etc. Complementandolos 38
con FW de Hosts como son iptables, Keyros, Zona Alarm, en algunas circunstancias se aprovecha la integración de productos como ISA SERVER de Windows 2K. Encontramos un sin número de soluciones, entre las cuales en Linux IPTABLES / IPCHAINS o interfaces de la misma 1) Kmyfirewall. 2) Easy Firewall Generator. 3) Firewall Builder. 4) Shorewall. 5) Guarddog. 6) FireStarter. 7) Smoothwall. 8) IPCop. Para el ejemplo vamos a trabajar con NetFilter, sin más rodeos: Para añadir una regla: # iptables -A INPUT -i eth0 -p tcp —dport 80 -d
192.168.0.1 -j ACCEPT
-A Adiciona una regla -i Específica la Interface de Red que va a utilizar para aplicar la regla -p Especifica que va a filtrar paquetes TCP (Si va a utilizar paquetes UDP o ICMP debe especificarlo). De igual forma podría especificar el protocolo por el numero, como el 50 para la autenticación con IPSEC. —dport Indica el puerto, en este caso el 80 para el tráfico en la Web (HTTP) -d Solo los paquetes que van para esta dirección (en nuestro caso 192.168.0.1 -j Nos indica la acción a tomar en este caso es un ACCEPT (acepta solo si cumple la condición el paquete) Se pueden aplicar otras condiciones como: # iptables -A INPUT -i eth0 -p tcp —dport 80 -d 192.168.0.1 -j DROP
En este caso si el paquete cumple la condición será Dropped (desechado) Para añadir en un tráfico seguro: # iptables -A INPUT -i eth0 -p tcp —dport 443 -d 192.168.0.1 -j ACCEPT
Solo repasemos el significado de los flags (banderas/opciones) anteriores con un puerto https. # iptables -A OUTPUT -o eth0 -p tcp —sport http -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp —sport https -j ACCEPT
Aquí, estamos creando una regla para ambos http
y https para permitir el tráfico de los hosts pero no se permitirá que el Servidor Web devuelva tráfico a los hosts (de salida). Se tendrían que crear reglas adecudadas para el buen funcionamiento del Servidor Web en el trafico de salida. Una observación en esta regla, utilizamos –sport para indicar los dos puertos http y https. Si no estás seguro que puertos tienes asignados puedes consultar el archivo: #less /etc/services # # Network services, Internet style # # Note that it is presently the policy of IANA to assign a single well-known # port number for both TCP and UDP; hence, most entries here have two entries # even if the protocol doesn’t support UDP operations. # Updated from RFC 1340, «Assigned Numbers» (July 1992). Not all ports # are included, only the more common ones. # # from: @(#)services 5.8 (Berkeley) 5/9/91 # $Id: services.txt,v 1.1.1.1 2002-08-19 13:34:26 blueflux Exp $ tcpmux 1/tcp # TCP port service multiplexer echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote msp 18/tcp # message send protocol msp 18/udp # message send protocol chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp # File Transfer [Default Data] ftp-data 20/udp # File Transfer [Default Data] ftp 21/tcp # File Transfer [Control] ftp 21/udp # File Transfer [Control] ssh 22/tcp # Secure Shell Login ssh 22/udp # Secure Shell Login telnet 23/tcp telnet 23/udp # 24 - private smtp 25/tcp mail
Aunque recuerden la reserva que se debe tener sobre este archivo, como se ha explicado con los anteriores servicios. Lo más recomendable es: # chown root:root /etc/services # chmod 0644 /etc/services
archivo /proc/sys/net/ipv4/ip_local_port_range este define el puerto local que se utiliza para el tráfico TCP y UDP. El primer número es el primer puerto local para permitir el tráfico TCP y UDP en el servidor, la segunda es el último número de puerto locales Ej: «1024 4999». Una buena medida es cambiar los parámetros que tiene por defecto 32768-61000. # echo «32768 61000» >/proc/sys/net/ipv4/ip_local_port_ range
Se pueden adicionar al script /etc/rc.d/rc.local y en el archivo /etc/sysctl.conf, adicione: # Allowed local port range net.ipv4.ip_local_port_range = 32768 61000
Para indicar varias reglas: # iptables -I INPUT 1 -i eth0 -p tcp -j ACCEPT # iptables -I INPUT 2 -i eth0 -p tcp —dport 143 -j DROP
La primera permite el trafico TCP en la interface eth0 y el 1 indica que es la primera regla, la segunda filtra los paquetes TCP del puerto 143 (IMAP) y e invalida los paquetes TCP (el 2 indica que es la segunda regla). Ahora sí que dijeron, Ah! Ese Dino tan bruto ¿NO? No que va si le ponemos un poquito de sentido común, nos daremos cuenta como todo el tráfico es permitido en la primera, asi que la segunda puede ser nula, la idea es esa organizar y aplicar lógica a los reglas configuremos. Entonces si deseas listarlas: # iptables -L INPUT -n —line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp — 0.0.0.0/0 192.168.0.1 tcp dpt:80 2 ACCEPT tcp — 0.0.0.0/0 192.168.0.1 tcp dpt:443
Para remover una regla: # iptables -D INPUT -i eth0 -p tcp —dport https -d 192.168.0.1 -j ACCEPT
Borrara la regla para el https. Puede borrar por el Número de regla: # iptables -D INPUT 3
# chattr +i /etc/services
Es recomendable efectuar un mapa del trafico de la Red para saber que reglas debe crear, consulta el 39
Si desea borrarlas todas solo adicione el flag (bandera/opción) –F
# iptables -F INPUT
O también: # iptables -F # iptables -L Chain INPUT (policy DROP) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Si no se especifica el uso de una tabla, IPTABLES tomara por default la tabla filter # iptables -t nat -L Chain PREROUTING (policy DROP) target prot opt source destination Chain POSTROUTING (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Cada regla tiene un contador. Para ver estos contadores, y un total de cada cadena cuando se lista todas sus normas con -V y – L # iptables -L -v Chain INPUT (policy ACCEPT 25897 packets, 2300K bytes) pkts bytes target prot opt in out source destination
La tabla filter Construcción de reglas Iptables [tabla]
En el caso de la tabla filter: No hace falta indicar tabla (filter por defecto) Comando «A cadena «> Insertar al final «D cadena «> Borrar «R cadena num «> Reemplazar «I cadena num «> Insertar «L «> Listar «F «> Limpiar «N cadena «> Crear cadena «X «> Eliminar cadena «P «> Cambiar política Es solo un resumen de lo que es IPTABLES, la idea general es crear minimo un Firewall básico para 40
su Host, recuerden que existen más enfoques de seguridad a nivel perimetral de sus servidores, este sería el complemente en sus estaciones de trabajo (tema interesante DMZ e Iptables). Bien, creo que hasta aquí llegaremos con el artículo, este ya se hizo muy extenso, solo explicando lo básico de los dos primeras Actividades (I,II) del tema de Hardening, y como ya lo había mencionado, este espacio de conocimiento y entretenimiento no nos dará lo suficiente para tratar el tema, por lo tanto no me resta mas si no agradecer por su atención y dedicación al leer estas pocas líneas de un tema tan fascinante pero a su vez tan complejo y extenso, ojalá sirva de ayuda o al menos motive para tomar conciencia de la necesidad de aplicar buenas prácticas de seguridad. «La inseguridad no es más que el reflejo de tu Negligencia e Ignorancia, lo único seguro es que no hay nada seguro, solo mitigas el riesgo» Con cariño, Dino