martes, 6 de septiembre de 2011

Santo y seña

Cuando vivíamos en la ciudad del río, ideamos una contraseña para llamar al portero, de esa forma, si alguien era de confianza se la enseñabas y sólo tenías que accionar el botón de abrir la puerta sin descolgar el telefonillo. Los había que conocieron el camino, pero no sabían la contraseña, un simple toque les delataba, no se les abría la puerta.

Llegó un momento que demasiadas personas sabían cuantos toques y como de espaciados debía de darlos para poder llegar a casa, los viernes a la noche, se convertía en niebla las paredes.
Así que ideamos otra y reducimos el número de personas conocedoras de la nueva contraseña. Al final, nos perdimos en la niebla y no recuerdo que sucedió después.

Los logins de aplicaciones web suelen estar a la vista de todos, hay imnumerables técnicas de esconderlos un poco más, limitar el número de intentos y banear la ip, acceso a login para una determinada ip, certificados, inputs locos y aleatorios...
El caso es que en un gran porcentaje y con la estandarización de CMS's, cualquiera puede poner delante de sí un login ajeno, que introduciendo un usuario y una contraseña, puedan tener acceso a los secretos más guardados del foro de aficionados a la poda y meterse bonsais por la nariz.

Combinando curl y un diccionario puedes tener mucho entretenimiento.

En cierto modo está bien, una internet abierta e "insegura", que andar asegurando todo, restringiendo, pero el caso es que...

El otro día hablando con C, salió una idea simple, de dotar a un login con una clave aleatoria sólo válida por 24 horas. Es decir, para poder acceder al login, debías de introducir una contraseña que pasadas X horas dejaría de ser útil.

Una variable GET alojaría cifrada en sha256 la fecha de hoy, si metes la correcta, entras en el login, por ejemplo:
http://ai.com/santoysena?santoysena=99172e969fcfa4cbc410938d4ff3fab472f9e66d1c7f6846f4c5171e5c2b89ba

jueves, 16 de junio de 2011

Contador de visitas en PHP y SQLite y el tiempo juanker real

A veces cuando uno despierta no se acuerda muy bien donde está, o donde estaba, o de qué trataba todo esto.

Crear base de datos SQLite


Crear index.php




En algunas películas de juankers siempre sale la típica escena de la chavalería reunida alrededor de un contador que va en tiempo real a toda máquina - "oh mike, lo hemos conseguido, el sueño rebelde americano, tomemos una cruzcampo americana" - "oh my god sí george qué rica la budweiser"

Crear tiemporeal.php:


Crear real.php:





Si tuviésemos acceso ssh a la máquina se puede intentar ver las visitas en tiempo real con:
# while true; do echo "SELECT * FROM cuanta;" | sqlite .ht.visitas && sleep 1; done

viernes, 29 de abril de 2011

Monito in the shell · Mapa de red

Desde que dejaron de hacer las casas sin corrales y en sentido vertical, a alquitranar las veredas, a sustituir, una cabra a cambio de tres gallinas ponedoras, por el papel moneda, a marcharse a la gran ciudad a trabajar en la fábrica química o java; desde entonces, algo empezó a ir mal.



Monito in the shell, mapa de red, son unas cuantas pocas líneas que sirven para ver que máquinas están encendidas en un rango predeterminado de direcciones IP.
¿Para qué vale eso?
En una granja de servidores, que necesitan estar encendidas 24 horas, puede tener su utilidad, para echar un vistazo rápido y que todas estén encendidas.
En una lan, puede tener su utilidad para ver quien anda enganchado... incluso se puede modificar el código para que al pulsar sobre una máquina se encienda o se apague por ssh o wake on lan o vete a saber.

La dependencia:
# apt-get install nmap

Los archivos:
* index.php


* mapared.php


Ésto es GPL, se distribuye sin ninguna garantía, pero puede gustarle a tu tía.

viernes, 22 de abril de 2011

Monito in the shell

¿Cómo mostrar a través de php en web y a tiempo real la salida de un comando linux?


Es una chapuza, pero se puede decir, que es como una prueba de concepto de la que partir para confeccionar un monitor completo de servidores linux en web. Uptime, whois, reboot, du, rsync, free, fdisk -l, top, nmap, iptables, history...

Necesitaremos tres archivos:
- index.php (será nuestra página principal)
- tiempoarriba.php (será el script que ejecute el comando uptime)
- jquery.js (lo utilizaremos para ejecutar tiempoarriba.php y mostrar su salida mediante ajax)

* index.php , es simplemente un archivo con la estructura básica HTML5.



