Check out the new blog at http://linuxehacking.ovh , this one will no longer be updated

sabato 9 novembre 2013

Hotspot senza cifratura e smartphone? Brutta accoppiata per la privacy

Torno di nuovo a scrivere per i problemi riguardanti la privacy con gli smartphone, perché si aggiunge, oltre al noto problema della scansione attiva e quindi dell'invio di probe diretti ad access point, anche un altro problema più grave originante da Whatsapp e Facebook, in pratica con tecniche di livello veramente base è possibile conoscere il numero di cellulare di chi è connesso all'hotspot, e dal numero di cellulare conoscere in una buona parte di casi, il profilo facebook.
Tutto ciò funziona in quanto Whatsapp, ogni volta che si riconnette invia un pacchetto contente la stringa "WAUTH-2", il quale contiene il numero di telefono completamente in chiaro, avete letto bene, COMPLETAMENTE IN CHIARO.
È sufficiente quindi mettere una banale interfaccia wireless in modalità monitor sul canale dell'access point ed aspettare che qualcuno apra l'applicazione whatsapp sul proprio cellulare.
Non appena lo farà, è possibile estrapolare dal pacchetto il numero di telefono, in modo banale, e con questo, utilizzando la pagina https://www.facebook.com/search.php?q=numero , nel 50% dei casi o anche più si riesce a risalire a nome e cognome e profilo facebook.
Quindi lo stato attuale delle cose è che, semplicemente con un attacco di tipo passivo ( niente man in the middle o simili ), è possibile ottenere

Numero di cellulare
Modello di cellulare
Nome e cognome
Profilo facebook
Posti più frequentati
Indirizzo di casa approssimato( successivamente raffinabile una volta nel raggio dell'access point )
Associazione mac address - persona , che quindi porta al tracciamento del resto del traffico

Forum: http://linuxehacking.info/viewtopic.php?f=7&t=2 (Sorgenti dello sniffer inclusi )

giovedì 19 settembre 2013

Recuperare un'interfaccia Ralink a 5 Ghz con EEPROM danneggiata senza riprogrammare il chip

Molti mesi fa , mi si danneggiò la EEPROM della mia ALFA dual-band, la situazione inizialmente sembrava tragica, la periferica non veniva neanche più riconosciuta ( i descrittori usb contenuti nella eeprom erano danneggiati ).
La eeprom di questa periferica difatti , nonostante tramite USB sia possibile leggerne i primi 0x110 byte , in realtà è da 0x400 byte ed all'indirizzo 0x200 inizia la parte dei descrittori USB la quale è utilizzata dal chipset.
Una volta dissaldata la eeprom si può notare che l'interfaccia wireless funziona di nuovo, però le funzionalità dual-band non ci sono più, ed anche il mac address è danneggiato.
Dato che i tentativi che ho fatto di sostituire la eeprom , un po' per sfortuna , un po' per la mia poca esperienza a lavorare in SMD sono andati male , ho tentato di modificare il driver, in modo che nel caso il chip id della eeprom sia 0xffff ( ovvero quando il chip non è presente ) , vada a caricare un file in /lib/firmware in modo da riconoscere correttamente l'id del chip RF ed altri parametri ( tipo le antenne da utilizzare )

Ho modificato il file rt2800usb.c del driver rt2x00 , modificando la funzione rt2800usb_read_eeprom nel seguente modo

static int rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev)
{
int retval;
    mm_segment_t fs;
    struct file *f;
if (rt2800_efuse_detect(rt2x00dev))
retval = rt2800_read_eeprom_efuse(rt2x00dev);
else
{
  
retval = rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom,
      EEPROM_SIZE);
        if ( rt2x00dev->eeprom[0] == 0xffff ) //No eeprom chip
        {
            printk("rt2800usb: connected device has broken/missing eeprom chip\n");
            f = filp_open("/lib/firmware/rt2800usb_eeprom.bin", O_RDONLY, 0);
            if ( IS_ERR(f) )
            {
                printk("rt2800usb: Cannot load eeprom from /lib/firmware/rt2800usb_eeprom.bin\n");
                return -1;
            }
            fs = get_fs();
            set_fs(get_ds());
            f->f_op->read(f,(char*)rt2x00dev->eeprom,EEPROM_SIZE,&f->f_pos);
            set_fs(fs);
  
            filp_close(f,NULL);
            printk("rt2800usb: Loaded eeprom override\n");
        }
     }

return retval;
}

In questo modo il driver al collegamento di una periferica rt2800usb andrà a cercare un file in /lib/firmware/rt2800usb_eeprom.bin contenente la EEPROM da utilizzare.
Purtroppo ci sono delle limitazioni, ad esempio non si possono usare più ralink 2800usb con eeprom danneggiata nello stesso sistema.



Allego di seguito la eeprom della mia ALFA , dovete assolutamente modificare il mac address con il vostro , oppure metterne uno casuale ( è consigliabile lasciare inalterati i primi 3 byte )

