miércoles, 30 de abril de 2008

Un par de TIPs rápidos sobre túneles SSH

Esto iban a ser un par de comandos para el apartado ful scripts, pero luego he pensado que quizá merecía la pena montar un mini-artículo que explicase de qué iba el tema.

  • Túnel a través de ssh

  • Muchas veces tenemos que acceder a servicios de una LAN que no están accesibles directamente desde internet; sin embargo, sí tenemos conexión de ssh.
    La solución es muy sencilla, crear un tunel a través del ssh (esto se puede hacer también a través del putty si tienes la desgracia de que el S.O. del cliente es un windows...

    Escenario:
    • Servicio ssh escuchando en internet en la IP pública 64.233.183.99
    • En otra máquina dentro de la misma LAN está escuchando una BBDD postgres en la IP 192.168.10.69 en el puerto 5432
    • Conectamos nuestro portátil a una Wireless que algún alma caritativa tiene abierta (0 no) y creamos un túnel con el siguiente comando:
    ssh -CvNL 5432:192.168.10.69:5432 bpk@64.233.183.99

    Explicando rápidamente el tema:
    • C -->Habilita la compresión, para minimizar el uso de ancho de banda
    • v -->Verbose. Útil para ver cuando y cómo se establecen las conexiones dentro del tunel.
    • N -->Para que no levante una shell ni permita ejecutar comandos en el servidor destino. Útil si tenemos un usuario para estos menesteres que no tiene shell
    • L -->Con este parámetro estamos levantando el túnel que necesitamos. Concretamente le estamos diciendo que escuche en el puerto local del protátil 5432 y que lo que reciba por ahí lo reenvíe a la IP 192.168.10.69 al puerto 5432 a través de la conexión SSH.
    • usuario@IP_pública -->Los datos con los que levantaríamos una conexión típica de SSH.
    Una vez establecida la conexión SSH sólo tendremos que decirle a nuestro cliente preferido de postgres que se conecte a la IP local 127.0.0.1 en el puerto 5432 y listo.


    Otro posible escenario sería:
    • Servicio ssh escuchando en internet en la IP pública 89.185.234.89
    • En otra máquina dentro de la misma LAN tiene montado un servidor FTP que sólo está accesible desde dentro de la red con la IP 172.26.0.69
    • Tenemos que realizar un backup del pr0n en nuestro portátil. Para ello creamos el túnel con el siguiente comando:
    ssh -CvNL 10000:172.26.0.69:21 bpk@89.185.234.89

    Y desde otro terminal:
    ftp 127.0.0.1 10000

    La idea es la misma, aunque creo que es más intuitivo así.


    Este tipo de túneles se pueden empalmar para ir saltando de máquina en máquina dentro de las distintas subredes de la empresa, pero no quiero complicar el ejemplo, así que eso queda como deberes para cuando lo necesitéis ^_~

  • Túnel Dinámico a través de ssh

  • Otro uso práctico de túneles. En este caso túneles dinámicos.
    Si estáis en una red no confiable (sipe, lo sé, todas las redes son no confiables, pero unas lo son menos que otras). Pongamos por caso que el vecino con wireless que mencionaba más arriba es un pequeño cabroncete, y le encanta jugar con nuestro tráfico de formas que no nos resultan agradables (no como lo haría la madre de Juako). A través de ssh podemos levantar un túnel dinámico que se comportará como un proxy SOCKS y sólo tendremos que configurar nuestro navegador (o la aplicación que sea) para que utilice el proxy que hemos creado. Por supuesto, conseguiríamos el mismo resultado con una VPN, pero este método tiene la ventaja de que no tenemos que montar ningún servicio adicional y siempre es más común tener un ssh escuchando que una VPN montada.

    Escenario:
    • Servicio ssh escuchando en la IP pública 64.233.183.99 (máqina dentro de una red confiable)
    • Ejecutamos el siguiente comando en el portátil que está conectado a internet desde la WIFI del vecino cabrón.
    ssh -CvND 7777 bpk@64.233.183.99

    En este caso, la 'D' es la encargada de levantar el túnel dinámico, y el puerto en el que el que está escuchando el proxy SOCKS es el 7777


    Notas referentes al firefox:

    Recomiendo usar Add-ons como FoxyProxy para poder alternar configuraciones de distintos proxys (dinámicos, TOR, SQUID...) de una forma rápida y cómoda.

    Si vamos a tunelar el tráfico, conviene comprobar que el parámetro "network.proxy.socks_remote_dns" esté en "true" para que así vaya también por el túnel.
    Para comprobar/cambiar el valor: En la barra de direcciones del firefox vamos a "about:config" y buscamos este parámetro (podemos filtrar por "dns" para encontrarlo antes)


    UPDATE - Notas referentes al servidor SSH:

    Si tienes problemas y no funciona el túnel, comprobar que está habilitado en el servidor. Para ello editar el archivo de configuración /etc/ssh/sshd_config y buscar el siguiente parámetro:
    AllowTcpForwarding yes

    Y ya que estáis editando el archivo, no está de más capar el acceso a root como medida de seguridad:
    PermitRootLogin no

    viernes, 22 de febrero de 2008

    UTF8 en Wordpress

    A parte del sufrimiento anteriormente mencionado tambien me ocurrio que derrepente se dejaron de ver los acentos, eñes etc... (Esto no fue culpa del isp... fue solo mia :P)

    Despues de estar haciendo locales-gen, ejecutar castellanizar y varias cosillas mas que encontre googleando sin ningun resultado me hice un

    grep 8859 /etc/* -R

    Encontre lo que creo que soluciono el tema por un lado para poner utf8 en apache editamos nuestro archivo de configuracion de apache :

    nano -w /etc/apache2/apache2.conf

    Y buscamos AddDefaultCharset y lo ponemos para que por defecto pille utf8

    AddDefaultCharset UTF-8

    Despues editamos la configuracion de php ...

    nano -w /etc/php5/apache2/php.ini

    Para hacer casi lo mismo, buscamos default_charset para ponerle que por defecto pille utf8

    default_charset = "utf-8"

    Con esto ultimo un script que tenia de prueba con un echo con acentos, eñes, etc... ya funcionaba, pero los caracteres especiales en los datos que escupia el wordpress de la base de datos mysql seguian apareciendo mal.

    Acordandome de la config que tiene el wp tenia referencia a una locale y gracias a que 5 minutos antes mi boss me recordo que el mysql utilizaba un tipo de codificacion que "raro" (Si me lo dices 10 minutos antes seguro que se me olvida), para ser mas exactos era la : utf8_general_ci modifique el archivo de configuracion del wordpress para poner esta ultima en vez de utf8 en el DB_CHARSET.

    define('DB_CHARSET', 'utf8_general_ci');

    Y todo volvio a la normalidad... ha sido una semana muy, muy, pero que muy.... dura

    Wordpress lentisimo, casi parado, derrepente....

    En un lugar de la red, de cuyo nombre no quiero acordarme, hospedaba un ISP malvado como el solo.

    Un dia y coincidiendo con unos cambios que habia realizado el dia anterior empezo a ir lentisimo los sites que tenia hospedados en un servidor dedicado (unos 160 €/mes ... casi na).

    Como coincidio con los cambios realizados por mi, en un servidor que administro yo, lo mas logico fue pensar que la habia cagado de alguna forma. Despues de mirar codigo cambiar todo, poner un wordpress nuevecito y ver que seguia iendo lento descubri, por pura casualidad, que el propio servidor no resolvia nombres.

    Edite el resolv.conf puse unos nuevos dns y ya iba como un tiro...

    Casi lloro de dolor (Menos mal que bpk estuvo a mi lado consolandome...)

    Moraleja, antes de ponerte a hacer straces (o como se llame lo que hace bpk para ver donde se cuelgan/sobrecargan las apps) mira bien que tu isp no te la jugo, no te pase como a mi y te tires 4 horas con semejante locura.

    miércoles, 20 de febrero de 2008

    Recuperar archivos borrados en ext3

    Usaremos los comandos siguientes :
    debugfs, para saber los bloques
    dls, para volcar contenidos

    Conviene leerselo antes de que la hayas cagado...

    1) Apagas a capon (nada de shutdown ni halts ni inits a ser posible) para evitar que se escriban nuevos datos en los espacios de los borrados

    2) Arrancas otro linux (desde hd o usb a ser posible para escribir los archivos recuperados)

    3) Imaginamos que el hdb1 es la particion donde perdimos los datos, hacemos :
    debugfs /dev/hdb1

    4) Vamos al directorio donde borramos los archivos
    debugfs : cd /home/web/src/blog/scripts

    5) Hacemos un ls -d para ver los inodes de los archivos borrados
    debugfs : ls -d

    Nos devolvera algo como esto :

    211095 (12) . 210082 (4084) .. <209240> (56) variables.cfg
    <211150> (32) basic-crear-bbdd.sh <211151> (4016) vssver.scc
    <211301> (40) alac-update-a-lastest-engine.sh
    <209241> (68) perso-update-a-lastest-engine.sh
    <211150> (28) blog-crear-bbdd.sh
    <210646> (3888) src-actualizar-lastest-engine.sh
    los numeros entre <> son los inodes


    6) Hayamos el grupo de bloques donde se encuentra el inode de los archivos con imap <inode> (Con <> incluido)
    debugfs : imap <209240>

    Nos devolvera algo como esto :

    Inode 209240 is part of block group 13
    located at block 426000, offset 0x0b80
    los numeros entre <210646> son los inodes


    Para este caso ya sabemos que es el 13

    7) Hayamos de que bloque a que bloque esta el grupo con stats
    debugfs : stats

    Nos devolvera algo como esto :


    Filesystem volume name: /
    Last mounted on:
    Filesystem UUID: 39ab69c0-e7e2-4a09-87e8-10037fcc2c4b
    Filesystem magic number: 0xEF53
    Filesystem revision #: 1 (dynamic)
    Filesystem features: has_journal filetype sparse_super
    Default mount options: (none)
    Filesystem state: clean
    Errors behavior: Continue
    Filesystem OS type: Linux
    Inode count: 497984
    Block count: 996022
    Reserved block count: 49801
    Free blocks: 757815
    Free inodes: 442389
    First block: 0
    Block size: 4096
    Fragment size: 4096
    Blocks per group: 32768
    Fragments per group: 32768
    Inodes per group: 16064
    Inode blocks per group: 502
    Last mount time: Tue Feb 19 11:11:35 2008
    Last write time: Wed Feb 20 09:49:25 2008
    Mount count: 14
    Maximum mount count: 30
    Last checked: Thu Jan 10 12:17:41 2008
    Check interval: 0 ()
    Reserved blocks uid: 0 (user root)
    Reserved blocks gid: 0 (group root)
    First inode: 11
    Inode size: 128
    Journal inode: 8
    Journal backup: inode blocks
    Directories: 3939
    Group 0: block bitmap at 2, inode bitmap at 3, inode table at 4
    22861 free blocks, 15910 free inodes, 34 used directories
    Group 1: block bitmap at 32770, inode bitmap at 32771, inode table at 32772
    31451 free blocks, 14577 free inodes, 3 used directories
    Group 2: block bitmap at 65536, inode bitmap at 65537, inode table at 65540
    29671 free blocks, 14596 free inodes, 62 used directories
    Group 3: block bitmap at 98306, inode bitmap at 98307, inode table at 98308
    30286 free blocks, 15010 free inodes, 67 used directories
    Group 4: block bitmap at 131072, inode bitmap at 131073, inode table at 131076
    20250 free blocks, 15340 free inodes, 5 used directories
    Group 5: block bitmap at 163842, inode bitmap at 163843, inode table at 163844
    27584 free blocks, 14913 free inodes, 105 used directories
    Group 6: block bitmap at 196608, inode bitmap at 196609, inode table at 196612
    24565 free blocks, 13511 free inodes, 239 used directories
    Group 7: block bitmap at 229378, inode bitmap at 229379, inode table at 229380
    30981 free blocks, 14879 free inodes, 30 used directories
    Group 8: block bitmap at 262144, inode bitmap at 262145, inode table at 262148
    26882 free blocks, 14216 free inodes, 129 used directories
    Group 9: block bitmap at 294914, inode bitmap at 294915, inode table at 294916
    28672 free blocks, 14694 free inodes, 105 used directories
    Group 10: block bitmap at 327680, inode bitmap at 327681, inode table at 327684
    21608 free blocks, 14267 free inodes, 117 used directories
    Group 11: block bitmap at 360448, inode bitmap at 360449, inode table at 360452
    29480 free blocks, 14500 free inodes, 87 used directories
    Group 12: block bitmap at 393216, inode bitmap at 393217, inode table at 393220
    21167 free blocks, 14793 free inodes, 84 used directories
    Group 13: block bitmap at 425984, inode bitmap at 425985, inode table at 425988
    20193 free blocks, 12784 free inodes, 305 used directories

    Group 14: block bitmap at 458752, inode bitmap at 458753, inode table at 458756
    29393 free blocks, 14664 free inodes, 100 used directories
    Group 15: block bitmap at 491520, inode bitmap at 491521, inode table at 491524
    26638 free blocks, 13954 free inodes, 42 used directories
    Group 16: block bitmap at 524288, inode bitmap at 524289, inode table at 524292
    27210 free blocks, 12036 free inodes, 30 used directories
    Group 17: block bitmap at 557056, inode bitmap at 557057, inode table at 557060


    Lo que nos interesa para este caso es los Blocks per group y el Group 13

    Blocks per group : 32768
    Group 13: block bitmap at 425984, inode bitmap at 425985, inode table at 425988


    Nos da que empieza en 425984 (Esto es igual a multiplicar [Group] * [Blocks per group] 13 * 32768) y termina en 425984 + 32768 - 1 = 458751 ([Donde empieza] + [Blocks per group] - 1)

    ya nos podemos salir de debugfs
    debugfs : q

    8) Volcamos los datos a un archivo con dls -eA dispositivo bloqueini-bloquefin > archivo
    dls -eA /dev/hdb1 425984-458751 > /tmp/volcado.dls

    Con esto conseguimos que sea mucho menor el espacio donde tenemos que buscar. (128 Mb en este caso)

    9) En mi caso necesitaba recuperar archivos de texto plano, asi que hice un less del archivo y fui buscando los datos que necesitaba, luego copy y paste a un nuevo archivo. Ademas todos los archivos estaban en el mismo grupo, con lo que no me hizo falta volcar mas grupos de bloques.
    less /tmp/volcado.dls

    Estuve intentando usar foremost pero fui incapaz de hacerlo funcionar con esos archivos, me recuperaba un puñao de ficheros pero no lo que necesitaba.

    muchisimas gracias a este post : http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/

    viernes, 8 de febrero de 2008

    Notas sobre mplayer

    Antes de nada el necesario disclaimer: Mi configuración dista mucho de ser perfecta pero a mí me vale. No he tenido la necesidad de pegarme demasiado con las USE de gentoo - al menos en lo referente a mplayer - así que seguro que se podrá mejorar; pero sí puedo decir que puedo reproducir todo lo que necesito y como yo quiero, que no es poco ^_^

    • USE flags en gentoo referentes a mplayer

    • Las USE que yo estoy utilizando:
      bpk@osaka:$ grep USE /etc/make.conf
      USE="a52 aac bash-completion bzip2 cdparanoia cups doc dts dvd dvdr dvdread examples faad ffmpeg flac id3 ipod java live lzo matroska mp4 mpeg2 nptl nptlonly nvidia openal ppds samba screen svg theora vcd wma x264 xanim xvid -berkdb -gnome -ipv6 -arts -esd freetype utempter mjpeg"


      Las USE concretas referente al tema de reproducción multimedia con el mplayer son [1]
      a52, Enables support for decoding ATSC A/52 streams used in DVD
      aac, Enables support for MPEG-4 AAC Audio
      dts [2], Enables DTS Coherent Acoustics decoder support
      dvd, Adds support for DVDs
      dvdr, Adds support for DVD writer hardware (e.g. in xcdroast)
      dvdread [3], Enables usage of Ogle's libdvdread for DVD playback
      faad [4], ---
      ffmpeg, Enable ffmpeg-based audio/video codec support
      flac, Adds support for FLAC: Free Lossless Audio Codec
      live, Enables live.com streaming media support
      matroska, Adds support for the matroska container format
      openal, Adds support for the Open Audio Library
      theora, Adds support for the Theora Video Compression Codec
      vcd, Video CD support
      xanim, Enables support for xanim based codecs
      xvid, Adds support for xvid.org's open-source mpeg-4 codec

      Las USE referentes al tema de (re)codificación
      cdparanoia, Enables cdparanoia (audio CD ripper) support
      mp4, Enables mp4 encoding support
      wma [5], Add support for wma files through mplayer.
      x264, Enable h264 encoding using x264
      mjpeg [6], Enables mjpegtools support

      En el apartado media-video de la página de la que he sacado las descripciones de las USE [1] hay un par de tablas muy interesantes acerca de las que se pueden utilizar para los principales reproductores.

    • Parámetros mplayer

    • Una vez tengamos el mplayer instalado a nuestro gusto, tendremos que configurarlo de cara a nuestras necesidades.
      Para ello tenemos los archivos mplayer.conf y gui.conf, para el mplayer(-bin) y gmplayer(-bin) respectivamente. Además hay que tener en cuenta que, como muchos programas en linux, estos ficheros pueden estar en /etc (para que la configuración sea genérica para cualquier usuario) o en $HOME/.mplayer/ (configuración específica para cada usuario). El mplayer hace caso en este orden: 1º parámetros de ejecución. 2º Config de usuario. 3ª Config global.
      Respecto a las principales par'ametros que yo tengo puestos en el mplayer.conf, son los siguientes (no estoy seguro de si se son exáctamente igual los parámetros en el archivo gui.conf):

      Parámetros mplayer.conf
      vo=xv Usa la extensión XVideo de XFree86 4.x para activar la reproducción acelerada por hardware.
      double=yes Double buffering, recomendado para el tema de subtítulos.
      ao=alsa [7] Utiliza el controlador ALSA.
      monitoraspect=4:3 Especificamos el tipo de monitor.
      font="Bitstream Vera Sans" [8] Le especificamos que fuente utilizar.
      subfont-osd-scale=4 Establece el coeficiente de autoescala de los elementos del OSD.
      subfont-text-scale=3 Tamaño de las fuentes especificando la escala.

      Por supuesto hay muchos más, pero no tiene sentido extenderse. Lo suyo es ir mirando en el man de mplayer para cada cosa que queramos ir tocando ^_^

    • alias

    • Como yo utilizo el PC como HTPC y como PC de escritorio, suelo tirar de alias para reproducir las cosas dependiendo de donde/lo que me interese. Hay que tener en cuenta que es una gentoo de 64bits, así que uso mplayer / mplayer-bin / gmplayer / gmplayer-bin dependiendo de lo que me interese. Por simplificar pongo los ejemplos con el gmplayer.
      bpk@osaka:$ grep mplayer /home/bpk/.bash_aliases
      alias gmplayer_dolby_dts="gmplayer -ac hwdts,hwac3, -monitoraspect 16:9 -sws 9 -vf scale=1280:-2"
      alias gmplayer_dvd="gmplayer -ac hwdts,hwac3, -monitoraspect 16:9 -sws 9 -vf scale=1280:-2 dvd:// -dvd-device"
      alias gmplayer_entrelazado="gmplayer -ac hwdts,hwac3, -monitoraspect 16:9 -sws 9 -vf scale=1280:-2 -vf pp=hb/vb/dr/al/lb/tn:1:2:3"
      alias gmplayer_entrelazado2="gmplayer -ac hwdts,hwac3, -monitoraspect 16:9 -sws 9 -vf scale=1280:-2 -vf pp=fd"


    • kutre-scripts

    • Por último, tengo unos kutre-scripts que utilizo para que Staryu reproduzca las películas a golpe de ratón.
      Escenario: En F7 tengo levantadas unas KDE que sólo se ven desde el monitor del PC. En F8 tengo levantadas unas X con un eterm que se ven desde el proye y el monitor y que tienen la resolución nativa del proye.
      Para levantar las X de F8:
      bpk@osaka:$ cat X_720p
      #!/bin/sh
      X :1 -layout "Proye_720" & > /dev/null
      DISPLAY=:1 Eterm --geometry 210x53
      xhost +

      Para reproducir el archivo en F8. Tengo asociado el script como acción principal para determinados tipos de archivos y así que se reproduzcan los videos en F8.
      bpk@osaka:$ cat reproductor_proye
      #!/bin/sh
      export DISPLAY=:1
      chvt 8 & gmplayer-bin -ac hwdts,hwac3, -monitoraspect 16:9 -sws 9 -vf scale=1280:-2 "$1" && chvt 7
      export DISPLAY=:0

      Para reproducir carpetas que contienen un backup de DVD en su interior.
      bpk@osaka:$ cat dvd_proye
      #!/bin/sh
      kdialog --title "NOTA INFORMATIVA" --msgbox " Para que esto funcione, hay que 'clickar' sobre la carpeta SUPERIOR A VIDEO_TS. \
      De lo contrario no funcionará... Good luck ^_^"
      export DISPLAY=:1
      chvt 8 & xine -f dvd:///"$1" && chvt 7
      export DISPLAY=:0

      Faltan un montón de cosas: ajustar temas de offset, posición de subs, ventajas y desventajas de los distintos filtrados por software y hardware, etc. pero como cada persona necesita ajustar todos esos parámetros personalmente, no tiene sentido que me meta en ese fregado.

    Tampoco me quiero meter en configuración de Xorg y demás zarandajas, pero si hace falta las subo a algún lado, que no son nada del otro mundo.

    [1] listado de USE flags
    [2] Desde el 7 de enero gentoo prefiere libdca a libdts: "Remove unused versions still depending only libdts because it's getting removed in favour of libdca." mplayer changelog
    [3] Habitualmente no utilizo Ogle, pero lo tengo instalado para hacer pruebas alguna vez.
    [4] No he encontrado info referente a esta USE, así que supongo que ya no tiene sentido tenerla. Lo que sí he encontrado es el paquete faad2.
    -media-libs/faad2. AAC audio decoding library
    [5] El paquete dir2ogg se encarga de realizar la conversión--> media-sound/dir2ogg: Converts Mp3, M4a, Wma, and Wav files to Ogg Vorbis format.
    [6] El paquete /media-video/transcode tira de media-video/mjpegtools
    [7] Con antiguas configuraciones de alsa + mplayer he tenido que especificarle el dispositivo. Por ejemplo:ao=alsa:device=spdif ó ao=alsa:device=hw=0.0
    [8] En mi caso utilizo fuentes truetype font=/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf"

    viernes, 11 de enero de 2008

    Aumix - una forma de controlar el volumen en los script

    Un pequeño complemento del artículo anterior... además de un método alternativo para controlar el volumen (para pisar el kurro de MoZ exclusivamente, que conste ~_^)

    Concretamente voy a contar lo que hace aumix, para los que no lo conozcan. Según el man "This program adjusts the settings of an audio mixing device. It can be used from the command line, in scripts, or interactively with the keyboard or mouse."
    Que viene a decir que es un programa para controlar los volúmenes y que se puede manejar desde la linea de comandos, scripts, o interactívamente.

    A continuación unos ejemplos de uso. Aunque es muy sencillo de usar y en el manual está muy bien explicado.

    Para ver qué volúmenes tenemos actualmente:
    bpk@osaka:~$ aumix -q
    vol 80, 80, R
    pcm 90, 90
    mic 100, 100, P
    igain 0, 0


    Creamos un directorio donde guardaremos los perfiles:
    mkdir $HOME/.aumix/

    Grabamos la configuración actual de los altavoces (se grabará en $HOME/.aumixrc):
    aumix -f $HOME/.aumix/default -S

    Modificaremos los volúmenes que queramos para un perfil concreto y lo grabaremos en $HOME/.aumix/
    Creamos un perfil para silenciarlos:
    aumix -v0 -c0 -l0 -m0 -w0 -W0 -f $HOME/.aumix/mute -S -q

    Creamos un perfil con el volumen al que nos gusta jugar al quake:
    aumix -v75 -m60 -w90 -W0 -f $HOME/.aumix/quake -S -q

    Una vez tengamos creados los perfiles, podemos cargarlos de la siguiente forma:
    aumix -f $HOME/.aumix/perfil_audio -L

    Para lo que es realmente útil aumix, es para scriptear nuestras aplicaciones. Perogrullada de ejemplo:
    bpk@soaka:~$cat quake.sh
    #!/bin/sh
    aumix -f $HOME/.aumix/quake
    /opt/quake3/bin/quake3



    Un par de apuntes.

    El aumix ejecuta secuencialmente todo los parámetros que le indiquemos. Así que si ponemos el -q al principio, nos devolverá los valores antes de efectuar los
    cambios.
    Por ejemplo, cuidado si indicamos el -S antes de -f $HOME/.aumix/mute, porque grabará la configuración en el archivo por defecto $HOME/.aumixrc

    En mi caso concreto, los único volúmenes que tengo que tocar en el portátil son -v (Volumen principal) -w (PCM), pero eso dependerá de las conexiones que use cada uno. En el manual indica a qué canal corresponde a cada letra.

    miércoles, 9 de enero de 2008

    Script para silenciar-dessilenciar altavoces, cascos...

    Quien no tiene hoy en dia un ordenador con 40 salidas de audio de minijack (o mas) front, rear, supu... Normalmente para el dia a dia solo sueles usar alguna de estas. Muchos, como yo no tenemos altavoces 5.1 (7.1, 8.1 .... cuando parara...) para el ordena, para lo que lo usamos es para currar, escuchar musica y pa echarnos unos quakes a lo sumo. Normalmente tendras los altavoces estero (con o sin subwofer) y unos cascos. Dependiendo de la tarea y del entorno usaras cascos o altavoces y es posible que o tengas el duplicador de front con cascos y altavoces a la vez enchufados o que tengas que agacharte y mirarle el culo a tu precioso ordenador para cambiar mini-jacks cada vez que quieras cambiar de altavoces a cascos...

    ¡¡¡Bueno pues se acabo!!!
    Se acabo el agacharte para poner los cascos y asi poder ver p*rn*... pelicul... series de.... (¿hay algo que no este prohibido aun y sea socialmente aceptable...?) a, si, videos de tus amigos en sus vacaciones en la palma en youtube el tener apagado los altavoces y escuchar un sonidillo de fondo en los cascos, con los mensajes del chuceras de turno que esta conectado a las 3 am al gaim, molestando asi tus dulces sueños.

    Lo primero es duplicar el audio que sale por los altavoces principales salga tambien por los altavoces traseros :

    En alsamixer, Duplicate Front, que este en on ([00])

    Gracias a esto podras tener conectados altavoces y cascos a la vez y te sonara estereo por ambos.

    Ahora creamos un script que vamos a llamar switch-alsa-output ...
    (En el caso de mi tarjeta el master es el front.... npi de porque)
    ... en el que ponemos el siguiente codigo :

    if amixer get Master | grep off; then
      amixer -q set Master unmute;
      amixer -q set Surround mute;
    else
      amixer -q set Master mute;
      amixer -q set Surround unmute;
    fi


    Ejecutamos y comprobamos que cambia la salida del audio de uno a otro.

    Ya como ultimo paso me meti como root, copie el script a /usr/local/bin

    su
    cp switch-alsa-output /usr/local/bin


    Cambie permisos

    chown root:audio /usr/local/bin/switch-alsa-output
    chmod 750 /usr/local/bin/switch-alsa-output


    audio es el grupo de usuarios que tienen acceso al audio del sistema en gentoo... No se como sera en otras distros...

    Salud3!

    El 99% del script esta sacado de aqui :: http://www.esdebian.org/forum/viewtopic.php?forum=38&showtopic=91279

    Gracias infinitas a elsenyordelcaos por su aportacion.

    viernes, 9 de noviembre de 2007

    Skype 2 32bits para Linux amd64

    Skype 2 for Linux with video
    (con soporte de Video!!!)

    1. Bajar el Skype 2.0 en Static.
    2. Descomprimir en /opt/skype.
    3. Instalar paquete ia32-libs.
    4. Ejecutar el comando:
      ldd /opt/skype/skype | awk '/not found/{print $1}'
      Buscar las librarias que salen después del comando en su versión para 32bits y copiarlos a /opt/skype/lib/. Una posibilidad es usar el repositorio debian y descomprimir los debs para poder copiar las librerias.
    5. Crear archivo ejecutable en /usr/local/bin/skype:
      #!/bin/sh
      SP=/opt/skype
      export LD_LIBRARY_PATH=$SP/lib/
      $SP/skype --resources=$SP/ $@
    6. Asegurar que todo pertenece a root y solo el tiene permisos de modificación:
      chown -R root:root /opt/skype /usr/local/bin/skype
      chmod -R go-w /opt/skype /usr/local/bin/skype

    7. Crear acceso directo en tu desktop a /usr/local/bin/skype con el icono de /opt/skype/icons.

    jueves, 8 de noviembre de 2007

    Instalación de Windows XP en KVM

    Primero se debe comprobar que se pueda usar kvm, de no ser así se puede usar qemu con kqemu que también se trata de una solución libre. Para comprobarlo el comando de a continuación debe responder si dispones de las extensiones de virtualización:
    grep '^flags.*(svm|kvm)' /proc/cpuinfo

    Con extensiones de virtualización en la CPU: (Recomendado)
    Programas necesarios:
    kvm, qemu
    Módulos necesarios: kvm, (kvm-intel|kvm-amd)

    Sin extensiones de virtualización en la CPU:
    Programas necesarios:
    qemu
    Módulos necesarios: kqemu
    En ese caso debería funcionar reemplazando los comandos "kvm" por "qemu" pero no ha sido probado.

    1. Crear disco virtual:
      qemu-img create -f qcow vdisk.img 10G
      Para conseguir mejor resultados de disco en windows es mejor usar qcow2 envez de qcow.

    2. Empezar la instalación:
      kvm -hda vdisk.img -cdrom windowsxp.iso -boot d -m 256 -no-acpi -localtime
      ACPI en virtualización va muy lento así que lo desactivamos, eso tiene la pega de que no se reinicia correctamente durante la instalación (en mi caso lo he reiniciando matando a kvm).
      Después de la instalación de agrega a mano un hardware de sistema llamado algo parecido a "APM/Legacy NT" para que se apague y reinicie correctamente mediante el uso de APM y sin usar ACPI.


    3. Empezar a usar Windows:
      • Básico
        export QEMU_AUDIO_DRV=sdl
        kvm -hda vdisk.img -m 256 -no-acpi -localtime -soundhw es1370

        No tiene problemas.

      • Seamless
        export QEMU_AUDIO_DRV=sdl
        kvm -hda vdisk.img -m 256 -no-acpi -localtime -soundhw es1370 \
        -redir tcp:3389::3389 -nographic -monitor null -serial null

        1. Ejecutar en modo básico (mirar el apartado anterior).
        2. Se debe descomprimir el SeamlessRDP en la carpeta c:\seamlessrdp\
        3. A preferencias de sistema se activa el acceso remoto.
        4. A cuentas debe estar activado la pantalla de bienvenida y cambio rapido de usuarios.
        5. Se le pone password al usuario Administrador.
        6. Apagar el Windows y ya se puede iniciar en modo seamless que kvm ya no necesitara las X.
        7. Desde Linux ya se puede entrar con rdesktop.

        rdesktop -E -r sound:remote -r disk:home=$HOME -k es -u administrador -p - \
        -A -s "c:\seamlessrdp\seamlessrdpshell.exe taskmgr"

        Aquí se usa RDP en vez de SMB para los archivos pero se recomienda usar elprograma Samba.
    Más información:
    man qemu
    Se aplican los parámetros de qemu en kvm.

    Apagar desde RDP:
    Ejecutar o crear acceso directo a
    shutdown -s -f

    Comprimir la imagen de disco:
    1. Defragmentar en Windows (Guest).
    2. Ejecutar SDelete en Windows (Guest):
      sdelete -c c:

    3. Apagar el Guest.
    4. Comprimir la imagen en el Host:
      mv vdisk.img vdisk-zerofull.img
      qemu-img convert -c -f qcow vdisk-zerofull.img -O qcow vdisk.img
      rm vdisk-zerofull.img

    miércoles, 7 de noviembre de 2007

    Actualizacion de la bios de Asus A8NSLI-Deluxe

    El otro dia recibi porfin mi super microprocesador nuevo AMDX2, socket 939 para que fuera compatible con mi placa.

    Apaque el ordenador, saque el antiguo y puse el nuevo. Arranque cruzando los dedos y lo hizo, vi que no tenia soporte para powernow/cool'n'quiet, lo cual me extraño porque leyendome las especificaciones del micro nuevo vi que tenia esa funcionalidad... Haciendo un cat /proc/cpuinfo vi que no reconocia bien el micro, asi que me imagine, que me hacia falta una actualizacion de bios.

    Me meto en asus.com, me bajo la ultima actualizacion y me encuentro en el dilema de siempre al actualizar una bios. No tengo disketera y me toca los webos tener que tostar un dvd por 500 kb, asi que investigo a ver si hay algo para linux para flashear bios. Logicamente en asus no tienen nada, solo para güindous...

    Despues de buscar un poco encontre esto, se trata de una utilidad que se creo para flashear las bios del proyecto LinuxBIOS pero que supuestamente funciona tambien para BIOS propietarias, la forma de usar la aplicacion es muy sencilla y aqui tienes una lista de las placas oficialmente testeadas por si te animas ha usarla, pero antes te recomendaria que siguieras leyendo para que veas lo que me paso a mi con la placa A8N-SLI Deluxe.

    Bueno el caso es que me lei el wiki del proyecto flashrom y no tiene mucho misterio, en la lista de placas testeadas oficialmente no estaba la mia, ni en las que tenian el visto bueno ni en las que cascaban, pero habia un modelo superior, A8N-SLI Premium ... Bueno pues me arme de valor, me agarre los machos y me dispuse a ello.

    1) Lo instale manualmente :

    $ svn co svn://linuxbios.org/repos/trunk/util/flashrom
    $ cd flashrom
    $ make
    $ sudo make install


    2) Hice un backup de la bios actual

    $ flashrom -r backup.bin

    Hasta aqui todo perfecto...

    3) Flashee la nueva BIOS

    $ flashrom -wv backup.bin

    Error al comprobar la nueva bios.... ufff una gota de sudor frio recorre mi espalda... voy a volver a poner el backup que esto me da mala espina

    $ flashrom -wv 1805.BIN

    Error al comrpobar la nueva bios.... Bueno... a lo mejor no comprueba correctamente la bios pero esta bien programada.... Vuelvo a meter la nueva y pienso... vamos ha hacer un backup de la nueva y un diff a ver si son iguales el backup de la nueva de la nueva bajada de asus... si lo son imagino que esta bien programada.

    flashrom -wv 1805.BIN
    flashrom -wv backup-nueva.bin
    diff 1805.BIN backup-nueva.bin


    Los archivos son distintos.... Bueno tampoco tenia porque demostrar nada... A lo mejor el backup es distinto de una imagen nueva antes de flashearla... ¿Me arriesgo y reinicio?

    ... Logicamente, ya sin BIOS en mi placa, hice lo que suelo hacer siempre, cagarme en todo lo cagable y despues ponerme a llorar como una madalena.

    Cuando reiniciaba me salia un mensaje de meter cd o diskete para arrancar, meti un dvd de gparted live que tengo para ver si podia de alguna forma flashearla again pero no arrancaba, buscaba un archivo que te viene en la descarga de la actualizacion de la BIOS AWDFLASH.EXE. Cree un DVD con estos dos archivos (AWDFLASH.EXE, 1805.BIN) desde otro ordenador y ya arranque flasheo la BIOS correctamente y todo parecia "funcionar" de nuevo... Ya con el soporte para AMDX2... pero.... aqui no acaba la historia...

    El Ordenador desde donde estoy haciendo todo esto, es mi ordenador principal de casa que hace de firewall nateo y mil pijotadas mas, tiene 2 tarjetas de red, la principal que sale a internet, eth1 y la que va a la red local eth2... pos bien, no me reconocia eth1... Como usuario de Güindous (en mi jornada laboral) le eche la culpa al sistema... me mire de arriba abajo el kernel los modulos de red, meti incluso nuevos modulos... despues de estar dandole vueltas y cabreado me fui a dormir.

    Al dia siguiente mas tranquilo pense en lo que habia hecho. He flasheado una BIOS, el sistema tiene que estar bien, no he tocado el sistema, asi que o se ha jodido la tarjeta de red, al poner el micro o la BIOS se lo ha cargado...

    Empece a mirar dmesg mas tranquilamente, los lspci, los modulos cargados y el udev. ¡BINGO! Tenia una nueva tarjeta eth3, ¿que habia pasado? el flasheo habia cambiado la MAC de la tarjeta principal, en las reglas del udev tenia algo asi :

    cat /etc/udev/rules.d/70-persistent-net.rules
    # Firewire device 0011d800002ace6e)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:00:00:2a:ce:6e", NAME="eth0"

    # PCI device 0x11ab:0x4320 (skge)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:d9:c6:d5", NAME="eth2"

    # PCI device 0x10de:0x0057 (forcedeth)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:e5:b6:b8", NAME="eth1"

    # PCI device 0x10de:0x0057 (forcedeth)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="04:4b:80:80:80:30", NAME="eth3"


    Si os fijais hay dos dispositivos practicamente identicos en el eth1 y eth3 la unica diferencia es la MAC.... Modifique el archivo dejandolo asi

    nano -w /etc/udev/rules.d/70-persistent-net.rules
    # Firewire device 0011d800002ace6e)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:00:00:2a:ce:6e", NAME="eth0"

    # PCI device 0x11ab:0x4320 (skge)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:d9:c6:d5", NAME="eth2"

    ## # PCI device 0x10de:0x0057 (forcedeth)
    ## SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:11:d8:e5:b6:b8", NAME="eth1"

    # PCI device 0x10de:0x0057 (forcedeth)
    SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="04:4b:80:80:80:30", NAME="eth1"


    Para mas INRI mi proveedor de internet solo me deja conectarme con una mac-address por lo que no me dejaba conectar, me acorde de mis andanzas con la funcion preup() en el /etc/conf.d/net he hice el cambio manual de mac justo antes de arrancar la red

    preup()
    {
    ifconfig eth1 hw ether 00:11:d8:e5:b6:b8
    }


    Ya contento y al tener todo funcionando me dispuse a jugar al etqw :D

    Bueno, a todo esto lo unico que cambie fue en el /etc/make.conf MAKEOPTS="-j3" :D

    lunes, 15 de octubre de 2007

    Archivos po y mo para Wordpress 2.3 y BBPress

    Hace unos dias tenia que entregar un proyecto que constaba de un wordpress con un bbpress integrado, con la mala suerte, de que si integras los dos y quieres ponerlos en castellano tienes que añadir al archivo .mo de wordpress las traducciones (ya algo obsoletas) de bbpress.

    La verda es que habia visto muchas veces estos archivos pero no tenia npi de como funcionaban, como se editaban ni generaban.

    Buscando por internete descubri un maravilloso editor, poedit, que te edita estos archivos y genera los .mo necesarios para las traducciones.

    Cogi los dos .po de las traducciones de wp y bbpress y los mezcle a manubrio con el gedit. Despues de solventar unos 112 errores por duplicidad (tambien a manubrio borrando las duplicadas... :P), seleccione la carpeta donde tenia el proyecto con el wp y bbpress para que me actualizara el contenido de el archivo .po, ya solo queda traducir los nuevos terminos y corregir alguno viejo que no me convencia su traduccion.

    El resultado lo podeis descargar de aqui

    El proyecto que he creado en code.google no lo voy a mantener asiduamente, solo ire actualizando con las necesidades que vaya viendo... me encantaria poderlo haber traducido completamente pero estoy algo liao :P si alguien se anima no tiene mas que contactar conmigo.

    domingo, 14 de octubre de 2007

    Quake3, ET, Doom3, Quake4, ... etc y pantallas panoramica

    Todos estos juegos tienen soporte, lo que pasa que por defecto te sacan solo configuraciones para 4:3 . Para activar tienes que modificar el archivo de configuracion en tu directorio home ...

    .doom3/base/DoomConfig.cfg
    .q3a/baseq3/q3config.cfg
    ... etc


    y establecer los siguientes valores

    // Activar resoluciones personalizadas
    seta r_mode "-1"
    // ancho
    seta r_customwidth "1920"
    // alto
    seta r_customheight "1200"


    Algunos ejemplos de resoluciones (lo he dicho bien bpk? :D)

    16:9
    852x480
    1280x720
    1365x768

    16:10 (Este es el de nuestro portatil bpk y palomo :D)
    1440x900
    1680x1050
    1920x1200

    4:3
    320x240
    2048x1535

    Basicamente es una traduccion de aqui :: Origen

    NOTA : Una cosa a tener en cuenta antes de que os volvais locos, es posible que la resolucion se haya aplicado, pese a que en la configuracion de video del juego no lo veais. Para saberlo con certeza hay que jugar. Tambien es posible que si cambiais algo de la config de video desde el propio juego tengais que editar de nuevo el archivo y ponerle lo antes mencionado, aunque esto ultimo es una hipotesis....

    miércoles, 10 de octubre de 2007

    Pando en gentoo@amd64

    Queria probar como iba el tema de reproduccion HD en pando y me instale el cliente de desacargas de pando

    emerge -va pandodl

    resultado : masked by: missing keyword

    echo "net-p2p/pandodl ~* *" >> /etc/portage/package.keywords

    volvemos a instalar

    emerge -va pandodl

    Ahora instala, pero al ejecutar pandodl, no encuentra la libreria libexpat.so.1

    Para solucionar esto tenemos que instalar el paquete app-emulation/emul-linux-x86-baselibs y hacer un link de la libreria de 32bits libexpat.so.0 al directorio de pando/libs

    ln -s /usr/lib32/libexpat.so.0 /opt/pandodl/lib/libexpat.so.1

    Bien, conseguido..., me bajo el primer archivo pando y resulta que las versiones 1.7 o posteriores de archivos .pando no funcionan en linux :(

    En fin... me parece que tendremos que esperar.

    Pando 1.7 packages can't be downloaded with Pando Linux!
    Pando en Gentoo con AMD64
    Inital Feedback

    jueves, 4 de octubre de 2007

    Problemas con hald en gentoo@amd64

    Desde hace tiempo y con un maravilloso emerge -va world me dejo de funcionar el hal, el problema que me escupia en el /var/log/messages era el siguiente :

    [E] hald_dbus.c:5086: dbus_bus_get(): Failed to connect to socket /usr/local/var/run/dbus/system_bus_socket: No such file or directory

    ...y al poco tiempo despues...

    [E] hald_dbus.c:5086: dbus_bus_get(): Failed to connect to socket /usr/local/var/run/dbus/system_bus_socket: Connection refused

    Buscando por internet encontre la forma de solucionar este "bug" que solo me ocurre para amd64 ya que en x86 parece correr dpm. Hacer un link desde /var/run/dbus/system_bus_socket a /usr/local/var/run/dbus/system_bus_socket

    ln -s /usr/local/var/run/dbus/system_bus_socket /var/run/dbus/system_bus_socket

    Con esto ya parece funcionar de nuevo.... pues no, me reconoce nuevos dispositivos pero no me los monta debido a problemas de permisos. Inicio una session como root y efectivamente, funciona dpm

    Despues de dar permisos a distintos grupos a mi usuario sin ningun resultado, borre los mismos y volvi a buscar de nuevo en internet. Un chavalin con fedora explicaba como dar permisos a un usuario para el tema de auto-montaje con hal y era editando el archivo /etc/dbus-1/system.d/hal.conf

    En este mismo hay un apartado para los permisos de root (id = 0)

      <!-- You can change this to a more suitable user, or make per-group -->
      <policy user="0">
        <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
        <allow send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
        <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
        <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
        <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
      </policy>


    Y tal como comenta el mismo se pueden dar permisos por grupo o por usuario, como yo solo tengo un usuario :P lo hice por usuario (si solo tienes un usuario o usas el primer usuario que creaste tu id sera 1000), añadiendo este codigo que sigue justo despues de lo anterior ya damos permisos a nuestro usuario 1000

      <!-- usuario X -->
      <policy user="1000">
        <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
        <allow send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
        <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
        <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
        <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
      </policy>


    Reiniciamos hald y ya se monta todo automaticamente :D

    Salud3!

    martes, 2 de octubre de 2007

    Ejemplo práctico de inyección SQL con UNION

    El siguiente texto es una especie de cuaderno de bitácora de mi compi de curro - y de otras cosas que no voy a decir - Sponge Bob.
    Es un spoiler total de una de las pruebas de http://www.hackthissite.org/, pero se ha cambiado la URL para que las arañitas de google no les sirvan en bandeja la solución a la gente que está haciendo las pruebas.

    Sponge Bob dixit:


    Esta misión ya se realizó en su momento, por lo parte de las acciones que realizo tienen como origen cosas que recuerdo que hice en su momento.

    En primer lugar, recuerdo que products.php era sensible a injecciones SQL, usando un UNION.


    http://www.hacking.org/missions/products.php?category=2+union+select+1

    La siguiente injección me devuelve una única entrada sin información, cuando la categoría '2' contiene 3 productos. La consulta que se debe hacer en products.php debe ser algo del estilo
    SELECT * FROM products WHERE category = 2
    Dicha consulta deberá retornar X elementos y para que el código que injerto tenga éxito deberá retornar el mismo número de elemento.

    Probemos....

    http://www.hacking.org/missions/products.php?category=2+union+select+1,2

    Mismo resultado.

    http://www.hacking.org/missions/products.php?category=2+union+select+1,2,3

    Mismo resultado.

    http://www.hacking.org/missions/products.php?category=2+union+select+1,2,3,4

    Bien. Aquí ya se devuelve 4 entradas, posiblemente los 3 productos en el resultado de mi injerto. Sin embargo no aparece ningún tipo de información, fotos, precios, descripción. Es posible que a mi injerto le falte algún tipo de información. La sentencia SQL original podría ser algo así...
    SELECT id, price, description, picture FROM products WHERE category = 2

    Por si acaso, también probamos con el siguiente injerto

    http://www.hacking.org/missions/products.php?category=2+union+select+1,2,3,4,5

    En este caso, se vuelve a mostrar una única entrada, lo cuál parece reforzar el hecho de que la sentencia SQL devuelve 4 campos.

    Suponiendo que la sentencia SQL original sea utilizada no por posición, sino por nombre (con el módulo de PHP MDB2 por ejemplo cuando se extraen los resultados puedes indicar que sea por columna: MDB2_FETCHMODE_ORDERED, por nombre: MDB2_FETCHMODE_ASSOC, o por objeto: MDB2_FETCHMODE_OBJECT) y presuponiendo que uno de los campos usado sea el campo clave (al cual normalmente se le llama id) ejecutamos la siguiente sentencia...

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,2,3,4,5

    Mmmmm, ¡han aparecido las fotos! Lo cual nos indica lo siguiente:
    * Si miramos en el código html vemos que el nombre de la cada foto está relacionado con el 'id'. Así la foto 1.jpg está relacionada con el producto con id 1.

    http://www.hacking.org/missions/1.jpg

    * Si un campo en el injerto no tiene asignado nombre provoca que el campo en la sentencia original que ocupe el mismo puesto pierde su nombre de columna provocando que no aparezca la información correspodiente. Por ejemplo, con la siguiente sentencia

    http://www.hacking.org/missions/products.php?category=2+union+select+1,2+as+id,3,4

    sólo aparece la foto del elemento que se ha introducido en el injerto (2 as id) y no la de los elementos originales. Por tanto, en la sentencia original la primera columna es el id del producto.

    Una aclaración: en este caso tampoco nos interesa mucho la colocación de los distintos atributos ya que lo que nos interesa en la información que podemos obtener con nuestro injerto y no la original.

    Supongamos, ahora que el precio del producto tendrá como nombre de columna... no sé, ¿price? ;-)

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,2+as+price,3,4

    Bien, existe un campo price pero no está en la segunda posición. Da igual.

    Supongamos que otro campo puede ser description, describiendo el producto

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,2+as+price,3+as+description,4

    No se ha producido ningún cambio respecto a la sentencia anterior por tanto no es description.

    A ver, también es cierto que no es necesario averiguar la estructura completa de la sentencia SQL original. Posiblemente a través del campo 'price' podamos sacar la información que necesitamos aunque también es posible que en la aplicación sólo manejen números o si maneja texto sea de una longitud muy limitada para nuestras necesidades. Para nuestras necesidades seguro que es más adecuado el campo que describe los productos...

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,2+as+price,3+as+text,4

    Biiien, ya tenemos el nombre del campo que describe los productos.

    Lo que no queda claro es para que sirve el cuarto campo pero bueno tampoco parece que sea muy útil.

    Como nota curiosa, el siguiente injerto

    http://www.hacking.org/missions/products.php?category=2+union+select+2+as+price,1+as+id,3+as+text,4

    produce que la foto se coloque en la imagen (ver código fuente) la descripción del producto y en la descripción del producto el id del producto, ¿alguna explicación?

    Y si probamos a veriguar qué base de datos tenemos...

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,@@version+as+text,3+as+price,4

    Bueno, nos da error. Es posible que sea un mysql y no tengamos permisos de ejecución.

    ¿Dónde pueden estar las direcciones de correo? Si intentamos introducir como dirección de email el carácter "'" nos devuelve un informativo error:

    http://www.hacking.org/missions/addemail.php?email='

    Error inserting into table "email"! Email not valid! Please contact an administrator of Fischer's.

    Por tanto, podemos probar a sacar el id de la tabla email...

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,(select+id+from+email+limit+1)+as+text,3+as+price,4

    Nada, nos da error. La opción 'limit' no es estándar (gracias Pedro) y hay bases de datos como Oracle que no la soportan. Lo que deja claro el siguiente injerto es que se puede introducir subconsultas en el injerto

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,(select+2)+as+text,3+as+price,4

    Bien, hagamos una consulta a la tabla email, ¿qué campo puede contener el email de los usuarios? Probemos con 'email'

    http://www.hacking.org/missions/products.php?category=2+union+select+1+as+id,email+as+text,3+as+price,4+from+email

    Bueno, bueno, bueno, ya tenemos los emails de los usuarios ahora habría que ver a quién se le manda.



    Espero que a la gente de http://www.hackthissite.org/ no les moleste, este artículo se ha creado exclusivamente con fines didácticos y sin intención de joder a nadie ^_^

    martes, 25 de septiembre de 2007

    El NTP de los pobres


    Bueno, de los pobres, o de los vagos, o de los kutres....el caso es que aquí va mi segundo kutre-script.

    Hace unos meses, me encontré en una red en la que el UDP estaba capado... yo tampoco sé en qué estarían pensando cuando decidieron esa política de seguridad, pero los caminos de lo políticos haciendo de admin son inescrutables.

    El caso es que estuve investigando alguna solución que permitiese hacer NTP por TCP y no encontré nada.
    La siguiente opción consistía en encapsular UDP dentro de TCP, pero no era viable al tratarse de una red aislada, sin otras redes de apoyo externas o que dieran este tipo de servicos. Además están muy desaconsejados este tipo de workarounds.
    Por último, yo que antes de nada soy práctico, pensé "¿porqué no hago la consulta a algún servidor web y le meto la hora a las bravas?". Y a mí todo lo que sea meter a las bravas siempre me ha parecido una buena idea, así que creé el siguiente kutre-script:

    root@osaka:~# cat /usr/local/bin/time_sync.sh
    #!/bin/bash
    date -u -s "`wget -O- http://www.time.gov/timezone.cgi?UTC/s/0 2> /dev/null \
    | sed -n -e 's/.*size="[75]".*>\(.*\)<br>$/\1/p'`" >& /dev/null


    ¿Se nota que estoy intentando aprender bash scripting? xD

    Ahora sólo hay que añadirlo al cron del usuario root. Para editar el cron, desde una terminal de root, ejecutamos:
    root@osaka ~-> crontab -e

    Y añadimos la siguiente linea:
    00 09 * * * root /usr/local/bin/time_sync.sh

    Yo sólo sincronizo una vez al día, porque a la peña de las páginas web les sienta muy mal que utilicen sus páginas las máquinas en vez de las personas, y no es plan de que se cabreen y pongan CAPTCHAs ^_^. Si quieres ponerlo más a menudo, ya sabes:
    man -S 5 crontab

    Por si un copypaste es demasiado kurro time_sync.sh

    PD: Por supuesto, gracias a la gente de http://www.time.gov/ , sin vosotros esto no habría sido posible xDD

    NOTA: He actualizado el artículo y el script porque ha cambiado la URL desde la que extraer la hora.
    Ya sabes: apt-get update && apt-get upgrade net_para_los_pobres (just kidding)

    viernes, 21 de septiembre de 2007

    Problema con el idiomas en Wordpress 2.2.3 para sistemas 64bits


    Trasteando con wordpress me he vuelto loco para castellanizar la version 2.2.3 de wordpress hasta que encontre en internete lo siguiente :

    Si tienes una distribucion de 64 bits y no te funciona la carga de archivos .mo puede ser por que no te funcione un if puñetero que hay dentro de

    wp-includes/gettext.php

    Editalo y donde pone :

    if ($magic == ($MAGIC1 & 0xFFFFFFFF) || $magic == ($MAGIC3 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms
      $this->BYTEORDER = 0;
    } elseif ($magic == ($MAGIC2 & 0xFFFFFFFF)) {
      $this->BYTEORDER = 1;
    } else {
      $this->error = 1; // not MO file
      return false;
    }


    pon

    if ($magic == ($MAGIC1 & 0xFFFFFFFF) || $magic == ($MAGIC3 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms
      $this->BYTEORDER = 0;
    } elseif ($magic == ($MAGIC2 & 0xFFFFFFFF)) {
      $this->BYTEORDER = 1;
    } else {
      $this->BYTEORDER = 0;
      // $this->error = 1; // not MO file
      // return false;

    }


    El reporte del bug en :
    http://wordpress.org/support/topic/95983

    y la solucion en :
    http://comox.textdrive.com/pipermail/wp-trac/2007-June/012844.html

    martes, 18 de septiembre de 2007

    Modulo de apache de php en Gentoo

    Hace un par de dias actualice mi sistema con un emerge -va world con la mala pata que cuando termino la compilacion y en vista de que tenia que actualizar 17 archivos de configuracion hice el gañan y movi el contenido de los nuevos sobreescribiendo los viejos

    Una vez terminada la faena y en vista que todo parecia funcionar yo segui a lo mio hasta que hoy al intentar entrar a una de las paginas que tengo alojadas en mi ordena me descargaba el codigo php :D. ¿Gracioso no?

    Acto seguido pare el apache ya que como es obvio el codigo libre pero no las passwords de los ficheros de configuracion del wordpress :P

    Bueno pues ahora por la tarde me disponia a meter el modulo de php5 que imagine se les habria pasado a estos maravillosos ebuildsnasters de gentoo con la mala pata que al ponerlo me dio el siguiente error

    Apache2 has detected a syntax error in your configuration files:
    apache2: Syntax error on line 169 of /etc/apache2/httpd.conf: Syntax error on line 4 of /etc/apache2/modules.d/70_mod_php5.conf: API module structure 'php5_module' in file /usr/lib64/apache2/modules/libphp5.so is garbled - expected signature 41503232 but saw 41503230 - perhaps this is not an Apache module DSO, or was compiled for a different Apache version?


    Buscando por internet me di cuenta que me veo obligado a re-emergear el php (que no es poco)

    En fin, no todo ha sido tiempo perdido, he aprendido algo nuevo que me interesa reflejar aqui a modo de apunte acerca de la configuracion de apache en gentoo

    Para cargar el modulo php puedes hacerlo de varias formas

    La que yo ya sabia era metiendo en alguno de los archivos de configuracion como por ejemplo en....

    /etc/apache2/modules.d/default

    ...la carga de el modulo...

    LoadModule php5_module modules/libphp5.so

    Tambien puedes editar el archivo en /etc/conf.d/apache2 y añadir -D PHP5 a las opciones de arranque de apache2

    APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D MANUAL -D SSL -D SSL_DEFAULT_VHOST -D SUEXEC -D PHP5"

    Estas dos primeras opciones cargan el modulo de php... la pregunta del millon es ¿Que diferencia una de la otra?

    La primera solo carga el modulo, luego tu tienes que establecer en que sitio deseas que se pueda ejecutar el php que extensiones etc.... con la segunda, tira de un archivo en mi caso /etc/apache2/modules.d/70_mod_php5.conf que contiene ya toda la configuracion tipica de un servidor que admita php.

    El contenido del mismo es:

    <IfDefine PHP5>
      # Load the module first
      <IfModule !mod_php5.c>
        LoadModule php5_module modules/libphp5.so
      </IfModule>
      
      # Set it to handle the files
      <IfModule mod_mime.c>
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php .phtml
        AddType application/x-httpd-php .php3
        AddType application/x-httpd-php .php4
        AddType application/x-httpd-php .php5
        AddType application/x-httpd-php-source .phps
      </IfModule>
      
      AddDirectoryIndex index.php index.phtml
    </IfDefine>


    La decision de usarlo o no ya recae en cada uno y varia segun a quien esta destinado los virtuales... en mi caso que solo estoy programando web en php y que soy el unico usuario de este servidor me ahorra mucha morralla a la hora de configurar nuevos servidores virtuales.

    miércoles, 29 de agosto de 2007

    Grabar DVD con un archivo de más de 4 GB


    Voy a empezar a publicar algunos de los kutre-scripts que tengo por ahí pululando, y voy a empezar por este.

    Respecto al tema de los ficheros de más de 4 GB. Si alguna vez lo habéis intentado, os habréis dado cuenta de que no puedes grabarlo en un DVD de la manera tradicional.
    Por lo que he leído, es algo relacionado con que mkisofs no puede crear imágenes UDF "puras" y crea imágenes híbridas UDF / Joliet.[1]

    Por si alguien no se fía del script (no le culpo, yo tampoco lo haría ^_^) los pasos a seguir serían los siguientes:

    1. Creamos un archivo del tamaño de la imagen que queramos.
      dd if=/dev/zero of=file.iso bs=2048 count=tamaño_imagen

    2. Convertimos el fichero creado a formato UDF.
      mkudffs file.iso

    3. Montamos el fichero.
      mount -o loop -t udf file.iso punto_de_montaje

    4. Copiamos los contenidos que queramos
      cp archivo_tocho punto_de_montaje

    5. Borramos el directorio de lost+found
      rm punto_de_montaje/lost+found/ -Rf

    6. Desmontamos
      umount punto_de_montaje

    7. Tostamos
      cdrecord -v -dao -dev=/dev/grabadora -driveropts=burnfree file.iso


    Cuando lo hice no pensaba subirlo a ningún lado, así que estará un poco verde y puede que necesites adaptarlo un poco. Si tenéis algún tipo de sugerencia / mejora / problemas, como siempre serán bien recibidos (0 no)

    El kutre-script de marras:
    grabar_4GB



    ¡Besitos anales!



    [1] Mientras me documentaba para escribir esta reseña, leo en el man de mkisofs que el tema de UDF está en fase alpha, así que hay esperanzas de que no tarde mucho en estar disponible y ser estable.

    miércoles, 18 de julio de 2007

    Avahi ... un misterio menos


    Para aquellos que sepan qué es avahi, que no sigan leyendo... a no ser que quieran reirse de mi ignorancia ¬_¬

    Hay una cosa de la que siempre que he podido me he quejado de Ubuntu:
    A la hora de configurar la red, como siempre pasa en estos mundos del software libre, tienes un millón de formas de hacerlo; pero en Ubuntu es donde
    me he encontrado por primera vez que cuando configuras la red a través del herramienta gráfica, luego mirabas en el archivo /etc/network/interfaces ...
    ¡Y ahí no había nada de lo que habías estado poniendo!

    Por otro lado, cuando realizas los cambios en el /etc/network/interfaces alguna vez me he vuelto medio loco porque no conseguía que el servicio se
    comportase como se le supone...
    En fin, un montón de cosas raras más propias de otros sistemas que basan su configuración en un oscuro registro y de lo que yo pensaba que estaba a
    salvo en el sistema del pingüino...

    Pues bien, hoy estaba jugando con el lsof y aprendiendo algunas opciones interesantes (eso para otro día en el que me ponga a escribir un artículo
    de verdad ~_^) y he visto el proceso ese raro:


    root@acer-laptop:/home/bpk# lsof -i
    COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
    avahi-dae 4666 avahi 13u IPv4 15856 UDP *:mdns
    avahi-dae 4666 avahi 14u IPv4 15857 UDP *:32769

    Y yo pensado, ¡coño, qué es esto!


    root@acer-laptop:/home/bpk# dpkg -l "avahi*"
    Desired=Unknown/Install/Remove/Purge/Hold
    | Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
    |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
    ||/ Name Version Description
    +++-=================================-=================================
    ii avahi-autoipd 0.6.17-0ubuntu3 Avahi IPv4LL network address configuration daemon
    ii avahi-daemon 0.6.17-0ubuntu3 Avahi mDNS/DNS-SD daemon



    Interesante...


    root@acer-laptop:/home/bpk# apt-cache show avahi-autoipd
    Package: avahi-autoipd
    Priority: optional
    Section: net
    Installed-Size: 176
    Maintainer: Ubuntu Core Developers
    Original-Maintainer: Utopia Maintenance Team
    Architecture: i386
    Source: avahi
    Version: 0.6.17-0ubuntu3
    Depends: libc6 (>= 2.5-0ubuntu1), libdaemon0, adduser
    Recommends: dhcp3-client, iproute
    Conflicts: zeroconf
    Filename: pool/main/a/avahi/avahi-autoipd_0.6.17-0ubuntu3_i386.deb
    Size: 42356
    MD5sum: 6bf4b572186ebae0f77ef22ac721cf3b
    SHA1: 7a6ae3c80a7ca5b8d72117b56a93cbae9b67a981
    SHA256: b43a7725850cbcdfa339be0c0cdea26ad4de402e80ee9aded41a0a4ad5a650d5
    Description: Avahi IPv4LL network address configuration daemon
    Avahi is a fully LGPL framework for Multicast DNS Service Discovery.
    It allows programs to publish and discover services and hosts
    running on a local network with no specific configuration. For
    example you can plug into a network and instantly find printers to
    print to, files to look at and people to talk to.
    .
    This tool implements IPv4LL, "Dynamic Configuration of IPv4 Link-Local
    Addresses" (IETF RFC3927), a protocol for automatic IP address
    configuration from the link-local 169.254.0.0/16 range without the
    need for a central server. It is primarily intended to be used in
    ad-hoc networks which lack a DHCP server.
    Bugs: mailto:ubuntu-users@lists.ubuntu.com
    Origin: Ubuntu
    Task: ubuntu-desktop, kubuntu-desktop, xubuntu-desktop


    y


    root@acer-laptop:/home/bpk# apt-cache show avahi-daemon
    Package: avahi-daemon
    Priority: optional
    Section: net
    Installed-Size: 364
    Maintainer: Ubuntu Core Developers
    Original-Maintainer: Utopia Maintenance Team
    Architecture: i386
    Source: avahi
    Version: 0.6.17-0ubuntu3
    Depends: libavahi-common3, libavahi-core5, libc6 (>= 2.5-0ubuntu1), libcap1, libdaemon0, libdbus-1-3 (>= 0.94), libexpat1 (>= 1.95.8), adduser, dbus
    (>= 0.60)
    Recommends: libnss-mdns
    Suggests: avahi-autoipd
    Conflicts: mdnsresponder
    Filename: pool/main/a/avahi/avahi-daemon_0.6.17-0ubuntu3_i386.deb
    Size: 78398
    MD5sum: 09ad1ba9c1979c05dc03e1c83935a3c7
    SHA1: 42e8310fc438fd67ce39274031d2d72f0748ed8c
    SHA256: 9d96182dc6c3e02f29593be65d8b0fc4b099ddf19e2244d7b0c927ff21b7853a
    Description: Avahi mDNS/DNS-SD daemon
    Avahi is a fully LGPL framework for Multicast DNS Service Discovery.
    It allows programs to publish and discover services and hosts
    running on a local network with no specific configuration. For
    example you can plug into a network and instantly find printers to
    print to, files to look at and people to talk to.
    .
    This package contains the Avahi Daemon which represents your machine
    on the network and allows other applications to publish and resolve
    mDNS/DNS-SD records.
    Bugs: mailto:ubuntu-users@lists.ubuntu.com
    Origin: Ubuntu
    Task: ubuntu-desktop, kubuntu-desktop, edubuntu-desktop, xubuntu-desktop



    Y por último, echando una visual en el predecible directorio /etc/avihi/ se ve claramente como funciona el programa de marras y qué cositas hace.

    Los links de rigor, por si alguien quiere ver lo que se puede hacer con el programa de marras:

    La peich de la wikipedia
    La página oficial

    Especialmente interesante el man del archivo de configuración


    That´s all folks!

    Seguidores