sábado, julio 21, 2007

Problemas con apache y php

Tal y como conté en mi post anterior tenía previsto publicar un post sobre shells php, que son script php pensados para ser ejecutados en un servidor remoto mediante una vulnerabilidad RFI (Remote File Inclusion). Pero bueno eso os lo explicare todo mas despacio en el futuro post quiero publicar, ahora voy a contaros los problemas que tengo para preparar mi demostración.

Yo desde tiempos inmemoriales tengo instalado en mi servidor apache con soporte para php (desde que puse el server a funcionar) y iba bastante bien, en su día cuando hice algunos experimentos con php salió todo bien, y como servidor web para tener algunas cosillas accesibles desde cualquier pc de mi red también funcionaba bien. Y ahí estuvo el servidor web funcionando mucho tiempo, sin embargo la ley de Murphy actuó, justo el día que yo quería volver a utilizar el soporte para php no funcionaba, lo primero que quise hacer fue ejecutar directamente una de las shells de las que dispongo, así que la envío al server mediante netcat y luego la pongo en el directorio adecuado (/var/www/shells/) y pruebo a ejecutarla, pero no se ejecuto el codigo php en el servidor, lo que hizo fue ofrecerme descargar el archivo. Yo me quedé un poco desconcertado, no sabía que pasaba, porque el php había dejado de funcionar de repente? porque el servidor funcionaba, las páginas html las mostraba perfectamente. Reviso que sigo teniendo perfectamente instalado el apache y el php, a primera vista todo era correcto, los paquetes estaban instalados y yo no había cambiado los ficheros de configuración de apache. Pues nada tocaba agudizar el ingenio e intentar averiguar que pasaba, aunque realmente de ingenio poco, porque la solución era sencillísima y el problema era bastante fácil de descubrir, sin embargo yo me fui por el camino mas complejo... pero bueno no os adelante hechos, sigamos por orden.

Ejecuto ps axu | grep apache para ver si se estaba ejecutando el apache y no, no estaba, así que arranco el servicio: /etc/init.d/apache2 start, acto seguido pruebo a ver una página php que tenía en /var/www, info.php cuyo ćódigo podéis ver aquí: http://neobiusnet.googlepages.com/info.txt

Que lo que hace es simplemente mostrar una pagina con información sobre php, versión instalada, servidor web que corre... en fin información sobre la implementación. Bueno el caso es que puse esa página: http/debian/info.php (nota: debian es el nombre de mi server, y así esta definido en /etc/hosts). Yo ya un poco harto del tema y sin saber muy bien que hacer pruebo la solución clásica de windows, reinstalar, así que nada apt-get install -reinstall apache2, no valió para nada, así que pruebo desinstalando y eliminando los archivos de configuración a mano, tanto de apache como de php, así que apt-get remove --purge apache2 php5. Bueno tras eliminarlo todo pensé que lo mejor era instalar de nuevo siguiendo algún tutorial, google apache php debian etch, si, yo a los buscadores suelo hablarles en indio, total, si luego van a pasar de las preposiciones y demás pues para eso yo me lo ahorro directamente, además de todos es sabido que lo adecuado es poner las palabras claves. Bueno encontré algo y reinstalo todo (apache+php) edito los archivos de configuración para que apache soporte php. Hecho, reinicio apache y... tampoco interpretaba código php, WTF!! Probé borrándolo una vez mas y probando un tutorial diferente, tampoco funcionó.

Entonces recordé un detalle, hace poco, como mes y medio, instale un nuevo servidor web, thttpd, que se trata de un sencillo servidor web, que no necesita archivo de configuración, las opciones se le ponen como parámetros, al que le interesen mas detalles que lea esto. El caso es que el servidor es muy cómodo, os cuento para que lo uso, yo todas las descargas que hago en el server con mldonkey van a /media/hde/mldonkey/incoming y otras descargas las tengo en /media/hde/series... en fin que de /media/hde cuelgan muchas cosas que me interesan y a las que me gustaría tener acceso sencillo, antes usaba netcat (y para casos concretos sigo usándolo), pero es muy cómodo moverte al directorio que te interese y poner thttpd -p 88 -d /media/hde y tener un servidor web en el puerto 88 con los /media/hde como directorio raiz y poder hacer streaming fácilmente, o descargar varios archivos del servidor... en fin menos trabajoso que netcat e infinitamente mas útil y cómodo (ojo me refiero a esta tarea, netcat sigue siendo utilísimo, sin embargo para esta necesidad creo que esta opción es mejor). O a lo mejor me interesan varios archivos del disco duro externo montado en /mnt, pues pongo otro server en el puerto 89 y con ese directorio como raíz, es una solución muy flexible.

