2012/03/05

Scripts de seguridad: ¿Qué lenguaje elegir?


Surge una necesidad: hay que automatizar una labor para, dada una entrada, procesarla y generar unos resultados. ¿Cómo lo implemento para que sea un ordenador quien lo haga por mí? ¿Qué herramientas puedo utilizar para ello?

Dar una solución a esa necesidad es algo que, después de un rato de meditación, seréis capaces de pre-planificar mentalmente, ayudados de boli y papel si fuese necesario, plasmando el resultado en una pantalla con fondo negro. Ahora bien, ¿qué lenguaje de programación utilizaréis?

Para los lectores de Security By Default que no conozcan RootedCon, decir que es uno de los Congresos de Seguridad más importantes que se llevan a cabo en España, en el que además, este año fuimos ponentes mis compañeros Jose Antonio Guasch, Yago Jesús y el que escribe este artículo.

Entre las diferentes charlas, en las que se presentaban el resultado de investigaciones, herramientas, descubrimientos, etc,… creo que fue Juan Garrido "Silverhack" (al cual tengo en gran estima) quien indicó primeramente que para la codificación de lo que necesitaba, utilizó BATCH y Powershell; Lord Epsylon indicaba que la herramienta XSSer estaba escrita en Python; Raul Siles de Taddong hablaba de Java como lenguaje elegido; Pablo San Emeterio usaba C; y yo, Lorenzo Martínez, me decantaba por Perl y C++ para la realización y ejecución de mis scripts.

Por Twitter, y con el hashtag #rooted2012, encontraréis varias referencias y chistes sobre las preferencias de cada uno, por el lenguaje de scripting más adecuado.

Así pues, me gustaría contaros mi experiencia en los diferentes lenguajes, y cuál elegir en cada ocasión. He de distinguir entre lenguajes de programación y lenguajes de scripting. En mi opinión, un lenguaje adecuado para "scripting" es aquel que es interpretado, mientras que un lenguaje compilado se usa normalmente para el desarrollo de herramientas en los que el rendimiento es vital.  
  • ASM (80x86, Micropics 16F84) -> Si lo que se requiere es un rendimiento insuperable, cuanto más nos acerquemos a lo que "entiende" el procesador, mejor. En algunos procesadores, como los micropics 16F84, cuando los usaba en la Universidad, no había más remedio que hacerlo con el reducido juego de instrucciones soportadas en su ensamblador. Reservadlo para procesos críticos de alto rendimiento.
  • C/C++ -> Yo diría que es el lenguaje que está en el centro de gravedad entre rendimiento/sencillez de programación. Imprescindible para el desarrollo de herramientas que tengan requisitos de velocidad pero que permita entender de un vistazo, el código fuente, a casi cualquiera.
  • Pascal -> De los primeros lenguajes que aprendí en la Universidad. Más sencillo de entender, que C/C++, pero no goza de tanta popularidad.
  • JAVA -> Es un lenguaje híbrido (compilado e interpretado). Como ventaja, es multiplataforma. Como lenguaje pseudo-interpretado, es multiplataforma, aunque requiere precompilación. Como ventaja, hay una amplia comunidad de desarrolladores que ponen a disposición del mundo, librerías multipropósito.
  • Batch/Shell scripting -> Lenguaje interpretado. Dependiente del sistema operativo (Windows / *NIX) Se utilizan desde tiempo inmemorial como complemento para la realización de diferentes tareas, ejecutables por línea de comandos o de forma programada por el propio sistema operativo. Útiles para gestión de ficheros (copia, borrado, cambios de permisos y movimiento a diferentes ubicaciones), llamadas a otros ejecutables, cambios de permisos, etc,… Además provee lo necesario para estructuras condiciononales, bucles, etc,… Bajo mi punto de vista, el límite es que sólo se pueden realizar llamadas a comandos del propio sistema operativo, sin poder reutilizar módulos creados por otras personas, como sucede con otros lenguajes.      
  • Perl -> Lenguaje interpretado, inicialmente diseñado para el procesamiento de ficheros de texto. El propio lenguaje está hecho sobre lenguaje C. Hay una gran variedad de módulos disponibles en la comunidad CPAN. Se puede encontrar de todo: desde módulos .pm que interactúan con un módem, hasta otros que lo hacen con una estación meteorológica, para tratar con la API de Twitter, Facebook, bases de datos, threads, gestión de sockets, implementaciones de algoritmos de cifrado… y un muy muy largo etcétera… Desde hace unos años, es mi elección estrella para el desarrollo de cualquier tipo de script. Las causas sobre todo son su sencillez,  los mínimos requisitos en la sintáxis y porque gracias a posibilitar la creación de scripts en modo "Quick & Dirty", permiten generar un script express con muy pocas líneas de código, para hacer realidad la solución a cualquier problema, con un grado de abstracción y alto nivel que no he visto en otros lenguajes.

Otros lenguajes de scripting interpretados en los que NO he programado: Los más conocidos son Python o Ruby por ejemplo. Me guste más o menos, por lo que he visto en los últimos años, Python es definitivamente el "lenguaje de scripting de moda". Según tengo entendido (y por lo que he podido ver), es también un lenguaje sencillo de aprender, que permite realizar scripts muy potentes con una alta abstracción. En mi caso, los problemas que he tenido con python han tenido que ver, fundamentalmente, con la compatibilidad hacia atrás entre scripts hechos en Python 2.6 al ejecutarse en CentOS Linux 4.X, con la última versión de python disponible 2.3. Por otra parte, Python tiene ciertos requisitos sintácticos más exigentes que en Perl. Desconozco Ruby absolutamente, por lo que no me pronunciaré al respecto.

Efectivamente, hay muchos más lenguajes, como .NET, PHP, COBOL, Javascript, Visual Basic script, Modula, LUA, LISP, etc, etc,… que o no he tenido oportunidad de utilizar, o sólo me han valido para aplicaciones web, o quedaron olvidados en mis épocas universitarias, por lo que, o tampoco creo poder valorar actualmente con propiedad, o simplemente no puedo considerarlos útiles para scripting.

Al margen de las risas que existieron en la última edición de la Rootecon, respecto a qué lenguaje es mejor, creo que como siempre cabe aplicar la lógica. Si todos estos lenguajes siguen vivos, es porque hay legiones de desarrolladores que siguen utilizándolos de una forma diaria, enriqueciéndolos con módulos compartidos para el uso y disfrute de la Comunidad. Lo que digo aquí no implica que un lenguaje sea mejor que otro, sino que si dominas varios, puedes valorar y elegir cuál utilizar en cada ocasión. 

Dependiendo del problema a solucionar, de las necesidades de rendimiento a satisfacer y de la existencia o no, de módulos y librerías ya hechas, dependencias necesarias, y la no necesidad de matar moscas a cañonazos, puede que resulte más interesante pararse a pensar que lenguaje elegir antes de abrir el editor. 

Si lo que se necesita hacer puede llevarse a cabo en cualquier lenguaje, creo que la decisión ha de ir guiada por el lenguaje en el que nos sintamos más cómodos desarrollando.

En cualquier caso, elijáis el lenguaje que elijáis, no os olvidéis de lo más importante de cualquier script: Los comentarios que expliquen las secciones más complejas, para que otros (e incluso vosotros mismos) podáis entender de una forma rápida su funcionamiento.

Happy scripting!

No hay comentarios.:

Publicar un comentario