Login en Linux y caracteres no imprimibles

En una de las preguntas que teníamos que hacer en clase para un ejercicio de la asignatura de Seguridad Informática, se nos preguntaba acerca de las contraseñas en Linux (expiraciones, limitaciones, …) Al final resultó ser más entretenido que un simple y típico chequeo, con un final interesante y curioso, al menos para mi, es por eso que lo publico. He buscado un poco y no he visto ningún documento que lo recoja, así que me parecía interesante escribirlo.

Toda la historia tiene como centro al comando passwd, que es el que nos permite cambiar la contraseña de nuestro usuario actual. Su funcionamiento es simple: escribimos passwd, introducimos la contraseña actual, e introducimos dos veces la nueva contraseña. Nada nuevo.

Hay varios conjuntos de contraseñas que no podemos poner, ya porque sean simples, fáciles, etc. De hecho, estos son algunos de los errores que nos pueden dar si tratamos de introducir algunas contraseñas.

Este es un extracto del man del passwd.

Then, the password is tested for complexity. As a general guideline,
passwords should consist of 6 to 8 characters including one or more
characters from each of the following sets:

·   lower case alphabetics
·   digits 0 thru 9
·   punctuation marks

Care must be taken not to include the system default erase or kill
characters.  passwd will reject any password which is not suitably
complex
.

Tal y como pone, nos podriamos imaginar que el passwd tiene las restricciones que ahí nos puede hacer entender que tiene. Sin embargo, lo interesante viene cuando lo hacemos con el sudo. En este caso, básicamente, se lo traga absolutamente todo. Fuimos probando los palíndromos que antes no nos dejaba poner, y signos raros, y si, se podía meter de todo.

El caso es que, después de probar a meter todo tipo de símbolos, probamos incluso a teclear Esc, RePag, AvPag.. y sorpresa, también se los tragaba. Es decir, podíamos tener un usuario que para loguearse necesitara que introdujeses 7 veces Esc. ¿Qué “problemas” trae esto? Principalmente, que en el entorno gráfico es imposible loguearte. No hay manera de introducir esto, pues cuando le damos a Esc, deselecciona el usuario, y con AvPag y demás, simplemente no mete nada.

Lo primero que pensamos fue que no tenía nada sentido, ya que cuando estamos en el entorno gráfico de un sistema operativo o incluso en la propia terminal, si pulsamos Esc no pasa absolutamente nada. Pero me vinieron a la mente el concepto de los caracteres no imprimibles, y buscamos en una tabla ASCII a ver.

Y exáctamente ahí lo teníamos. Esc es un carácter no imprimible, y de alguna forma se metía. Importante decir que los caracteres no imprimibles se los traga sin el sudo.

Después de llegar a esta conclusión, comprobamos esta teoría de manera muy sencilla.

cat > prueba
Ahí pulsamos Esc una vez, y luego lo cerramos. Abrimos con el vi, lo ponemos para que se muestre en hexadecimal (:!%xxd) et voilá. Ahí tenemos a nuestro 1B (Esc).

Como curiosidad y con respecto al error del palíndromo. Un palíndromo es una palabra que se lee igual a ambos lados. Insisto en el concepto palabra, porque si ponemos de contraseña 3avpag+2repag+3avpag no nos dice que sea un palíndromo (aunque técnicamente lo sería). Si después de tener esta contraseña se nos ocurre escribir 2repag+3avpag, nos salta el error de “New password is just a wrapped version of the old one”. Si todo esto lo hacemos con letras (sin ser un palíndromo) nos diría “New and old password are too similar”. Curioso ¿no?

Creando un servidor de OpenStreetMap en Ubuntu 10.04

Índice
1.-Introducción
2.-Empecemos
3.-Preparando la base de datos
4.-Instalando la libreria Mapnik
5.-Instalando las fronteras del mapa
6.-Renderizado del primer mapa
7.-Troubleshooting

1.-Introducción

Primeramente, me gustaria agradecer a “rw”, el autor del post en el que este post está basado. Este post está basado en un 95% en este otro (actualmente no está disponible, pero puedes verlo aquí).

Mi principal intención es divulgar este post a todos mis lectores y almacenar esta información acerca de la plataforma OSM para que al menos haya una referencia online para todos (y por supuesto, para mi). Este post no trata acerca de una introducción ni información acerca de OSM, sino que es información técnica para construir tu propio servidor OSM. También me gustaria mejorar mi conocimiento acerca de este servidor (no simplemente descargarlo, instalarlo y correrlo, estaría bien tratar de entenderlo).

No copiaré y pegaré el mismo contenido del post, porque (como una instalación grande ordinaria) tuve problemas instalando esta plataforma y los he resuelto, por lo que escribiré acerca de lo que he visto, resuelto y conclusiones personales. También iré un poco en profundidad acerca de algunos comandos y demás, cuya explicación si que la dejaré inglés.

2.-Empecemos

Actualiza tu sistema

Por razones de seguridad, está recomendado actualizar el sistema, aunque no es necesario.

sudo apt-get update
sudo apt-get upgrade

Algunas herramientas del sistema

sudo apt-get install subversion autoconf screen munin-node munin htop

Subversion: we’ll use it to donwload files from some repositories.
Autoconf: software to generate autoconfig scripts.
Screen: Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells.
Munin-node: software to monitoring our server from the client.
Munin: client of munin-node.
Htop: software to check and monitoring the system used resources.

Organicemos el sistema de archivos un poquito

cd ~
mkdir src bin planet

  • src: source de mapnik.
  • bin: aquí tendremos los scripts para generar la imagen del mapa y cargar la base de datos.
  • planet: planeta (o una porción) de la base de datos que vamos a construir.

Obten el último fichero del planeta (OSM file)

En esta parte, vamos a descargar la base de datos del mundo entero (actualmente [20 dic 2012] pesa 24GBs) o quizás podemos descargar no el mundo entero sino una porción de éste. Simplemente para probar, elegiré descargar una porción.

cd planet
wget http://planet.openstreetmap.org/planet-latest.osm.bz2

3.-Preparando la base de datos

Aqui vamos a descargar postgresql para meter nuestra base de datos ahi, incluyendo algunas librerias para poder usarlo.

sudo apt-get install postgresql-8.4-postgis postgresql-contrib-8.4
sudo apt-get install postgresql-server-dev-8.4
sudo apt-get install build-essential libxml2-dev
sudo apt-get install libgeos-dev libpq-dev libbz2-dev proj

Build-essential: This package contains an informational list of packages which are considered essential for building Debian packages.
Libxml2-dev: Very useful if you wish to develop your own programs using the GNOME XML library.
Libgeos-dev: GEOS provides a spatial object model and fundamental geometric functions. It implements the geometry model defined in the OpenGIS Consortium Simple Features Specification for SQL.
Libpq-dev: Header files and static library for compiling C programs to link with the libpq library in order to communicate with a PostgreSQL database backend.
Libbz2-dev: Static libraries and include files for the bzip2 compressor library.
Proj: Standard Unix filter function which converts geographic longitude and latitude coordinates into cartesian coordinates, by means of a wide variety of cartographic projection functions.

Instalar osm2pgsql del repositorio

Primero descargamos osm2pgsql del repositorio, y depués, lo configuramos. osm2pgsql es un programa que convierte datos de OpenStreetMap en bases de datos para PostgreSQL

cd ~/bin
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
cd osm2pgsql
./autogen.sh (Error?)
./configure
make

Configurando la base de datos de PostGIS

Editamos /etc/postgresql/8.4/main/postgresql.conf para modificar/añadir 4 lineas. Estos cambios ayudarán a usar grandes cantidadesd e datos.