Y la historia de thttpd a que viene? pues muy sencillo resulta que este servidor web "suplantó" a apache y se ejecutaba en el puerto 80, y este servidor no tiene soporte para php. Esto lo descubrí de una forma muy sencilla, puse en firefox http://debian y me mostró un listado de los archivos de /var/www (no hay index.*) en una página html con el formato por defecto de thttpd, así que lo reconocí al instante. Para solucionar el problema y comprobar que efectivamente el servicio corría y en ese puerto ejecuté: lsof -i TCP:80, vi el pid del proceso y lo maté, rearranqué apache probé el archivo info.php y se ejecutó! también lo hizo una shell que probé. Así que nada problema solucionado, simplemente pasaba que thttpd corría en lugar de apache.

Bueno realmente la historia no ha acabado, eso han sido los problemas para conseguir ejecutar páginas en php, pero todavía me queda otra cosa, yo había preparado una página vulnerable a RFI para hacer una demostración sobre como usar las shells php. El código que puse para el archivo que llame php.php podéis verlo aquí: http://neobiusnet.googlepages.com/php.txt

Con intención de pasarle luego luego como parámetro la shell (típico ataque rfi). Sin embargo por alguna razón que no entiendo (no sé php) me muestra esto al ejecutarlo:

Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/shells/php.php on line 5

RFI


Y el rfi no me funciona, alguien que sepa de php en la sala?

Nada mas, os seguiré contando mas cosas según vayan pasando.

PD: Vaya mierda blogger, no puedo poner código html, blogger lo interpreta y el código php lo ha transformado como ha querido. Así que lo he tenido que subir en txt a google pages.

Explicaciones

Ya se que llevo muchos días sin contar nada útil en el blog, y para eso os escribo este post, para comentaros que pasa, de todas formas este post ni es un cierre, ni tampoco es un "yo, ya posteare...." y luego tardo un mes en escribir, no. De hecho para hoy mismo espero haber terminado algún post.

Bueno os cuento, como sabéis la última semana he estado en Badajoz y no he podido hacer muchas cosas, por lo que tampoco tenía nada que contar, además de falta de tiempo. Luego cuando llegué aquí (creo que el miércoles) estuve preparando un post sobre shells php, pero se me complico el tema, porque para ilustrar mi post quería poneros screenshots y a lo mejor un vídeo, el plan era poner usar el apache + php que tengo en el servidor, poner una página php con una vulnerabilidad rfi y explotarla con alguna shell php, pero ya os digo, se complicó, el servidor web no iba bien, no ejecutaba páginas php... en fin un lío, y ahora lo que pasa es que como no se mucho de php (en realidad nada), la página que preparé cuando conseguí que el server funcionara bien, tenía (y tiene) un error y no hay manera de que funcione lo que yo tenía pensado.

Luego la fonera... la fonera desde aquel intento fallido que ya os conté en el último post no he podido volver a intentarlo por falta de tiempo (ahora os cuento), así que tampoco he podido hablar de eso, de todas formas tengo que conseguirlo como sea porque tampoco me serviría comprar una fonera nueva, porque las últimas para abrirle el ssh tiene que ser por hardware y estaría en las mismas. Cuando siga con este asunto os contaré, pero ya os digo que al primero que le interesa es a mi, porque si no todo el plan que tenía pensado se va al carajo no sirve para nada.

Además estos días he tenido poco tiempo, porque la semana anterior al viaje no salí prácticamente nada, luego me fui de viaje y cuando volví pues como hacía mucho tiempo que no veía a los amigos pues quedé estos días.

Y bueno eso es todo, ahora voy a escribiros unas cosillas, por ejemplo, los problemas que me han surgido para mi post sobre shells php. En fin que la situación se va a normalizar.

jueves, julio 19, 2007

Arreglando la fonera