0000:0000 | 70 27  04 01  00 C0  CA 32 | p'...ÀÊ2
0000:0008 | B7 FE  FF FF  FF FF  FF FF | ·Dÿÿÿÿÿÿ
0000:0010 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0018 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0020 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0028 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0030 | FF FF  FF FF  12 04  20 00 | ÿÿÿÿ.. .
0000:0038 | FF FF  15 01  FF FF  FF FF | ÿÿ..ÿÿÿÿ
0000:0040 | FF FF  FF FF  09 04  00 00 | ÿÿÿÿ....
0000:0048 | 00 04  00 00  00 03  FF FF | ......ÿÿ
0000:0050 | FF FF  02 02  02 02  02 03 | ÿÿ......
0000:0058 | 03 03  03 03  03 03  03 03 | ........
0000:0060 | 00 00  00 00  00 00  00 00 | ........
0000:0068 | 00 00  00 00  00 00  FF FF | ......ÿÿ
0000:0070 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0078 | 06 06  06 06  06 06  06 06 | ........
0000:0080 | 06 06  06 06  05 05  05 05 | ........
0000:0088 | 05 05  05 05  05 05  06 06 | ........
0000:0090 | 06 06  06 06  06 06  06 06 | ........
0000:0098 | 06 06  07 FF  FF FF  FF FF | ...ÿÿÿÿÿ
0000:00A0 | FF FF  FF FF  FF FF  00 00 | ÿÿÿÿÿÿ..
0000:00A8 | 00 00  00 00  00 00  00 00 | ........
0000:00B0 | 00 00  00 00  00 00  00 00 | ........
0000:00B8 | 00 00  00 00  00 00  00 00 | ........
0000:00C0 | 00 00  00 00  00 00  00 00 | ........
0000:00C8 | 00 FF  FF FF  FF FF  FF FF | .ÿÿÿÿÿÿÿ
0000:00D0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:00D8 | FF FF  FF FF  FF FF  88 88 | ÿÿÿÿÿÿ..
0000:00E0 | 99 AA  88 66  AA AA  88 66 | .ª.fªª.f
0000:00E8 | AA AA  88 66  AA AA  88 66 | ªª.fªª.f
0000:00F0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:00F8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0100 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0108 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0110 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0118 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0120 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0128 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0130 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0138 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0140 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0148 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0150 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0158 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0160 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0168 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0170 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0178 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0180 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0188 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0190 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0198 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01A0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01A8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01B0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01B8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01C0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01C8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01D0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01D8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01E0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01E8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01F0 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:01F8 | FF FF  FF FF  FF FF  FF FF | ÿÿÿÿÿÿÿÿ
0000:0200 | 12 01  00 02  00 00  00 40 | .......@
0000:0208 | 8F 14  70 27  01 01  01 02 | ..p'....
0000:0210 | 03 01  0A 06  00 02  00 00 | ........
0000:0218 | 00 40  01 00  09 02  35 00 | .@....5.
0000:0220 | 01 01  00 80  E1 09  04 00 | ....á...
0000:0228 | 00 07  FF FF  FF 05  07 05 | ..ÿÿÿ...
0000:0230 | 81 02  00 02  00 07  05 01 | ........
0000:0238 | 02 00  02 00  07 05  02 02 | ........
0000:0240 | 00 02  00 07  05 03  02 00 | ........
0000:0248 | 02 00  07 05  04 02  00 02 | ........
0000:0250 | 00 07  05 05  02 00  02 00 | ........
0000:0258 | 07 05  06 02  00 02  00 B8 | .......¸
0000:0260 | 11 7D  08 0D  00 00  00 00 | .}......
0000:0268 | 54 69  7A 69  61 6E  6F 42 | TizianoB
0000:0270 | 61 63  6F 63  63 6F  48 41 | acoccoHA
0000:0278 | 43 4B  20 20  00 00  00 00 | CK  ....
0000:0280 | 12 01  00 02  00 00  00 40 | .......@
0000:0288 | 8F 14  70 28  01 00  06 07 | ..p(....
0000:0290 | 08 01  0A 06  00 02  00 00 | ........
0000:0298 | 00 40  01 00  09 02  20 00 | .@.... .
0000:02A0 | 01 01  00 80  E1 09  04 00 | ....á...
0000:02A8 | 00 02  08 06  50 0A  07 05 | ....P...
0000:02B0 | 81 02  00 02  00 07  05 01 | ........
0000:02B8 | 02 00  02 00  00 00  00 00 | ........
0000:02C0 | 00 00  00 00  00 00  00 00 | ........
0000:02C8 | 00 00  00 00  00 00  00 00 | ........
0000:02D0 | 00 00  00 00  00 00  00 00 | ........
0000:02D8 | 00 00  00 00  00 00  00 00 | ........
0000:02E0 | 00 00  3F 00  00 00  00 00 | ..?.....
0000:02E8 | 00 00  00 00  00 00  00 00 | ........
0000:02F0 | 00 60  70 A2  FF A2  60 70 | .`p¢ÿ¢`p
0000:02F8 | A2 FF  A2 FF  FF FF  FF FF | ¢ÿ¢ÿÿÿÿÿ
0000:0300 | 04 03  09 04  00 00  00 00 | ........
0000:0308 | 00 00  00 00  00 00  00 00 | ........
0000:0310 | 00 00  00 00  00 00  00 00 | ........
0000:0318 | 00 00  00 00  00 00  00 00 | ........
0000:0320 | 00 00  00 00  00 00  00 00 | ........
0000:0328 | 00 00  00 00  00 00  00 00 | ........
0000:0330 | 00 00  00 00  00 00  00 00 | ........
0000:0338 | 00 00  00 00  00 00  00 00 | ........
0000:0340 | 00 00  00 00  00 00  00 00 | ........
0000:0348 | 00 00  00 00  00 00  00 00 | ........
0000:0350 | 00 00  00 00  00 00  00 00 | ........
0000:0358 | 00 00  00 00  00 00  00 00 | ........
0000:0360 | 0E 03  52 00  61 00  6C 00 | ..R.a.l.
0000:0368 | 69 00  6E 00  6B 00  00 00 | i.n.k...
0000:0370 | 1E 03  38 00  30 00  32 00 | ..8.0.2.
0000:0378 | 2E 00  31 00  31 00  20 00 | ..1.1. .
0000:0380 | 6E 00  20 00  57 00  4C 00 | n. .W.L.
0000:0388 | 41 00  4E 00  00 00  00 00 | A.N.....
0000:0390 | 04 03  09 04  00 00  00 00 | ........
0000:0398 | 00 00  00 00  00 00  00 00 | ........
0000:03A0 | 00 00  08 03  31 00  2E 00 | ....1...
0000:03A8 | 30 00  00 00  00 00  00 00 | 0.......
0000:03B0 | 00 00  00 00  00 00  00 00 | ........
0000:03B8 | 00 00  00 00  00 00  00 00 | ........
0000:03C0 | 00 00  00 00  00 00  00 00 | ........
0000:03C8 | 00 00  00 00  00 00  00 00 | ........
0000:03D0 | 00 00  00 00  00 00  00 00 | ........
0000:03D8 | 00 00  00 00  00 00  00 00 | ........
0000:03E0 | 00 00  00 00  00 00  00 00 | ........
0000:03E8 | 00 00  00 00  00 00  00 00 | ........
0000:03F0 | 00 00  00 00  00 00  00 00 | ........

0000:03F8 | 00 00  00 00  00 00  00 00 | ........

martedì 3 settembre 2013

[FISICA] Produrre raggi X in casa senza ricorrere a componenti costosi

Introduzione

Quello che illustrerò di seguito è come produrre raggi X in casa utilizzando componenti facilmente reperibili, tuttavia i raggi X prodotti, non sono assolutamente sufficienti per fare una lastra, è utile questo esperimento solo per fini didattici.

Pericoli


I raggi X, in modo simile ai raggi ultravioletti nelle ore di punta, possono creare ustioni o nel peggior dei casi tumori, la differenza sostanziale è che i raggi X spesso vanno più in profondità , quindi le eventuali ustioni sono molto più gravi.
Utilizzando una valvola termoionica con accoppiamento capacitivo sul catodo, è difficile produrre dosi pericolose, tuttavia è altamente consigliabile non trovarsi nella stanza quando l'apparecchiatura è attiva.

Funzionamento

Per produrre i raggi X è necessario ottenere una collisione di elettroni sufficientemente accelerati su un bersaglio metallico.
Gli elettroni possono essere facilmente accelerati da una differenza di potenziale applicata ai 2 estremi di una valvola termoionica.
Viene usata una valvola termoionica, perché è il tubo con vuoto spinto più facilmente reperibile e più economico.
Nella figura in alto:
1: Valvola termoionica
2: Sonda Beta+Gamma del contatore geiger SV-500 schermata e collegata a terra
3:Webcam USB con ottica rimossa, anche essa schermata e collegata a terra

Il cavo rosa è il catodo, ed è collegato tramite un pezzo di carta stagnola sulla parte superiore della valvola, in questo modo gli elettroni provenienti dal catodo andranno a collidere sui vari elementi metallici della valvola collegati all'anodo e quindi produrranno raggi X

1: Trasformatore di riga TV 
2: Trasformatore avvolto su nucleo di un altro trasformatore di riga , serve ad alzare il voltaggio dell'inverter ZVS
3:Condensatore necessario a limitare la corrente per evitare di rompere il vetro del tubo termoionico
4:Driver ZVS di Mazzilli
5: Collegamento a terra
Lo scopo di questo circuito è di fornire una tensione di almeno 50-60000 volt per accelerare sufficientemente gli elettroni all'interno del tubo
È inutile riportare il numero di giri dei vari avvolgimenti in quanto andranno trovati in ogni caso sperimentalmente.
Questo è quanto basta per produrre raggi X, per verificare che vengano prodotti viene usato un contatore geiger con una sonda sensibile ai raggi beta la quale deve essere assolutamente schermata e collegata a terra.
Una volta realizzato questo esperimento si possono condurre vari esperimenti come ad esempio testare la penetrazione dei raggi X nei vari materiali, oppure sperimentare con altri tipi di rivelatori come ho fatto io, provando con il CCD di una webcam.
Nel mio canale youtube ( http://youtube.com/lo9765 ) ho caricato un video dove viene mostrato il tutto in funzione e a breve ne verrà caricato un altro dove viene mostrato l'uso del sensore CCD come rivelatore di radiazioni.
Anche nel video già presente alla terza volta che alimento il tutto è possibile notare in alto a destra un puntino bianco su un fotogramma il quale indica che un fotone di raggi X ha colpito il sensore CCD del cellulare.

venerdì 12 luglio 2013

How To: Emulatore DVD-ROM Hardware USB

Cosa è un emulatore DVD-ROM hardware

Un emulatore DVD-ROM hardware è un dispositivo che svolge un compito simile a quello di programmi come Daemon Tools o un device loop su linux, ma lo svolge presentandosi come un vero e proprio drive USB dvd-rom.
Le potenzialità di ciò sono che non può essere beccato dai DRM dei videogiochi e permette di fare il boot dal BIOS di qualsiasi ISO senza usare programmi come unetbootin.

Occorrente

  • BeagleBone Black
  • Una o più macchine con Linux possibilmente decenti ( se si intende ricompilare da se il driver )
  • Un minimo di praticità nell'uso di Linux, e nella compilazione di kernel/drivers
La beagleboneblack esce attualmente con Linux 3.8.13 , per utilizzarla in questo modo, onde evitare problemi con BIOS poco tolleranti, va eliminato il driver g_multi.ko
Una volta eliminato quel driver e riavviata la board è possibile scaricare il driver per il kernel precompilato della beaglebone qui g_mass_storage.ko .
Per utilizzare il driver è sufficiente eseguire il comando come root:
#insmod g_mass_storage.ko file=/percorsoimmagineiso cdrom=1 ro=1

Una volta eseguito il comando dopo pochi secondi dovrebbe comparire sul PC al quale è collegata la beaglebone un lettore DVD con dentro il "dischetto"

Kernel non standard e sorgenti delle modifiche

Per poter utilizzare immagini ISO > 2.4 GB ho dovuto applicare delle modifiche al driver del gadget mass storage che riporto di seguito:

commit f6037e02d14c57531efc14074aa59b0054227f8c
Author: Tiziano Bacocco <tiziano@localhost.localdomain>
Date:   Fri Jul 12 13:04:43 2013 +0200

    DVD-ROM Patch

diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index 5d027b3..cb87b4a 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -1192,6 +1192,7 @@ static int do_read_capacity(struct fsg_common *common, struct fsg_buffhd *bh)
  return -EINVAL;
  }
 
+ printk("readcap: %ld\n",curlun->num_sectors-1);
  put_unaligned_be32(curlun->num_sectors - 1, &buf[0]);
  /* Max logical block */
  put_unaligned_be32(curlun->blksize, &buf[4]);/* Block length */
@@ -1220,6 +1221,63 @@ static int do_read_header(struct fsg_common *common, struct fsg_buffhd *bh)
  return 8;
 }
 