107: shared_buffers = 128MB # 16384 para versión 8.1 y anteriores
170: checkpoint_segments = 20
(nueva línea): maintenance_work_mem = 256MB # 256000 para versión 8.1 y anteriores
387: autovacuum = off

Editamos /etc/sysctl.conf

(nueva línea) kernel.shmmax=268435456

Recuerda que lo anterior solo tiene efecto después de reiniciar. Para que tenga efecto inmediatamente realizaremos lo siguiente.

sudo sysctl kernel.shmmax=268435456

Reiniciamos postgres para habilitar los cambios.

sudo /etc/init.d/postgresql-8.4 restart

Creamos una base de datos llamada “gis”. Algunas de nuestras herramientas suponen el uso de ese nombre en la base de datos, por lo que si elegis otro nombre, tenedlo en cuenta. Lo mismo para “username” con el usuario creado. Este deberia ser el nombre de usuario que va a renderizar los mapas con mapnik
Nota del autor de delanover: Tuve problemas con el nombre de usuario, por lo que decidi usar el mismo que en el ordenador.

sudo -u postgres -i
createuser username # responder ‘yes’ para que sea superusuario
createdb -E UTF8 -O username gis
createlang plpgsql gis
exit

Configuración de postgis en la base de datos postgresql

psql -f /usr/share/postgresql/8.4/contrib/postgis.sql -d gis

Deberia responder con algunas lineas y acabar en


CREATE FUNCTION
COMMIT

Sustituir tu nombre de usuario por “username” en las siguientes lineas. Este deberia ser el que va a renderizar los mapas con mapnik, como dijimos anteriormente.

echo “ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;” | psql -d gis

Deberia devolver

ALTER TABLE
ALTER TABLE

Activamos intarray

psql -f /usr/share/postgresql/8.4/contrib/_int.sql -d gis

Deberia devolver varias líneas acabadas en


CREATE FUNCTION
CREATE OPERATOR CLASS

Configuramos el Set the Spatial Reference Identifier (SRID) en la nueva base de datos.

psql -f ~/bin/osm2pgsql/900913.sql -d gis

Deberia devolver

INSERT 0 1

Cargamos el planeta en la base de datos con osm2pgsql

cd ~/bin/osm2pgsql
./osm2pgsql -S default.style –slim -d gis -C 2048 ~/planet/YourFileMap.osm.bz2 (Error?)

Nota: cargar 8.4GB lleva 30 hours, y particularme 1.4GB me llevaron 8 horas (depende de la velocidad de E/S), por lo que sé paciente.

Completed planet_osm_roads
Copying planet_osm_polygon to cluster by geometry finished
Copying planet_osm_line to cluster by geometry finished
Creating indexes on planet_osm_polygon finished
All indexes on planet_osm_polygon created in 4257s
Completed planet_osm_polygon
Creating indexes on planet_osm_line finished
All indexes on planet_osm_line created in 5053s
Completed planet_osm_line
Stopped table: planet_osm_ways in 16095s
Osm2pgsql took 29436s overall

4.-Instalando la librería Mapnik

sudo apt-get install libltdl3-dev libpng12-dev libtiff4-dev libicu-dev
sudo apt-get install libboost-python1.40-dev python-cairo-dev python-nose
sudo apt-get install libboost1.40-dev libboost-filesystem1.40-dev
sudo apt-get install libboost-iostreams1.40-dev libboost-regex1.40-dev libboost-thread1.40-dev
sudo apt-get install libboost-program-options1.40-dev libboost-python1.40-dev
sudo apt-get install libfreetype6-dev libcairo2-dev libcairomm-1.0-dev
sudo apt-get install libgeotiff-dev libtiff4 libtiff4-dev libtiffxx0c2
sudo apt-get install libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev
sudo apt-get install libgdal1-dev python-gdal
sudo apt-get install imagemagick

Libltdl3-dev: A small library that aims at hiding the various difficulties of dlopening libraries from programmers. It is a system independent dlopen wrapper for GNU libtool.
Libpng12-dev: Library implementing an interface for reading and writing PNG format files.
Libtiff4-dev: Library providing support for the Tag Image File Format (TIFF), a widely used format for storing image data. This package includes the development files, static library, and header files.
Libicu-dev: ICU is a C++ and C library that provides robust and full-featured Unicode and locale support. This package contains the development files for ICU along with programs used to manipulate data files found in the ICU sources.
Libboost libraries: Boost provides free peer-reviewed portable C++ source libraries.
Python libraries: So obvious.
Libfreetype6-dev: This package contains all supplementary files (static library, headers and documentation) you need to develop your own programs using the FreeType 2 library (digital typography library).
Libcairo2-dev: Cairo is a multi-platform library providing anti-aliased vector-based rendering for multiple target backends.
Libgeotiff-dev: The GeoTIFF standard has been developed for reading, and writing geographic meta-information tags on top of TIFF raster.
Tiff libraries: So obvious, to work with tiff format.
Libsigc libraries: implement a typesafe callback system for standard C++. It allows you to define signals and to connect those signals to any callback function, either global or a member function, regardless of whether it is static or virtual.
Libgdal1-dev: GDAL is a translator library for raster geospatial data formats. As a library, it presents a single abstract data model to the calling application for all supported formats.
Imagemagick: software suite to create, edit, compose, or convert bitmap images.

Construimos la libreria de Mapnik desde el código fuente.

cd ~/src
svn co http://svn.mapnik.org/tags/release-0.7.1/ mapnik (Error? offline)
cd mapnik
python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/ (Error? boost version)
python scons/scons.py #be patient here
sudo python scons/scons.py install
sudo ldconfig

Confirmamos que la libreria Mapnik está instalada.

python
>>> import mapnik
>>>

Instalamos herramientas para Mapnik

cd ~/bin
svn co http://svn.openstreetmap.org/applications/rendering/mapnik

5.-Instalando las fronteras del mapa

cd ~/bin/mapnik
mkdir world_boundaries
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
tar xvzf world_boundaries-spherical.tgz
cd world_boundaries
wget http://tile.openstreetmap.org/processed_p.tar.bz2
bunzip2 processed_p.tar.bz2
tar xvf processed_p.tar
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
bunzip2 shoreline_300.tar.bz2
tar xvf shoreline_300.tar

6.-Renderizado del primer mapa

cd ~/bin/mapnik
chmod +x generate_xml.py
./generate_xml.py –dbname gis –accept-none [NOTA IMPORTANTE]

NOTA IMPORTANTE: No se porqué no se ve bien el doble guión. Recuerda que es “–” (dos “-“) y no un solo “-“.

Include files written successfully! Pass the osm.xml file as an argument if you want to serialize a new version or test reading the XML

Finalmente generamos la imagen.

./generate_image.py (Error?)

El resultado será una imagen PNG de 10000x5000px de resolución del Reino Unido, en la carpeta de mapnik. Recuerda, sé paciente.

Espero que haya disfrutado de este tutorial!

7.-Troubleshooting

Error 1: Configurando al instalar osm2pgsql
Error al ejecutar ./configure cuando estamos instalando osm2pgsql:

Can’t exec “libtoolize”: No such file or directory at /usr/bin/autoreconf line 189.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 189.
autoreconf: Entering directory `.’
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal –force -I m4
configure.ac:41: warning: macro `AM_PROG_LIBTOOL’ not found in library
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf –force
configure.ac:41: error: possibly undefined macro: AM_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1

Solution
No puedes ejecutar libtoolize, por lo que debes instalar libtool antes de continar, escribe:

sudo apt-get install libtool

Error 2: Cargando un planeta en la base de datos
Quizás tengas un error mientras estés cargando los datos del planeta:

The target database has the intarray contrib module loaded.
While required for earlier versions of osm2pgsql, intarray
is now unnecessary and will interfere with osm2pgsql’s array
handling. Please use a database without intarray.

