Giulio_M

  • 10 ore fa
  • Si è iscritto 15 apr 2022
  • 272 risposte migliori
  • EXP🧠 ➜ 32537
  • Classe 92, ingegnere, webmaster e Digital Specialist, in particolare SEO. Interessato a svariati argomenti, in diversi settori.

  • Alfaromeoista
    considera che anche Youtube piuttosto che Rai decidono di non mostrare un contenuto in un determinato paese in base al diritto d'autore e al copyright

  • Giulio_M
    errori di gioventù.
    Poco tempo fà milioni di pc con Microsoft in tutto il mondo sono crashati per colpa di un aggiornamento sbagliato, non per questo milioni di utenti ha disinstallato Windows.
    L'importante è aver chiaro che piratare ciò che è coperto da copyright è illegale ed moralmente irrispetto nei confronti di chi ne detiene i diritti.

  • Questo è uno degli attacchi più potenti che mi piace molto
    Aggiungi taget 1 target 2 e start 🔝

  • happyok magari ti ricordi male era sicuramente con airodump-ng che ti fa vedere i client connessi sotto la voce station
    E sono i mac di chi è collegato al modem

  • Prova ad analizzare il file vedi che modem è
    Se è tplink puoi provare bruteforce a 8 numeri a volte può indovinarla se sono numerici

  • In questa discussione vediamo come fare bruteforce ad un file .zip (protetto da password non AES) in modo da accedere ai contenuti protetti al suo interno.
    Il bruteforce è un tipo di attacco usato per scoprire password provando in modo automatizzato tutte le combinazioni fino a trovare quella corretta.

    Il tool è composto da main.py (la logica del bot) e gui_version.py che è un interfaccia grafica basata su tkinter.
    L'unico requisito da installare oltre a Python è tkinter, gli altri moduli sono già inclusi nella libreria standard di Python.

    Requisiti

    Per andare a scaricare la libreria in un ambiente virtuale:

    • python3 -m venv venv
    • source venv/bin/activate (Debian)
    • venv\Scripts\activate (WSL Windows)
    • sudo apt-get install python3-tk

    Codice

    Iniziamo a scrivere il main.py, le librerie necessarie:

    • os.path e os usate per mettere mano ai file system, in questo caso sfruttiamo os per confermare l'esistenza di percorsi di file.
    • zipfile per manipolare file .zip
    • itertools per la GUI

    Definiamo i colori in escape ANSI:

    GREEN = '\033[92m'
    RED = '\033[91m'
    PURPLE = '\033[95m'
    RESET = '\033[0m'

    Qui trovate una lista di colori completa.

    La prima cosa che deve fare il codice è cercare di estrarre il file zip (funzione extract_zip) per individuare il campo per fare bruteforce.
    Dopo aver letto la documentazione: zip_file.extractall(pwd=password.encode()).
    extractall cerca di estrarre tutti i file presenti nel file zip, il campo della password viene convertita in un byte string con .encode() per garantire in ogni caso un formato corretto.
    Se l'estrazione riesce ci restituisce true altrimenti false se tutti i tentativi sono sbagliati.

    Ora scriviamo la funzione brute_force per provare tutte le password di una wordlist.
    zipfile.ZipFile(zip_file_path) apre il file .zip specificato nel percorso zip_file_path.
    open(wordlist_path, 'r', encoding='latin-1') apre la wordlist con codifica latin-1 (da cambiare se usate wordlist differenti).
    passwords = f.readlines() legge tutte le righe all'interno della wordlist.
    Poi tramite il for password oltre a scorrere ogni riga, con password.strip() vengono rimossi spazi inutili e extract_zip(zip_file, password) viene ripetuto in continuazione per tentare di estrarre il file zip.

    Nel main viene gestito l'input e vengono verificati i parametri che fornisce l'utente.

    Ora vediamo la GUI, oltre alla libreria tkinter viene aggiunto anche subprocess. In questo caso usato per Popen che permette di eseguire lo script (main) in un processo separato in modo da prendere l'output.
    Guardando la documentazione ho mappato tutte le azioni di main.py.

    main.py

    import os.path
    import os
    import zipfile
    import itertools
    
    GREEN = '\033[92m'
    RED = '\033[91m'
    PURPLE = '\033[95m'
    RESET = '\033[0m'
    
    print(f"""{RED}
    
     _______ _____ ______ _______ _     _  ______ _    _ 
    (_______|_____|_____ (_______) |   | |/ _____) |  / )
       __      _   _____) )____  | |   | | /     | | / / 
      / /     | | |  ____/  ___) | |   | | |     | |< <  
     / /____ _| |_| |    | |     | |___| | \_____| | \ \ 
    (_______|_____)_|    |_|      \______|\______)_|  \_)
                                                         
    """)
    
    
    # apertura zip con psw
    def extract_zip(zip_file, password):
        try:
            zip_file.extractall(pwd=password.encode())
            return True
        except Exception:
            return False
    
    
    # bruteforce sincronizzato con extract_zip
    def brute_force(zip_file_path, wordlist_path):
        with zipfile.ZipFile(zip_file_path) as zip_file:
            with open(wordlist_path, 'r', encoding='latin-1') as f:
                passwords = f.readlines()
            print(f"{GREEN}Attempting to bruteforce the zip file{RESET}")
    
            for password in passwords:
                password = password.strip()
                print(f"Trying Password: {RED}{password}{RESET}")
                if extract_zip(zip_file, password):
                    print(f"\n{GREEN}Password found: {PURPLE}{password}{RESET}")
                    return
            print("Password not found in wordlist.")
    
    def main():
        print(
            f"{PURPLE}NOTE : {RESET}{GREEN}This Tool only works with {RED}'ZIP Legacy Encryption'{RESET}")
        print(f"{GREEN}Welcome to ZipFuck! {RED}EHF{RESET}")
        print(f"{GREEN}Please provide the path to the zip file and the wordlist.{RESET}")
    
        while True:
            zip_file_path = input(f"{PURPLE}Enter the path to the zip file: {RESET}")
            print(f"{GREEN}({RED}To Use the default wordlist type:{PURPLE}  rockyou.txt{GREEN})")
            wordlist_path = input(f"{PURPLE}Enter the path to the wordlist: {RESET}")
    
            if not os.path.exists(zip_file_path) or not os.path.exists(wordlist_path):
                print(f"{PURPLE}Please specify a valid path. {RESET}")
            else:
                break
    
        print(f"{RED}\nStarting brute force attack...\n{RED}")
        brute_force(zip_file_path, wordlist_path)
    
    if __name__ == "__main__":
        main()

    gui_version.py

    import os
    import tkinter as tk
    from tkinter import filedialog, messagebox
    from subprocess import Popen, PIPE
    
    from main import main
    
    window = tk.Tk()
    window.title("ZipFuck by EHF")
    window.configure(bg="#34495E")
    
    def run_cli_version():
        process = Popen(["python", "main.py"], stdout=PIPE, stderr=PIPE)
        stdout, stderr = process.communicate()
        output_text.insert(tk.END, stdout.decode(), "output")
        output_text.insert(tk.END, stderr.decode(), "output")
    
    def select_zip_file():
        zip_file_path = filedialog.askopenfilename(title="Select Zip File", filetypes=[("Zip files", "*.zip")])
        zip_file_entry.delete(0, tk.END)
        zip_file_entry.insert(0, zip_file_path)
    
    def select_wordlist():
        wordlist_path = filedialog.askopenfilename(title="Select Wordlist", filetypes=[("Text files", "*.txt")])
        wordlist_entry.delete(0, tk.END)
        wordlist_entry.insert(0, wordlist_path)
    
    def strip_ansi_escape_codes(text):
        import re
        ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[-/]*[@-~])')
        return ansi_escape.sub('', text)
    
    def start_bruteforce():
        zip_file_path = zip_file_entry.get()
        wordlist_path = wordlist_entry.get()
        bruteforce_inprogress.grid(row=5, columnspan=3)
        window.update()
        if os.path.exists(zip_file_path) and os.path.exists(wordlist_path):
            process = Popen(["python", "main.py"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
            stdout, stderr = process.communicate(f"{zip_file_path}\n{wordlist_path}\n".encode())
            output_text.insert(tk.END, strip_ansi_escape_codes(stdout.decode()), "output")
            output_text.insert(tk.END, strip_ansi_escape_codes(stderr.decode()), "output")
            output_text.see(tk.END)
        else:
            messagebox.showwarning("Warning", "Please select both a zip file and a wordlist.")
    
    def on_enter(e):
        e.widget['background'] = '#16A085'  # Lighter green
    
    def on_leave(e):
        e.widget['background'] = '#1ABC9C'  # Original green
    
    # Shows the Disclaimer of this program
    title_label = tk.Label(window,
                           text="This Tool only works with 'ZIP Legacy Encryption'\n"
                                "ethicalhacking.freeflarum.com",
                           bg="#34495E", fg="#ECF0F1", font=("Helvetica", 12, "bold"))
    title_label.grid(row=0, columnspan=3, pady=(10, 0))
    
    zip_file_label = tk.Label(window, text="Zip File:", bg="#34495E", fg="#ECF0F1", font=("Helvetica", 10))
    zip_file_label.grid(row=1, column=0, sticky="e")
    zip_file_entry = tk.Entry(window, width=50, highlightbackground="#1ABC9C", highlightthickness=2, relief="flat",
                              font=("Helvetica", 10))
    zip_file_entry.grid(row=1, column=1, padx=5, pady=5)
    zip_file_button = tk.Button(window, text="Browse", command=select_zip_file, bg="#1ABC9C", fg="#ECF0F1",
                                activebackground="#16A085", relief="flat", borderwidth=0, padx=10, pady=5, 
                                font=("Helvetica", 10, "bold"))
    zip_file_button.grid(row=1, column=2, padx=5, pady=5)
    
    wordlist_label = tk.Label(window, text="Wordlist:", bg="#34495E", fg="#ECF0F1", font=("Helvetica", 10))
    wordlist_label.grid(row=2, column=0, sticky="e")
    wordlist_entry = tk.Entry(window, width=50, highlightbackground="#1ABC9C", highlightthickness=2, relief="flat",
                              font=("Helvetica", 10))
    wordlist_entry.grid(row=2, column=1, padx=5, pady=5)
    wordlist_button = tk.Button(window, text="Browse", command=select_wordlist, bg="#1ABC9C", fg="#ECF0F1",
                                activebackground="#16A085", relief="flat", borderwidth=0, padx=10, pady=5,
                                font=("Helvetica", 10, "bold"))
    wordlist_button.grid(row=2, column=2, padx=5, pady=5)
    
    start_button = tk.Button(window, text="Start Bruteforce", command=start_bruteforce, bg="#E67E22", fg="#ECF0F1",
                             activebackground="#D35400", relief="flat", borderwidth=0, padx=10, pady=10,
                             font=("Helvetica", 12, "bold"))
    start_button.grid(row=3, columnspan=3, pady=10)
    
    # Button to run CLI version
    run_cli_button = tk.Button(window, text="Run CLI Version", command=run_cli_version, bg="#E67E22", fg="#ECF0F1",
                               activebackground="#D35400", relief="flat", borderwidth=0, padx=10, pady=10,
                               font=("Helvetica", 12, "bold"))
    run_cli_button.grid(row=4, columnspan=3, pady=10)
    
    # Text widget to display output
    output_text = tk.Text(window, height=10, width=70, bg="#2C3E50", fg="#ECF0F1", font=("Helvetica", 12, "bold"), 
                          highlightbackground="#1ABC9C", highlightthickness=2, relief="flat", padx=5, pady=5)
    output_text.grid(row=6, columnspan=3, padx=10, pady=10)
    output_text.tag_configure("output", foreground="#ECF0F1")
    
    bruteforce_inprogress = tk.Label(window,
                                     text="Bruteforce Attack is Activated in the Background\n "
                                          "You will be Notified after the attack is completed",
                                     bg="#34495E", fg="#ECF0F1", font=("Helvetica", 10))
    
    for button in [zip_file_button, wordlist_button, start_button, run_cli_button]:
        button.bind("<Enter>", on_enter)
        button.bind("<Leave>", on_leave)
    
    window.mainloop()
    
    if __name__ == "__main__":
        main()

    Qui sotto trovate la repo del tool, ho incluso la wordlist (RockYou non completa) e per chi non vuole installare Python la GUI convertita in exe tramite pyinstaller che purtroppo VirusTotal lo riconosce come trojan (link analisi). Chiaramente un falso positivo.

    GITHUB LINK!

  • Samueleex cmq sarebbe interessante un tool con altre funzioni "simili" per lo spam. Tipo spam inline con ubot o spam con forward quindi inoltrando messaggi da un canale ad esempio ad un elenco preciso di utenti dopo lo scraping. Perché solitamente il send normale fa limitare subito l'account e non riesci a spammare tanto

  • TakeMe Come da disclaimer:

    Vi consiglio di NON utilizzare il vostro account principale in quanto Telegram ha dei sistemi anti-spam che lo limitano per un tot di tempo, non permettendo più di inviare messaggi ad utenti al di fuori dei contatti.
    Se avete il presentimento di essere limitati vi basta contattare "@SpamBot", lanciato il comando /start vi dovrà rispondere: "Good news, no limits are currently applied to your account. You’re free as a bird!"
    Per risolvere il problema vi basta usare un VoIP (che offre un numero di telefono secondario), già menzionati qui.

    Questo tool (come si può notare dal video), l'ho usato senza problemi sul mio account principale solo per lo scraping di gruppi. Nell'aggiunta di persone da un gruppo all'altro se esagerata si riceve una limitazione. In questo caso, almeno per le prime volte Telegram limita ma non banna.
    Se hai usato un VoIP la situazione potrebbe cambiare perché Telegram molto probabilmente ne è consapevole.

    • Ogni volta che il bot si connette all'account, viene bannato. Qualcuno ha mai riscontrato questo problema? Avete possibili soluzioni?

      • Esatto!! Aggiungo anche che se non avete particolari esigenze al posto di usare "media" si potrebbe usare anche srcset, facendo decidere al browser l'immagine più appropriata in base alla risoluzione dello schermo e alla dimensione del viewport.
        Esempio:

        <img 
            src="parrot-home.png" 
            srcset="parrot-home-small.png 400w, parrot-home-medium.png 800w, parrot-home-large.png 1200w" 
            sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 400px" 
            alt="Parrot OS Home Edition wallpaper">

        Si può intuire che srcset funziona mappando le risoluzioni, in questo modo verranno adattate di conseguenza!

      • AGGIORNAMENTO

        Il metodo descritto sopra è stato patchato nelle versioni più recenti di Windows.

        Possiamo arrivare allo stesso risultato usando Linux in dual boot andando a spulciare i filesystem di Windows tramite un tool per sovrascrivere la password.

        Iniziamo rendendo avviabile una chiavetta in modo da avviare Linux in dual boot, vi consiglio un sistema operativo leggero basato su Debian dato che non abbiamo troppe esigenze (ad esempio Linux Mint).
        Scarichiamo l'ISO del sistema operativo (download diretto).

        Altro requisito è Rufus per rendere avviabile la chiavetta con l'ISO.

        Impostazioni da inserire:

        Ora spostiamoci nel PC dove non ci ricordiamo la password e dopo aver premuto il tasto di accensione premete ripetutamente il tasto per entrare nel boot menu, i più popolari sono F9 e F12 ma qui potete trovare una tabella molto completa che potrebbe aiutarvi.

        Entrati nel boot menu selezionate la vostra chiavetta, se non la vedete probabilmente avete il bios impostato su UEFI, dal bios (sezione boot) impostate Legacy che supporta hardware più vecchi.

        Dopo aver avviato Linux Mint rechiamoci sul terminale e prima di impazzire per trovare i caratteri speciali corretti impostiamo la tastiera italiana: setxkbmap it

        Privilegi di root:
        sudo su

        Installiamo il tool per sovrascrivere la password:
        sudo apt install chntpw

        Ora dobbiamo scoprire il nome del disco (dove è installato Windows):
        fdisk -l
        Se avete solo Windows installato, per non complicarvi la vita vi consiglio di confrontare il numero di memoria indicato con quello del vostro hard disk o SSD.

        Prima di eseguire azioni troppo invasive se non vi fidate e avete dati molto importanti vi consiglio di salvare i dati da qui.
        Per accedere ai file di Windows andiamo a montare il disco:
        mount -t ntfs /dev/sda /mnt

        In questo modo abbiamo creato la cartella mnt, accessibile:
        cd /mnt

        Ora che siamo nella cartella vediamo i file salvati con ls, ora potete salvarli in un'altra pennetta.

        Lavoriamo sui file log "SAM", accennati nella discussione per il tool "John the Ripper".

        Andiamo ad eseguire il tool chntpw scaricato in precedenza per vedere delle informazioni sull'utente:
        chntpw -u test SAM

        Se l'utente è proprio quello che ci interessa digitate "1" sul terminale che corrisponde a pulire la vecchia password.

        Operazione completata! Dopo il riavvio della macchina il computer sarà privo di password.

      • top !! anche io ho sempre fatto ps3 e ps4 però linux ero rimasto alla ps3, non cio pensato di provarlo su ps4
        appena troverò un po di tempo lo farò.... bella guida

      • In questa guida vedremo come restaurare una PS4: pulizia, cambio pasta termica, jailbreak e installazione di Linux.

        Materiale necessario:

        • Alcool isopropilico per elettronica
        • Cacciaviti torx e a stella
        • Pasta termica (nel mio caso ho usato la Arctic MX-6)
        • Molta carta o panni in microfibra per la pulizia
        • (Opzionale ma consigliato) pennelli e aria compressa

        Cambio pasta termica e pulizia:

        Iniziamo dando una bella pulita, la plastica esterna si può rimuovere facendo leva dopo aver tolto le viti e sigilli di garanzia dietro alla scocca.

        Rimosse le scocche iniziamo a smontare la batteria, importante sfilarla senza fare leva per non rovinare i connettori.

        Da rimuovere anche i connettori:

        Scollego anche questo cavo a nastro per rimuovere il modulo bluetooth.

        Risultato:

        Ora giriamo la PS4 e iniziamo a svitare tutte le viti che fissano la scocca grigia (sfilate anche l'hard disk e il pulsante di accensione per non perderlo).

        Ora se sollevate la scheda madre si può ben notare la vecchia pasta termica.
        Dopo aver pulito con l'alcool isopropilico:

        Rimontiamo tutto seguendo i passaggi descritti prima.

        Jailbreak PS4

        Il jailbreak di base è un operazione non autorizzata che permette di rimuovere delle limitazioni software imposte da Sony.
        Non tutte le versioni permettono questo tipo di modifiche pertanto noi andremo ad aggiornare la console alla versione 9.00.

        Requisiti:

        • Computer esterno
        • Chiavetta da almeno 4gb

        Versione 9.00 della console

        Se avete già la console a questa versione potete saltare questo passaggio.
        Per controllare la versione della nostra console dobbiamo recarci su sistema > informazioni di sistema:

        Dopo aver controllato la versione, disabilitate il wifi dalla sezione "rete" delle impostazioni e disabilitate gli aggiornamenti automatici: sistema > downloads automatici e togliete tutte le spunte.

        Ora spostiamoci sul PC e scarichiamo Rufus per formattare la chiavetta in modo corretto e il PS4 9.00 firmware.
        Andiamo a formattare la chiavetta in formato exFAT tramite Rufus.
        Dopo aver formattato la chiavetta creiamo una cartella PS4 e un'ulteriore sottocartella UPDATE e mettiamo il firmware scaricato come in foto:

        Il prossimo passo sarà cambiare il DNS per indirizzare il traffico fuori dai server Sony, in questo modo possiamo accedere all'interfaccia che ci permette il Jailbreak.

        Rechiamoci sulle impostazioni della PS4 > Rete > (abilitiamo la rete) > Configura rete > scegliere se LAN o wifi > personalizzato > automatico > non specificato > dns manuale: 165.227.83.145, 192.241.221.79.
        Per provare il funzionamento recatevi nel browser e verificate se le pagine si caricano.

        Spostiamoci sul PC e scarichiamo l'exploit img che ci permetterà di effettuare il vero jailbreak.
        Apriamo Rufus e selezioniamo il file appena scaricato e iniziamo a formattare la chiavetta:

        Dopo quest'operazione è normale che il computer non riesca a leggere normalmente la nostra chiavetta, vi basterà rimuoverla.

        Per effettuare il jailbreak rechiamoci nella sezione "guida" dalle impostazioni, si aprirà un sito non ufficiale grazie al cambio di DNS.

        Clicchiamo sulla sezione 9.00 e avviamo la voce GoldHen, dopo pochi secondi dovrà apparire sullo schermo:

        Inserite la USB appena creata dal PC e lasciatela per almeno 30 secondi, cliccate "ok" e se tutto è stato eseguito in modo corretto riceverete la notifica "GoldHEN loaded".

        Installazione di Linux:

        Dopo aver eseguito il Jailbreak della PS4 dovremo essere in grado di lanciare il payload per caricare la nostra distro Linux.

        Per prima cosa dovrete recarvi nelle informazioni della PS4 e verificare che il Southbridge sia attivo:

        (Segnatevi anche l'IP della terza riga per la futura connessione FTP).

        Requisiti da scaricare:

        Dalle impostazioni del nostro Jailbreak GoldHen verifichiamo di avere un tunnel FTP attivo:

        Impostazioni della PS4:

        Impostazioni video > risoluzione non superiore a 1080p (raccomandata):

        RGB Range: limitato o completo.

        Sistema e disabilitate HDMI device link e HDCP:

        Installare Linux nell'hard disk:

        Apriamo il nostro client FTP (FileZilla) e connettiamoci all'ip della PS4 su porta 2121:

        Ora andiamo su: user > system > create una cartella di nome "boot".
        All'interno di boot copiamo initramfs, bzimage e la distro:

        Dopo aver aperto il browser della PS4 apriamo il sito di kme sulla sezione payloads:

        Per l'installazione è consigliato avviare la versione da 1gb di VRAM.

        Dopo averlo avviato (circa dopo 30 secondi):

        Per l'installazione vera e propria:
        exec install-linux-hdd.sh

        Risultato:

        Installazione da chiavetta

        Molto simile alle istruzioni per installarlo sull'HDD con la differenza che dobbiamo mettere nella chiavetta i file bzimage, initramfs e la distro in formato FAT32.

        Dopo aver inserito la chiavetta lanciamo il payload dal sito kme:

        Digitiamo questa riga di comando:
        exec install-psxitarch.sh

        Tips Linux

        Per aggiornare la distro è sconsigliato il classico sudo apt-get update && sudo apt get upgrade dato che potrebbe andare in conflitto con i driver e sovrascriverli.
        Per evitare problemi è da escludere questi pacchetti: sudo dnf update -x kernel*,mesa*, libdrm*, xorg-x11-drv-a
        Ora per installare programmi:
        sudo dnf install "nome"

        Vi consiglio anche di fare uno swap di memoria per aiutare la RAM in caso volessimo giocare con emulatori da Linux o lavorare con programmi pesanti.
        Per verificare lo swap e le varie memorie è utile installare htop, quindi: sudo dnf install htop.
        Se lo avviate si può notare che lo swap è nullo.
        Per allocare spazio:
        sudo fallocate -1 1G /swapfile (Modifica lo spazio in base alle necessità)
        sudo chmod 600 /swapfile
        sudo mkswap /swapfile
        sudo swapon /swapfile
        sudo nano /etc/fstab

        Non si può accedere a Linux direttamente con il tasto di accensione, dovrete prima passare attraverso il sito di kme per avviare il payload.

        Se questa guida non funziona o ricevete errori della fase di boot dopo aver caricato il payload è al 99% un problema del kernel quindi provate e riprovate con bzimage diverse!

      • https://www.cybersecurity360.it/cybersecurity-nazionale/dai-cavi-sottomarini-ai-satelliti-il-progetto-nato-antisabotaggio-per-salvaguardare-il-traffico-internet/

        Qui : https://next.thenextweb.com/news/nato-backed-project-protect-subsea-internet-diverting-to-space trovate il comunicato in lingua inglese.

        • Samueleex, Giulio_M e Vladimir hanno messo mi piace.
        • Giulio_M ha risposto a questo messaggio
        • Vladimir se ci pensiamo, è davvero pazzesco! Da quanto indicato nell'articolo, <<i cavi sottomarini, che trasportano più di 10.000 miliardi di dollari di transazioni finanziarie ogni giorno>>. Si stima poi che in totale, la rete di cavi sottomarini sia di circa 1,5 milioni di chilometri (considerando tutti i cavi e tutti gli intrecci).

          È chiaro che, nell'attuale contesto geopolitico, attacchi hacker o attentati tali da creare dei disservizi, avrebbero al giorno d'oggi un impatto ben più grande di qualunque catastrofe naturale che possiamo aspettarci.

          Il progetto HEIST (Hybrid Space and Submarine Architecture to Ensure Information Security of Telecommunications) della NATO è, come si può intuire, propenso alla diversificazione, per avere almeno in parte una copertura nel caso di disservizi (per cause artificiali o naturali che siano), vista la posta in gioco, sicuramente è opportuno. Nello specifico si pensa ad un sistema per reindirizzare i dati nello spazio, sfruttando quindi il sistema satellitare.

          Vediamo ora come sono organizzati i cavi sottomarini per il traffico web, dal sito ufficiale submarinecablemap.com con la mappa interattiva, vediamo infine un'immagine della mappa.
          mappa globale cavi sottomarini internet

        • https://www.cybersecitalia.it/ransomware-azzasec-sferrato-dal-gruppo-italiano-di-hacktivisti-contro-israele-come-funziona/36240/

          Trovate un comunicato 𝐝𝐞𝐭𝐭𝐚𝐠𝐥𝐢𝐚𝐭𝐨 anche qui : https://www.redhotcyber.com/post/gli-hacktivisti-italiani-di-azzasec-violano-il-sito-di-servizi-cinema/

          • Samueleex, Giulio_M e Vladimir hanno messo mi piace.
          • Giulio_M ha risposto a questo messaggio
          • Vladimir interessante notare la polarizzazione, schieramento politico. AzzaSec è un gruppo di hacker italiani, contro Israele (come sappiamo, Israele = pro USA) e alleato alla Russia, in particolare Noname057, filorusso (che colpisce principalmente obiettivi che hanno interessi "contro la Russia", nella maggior parte dei casi tramite attacco DDoS).
            Il gruppo AzzaSec offre come servizio un programma RaaS (Ransomware-as-a-Service), ad un prezzo anche considerevole (fino ad alcune migliaia di dollari) quindi sicuramente per un target medio-alto. Dal punto di vista tecnico, il ransomware è scritto in VB.Net. Trattandosi di un ransomware, dopo aver criptato i file genera sul desktop un documento con le istruzioni per il recupero (pagamento in Bitcoin). Fra gli attacchi, il più recente e noto è quello a Servizi Cinema Italia, la motivazione, come riportato dalla fonte linkata è appunto un <<atto di protesta in solidarietà con la Palestina e la Russia>>.

          • Oggi vedremo come creare una chat IRC in Python crossplatform semplice da usare e crittografata!
            IRC (Internet Relay Chat) è un protocollo usato per chat online sviluppato alla fine degli anni '80 e permette agli utenti di comunicare tramite canali e IP. Una chat IRC solitamente si appoggia su un server che gestisce le connessioni degli utenti e distribuisce i messaggi fra loro.
            L'idea è scrivere due file python server.py e client.py dove i messaggi scambiati tra client e server sono criptati utilizzando l'algoritmo di crittografia AES.

            server.py è lo script che ci permetterà di hostare la chat tramite la nostra macchina e con client.py abbiamo la possibilità di inviare messaggi.
            All'inizio importiamo le librerie necessarie come socket per la rete, Crypto.Cipher per la crittografia AES e hashlib per l'hashing delle password.
            Legge la configurazione da un file ircehf.conf per ottenere l'host, la porta, la password e altre impostazioni.
            All'interno del file ci sono varie funzioni per abbellire l'interfaccia come clear_screen, sigint_handler.
            hashercrea un hash MD5 della password per utilizzarlo come chiave AES.
            encrypte decrypt criptano e decriptano i messaggi usando AES in modalità ECB.
            chat_server crea un socket server, accetta connessioni dai client, riceve e decripta i messaggi, e li ritrasmette criptati a tutti i client connessi.
            broadcast invia un messaggio a tutti i client connessi, eccetto il mittente e il server stesso.
            Il server viene avviato richiamando chat_server.

            Requisiti:

            Libreria Pycryptodome installata su ambiente virtuale, segui i comandi sulla foto:

            server.py

            Andiamo ad importare le librerie necessarie:

            • configparser: per leggere configurazioni da un file.
            • base64: per codificare e decodificare i messaggi criptati.
            • sys, socket, select: moduli standard per interazioni di sistema e comunicazioni di rete.
            • Crypto.Cipher import AES: per la crittografia AES.
            • hashlib: per l'hashing delle password.
            • os: per operazioni di sistema come la pulizia dello schermo.
            • signal: per gestire segnali di interruzione (es Ctrl+C).

            In seguito restituisce il banner ASCII.
            sigint_handler gestisce l'interruzione dell'utente (Ctrl+C) stampando un messaggio e chiudendo il server.
            signal.signal registra sigint_handlercome gestore per SIGINT.
            hashercrea un hash MD5 di una stringa (password) utilizzando prima SHA-512.
            encrypt cripta i dati usando AES in modalità ECB e li codifica in base64.
            decryptdecripta i dati da base64 e li decripta usando AES in modalità ECB.
            config.read legge la configurazione dal file ircehf.conf.
            Estrae HOST, PORT, PASSWORD, VIEW e crea un hash della password.

            chat_server funzione principale del server:

            • Crea un socket.
            • Si mette il listening per connessioni e le aggiunge a SOCKET_LIST.
            • Usa select.select per gestire le letture/scritture sui socket.
            • Accetta nuove connessioni e riceve messaggi dai client.
            • Decripta i messaggi ricevuti, li recripta e li invia a tutti i client connessi.
            • Rimuove i client disconnessi dalla lista.
              broadcast: invia un messaggio a tutti i client connessi tranne al mittente.
            import configparser
            import base64
            import sys, socket, select
            from Crypto.Cipher import AES
            import hashlib
            import os
            import signal
            
            # Clear the screen based on the OS
            def clear_screen():
                if os.name == 'nt':  # For Windows
                    os.system('cls')
                else:  # For Linux and Mac
                    os.system('clear')
            
            clear_screen()
            
            print(r"""
            
             ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄       ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄  ▄▄▄▄▄▄▄▄▄▄▄ 
            ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌     ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░░░░░░░░░░▌
             ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀      ▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ 
                 ▐░▌     ▐░▌       ▐░▌▐░▌               ▐░▌          ▐░▌       ▐░▌▐░▌          
                 ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌▐░▌               ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ 
                 ▐░▌     ▐░░░░░░░░░░░▌▐░▌               ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌
                 ▐░▌     ▐░█▀▀▀▀█░█▀▀ ▐░▌               ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ 
                 ▐░▌     ▐░▌     ▐░▌  ▐░▌               ▐░▌          ▐░▌       ▐░▌▐░▌          
             ▄▄▄▄█░█▄▄▄▄ ▐░▌      ▐░▌ ▐░█▄▄▄▄▄▄▄▄▄      ▐░█▄▄▄▄▄▄▄▄▄ ▐░▌       ▐░▌▐░▌          
            ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░░░░░░░░░░▌     ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░▌          
             ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀▀▀▀▀▀▀▀▀▀▀       ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀           
                                                                                               
                              IRC chat sicura
                                Samueleex
            
            """)
            
            def sigint_handler(signum, frame):
                print('\n[error] user interrupt')
                print("[info] shutting down EHF-IRC \n\n")
                sys.exit()	
            
            signal.signal(signal.SIGINT, sigint_handler)
            
            def hasher(key):
                hash_object = hashlib.sha512(key.encode('utf-8'))
                hexd = hash_object.hexdigest()
                hash_object = hashlib.md5(hexd.encode('utf-8'))
                hex_dig = hash_object.hexdigest()
                return hex_dig	
            
            def encrypt(secret, data):
                BLOCK_SIZE = 32
                PADDING = '{'
                pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
                EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s).encode('utf-8'))).decode('utf-8')
                cipher = AES.new(secret.encode('utf-8'), AES.MODE_ECB)
                encoded = EncodeAES(cipher, data)
                return encoded
            
            def decrypt(secret, data):
                BLOCK_SIZE = 32
                PADDING = '{'
                DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).decode('utf-8').rstrip(PADDING)
                cipher = AES.new(secret.encode('utf-8'), AES.MODE_ECB)
                decoded = DecodeAES(cipher, data)
                return decoded
            
            config = configparser.RawConfigParser()   
            config.read(r'ircehf.conf')
            
            HOST = config.get('config', 'HOST')
            PORT = int(config.get('config', 'PORT'))
            PASSWORD = config.get('config', 'PASSWORD')
            VIEW = str(config.get('config', 'VIEW'))
            key = hasher(PASSWORD)
            SOCKET_LIST = []
            RECV_BUFFER = 4096
            
            def chat_server():
            
                server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                server_socket.bind((HOST, PORT))
                server_socket.listen(10)
            
                SOCKET_LIST.append(server_socket)
            
                print("[Server] Started on port " + str(PORT))
            
                while 1:
            
                    ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[],0)
            
                    for sock in ready_to_read:
            
                        if sock == server_socket:
                            sockfd, addr = server_socket.accept()
                            SOCKET_LIST.append(sockfd)
                            print("[Server] User [(%s, %s)] connected" % addr)
                        else:
                            try:
                                data = sock.recv(RECV_BUFFER).decode('utf-8')
                                data = decrypt(key, data)
                                if data:
                                    broadcast(server_socket, sock, encrypt(key, "\r" + data))
                                    if VIEW == '1':
                                      print(data)
                                else:
            
                                    if sock in SOCKET_LIST:
                                        SOCKET_LIST.remove(sock)
            
                                    broadcast(server_socket, sock, encrypt(key, "[Server] [(%s, %s)] Has left the server.\n" % addr))
            
                            except Exception as e:
                                print(f"Error: {e}")
                                broadcast(server_socket, sock, "[Server] User [(%s, %s)] is offline\n" % addr)
                                continue
            
                server_socket.close()
            
            def broadcast(server_socket, sock, message):
                for socket in SOCKET_LIST:
            
                    if socket != server_socket and socket != sock :
                        try :
                            socket.send(message.encode('utf-8'))
                        except :
            
                            socket.close()
            
                            if socket in SOCKET_LIST:
                                SOCKET_LIST.remove(socket)
            
            if __name__ == "__main__":
            
                sys.exit(chat_server())

            client.py

            Importiamo le librerie necessarie:

            • base64: per codificare e decodificare i messaggi criptati.
            • sys, socket, select: moduli standard per interazioni di sistema e rete.
            • Crypto.Cipher import AES: per la crittografia AES.
            • os: per operazioni di sistema come la pulizia dello schermo.
            • hashlib: per l'hashing delle password.
            • signal: per gestire segnali di interruzione (es Ctrl+C).

            chat_client funzione principale del client:

            • Verifica il numero di argomenti immessi tramite input su terminale.
            • Estrae host, port, key e uname dagli argomenti della riga di comando.
            • Connette il socket al server.
            • Gestisce la ricezione e l'invio dei messaggi.
            • Cripta i messaggi prima di inviarli al server e decripta i messaggi ricevuti dal server.
            • Restituisce messaggi locali e ricevuti dal server su terminale.
            import base64
            import sys, socket, select
            from Crypto.Cipher import AES
            import os
            import hashlib
            import signal
            
            def clear_screen():
                if os.name == 'nt':  # For Windows
                    os.system('cls')
                else:  # For Linux and Mac
                    os.system('clear')
            
            clear_screen()
            
            print(r"""
            
             ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄       ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄  ▄▄▄▄▄▄▄▄▄▄▄ 
            ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌     ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░░░░░░░░░░▌
             ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀      ▐░█▀▀▀▀▀▀▀▀▀ ▐░▌       ▐░▌▐░█▀▀▀▀▀▀▀▀▀ 
                 ▐░▌     ▐░▌       ▐░▌▐░▌               ▐░▌          ▐░▌       ▐░▌▐░▌          
                 ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌▐░▌               ▐░█▄▄▄▄▄▄▄▄▄ ▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄ 
                 ▐░▌     ▐░░░░░░░░░░░▌▐░▌               ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌
                 ▐░▌     ▐░█▀▀▀▀█░█▀▀ ▐░▌               ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀ 
                 ▐░▌     ▐░▌     ▐░▌  ▐░▌               ▐░▌          ▐░▌       ▐░▌▐░▌          
             ▄▄▄▄█░█▄▄▄▄ ▐░▌      ▐░▌ ▐░█▄▄▄▄▄▄▄▄▄      ▐░█▄▄▄▄▄▄▄▄▄ ▐░▌       ▐░▌▐░▌          
            ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░░░░░░░░░░▌     ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░▌          
             ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀▀▀▀▀▀▀▀▀▀▀       ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀           
                                                                                               
                              IRC chat sicura
                                Samueleex
            
            """)
            
            def sigint_handler(signum, frame):
                print('\n[error] user interrupt')
                print("[info] shutting down EHF-IRC \n\n")
                sys.exit()
            
            signal.signal(signal.SIGINT, sigint_handler)
            
            def hasher(key):
                hash_object = hashlib.sha512(key.encode('utf-8'))
                hexd = hash_object.hexdigest()
                hash_object = hashlib.md5(hexd.encode('utf-8'))
                hex_dig = hash_object.hexdigest()
                return hex_dig
            
            def encrypt(secret, data):
                BLOCK_SIZE = 32
                PADDING = '{'
                pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
                EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s).encode('utf-8'))).decode('utf-8')
                cipher = AES.new(secret.encode('utf-8'), AES.MODE_ECB)
                encoded = EncodeAES(cipher, data)
                return encoded
            
            def decrypt(secret, data):
                BLOCK_SIZE = 32
                PADDING = '{'
                DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).decode('utf-8').rstrip(PADDING)
                cipher = AES.new(secret.encode('utf-8'), AES.MODE_ECB)
                decoded = DecodeAES(cipher, data)
                return decoded
            
            def chat_client():
                if len(sys.argv) < 5:
                    print('Usage: python dream-irc.py [hostname] [port] [password] [username]')
                    sys.exit()
            
                host = sys.argv[1]
                port = int(sys.argv[2])
                key = sys.argv[3]
                key = hasher(key)
                uname = sys.argv[4]
            
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.settimeout(2)
            
                try:
                    s.connect((host, port))
                except:
                    print("\033[95m" + 'Unable to connect' + "\033[0m")
                    sys.exit()
            
                print("Connected to remote host. Your messages will be securely transmitted.")
                sys.stdout.write("\033[34m" + '\n[local] #  ' + "\033[0m")
                sys.stdout.flush()
            
                while True:
                    socket_list = [sys.stdin, s]
                    read_sockets, write_sockets, error_sockets = select.select(socket_list, [], [])
            
                    for sock in read_sockets:
                        if sock == s:
                            data = sock.recv(4096).decode('utf-8')
            
                            if not data:
                                print("\033[95m" + "\nDisconnected from server" + "\033[0m")
                                sys.exit()
                            else:
                                data = decrypt(key, data)
                                sys.stdout.write(data)
                                sys.stdout.write("\033[34m" + '\n[local] #  ' + "\033[0m")
                                sys.stdout.flush()
                        else:
                            msg = sys.stdin.readline()
                            msg = '[ ' + uname + ': ] ' + msg
                            msg = encrypt(key, msg)
                            s.send(msg.encode('utf-8'))
                            sys.stdout.write("\033[34m" + '\n[local] #  ' + "\033[0m")
                            sys.stdout.flush()
            
            if __name__ == "__main__":
                sys.exit(chat_client())

            ircehf.conf:

            [config]
            
            HOST = 127.0.0.1
            
            PORT = 43434
            
            PASSWORD = password
            
            VIEW = 0

          • Finalmente dopo 3 anni ho deciso di cambiare pasta termica al mio laptop MSI serie Pulse! Operazione non difficile ma vorrei comunque condividerla.
            Premessa per MSI, il cambio pasta termica e pulizia del portatile sono consentiti direttamente dall’utente quindi non serve farsi autorizzare da rivenditori.
            Se siete ancora in garanzia e non volete invalidarla, dovrete inviare prima una mail a it.assistenza@msi.com descrivendo operazione da fare e seriale che trovate dietro al portatile.

            Materiali necessari:

            • Pasta termica (non conduttiva) nel mio caso ho usato la Arctic MX-6 visto che era in sconto.

            • Alcool isopropilico per elettronica (ci servirà per rimuovere i residui di pasta precedente).

            • Cacciavite a stella o avvitatore

            • Guanti (non obbligatori ma consigliati per non toccare i pad termici).

            • Molta carta/dischetti da trucco o panni in microfibra per pulire.

            • Molta pazienza

            Iniziamo smontando la scocca del laptop svitando le rispettive viti, attenzione che sotto il sigillo di garanzia c'è sicuramente una vite!
            Con molta attenzione solleviamola aiutandoci anche con i fori per la dissipazione.

            Prima di togliere tutto scollegate i due cavi di alimentazione delle ventole sulla scheda madre, se vi sentite più sicuri togliete il collegamento alla batteria ma non è obbligatorio.
            Ora bisogna togliere il dissipatore, sopra di esso a fianco alle viti trovate dei numeri. Quei numeri sono proprio l'ordine da rispettare per montarle/smontarle, caldamente consigliato rispettare l'ordine soprattutto in fase di rimontaggio del dissipatore altrimenti la pasta termica rischia di spalmarsi male o addirittura di fuoriuscire (se conduttiva potete buttare il laptop).

            Ora delicatamente stacchiamo il dissipatore.

            Puliamo a fondo CPU, GPU e dissipatore dai rimasugli della vecchia pasta, nel mio caso applicata davvero male con una consistenza simile al pongo! :/

            Finita la pulizia applichiamo la pasta termica, io ho preferito abbondare leggermente per essere sicuro di coprire tutta la superficie ma ne basterebbe anche meno.

            Inoltre la MX-6 rispetto alla MX-4 è molto più viscosa e ho preso la versione da 8 grammi.
            L'importante è non esagerare perché potrebbe fuoriuscire!

            Finito il tutto rimontiamo delicatamente il dissipatore e rispettiamo assolutamente l'ordine scritto a fianco alle viti!
            Ricollegate le ventole e montata la scocca questo è il risultato!

            A riposo dopo 15 min:

            Sotto sforzo ventole automatiche (no cooler boost)

            Temperature ottime anche sotto sforzo, operazione consigliatissima dopo 2/3 anni (magari con anche il cambio dei pad termici che non ho fatto).

          • Oggi vedremo uno script bash che ci permette di analizzare i sottodomini di un webserver tramite diverse utility:

            Struttura del codice:

            - /path/to/script/
             - subdomain_finder.sh    # bash 
             - requirements.txt       # requisiti Python
             - install_tools.sh       # servizi richiesti
             - recon.log              # log (creato dallo script)
             - domains.txt            # (opzionale) lista di domini

            Il codice inizia definendo diversi colori per il terminale, subito dopo definiamo la funzione display_usage che restituisce le istruzioni su come usare lo script compreso un esempio di comando (questa funzione viene richiamata tramite -h o --help).
            Definiamo una funzione di log che ci permette di salvarlo tramite timestamp.
            Viene installato figlet tramite apt-get, tool opzionale utilizzato per generare il banner dello script.
            Quando richiamiamo il tool da terminale i comandi vengono riconosciuti tramite parsing degli argomenti quindi analizza gli argomenti: della riga di comando per determinare il dominio (-d o --domain), il file della lista di domini (-dL o --domain-list) e la directory di output (-o o --output).
            Se il comando inserito non è corretto o il dominio non viene inserito in maniera corretta restituisce un errore e il messaggio di utilizzo (idem se non viene trovata nessuna lista di domini).
            Poi viene scritta la logica per salvare la cartella di output, se viene specificata lo script la crea e cambia la directory corrente in quella directory.
            Viene creata la funzione run_recon che avvia l'enumerazione dei sottodomini tramite i servizi specificati in precedenza (Assetfinder, Subfinder, Sublist3r, Chaos, Crtsh, Crobat, Findomain, Knockpy, Amass). I risultati di ciascun tool vengono salvati in file separati e poi combinati in un unico file di sottodomini unici, questi file temporanei vengono poi rimossi.
            Se abbiamo configurato correttamente il codice per Telegram e Discord, dopo aver completato l'enumerazione invia una notifica a un webhook Discord e a un bot Telegram (con timestamp).

            #!/bin/bash
            
            RED=$(tput setaf 1)
            GREEN=$(tput setaf 2)
            BLUE=$(tput setaf 4)
            YELLOW=$(tput setaf 3)
            CYAN=$(tput setaf 6)
            WHITE=$(tput setaf 7)
            RESET=$(tput sgr0)
            
            display_usage() {
                echo "${YELLOW}Subdomain Finder di Samueleex${RESET}"
                echo
                echo "Uso: $0 [opzioni]"
                echo
                echo "Opzioni:"
                echo "  -h, --help               Dove ti trovi ora"
                echo "  -d, --domain <nome>      Specifica un dominio"
                echo "  -dL, --domain-list       Specifica un file con una lista di domini"
                echo "  -o, --output <directory> Specifica la directory di output"
                echo
                echo "Esempio: $0 -d example.com -o /home/user/Desktop"
                exit 1
            }
            
            log() {
                local log_file="recon.log"
                local timestamp=$(date +"%Y-%m-%d %T")
                echo "[$timestamp] $1" >> "$log_file"
                echo -e "$2$1${RESET}"
            }
            
            if ! command -v figlet &> /dev/null; then
                echo "Figlet non presente. Installazione..."
                sudo apt-get update
                sudo apt-get install -y figlet
            fi
            
            color_code="\033[31m"
            reset_color="\033[0m"
            figlet_text=$(figlet "Sub finder")
            colored_text="${color_code}${figlet_text}${reset_color}"
            echo -e "$colored_text"
            
            output_file=""
            domain=""
            domain_list=""
            output_dir=""
            
            while [[ $# -gt 0 ]]; do
                key="$1"
                case $key in
                    -h|--help)
                        display_usage
                        ;;
                    -d|--domain)
                        domain="$2"
                        shift
                        ;;
                    -dL|--domain-list)
                        domain_list="$2"
                        shift
                        ;;
                    -o|--output)
                        output_dir="$2"
                        shift
                        ;;
                    *)
                        echo -e "${RED}Opzione sconosciuta: $1${RESET}"
                        display_usage
                        ;;
                esac
                shift
            done
            
            set -e
            
            if [ -z "$domain" ] && [ -z "$domain_list" ]; then
                log "For bash practice and fun!" "$RED"
                display_usage
            fi
            
            if [ -n "$domain_list" ]; then
                domain_list="$(realpath "$domain_list")"
                if [ ! -f "$domain_list" ]; then
                    log "Errore: file della lista dei domini non trovato: $domain_list" "$RED"
                    exit 1
                fi
            fi
            
            if [ -n "$output_dir" ]; then
                mkdir -p "$output_dir" || { log "Errore: impossibile creare la directory di output: $output_dir" "$RED"; exit 1; }
                cd "$output_dir" || { log "Errore: impossibile cambiare directory a: $output_dir" "$RED"; exit 1; }
            fi
            
            run_recon() {
                local current_domain="$1"
                log "Inizio enumerazione per: $current_domain" "$WHITE"
                local domain_output_dir="$current_domain"
                mkdir -p "$domain_output_dir"
                cd "$domain_output_dir" || { log "Errore cambiando directory: $domain_output_dir" "$RED"; exit 1; }
            
                tools=("Assetfinder" "Subfinder" "Sublist3r" "Chaos" "Crtsh" "Crobat" "Findomain" "Knockpy" "Amass")
            
                for tool in "${tools[@]}"; do
                    echo "Esecuzione di $tool per $current_domain..."
                    log "Esecuzione di $tool per $current_domain" "$BLUE"
                    case $tool in
                        "Assetfinder")
                            assetfinder "$current_domain" > assetfinder_Tool.txt 2>/dev/null || true
                            ;;
                        "Subfinder")
                            subfinder -d "$current_domain" > subfinder_Tool.txt 2>/dev/null || true
                            ;;
                        "Sublist3r")
                            sublist3r -d "$current_domain" -o sublist3r_Tool.txt > /dev/null 2>&1 || true
                            ;;
                        "Chaos")
                            chaos -d "$current_domain" -silent -key 3c8d87ff-efad-43a4-ab80-a4a3aa528e73 -o chaos_Tool.txt > /dev/null 2>&1 || true
                            ;;
                        "Crtsh")
                            curl -s "https://crt.sh/?q=%.$current_domain" | sed 's/<[^>]*>//g' | grep -Eo "[a-zA-Z0-9._-]+\.$current_domain" | sed '/^$/d' > crtsh_Tool.txt
                            ;;
                        "Crobat")
                            crobat -s "$current_domain" -o crobat_Tool.txt 2>/dev/null || true
                            ;;
                        "Findomain")
                            findomain -t "$current_domain" -u findomain_Tool.txt > /dev/null 2>&1 || true
                            ;;
                        "Knockpy")
                            knockpy.py -d "$current_domain" > knockpy_Tool.txt 2>/dev/null || true
                            ;;
                        "Amass")
                            amass enum -passive -d "$current_domain" > amass_Tool.txt 2>/dev/null || true
                            ;;
                    esac
                done
            
                cat *_Tool.txt | sort -u > $current_domain-subdomains.txt
                rm *_Tool.txt
                if ls *.json >/dev/null 2>&1; then
                    rm *.json
                    echo "Tutti i file .json sono stati rimossi dalla directory."
                fi
            
                if [ -z "$output_dir" ]; then
                    echo -e "${WHITE}Fatto! Risultati in: $current_domain${RESET}"
                    log "Fatto! Risultati in: $current_domain" "$BLUE"
                else
                    echo -e "${WHITE}Fatto! Risultati in: $output_dir${RESET}"
                    log "Fatto! Risultati in: $output_dir" "$BLUE"
                fi
            
                cd .. || { log "Errore cambiando directory: $output_dir" "$RED"; exit 1; }
            }
            
            if [ -n "$domain" ]; then
                run_recon "$domain"
            fi
            
            if [ -n "$domain_list" ]; then
                while IFS= read -r line; do
                    run_recon "$line"
                done < "$domain_list"
                rm -f *_Tool.txt
                if ls *.json >/dev/null 2>&1; then
                    rm *.json
                    echo "Tutti i file .json sono stati rimossi."
                fi
            fi
            
            current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
            message="Azione per $current_domain completata il $current_datetime"
            
            webhook_url="WEBHOOK_URL"
            response=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "Content-Type: application/json" -d "{\"content\":\"$message\"}" "$webhook_url" 2>/dev/null)
            if [[ $response == "200" || $response == "204" ]]; then
                echo "Notifica inviata a Discord per $current_domain."
            else
                echo "Notifica non inviata, errore $response"
            fi
            
            telegram_token="token"
            chat_id="id"
            telegram_response=$(curl -s -X POST "https://api.telegram.org/bot$telegram_token/sendMessage" -d "chat_id=$chat_id" -d "text=$message")
            if [[ $telegram_response =~ "\"ok\":true" ]]; then
                echo "Notifica Telegram inviata per $current_domain"
            else
                echo "Messaggio non inviato, errore $telegram_response"
            fi

            Requisiti

            install_tools.sh

            #!/bin/bash
            
            command_exists() {
                command -v "$1" &> /dev/null
            }
            
            if command_exists go; then
                go install github.com/tomnomnom/assetfinder@latest
                go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
                go install github.com/projectdiscovery/chaos-client/cmd/chaos@latest
                go install github.com/cgboal/sonarsearch/crobat@latest
            else
                echo "Go non installato. Installare Go prima di procedere."
                exit 1
            fi
            
            if ! command_exists findomain; then
                wget https://github.com/Findomain/Findomain/releases/latest/download/findomain-linux
                chmod +x findomain-linux
                sudo mv findomain-linux /usr/local/bin/findomain
            else
                echo "Findomain già installato."
            fi
            
            if ! command_exists amass; then
                sudo apt-get update
                sudo apt-get install -y amass
            else
                echo "Amass già installato."
            fi

            requirements.txt

            sublist3r
            knockpy
            • Versione aggiornata della cassaforte con aggiunta del modulo ds1307 (per la gestione del tempo) e l'aggiunta del relay.

              Codice:

              #include <Wire.h>
              #include <LiquidCrystal_I2C.h>
              #include <Keypad.h>
              #include <RTClib.h>
              #include <Adafruit_NeoPixel.h>
              #include <EEPROM.h>
              
              #define PIN_RING 11
              #define NUM_PIXELS 16
              
              int state = 0;
              int menuState = 0;
              int limit = 5;
              int limitSave = limit;
              
              LiquidCrystal_I2C lcd(0x27, 16, 2);
              
              const byte ROWS = 4;
              const byte COLS = 4;
              char keys[ROWS][COLS] = {
                {'1', '2',  '3', 'A'},
                {'4', '5',  '6', 'B'},
                {'7', '8',  '9', 'C'},
                {'*', '0',  '#', 'D'}
              };
              byte rowPins[ROWS] = {2, 3, 4, 5};
              byte colPins[COLS] = {6, 7, 8, 9};
              Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
              String inputPIN = "";
              #define DEFAULT_PIN "1234"
              String storedPIN = DEFAULT_PIN;
              
              int menuIndex = 0;
              int menuText = 1;
              
              String newPIN = "";
              bool confirmPIN = false;
              const int EEPROM_ADDRESS = 0;
              
              unsigned long previousMillisLimit = 0;
              const long intervalLimit = 1000;
              
              bool US = true;
              bool MP = true;
              bool MI = true;
              bool LTDP = true;
              bool CLTD = true;
              bool fLockedt = true;
              bool openedState = true;
              bool ST = true;
              
              bool move = false;
              
              RTC_DS1307 rtc;
              
              Adafruit_NeoPixel ring = Adafruit_NeoPixel(NUM_PIXELS, PIN_RING, NEO_GRB + NEO_KHZ800);
              
              #define PIR 13
              
              #define BUZZER A3
              
              #define RELAY 12
              
              #define RED A0
              #define GREEN A1
              #define BLUE A2
              
              void setup() {
                lcd.init();
                lcd.backlight();
                lcd.setCursor(0, 0);
              
                Serial.begin(9600);
              
                if (!rtc.begin()) {
                  lcd.setCursor(0, 1);
                  lcd.print("RTC non trovato");
                  while (1);
                }
                if (!rtc.isrunning()) {
                  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
                }
              
                ring.begin();
                ring.show();
              
                pinMode(PIR, INPUT);
              
                pinMode(BUZZER, OUTPUT);
              
                pinMode(RED, OUTPUT);
                pinMode(GREEN, OUTPUT);
                pinMode(BLUE, OUTPUT);
              
                digitalWrite(RED, HIGH);
              
                intro();
                homeLock();
                state = 1;
              }
              
              void loop() {
                switch (state) {
                  case 1:
                    lockState();
                    break;
                  case 2:
                    unlockState();
                    break;
                  case 3:
                    menuPIN();
                    break;
                  case 4:
                    menuOptions();
                    break;
                  case 5:
                    openState();
                    break;
                  case 6:
                    secureState();
                    break;
                }
              }
              
              void lockState() {
                char key = keypad.getKey();
                if (key) {
                  if (key == '#') {
                    if (storedPIN == inputPIN) {
                      lcd.setCursor(5, 1);
                      tone(BUZZER, 1000, 500);
                      state = 2;
                      US = true;
                      unlockState();
                    } else {
                      lcd.setCursor(5, 1);
                      lcd.print("PIN errato");
                      delay(1000);
                      inputPIN = "";
                      lcd.setCursor(4, 1);
                      lcd.print("          ");
                      lcd.setCursor(5, 1);
                    }
                    inputPIN = "";
                  } else if (key == '*') {
                    inputPIN = "";
                    lcd.setCursor(4, 1);
                    lcd.print("        ");
                  } else {
                    inputPIN += key;
                    lcd.setCursor(5 + inputPIN.length() - 1, 1);
                    lcd.print('*');
                    tone(BUZZER, 500, 100);
                    Serial.println(inputPIN);
                  }
                }
              }
              
              void unlockState() {
                digitalWrite(RED, LOW);
                digitalWrite(GREEN, HIGH);
                if (US == true) {
                  lcd.clear();
                  US = false;
                }
                lcd.noBlink();
                lcd.noCursor();
                showTime();
                showDate(3);
              
                char key = keypad.getKey();
                if (key) {
                  if (key == 'D') {
                    state = 3;
                  } else if (key == '*') {
                    openState();
                    state = 5;
                  }
                }
              }
              
              void intro() {
                Serial.print("1");
                lcd.setCursor(3, 0);
                lcd.print("CodeLock");
                lcd.setCursor(0, 1);
                for (int i = 0; i < 16; i++) {
                  lcd.print("*");
                  delay(80);
                }
              }
              
              void homeLock() {
                lcd.clear();
                lcd.setCursor(2, 0);
                lcd.print("--SECURED--");
                lcd.setCursor(0, 1);
                lcd.print("PIN: ");
                lcd.cursor();
                lcd.blink();
                state = 1;
              }
              
              void showDate(int timeCursor) {
                DateTime now = rtc.now();
                lcd.setCursor(timeCursor, 1);
                lcd.print(now.year());
                lcd.print('/');
                if (now.month() < 10) lcd.print('0');
                lcd.print(now.month());
                lcd.print('/');
                if (now.day() < 10) lcd.print('0');
                lcd.print(now.day());
              }
              
              void showTime() {
                DateTime now = rtc.now();
                lcd.setCursor(4, 0);
                if (now.hour() < 10) lcd.print('0');
                lcd.print(now.hour());
                lcd.print(':');
                if (now.minute() < 10) lcd.print('0');
                lcd.print(now.minute());
                lcd.print(':');
                if (now.second() < 10) lcd.print('0');
                lcd.print(now.second());
              }
              
              void menuPIN() {
                if (MP == true) {
                  digitalWrite(RED, HIGH);
                  digitalWrite(GREEN, LOW);
                  MP = false;
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Menu LOCKED!");
                  lcd.setCursor(0, 1);
                  lcd.print("PIN: ");
                }
                char key = keypad.getKey();
                if (key) {
                  if (key == '#') {
                    if (storedPIN == inputPIN) {
                      lcd.setCursor(5, 1);
                      tone(BUZZER, 1000, 500);
                      state = 4;
                      MP = true;
                      menuOptions();
                    } else {
                      lcd.setCursor(5, 1);
                      lcd.print("PIN errato");
                      delay(1000);
                      inputPIN = "";
                      lcd.setCursor(4, 1);
                      lcd.print("          ");
                      lcd.setCursor(5, 1);
                    }
                    inputPIN = "";
                  } else if (key == '*') {
                    inputPIN = "";
                    lcd.setCursor(4, 1);
                    lcd.print("        ");
                  } else {
                    inputPIN += key;
                    lcd.setCursor(5 + inputPIN.length() - 1, 1);
                    lcd.print('*');
                    tone(BUZZER, 500, 100);
                    Serial.println(inputPIN);
                  }
                }
              }
              
              void menuOptions() {
                char key = keypad.getKey();
              
                digitalWrite(RED, LOW);
                digitalWrite(GREEN, HIGH);
              
                if (key) {
                  if (key == '#') {
                    menuIndex = menuText;
                  }
                }
                switch (menuIndex) {
                  case 1:
                    changeLimit();
                    break;
                  case 2:
                    changePIN();
                    break;
                  case 3:
                    changeDate();
                    break;
                  case 4:
                    changeTime();
                    break;
                }
              
                if (menuText == 1) {
                  if (MI == true) {
                    MI = false;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Cambia limite");
                  }
                  if (key) {
                    if (key == 'A') {
                      menuText = 4;
                      MI = true;
                    } else if (key == 'B') {
                      menuText = 2;
                      MI = true;
                    } else if (key == '#') {
                      menuIndex = 1;
                      CLTD = true;
                    }
                  }
                } else if (menuText == 2) {
                  if (MI == true) {
                    MI = false;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Cambia PIN");
                  }
                  if (key) {
                    if (key == 'A') {
                      menuText = 1;
                      MI = true;
                    } else if (key == 'B') {
                      menuText = 3;
                      MI = true;
                    } else if (key == '#') {
                      CLTD = true;
                      menuIndex = 2;
                    }
                  }
                } else if (menuText == 3) {
                  if (MI == true) {
                    MI = false;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Cambia data");
                  }
                  if (key) {
                    if (key == 'A') {
                      menuText = 2;
                      MI = true;
                    } else if (key == 'B') {
                      menuText = 4;
                      MI = true;
                    } else if (key == '#') {
                      CLTD = true;
                      menuIndex = 3;
                    }
                  }
                } else if (menuText == 4) {
                  if (MI == true) {
                    MI = false;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Cambia ora");
                  }
                  if (key) {
                    if (key == 'A') {
                      menuText = 3;
                      MI = true;
                    } else if (key == 'B') {
                      menuText = 1;
                      MI = true;
                    } else if (key == '#') {
                      CLTD = true;
                      menuIndex = 4;
                    }
                  }
                }
              }
              
              void changeLimit() {
                if (CLTD == true) {
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Vecchio Limite:");
                  lcd.setCursor(5, 1);
                  lcd.print(limit);
                  delay(1000);
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Nuovo limite:");
                  CLTD = false;
                }
                char key = keypad.getKey();
                if (key) {
                  if (key == '*') {
                    limitSave = limit;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Salvato");
                    delay(500);
                    EEPROM.put(EEPROM_ADDRESS, limitSave);
                    lcd.clear();
                    menuIndex = 0;
                  } else if (key == '#') {
                    limit = 0;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Annullato");
                    delay(500);
                    lcd.clear();
                    menuIndex = 0;
                  } else {
                    limit = limit * 10 + (key - '0');
                    lcd.setCursor(5, 1);
                    lcd.print(limit);
                  }
                }
              }
              
              void changePIN() {
                if (CLTD == true) {
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Nuovo PIN:");
                  CLTD = false;
                }
                char key = keypad.getKey();
                if (key) {
                  if (key == '*') {
                    if (confirmPIN) {
                      storedPIN = newPIN;
                      newPIN = "";
                      confirmPIN = false;
                      lcd.clear();
                      lcd.setCursor(0, 1);
                      lcd.print("PIN Salvato");
                      delay(500);
                      lcd.clear();
                      menuIndex = 0;
                    } else {
                      newPIN = "";
                      confirmPIN = true;
                      lcd.setCursor(0, 1);
                      lcd.print("Conferma PIN:");
                    }
                  } else if (key == '#') {
                    newPIN = "";
                    confirmPIN = false;
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Annullato");
                    delay(500);
                    lcd.clear();
                    menuIndex = 0;
                  } else {
                    newPIN += key;
                    lcd.setCursor(newPIN.length() - 1, 1);
                    lcd.print('*');
                  }
                }
              }
              
              void changeDate() {
                DateTime now = rtc.now();
                if (CLTD == true) {
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Vecchia Data:");
                  showDate(5);
                  delay(2000);
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Nuova Data:");
                  CLTD = false;
                }
                static int datePart = 0;
                static int year = now.year();
                static int month = now.month();
                static int day = now.day();
                char key = keypad.getKey();
                if (key) {
                  if (key == '*') {
                    if (datePart == 2) {
                      rtc.adjust(DateTime(year, month, day, now.hour(), now.minute(), now.second()));
                      lcd.setCursor(0, 1);
                      lcd.print("Data Salvata");
                      delay(500);
                      lcd.clear();
                      menuIndex = 0;
                      datePart = 0;
                    } else {
                      datePart++;
                    }
                  } else if (key == '#') {
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Annullato");
                    delay(500);
                    lcd.clear();
                    menuIndex = 0;
                    datePart = 0;
                  } else {
                    int num = key - '0';
                    if (datePart == 0) {
                      year = year * 10 + num;
                      lcd.setCursor(5 + (year > 1000 ? 4 : year > 100 ? 3 : year > 10 ? 2 : 1), 1);
                      lcd.print(year);
                    } else if (datePart == 1) {
                      month = month * 10 + num;
                      lcd.setCursor(7, 1);
                      lcd.print('/');
                      lcd.print(month);
                    } else if (datePart == 2) {
                      day = day * 10 + num;
                      lcd.setCursor(10, 1);
                      lcd.print('/');
                      lcd.print(day);
                    }
                  }
                }
              }
              
              void changeTime() {
                DateTime now = rtc.now();
                if (CLTD == true) {
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Vecchia Ora:");
                  showTime();
                  delay(2000);
                  lcd.clear();
                  lcd.setCursor(0, 0);
                  lcd.print("Nuova Ora:");
                  CLTD = false;
                }
                static int timePart = 0;
                static int hour = now.hour();
                static int minute = now.minute();
                static int second = now.second();
                char key = keypad.getKey();
                if (key) {
                  if (key == '*') {
                    if (timePart == 2) {
                      rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour, minute, second));
                      lcd.setCursor(0, 1);
                      lcd.print("Ora Salvata");
                      delay(500);
                      lcd.clear();
                      menuIndex = 0;
                      timePart = 0;
                    } else {
                      timePart++;
                    }
                  } else if (key == '#') {
                    lcd.clear();
                    lcd.setCursor(0, 1);
                    lcd.print("Annullato");
                    delay(500);
                    lcd.clear();
                    menuIndex = 0;
                    timePart = 0;
                  } else {
                    int num = key - '0';
                    if (timePart == 0) {
                      hour = hour * 10 + num;
                      lcd.setCursor(5, 1);
                      lcd.print(hour);
                    } else if (timePart == 1) {
                      minute = minute * 10 + num;
                      lcd.setCursor(7, 1);
                      lcd.print(':');
                      lcd.print(minute);
                    } else if (timePart == 2) {
                      second = second * 10 + num;
                      lcd.setCursor(10, 1);
                      lcd.print(':');
                      lcd.print(second);
                    }
                  }
                }
              }
              
              void openState() {
                if (openedState == true) {
                  openedState = false;
                  digitalWrite(RELAY, HIGH);
                  lcd.clear();
                  lcd.setCursor(3, 0);
                  lcd.print("--APERTA--");
                  lcd.setCursor(0, 1);
                  lcd.print("Aperto da");
                  showDate(9);
                  delay(2000);
                }
                unsigned long currentMillisLimit = millis();
                if (currentMillisLimit - previousMillisLimit >= intervalLimit) {
                  previousMillisLimit = currentMillisLimit;
                  limit--;
                  lcd.setCursor(12, 1);
                  lcd.print(limit);
                  if (limit <= 0) {
                    limit = limitSave;
                    previousMillisLimit = 0;
                    lcd.clear();
                    lcd.setCursor(0, 0);
                    lcd.print("--CHIUSA--");
                    delay(1000);
                    digitalWrite(RELAY, LOW);
                    homeLock();
                    openedState = true;
                    state = 1;
                  }
                }
                char key = keypad.getKey();
                if (key) {
                  if (key == '*') {
                    limit = limitSave;
                    previousMillisLimit = 0;
                    lcd.clear();
                    lcd.setCursor(0, 0);
                    lcd.print("--CHIUSA--");
                    delay(1000);
                    digitalWrite(RELAY, LOW);
                    homeLock();
                    openedState = true;
                    state = 1;
                  }
                }
              }
              
              void secureState() {
                digitalWrite(RED, HIGH);
                digitalWrite(GREEN, LOW);
                lcd.clear();
                lcd.setCursor(2, 0);
                lcd.print("--CHIUSA--");
                lcd.setCursor(0, 1);
                lcd.print("PIN: ");
                lcd.cursor();
                lcd.blink();
                state = 1;
              }
            • Il Google Dorking è una pratica dove si sfruttano operatori avanzati per una ricerca tramite Google, è possibile quindi creare query di ricerca precise che possono rivelare dati sensibili, file nascosti, directory aperte e altre informazioni che potrebbero non essere facilmente accessibili attraverso ricerche standard (sempre indicizzate ma con ranking basso, altrimenti sarebbe deep web).
              Potenzialmente con Google Dork è possibile trovare pagine web che contengono vulnerabilità di sicurezza, informazioni sensibili o altri tipi di dati che potrebbero non essere stati intenzionalmente esposti appunto perché si pensa che questi link non vengano condivisi e davvero si trova di tutto: telecamere IP, pannelli admin ecc...

              Operatori più usati e molto utili:

              1. intitle:
                Usato per trovare pagine web con le parole specificate nel titolo.
                Esempio: intitle:hacking xss
                Questo operatore è utile per trovare pagine web in cui il titolo contiene una parola o una frase specifica. Utile per ricerche di articoli o post di blog.

              2. allintitle:
                Trova pagine web dove tutte le parole specificate appaiono nel titolo.
                Esempio: allintitle:xss
                Simile a intitle:, ma richiede che tutte le parole specificate siano presenti nel titolo della pagina web.

              3. related:
                Trova pagine web simili al sito web specificato.
                Esempio: related:ethicalhacking.freeflarum.com
                Utile per trovare siti web che trattano argomenti simili a quelli di un sito web specificato.

              4. OR
                Trova pagine web che contengono almeno una delle parole specificate (come suggerisce il nome della porta logica).
                Esempio: xss OR MITM
                Usato per combinare più termini di ricerca dove entrambe le parole possono comparire

              5. AND
                Descrizione: Trova pagine web che contengono tutte le parole specificate.
                Esempio: xss AND MITM
                Mostrerà pagine che contengono entrambe le keywords.

              6. -
                Esclude pagine web contenenti la parola specificata.
                Esempio: hacking -programmazione
                Utile per filtrare i risultati della ricerca escludendo pagine che contengono un termine indesiderato.

              7. ()
                Raggruppa più termini di ricerca per controllare l'ordine delle operazioni.
                Esempio: (xss tutorial)
                Funziona come parentesi in un'espressione matematica raggruppando termini e operatori per specificare l'ordine di elaborazione.

              8. *
                Agisce come un carattere jolly per una o più parole.
                Esempio: * xss hacking
                Permette di inserire un segnaposto per una o più parole sconosciute o variabili.

              9. define:
                Per definizioni della parola specificata.
                Esempio: define:algoritmo
                In questo modo si ottengono definizioni rapide e precise di termini.

              10. filetype:
                Limita i risultati di ricerca a tipi di file specifici.
                Esempio: filetype:pdf xss tutorial
                Consente di cercare file di un certo tipo come PDF, DOC, XLS, ecc... restringendo i risultati solo a quelli rilevanti.

              11. cache:
                Visualizza la versione cache di una pagina web.
                Esempio: cache:ethicalhacking.freeflarum.com
                Mostra una copia salvata da Google di una pagina web utile se il sito originale è temporaneamente non disponibile.

              12. site:
                Limita i risultati di ricerca a pagine di un sito web specifico.
                Esempio: site:ethicalhacking.freeflarum.com intelligenza artificiale
                Utile per cercare informazioni all'interno di un sito specifico bypassando i risultati di altri siti.

              13. inurl:
                Trova pagine web con la parola specificata nell'URL.
                Esempio: inurl:xss
                Ricerca URL che contengono il termine specificato utile per identificare pagine specifiche all'interno di siti web.

              14. allinurl:
                Trova pagine web con tutte le parole specificate nell'URL ma più selettivo.
                Esempio: allinurl:migliori ricette pizza
                Funziona come inurl:, ma richiede che tutte le parole siano presenti nell'URL.

              15. weather:
                Visualizza le informazioni meteo per una località specificata.
                Esempio: weather:Roma
                Restituisce rapidamente previsioni del tempo.

              16. map:
                Mostra risultati di mappe per una località o una query specificata.
                Esempio: map:Milano
                Tramite Google Maps si visualizza mappe dettagliate e indicazioni.

              17. movie:
                Visualizza orari dei film e informazioni.
                Esempio: movie:Avengers Endgame
                Fornisce informazioni sui film inclusi orari degli spettacoli e recensioni.

              18. stocks:
                Mostra informazioni sulle azioni di una specifica azienda.
                Esempio: stocks:Nike
                Visualizza quotazioni e grafici relativi alle azioni di una determinata società.

              19. intext:
                Trova pagine web con le parole specificate nel testo del corpo.
                Esempio: intext:come inizio a programmare?
                Cerca termini all'interno del testo principale delle pagine web piuttosto che nei titoli o URL.

              20. allintext:
                Trova pagine web con tutte le parole specificate nel testo del corpo.
                Esempio: allintext:come hackerare una rete wifi?
                Simile a intext:, ma richiede che tutte le parole specificate siano presenti nel testo del corpo.

              21. source:
                Limita i risultati di ricerca a fonti o domini specifici.
                Esempio: source:gov cambiamento climatico
                Ricerca articoli e contenuti da fonti specifiche come domini governativi (.gov).

              22. in “esempio”
                Trova pagine web che contengono la frase esatta all'interno delle virgolette.
                Esempio: in “guida python”
                Utilizzato per cercare una frase esatta migliorando la precisione dei risultati.

              23. AROUND(X)
                Trova pagine web in cui le parole specificate sono entro una certa prossimità l'una dall'altra.
                Esempio: xss AROUND(3) web hacking
                Utile per ricerche di termini che devono apparire vicini tra loro nel testo.

              24. time:
                Visualizza l'ora attuale per una località specificata.
                Esempio: time:Londra
                Ora corrente in diverse località del mondo.

              25. to:
                Mostra risultati di ricerca all'interno di un intervallo specifico di numeri.
                Esempio: smartphone to:2020
                Utile per ricerche che richiedono un intervallo numerico come date o misurazioni.

              26. translate:
                Traduce la parola o la frase specificata in un'altra lingua.
                Esempio: translate:ciao to Spanish
                Sfrutta Google Translate per le traduzioni.

              27. connected
                Trova pagine web correlate all'argomento specificato.
                Esempio: connected:intelligenza artificiale
                Simile a related:, ma focalizzato su concetti o argomenti correlati.

              28. Site:[demo.com] -inurl:https
                Limita i risultati di ricerca a un sito web specifico ma esclude URL contenenti “https”.
                Esempio: Site:google.com -inurl:https
                Utile per trovare pagine HTTP su un sito che utilizza sia HTTP che HTTPS.

              29. [anno1]..[anno2]
                Limita i risultati di ricerca a un intervallo specifico di anni.
                Esempio: 2000..2010
                Rende facile cercare contenuti prodotti o pubblicati tra anni specifici.

            Powered by: FreeFlarum.
            (remove this footer)