Blog de Cymo - un poquito abandonado

martes, 13 de agosto de 2013

Hackit 2013 - Nivel 2 (parte I)

Hola de nuevo, gente. Para darle gusto a marcan así como a los inexistentes lectores de este no-blog, vamos a publicar una posible solución al nivel 2 del hackit, la que se daba por hecho que cualquiera iba a intentar (aunque gracias a los chicos de DiarioLinux conocemos una forma más rápida) ;-)

Recordemos la prueba consistía en un archivo RAR cifrado, del que nos daban una pista sobre la contraeña:


 echo sha1(md5($password)); ?>
77134aa1b02b61cd841d2a81bf64796a31234e28


Tanto SHA1 como MD5 son funciones de resumen criptográfico (reducciones criptográficas, digests), esto es: cualquiera de las dos toma como entrada un flujo de octetos de tamaño arbitrario y producen una salida de tamaño fijo: 20 octetos (160bits) para SHA-1 y 16 octetos (128 bits) para MD5.

Existen muchas funciones que convierten unos datos arbitrarios en uno de tamaño fijo: por ejemplo la función CERO que, para cualquier dato de entrada siempre produce el resultado (constante) 0.

Las funciones de resumen criptográfico tienen interés porque su resultado no es trivial y cumple una serie de  propiedades, de las que cito las relevantes para entender como resolver el nivel, a continuación:

  • Calcular la salida para unos datos de entrada no debe ser muy costoso.
  • Para una misma entrada, la salida siempre es la misma.
  • Es muy difícil (costoso) averiguar el mensaje original a partir del valor resumen.

Así pues, salvo que "hagamos trampa" y usemos tablas arcoíris propios o ajenos, como proponen en DiarioLinux, tendremos que usar un enfoque más... programático.

Implementaremos lo que se llama un "ataque basado en diccionario", esto es, partiremos de un diccionario de palabras e iremos computando los hashes o resúmenes de cada una de las palabras, a ver si encontramos una coincidencia con lo que nos proponen en el reto. Como en el enunciado se nos avisa que el "orgo" correspondiente nació en Whiston, supondremos que fala Inglés, y tiraremos del diccionario correspondiente:

#  apt-get install wbritish-insane
#  wc -l /usr/share/dict/british-english-insane
650656 /usr/share/dict/british-english-insane

Tenemos 650656 palabras para probar. Ahí es nada.

A continuación nos tenemos que currar algún programa que implemente el algoritmo del marinero:

Tome una palabra del fichero
Calcule el MD5 de dicha palabra
    Exprese el MD5 en hexadecimal, minúsculas (¡el MD5 son 16 octetos!)
Calcule el SHA1 del valor hexadecimal del paso anterior
¿Coincide con el valor con lo buscado? Pues si es que no, siguiente palabra. Y si es que sí, tenemos la palabra buscada.


En mi caso, el diccionario para la máquina Java estaba guardado en ~/temp. Ahí van la soluciones propuestas en Python, PHP (ya que así se planteaba en el reto) y JAVA.

El tiempo de ejecución en mi pc fue de 785 milisegundos para la versión Java, 1.1 segundos para PHP y de 2.12 segundos en Python; para obtener la clave 'hackster'. En qué andaría pensando el orgo para escoger esa contraseña ...

Python

#!/usr/bin/python
# Python 2.7.3

from hashlib import md5, sha1

with open("/usr/share/dict/british-english-insane", "rt") as f:
    for word in f.readlines():
        if sha1(md5(word.rstrip()).hexdigest()).hexdigest() == '77134aa1b02b61cd841d2a81bf64796a31234e28':
            print 'Your word is %s' % word
            exit

PHP


foreach (file("/usr/share/dict/british-english-insane", FILE_IGNORE_NEW_LINES) as $i => $palabra)
        if (sha1(md5($palabra)) == '77134aa1b02b61cd841d2a81bf64796a31234e28') {
                echo 'El password es '. $palabra ;
                break;
        }