Error occurred, cleaning up

Para arreglarlo, realizaremos un arreglo que aparece en la documentación oficial

sudo -u postgres -i -H
dropdb ptgis
### here the old database is dropped
createdb -E UTF8 -O ptuser ptgis
createlang plpgsql ptgis

# for Ubuntu <=9.10: # psql -d ptgis -f /usr/share/postgresql/8.3/contrib/_int.sql ### (do not execute this line) psql -d ptgis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql # for Ubuntu >=10.04:
#psql -d ptgis -f /usr/share/postgresql/8.4/contrib/_int.sql ### (do not execute this line)
psql -d ptgis -f /usr/share/postgresql/8.4/contrib/postgis.sql
psql ptgis -c “ALTER TABLE geometry_columns OWNER TO ptuser”
psql ptgis -c “ALTER TABLE spatial_ref_sys OWNER TO ptuser”
exit

# for Ubuntu <=9.10: sudo /etc/init.d/postgresql-8.3 reload # for Ubuntu >=10.04:
sudo /etc/init.d/postgresql-8.4 reload

psql ptgis ptuser -f osm2pgsql/900913.sql

Ahora, intentaremos cargar los datos de nuevo.

Error 3: Repositorio de Mapnik offline
Establezco esto como un error porque, quien sabe, igual algún dia vuelva a estar online. Pero ahora no lo está, por lo que debemos encontrar otro sitio para descargarlo.
Necesitamos descargar el software de git para poder descargar desde un repositorio git, y despues de eso, podremos descargar mapnik desde aquí

sudo apt-get install git-core
git clone https://github.com/mapnik/mapnik.git

Error 4: Boost version >= 1.47 required
Podemos comprobar nuestra versión de boost actual mirando en la línea 30 en el fichero /usr/include/boost/version.hpp para darnos cuenta de que no tenemos la versión 1.47 o superior, por lo que, tenemos que actualizarla. Esto no es tan sencillo como un simple apt-get install, pero es tan sencillo como: descargar e instalarlo.

Necesitamos descargar la última versión (http://www.boost.org/) (a dia de hoy, la 1.52, desde http://sourceforge.net/projects/boost/files/boost/1.52.0/). Seleccionamos el fichero tar.bz2, lo descomprimimos, configuramos y demás.

bunzip2 boost_1_52_0.tar.bz2
tar xvf boost_1_52_0.tar
./bootstrap.sh
./b2
sudo ./b2 install

Error 5: No existen algunos archivos necesarios!
Después de intentar generar la imagen (vaya suerte, justo fallando en el último paso…) se nos podria devolver el siguiente error.

RuntimeError: Shape Plugin: shapefile ‘/home/lipman/bin/mapnik/world_boundaries/110m_admin_0_boundary_lines_land.shp’ does not exist encountered during parsing of layer ‘necountries’ in Layer at line 58 of ‘osm.xml’

El único problema aquí es que necesitamos algunos archivos que no tenemos, por tanto, descarguémoslos y movámoslos a la carpeta world_boundaries para arreglarlo.

Encontré los archivos aquí. Tenemos que descargar los siguientes:

  • 110m_admin_0_boundary_lines_land.shp
  • 110m_admin_0_boundary_lines_land.dbf
  • 10m_populated_places.shp (*)
  • 10m_populated_places.dbf (*)

(*): Tenemos que renombrarlos a “ne_10m…”

IPTables (filter)

El objetivo de esta entrada es recopilar funciones así como definiciones básicas sobre IPTables, más concretamente de la tabla filter. Si hay algo mal explicado, confuso, que está mal, o que no está, os animo a que me aviséis para poder mejorarlo. Por otra parte, esta entrada no busca ser algo ultra profesional, ni tener mil ejemplos (solo los justos para su entendimiento), ni definiciones complicadas y detalladas.

INDICE
1.-Definición IPTables
2.-Estructura de las reglas
3.-Algunas notas teóricas sobre cómo funciona IPTables
4.-Tabla FILTER
    4.1.-El parámetro Match (-m)
    4.2.-El protocolo TCP
    4.3.-Ejemplos
5.-Comandos
6.-Parámetros

1.-Definición IPTables

IPTables, framework localizado en el núcleo de Linux, permite el tratamiento de paquetes de red. De esta forma, podemos administrar todos los paquetes que pasan por nuestra máquina, y realizar con ellos lo que creamos conveniente, funcionando así como cortafuegos.

2.-Estructura de las reglas

  • FILTER: Filtrado de paquetes
    • INPUT
    • OUTPUT
    • FORWARD
  • NAT
  • MANGLE

3.-Algunas notas teóricas sobre cómo funciona IPTables

  1. IPTables usa por defecto la regla FILTER (filtrado). Si queremos indicarle que use otra, se lo indicaremos con -t mangle/nat.
  2. Las reglas se añaden en una lista y se miran de arriba a abajo. Cuando un paquete coincide con una regla, se realiza lo que pone en dicha regla. ¿Qué quiere decir esto? Imaginemos que tenemos dos reglas en el siguiente orden: “NO acepto paquetes de la IP X.X.X.X” y “Acepto paquetes de la IP X.X.X.X que vayan por este puerto”. De esta manera, cuando se reciba cualquier paquete, se desechará ya que coincide con la primera regla, independientemente de todo lo demás. Sin embargo, si hubiesemos puesto las reglas en el orden inverso, aceptariamos solamente paquetes de esa IP que vaya por ese puerto, y el resto se desechan. Por esto, es muy importante el orden en el que se escriben las reglas.

4.-Tabla FILTER

Esta tabla nos permite filtrar paquetes, y tratarlos.
Dentro de esta tabla, tenemos 3 cadenas:

  • INPUT: Afecta a los paquetes que van dirigidos hacia el propio equipo.
  • OUTPUT: Afeta a los paquetes que van dirigidos desde el propio equipo. Generados localmente que salen al exterior.
  • FORWARD: Los paquetes que usan nuestro equipo para ir a otros. No van destinados a nuestro equipo, lo usa para reenviar paquetes a un objetivo concreto.

4.1.-El parámetro Match (-m)

El parámetro match nos permite seleccionar unos paquetes determinados, dependiendo de lo que queramos seleccionar concretamente. Nos proporciona más flexibilidad a la hora de filtrar.

4.1.1.-Match time
Nos permite seleccionar paquetes teniendo en cuenta el tiempo. Esto nos permite filtrar paquetes dependiendo de la hora y día del dispositivo en donde se estén añadiendo las reglas de IPTables.
El siguiente ejemplo bloquea todo el tráfico de lunes a viernes por la noche.
iptables -A OUTPUT -s 0/0 -m time –timestart 00:00 –timestop 08:00 –weekdays Mon,Tue,Wed,Thu,Fri -j DROP

4.1.2.-Match state
Nos permite seleccionar paquetes dependiendo del estado de estos. Hay 4 tipos:

  • INVALID: el paquete no ha podido ser identificado por alguna razón. Se conoce como inválido, por tanto no habría problemas en dropearlo.
  • ESTABILSHED: el paquete está asociado a una conexión en la que se envían paquetes en ambos sentidos y que está corriendo.
  • NEW: el paquete que inicia una nueva conexión o que está asociado con una conexión que no envía paquetes en ambas direcciones.
  • RELATED: el paquete empieza una nueva conexión, pero está asociado a una conexión ya existente, como una trasnferencia de datos FTP o un error ICMP. Nos permite trackear la transferencia.

Ejemplo:
iptables -A INPUT -m state –state INVALID -j DROP

4.1.3.-Match mac
Nos permite seleccionar paquetes en función de la dirección MAC. Podriamos filtrar los paquetes que vengan de una MAC determinada de la siguiente manera:
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j DROP

4.1.3.-Match multiport (opción de -p tcp)
Nos permite seleccionar varios puertos, ya sean de destino u origen. Se usa –dports y –sports.
iptables -A INPUT -p tcp –match multiport —dports 80,443,100:1500 -j ACCEPT

4.2.-El protocolo TCP

Para hacer referencia a este protocolo, tendremos que especificarlo mediante -p tcp.
–dport: puerto de destino. Se pueden poner en rangos o uno a uno. Ejemplo:
iptables -A INPUT -p tcp –dport 2000:2500 -j DROP
iptables -A INPUT -p tcp –dport 80 -j DROP

–sport: puerto de origen. Lo mismo que dport.

Nota: Para poner múltiples puertos, hay que hacerlo con match multiport (ver 4.1.4)

–tcp-flags: nos permite indicar los FLAGS que queremos que estén activos. La primera cadena es la de los flags que queremos examinar, y la segunda, es la de los flags que queremos que estén activos.

Ejemplo: queremos que esté activo el flag SYN y no-activo el de PSH:
iptables -A OUTPUT -p tcp –tcp-flags SYN,PSH SYN -j DROP
Queremos que esté activo el de SYN y el de PSH:
iptables -A OUTPUT -p tcp –tcp-flags ALL SYN,PSH -j DROP

4.3.-Ejemplos

4.3.1.-Filtrar los paquetes que provengan de una dirección MAC determinada
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j DROP

4.3.2.-Permitir que sólamente una determinada MAC pueda comunicarse
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j ACCEPT
iptables -A INPUT -j DROP

o

iptables -P INPUT DROP # Establecemos una politica de dropeo en los inputs
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j ACCEPT

4.3.3.-Eliminar reglas determinadas
iptables -L -n –line-numbers # Listamos las reglas (numerándolas)
iptables -D INPUT 2 # Seleccionamos la que queramos eliminar y su tabla (la 2 de la INPUT).

4.3.4.-Bloquear puertos concretos
iptables -A OUTPUT -p tcp –dport 80 -j DROP

4.3.5.-Filtrar paquetes de una red entera
iptables -A INPUT -s 192.168.2.0/24 -j DROP

4.3.6.-Prohibir el tráfico a una web
iptables -A OUTPUT -d IP.IP.IP.IP -j DROP
o
iptables -A OUTPUT -s IP.IP.IP.IP -j DROP

4.3.7.-Prohibir el tráfico a una web en un determinado rango de horas y determinados dias.
iptables -A OUTPUT -d IP.IP.IP.IP -m time –timestart 11:00 –timestop 12:00 –weekdays Mon,Tue,Wed,Thu,Fri -j DROP

4.3.8.-Listar las cadenas de una tabla (-t filter/nat/mangle) (sin opciones)
iptables -L

4.3.9.-Listar las cadenas de una tabla con opciones: para que salgan las reglas numeradas y para que salgan las estadísticas de transferencia de datos
iptables -nvx –line-numbers -L

4.3.10.-Resetear el contador a cero (de los paquetes y bytes)
iptables -Z

5.-Comandos

-A (–append): agrega una nueva regla al final de la cadena seleccionada.
Recordar que hay tres tablas (filter, nat y mangle) y en cada una, hay cadenas. Las reglas, van encadenadas en cada cadena.
-I (–insert): inserta encima del número de la regla de la cadena, una nueva regla (ver ejemplo más abajo).
-D (–delete): elimina una regla de la cadena seleccionada
-L (–list): lista todas las reglas
-F (–flush): borra o limpia las reglas
-Z (–zero) contadores de bytes de todas las cadenas a cero)
-N (–new-chain): crea una nueva cadena
-X (–delete-chain): elimina la cadena especificada
-P (–policy): configura una política a la cadena y target dado
-h (–help): da una descripción de la sintaxis del comando