A reseñar, nos bajamos jquery y lo enlazamos. Y creamos la función que nos traerá el comando. setInterval, lleva como segundo parámetro 1000 milisegundos = 1 segundo, que es el tiempo con el que indicamos ¿cada cuánto te ejecuto el primer parámetro? En este caso, es el método load() que carga via ajax la salida del script php tiempoarriba.php.
Dentro de body tenemos un selector con id=tiempoarriba, que es donde se vuelca la salida de tiempoarriba.php


*tiempoarriba.php



Es un script que utiliza la función shell_exec() para ejecutar un comando de sistema y devuelve (imprime por pantalla) la salida de ese comando.


Poco más, con ésto y un bizcocho, nos vemos a las ocho. En casa de Mateo siempre había cachondeo.

jueves, 3 de marzo de 2011

Cifrando lo cifrado

(02:23:46) jackepc@*****.org: cualquier cifrado es bueno
(02:23:50) jackepc@*****.org: mezclado
(02:23:56) jackepc@*****.org: primero uno luego otro luego otro
(02:24:10) jackepc@*****.org: un rot13 
(02:24:29) jackepc@*****.org: y finalmente eso tiene ya que ser chungo de descifrar por cualquiera
(02:24:44) jackepc@*****.org: si le aplicas 12 cifrados a algo

A partir de la versión 5 de PHP mayor o igual a 5.1.2 existe la función hash, que permite cifrar con diferentes algoritmos sin tener que pasar por funciones únicas para cada cifrado...

La función hash_algos() devuelve un array con todos los cifrados disponibles según la versión.

<?php
print_r(hash_algos());
>

Dando como salida:

$ php hash.php 
Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512
    [8] => ripemd128
    [9] => ripemd160
    [10] => ripemd256
    [11] => ripemd320
    [12] => whirlpool
    [13] => tiger128,3
    [14] => tiger160,3
    [15] => tiger192,3
    [16] => tiger128,4
    [17] => tiger160,4
    [18] => tiger192,4
    [19] => snefru
    [20] => snefru256
    [21] => gost
    [22] => adler32
    [23] => crc32
    [24] => crc32b
    [25] => salsa10
    [26] => salsa20
    [27] => haval128,3
    [28] => haval160,3
    [29] => haval192,3
    [30] => haval224,3
    [31] => haval256,3
    [32] => haval128,4
    [33] => haval160,4
    [34] => haval192,4
    [35] => haval224,4
    [36] => haval256,4
    [37] => haval128,5
    [38] => haval160,5
    [39] => haval192,5
    [40] => haval224,5
    [41] => haval256,5
)

Aprovechando esto se podría hacer un script que cifrase una cadena con 42 algoritmos.

function Cifrarsobrecifrado($cadena) {
        $algoritmos = hash_algos();
        foreach($algoritmos as $unoauno) {
                $cadena = hash($unoauno,$cadena);
                echo $cadena . "\n";
        }
        return $cadena;
}

$probando = Cifrarsobrecifrado('contrasenasecreta');
echo $probando;