+static int do_read_disc_information(struct fsg_common* common, struct fsg_buffhd * bh)
+{
+ struct fsg_lun *curlun = common->curlun;
+ if (common->cmnd[1] & ~0x02) { /* Mask away MSF */
+ curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
+ return -EINVAL;
+ }
+ u8* outbuf = (u8*)bh->buf;
+ memset(outbuf,0,34);
+ outbuf[1] = 32;
+ outbuf[2] = 0xe; /* last session complete, disc finalized */
+ outbuf[3] = 1;   /* first track on disc */
+ outbuf[4] = 1;   /* # of sessions */
+ outbuf[5] = 1;   /* first track of last session */
+ outbuf[6] = 1;   /* last track of last session */
+ outbuf[7] = 0x20; /* unrestricted use */
+ outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
+ return 34;
+}
+
+static int do_get_configuration(struct fsg_common *common, struct fsg_buffhd *bh)
+{
+ struct fsg_lun *curlun = common->curlun;
+ if (common->cmnd[1] & ~0x02) { /* Mask away MSF */
+ curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
+ return -EINVAL;
+ }
+ u8* buf = (u8*)bh->buf;
+ int cur;
+ if ( curlun->num_sectors > CD_MAX_SECTORS )
+ {
+ printk("Is dvd\n");
+ cur = MMC_PROFILE_DVD_ROM;
+ }
+ else
+ cur = MMC_PROFILE_CD_ROM;
+ memset(buf,0,40);
+ put_unaligned_be32(36,&buf[0]);
+ put_unaligned_be16(cur,&buf[6]);
+ buf[10] = 0x03;
+ buf[11] = 8;
+ put_unaligned_be16(MMC_PROFILE_DVD_ROM,&buf[12]);
+ buf[14] = ( cur == MMC_PROFILE_DVD_ROM );
+ put_unaligned_be16(MMC_PROFILE_CD_ROM,&buf[16]);
+ buf[18] = ( cur == MMC_PROFILE_CD_ROM );
+ put_unaligned_be16(1,&buf[20]);
+ buf[22] = 0x08 | 0x03;
+ buf[23] = 8;
+ put_unaligned_be32(1,&buf[24]);
+ buf[28] = 1;
+ put_unaligned_be16(3,&buf[32]);
+ buf[34] = 0x08 | 0x3;
+ buf[35] = 4;
+ buf[36] = 0x39;
+ return 40;
+}
+
 static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh)
 {
  struct fsg_lun *curlun = common->curlun;
@@ -1245,6 +1303,7 @@ static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh)
  buf[14] = 0xAA; /* Lead-out track number */
  store_cdrom_address(&buf[16], msf, curlun->num_sectors);
  return 20;