?>


Java (hazte un café para mientras te lo lees y eso)

package org.euskal.hackit.passCrack;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * Hackit 2013 - Level 2 Cracker
 * 
 * @author cymo
 * 
 */

public class Crackit implements Runnable {

 /**
  * ; ?> 77134aa1b02b61cd841d2a81bf64796a31234e28
  * 
  * @param args
  */

 private static final int ERROR_LOADING_WORDLIST = 100;

 /**
  * Name of the dictionary to load & use
  */
 String dictName = "american-english-insane";

 /**
  * Words we are loading in memory as byte-arrays (faster to compare)
  */
 List<byte[]> wordList = new LinkedList<>();

 /**
  * The md5
  */
 MessageDigest md5;

 /**
  * The sha1
  */
 MessageDigest sha1;

 /**
  * Expected hash, as byte-array
  */
 byte[] expectedHash;

 /**
  * Constructor
  */
 Crackit() {
  String hash = "77134aa1b02b61cd841d2a81bf64796a31234e28"; // sha1(md5($password)

  expectedHash = new byte[hash.length() / 2];
  // Convert the hexstring-value to a bytearraybacked-value
  for (int i = 0; i < hash.length(); i += 2) {
   String strByte = "" + hash.charAt(i) + hash.charAt(i + 1);
   expectedHash[i / 2] = Integer.valueOf(strByte, 16).byteValue();
  }

 }

 public static void main(String[] args) {
  Crackit program = new Crackit();
  long initMillis = System.currentTimeMillis();
  program.run();
  System.out.println(String.format("Excecution took: %d milliseconds", System.currentTimeMillis() - initMillis));
 }

 @Override
 public void run() {
  try {
   // Load wordList
   loadWordList();
   // Create MessageDigests
   initDigests();
   // Iterate cracking
   iterateCracking();
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
   System.exit(102);
  }

 }

 /**
  * Iterate over the dictionary, computing sha1(md5(word)) and comparing it
  * to the desired result
  * 
  * @throws UnsupportedEncodingException
  *             If your JVM is broken enough not to support ASCII encoding
  */
 private void iterateCracking() throws UnsupportedEncodingException {

  int i = 0;
  for (byte[] word : wordList) {
   if (i > 0 && i % 100 == 0)
    System.out.printf("Progress: %d of %d (%s)\n", i,
      wordList.size(), new String(word, "ASCII"));
   ++i;
   byte[] md5Bytes = md5.digest(word); // this is binary!
   byte[] md5AsHex = Conversion.byteArray2HexAsciiByteArray(md5Bytes);
   byte[] result = sha1.digest(md5AsHex); // get the sha1

   if (Arrays.equals(result, expectedHash)) {
    System.out.printf("The missing word is: %s\n", new String(word,
      "ASCII"));
    return;
   }
  }
  System.out.println("Password not found in dictionary :S");

 }

 /**
  * Create the message digests
  */
 protected void initDigests() {
  try {
   md5 = MessageDigest.getInstance("MD5");
   sha1 = MessageDigest.getInstance("SHA1");
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
   System.exit(101);
  }
  System.out.println("Message Digests Succesfully Created!");
 }

 /**
  * Loads a list of words from a file located at ~/temp
  */
 private void loadWordList() {
  String home = System.getProperty("user.home");
  String fileSeparator = System.getProperty("file.separator");
  String fileName = home + fileSeparator + "temp" + fileSeparator
    + dictName;
  try {
   BufferedReader br = new BufferedReader(new InputStreamReader(
     new FileInputStream(fileName), Charset.forName("ASCII")));
   String line = br.readLine();

   while (line != null) {
    // do not store the words as strings but as byte[]
    wordList.add(line.getBytes("ASCII")); 
    line = br.readLine();
   }
   br.close();
   System.out.printf("Wordlist of %d words, loaded\n", wordList.size());
  } catch (IOException e) {
   e.printStackTrace();
   System.exit(ERROR_LOADING_WORDLIST);
  }

 }

}