Ya os conté ayer que recibí el circuito que necesitaba para la fonera, bien pues ya lo probé, al principio me faltaban conectores para los cables, pero al final los compré e intenté montarlo, lo primero fue soldar los pines al circuito, solo soldé los que iba a usar (4 de los 6 que hay), y luego corte cuatro trozos de cable les puse un conector en cada punta y lo conecté todo, luego lo conecté al puerto serie del ordenador y abro el hyperterminal de windows xp, creamos a la conexión y por fin enchufo la fonera a la corriente eléctrica, se enciende, y el resultado fue: fracaso!, el primer intento falló.

Eso lo hice sobre las 22:00 creo que serían, así que ya no tenía mas ganas de seguir probando, así que hoy haré mas intentos, seguiré probando a ver si lo consigo de una vez. Os pondría una foto, pero es que no la hice, y ahora mismo esta todo desconectado, en mi próxima prueba haré fotos para el post. Os seguiré contando...

miércoles, julio 18, 2007

Ya he vuelto

Hace escasos minutos acabo de llegar de Badajoz, ya estoy en mi casa, o como dice shinchandmc, en mi base. Perdonarme por no haber posteado nada desde el jueves, pero es que no he podido, tengo algunas cosas que contaros que espero poder postear lo mas pronto posible.

Desde que me fui estuve preocupado por llegar a tiempo para recoger el paquete que me mandaban desde Canadá, el que pedí en ebay, el que contiene el circuito necesario para reparar mi fonera. Porque lo pedí el día 3 y el vendedor me dijo que tardaría de 10 a 15 en llegarme, así que a lo mejor venían a entregármelo y yo no estaba aquí, lo primero que hice al soltar las maletas fue bajar al buzón para ver si había algún aviso de entrega de alguna agencia de transporte, cojo todas lo que había (un buen montón de papeles y sobres) y veo un sobre marrón que venía por Air Mail, desde Canadá!! y pone en una pegatina: electronic samples, era mi "paquete", lo abro y efectivamente era el circuito necesario. Una fotito:



Luego lo probaré y postearé como me ha ido. Y bueno nada mas, solo decir que espero que el blog y mi vida retomen su ritmo normal.

jueves, julio 12, 2007

Ingenieria inversa para la web 2.0 (II)

Esta es la segunda parte de mi reciente post Ingeniería inversa para la web 2.0, y es debido a que shinchandmc me dijo en un comentario que mi script fallaba, me dejo una url con la que mi script no funcionaba bien, y llevaba razón, nada mas ver la url lo supe. Mi respuesta la podéis leer en los comments de ese post, pero de todas formas voy a explicar un poco mas despacio porque falla, que falla y como lo he arreglado.

Mirar estas dos urls, la primera es la que puso sinchandmc y la segunda la que yo use en mi ejemplo y la que use durante la elaboración del script:

http://mp3tube.net/musics/Black-eyed-peace-Pump-it/45/
http://www.mp3tube.net/es/musics/Camaron-Como-el-agua/4844/

Mi script lo que fallaba en mi script es la parte donde obtiene el nombre de la canción, mirar esta línea:

NOMBRE=$(echo $1 | cut -f6 -d"/")

Lo que hace es dividir la url (el argumento 1, $1) según los símbolos "/", y se queda con la sexta parte, tomemos mi ejemplo:

http:, , www.mp3tube.net, es, musics, Camaron-Como-el-agua, 4844

Si contamos, "Camaron-Como-el-agua" es el número seis, y es con el que se queda el comando cut y lo que se almacena en la variable $NOMBRE. Sin embargo, tomemos ahora la url de shinchandmc:

http:, , mp3tube.net, musics, Black-eyed-peace-Pump-it, 45

Si contamos, el trozo número seis es "45" y no el nombre de la canción, esto es debido a que en la primera url había un trozo más, el "es" y en esta no lo hay, por lo que al haberme basado en la url que si incluye ese dato el script no funcionará bien con los que no tengan dicho dato.

Antes de ponerme a pensar una solución debía comprobar cuantos tipos de url hay en esa web, porque yo quiero que mi script sea universal, no que solo valga para algunas versiones de la web. Nada mas entrar en la web le di a una canción de la lista last music para comprobar como era la url, esta url no tenía ni "es" ni nada parecido. Luego probé eligiendo la versión en español de la web, ahora todas las canciones llevaban el "es" y por último probé la versión brasileña, en esta ocasión lo que se incluía era "br". La versión en inglés, la internacional, no incluye nada de ese estilo. Quedaba hacer una comprobación mas si yo tomo una url con el "es" o con "br" y se lo quito qué pasaría, lo hice y siguió funcionando bien, podía oir la canción tranquilamente, lo mismo pasa a la inversa, si yo tomo una url "internacional" sigue funcionando si le añado "br" o "es". Podéis comprobarlo entrar en estas tres páginas:

http://www.mp3tube.net/musics/Camaron-Como-el-agua/4844/
http://www.mp3tube.net/es/musics/Camaron-Como-el-agua/4844/
http://www.mp3tube.net/br/musics/Camaron-Como-el-agua/4844/

Entonces, la solución es de lo mas obvia, hay que identificar de alguna manera las url y ver cuales llevan "es" o "br" y cuales no, después mediante cut se usará -f6 para las primeras y -f5 para las segundas. La forma de hacerlo que a mi se me ha ocurrido es coger con cut el trozo número 4, el que corresponde a "es" y "br", pero en las url que no llevan ese parámetro sería "musics" en lugar de "es" o "br". Esta es la teoría, el pseudocódigo. Ahora vamos a programarlo de verdad.

Primero creamos una variable, en la que se almacenará el valor del trozo número 4, es decir o "es" o "br" o "musics", será la variable $TYPE:

TYPE=$(echo $1 | cut -f4 -d"/")

A continuación un simple if nos solucionará el problema:

Si $TYPE es igual a "es" -> cut va con -f6
Si $TYPE es igual a "br" -> cut va con -f6
Si $TYPE es igual a otra cosa -> cut va con -f5

if [ $TYPE = "es" ] ; then
 NOMBRE=$(echo $1 | cut -f6 -d"/")

elif [ $TYPE = "br" ] ; then

 NOMBRE=$(echo $1 | cut -f6 -d"/")

else

 NOMBRE=$(echo $1 | cut -f5 -d"/")
fi

Y por último, con la variable nombre elegida de forma correcta se cambia el nombre del archivo descargado:

mv $CANCION.tube $NOMBRE.mp3

Y para acabar sale un mensaje diciendo que el archivo $NOMBRE.mp3 ha sido guardado:

echo "El archivo $NOMBRE.mp3 ha sido guardado"

Esa es la solución que he programado, sin embargo se me ocurrieron otras dos mal útiles y elegantes, os pongo pseudocódigo porque no se programarlo así que no puedo poner otra cosa:

Otra forma de haberlo hecho hubiera sido poner solo un if/else y no un if/elif/else, así:

-Si $TYPE es igual a "es" o a "br" -> cut va con -f6
-Si $TYPE es igual a otra cosa -> cut va con -f5

El problema es que no sabía como poner ese parámetro lógico "o", así que esta no he podido hacerla.

Y la última solución, y para mi la mejor, sería usando comodines:

-Si $TYPE es igual a dos caracteres cualesquiera -> cut va con -f6
-Si $TYPE es igual a otra cosa -> cut va con -f5

Pero claro el problema es que tampoco se como ponerle el comodín necesario, ésta solución es la mejor por una razón básicamente: vale para siempre, si para las url "internacionales" sirve y también vale para las url de cualquier nuevo país que se añada a la lista, por ejemplo si ahora sacan una versión en francés ese parámetro sería "fr", mi script actualmente no funcionaría bien con eso, solo entiende de "es" y de "br". Sin embargo esta última solución es compatible con cualquiera porque solo comprueba que $TYPE es igual a dos caracteres, los que sean, y como todos los países se pueden representar con 2 letras pues ya estaría todo solucionado.

Si averiguo como solucionar ese pequeño problema lo haré y todos contentos :D

Para acabar comunicar una cosa, el nuevo script se puede descargar de aquí:

http://neobiusnet.googlepages.com/mp3tube.sh

Y cada vez que haya alguna actualización se podrá descargar desde ahí, porque las nuevas versiones siempre las voy a subir como mp3tube.sh, las antiguas tendrán un número adecuado, la primera versión todavía puede descargarse desde aquí:

http://neobiusnet.googlepages.com/mp3tube0.1.sh

Aunque no os lo recomiendo porque no funciona bien.

Nuevo libro: "Hacking ético"

