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
- 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.
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 🔝Prova ad analizzare il file vedi che modem è
Se è tplink puoi provare bruteforce a 8 numeri a volte può indovinarla se sono numerici- Modificato
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 percorsozip_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, conpassword.strip()
vengono rimossi spazi inutili eextract_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?
- Modificato
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!
- Modificato
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- Modificato
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:
- bzimage (in base al vostro southbridge)
- initramfs da PSXita
- distro di psxitarch V3
- FileZilla per la connessione FTP
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!
- Modificato
Qui : https://next.thenextweb.com/news/nato-backed-project-protect-subsea-internet-diverting-to-space trovate il comunicato in lingua inglese.
- Modificato
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 comeclear_screen
,sigint_handler
.
hasher
crea un hash MD5 della password per utilizzarlo come chiave AES.
encrypt
edecrypt
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 richiamandochat_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
registrasigint_handler
come gestore per SIGINT.
hasher
crea 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.
decrypt
decripta 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
- Modificato
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).
- Modificato
Oggi vedremo uno script bash che ci permette di analizzare i sottodomini di un webserver tramite diverse utility:
- Assetfinder
- Subfinder
- Sublist3r
- Chaos da ProjectDiscovery tramite API.
- Crt.sh
- Crobat (Sonar)
- Findomain
- Knockpy
- Amass
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 funzionerun_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:
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.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.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.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 comparireAND
Descrizione: Trova pagine web che contengono tutte le parole specificate.
Esempio: xss AND MITM
Mostrerà pagine che contengono entrambe le keywords.-
Esclude pagine web contenenti la parola specificata.
Esempio: hacking -programmazione
Utile per filtrare i risultati della ricerca escludendo pagine che contengono un termine indesiderato.()
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.*
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.define:
Per definizioni della parola specificata.
Esempio: define:algoritmo
In questo modo si ottengono definizioni rapide e precise di termini.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.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.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.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.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.weather:
Visualizza le informazioni meteo per una località specificata.
Esempio: weather:Roma
Restituisce rapidamente previsioni del tempo.map:
Mostra risultati di mappe per una località o una query specificata.
Esempio: map:Milano
Tramite Google Maps si visualizza mappe dettagliate e indicazioni.movie:
Visualizza orari dei film e informazioni.
Esempio: movie:Avengers Endgame
Fornisce informazioni sui film inclusi orari degli spettacoli e recensioni.stocks:
Mostra informazioni sulle azioni di una specifica azienda.
Esempio: stocks:Nike
Visualizza quotazioni e grafici relativi alle azioni di una determinata società.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.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.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).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.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.time:
Visualizza l'ora attuale per una località specificata.
Esempio: time:Londra
Ora corrente in diverse località del mondo.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.translate:
Traduce la parola o la frase specificata in un'altra lingua.
Esempio: translate:ciao to Spanish
Sfrutta Google Translate per le traduzioni.connected
Trova pagine web correlate all'argomento specificato.
Esempio: connected:intelligenza artificiale
Simile a related:, ma focalizzato su concetti o argomenti correlati.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.[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.