/**
 * Helper class to convert a binary-value backed by a byte[], to a hex-value
 * backed by another byte[]
 * 
 * @author cymo
 * 
 */
class Conversion {
 private static final int a_OFFSET = 'a' - 0x0a;
 /**
  * Helper variable for MD5s only!
  */
 private static byte[] resultHelper = new byte[32];
 
 /**
  * Thread UNSAFE method to convert a bin-value (byte[]) to a byte[] backed
  * asciihex value
/>
  * 
  * @param binaryArray
  *            The binary value to convert
  * @return The asciihex-value backed by a byte[]
  */
 static byte[] byteArray2HexAsciiByteArray(byte[] binaryArray) {

  int i = 0;
  for (byte b : binaryArray) {
   resultHelper[i] = (byte) ((b & 0xF0) >>> 4);
   resultHelper[i] += ((resultHelper[i++] <= 9) ? '0'
     : a_OFFSET);
   resultHelper[i] = (byte) (b & 0x0F);
   resultHelper[i] += ((resultHelper[i++] <= 9) ? '0'
     : a_OFFSET);
  }

  return resultHelper;
 }
}


Nos vemos (bueno, es un decir, lector inexistente) en la parte II donde explicaremos una vía alternativa a la DL para obtener las contraseñas de Maven.


viernes, 9 de agosto de 2013

HackIt! 2013. Level 5. Cifrado casero

Continuando (y agradeciendo) el trabajo publicado por Diario Linux, y pasando de puntillas por el fail del algoritmo (conocido, pero ignorado), quiero pasar a comentar cuál era el planteamiento de resolución que esperaba que se aplicara (si bien ellos lo resolvieron de una manera más sencilla).

Si no hiciste el hackit, o no recuerdas de qué iba el nivel, te sugiero que te leas previamente los dos artículos publicados por DL: primero y segundo.

Uno de los ficheros que se entregaban era el correspondiente a la clase PrepareHackit2013, que como su nombre sugiere, era el programa que preparaba los ficheros "clazz" for the great craic:


public static void main(final String[] args) {
final CryptUtil crypter = new CryptUtil(PasswordReveal.daKey);
final String clearTextClassNames[] = { "TestClass1", "TestClass2" };
final String cryptedClassNames[] = { "PasswordReveal" };

encryptClass(crypter, pkgName, true, cryptedClassNames);
encryptClass(crypter, pkgName, false, clearTextClassNames);
}

El false de la segunda llamada a encriptación es lo que nos abre las puertas a un ataque criptográfico de libro: las clases TestClass1 y TestClass2, se cifran pero no serán borradas. Unido a lo patatero, no ya del algoritmo, sino del mecanismo de cifrado que usa un keystream generado con la misma clave para todos los ficheros sin ningún tipo de IV/SV, implica un big fail de seguridad.

Al turrón: 

La operación XOR (⊕) es reversible: si A ⊕ B = C => A ⊕ C = B

Resulta que disponemos de al menos un texto claro (TestClass1.class) y su correspondiente versión cifrada (TestClass1.clazz) lo cual nos permite obtener un keystream de 1.35kB de longitud 
Basta con aplicar el keystream a cualquier texto cifrado de longitud inferior o igual, y obtendremos el texto en claro. Y viceversa.


Osea: TestClass1.class ⊕ keystream = TestClass1.clazz
=>
TestClass1.clazz ⊕ TestClass1.class = keystream

Conociendo el keystream, resulta que el fichero de la clase Java que nos interesa es PasswordReveal.clazz, que ocupa 928 bytes... y que por tanto, podemos descifrar sin conocer la clave aplicando únicamente el keystream porque:

PasswordReveal.clazz ⊕ keystream = PasswordReveal.class