Lo que da una salida de:
$ time php hash.php 
8e0ec964504817deb87afbf4d542b921
7c4d2d60feb6f152fe4148530b5aa8a7
801668e2df10c4f3b8cf1d5a7c74d5e7
04552b6704512181bc44eab7505799caf5cc1004
fcb8f1c23d9a3832e84661792af56a46658056636b306766f405c6f6
e3ec0be901f70c1e1f9ea9ea7857190cbf18b36c66b05dbf8db23ff2aaa34237
5a2780415e3d66ede2032a912e873735f5ff99e3f4b45988fd29a3e8e65123f6ee63f5e0b74155401b100d42a206a2be
26f68e9a3f23460c4ec1c67184d137585a0cc17def2d6cdf5cebd1f7db7fa5d6348988332044406901333b2369d2d6765007fba0d6249d9183a2dda38a5baf0e
59fddea5abe907057e19cd42858e7c49
5dd929a6bd7bd13fa8f6c2f39b6ee8aca4388270
62ba3ca82240c584920a24b0b2274ab9a79d45dd40a5ab9596e5e8960bfc92ff
cc528927b90ea4df810f797cce394a8b2ffb73594ccf727698059142e23d5834c0fa3e457c43c867
985840f12fc03a250f4393bf9e985010e155650cc472b8daaf1a3ce457cfa7822ff0d22f91a01c8c82ef80c4ad23f50f5331b99fa80a724e2de43b8d1beac738
fc5c829703f13e5626b5253897957a95
d831f81379f02d9db2e74038fc8bba8dcda0ae71
83c1b1599271ddedc453d3c59854212807131482a33313f9
11c04b0675ce420b1ceccac10edd42ac
b45f53747ebc0bef506415bf8ecd6bd387ee6481
dd91e00da7b7eca013cddf687d0a0a0860cc1026374107db
8a2749017fe9536c9810f355410eeed6b264276705da96363e54829cead4518c
ab6962656cece9568f2b3b39b6c749c6a60280fcb78f582a63d3057aeb30cc77
d04eceb0d5bef915edf3889ed870afe69f444475150c356a8d7fdf3d8d405edd
63501291
a5002b33
7ca961d0
9b06433a9a6670c5ffcc05a35b65c321c4bfe818e447631d873cd02201a25942a7fda24138cb9c9461bda6acb8c63e2cf59f97c0e2a90a4777836a76ff6b0e62
364a8fcfe521d311dcee3d52856a317caa979c3b7f610ae2d268fe0d64b89518ee92078e98f8b54ad6fe88a727d3b96eee1cd882d4a9176e655ca268371472b5
c5f78c84eab25b7478ccf88ab2cee435
a8f97b78f41671fe2421aac1e3afb976988aa4b6
1ac08a43ca76188e15cbff297fd7bdf8a81a3d0be8ebceef
fcf510c9681fc40d09f365f8b2ca8f2bb4e84c13f4b7dce7eb3ffb2e
ac1aa5c224a3ecf7c5f3e4309e495584550d7096d39ab56bfc8eef8110d84e53
69e9b462043de728187548e00dbba6b9
677560b09b3eb1f57b923b33b21e3efa1ad233eb
04a875dfceaaa74a7b3bebdbb5d9955a10e2e9cd10cb23ce
4ae4c7c9586f4945fb1abb01e67f6f90f18cda4c3bffa55f22be3cc5
d67cec989d7c4ea6bb51bc133f90b8073925ffb3e077c13be357609e2d83d27f
7e2fde43b6aa9e23257364519df6dc00
3281f44da1ce5c91f7197954aa4be95c7566a29d
9ce4de6db48260d500da19813e39c8e34ed6105754d68dff
1a56671a0876314b02a37ede0d895649208481e56923f0e4c7df3d68
bece05d589767418fef23db81029a287b03cea592d57462bc5c35fb7ea87f906
bece05d589767418fef23db81029a287b03cea592d57462bc5c35fb7ea87f906
real 0m0.055s
user 0m0.044s
sys 0m0.004s

Conclusión: Si te resfrias tampoco hace falta que vayas al médico, puedes beber limonada y zumos de naranja de la época. No se requiere pasar por tantos cifrados para generar claves seguras pero pasar por un par de ellos y combinar algortimos aleatorios puede estar bien.

lunes, 28 de febrero de 2011

Buscador de archivos SAMBA en php

Nunca he liberado nada, ésto tampoco es que merezca la pena liberarlo, pero quizás pueda resultarle útil a alguien el planteamiento. Se distribuye con licencia GPL, sin ninguna garantía pero puede gustarle a tu tía. Se descarga abajo.

Un par de veces me han cogido de primo para montar un servidor de archivos compartidos. Lo elegido era samba, porque eran redes heterogéneas con máquinas linux y máquinas W... Cuando estaba todo montado y parecía que funcionaba me puse a escuchar a ver que decía la gente.
- "Oye pepito cómo se llamaba el archivo donde estaban los contactos que hice y dónde estaba"
- "No me acuerdo, mira a ver por ahí"

Entonces probé a usar el buscador de archivos de gnome contra el directorio samba montado, y eso no iba bien, no sé por qué, lentitud, demasiados archivos... Lo común en ambos casos era un directorio compartido con unos 60-200 GB con total acceso para todos...

Y bueno, el caso es que hice una especie de buscador samba en php que se ejecutaba en el servidor y por lo tanto cualquier máquina de la red tenía acceso a la aplicación para buscar y abrir los archivos encontrados.


¿Cómo cojones se monta esta mierda que no interesa a nadie?
En principio, supongamos que el directorio compartido es /home/servidor/compartida y samba está ya configurado.
Tenemos instalado apache y php en el servidor.

# cd /var/www
# mkdir buscador
# cd buscador

Dentro del directorio buscador crearemos index.php