Ejemplo de -I
Como dije anteriormente, hay tablas (filter, nat, mangle), y en cada tabla hay cadenas (input, output, …), y cada cadena tiene reglas que vamos insertando, y cada regla tiene un número, ya que el orden es altamente importante. Si ponemos primero una regla que dice “dropear todos los paquetes del input” y luego decimos “aceptar los paquetes que pasan por una IP”, siempre se va a ejecutar lo primero y no habrá transmisión. Es por esto que el orden es importante.
Con -A (–append) las reglas las vamos poniendo una detrás de otra. Con -I (–insert) podemos especificar la posición de la regla en la cadena de la siguiente forma. Ejemplo: imaginemos que al principio tenemos 3 reglas
A)
B)
C)

Si hacemos un: -I OUTPUT 2 -j DROP esta regla se situará encima de la segunda.

A)
-I OUTPUT…
B)
C)

6.-Parámetros

-p (–protocol): protocolo del paquete a chequear (tcp, udp, icmp, all). El argumento ! es la selección inversa
-s (–source): dirección de origen específica o un rango usando la máscara o prefijo. Argumento !
-d (–destination): dirección destino
-j (–jump) especifica el target de la regla. Qué hacer con el paquete que coincida con la regla (aceptar, rechazar) (ACCEPT, DROP (tirar), REJECT (inalcanzable, paquete ICMP de error))
-i (–in-interface): nombre de la interfaz por donde el paquete fue recibido (solo para cadenas INPUT, FORWARD y PREROUTING). Argumento !.
-O (–out-interface): nombre de la interfaz por donde el paquete se envía o sale (solo para cadenas OUTPUT, FORWARD, y POSTROUTING). Argumento !.
-f (–fragment): la regla se refiere al segundo y siguientes fragmentos o paquetes fragmentados.
-t (–table): especifica la tabla a usar.
-m (–match)

¿Qué sabe Tuenti de nosotros?

Como todos sabemos (o deberiamos saber), al menos en España disponemos de los derechos de acceso, modificación, cancelación y oposición, y la gran mayoria de la gente no lo sabe, o no los usa.

Por poner un ejemplo práctico, al cabo del tiempo a nuestr mail nos llegan muchos correos de falso spam. Digo falso spam porque para nosotros es spam (ya que es correo no deseado) pero nos lo mandan porque tiempo atrás nos registramos en algún sitio y accedimos a que guardasen nuestros datos y nos enviasen correo. Es cierto que se tarda medio segundo en eliminarlo, por eso se suele hacer ya que es lo mas fácil y rápido, pero si nos detenemos un momento en el mensaje, en la parte de abajo suele (o deberia) tener un enlace para poder evitar que nos manden más correo (darnos de baja).

El caso es que con la legislación española, además de facilitarnos un medio para poder ejercer nuestros derechos (acceso, modificación…) debe de indicar quién es el responsable del fichero de datos y dónde está situado. Hace tiempo salió una noticia de que uno pidió sus datos en Facebook, y se lo dieron y tal, y bueno, ha llovido bastante desde es momento y en Facebook tenemos ya la opción de descargar nuestros datos (y archivos subidos).

Si nos vamos a configuración de la cuenta, en la parte de abajo tenemos un enlace que dice “Descarga una copia de tu información.” que incluye además como dije, archivos subidos, como imágenes. Esto no es instantáneo, sino que lo has de solicitar y tarda un tiempo en prepararse (cuestión de horas), y luego si que puedes descargarlo.

Total, que me hice la pregunta de, ¿y Tuenti qué guardará de nosotros? Así que no me lo pensé dos veces. A pesar de conocerme el procedimiento legal, primero de todo les envié un mail solicitando información, y me dijeron que tenia que enviarles una carta a una dirección adjuntando una copia del DNI, una carta con mis datos (nombre, edad, ubicación), y un impreso que tenia que firmar (el primero). Envié la carta, y además la certifiqué para confirmar que había llegado.