Y eso era todo: sólo faltaba ejecutar dicha clase y obtener la clave del nivel que era... bueno, descúbrela por ti mismo. Sólo diré que encima de la CPU tengo una caja de caramelos de café (de ahí lo apropiado del nivel Java).

Una posible solución Java7:



package org.euskal.hackit.solution._2013;

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * Example solution for 2013 Java-crypt-hackit-cymolevel
 * @author Cymo
 *
 */
public class Solve2013 implements Runnable {

/**
*  Eclipse project, bytecode located @bin folder
*/
private static final String BYTECODE_SUBFOLDER = "bin\\";

/**
* Package with prepared files
*/
public static final String thePackage = "org.euskal.hackit._2013";

/**
* Entry point
* @param args Will be unmercifully ignored
*/
public static void main(String[] args) {
new Solve2013().run();
}

@Override
public void run() {
// Load TestClass1.class
// Load TestClass1.clazz
// Load PasswordReveal.clazz
// Get the keystream
// Apply keystram to PasswordReveal
// Write back PasswordReveal.class
// Load an excecute PasswordReveal.class

try {
String fileSeparator = FileSystems.getDefault().getSeparator();
String rootDir = BYTECODE_SUBFOLDER + thePackage.replace(".", fileSeparator)
+ fileSeparator;

Path[] paths = {
Paths.get(rootDir + "TestClass1.clazz"),
Paths.get(rootDir + "TestClass1.class"),
Paths.get(rootDir + "PasswordReveal.clazz"),
Paths.get(rootDir + "PasswordReveal.class") };

ByteBuffer[] buffers = new ByteBuffer[paths.length];

// Load the pair (plain text + cypertext) and PasswordReveal cyphertext
for (int i = 0; i < 3; i++) {
System.out.println("[LOAD] " + paths[0]);
// Not a good general solution, but close enough due to small filesize
buffers[i] = ByteBuffer.allocateDirect((int) Files.size(paths[i]));
FileChannel fc = FileChannel.open(paths[i],StandardOpenOption.READ);
fc.read(buffers[i]); fc.close();
// Buffer is loaded, we will want to read from it afterwards
buffers[i].flip();
}

// Check cyphertext.length == cleartext.length and there is enough data to generate the keystream to decypher PasswordReveal 
if (!(buffers[0].limit() == buffers[1].limit() && buffers[1]
.limit() >= buffers[2].limit())) {
System.err.println("Something went wrong :S");
System.exit(100);
}

// Allocate space for decrypted class
int cryptedBufferSize = buffers[paths.length - 2].limit();
buffers[3] = ByteBuffer.allocateDirect(cryptedBufferSize);

// Decrypt data into ram
for (int i = 0; i < cryptedBufferSize; i++)
buffers[3].put((byte) (buffers[0].get() ^ buffers[1].get() ^ buffers[2].get()));

buffers[3].flip();
FileChannel dest = FileChannel.open(paths[3],
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
System.out.println("[WRITE] Decrypted " + paths[3]);
dest.write(buffers[3]);
dest.close();

System.out.println("\n\n\n");
// Behold!
((Runnable) Class.forName(thePackage + ".PasswordReveal")
.newInstance()).run();

} catch (Exception e) {
e.printStackTrace();
}

}
}


Otra pysibilidad:


#!/usr/bin/python
# python 2.7

import os
from subprocess import call

destPath='org/euskal/hackit/_2013'
try:
        os.makedirs( destPath )
except:
        pass

fs = ( open("TestClass1.class", "rb"),  open("TestClass1.clazz", "rb"), open("PasswordReveal.clazz", "rb"),  open("%s/PasswordReveal.class" % destPath, "wb+") )

crb, i= fs[2].read(1), 0
while crb:
        crb, i = ord(crb), i+1
        ctb = ord(fs[0].read(1)) ^ ord(fs[1].read(1)) ^ crb
        fs[3].write('%c' % ctb)
        crb = fs[2].read(1)

print 'Written %d octets' % i

for f in fs:
        f.close()
call(['java', '%s.PasswordReveal' % destPath.replace('/', '.')])

lunes, 4 de junio de 2012

Día triste : Muere Eduard Jil t.c.c. Trololó

¡Tololó! Ahora ya estás en casa. D.E.P. Eduard Jil en Wikipedia. Y una de mis favoritas: La-la-la http://www.youtube.com/watch?v=G-MQwgiVbqI

sábado, 19 de noviembre de 2011

Recetas de Hummus según JBA

Pues nada, otra recetilla más para el blog. En este caso, adquirida desde los sabios consejos de mi compañero de trabajo, el Sr. JBA.

El humus se ha de comer lo más reciente posible. Idealmente, se come templado, recién hecho. No tolera bien el paso del tiempo, y aunque lo refrigeremos, perderá parte de sus cualidades organolépticas de un día para otro.

¡Sorpresa! El hummus es puré de garbanzos (no confundir con el otro humus). Se puede servir con múltiples acompañamientos, de los que exploraremos dos: guarnición de carne y salsa tahína (este es el nombre con el que la hemos bautizado, a lo mejor en otros sitios le llaman diferente).

Ingredientes para el humus:
Garbanzos de calidad. Recomiendo "pedrosillanos" de La Bañeza (de marca Luengo, son los que yo gasto y salen excelentes).
Levadura royal "química", o bicarbonato sódico.
Aceite de oliva virgen extra, del bueno.
Sal.
Tahín blanco (puré de sésamo, pero que sea blanco, no tostado: se consigue en herboristerías).


Ingredientes para la salsa tahína:
Tahín blanco.
El zumo de medio limón.
Un diente de ajo.
Pimienta negra.
Pimentón de La Vera (u otro, pero que sea del bueno).
Perejil.

Ingredientes para la guarnición de carne:
Carne picada (lo "tradicional" sería carne de cordero, pero podemos usar la carne picada que queramos: pollo, vaca, ...)
Cebolla de cocinar
Pimienta negra
Aceite de oliva
Sal
Piñones
Perejil picado.


Ingredientes Accesorios (podemos elegir todos, algunos o ninguno):
Pan de pita.
Tomate.
Cebolla
Endivias
Pepinillos
Guindillas



Elaboración del hummus
Se ponen a remojo, con 24 horas de antelación, los garbanzos (bien cubiertos de agua) con un sobre de levadura Royal "química" (o bicarbonato sódico si no tenemos levadura). Podemos usar la misma olla donde vayamos a cocerlos.

A las 24 horas, lavar los garbanzos remojados con abundante agua fresca, para eliminar los la levadura/bicarbonato. Vamos a cocerlos destapados (agregar un poco de sal al principio) durante una hora a fuego medio (justo justo al pil pil, que burbujee el agua). Hay que prever que tendremos mucha evaporación de agua, por lo que tomaremos la precaución de llevar la olla bien hasta arriba.

A la hora, retiramos del fuego y con ayuda de un cazo o espumadera, los vamos echando en el recipiente de picado de la picadora o batidora-picadora:

Picamos los garbanzos hasta obtener un puré muy denso. Para hacerlo más líquido, añadiremos un buen chorro de aceite de oliva virgen extra (y seguimos picando o removemos). Si con el aceite no fuese suficiente para obtener la consistencia deseada, y para no estropear el humus con demasiado aceite, podemos añadir un poco de agua templada o alguna cucharada de Tahín.
Ajustada la consistencia al grado deseado (tampoco tiene que quedar líquida), probamos el punto de sal y si fuese necesario, añadimos más. Reservamos el puré.

Salsa tahína:
En un cuenco ponemos 2 partes de Tahín (3 ó 4 cucharadas soperas bien cargadas). Añadimos 1 parte de zumo de limón (el zumo de medio limón) y removemos con una cuchara, hasta que quede bien mezclado. Después añadimos dos partes de agua (el doble de cantidad que hayamos puesto de zumo de limón), poco a poco, mezclando bien con la cuchara. El tahín emulsiona muy bien, y quedará todo bien mezclado. Si nos hemos pasado con el líquido, siempre podemos añadir más tahín, poco a poco, hasta compensar.
Una vez tengamos todo mezclado, añadimos un poco de pimienta negra molida.

En una tabla de cortar, seleccionamos unas cuantas ramas de perejil (6 ó 7) y descartando los tallos, picamos lo más fino que sepamos, la parte de las hojas con un cuchillo. Igualmente, pelamos un diente de ajo, le quitamos el tallo central (para que no tepita) y lo picamos lo más fino que sepamos.

El perejil y el ajo picados se incorporan a la mezcla emulsionada de tahín-agua-limón y se remueve bien. Añadimos un poco de pimienta negra molida, al gusto (y removemos). Decoramos la salsa con un chorro de aceite de oliva virgen extra y con un poco de pimentón espolvoreado. Reservar.

Guarnición de carne:

Picamos la cebolla fina.
En una sartén, ponemos un poco de aceite a calentar y, cuando esté bien caliente, espolvoreamos un poco de pimienta negra. Disfrutamos del olor, y cuando la pimienta esté ligeramente tostada, añadimos la cebolla fina.
La cebolla tardará un poco más en hacerse que la carne, así que echamos la carne después de la cebolla, y vamos removiendo con una cuchara de palo. Sal al gusto. Reservar.

Ingredientes Accesorios:

El humus, tradicionalmente, se comía con las manos. Para ayudarse en la tarea, podemos hacer "cucharas" con vegetales. Las hojas de las endivias a modo de barcas, la cebolla cortada en gajos de los que sacamos láminas cóncavas; rodajas de tomate, pepinillos, guindillas... muchos vegetales son aptos para ser usados como "cucharas comestibles".


El pan de pita también podemos usarlo. Sólo hay que acordarse de remojarlo brevemente en agua del grifo y tostarlo (tostadora o sartén limpia y caliente).


Presentación 1:



En un plato, hacemos un "volcán" con el puré de garbanzos y en el centro, echamos salsa tahína. Podemos espolvorearlo con un poco más de pimentón si queremos (las salsa ya lo llevaba).
Se come con cuchara, ya sea tradicional o "comestible" (endivias, tomate, pan de pita ...)

Presentación 2:


En un plato ponemos una capa de puré de garbanzos, cubrimos con una capa de guarnición de carne y salpicamos de piñones y perejil picado.

Etiquetas: ,

domingo, 27 de febrero de 2011

Instalando OKI MC351 en Ubuntu 10.04 Lucid

Me ha dado más guerra de lo que esperaba. En mi caso está conectada a la intranet con una ip fija (192.168.33.55.18) asignada por DHCP.

Suponiendo que ya tenemos CUPS instalado y funcionando, abrir en el navegador http://localhost:631

Añadir la impresora, y como URI poner socket://IP-impresora:9100 (IP-Impresora la que tengamos, claro, por ej: 192.168.33.55.18).

Seleccionar el archivo PPD del DVD de la impresora, en mi caso: /media/cdrom/Drivers/ESP/PS/amd64/OKM351BA.PPD


Y claro, no funciona. Error porque el socket no es un URI válido.
$ sudo lpinfo -v

Y no me sale el interfaz socket. ¿?

Solución: crear un enlace al programa/librería socket de cups, que no viene activado por defecto. Y no acabo de entender por qué.

$sudo ln -s /usr/lib/cups/backend-available/socket /usr/lib/cups/backend/socket

Y reiniciar cups:

$sudo service cups restart

Con esa modificación, ya puedo crear la impresora. Pero no imprime. Revisando los logs de cups, veo
/usr/lib/cups/backend/socket: Permission denied

???

Reviso, y tiene permisos de ejecución.

Investigo un poco:

$ sudo dmesg -c
$ sudo aa-complain cups

Vuelvo a imprimir, y claro, el mismo error, pero ahora...

$dmesg
Operation="exec" pid=5529 parent=5519 profile="/usr/sbin/cupsd" requested_mask="::x" denied_mask="::x" fsuid=7 ouid=0 name="/usr/lib/cups/backend-available/socket"

Resulta que App Armor no le deja ejecutarse al script (el backend de cups no está habilitado en App Armor).

Solución 1: en vez de hacer un enlace simbólico para el interfaz socket, hacer un copy:

$ cp /usr/lib/cups/backend-available/socket /usr/lib/cups/backend/socket

Debería funcionar sin más.

Solución 2 (la que he utilizado): editar el perfil de cups en apparmor:

$gksu gedit /etc/apparmor.d/usr.sbin.cupsd

En la línea 84, aprox, vemos:

/usr/lib/cups/backend/socket ixr,
/usr/lib/cups/backend/usb ixr,


Lo cambiamos, añadiendo una línea:

/usr/lib/cups/backend/socket ixr,
/usr/lib/cups/backend-available/socket ixr,
/usr/lib/cups/backend/usb ixr,


Reiniciar app armor y cups (por si acaso):

$sudo service apparmor restart
$sudo service cups restart

Y a imprimir.

viernes, 10 de diciembre de 2010

Configurando "el pincho USB de la euskal" en Ubuntu Linux 10.10 (Alcatel X225L)

Primero: este post está fuertemente basado en el de Borjanet en el que explica como conectarse con un módem similar, pero con Simyo en vez de Euskaltel. Si Simyo me regala un módem Huawei de esos que reparten, pues ya hablaremos de cómo configurarlo ;-)

