Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - NebulasIT

Pages: [1] 2 3
1
Web Application / Exploit – Cosa sono e come si programmano
« on: February 27, 2017, 06:44:02 PM »
La realizzazione di exploit è uno dei pilastri dell’hacking, un programma si compone di un complesso insieme di regole che seguono un flusso
d’esecuzione prestabilito, il quale determina il comportamento del computer. L'exploit è essenzialmente sfruttare la vulnerabilità di quel programma, per farsì che il computer si comporti come vogliamo noi.
Trovare le falle e correggerle richiede molta esperienza e creatività, però bisogna tenere in considerazione che molte volte il programmatore non sempre scrive quello che intendeva realmente fare... Le cause sono di vario tipo, come:
Cambiamenti di sintassi, cambio di idee oppure semplicemente distrazioni.
Ora ne elencheremo i varii tipi:

Fuori-di-uno:
Come ad'esempio una falla di una vecchia versione di OpenSSH:

Code: You are not allowed to view links. Register or Login
if (id < 0 || id > channels_alloc) {
che invece si sarebbe dovuta scrivere:
Code: You are not allowed to view links. Register or Login
if (id < 0 || id >= channels_alloc) {
Buffer Overflow:
Un exploit che riguarda la corruzione della memoria, ovvero quando per errore o per malizia, vengono inviati più dati della capienza del buffer destinato a contenerli, i dati extra vanno a sovrascrivere le variabili interne del programma, o il suo stesso stack; come conseguenza di ciò, a seconda di cosa è stato sovrascritto e con quali valori, il programma può dare risultati errati o imprevedibili, bloccarsi, o (se è un driver di sistema o lo stesso sistema operativo) bloccare il computer.

Execution of arbitrary code:
l’exploit dei formati delle stringhe.
Con queste tecniche, lo scopo ultimo è quello di assumere il controllo del flusso di esecuzione del
programma target, facendolo saltare a un punto in memoria nel quale è stato posizionato un frammento
di codice malevolo.

Code injection:
Iniettare codice all'interno di un programma per cambiare il corso d'esecuzione.
Tra i più famosi stanno:
-SQL-Injection
-SSI-Injection
-XSS (cross-site scripting)
-HTML-Injection

____________________________________________________________

Ora che sappiamo la differenza tra gli exploit, nei prossimi articoli ci sarà la parte tecnica e pratica, e non solo dal punto di vista dell'uso! Ma anche dal punto di vista della programmazione.
____________________________________________________________

Articolo: You are not allowed to view links. Register or Login

2
Web Application / [GUIDA]SQL-Injection – Scovare, defacciare e dumpare.
« on: February 27, 2017, 01:19:18 PM »
Quote
Le code-injection sono di fatto una tipologia di attacchi più utilizzati nella rete, e non solo… Sono anche uno dei più pericolosi.
Ora vedremo le Sql-Injection, ovvero, una tecnica usata per attaccare applicazioni di gestione dati (Database), iniettando del codice SQL nei vari campi d’input.
Ho scritto nel mio blog una Guida sulle Sql-Injection, per motivi di formattazione non posso copiare e incollare in quanto il bbcode è diverso, e siccome non sono un pazzo, non mi va di riscrivere da zero  ;D.

Vedrò di trovare una soluzione, per ora beccatevi questo:
You are not allowed to view links. Register or Login


3
Tutti gli appassionati del Penetration Testing, si sono spesso ritrovati ad allenarsi ed approfondire le proprie skills su delle comuni CTF (Capture The Flag), che solitamente si prestano all'attacking di una sola macchina. Oggi propongo un metodo più didattico e completo: PENTESTIT.
PENTESTIT è un laboratorio online, che ci permette (tramite la registrazione al sito) l'accesso ai lab tramite VPN.
Una volta controllato che siamo dentro possiamo cominciare a pentestare l'intera infrastruttura di rete, quindi al livello didattico è molto più produttivo, perché si effettua un vera e propria simulazione di pentest aziendale, tra l'altro molto realistica!!
Lo scopo è quello di recuperare i Token (o Flag), e di inserirli nella pagina del lab scelto, per poi veder avanzare la barra del progresso del Pentest.
Vengono dati anche degli "aiuti" in pdf, non chè viene fornito un "grafo" della rete.
Insomma è assolutamente da provare.

Link:You are not allowed to view links. Register or Login
Fonte:You are not allowed to view links. Register or Login

4
Ragazzi, come richiesto ho fatto un profilo Git adatto,e ho postato il codice... Ho strutturato una base di quello che sarà Exploited... Un coltellino svizzero dell'IT.

Per ora presenta solo un ping sweep, successivamente con il tempo vorrei facesse Scanning dei servizi, Sniffing e Poi ricerca di Exploit... Insomma diciamo che vado fin dove la fantasia mi porti, nelle prime versioni reinventato la ruota ahah, giusto per capire veramente come funzionano tools più professionali  ;), per poi avere le skills di crearne di mie, quindi prime versioni del programma per me sono una sfida, un motivo in più per essere più bravo, a capire come funzionano i tools e saperne creare all'esigenza. Dopo questa premessa ecco il Codice:
Code: You are not allowed to view links. Register or Login
# main.py - PROGRAMMA PRINCIPALE

# Librerie definite dall'utente
import ping_sweep
# Librerie del Python3
import sys
import os
import time
import argparse


def wall():
    os.system("clear")
    print("""@@@@@@@@  @@@  @@@  @@@@@@@   @@@        @@@@@@   @@@  @@@@@@@  @@@@@@@@  @@@@@@@
@@@@@@@@  @@@  @@@  @@@@@@@@  @@@       @@@@@@@@  @@@  @@@@@@@  @@@@@@@@  @@@@@@@@
@@!       @@!  !@@  @@!  @@@  @@!       @@!  @@@  @@!    @@!    @@!       @@!  @@@
!@!       !@!  @!!  !@!  @!@  !@!       !@!  @!@  !@!    !@!    !@!       !@!  @!@
@!!!:!     !@@!@!   @!@@!@!   @!!       @!@  !@!  !!@    @!!    @!!!:!    @!@  !@!
!!!!!:      @!!!    !!@!!!    !!!       !@!  !!!  !!!    !!!    !!!!!:    !@!  !!!
!!:        !: :!!   !!:       !!:       !!:  !!!  !!:    !!:    !!:       !!:  !!!
:!:       :!:  !:!  :!:        :!:      :!:  !:!  :!:    :!:    :!:       :!:  !:!
 :: ::::   ::  :::   ::        :: ::::  ::::: ::   ::     ::     :: ::::   :::: ::
: :: ::    :   ::    :        : :: : :   : :  :   :       :     : :: ::   :: :  :
\n\nWe will never be like the zombies of a botnet""")


def descr_wall():
    print("""

////////////////////////////////////////
/         LIST OF PARAMETERS           /
////////////////////////////////////////
/                                      /
/   -Ps -> Ping Sweep                  /
/                                      /
/                                      /
/   Work in Progress                   /
/                                      /
////////////////////////////////////////
            \n\n""")


def main():

    wall()
    descr_wall()
    # Chiamata a moduli Esterni (Caricati dall'utente)
    parser = argparse.ArgumentParser()
    parser.add_argument("-Ps", "--PingSweep",
                        help="Establish a range of IP addresses which map to live hosts.", action="store_true")
    args = parser.parse_args()

    if args.PingSweep:
        ping_sweep.ping_sweepone()

if __name__ == '__main__':
    main()

Ed ecco ora il modulo caricato del ping sweep:

Code: You are not allowed to view links. Register or Login
#PING SWEEP MODULO

import multiprocessing
import subprocess
import os


def ping_sweepone():
    pool_size = 255

    jobs = multiprocessing.Queue()
    results = multiprocessing.Queue()

    pool = [multiprocessing.Process(target=pinger, args=(jobs, results))
            for i in range(pool_size)]

    for p in pool:
        p.start()

    for i in range(1, 255):
        jobs.put('192.168.1.{0}'.format(i))

    for p in pool:
        jobs.put(None)

    for p in pool:
        p.join()

    while not results.empty():
        ip = results.get()
        print(ip)


def pinger(job_q, results_q):
    DEVNULL = open(os.devnull, 'w')
    while True:
        ip = job_q.get()
        if ip is None:
            break

        try:
            subprocess.check_call(['ping', '-c1', ip],
                                  stdout=DEVNULL)
            results_q.put(ip)
        except:
            pass

Codice Github: You are not allowed to view links. Register or Login

Per chi mi volesse dare una mano, ho un paio di domande:
Code: You are not allowed to view links. Register or Login
for i in range(1, 255):
        jobs.put('192.168.1.{0}'.format(i))

In questo for effettuo la richiesta ICMP degli indirizzi 192.168.1...255, però come potrei fare per far in modo che sia 192.168.1...255.1...255?, ho provato con:
Code: You are not allowed to view links. Register or Login
for i in range(1, 255):
        jobs.put('192.168.{0}.{0}'.format(i))

Ma non mi restituisce nulla  :( (Neanche errori)

5
Per lo sviluppo dei miei tools dedicati alla sicurezza informatica, ho pensato che sarebbe stato troppo "scolastico" fare programmi senza argv, quindi ho studiato varie metodologie per applicare argv nei miei programmi, solo che molte librerie erano troppo obsolete, oppure erano troppo poco leggibili... Per fortuna ho trovato una libreria ottima e l'ho studiata, si chiama: Argparse.

Non è stato difficile imparare, ma come al solito non esiste doc. italiana (Il che può essere anche un bene), però tutto sommato ci sono io, che ve la spiego:

Argparse è una libreria del python che permette la creazione di parser e gruppi, per la gestione degli argv in un programma python. Esempio, se volessimo fare un programma di sicurezza informatica che lanciando il comando:
Code: You are not allowed to view links. Register or Login
Programma.py -Sn effetua uno sniffing, bisogna prendere in considerazione il parametro "-Sn", come si fa questo?! Lo si fa appunto con Argparse, vi posto il mio codice:

Code: You are not allowed to view links. Register or Login
import argparse

def molt(x1, x2):
    res = x1 * x2
    return res


def Main():
    parser = argparse.ArgumentParser()  # Creiamo il nostro parser
    gruppo = parser.add_mutually_exclusive_group() # Creiamo il gruppo necessario per le visualizzazioni
    # Aggiungiamo argomenti per le visualizzazioni
    gruppo.add_argument("-v", "--visualizzazione", action="store_true")
    gruppo.add_argument("-v2", "--visualizzazione2", action="store_true")
    # Aggiungiamo gli argomenti necessari per l'esecuzione
    parser.add_argument("num", help="Un x da moltiplicare", type=int)
    parser.add_argument("num2", help="Un x2 da moltiplicare", type=int)
    # Parser che ci permette salvare in un file
    parser.add_argument("-f", "--file", help="Salvare il risultato in un file",
                        action="store_true")
    args = parser.parse_args() # Args ci aiuta a prendere in esame una argv
    result = molt(args.num, args.num2) # Funzione, passiamo i 2 parametri

    # Serie di controlli per le varie visualizzazioni
    if args.visualizzazione:
        print ("La " + str(args.num) + "moltiplicazione è " + str(result))
    elif args.visualizzazione2:
        print("Il risultato è: " + str(result))
    else:
        print("Errore")
    if args.file:
        f = open("outuput1", "a") # Creo il file
        f.write(str(result) + '\n') # Scrivo sul file e vado a capo...

if __name__ == '__main__':
    Main()

Questo è un programma semplice che moltiplica 2 numeri, però prende in considerazione i parametri: "-v" e "-v2", che sono essenzialmente 2 print differenti di un'unico risultato.

Altre info: You are not allowed to view links. Register or Login

Fonte: You are not allowed to view links. Register or Login

6
Tutorials - E-Books / [E-Book] Python for Hacking/Cracking
« on: January 31, 2017, 09:35:54 AM »
VI ho trovato dei pdf interessantissimi per chi vuole sviluppare tools di Pentesting/Sicurezza informatica con il Python!!

Violent Python:
You are not allowed to view links. Register or Login

HackingCiphers:
You are not allowed to view links. Register or Login

7
Progetti Comuni / Sviluppo dei Tools per la distro
« on: January 28, 2017, 03:16:15 PM »
Ciao ragà, sto sviluppando dei tools (Python3), quindi posterò qui del codice e magari delle idee, magari per far in modo che possa servire a qualcuno, oppure per sentire delle vostre idee o accorgimenti che possano esser d'aiuto per me.
Partendo dal principio che lo faccio a scopo sopratutto didattico (Un motivo in più per apprendere cose nuove) e poi perché, dai, mi piace smanettare, beh cominciamo:

- Idea: Un sorta di coltellino svizzero (Non parlo di Netcat) del pentesting/networking in generale, quindi tratterò di sniffing, spoofing, scans etc...  racchiuso in un'unico tools(Questa è l'intenzione) Ho cominciato oggi è ho creato una base su cui lavorarci.

-Sviluppo: Lavoro con un main.py dove gestisco solo il "menu" e la chiamata a funzioni di moduli esterni definiti da me, tutto fatto a parametri (arguments).
Es: "nomeprogramma.py -h", quel "-h" è il sys.arvg[1]

Palesemente per ogni arvg diverso si apriranno funzioni caricate da altry file.py creati. Ogni compito è un file.

- Bug: Ci sono bug stupidi ancora, ma posterò il codice appena ne risolvo.

Per ora cosa ho fatto:

-Menu' con chiamata a funzioni da moduli

-Una funzione Ping Sweep (Determina se gli host sono attivi all'interno della rete), il risultato è uno scarno questo è l'output:
Code: You are not allowed to view links. Register or Login

/\ /\ _ __| |__   / /  __ _| |__  ___  / _ \___ _ __ | |_ ___   ___ | |___
/ / \ | '__| '_ \ / /  / _` | '_ \/ __|/ /_)/ _ | '_ \| __/ _ \ / _ \| / __|
\ \_/ | |  | |_) / /__| (_| | |_) \__ / ___|  __| | | | || (_) | (_) | \___|
 \___/|_|  |_.__/\____/\__,_|_.__/|___\/    \___|_| |_|\__\___/ \___/|_|___/
                                                                           

/////////////////////////////////////////////
/The basic swiss boxcutter for pentest...   /
/                                           /
/List of parameters:                        /
/                                           /
/   -Ps | Ping Sweep                        /
/                                           /
/   -Sn | Sniffing                          /
/                                           /
/   -h  | Help                              /
/////////////////////////////////////////////

Your parameters:  -Ps

/***Ping Sweep***/


192.168.1.184
192.168.1.232
192.168.1.137
192.168.1.254


Come potete notare restituisce solo l'ip, vedo se riesco anche a ricevere l'hostname  ;D (sicuro implemento qualche funzioncina in più)

Questo ancora è una base sviluppata in poco tempo, però già da quel che ho fatto ho imparato molto  ;), quindi nell'intento didattico posso ritenermi soddisfatto, all'atto funzionale ancora siamo agli inizi, però sono parecchio motivato...

Idee? Consigli? Critiche? Fatemi sapere!!  ;D

8
Ok il titolo è provocante, ma in realtà voglio chiarire le idee su cosa sia un pentester e come diventarlo.
Non sono un pentester, ma parlo per esperienza di professionisti del settore, e come giusto che sia una informazione veritiera va diffusa...

Il pentester è una figura professionale che analizza un sistema informatico per trovarne delle vulnerabilità il tutto fatto in modo offensivo.
Avete presente lo stereotipo dell'hacker di 17 anni adolescente? Cancellatelo proprio dalla vostra mente,
Si parla di anni di studio, in poche parole non si finisce mai, un vero pentester (senior) non fa sempre uso di programmi o exploit (anche payload) reperiti dalla rete , crea un piano d'attacco e si sviluppa da solo gli strumenti, per conoscere la vulnerabilità di un sistema esso non deve assolutamente avere segreti per te. Sento molto dire, mi faccio la OSCP così divento un pentester... NO!, in primis la logica, il resto viene dopo, ma ancora prima di tutto bisogna studiare, studiare e studiare l'informatica a 360 gradi (in alcuni casi anche elettronica), quindi per diventare realmente un pentester devi avere dei requisiti fondamentali:

  • Passione
  • Determinazione
  • Capacità cognitive e quindi logiche

Poi dopo vengono le skills tecniche, cioè conoscere la sintassi e come usarla nei tools che si utilizza (E che si crea).
Poi esistono vari sottogeneri di pentester, chi si occupa dei database, chi di vulnerability assessment e chi di Web Application...

Questo e-book è un punto di partenza:
You are not allowed to view links. Register or Login

Altra cosa che voglio chiarire per i bimbetti che non sanno neanche su cosa stanno "operando".
l'hacker è un versione leggermente più avanzata del pentester a mio avviso, per quale motivo?
- Un pentester si occupa di essere offensivo per testare un sistema
- Un Hacker non solo deve essere offensivo ma deve farlo in modo ANONIMO il ché è tutto un'altro enorme studio, quindi scordate anche di utilizzare la "semplicità" del pentester, NMAP scordalo, fa un enorme "rumore", per intenderci devi avere enormi skills e utilizzare strumenti raffinati ( se si tiene in considerazione l'hacker/cracker e non il Lamer). Il classico stereotipo del ragazzo americano di 17 anni che entra nei server è una cavolata! Dietro agli attacchi seri c'è vera criminalità organizzata il ché pure finanziata!

Insomma partire dall'anonimato per imparare hacking per me non è un buon'inizio perchè appunto sotto rete TOR o sotto altri servizi si sa che la connessione è castrata, quindi mi spiegate come vorreste fare le cose? L'unica cosa giusta è farlo in modo parallelo

Scusate lo sfogo  ;D, voi che ne pensate?

9
Python / Documentazione sul Python (PDF,Libri, etc ...)
« on: January 26, 2017, 10:08:40 PM »
Vi posto un pò di siti e doc varia da cui potreste trarre informazioni utili:

Python Base:
You are not allowed to view links. Register or Login # Ottimo per una base, reperibile facilmente (Inglese)
You are not allowed to view links. Register or Login # Ottimo per una base, reperibile facilmente (Italiano)
You are not allowed to view links. Register or Login # Pdf (Italiano)

Python per reti e tutto il mondo che ne riguarda:
You are not allowed to view links. Register or Login # Entriamo un pò nello specifico
You are not allowed to view links. Register or Login # Questo è fantastico, si presenta da solo

Tutto free

Per chi non lo conoscesse, consiglio questo git dedicato alle doc:
You are not allowed to view links. Register or Login

Che ne pensate?  ::)


10
Python / [Guida] Chiamare funzioni dalle libreire (o moduli) da file...
« on: January 23, 2017, 07:37:24 PM »
Ciao! Scusate l'assenza ma ho dovuto studiare tantissimo  :P
Premessa:
Iniziamo col dire che non so dare un nome preciso a questo topic, e magari se mi/vi viene in mente un nome più adatto lo modifico.


Se vi è mai capitato che in Python per questione d'ordine maniacale oppure per progetti "grossi", vi servisse un modo per richiamare funzioni creati da noi(Che siano memorizzati in altri file),questo topic magari vi potrebbe dare una "mano".

Per prima cosa creare un file con il suffisso .py
Esempio: modulo.py
e inserire all'interno una funzione:
Code: You are not allowed to view links. Register or Login
def funzione_modulo():
   print("Modulo aperto!")

Poi dobbiamo chiamare questo modulo all'interno del programma principale:
Code: You are not allowed to view links. Register or Login
import modulo
N.B il nome del modulo che caricheremo deve essere per forza di cose uguale al nome del file .py che abbiamo memorizzato nella cartella dove stiamo lavorando.

Una volta importato possiamo chiamare la funzione: "funzione_modulo" nel nostro programma principale così:
Code: You are not allowed to view links. Register or Login
modulo.funzione_modulo()
Se dico cavolate, oppure volete aggiungere cose, scrivete!  ;D

11
Volevo parlare di questo "nuovo" linguaggio che mi sta inducendo molto in tentazione, vi parlo di Rust un linguaggio che vuole unire l'efficenza del C/C++ con la semplicità del Python, essenzialmente così, vi consiglio di leggervi questo: You are not allowed to view links. Register or Login

Altra cosa interessante è anche questa citazione sul linguaggio:
Quote
Praticamente non esistono linguaggi che non siano in grado di funzionare assieme a Rust. Si desidera compilare il codice Rust in un sorgente JavaScript o utilizzare codice assembly inline nel proprio codice Rust? Si può fare!

Voi che ne pensate?  ;D


12
OS / [OS] Tails - Quando bisogna uscirne puliti
« on: November 22, 2016, 07:55:06 PM »
Tails (acronimo di The Amnesic Incognito Live System) è un sistema operativo basato su Debian e programmato per fornire anonimato e riservatezza ai suoi utilizzatori, in che senso?
E' una distro che va messa in Live, non utilizza supporto di memorizzazione della macchina a cui avvieremo il boot, ma solo la memoria del dispositivo in cui è montato in live (Usa solo la RAM, quindi si pulisce quando spegni il PC), si naviga solamente sotto Tor, se si tenta l'accesso con una connessione "non-protetta", verremo subito bloccati, quindi che dire... Adatta per chi ne ha esigenza!, poi utilizza sistemi di criptazione sulla memoria stessa, che dire... Adattissima, tanto chè gli sviluppatori sono pure anonimi!
Un mio parere personale, se si installano i tool necessari per un'attacco, penso che Tails sia molto pericoloso, lo utilizzato tempo fa su una usb, poi essa l'ho formattata, la sto riscaricando ed ho voglia di sperimentarci sopra.

DOWNLOAD:
You are not allowed to view links. Register or Login

13
Progetti Comuni / Un Spotify Casalingo
« on: November 20, 2016, 04:04:45 PM »
STREAMING MUSICALE

Un progetto interessante starebbe nell'utilizzare Raspberry pi con Subsonic installato, mi spiego meglio:
Per chi come me è appassionato di musica, principalmente gruppi underground, difficilmente su Napster/Spotify e altri servizi a pagamento troverà per lo appunto questi gruppi, si potrebbe rendere Raspberry Pi un server che permette lo streaming musicale (Anche video). Ovviamente per gli album e le tracce bisogna farne l'upload, la cosa più importante è la portabilità in quanto potremmo sentire la musica dal nostro smartphone (tramite l'app apposita) o PC, insomma da qualsiasi device che lo supporti.
E' un idea simpatica in quanto non ha costi mensili (Spotify) e possiamo inserire tutti gli artisti preferiti senza occupare memoria sul telefono.

Link:
You are not allowed to view links. Register or Login


14
Crittografia / Sicurezza dei dati
« on: November 20, 2016, 03:47:18 PM »
LA SICUREZZA DEI DATI

Se abbiamo utilizzato tantissime precauzioni per mantenerci anonimi e sicuri su internet come ad esempio:
  • Email Criptate
  • Tor
  • VPN
  • OpenDNS

Non bisogna escludere che se avevamo qualcosa da nascondere non proprio "legale", e siamo stati beccati (quindi ci hanno sequestrato, computer, tastiera, mouse e tutto), l'informatica forense (L'informatica che si occupa di estrapolazione dei dati) avrà i nostri cari file, e se non sono Criptati, ahimè c'è poco da fare...  :(
Perciò in questa sezione di Crittografia parleremo della Crittografia dei File e anche della Crittografia del DIsco, mentre nella sezione Anonimizzazione tratteremo per lo appunto dell'anonimato.  :D

E quindi bisogna ricordare che:
Non dire che non ci si interessi della Privacy virtuale solo perché non si ha nulla da nascondere, è come dire di negarsi il diritto della libera espressione della parola solo perchè non si ha nulla da dire.

15
C++ / [TOOL] Keygenerator.cxx
« on: November 20, 2016, 02:59:05 PM »
GENERATORE DI PASSWORD


Un semplicissimo Tool che ho programmato che ha la funzione di generare delle password "sicure" per le nostre registrazioni,poi vi parlerò meglio in un'altro topic come tenere delle informazioni a prova di sicurezza intesa come anonimizzazione e criptazione/decriptazione.
Code: You are not allowed to view links. Register or Login
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

static const char alphanum[] =
"0123456789"
"!@#&$%^?*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int size= sizeof(alphanum)-1;

int main(){
  system("clear");
  int lunghezza=0;
  cout<<"PASSWORD GENERATOR\n\n";
  cout<<"Inserire la lunghezza: ";
  cin>>lunghezza;
  cout<<"Password: "<<endl;
  srand(time(0));
  for (int i=0; i<lunghezza; i++){
    cout<< alphanum[rand() % size];
  }
  cout<<"\n\n\n";
  return 0;
}

Github:You are not allowed to view links. Register or Login

Ho intenzione di migliorarlo salvando la password in un file e altre migliorie, dove la fantasia mi porti...  :)

Pages: [1] 2 3