Volviendo al tema legal, he de comentar dos cosas: legalmente, nos tienen que responder en el periodo de máximo un mes. Una vez realizado el derecho de acceso a tus datos personales, si no es por causas mayores, no puedes volver a hacerlo hasta dentro de un año.

Hace poco recibí el paquete de vuelta cuyo contenido era un par de hojas impresas y un CD, del cual pude deducir que estaba escrito por una chica (y posteriormente los metadatos me dijeron que se llamaba Laura y usaba un Mac, gracias FOCA).

El contenido del CD era un PDF (lo que me habian imprimido) y una carpeta que contenia un screenshot y 4 CSV’s.

El screenshot es el siguiente:

Con respecto a los CSV’s, el primero de ellos contiene datos respecto a los amigos: nombre, ciudad, edad, ID, y fecha de cuando empezamos a ser amigos en la red social.
El segundo CSV es un simple log de las IP desde donde se ha conectado a la cuenta: Id, fecha, IP, “admin ID” (ni idea que es esto, igual es en el caso de ser admin?, me lo pone a 0 todo el rato). Importante destacar que viene desde el momento de registro, en mi caso desde 2009.
El tercer CSV contiene los mensajes privados, aunque de una forma más caótica, ya que técnicamente no es un CSV, ni siquiera sé muy bien como lo han hecho. De repeten aparecen varios contactos, luego un mensaje, luego más contactos…
El último CSV contiene datos del muro con los siguientes datos: Nombre, ciudad, edad, ID, fecha, texto y tipo. He de decir que también está ordenado de forma caótica y no es completamente un CSV.
La verdad es que me esperaba que me adjuntasen también las imágenes que habia subido (como en el caso de Facebook)… pero no ha sido el caso.

Conclusión hasta aquí: es interesante ver qué tienen las empresas sobre nosotros, así que animo a que ejerzais vuestros derechos, que para algo están.

Con respecto al tema de la seguridad me han surgido varias preguntas y reflexiones:
-Lo único personal que tuve que enviar fue una fotocopia del DNI (ni siquiera compulsada) además de los datos que están en la red social y cualquiera puede verlos. Se podría hacer la fotocopia a alguien sin que se diera cuenta y enviarlo en su nombre? No me cabe la menor duda, sobre todo si se trata de alguien cercano como un familiar, o si se piensa un poco la manera.
-Si se pudiese suplantar la identidad y poder realizar los derechos de acceso, ¿podriamos realizar también los derechos de oposición? (vamos, cerrarle el Tuenti a alguien).

Desarrollando un sistema de encriptación útil y básico

Desde hace mucho tiempo que la criptología es uno de los temas que apasionan, aunque para indagar de verdad necesitas alto conocimiento matemático que espero algún dia nos enseñen en la uni. Sin ningún tipo de conocimiento básico, lo primero que se nos puede ocurrir para encriptar un texto, es la rotación (método Cesar) o la traducción.

El término traducción al que me refiero puede ser muy amplio, y esta idea que le da un toque personal a esta entrada, me viene de hace muchos años cuando oí en la tele que el japonés originariamente se diseñó para que unos cuantos lo hablasen y no les entendieran, como un tipo de encriptación del lenguaje. Cierto o no, nos vamos a valer de eso.

El tema de la rotación no tiene mucho misterio. Se basa en rotar el abecedario, de manera que si hacemos una rotación 3:

Osease, que el texto “hola mundo”, podria quedar encriptado de la siguiente manera, “krod pxpgr”. Una persona que vea esto puede sacar algunas deducciones y hacer pruebas.

  • Al haber un espacio entre dos grupos de letras, se puede deducir que se tratan de dos palabras.
  • Al no ser de un tamaño raro, se pueden considerar letras que forman palabras, sin más.
  • Para desencriptarlo, lo primero que se nos puede ocurrir es hacer una rotación debido a lo fácil que es programar algo, para que nos rote un texto de manera automática de todas las formas posibles.

Como podemos deducir, la rotación sin más, no es un método seguro. Pero, ¿y si además de rotar hacemos una traducción? Esa era mi idea desde el principio, y valiéndome de lo que conté del japonés, podemos usar los propios kanjis del japonés para traducir (aunque usaré ‘kanas’ para los más quisquillosos).

De manera que (traduciendo también el espacio en blanco), nuestro “krod pxpgr” se puede transformar en un “ゼかとつこにギヲちな” por poner un ejemplo.

Ya parece un poco más complicado de desencriptar, ¿verdad? Vamos a pararnos aquí y vamos a pensar en la herramienta desencriptradora, ya que si hacemos una encriptación, es lógico que necesitamos otra herramienta que nos recorra el camino inverso.

En este proceso, hemos necesitado dos premisas: la primera de ellas es la rotación que hemos tomado, y la segunda, la traducción. El tema de la traducción no tiene ningún misterio, ya que en una matriz podemos tener todos los caracteres que vamos a traducir, y en otra la traducción de cada uno. Y por último, el tema de la rotación, lo podemos pasar en la propia cadena, me explico, después de traducir “hola mundo” por “krod pxpgr”, al usar una rotación 3, podemos traducir el texto originario a “krod pxpgr3”. Y posteriormente lo traducimos a kanjis japoneses ゼかとつこにギヲちな. De esta forma hacemos lo siguiente para desencriptar: traducimos -> obtenemos el número de rotación -> rotamos.

Perfecto, pues ya tenemos nuestra cadena encriptada a un lenguaje con símbolos raros que no tienen absolutamente nada que ver con los nuestros. Sin embargo, esto sigue teniendo varios fallos.

A lo largo de la historia, las personas han sido capaces de desencriptar lenguajes escritos (como los jeroglíficos por ejemplo), entonces, desencriptar un simple “hola mundo” debe ser pan comido. Esto lo han conseguido observando el patrón que siguen las palabras, la cantidad de veces que se usan las letras (por ejemplo, para el castellano en particular, las vocales y los espacios en blanco son muy usados) ¿Cómo podemos hacer más fuerte el sistema? Podemos hacer algo en relación a lo que hemos explicado anteriormente con la rotación.

Podemos hacer que cada vez que hagamos un mensaje, aunque sea el mismo, se traduzca de distinta manera, ya que cada vez lo rotamos de forma distinta. Esto no es muy complicado, ya que como pasamos en el propio mensaje las posiciones en las que lo rotamos, desrotarlo debe ser dificil.

De esta forma, cuando encriptemos una frase, en esa propia frase estará la clave para desencriptarla.

Todavía más
¿Cómo podemos hacer esto todavia más fuerte? Recordais las dos matrices de las que hablé antes?, una con los caracteres a traducir y otra con la traducción. Para hacer todavía más fuerte esto, podemos valernos de caracteres de distintos idiomas (para liarlo más) y que, a la hora de traducir, en lugar de traducir letras, traduzcamos sílabas. Tendremos más cosas que traducir claro está, pero será más fuerte por tener más variedad en el conjunto.

Un saludo, lipman

[Comando lftp] Copias de seguridad en Android en modo local.

Siento todo este tiempo sin escribir, he estado ocupado con temas de la universidad hasta este dia. Pero bueno, intenté despedirme durante un tiempo con una entrada especial como la de Vodafone.

Aunque no haya publicado nada desde entonces, tengo en mente varias entradas, así que volver a estar asiduo (o eso espero).

Empezaré la entrada lanzando una pregunta. ¿Estamos preparados para perder nuestro smartphone? Todos sabemos que la respuesta es no. En ese caso la mayoria de la gente perdería desde contactos hasta fotos. Pero vamos a intentar que este no sea nuestro caso.

Paso 1: la nube puede ser nuestra amiga.