De momento, vamos con el de Euskaltel.


El método asume que la SIM no tiene PIN habilitado. Si tenemos PIN y no lo queremos quitar (algo muy razonable, por cierto, pero que puede acabar dando problemas para conectar), ir al final para ver el apartado de conectarse con PIN.

1º Instalar el software necesario: gnome-ppp

Nota: En versiones anteriores de Ubuntu hacían falta hechizos para cambiar el módem de "CD-ROM emulado" a "Módem". Ahora, Ubuntu ya lo hace solita. Así que nos olvidamos de esa parte.

En consola: $sudo apt-get install gnome-ppp
O bien instalarlo desde Synaptic: Sistema->Administración->Getor de paquetes Synaptic

Una vez instalado:

2º Iniciar gnome-ppp (Aplicaciones -> Internet)

En la ventana Gnome PPP


Usuario: CLIENTE
Password: EUSKALTEL

(Ojo que van en mayúsculas). Esta información, por cierto, está sacada de la Web de Euskaltel.

Recomendable marcar la casilla de recordar contraseña (que como puedes ver, es genérica como el usuario).

La primera vez, tenemos que configurar la conexión.
(Botón) Configuración -> Pestaña módem

Ventana Setup

Dispositivo: /dev/ttyUSB4
Tipo: Módem USB
Velocidad: 460800 (en realidad es irrelevante, pero por si acaso... :-)
Línea telefónica: Tono
Volumen: como se quiera porque no hay altavoz en el pincho