+
 }
 
 static int do_mode_sense(struct fsg_common *common, struct fsg_buffhd *bh)
@@ -1727,9 +1786,9 @@ static int check_command(struct fsg_common *common, int cmnd_size,
  if (common->data_dir != DATA_DIR_UNKNOWN)
  sprintf(hdlen, ", H%c=%u", dirletter[(int) common->data_dir],
  common->data_size);
- VDBG(common, "SCSI command: %s;  Dc=%d, D%c=%u;  Hc=%d%s\n",
-      name, cmnd_size, dirletter[(int) data_dir],
-      common->data_size_from_cmnd, common->cmnd_size, hdlen);
+ //printk( "SCSI command: %s;  Dc=%d, D%c=%u;  Hc=%d%s\n",
+   //   name, cmnd_size, dirletter[(int) data_dir],
+  //    common->data_size_from_cmnd, common->cmnd_size, hdlen);
 
  /*
   * We can't reply at all until we know the correct data direction
@@ -2087,7 +2146,21 @@ static int do_scsi_command(struct fsg_common *common)
  if (reply == 0)
  reply = do_write(common);
  break;
-
+ case 0x51://READ_DISC_INFORMATION
+ common->data_size_from_cmnd = 0;
+ if (!common->curlun || !common->curlun->cdrom)
+ goto unknown_cmnd;
+ printk("READ_DISC_INFORMATION\n");
+
+ reply = do_read_disc_information(common,bh);
+    break;
+ case 0x46://GET_CONFIGURATION
+ common->data_size_from_cmnd = 0;
+ if (!common->curlun || !common->curlun->cdrom)
+ goto unknown_cmnd;
+ printk("GET_CONFIGURATION\n");
+ reply = do_get_configuration(common,bh);
+ break;
  /*
   * Some mandatory commands that we recognize but don't implement.
   * They don't mean much in this setting.  It's left as an exercise
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 0e3ae43..f328ab6 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -124,6 +124,42 @@ struct interrupt_data {
 #define SS_WRITE_ERROR 0x030c02
 #define SS_WRITE_PROTECTED 0x072700
 
+#define CD_MINS                       80 /* max. minutes per CD */
+#define CD_SECS                       60 /* seconds per minute */
+#define CD_FRAMES                     75 /* frames per second */
+#define CD_FRAMESIZE                2048 /* bytes per frame, "cooked" mode */
+#define CD_MAX_BYTES       (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
+#define CD_MAX_SECTORS     (CD_MAX_BYTES / 512)
+
+#define MMC_PROFILE_NONE                0x0000
+#define MMC_PROFILE_CD_ROM              0x0008
+#define MMC_PROFILE_CD_R                0x0009
+#define MMC_PROFILE_CD_RW               0x000A
+#define MMC_PROFILE_DVD_ROM             0x0010
+#define MMC_PROFILE_DVD_R_SR            0x0011
+#define MMC_PROFILE_DVD_RAM             0x0012
+#define MMC_PROFILE_DVD_RW_RO           0x0013
+#define MMC_PROFILE_DVD_RW_SR           0x0014
+#define MMC_PROFILE_DVD_R_DL_SR         0x0015
+#define MMC_PROFILE_DVD_R_DL_JR         0x0016
+#define MMC_PROFILE_DVD_RW_DL           0x0017
+#define MMC_PROFILE_DVD_DDR             0x0018
+#define MMC_PROFILE_DVD_PLUS_RW         0x001A
+#define MMC_PROFILE_DVD_PLUS_R          0x001B
+#define MMC_PROFILE_DVD_PLUS_RW_DL      0x002A
+#define MMC_PROFILE_DVD_PLUS_R_DL       0x002B
+#define MMC_PROFILE_BD_ROM              0x0040
+#define MMC_PROFILE_BD_R_SRM            0x0041
+#define MMC_PROFILE_BD_R_RRM            0x0042
+#define MMC_PROFILE_BD_RE               0x0043
+#define MMC_PROFILE_HDDVD_ROM           0x0050
+#define MMC_PROFILE_HDDVD_R             0x0051
+#define MMC_PROFILE_HDDVD_RAM           0x0052
+#define MMC_PROFILE_HDDVD_RW            0x0053
+#define MMC_PROFILE_HDDVD_R_DL          0x0058
+#define MMC_PROFILE_HDDVD_RW_DL         0x005A
+#define MMC_PROFILE_INVALID             0xFFFF
+
 #define SK(x) ((u8) ((x) >> 16)) /* Sense Key byte, etc. */
 #define ASC(x) ((u8) ((x) >> 8))
 #define ASCQ(x) ((u8) (x))
@@ -165,7 +201,6 @@ static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev)
  return container_of(dev, struct fsg_lun, dev);
 }
 