Desde hace tiempo, he dejado de agregar contactos al móvil de forma tradicional, es decir, desde el propio teléfono añadir el contacto. Desde ahora, uso mi cuenta de GMail para agregar ahí a los contactos y posteriormente, actualizar los de mi teléfono teniéndolo sincronizado a dicha cuenta.

Ventajas:
Como principal ventaja, está si perdemos el teléfono, los contactos los seguimos teniendo en nuestra cuenta. Igualmente añado, que podemos añadir contactos desde el teléfono a la cuenta de GMail.
Control de tus contactos desde el ordenador, clasificación, puedes ponerles imágenes, y todo lo que puedes hacer desde tu teléfono, pero más cómodo incluso.

Paso 2: copia de seguridad de todos nuestros archivos

El objetivo original de esta entrada era mayormente este paso, ya que era el entretenido realmente, pero ya que estoy, he añadido el paso anterior ya que también me parece interesante.

Lo primero que haremos será bajarnos una aplicación para Android (gratuita): FTPDroid (también existe la versión de pago).

Esta aplicación nos permitirá convertir nuestro teléfono en un servidor FTP en donde nos conectaremos desde el ordenador y haremos copias de seguridad. Si, para hacer copias de seguridad solo necesitamos un cable y copiar-pegar, pero eso no es entretenido, se busca una manera más entretenida.

Configuración:


Añadimos un usuario y contraseña, y por defecto, la ruta en la cual accederemos será la de la tarjeta. Podriamos hacer una copia de seguridad de todo el teléfono, pero a mi personalmente me interesa la tarjeta, ya que es ahí en donde solemos meter canciones, recibir archivos, guardar ficheros, fotografias, grabaciones, etc. En este ultimo caso, cambiariamos la ruta que está, por / aunque algunos archivos no nos dejan copiarlos (supongo que teniendo el teléfono rooteado si que te dejará).

En la parte de opciones, desactivamos “Enable anonymous” para que solamente podamos acceder al teléfono a través del nombre de usuario y contraseña previamente establecido (por si acaso).

Una vez configurado esto, ya podemos acceder a nuestro teléfono desde el navegador. Si la IP local de nuestro teléfono fuese 192.168.1.100, accederiamos de la siguiente manera: ftp://192.168.1.100:2121

Comando lft
Ahora, desde la consola realizaremos la copia de ficheros, pero en lugar de usar el comando ftp como todos hemos pensado, usaremos lftp.

A diferencia de ftp, lftp permite realizar algunas más cosas, pero nos centraremos en una sola, y es en la función “mirror”.

Usaremos esta función para hacer copia de seguridad de nuestra tarjeta. Desde la consola, nos situamos en la carpeta en donde queremos llevar la copia de seguridad y seguimos los siguientes pasos:

sftp 192.168.1.100 -p 2121

Tras conectarnos establecemos el nombre de usuario y contraseña

user Usuario Contraseña

Usamos la función mirror, estableciendo que queremos copiar desde la ruta / (Nota: se copia recursivamente por defecto) (Nota 2: recordemos que / equivale a /mnt/sdcard ya que es lo que hemos configurado en nuestro teléfono).

mirror /

Este proceso nos puede llevar largos minutos, dependiendo de lo que tengamos en el teléfono claro. Ahora viene lo realmente beneficioso e interesante. Al cabo del tiempo habremos sacado nuevas fotos y tendremos nuevos archivos. ¿Tendremos que copiarlos todos de nuevo? No. ¿Hay alguna función que nos permita copiar solo los nuevos? En efecto. Además, esto también nos es útil por si hemos tenido algún problema al hacer la primera copia, como una desconexión a internet o algo.

mirror / -n

Nos queda hacer un último paso. Al realizar esto, igual tenemos problemas con los permisos. Yo mismo he tenido problemas haciéndolo en Windows, ya que no me dejaba accceder a nada de lo que habia copiado.

Para ello, realizamos un cambio de permisos. Si no nos queremo complicar y estamos en Windows, nos vamos a la carpeta donde hemos hecho la copia y hacemos un chmod recursivo:

chmod -R 777 /

Algo más acerca de LFTP

Dentro de las opciones que nos ofrece el comando mirror, podemos hacer un reverse mirror, que viene siendo lo mismo pero al revés, es decir, en vez de bajarnos del servidor un arbol con sus descendientes, lo subimos.

mirror / -R

En general, lftp es más potente que ftp. Una diferencia con respecto el comando ftp es que con lftp podemos combinar comandos locales de la consola y comandos propios de lftp. Por ejemplo, desde una sola línea podriamos comprimir el directorio actual (local), subirlo al servidor, y luego borrarlo del directorio local:

!(tar -cvvf target.tar * && gzip target.tar) && put target.tar.gz && !(rm target.tar.gz)

Como podemos ver, el símbolo de exclamación nos permite ejecutar en el sitio local.
Otra diferencia es que con lftp podemos trabajar fácilmente con el grep. Imaginemos que queremos todos los ficheros que no sean carpetas de nuestr servidor:

ls | grep '^[^d]'

lftp además de soportar transferencias ftp como hemos estado viendo, también soporta http y sus respectivas versiones encriptadas (ftps y https).

Por último, también interesante, es que lftp puede ejecutar scripts mediante el comando -f de la siguiente manera. Suponiendo que tenemos un archivo llamado script con el siguiente contenido:

connect 192.168.1.100 -p 2121
user Usuario Contraseña
ls

Al ejecutar lftp -f script se ejecuta todo el contenido del script, nos devuelve el ls del directorio remoto y volvemos a tener la consola operativa.

Un saludo, lipman

Alias en Hotmail y sincronización de cuentas en Gmail

No es una novedad, y existe desde hace mucho tiempo, pero siempre he querido hacer un post dedicado a esto, y dedicado a los que tenemos cuentas largas e incómodas de dar al público para cosas serias, y además de eso, usar varias y diferentes cuentas, incluso la de la universidad.

Alias en Hotmail

Voy a empezar por hablar de los alias en Hotmail.com. Desde hace bastantes años, llevo usando una cuenta de correo en hotmail que combina el ser bastante larga, con el ser bastante lol.

Todo esto ocasiona algunos problemas en el dia a dia: a la hora de registrarse en sitios teclear una dirección tan larga cansa más, a la hora de rellenar formularios impresos en papel con tu correo incluso ha llegado a no caberme el correo electrónico en el espacio de papel permitido. También he aprendido que cuando das tu dirección de correo en persona o por teléfono, es más tedioso, incluso puede algunos caracteres se puedan confundir (guiones con guiones bajos por ejemplo), y multitud de ejemplos.

Crearnos un alias en Hotmail nos permite asociar una nueva dirección para poder ver los mensajes que se reciben en esta en nuestro correo normal. De la misma manera, podemos escribir mensajes desde nuestro correo normal, poniendo de remitente el alias. ¿Qué ventajas obtenemos con esto? En mi caso, al tener un correo largo, me puedo crear un alias más corto para poder registrarme en sitios, y que los correos de registro me lleguen directamente a otra carpeta, separada de la principal. Vamos a probar a configurarlo:

Le damos a “Crear un alias de Hotmail”, y elegimos nuestro nuevo alias.

Tras esto, seleccionamos si queremos crear una nueva carpeta para que ahí se redigiran los correos llegados, y ya está. Un momento, porqué no me funciona?? Claro, a Hotmail se le olvidó decirnos que nos lo tienen que activar. Tardan unas horas (a mi me tardaron unas 10 o así) en activarlo, y cuando lo hacen, te mandan un correo del estilo.

Sincronizar diferentes cuentas de correo en GMail

También soy de las personas que tienen varios correos y los usan, por lo que la sincronización con GMail me ha venido bastante bien.

Para empezar vamos a crear las etiquetas, cuyo nombre (en mi caso) serán el nombre de cada correo, para así tener un orden sencillito.