(Botón) Registro de Inicio -> Ventana Init Strings

Haciendo doble click, para habilitar la escritura en el espacio reservado para el Init 3, rellenamos con:

AT+CGDCONT=1,"IP","internet.euskaltel.mobi"
Una vez escrito, pinchamos en cualquier otro lado de la misma, para finalizar la escritura (de lo contrario no se guardarán los cambios) y cerramos la ventana.

De vuelta en la ventana Setup Pestaña Módem
Prefijo de marcado: dejar en blanco
Intentos de marcado: 1
Casilla Esperar por tono de marcado: activada

Ventana Setup -> Pestaña Red

Seleccionar IP dinámica y DNS automático (salvo que sepamos lo que hacemos)

Ventana Setup -> Pestaña Opciones


Dejar marcadas sólo:
Abortar conexión si no hay tono de marcado
Comprobar línea
Comprobar camino por defecto

Botón Cerrar para cerrar ;-)


De vuelta en la ventana GNOME PPP, damos al botón de Conectar.


Se cierra la ventana de conexión y se abre otra Conectando.
Pulsamos el botón de registro para ver la ventana de log.

Si obtenemos (tras unos segundos) el mensaje:

"--> Don't know what to do! Starting pppd and hoping for the best.
Check permissions, or specify a "PPPD Path" option in wvdial.conf."