<html>
<head>
 <title>
  BUSCADOR DE ARCHIVOS SAMBA
 </title>

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 <script type="text/javascript">

  function cargar(){

   document.buscador.abuscar.focus();  

  }

 </script>

 <style type="text/css">

  body {
   margin:50px 0px; 
   padding:0px;
   text-align:center;
  }
  a {
   color:#000000;
  }
  #Content {
   width:510px;
   margin:0px auto;
   padding:15px;
   text-align:left;
   border:1px dashed #5b197b;
   background-color:#ddc9ec;
  }
  #encuentros {
   text-align:left;
  }

 </style>


</head>

<body onload="cargar()">

<img src="logo.png">

<div id="content">

<form name="buscador" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">

 <input type="text" size="50" name="abuscar" value="<?php echo $_POST['abuscar'] ?>">

 <input type="submit" value="BUSCAR" name="boton">

</form>

</div>

<?php


#si ha pulsado el botón buscar, buscamos

if (isset($_POST['boton'])) {

 $abuscar = $_POST['abuscar'];

 if ($abuscar==NULL) {

         echo "Por favor introduzca algo que buscar";  
 }
 else {

  #COMIENZA LA BÚSQUEDA

  $comando="find /home/servidor/compartida -iname '*". $abuscar  ."*'";

  $salida=shell_exec($comando);

  if ($salida==NULL) {

   #no se han encontrado resultados

   echo "No se han encontrado resultados coincidentes a su búsqueda, Inténtelo de nuevo o salga a tomar el aire";

  }

  else{ 

   #pasar archivos encontrados a array

   #tabla bicolor por múltiplos de 2

   #enlace a cada archivo encontrado

   $encontradosarray = explode("\n", $salida);


   #eliminamos último array que se devuelve en blanco

   $ultimo=count($encontradosarray);

   unset($encontradosarray['$ultimo']);

   echo "<div id=\"encuentros\"><pre>";

   echo "<table align=\"center\">";

   $i=1;

   foreach($encontradosarray as $valor) {

           if($valor!=NULL) {

     if ($i % 2 == 0){

      echo "<tr>";

     }  

     else{

      echo "<tr bgcolor=\"#efefef\">";

     }

    

     echo "<td>";

      echo $i;

     echo "</td>";

   

     $valori = substr($valor,26);

    

     $valori1 = str_ireplace($abuscar,"<b>".$abuscar."</b>",$valori);


     echo "<td>";

      echo "<a href=\"samba/".$valori."\">".$valori1."</a><br>";

    

     echo "</td>";



     #Cerramos fila 

     echo "</tr>";


     $i++;

    }

   }

   echo "</pre></div>";

   echo "</table>"; 

  }

 }

}

?>

</body>

</html>


Una vez tenemos ya preparado nuestro buscador nos queda un último detalle, hacer accesibles los archivos encontrados desde el navegador.

# cd /var/www/buscador
# mkdir samba
# chmod 777 samba
# chown -R www-data:www-data /var/www/buscador

Y agregamos a /etc/fstab la siguiente línea
/home/servidor/compartida   /var/www/buscador/samba   none    bind  0  0

Reiniciamos y buscador funcionando.

Formato fecha españa cateta desde SQLite hacia PHP

Las fechas se suelen almacenar en las bases de datos con formato yanqui, o lo que es lo mismo AÑO-MES-DÍA. Para mostrar dichas en formato de por aquí DÍA-MES-AÑO se puede echar mano de la función explode de php:

$ sqlite fechas.sqlite
SQLite version 2.8.17
Enter ".help" for instructions
sqlite> CREATE TABLE Fechas(id INTEGER PRIMARY KEY,fecha NUMERIC);
sqlite> INSERT INTO Fechas(fecha) VALUES('2010-12-31');
sqlite> INSERT INTO Fechas(fecha) VALUES(date('now'));
sqlite> SELECT * FROM Fechas;
1|2010-12-31
2|2011-02-28
sqlite> 

Creamos base de datos llamada fechas.sqlite, tabla Fechas con el campo id que será auto incrementable, y el campo fecha.
Para acceder y mostrar los datos desde php procederíamos con:

<?php

$conexion = sqlite_open('fechas.sqlite');
$sentencia = sqlite_query($conexion, "SELECT * FROM Fechas");
while ($campo = sqlite_fetch_array($sentencia)) {
 $trocitos = explode('-',$campo['fecha']);
 $dia = $trocitos[2];
 $mes = $trocitos[1];
 $ano = $trocitos[0];
 echo $dia ."-". $mes ."-". $ano ."<br>";
}
sqlite_close($conexion);

/**
SALIDA:
31-12-2010
28-02-2011
**/

?>

Con explode conseguimos dividir una cadena en trozos a partir de un patrón, en este caso "-". El resultado es un array con tantos índices como trocitos.