Pues si, desde que lo vi cuando estuve por aquí en febrero me llamo mucho la atención, y estuve a punto de comprármelo de no ser por el "detallito" de que una punta de la tapa trasera estaba destrozada, luego iba a lanzarme a comprarlo por internet, pero finalmente vi otro en Cádiz, "Software Libre: Herramientas de Seguridad" y opté por este segundo libro. Ayer ya vi el libro y lo hojeé un poco, luego en casa mire en la web de la editorial el índice un poco mas despacio, y hoy no he aguantado más, he desembolsado 31.60€ y lo he comprado, es un libro muy interesante, empieza hablando de ética, luego un poco de leyes (yankis supongo) y divulgación correcta y ética de vulnerabilidades. La segunda parte ya empieza con lo técnico, habla de test de penetración, técnicas del hacker de hoy y automatización de test de penetración. Después toca hablar de exploits, desde cosas básicas, conocimientos de programación, depuración de código... exploits básicos para linux, avanzados, código para el shell de linux, y exploits básicos para windows. Para acabar, el libro trata el análisis de vulnerabilidades, ingeniería inversa, como crear un exploit para una vulnerabilidad localizada y como parchear una vulnerabilidad. Mas detalles en el índice. En fin un libro muy completo y muy interesante, al menos en apariencia :D

Bueno no puedo acabar este post sin poneros la foto de rigor, que aunque podáis ver el libro en muchos sitios, ya sabéis que me gusta poneros las fotos en el blog :)


PD: El fallo del script ya estoy intentando subsanarlo, cuando este listo (espero que pronto) lo posteo ;-)

De viaje a Badajoz

Ayer me vine a Badajoz, tras un viaje de cuatro horitas llegué aquí a las doce de la mañana. Lo primero que hice fue sacar el portátil y mi equipo wifi: la tarjeta integrada del portátil (atheros), un adaptador usb zydas, un adaptador usb ralink con posibilidad de conectarle una antena externa y dos antenas, una de 8dbi y otra creo que de 4.5dbi, además de la fontenna.

Con todo este arsenal arranque wifislax con intención de averiguar la clave wep de alguna de las redes wifi que hay por aquí, hay bastantes y la mayoría son de imagenio (tipo WLAN_XX) así que el asunto era bastante fácil, solo necesitaba algunos paquetes, y luego generar a partir del bssid y del essid de la red una lista de 65536 posibles claves y mediante aircrack-ng ver cual de ellas es la clave, además conviene apuntar la mac de algún equipo conectado a la red, ya que, al menos, con todas las redes imagenio con las que me he cruzado, tienen filtrado MAC. Bueno el caso es que en poco tiempo tenía dos cables y dos macs aparentemente útiles, así que reinicio y desde ubuntu cambio mi mac mediante el paquete macchanger:

macchanger ath0 -m XX:XX:XX:XX:XX:XX

Pero no conectaba, así que entonces pensé en probar la conexión de yoigo y luego seguir intentándolo con el wifi. Yoigo directamente no fui capaz de que me funcionara, después seguí con el wifi, pero recordé que la vez anterior que estuve por aquí configuré la tarjeta de red adecuadamente para que funcionara bien con la red WLAN_33 e hice un backup del fichero /etc/network/interfaces, que es el que tiene la configuración de los adaptadores de red. Lo próximo que hice es obvio no? restaure esa copia de seguridad del interfaces, después reinicié (realmente no es necesario, pero yo lo hice) y... no funcionó! Pensé que habrían cambiado la clave wifi o algo, así que volví a intentarlo las otras redes, pero no tenían dhcp, o al menos yo no tenía ip, quizás fuera problema de mi configuración, no me asignaban ip, probé con alguna pero no iba. Después intenté averiguar alguna ip mediante kismet, pero no había ningún cliente conectado, así que una vez mas, tampoco pude. Finalmente intenté conectarme desde ubuntu usando el usb zydas, así que preparé el archivo interfaces con la configuración adecuada (essid, mac, clave) y por fin funcionó, se conectó a la red WLAN_33 sin mayores problemas, ya tenía internet!!

Bueno chicos, creo que hoy voy a ser un poco malo y voy a apuntar mis antenas a la comisaria, que desde una ventana tengo visión directa hacia ella (y está relativamente cerca), vamos a ver que pasa...

Otra cosa, he vuelto a ver un libro curioso, "Hacking ético", la verdad es que me interesa mucho y estoy pensando muy seriamente si comprármelo o no. Ya os seguiré contando cosillas...