Posteriormente, vamos a “Configuración del correo”, y nos vamos a “Cuentas e Importación”, y en la parte de “Comprobar correo mediante POP3”, le damos a “Añadir cuenta de correo electrónico”

Ahí ya ponemos finalmente el correo, la contraseña, y seleccionamos los checkboxes de “Usar SSL” y “Etiquetar los mensajes entrantes”, a lo que seleccionaremos la etiqueta que creamos anteriormente.

Ahora bien, ya lo tenemos configurado, solo un par de aclaraciones.

  • Podemos poner cualquier correo, yo tengo dos de hotmail y uno de mi universidad.
  • Es un proceso que requiere actualización no inmediata, osea que puede que tarde en verse reflejado los correos. Igualmente, se le puede dar a “Comprobar correo electrónico” para ver si tenemos algo nuevo.
  • Cuando eliminamos un correo importado a nuestro GMail, se elimina en la cuenta. Si queremos que se mantenga, seleccionaremos el primer checkbox de la configuración.

¿Cuánta información lleva un tweet? y los identificadores de Twitter

Otro post más acerca de Twitter.. debe ser que estoy tan enganchado que no puedo pensar en otra cosa. Esta vez, quisiera hablar de los identificadores a la vez que averiguamos el contenido de un tweet (que, a pesar de lo que pueda parecer, no es poco precisamente).

Los identificadores numéricos nos permiten poner un orden a nuestra base de datos usándolos como Primary Key, sin embargo el usuario normal no necesita conocerlos para nada, así que no es un dato explícito tal y como lo sería nuestro nick en un foro por ejemplo.

Primero de todo, vamos a obtener el ID de un tweet, que es un procedimiento (si se puede llamar así) bastante sencillo, y para ello, hay que poner el ratón sobre el indicador del tiempo de cúando se envió el tweet.

Ahora sencillamente, mediante cualquier herramienta con la que podamos usar cURL (ya sea desde la consola de Linux o desde el Cygwin con Windows, o con PHP..) o incluso poniendo la URL en nuestro navegador (que nos pedirá de descargar un archivo .json el cual podremos abrir con cualquier editor de texto) hacemos una petición a al siguiente enlace: http://api.twitter.com/1/statuses/show.json?id=XXXXXXXXXXXXXX en donde XXXX.. es la ID del tweet.

Nos devolverá el siguiente resultado:
{“geo”:null
“coordinates”:null
“retweeted”:false
“in_reply_to_status_id_str”:null
“in_reply_to_user_id_str”:null
“retweet_count”:0
“contributors”:null
“user”:
—{“follow_request_sent”:false
—“verified”:false
—“profile_background_image_url_https”:”https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png”
—“profile_link_color”:”0084B4″
—“protected”:false
—“following”:false
—“profile_sidebar_border_color”:”C0DEED”
—“followers_count”:106
—“location”:”Burgos, Espa\u00f1a”
—“name”:”Juan Miguel Lipman”
—“default_profile”:true
—“favourites_count”:10
—“profile_use_background_image”:true
—“utc_offset”:3600
—“url”:”http:\/\/delanover.com”
—“description”:”Otaku. Computer Engineering student. PHP+MySQL Developer. Fedora user. Rammstein lover (as EBM, NDH and Melodic Death Metal music).”
—“listed_count”:6 —“time_zone”:”Madrid”
—“profile_background_color”:”C0DEED”
—“screen_name”:”jmlipman”
—“contributors_enabled”:false
—“notifications”:false
—“profile_background_image_url”:”http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png”
—“id_str”:”103288301″
—“show_all_inline_media”:false
—“geo_enabled”:true
—“lang”:”es”
—“created_at”:”Sat Jan 09 14:55:42 +0000 2010″
—“profile_text_color”:”333333″
—“default_profile_image”:false
—“profile_sidebar_fill_color”:”DDEEF6″
—“profile_image_url”:”http:\/\/a1.twimg.com\/profile_images\/1307866230\/MWSnap062_normal.jpg”
—“statuses_count”:9368
—“profile_background_tile”:false
—“friends_count”:84
—“profile_image_url_https”:”https:\/\/si0.twimg.com\/profile_images\/1307866230\/MWSnap062_normal.jpg”
—“id”:103288301
—“is_translator”:false
}
“in_reply_to_user_id”:null
“in_reply_to_status_id”:null
“id_str”:”118319553267761152″
“truncated”:false
“created_at”:”Mon Sep 26 13:42:34 +0000 2011″
“place”:null
“favorited”:false
“source”:”web”
“id”:118319553267761152
“in_reply_to_screen_name”:null
“text”:”Tweet de prueba para un post sobre Twitter en #Delanover”
}

Igual después de ver todo esto entendemos la cantidad de herramientas que hay para twitter que te dicen cosas como de dónde son tus followers o cuanto tiempo de antigüedad tiene la cuenta de twitter.

Para obtener el los datos de un usuario dado una ID (del propio usuario obviamente) simplemente tendriamos que mandar una petición del tipo: http://api.twitter.com/1/users/show.json?id=XXXXXXX.

Y para recorrer el camino inverso, es decir, obtener el nombre de usuario a partir de una ID, simplemente sería cambiar el ID de antes por ‘screen_name=nick’ de forma que quedaria: http://api.twitter.com/1/users/show.json?screen_name=NICK

En general, disponemos de un listado interesante de peticiones que podemos realizar, que como dije es el que usan muchas aplicaciones, justo aquí.

Breve introducción a la programación con CUDA: Guía de Instalación, Códigos y Compilación

Índice:
1.-Introducción
2.-Instalación
2.1.-Configurando Visual Studio 2008
3.-Compilación
3.1.-Hola Mundo
3.2.-Jugando con la memoria

1.-Introducción

La tecnología CUDA (Compute Unified Device Architecture) es una arquitectura de computación paralela desarrollada por nVidia lanzada en 2007. Esta tecnología permite a los programadores desarrollar aplicaciones o programas que se ejecuten en la GPU de la tarjeta gráfica. Este lenguaje es una variación de C, por lo que los que lo conocen, ya tienen una gran ventaja.

No me quiero extender mucho más en la introducción para pasar a lo importante cuanto antes, ya que si has venido buscando cómo empezar a programar en CUDA es de suponer que sabes lo que es.

2.-Instalación

Para empezar, nos descargaremos el Visual Studio 2008 Express (Versión de C++) ya que lo usaremos para escribir y compilar nuestro código (opcional).

Por otra parte, nos tenemos que descargar los archivos relacionados con CUDA, que son dos (o tres, este último que explicaremos será opcional). Todos ellos, los descargaremos de aquí. Por un lado, necesitamos los drivers para CUDA, en los que, importante, no son los mismos para portátiles que para ordenadores de sobremesa.

Por otro lado, nos descargaremos el CUDA Toolkit, que es el que tiene los archivos para los desarrolladores (compilador y demás). Finalmente, y de manera opcional, podemos descargarnos el “CUDA SDK code samples” que incluye códigos de muestra para veamos si funciona.
Si tenemos algún problema en la instalación, podemos probar a reinstalar los drivers (normales) de nuestra tarjeta.

Por otra parte, si no sabemos si nuestra tarjeta tiene CUDA, podemos consultarlo aquí.

2.1.-Configurando Visual Studio 2008

Tras instalar el SDK, en la ruta por defecto de instalación (C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\SDK Browser) encontraremos un archivo llamado browser.exe, que es el navegador (como su propio nombre indica) sobre el cual podremos ver los archivos de muestra y correrlos para verlos funcionar.

A continuación le daremos a cualquier “Files”, ya que realmente todos nos llevan al mismo directorio (siendo que deberian de llevar cada uno a su propio directorio pero bueno). Si no, directamente nos dirigiremos a C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\src.