Es que casi todo ha ido bien pero nuestro usuario no tiene permisos para ejecutar el programa pppd.

Para darle permisos:

Sistema->Administración->Usuarios y grupos
Seleccionamos nuestro usuario
Pulsamos el botón de gestionar grupos
Buscamos y seleccionamos el grupo "dip"
Pulsamos el botón Propiedades
Añadimos a nuestro usuario al grupo "dip", marcando la casilla y damos a cerrar.
En algún momento nos pedirá, por seguridad, que metamos nuestra contraseña de usuario
Cerrar

Por alguna razón que no acabo de entender, a pesar de añadirle en los grupos, aún tenemos que "reiniciar gnome" para que nos deje lanzar la conexión. Para ello, basta con que cerremos la sesión y volvamos a iniciarla, sin necesidad de reiniciar la máquina.

Una vez hecho esto, volver a intentar la conexión (Aplicaciones->Internet->Gnome PPP).

Deficiencias de este método:


Este método no es infalible. A veces dice que no puede abrir el módem para conectarse. Solución: cerrar gnome-ppp. Desconectar el pincho. Volver a conectarlo.

Este método no integra el módem con el Network Manager por lo que nuestro sistema puede que "no se entere" de que estamos conectados. Por ejemplo, Firefox puede insistir por activa y por pasiva, que no estamos conectados y habrá que desmarcar la casilla "Trabajar sin conexión" en el menú Archivo.