-
 /* Big enough to hold our biggest descriptor */
 #define EP0_BUFSIZE 256
 #define DELAYED_STATUS (EP0_BUFSIZE + 999) /* An impossibly large value */
@@ -540,12 +575,12 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
  min_sectors = 1;
  if (curlun->cdrom) {
  min_sectors = 300; /* Smallest track is 300 frames */
- if (num_sectors >= 256*60*75) {
+ /*if (num_sectors >= 256*60*75) {
  num_sectors = 256*60*75 - 1;
  LINFO(curlun, "file too big: %s\n", filename);
  LINFO(curlun, "using only first %d blocks\n",
  (int) num_sectors);
- }
+ }*/
  }
  if (num_sectors < min_sectors) {
  LINFO(curlun, "file too small: %s\n", filename);
@@ -562,6 +597,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
  curlun->filp = filp;
  curlun->file_length = size;
  curlun->num_sectors = num_sectors;
+ printk("lun_open: %zd\n",curlun->num_sectors-1);
  LDBG(curlun, "open backing file: %s\n", filename);
  return 0;
 
@@ -596,6 +632,8 @@ static void store_cdrom_address(u8 *dest, int msf, u32 addr)
  addr /= 75;
  dest[2] = addr % 60; /* Seconds */
  addr /= 60;
+ if ( addr > 255 )
+ printk("store_cdrom_address: overflow \n");
  dest[1] = addr; /* Minutes */
  dest[0] = 0; /* Reserved */
  } else {


Questa patch applicata al kernel che si sta compilando permette di ottenere il driver modificato con il supporto alle immagini > 2.4 GB

giovedì 9 maggio 2013

Scrittura della eeprom nelle schede atheros 5k mini-pci

Qualche giorno fa su ebay ho ordinato un'interfaccia mini-pci atheros su cui è scritto che supporta anche l'802.11a ( 5 Ghz ), una volta ricevuta ho constatato che tale scheda mini-cpi pagata pochissimo ( 5 € ) , non è originale ed ha bisogno di drivers modificati che sono forniti solo per windows per funzionare in 802.11a, quindi è inutilizzabile su un qualsiasi router OpenWRT oppure su una board MikroTik.
Ovviamente da buon hacker ho scartato subito l'idea di comprarne una nuova e lasciare perdere quella, ed ho subito aperto lo schermo metallico che racchiude i componenti ad alta frequenza.
Possedendo una atheros a 5 Ghz autentica , aprendo anche quest'ultima, ho subito constato che l'hardware effettivamente è completamente identico, c'è un solo componente che potrebbe essere diverso ( nei contenuti ), la EEPROM.

Quindi ho iniziato a cercare su internet ed ho trovato che uno sviluppatore ha trovato modo di modificare il mac address nei casi in cui fosse presente FF:FF:FF:FF:FF:FF , questo richiede la scrittura della eeprom, proprio quello che serve in questo caso!

Una volta riordinato il codice( era in condizioni penose ), e aggiornato alle modifiche dei drivers nelle versioni recenti del kernel, ho aggiunto in cima ad eeprom.c nel tree del driver ath5k la seguente funzione:





/* * Write to eeprom */
static int ath5k_hw_eeprom_write(struct ath5k_hw *ah, u32 offset, u16 *data)
{ 
u32 status, timeout;
*data &= 0xffff; 
/* * Initialize EEPROM access */
if (ah->ah_version == AR5K_AR5210)
{ 
  printk("Fatal: AR5210\n");
// AR5210 not tested here but... 
//AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, AR5K_PCICFG_EEAE);
//ath5k_hw_reg_write(ah, data, AR5K_EEPROM_BASE + (4 * offset));
} else {
ath5k_hw_reg_write(ah, 0, AR5K_EEPROM_CMD); 
udelay(30);
AR5K_REG_ENABLE_BITS(ah, AR5K_EEPROM_CMD, AR5K_EEPROM_CMD_RESET);
udelay(30);
ath5k_hw_reg_write(ah, offset, AR5K_EEPROM_BASE);
ath5k_hw_reg_write(ah, *data, AR5K_EEPROM_DATA);
AR5K_REG_ENABLE_BITS(ah, AR5K_EEPROM_CMD, AR5K_EEPROM_CMD_WRITE);
udelay(30);
}
for (timeout = AR5K_TUNE_REGISTER_TIMEOUT; timeout > 0; timeout--)
{
status = ath5k_hw_reg_read(ah, AR5K_EEPROM_STATUS);
if (status & AR5K_EEPROM_STAT_WRDONE) { 
 if (status & AR5K_EEPROM_STAT_WRERR) { 
   printk(KERN_ERR " TP: -EIO"); return -EIO; 
   } 
 AR5K_EEPROM_READ( offset, *data);
 printk(KERN_INFO " Check: %04x", *data);
 return 0; }
udelay(15); }
status = ath5k_hw_reg_read(ah, AR5K_EEPROM_STATUS);
printk(KERN_ERR " status: %x", status);
printk(KERN_ERR " TP: -ETIMEDOUT");
ath5k_hw_reg_write(ah, 0, AR5K_EEPROM_STATUS);
AR5K_EEPROM_READ( offset, *data);
printk(KERN_ERR " Check: %x", (u32) *data);
return -ETIMEDOUT;
}

Questa funzione non fa altro che scrivere la eeprom in blocci di 2 byte ( WORD ).


A questo punto l'idea più semplice è ottenere un dump della eeprom della scheda autentica, cambiarne il mac address e scriverla sulla eeprom della scheda cinese.

Per fare ciò senza creare un device a blocchi, date le dimensioni esigue della eeprom, è sufficiente implementare con printk un semplice dump che finirà sui log.


Ciò è possibile farlo inserendo in ath5k_eeprom_init il seguente blocco di codice:

int offset;
u16 val;

printk("Dumping eeprom:\n");
for ( offset = 0; offset <  0x3ff; offset += 1 )
{
 AR5K_EEPROM_READ(offset, val);
 printk("%04x: %04x\n",offset,(unsigned int)val);
}
printk("Dump done\n");


Questo codice provvederà ad eseguire il dump della eeprom nel formato indirizzo:word.


Una volta eseguito il dump, è necessario trovare in esso il mac address della propria scheda , il quale sarà riportato in ordine inverso ( nel caso fosse 01:02:03:04:05:06 , ci sarà 0506 , 0304, 0102 ), e modificarne l'ultima cifra ( 05:06 ) prefribilmente.


Una volta creato il dump, con un semplice script python ( che verrà pubblicato a breve ) è possibile generare il sorgente C per chiamare la funzione ath5k_hw_eeprom_write per ogni word da scrivere sulla eeprom.

Per scrivere la eeprom è necessario, una volta rimosso il coperchio dello schermo RF va collegato a massa tramite una resistenza 150-300 ohm il pin Write Protect della eeprom in modo da abilitarne la scrittura, e va tenuto collegato durante tutta la procedura di scrittura.

Nonostante sia presente una resistenza di pullup da 10kOhm , la resistenza da collegare a massa è più che sufficiente a portare il pin allo 0 logico.





Una volta completata la scrittura, se la scheda da dove è stato preso il dump della eeprom a aveva un pezzo di materiale termoconduttore fra il coperchio dello schermo ed il chip wireless, è necessario applicarne uno anche sulla scheda cinese.

A questo punto è possibile utilzzare la scheda con i drivers non modificati come se fosse autentica.


sabato 27 aprile 2013

Installare openwrt sull'Alice Gate 2 Plus Wifi Voip - AGPF

Occorrente

  • Convertitore USB-Seriale ( anche un arduino va bene a tale scopo in quanto ne contiene uno )
  • Saper usare e possedere un saldatore a stagno per elettronica
  • Avere a disposizione 1 macchina con linux e saperci installare un server TFTP
  • Un programma per usare il terminale seriale compatibile con gli escape xterm , io ho utilizzato gtkterm

Collegamento della porta seriale sul router

Per collegare la porta seriale sul router si devono saldare 3 cavi sulle piazzole contrassegnate TX , RX e GND in questa disposizione ( tenendo le porte ethernet verso l'alto ed il PCB sul lato componenti ):

GNDRX
GND+3.3V
GNDTX

Una volta saldati i 3 cavi, collegare PRIMA GND con il convertitore, altrimenti c'è il rischio a causa di possibili dispersioni dell'alimentatore dell'AGPF di danneggiare il convertitore USB-Seriale ed il processore dell'AGPF.
Nel caso dell'arduino , a differenza del caso con un convertitore USB-Seriale, dovrete collegare TX con TX e RX con RX, in quanto la serigrafia sul circuito dell'arduino si riferisce al microcontroller e non al convertitore.
Nonostante l'arduino lavori a 5 volt e l'AGPF a 3.3 , non mi è mai successo che ci fossero danni o malfunzionamenti, si consiglia comunque di usare il meno possibile la porta seriale in queste condizioni.
La porta seriale va impostata a 115200 baud, 1 bit di parità e 8 bit di dati.

Entrare nella modalità recovery

Una volta collegati i cavi accendendo il router si dovrebbero vedere i messaggi di avvio sulla porta seriale, non appena compare una qualsiasi scritta premere subito ripetutamente il tasto invio per entrare in modalità recovery.
In modalità recovery dovrebbe sulla porta seriale comparire il prompt "CFE>", accendersi il led power rosso ed il router avrà indirizzo ip 192.168.1.1 sulla porta ethernet numero 1.
Nel caso non compaia nessuna scritta o il router non risponda alla pressione del tasto invio, ricontrollare  i collegamenti e riprovare.

Eseguire il flash

Una volta che il router è in recovery, è sufficiente collegare un cavo ethernet verso una macchina con un indirizzo sulla stessa rete ( ma diverso da 192.168.1.1 ) che abbia un server tftp installato ed eseguire flashimage 192.168.1.X:nomefile.bin , dove 192.168.1.X è l'indirizzo della macchina e nomefile.bin è il nome del file da flashare.
Il firmware da flashare è quello jffs 128k, senza cfe per AGV2+W, scaricabile all'indirizzo http://downloads.openwrt.org/snapshots/trunk/brcm63xx/

Nel dettaglio la procedura è mostrata nel seguente video



Utilizzare la porta USB del router

Per utilizzare la porta usb del router è necessario installare kmod-usb-ohci , il quale abiliterà il controller USB host del router.

venerdì 26 aprile 2013

Problemi con la privacy, smartphone e reti wireless

Forse non tutti lo sanno, ma quando uno smartphone non si trova connesso ad una rete wireless, ed il wifi è abilitato esegue continuamente la scansione, e fin qui tutto ok.
Il problema è che la scansione a differenza di come molti pensano non è solo passiva, ma è anche attiva, esistono dei frame speciali di probe che servono al dispositivo per controllare se un eventuale rete wireless nascosta è nel raggio di azione.
Questi frame una volta inviati, se ricevuti da un access point il cui SSID ( Service Set Identifier, in parole povere il nome della rete wireless ) corrisponde con quello nel frame , l'access point risponderà in modo da segnalare la propria presenza.
Gli smartphone android, ma probabilmente anche gli iPhone ed i notebook, inviano i probe per tutte le reti wireless salvate nel dispositivo, e questi pacchetti sono facilmente intercettabili ricorrendo alla suite aircrack-ng e nello specifico ad airmon-ng.
Una volta trovati questi SSID è possibile tramite l'uso di siti di wardriving come http://wigle.net risalire alla posizione geografica precisa dell'access point e quindi trovare i posti frequentati dalla persona, inoltre con l'ordine dei probe inviati potrebbe anche essere possibile determinare i più recenti.

Purtroppo per far fronte a ciò non esistono molte soluzioni, i più esperti potrebbero disattivare i probe eseguendo modifiche ad android, altrimenti una mezza soluzione è non tenere acceso il wifi se non in uso, ma ciò non protegge affatto in modo sicuro da questo tipo di attacco.

domenica 21 aprile 2013

Installazione ed uso di una SDR Realtek su Opensuse

Installazione dei software necessari

Come si può subito constatare collegandola , la pennetta USB in questione non è supportata su Linux, ma a noi non interessa, perché dobbiamo farci tutt'altro che vedere la spazzatura che gira sulla TV italiana.
Il software di riferimento su questa guida è gqrx, una radio completamente software con interfaccia grafica che insieme a questa SDR molto economica ci consentirà di sintonizzare tutte le frequenze partendo da 50 MHz fino a 2100 MHz circa ( questi valori essendo fuori dalle specifiche possono variare da hardware ad hardware ), ed effettuare la demodulazione di segnali AM , FM ( Sia stretto che largo ) e decodificare il packet radio.
Per le distribuzioni opensuse l'installazione dei drivers userspace e del software gqrx si esegue usando l'One Click install gqrx .

Utilizzo di gqrx

Una volta installato gqrx, è possibile avviarlo o tramite riga di comando o dal menu applicazioni dell'ambiente grafico ( per i newbie: si intende l'equivalente del menu start ).
All'avvio comparirà una finestra che ci chiede quale periferica usare ed altri parametri, lasciando invariati gli altri parametri assicuratevi che sia selezionato "Realtek RTL2838UHIDIR..." come visibile qui:
Una volta selezionato OK, comparirà la finestra principale del programma, per iniziare basterà premere il tasto di accensione in alto a sinistra.

Una volta "acceso" il programma, la prima cosa che può confondere un radioamatore abituato alle radio  analogiche è la presenza di due frequenze.
In realtà la frequenza principale è quella generata da un oscillatore interno, e verrà miscelata con il segnale proveniente dall'antenna, così facendo si otterrà somma e sottrazione delle frequenze e quindi si otterrà un porzione di spettro che parte dalla frequenza del PLL.
Salta subito all'occhio anche un difetto delle SDR , ovvero il rumore in continua, in corrispondenza della frequenza centrale secondo la teoria dovrebbe essere possibile comunque utilizzare il segnale, ma in pratica invece non è possibile perché si viene a creare moltissimo rumore.
Una volta sintonizzato il PLL quindi bisogna con il mouse sull'analizzatore di spettro oppure utilizzando il display contrassegnato con "Offset demod.", selezionare l'offset rispetto alla frequenza del PLL.
Una volta sintonizzati su una trasmissione ( una trasmissione appare come un picco ben definito nello spettro) è necessario selezionare la modulazione con il quale il segnale è trasmesso e la larghezza del demodulatore.

Principali tipi di trasmissione

Una volta presa dimestichezza con gqxr può comunque risultare difficile orientarsi nello spettro di frequenze per trovare trasmissioni interessanti, quindi di seguito elencherò i tipi di trasmissione e le frequenze più comuni:
  • Radio FM 88-108 MHz , Demodulatore FM Wide Stereo o Mono
  • Torri di controllo di aeroporti e comunicazioni navali 115 - 140 MHz , Demodulatore AM 
  • Carabinieri, Polizia ed altre forze dell'ordine: 160-170 Mhz , 425 - 428 Mhz , 434 Mhz , 465-467Mhz , Demodulatore FM Stretto
  • Telecomandi apricancello e di auto, sensori stazioni meteo ecc 433 MHz , Demodulatore AM ( è necessario successivamente decodificare i bit in quanto si tratta di trasmissioni digitali )
  • Cuffie via radio ed altri gadget audio wireless : 432 MHz , Demodulatore FM Stretto
  • PMR ( Personal Mobile Radio, sono i walkie talkie giocattolo in pratica ) 443 Mhz , 446 Mhz ,Demodulatore FM Stretto
  • Radiomicrofoni 720-740 MHz FM Stretto
  • Radioamatori 430-432 Mhz , FM Stretto

Interferenze

Un altro problema che subito si noterà è la presenza di interferenze, molte sono di natura esterna ( ovvero provengono da fonti nelle vicinanze ), mentre altre sono di natura interna, prodotte dal pc stesso o dalla SDR.
Per ridurre le interferenze il più possibile si devono utilizzare ESCLUSIVAMENTE cavi schermati per collegare la SDR via USB ( in pratica i cavetti da 20 centesimi cinesi non vanno bene), e va utilizzato possibilmente un PC desktop con il case metallico e chiuso, ed adeguatamente messo a terra.
Per tentare di ricevere segnali più lontano è possibile usare l'antenna TV della propria abitazione a patto che il vostro impianto usi un centralino a larga banda e non dei moduli selettivi per ogni canale TV.