Nos metemos en una carpeta cualquiera, en este caso, la de templates y abrimos el fichero template_vc90.sln. Se deberia de abrir con el Visual Studio 2008.

Como podemos observar, es un proyecto formado por 3 ficheros, de los cuales podemos ver que hay algunos con extensión cu. Efectivamente, “cu” va a ser la extensión del código fuente en CUDA. Por otra parte, podemos observar que no nos aparece el código coloreado, sin embargo si que aparece coloreado en el fichero .cpp

Para ello, nos dirigiremos a Herramientas -> Opciones -> Editor de texto -> Extensiones de archivo, y escribiremos “cu” (sin el punto) y le daremos a “Añadir”. Posteriormente, si reiniciamos el Visual Studio ya nos pondrá bien la sintaxis.

Por otra parte, también querremos que las palabras reservadas nos las coloree para que quede más bonito y sencillo a la vista. Para ello, nos dirigiremos a C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\doc\syntax_highlighting\visual_studio_8 y abrimos el archivo usertype.dat con algún editor de texto. Como podremos ver, contiene palabras reservadas, que son las que se volverán de color azul al escribirlas en el VS2K8. Copiamos este archivo, y lo llevamos a la siguiente ruta: C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE. Como dije anteriormente, reiniciamos el Visual Studio y podremos ver la nueva sintaxis remarcada.

3.-Compilación

A pesar de haber configurado el Visual C++, al ser nuestra primera compilación, la haremos directamente desde la consola de Windows. Usaremos dos códigos sencillitos, sacados de aquí.

3.1.-Hola Mundo

Como viene muy bien explicado, poco más he de añadir. En este primer ejemplo, simplemente añadiremos la cabecera cuda.h para que comprobemos que, en caso de no tenerlo, nos daria un error.

Lo guardamos como hola.cu en el escritorio por ejemplo, y nos vamos a la consola, usando el NVCC.

//Agregamos libreria standard
#include 
//Agregamos libreria cuda
#include 
//Funcion principal
main()
{
    //Imprimimos texto y salto de linea
    printf("Hola mundo\n");
}

3.2.-Jugando con la memoria

Con este código, tocaremos un poco la memoria interna de nuestra GPU, también viene bastante bien explicado:

//Libreria estandar
#include 
//Libreria cuda
#include 

//Definimos el tamanio de nuestro array
#define SIZE 128

//Funcion principal
main()
{
    //Definimos
    float *array_pc;    //Aqui guardaremos el array en nuestra RAM
    float *array_pc2;    //Aqui guardaremos la lectura del array cuando vuelva de la grafica
    float *array_grafica;    //Usaremos este puntero para el array en la grafica.
    size_t totaltamanio = sizeof(float)*SIZE;    //Calculamos el tamanio que tendra nuestro array
    int i;            //Variable auxiliar para utilizar en bucle.

    //Reservamos espacio para los arrays de nuestra RAM
    array_pc = (float *)malloc(totaltamanio);
    array_pc2 = (float *)malloc(totaltamanio);
    //Reservamos espacio para el array de nuestra grafica
    cudaMalloc((void **)&array_grafica,totaltamanio);

    //Bucle de 0 a SIZE (Sin incluir SIZE)
    for(i=0;i

Y tras ejecutarlo:

Algunos comandos de nmap

Lejos de ser una entrada dedicada al intenso estudio sobre esta herramienta de escaneo de puertos, simplemente queria poner algunas opciones que me son útiles y que alguna vez se me olvidan, y como a mi, seguro que a muchos otros igual, por lo que simplemente quería apuntarlas en un post.

Quien quiera una documentación completa, muy buena por cierto, que vaya a la página oficial en donde incluso se encuentra en español una guia bastante interesante: Guía de referencia de Nmap.

-Escaneando todas las direcciones de red (desde 192.168.1.0 hasta 192.168.1.255)
-Escaneando puertos (3 formas distintas)
-Adivinar el sistema operativo de un dispositivo

Escaneando todas las direcciones de la red (desde 192.168.1.0 hasta 192.168.1.255)

nmap -sP 192.168.1.0/24
Resultado:

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-11 22:17 CEST
Nmap scan report for www.brntech.com.tw (192.168.1.1)
Host is up (0.0032s latency).
MAC Address: xX:XX:XX:XX:XX:XX (Unknown)
Nmap scan report for 192.168.1.100
Host is up (0.012s latency).
MAC Address: 00:XX:XX:XX:XX:XX (Intel Corporate)
Nmap scan report for 192.168.1.102
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 4.50 seconds

Como podemos ver, nos devuelve la dirección del router, de otro dispositivo conectado a la red, y por último, el nuestro.

Escaneando puertos

Podemos escanear uno o varios puertos (separados por comas) de una dirección específica:
nmap -p 135,155 192.168.1.100

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-11 22:28 CEST
Nmap scan report for 192.168.1.100
Host is up (0.0063s latency).
PORT STATE SERVICE
135/tcp open msrpc
155/tcp filtered unknown
MAC Address: 00:XX:XX:XX:XX:XX (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 1.37 seconds

O incluso buscar si está abierto un puerto específico (o los que sean) en cualquier dispositivo de toda la red:
nmap -p 135,155 192.168.1.1/24

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-11 22:29 CEST
Nmap scan report for www.brntech.com.tw (192.168.1.1)
Host is up (0.0089s latency).
PORT STATE SERVICE
135/tcp open msrpc
155/tcp closed unknown
MAC Address: 00:XX:XX:XX:XX:XX (Unknown)

Nmap scan report for 192.168.2.100
Host is up (0.017s latency).
PORT STATE SERVICE
135/tcp open msrpc
155/tcp filtered unknown
MAC Address: 00:XX:XX:XX:XX:XX (Intel Corporate)

Nmap scan report for 192.168.2.102
Host is up (0.000076s latency).
PORT STATE SERVICE
135/tcp closed msrpc
155/tcp closed unknown

Nmap done: 256 IP addresses (3 hosts up) scanned in 5.66 seconds

O si no, directamente buscar todos los puertos que tenga abierto una dirección:
nmap 192.168.2.100

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-11 22:50 CEST
Nmap scan report for 192.168.2.100
Host is up (0.040s latency).
Not shown: 993 filtered ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
554/tcp open rtsp
2869/tcp open unknown
5357/tcp open unknown
10243/tcp open unknown
MAC Address: 00:XX:XX:XX:XX:XX (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 19.53 seconds

Adivinar el sistema operativo de un dispositivo

El funcionamiento de esto se basa en que, nmpa envía a la máquina objetivo una serie de paquetes. Posteriormente analiza los bits de las respuestas recibidas y este resultado lo compara con una base de datos.

nmap -O 192.168.1.100

Starting Nmap 5.21 ( http://nmap.org ) at 2011-06-11 22:32 CEST
Nmap scan report for 192.168.1.100
Host is up (0.031s latency).
Not shown: 993 filtered ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
554/tcp open rtsp
2869/tcp open unknown
5357/tcp open unknown
10243/tcp open unknown
MAC Address: 00:XX:XX:XX:XX:XX (Intel Corporate)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING) : Microsoft Windows Vista|2008|7 (93%)
Aggressive OS guesses: Microsoft Windows Vista Home Premium SP1 (93%), Microsoft Windows Vista SP0 or SP1, Server 2008 SP1, or Windows 7 (93%), Microsoft Windows Server 2008 Beta 3 (88%), Microsoft Windows Vista Business SP1 (88%), Microsoft Windows Vista Home Premium SP1 or Windows 7 (87%), Microsoft Windows 7 (85%), Microsoft Windows Vista SP1 (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.98 seconds

Saludos, lipman