Si no tenemos quitado el PIN y no lo queremos quitar:

Editar manualmente (Alt-F2 -> gedit .wvdial.conf)

Buscar la línea Init1 = ATZ y sustituirla por (cambiando 1234 por nuestro PIN)

Init1 = ATZ+CPIN=1234
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","internet.euskaltel.mobi"


Para desactivar el PIN de la SIM

En consola (Aplicaciones->Accesorios->Terminal)


sudo screen /dev/ttyUSB4

Si todo va bien, tecleamos:

AT


La respuesta debería ser...


OK


Comprobar si hay PIN activo bloqueando el tema:
AT+CPIN?

Si nos devuelve
+CPIN: READY

No hay bloqueo de PIN.

En caso de que lo hubiera:

AT+CPIN="1234"
a lo que nos devolvería
OK

Suponiendo que 1234 es nuestro PIN. El OK de la respuesta indica que ya está autenticado. Ahora vamos a deshabilitarlo:

AT+CLCK="SC",0,"1234"

donde 1234 es el PIN actual, claro. Con ese comando, si todo va bien, hemos deshabilitado la petición de PIN.

Para cerrar la sesión de screen podemos pulsar Control-a y luego d o bien cerrar la terminal ;-)


jueves, 9 de diciembre de 2010

Sonido en Ubuntu x64 para 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)

Cuánto tiempo, blog. Seré breve:

en Ubuntu 10.10 (Maverick Meerkat , osea, el Suricato sin marcar?) debe haber un bug, que aún está sin solucionar y como me afecta, lo voy a comentar rápidamente.

Con un lspci:


00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)

Osea, que tengo Intel HD como audio, pero no tengo sonido con Alsa.

Para solucionarlo, que "trabajito me ha costao":

Editar /etc/modprobe.d/alsa-base.conf

(por ejemplo: gksu gedit /etc/modprobe.d/alsa-base.conf)

Añadir al final:

options snd-hda-intel model=auto

Y reiniciar. Listo.

Ale, a jugar a pala.