Anonsurf su Debian 10

Anonsurf su Debian 10

Anonsurf su Debian 10

Anonsurf è la modalità anonima di ParrotOS per forzare le connessioni attraverso Tor e/o la rete i2p.  Tor è un protocollo di crittografia SOCKS4 e SOCKS5. Tor esegue il tunnelling di tutto il traffico che circola nella rete dell’utente in modo anonimo. Tor nasconde la posizione di un utente e i dati di rete da chiunque monitora l’utente localmente e in remoto. L’utilizzo di Anonsurf si può avviare anche da terminale, ed oltre ad essere integrato in ParrotOS ed in Kali Linux, si può installare in Debian 9 Stretch o Debian 10 Buster.

$ sudo apt install git
$ git clone https://github.com/ParrotSec/anonsurf
$ cd anonsurf/
$ chmod a+x ./anonsurf.sh
$ sudo ./anonsurf.sh start

Anonsurf su Debian 10i comandi sono i seguenti:

anonsur start - Start system-wide TOR tunnel
anonsurf stop - Stop anonsurf and return to clearnet
anonsurf restart - Combines "stop" and "start" options
anonsurf changeid - Restart TOR to change identity
anonsurf status - Check if AnonSurf is working properly
anonsurf myip - Check your ip and verify your tor connection
anonsurf mymac - Check your mac and verify your change mac address

enjoy 😉

Asterisk 16 Freepbx 15 su Raspbian-Debian Stretch

Asterisk 16 Freepbx 15 e Raspbian-Debian Stretch

 

Installazione su Raspberri py 3 con OS Raspbian Stretch Lite, di Asterisk 16 e Freepbx 15. Guida testata e funzionante, sia su Raspberry che su Pc con os Debian Stretch. La novità rispetto al passato è che freepbx 15 supporta php 7. I miei test li ho fatti senza hardware pstn. I passaggi successivi saranno eseguiti come utente root e su una nuova installazione di Raspbian Stretch, su Raspberry py 3.

Aggiornare il sistema
# apt update; apt upgrade

se viene installato un nuovo kernel riavviare.

Scaricare le dipendenze ed i servizi necessari
$ sudo su
# apt install -y wget mysql-server mysql-client bison flex php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysql php-gettext php-bcmath php-zip php-xml php-imap php-json php-snmp php-fpm libapache2-mod-php git curl libnewt-dev libssl-dev libncurses5-dev subversion libsqlite3-dev build-essential libjansson-dev libxml2-dev uuid-dev dh-make libssl-dev sox
Installare nodejs
# curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# apt install -y nodejs
Reboot server
# reboot
Scaricare Asterisk 16 e FreePBX 15
# cd /usr/src
# wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
# wget https://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz
Installare Asterisk 16
# cd /usr/src
# tar xvfz asterisk-16-current.tar.gz
# cd asterisk-16.*
# contrib/scripts/get_mp3_source.sh
# ./contrib/scripts/install_prereq install
# ./configure --with-jansson-bundled
# make menuselect

inserire il prefisso internazionale, nel nostro caso 39:

Asterisk 14 Freepbx 14 su Debian Stretch 9.1e poi abilitare  format_mp3:

Installare Asterisk 13 con Freepbx 12 su Raspberry pi 2 e Debian Jessie

# make -j4
# make install
# make samples
# make config
# ldconfig
Creazione utente Asterisk e permessi
# groupadd asterisk
# useradd -r -d /var/lib/asterisk -g asterisk asterisk
# usermod -aG audio,dialout asterisk
# chown -R asterisk.asterisk /etc/asterisk
# chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
# chown -R asterisk.asterisk /usr/lib/asterisk
# sed -i 's/#AST_USER="asterisk"/AST_USER="asterisk"/g' /etc/default/asterisk
# sed -i 's/#AST_GROUP="asterisk"/AST_GROUP="asterisk"/g' /etc/default/asterisk
# systemctl restart asterisk
# systemctl enable asterisk

verificare che asterisk funzioni correttamente:

# asterisk -rvvv

output:

root@raspytest:/home/pi# asterisk -rvv
Asterisk 16.1.1, Copyright (C) 1999 - 2018, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 16.1.1 currently running on raspytest (pid = 660)
raspytest*CLI>
Configurazione Apache2
# cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig
# sed  -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
# sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf
# mv /var/www/html /var/www/html.bak
# a2enmod rewrite
# systemctl restart apache2
Installare FreePBX 15
# cd /usr/src/
# tar xvfz freepbx-15.0-latest.tgz
# cd freepbx
# ./start_asterisk start
# ./install -n
# fwconsole chown
# fwconsole reload
# fwconsole restart

se tutto è andato bene il server Asterisk è raggiungibile all’indirizzo http://ip_raspberry. La prima cosa da fare è quella di scegliere nome utente, password e mail, per accedere al pannello di amministrazione. Andare poi nel menu Admin-Module Admin e scaricare ed aggiornare tutti i moduli.

enjoy 😉

Raspberry con Owncloud Letsencrypt Apache

Raspberry con Owncloud Letsencrypt Apache
Raspberry con Owncloud Letsencrypt Apache

L’obiettivo di questa guida è quello di realizzare un proprio server owncloud, e nello specifico io utilizzerò un raspberry pi 3 , ma in alternativa si potrà utilizzare un’altro modello di single board o Pc, con OS Debian based. Avevo gia fatto una guida precedentemente, ma in quell’occasione avevo utilizzato un certificato auto firmato, che chiaramente i browser vedono come non sicuro. In questo caso invece utilizzerò Let’s Encrypt che fornisce certificati SSL gratuiti tramite un processo completamente automatizzato, progettato per eliminare la creazione manuale di certificati, per la convalida, l’installazione e il rinnovo. I certificati rilasciati da Let’s Encrypt sono validi per 90 giorni dalla data di emissione e sono oggi considerati affidabili da tutti i principali browser.

Prerequisiti ed info

  • Negli esempi sotto utilizzerò come nome di dominio example.com ed i comandi verranno eseguiti da root
  • Il raspberry dovrà avere quindi come dominio l’equivalente di example.com. Questo può essere modificato in /etc/hostname e poi riavviare.
  • Il vostro ip pubblico dovrà puntare quindi al dominio, nel caso non si avesse un ip pubblico, utilizzare un servizio di DNS.
  • Assicurarsi prima di aprire le porte 80/443 verso il proprio server, altrimenti non si potranno ottenere i certificati. Successivamente rimarrà aperta solo la 443.
  • La guida è stata testata su una installazione pulita di Raspbian Stretch
Raspberry con Owncloud Letsencrypt Apache

Step 1) Installare i pacchetti necessari:

$ sudo su
# apt update; apt upgrade
# apt install apache2 mariadb-server libapache2-mod-php7.0 php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt php-imagick php7.0-zip php7.0-xml php7.0-mbstring ntfs-3g fail2ban certbot

Step 2) Configurazione Apache e Virtual Host basic

# rm -rf /var/www/html/
# mkdir -p /var/www/example.com/public_html
# nano /var/www/example.com/public_html/index.html

ed incollare dentro:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Welcome to example.com</title>
</head>
<body>
<h1>Success! example.com home page!</h1>
</body>
</html
# nano /etc/apache2/sites-available/example.com.conf

ed incollare dentro:

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html

<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>

ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

poi:

# chown -R www-data: /var/www/example.com/
# mv /etc/apache2/sites-available/000-default.conf 000-default.conf.bak
# mv /etc/apache2/sites-enabled/000-default.conf 000-default.conf.bak
# a2ensite example.com
# systemctl restart apache2
# systemctl enable apache2

a questo punto collegandosi al server dovremmo vedere che funziona: Raspberry con Owncloud Letsencrypt ApacheStep 3) Chiave e Letsencrypt Creare una chiave robusta Dh (Diffie-Hellman) a 2048 bit, ci vorrà circa 20 minuti.

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Per ottenere i certificati utilizzeremo certbot, installato precedentemente, che si occuperà dell’acquisizione e del rinnovo degli stessi. Utilizzeremo il plug-in Webroot che funziona creando un file temporaneo nella ${webroot-path}/.well-known/acme-challenge a cui si collegherà Letsencrypt per risolvere il DNS:

# mkdir -p /var/lib/letsencrypt/.well-known
# chgrp www-data /var/lib/letsencrypt
# chmod g+s /var/lib/letsencrypt

creare primo file di configurazione:

# nano /etc/apache2/conf-available/letsencrypt.conf

ed incollare dentro:

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>

creare secondo file raccomandato:

# nano /etc/apache2/conf-available/ssl-params.conf

ed incollare dentro:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

abilitare moduli e files di configurazione:

# a2enmod ssl
# a2enmod headers
# a2enmod http2
# a2enconf letsencrypt
# a2enconf ssl-params
# systemctl reload apache2

a questo punto siamo pronti ad ottenere i certificati SSL utilizzando certbot:

# certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

se tutto è andato bene visualizzeremo questo:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem.
Your cert will expire on 2019-02-28. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you lose your account credentials, you can recover through
e-mails sent to xxxxxxx@gmail.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

adesso andiamo a riconfigurare il file Virtual Host come sotto:

# nano /etc/apache2/sites-available/example.com.conf
ed incollare dentro:
 
<VirtualHost *:80> 
ServerName example.com
ServerAlias www.example.com

Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com

Protocols h2 http:/1.1

<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent / https://example.com/
</If>

DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem


</VirtualHost>
ricaricare la nuova configurazione:
 
# systemctl reload apache2
adesso si può fare un TEST SSL

Rinnovo automatico dei certificati: Come dicevo all’inizio, i certificati di Let’s Encrypt hanno una durata di 90 giorni, dopodichè bisognerà rinnovarli. Per automatizzare il rinnovo utilizzare un cronjob:
# nano /etc/cron.d/certbot
ed incollare dentro:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload apache2"
Rinnovo manuale:
# certbot renew --dry-run
Raspberry con Owncloud Letsencrypt Apache
Step 4) Installazione Owncloud
# cd /tmp
# wget https://download.owncloud.org/community/owncloud-10.0.10.tar.bz2
# tar -xvf owncloud-10.0.10.tar.bz2
# chown -R www-data:www-data owncloud
# mv owncloud /var/www/example.com/public_html/
# rm /var/www/example.com/public_html/index.html
# nano /etc/apache2/sites-available/example.com.conf
e fare puntare la DocumentRoot ad owncloud:
DocumentRoot /var/www/example.com/public_html/owncloud
Creazione database ed user mysql:
# mysql -u root -p
inserire password di root, e poi i 5 comandi sotto, e settare la password per l’utente owncloud
 
1) create database owncloud;
2) create user owncloud@localhost identified by ‘password‘;
3) grant all privileges on owncloud.* to owncloud@localhost identified by ‘password‘;
4) flush privileges;
5) exit;
 
fare una modifica al file php.ini, nella sezione File Uploads, portando upload_max_filesize = 5000M.
# nano /etc/php/7.0/apache2/php.ini
come ultimo ritocco, aumentare la capacità di upload, andando a modificare il file .user.ini
# nano /var/www/example.com/public_html/owncloud/.user.ini
portando: upload_max_filesize, e post_max_size a 5000M
# systemctl restart apache2
a questo punto il server owncloud è installato, mancano solo un paio di ritocchi per evitare alcuni alert in owncloud:
# nano /etc/apache2/sites-available/example.com.conf
ed incollare dentro:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomain$
</IfModule>
# nano /etc/apache2/conf-available/ssl-params.conf
e commentare tutti gli Header:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomai$
#Header always set X-Frame-Options DENY
#Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
# systemctl restart apache2
Owncloud è installato ed è raggiungibile all’indirizzo https://example.com. Se si volesse utilizzare come storage un disco esterno, la guida continua: Step 5) Creazione della cartella di storage e relativi permessi:
# mkdir /media/owncloud-usb
# groupadd www-data
# usermod -a -G www-data www-data
# chown -R www-data:www-data /media/owncloud-usb
# chmod -R 775 /media/owncloud-usb
adesso abbiamo bisogno di conoscere UUID del disco usb ed user e group di www-data, che serviranno per configurare /etc/fstab per il montaggio automatico:
# id -u www-data; id -g www-data
# blkid
# nano /etc/fstab
ed aggiungere in una sola riga qualcosa del genere in /etc/fstab:
UUID=32E49E5027A4F8A7 /media/owncloud-usb auto nofail,uid=33,gid=33,umask=0027$,dmask=0027,noatime 0 0
# reboot
Se tutto è andato bene andare all’indirizzo https://ip_dominio_del_server ed apparirà la pagina iniziale, dove si dovrà inserire nome utente e password per l’accesso al server owncloud, nome del database, user e password dell’utente owncloud, ed infine il punto di mount. Username: owncloud Password: password Database: owncloud Server: localhost Raspberry con Owncloud Letsencrypt Apache
Raspberry con Owncloud Letsencrypt Apache
enjoy 😉  

D-Link 5020L e ZoneMinder

 D-Link 5020L e ZoneMinder

D-Link 5020L e ZoneMinder. Guida su come configurare ZoneMinder con telecamere D.Link 5020L Nel wiki di ZoneMinder si trovano i riferimenti a tutte le telecamere supportate, comprese queste, ma in questa guida ci saranno immagini per tutti i passaggi. I parametri da inserire quando si aggiunge la telecamera sono i seguenti:

Source Type: Remote
Remote Protocol: HTTP
Remote Method: Simple
Remote Host Name: user:pass@IP-Camera
Remote Host Port: 80 (Default)
Remote Host Path: /video.cgi
Colors: 24 bit
Capture width: 640
Capture Height: 480

D-Link 5020L e ZoneMinderD-Link 5020L e ZoneMinder

 

PTZ Settings:

esiste uno script nel wiki che serve a far funzionare il tutto:

# =========================================================================r
#
# ZoneMinder D-Link DCS-5020L IP Control Protocol Module, $Date: $, $Revision: $
# Copyright (C) 2013 Art Scheel
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the D-Link DCS-5020L IP camera control
# protocol. 
#
package ZoneMinder::Control::DCS5020L;

use 5.006;
use strict;
use warnings;

require ZoneMinder::Base;
require ZoneMinder::Control;

our @ISA = qw(ZoneMinder::Control);

our $VERSION = $ZoneMinder::Base::VERSION;

# ==========================================================================
#
# D-Link DCS-5020L Control Protocol
#
# ==========================================================================

use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);

use Time::HiRes qw( usleep );

sub new
{
    my $class = shift;
    my $id = shift;
    my $self = ZoneMinder::Control->new( $id );
    bless( $self, $class );
    srand( time() );
    return $self;
}

our $AUTOLOAD;

sub AUTOLOAD
{
    my $self = shift;
    my $class = ref($self) || croak( "$self not object" );
    my $name = $AUTOLOAD;
    $name =~ s/.*://;
    if ( exists($self->{$name}) )
    {
        return( $self->{$name} );
    }
    Fatal( "Can't access $name member of object of class $class" );
}

sub open
{
    my $self = shift;

    $self->loadMonitor();

    use LWP::UserAgent;
    $self->{ua} = LWP::UserAgent->new;
    $self->{ua}->agent( "ZoneMinder Control Agent/" . ZoneMinder::Base::ZM_VERSION );
    $self->{state} = 'open';
}

sub close
{
    my $self = shift;
    $self->{state} = 'closed';
}

sub printMsg
{
    my $self = shift;
    my $msg = shift;
    my $msg_len = length($msg);

    Debug( $msg."[".$msg_len."]" );
}

sub sendCmd
{
    my $self = shift;
    my $cmd = shift;

    my $result = undef;

    printMsg( $cmd, "Tx" );

    my $req = HTTP::Request->new( POST=>"http://".$self->{Monitor}->{ControlAddress}."/PANTILTCONTROL.CGI" );
    $req->content($cmd);
    my $res = $self->{ua}->request($req);

    if ( $res->is_success )
    {
        $result = !undef;
    }
    else
    {
        Error( "Error check failed: '".$res->status_line()."'" );
    }

    return( $result );
}

sub sendCmd2
{
    my $self = shift;
    my $cmd = shift;
    my $result = undef;
    printMsg( $cmd, "Tx" );

    my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );

    my $res = $self->{ua}->request($req);

    if ($res->is_success )
    {
        $result = !undef;
    }
    else
    {
        Error( "Error check failed:'".$res->status_line()."'" );
    }

    return( $result );
}

sub move
{
    my $self = shift;
    my $dir = shift;
    my $panSteps = shift;
    my $tiltSteps = shift;

    my $cmd = "PanSingleMoveDegree=$panSteps&TiltSingleMoveDegree=$tiltSteps&PanTiltSingleMove=$dir";
    $self->sendCmd( $cmd );
}

sub moveRelUpLeft
{
    my $self = shift;
    Debug( "Move Up Left" );
    $self->move( 0, 1, 1 );
}

sub moveRelUp
{
    my $self = shift;
    Debug( "Move Up" );
    $self->move( 1, 1, 1 );
}

sub moveRelUpRight
{
    my $self = shift;
    Debug( "Move Up" );
    $self->move( 2, 1, 1 );
}

sub moveRelLeft
{
    my $self = shift;
    Debug( "Move Left" );
    $self->move( 3, 1, 1 );
}

sub moveRelRight
{
    my $self = shift;
    Debug( "Move Right" );
    $self->move( 5, 1, 1 );
}

sub moveRelDownLeft
{
    my $self = shift;
    Debug( "Move Down" );
    $self->move( 6, 1, 1 );
}

sub moveRelDown
{
    my $self = shift;
    Debug( "Move Down" );
    $self->move( 7, 1, 1 );
}

sub moveRelDownRight
{
    my $self = shift;
    Debug( "Move Down" );
    $self->move( 8, 1, 1 );
}

# moves the camera to center on the point that the user clicked on in the video image. 
# This isn't extremely accurate but good enough for most purposes 
sub moveMap
{
    # if the camera moves too much or too little, try increasing or decreasing this value
    my $f = 11;

    my $self = shift;
    my $params = shift;
    my $xcoord = $self->getParam( $params, 'xcoord' );
    my $ycoord = $self->getParam( $params, 'ycoord' );

    my $hor = $xcoord * 100 / $self->{Monitor}->{Width};
    my $ver = $ycoord * 100 / $self->{Monitor}->{Height};
   
    my $direction;
    my $horSteps;
    my $verSteps;
    if ($hor < 50 && $ver < 50) {
        # up left
        $horSteps = (50 - $hor) / $f;
        $verSteps = (50 - $ver) / $f;
        $direction = 0;
    } elsif ($hor >= 50 && $ver < 50) {
        # up right
        $horSteps = ($hor - 50) / $f;
        $verSteps = (50 - $ver) / $f;
        $direction = 2;
    } elsif ($hor < 50 && $ver >= 50) {
        # down left
        $horSteps = (50 - $hor) / $f;
        $verSteps = ($ver - 50) / $f;
        $direction = 6;
    } elsif ($hor >= 50 && $ver >= 50) {
        # down right
        $horSteps = ($hor - 50) / $f;
        $verSteps = ($ver - 50) / $f;
        $direction = 8;
    }
    my $v = int($verSteps + .5);
    my $h = int($horSteps + .5);
    Debug( "Move Map to $xcoord,$ycoord, hor=$h, ver=$v with direction $direction" );
    $self->move( $direction, $h, $v );
}

# this clear function works, but should probably be disabled because 
# it isn't possible to set presets yet. 
sub presetClear
{
    my $self = shift;
    my $params = shift;
    my $preset = $self->getParam( $params, 'preset' );
    Debug( "Clear Preset $preset" );
    my $cmd = "ClearPosition=$preset";
    $self->sendCmd( $cmd );
}

# not working yet
sub presetSet
{
    my $self = shift;
    my $params = shift;
    my $preset = $self->getParam( $params, 'preset' );
    Debug( "Set Preset $preset" );
    # TODO need to first get current position $horPos and $verPos
    #my $cmd = "PanTiltHorizontal=$horPos&PanTiltVertical=$verPos&SetName=$preset&SetPosition=$preset";
    #$self->sendCmd( $cmd );
}

sub presetGoto
{
    my $self = shift;
    my $params = shift;
    my $preset = $self->getParam( $params, 'preset' );
    Debug( "Goto Preset $preset" );
    my $cmd = "PanTiltPresetPositionMove=$preset";
    $self->sendCmd( $cmd );
}

sub presetHome
{
    my $self = shift;
    Debug( "Home Preset" );
    my $cmd = "PanTiltSingleMove=4";
    $self->sendCmd( $cmd );
}


#  IR Controls
#
#  wake = IR on
#  sleep = IR off
#  reset = IR auto


sub wake
{
    my $self = shift;
    Debug( "Wake - IR on" );
    my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=3&ConfigDayNightMode=Save";
    $self->sendCmd2( $cmd );
}

sub sleep
{
    my $self = shift;
    Debug( "Sleep - IR off" );
    my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=2&ConfigDayNightMode=Save";
    $self->sendCmd2( $cmd );
}

sub reset
{
    my $self = shift;
    Debug( "Reset - IR auto" );
    my $cmd = "setDaynightMode?ReplySuccessPage=night.htm&ReplyErrorPage=errrnight.htm&DayNightMode=0&ConfigDayNightMode=Save";
    $self->sendCmd2( $cmd );
}

1;
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

ZoneMinder::Database - Perl extension for DCS-5020L

=head1 SYNOPSIS

  use ZoneMinder::Database;
  DLINK DCS-5020L

=head1 DESCRIPTION

ZoneMinder driver for the D-Link consumer camera DCS-5020L.

=head2 EXPORT

None by default.



=head1 SEE ALSO

See if there are better instructions for the DCS-5020L at
http://www.zoneminder.com/wiki/index.php/Dlink

=head1 AUTHOR

Art Scheel <lt>ascheel (at) gmail<gt>

=head1 COPYRIGHT AND LICENSE

LGPLv3

=cut

e va copiato nel PATH: /usr/share/perl5/ZoneMinder/Control. Dopodichè andare nel menu Control-Edit-Add New Control:

DLink 5020L e ZoneMinder

ed inserire i parametri  seguenti:

Main: Type: Remote, Protocol: DCS5020L, Name: DCS5020L, Can Wake, Can Sleep, Can Reset
Move: Can Move, Can Move Diagonally, Can Move Mapped, Can Move Relative
Pan: Can Pan, Min Pan Step 1, Max Pan Step 30
Tilt: Can Tilt, Min Tilt Step 1, Max Pan Step 30
Presets: Has Presets, Number: 24, Has Home Preset

Nel Tab Control inserire:

Controllable, Control Type: DCS5020L, Control address: user:pass@ipaddress

D-Link 5020L e ZoneMinder

D-Link 5020L e ZoneMinder

adesso tutto è pronto per la video sorveglianza.

enjoy 😉

 

Analizzare routers e devices IoT con RouterSploit

Analizzare routers e devices IoT con RouterSploitAnalizzare routers e devices IoT con RouterSploit

RouterSploit è uno script in python che serve ad analizzare devices IoT e routers per scoprire eventualmente exploit noti, e quindi mettere il tutto in sicurezza. Può essere anche usato per analizzare dispositivi embedded, stampanti, telecamere. Per installarlo su Debian Stretch/Buster basta seguire questi semplici passi:

sudo apt install python3-pip git
git clone https://www.github.com/threat9/routersploit
cd routersploit/
sudo pip3 install -r requirements.txt

Avviare RouterSploit:

cd routersploit/
sudo python3 rsf.py
use scanners/autopwn
set target 192.168.1.1

i comandi sopra avvieranno RouterSploit che analizzerà l’ip del router, successivamente cambiare target per gli altri devices.

Analizzare routers e devices IoT con RouterSploit

enjoy 😉

Aggiornare Owncloud alla versione 10.0.10 su Debian

Aggiornare Owncloud alla versione 10.0.10 su Debian
Aggiornare Owncloud alla versione 10.0.10 su Debian

Guida su come aggiornare Owncloud dalla versione 10.0.9 alla 10.0.10. Il miglior modo per effettuare l’aggiornamento è quello manuale. Il metodo che userò io è un pò “sporco”, ma secondo me risulta semplice veloce ed efficace. Aggiornare Owncloud alla versione 10.0.10 su Debian

Enable Maintenance Mode

cd /var/www/owncloud/
sudo -u www-data php occ maintenance:mode --on

Stop dei servizi essenziali

sudo service apache2 stop
sudo service cron stop

Download nuova versione

cd /opt/
sudo wget https://download.owncloud.org/community/owncloud-10.0.10.tar.bz2

Nel mio caso tenendo i miei DATI al di fuori della cartella Owncloud, procedo direttamente all’aggiornamento, sostituendo la cartella:

sudo tar xjvf owncloud-10.0.10.tar.bz2  -C /var/www/

Nel caso i DATI si trovassero all’interno della cartella Owncloud, allora bisognerà copiare il vecchio file di configurazione:

cd /opt/
sudo tar xjvf owncloud-10.0.10.tar.bz2
sudo cp /var/www/owncloud/config/config.php owncloud/config/config.php
sudo cp -R owncloud/ /var/www/

Aggiornamento

sudo -u www-data php /var/www/owncloud/occ upgrade

Attivazione servizi

sudo service cron start
sudo service apache2 start

Disable Maintenance Mode

cd /var/www/owncloud/
sudo -u www-data php occ maintenance:mode --off

enjoy 😉

Zoneminder su Raspberry pi 3 B+ Raspbian Stretch

Zoneminder su Raspberry pi 3 B+ Raspbian Stretch

Zoneminder su Raspberry pi 3 B+ Raspbian Stretch

Con l’arrivo del nuovo Raspberry pi 3 B+ nella mia collezione, ho deciso di dedicarlo alla video sorveglianza installando Zoneminder. Per avere delle ottime performance, è necessrio avere una sd card performante, io ho optato per una SanDisk Extreme PRO 64GB, MicroSDXC Classe 10. Si può anche utilizzare un ssd esterno come capiente storage. Tutti i comandi sotto saranno eseguiti come root:

# apt update; apt upgrade -y
# apt install -y build-essential openssh-server apache2 mysql-server mysql-client bison flex php php7.0-curl php7.0-cli php7.0-mysql php-pear php7.0-gd curl sox libncurses5-dev libssl-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev libasound2-dev libogg-dev libapache2-mod-php7.0 sendmail ffmpeg vlc vlc-data zoneminder
# rm -rf /etc/mysql/my.cnf
# cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/my.cnf
# nano /etc/mysql/my.cnf

ed aggiungere:

sql_mode = NO_ENGINE_SUBSTITUTION

come sotto:

# * Basic Settings
#
user            = mysql
sql_mode = NO_ENGINE_SUBSTITUTION
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
# systemctl restart mysql

mettere in sicurezza mysql

# mysql_secure_installation
# service mariadb restart
# systemctl status mariadb.service

Creazione del database:

# mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
# mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
# mysqladmin -uroot -p reload
# chmod 740 /etc/zm/zm.conf
# chown root:www-data /etc/zm/zm.conf
# adduser www-data video
# a2enmod cgi
# a2enconf zoneminder
# a2enmod rewrite
# systemctl restart apache2
# chown -R www-data:www-data /usr/share/zoneminder/
# systemctl enable zoneminder
# service zoneminder start

per evitare errori modificare il file php.ini aggiungendo Europe/Rome nella sezione Module Settings:

# nano /etc/php/7.0/apache2/php.ini

date.timezone = Europe/Rome

# systemctl restart apache2

a questo punto zoneminder sarà raggiungibile all’indirizzo http://ip_seerver/zm

Per utilizzare un ssd esterno come storage, bisogna configurare /etc/fstab per il montaggio automatico:

# systemctl stop zoneminder
# mkdir -p /ssd/zoneminder/events/
# rm -rf /var/cache/zoneminder/events/
# nano /etc/fstab

ed aggiungere qualcosa del genere:

/dev/sdX1 /ssd ext4 defaults 0 2
/ssd/zoneminder/images /var/cache/zoneminder/images none defaults,bind  0 2
/ssd/zoneminder/events /var/cache/zoneminder/events none defaults,bind 0 2

per poter scrivere sul nuovo storage:

# chown -R www-data:www-data /ssd/zoneminder/
# reboot

Zoneminder su Raspberry pi 3 B+ Raspbian Stretch

al riavvio tutto dovrebbe funzionare, e si potrà procedere alla configurazione di Zoneminder

enjoy 😉

Configurazione Trunk PJSIP Messagenet Freepbx 14

 

Configurazione Trunk PJSIP Messagenet e Freepbx 14

Configurazione Trunk PJSIP Messagenet Freepbx 14

Ho deciso di aggiornare il mio centralino, passando da Raspbian Jessie a Raspbian Stretch, e quindi a Freepbx 14, e di passare da chan_sip a chan_pjsip, sia per quanto riguarda i Trunk che per l'estensioni. Per quanto riguarda la creazione del trunk pjsip con Messagenet, ho notato che è meno intuitivo rispetto al chan_sip di una mia vecchia guida, Ad ogni modo condividerò di seguito gli screenshots di una configurazione di un trunk Messagenet funzionante:

I parametri dell'esempio saranno:

Sip server: sip.messagenet.it
Porta: UDP 5061
Username Messagenet:5XXXXXXXXX
Password Messagenet: NXXXXXX
Numero geografico: 02XXXXXXXX

General:

Configurazione Trunk PJSIP Messagenet Freepbx 14

match pattern:

Configurazione Trunk PJSIP Messagenet  Freepbx 14

pjsip setting general:

Configurazione Trunk PJSIP Messagenet Freepbx 14

pgsip setting advanced:

Configurazione Trunk PJSIP Messagenet Freepbx 14

pjsip setting advanced 2:

Configurazione Trunk PJSIP Messagenet Freepbx 14

queste configurazioni vanno a modificare i files:

pjsip.registration.conf:

[Messagenet02]
type=registration
transport=0.0.0.0-udp
outbound_auth=Messagenet02
retry_interval=60
max_retries=10
expiration=3600
line=yes
endpoint=Messagenet02
auth_rejection_permanent=yes
contact_user=02XXXXXXX
server_uri=sip:sip.messagenet.it:5061
client_uri=sip:54XXXXXXXX@sip.messagenet.it:5061


pjsip.endpoint.conf:

[Messagenet02]
type=endpoint
transport=0.0.0.0-udp
context=from-pstn
disallow=all
allow=ulaw,alaw
aors=sip:sip.messagenet.it:5061
language=it
outbound_auth=Messagenet02
from_domain=sip.messagenet.it
from_user=54XXXXXXXX
t38_udptl=no
t38_udptl_ec=none
fax_detect=no
trust_id_inbound=no
t38_udptl_nat=no
direct_media=no
rewrite_contact=yes
rtp_symmetric=yes
message_context=incoming
dtmf_mode=auto


pjsip.auth.conf:

[Messagenet02]
type=auth
auth_type=userpass
password=NXXXXXXXXX
username=54XXXXXXXX

pjsip.aor.conf:

[Messagenet02]
type=aor
qualify_frequency=60
contact=sip:54XXXXXXXX@sip.messagenet.it:5061


pjsip.identify.conf:

[Messagenet02]
type=identify
endpoint=Messagenet02
match=sip.messagenet.it

Configurazione Trunk PJSIP Messagenet Freepbx 14

a questo punto con un Trunk PJSIP funzionante si potrà passare alla creazione delle Exstension, Inbound Route e Outbound Route.

enjoy 😉

 

 

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

 

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

Guida su come installare owncloud 10 su Raspberry Pi 3 con già installato Raspbian Stretch. Io ho sempre usato uno dei miei Raspberry come server cloud, accessibile soprattutto da remoto. In questa guida non mi soffermerò sui problemi di sicurezza ed i modi per limitare i danni derivanti da una macchina esposta su internet, ma bensì mi limiterò ai soli step per avere un server cloud pronto all'uso. Io preferisco archiviare i dati direttamente su una chiavetta usb da 128G, piuttosto che direttamente sul raspberry. Quindi, dopo avere installato Raspbian Stretch ed aver collegato alla porta usb la pen drive, servendosi di una prolunga usb che servirà a dissipare il calore, siamo pronti ad iniziare.

$ sudo su
# apt update; apt upgrade
# apt install apache2 mariadb-server libapache2-mod-php7.0 php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt php-imagick php7.0-zip php7.0-xml php7.0-mbstring ntfs-3g fail2ban
# cd /tmp
# wget https://download.owncloud.org/community/owncloud-10.0.7.tar.bz2
# tar -xvf owncloud-10.0.7.tar.bz2
# chown -R www-data:www-data owncloud
# mv owncloud /var/www/html/
# nano /etc/apache2/sites-available/owncloud.conf

ed incollare dentro:

Alias /owncloud "/var/www/html/owncloud/"

<Directory /var/www/html/owncloud/>
 Options +FollowSymlinks
 AllowOverride All

<IfModule mod_dav.c>
 Dav off
 </IfModule>

SetEnv HOME /var/www/html/owncloud
SetEnv HTTP_HOME /var/www/html/owncloud

</Directory>
# ln -s /etc/apache2/sites-available/owncloud.conf /etc/apache2/sites-enabled/owncloud.conf
# systemctl start apache2
# systemctl enable apache2

Creazione database ed user mysql:

# mysql -u root -p

inserire password di root, e poi i 5 comandi sotto, e settare la password per l'utente owncloud:

1) create database owncloud;
2) create user owncloud@localhost identified by 'password';
3) grant all privileges on owncloud.* to owncloud@localhost identified by 'password';
4) flush privileges;
5) exit;

Web Server Apache2 con SSL

sotto ci saranno alcune voci da riempire, ma quella più importante è COMMON NAME, che io ho fatto puntare al mio hostname DynDNS per l'accesso da remoto:

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

# cd --
# openssl genrsa -out server.key 4096
# openssl req -new -key server.key -out server.csr
# openssl x509 -req -days 1825 -in server.csr -signkey server.key -out server.crt -sha256
# chmod 400 server.key
# a2ensite default-ssl.conf
# systemctl reload apache2
# a2enmod ssl
# systemctl restart apache2

configurazione apache2:

# nano /etc/apache2/sites-available/default-ssl.conf

che dovrà essere come sotto, aggiungendo ip del server cloud, modificando le voci DocumentRoot, SSLCertificateFile, SSLCertificateKeyFile , e commentando le altre voci che fanno riferimento a SSL.

        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
                ServerName IP-SERVER:443
                DocumentRoot /var/www/html/owncloud
                SSLCertificateFile /root/server.crt
                SSLCertificateKeyFile /root/server.key
# nano /etc/apache2/sites-available/000-default.conf

la DocumentRoot dovrà essere come sotto:

DocumentRoot /var/www/html/owncloud
# nano /etc/php/7.0/apache2/php.ini

fare una modifica al file php.ini, nella sezione File Uploads, portando upload_max_filesize = 5000.

# sed -i 's/AllowOverride None/AllowOverride All/'  /etc/apache2/apache2.conf
# systemctl restart apache2

creazione della cartella di storage e relativi permessi:

# mkdir /media/owncloud-usb
# groupadd www-data
# usermod -a -G www-data www-data
# chown -R www-data:www-data /media/owncloud-usb
# chmod -R 775 /media/owncloud-usb

a questo punto abbiamo bisogno di conoscere UUID della chiavetta usb ed user e group di www-data, che serviranno per configurare /etc/fstab per il montaggio automatico:

# id -u www-data; id -g www-data
# blkid
# nano /etc/fstab

ed aggiungere in una sola riga qualcosa del genere in /etc/fstab:

UUID=32E49E5027A4F8A7 /media/owncloud-usb auto nofail,uid=33,gid=33,umask=0027$,dmask=0027,noatime 0 0

come ultimo ritocco, aumentare la capacità di upload, andando a modificare il file .user.ini

# nano /var/www/html/owncloud/.user.ini

portando: php_value upload_max_filesize, e php_value post_max_size a 5000M

# reboot

Se tutto è andato bene andare all'indirizzo https://ip_del_raspberry ed apparirà la pagina iniziale, dove si dovrà scegliere nome utente e password per l'accesso al server owncloud, ed inserire il nome del database, user e password dell'utente owncloud:

Username: owncloud
Password: password
Database: owncloud
Server: localhost

Molto probabilmente al momento di accedere via FQDN, owncloud presenterà al login un errore di untrusted domain

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

Owncloud 10 su Raspberry Pi 3 e Raspbian Stretch

si risolve andando a modificare il file config.php, aggiungendo ip server ed il proprio DDNS

# nano /var/www/html/owncloud/config/config.php
$CONFIG = array (
  'instanceid' => 'oc8foxmontqb',
  'passwordsalt' => 'PBMACOGPeaL9S/Lfq+a80nhE9Bi6ke',
  'secret' => 'EtvIi0rDN2kmFUBdTL4xehQTRUBD1NDmvDipQ3qyVK1gj8SI',
  'trusted_domains' =>
  array (
    0 => '192.X.X.X','myddns'
  ),
  'datadirectory' => '/media/owncloud-usb',
  'overwrite.cli.url' => 'https://192.X.X.X',
  'dbtype' => 'mysql',
  'version' => '10.0.7.2',
  'dbname' => 'owncloud',
  'dbhost' => 'localhost',
  'dbtableprefix' => 'oc_',
  'dbuser' => 'owncloud',
  'dbpassword' => 'abcd2134retfd5678hjbnfh58gbf',
  'logtimezone' => 'UTC',
  'installed' => true,

enjoy 😉

 

Connessione WPA2 WIFI da terminale con Wpa_Supplicant

 

Connessione WPA2 WIFI da terminale con Wpa_Supplicant

Connessione WPA2 WIFI da terminale con Wpa_Supplicant

Guida su come connettersi ad una rete wifi da terminale, nell'eventualità che la scheda usb wifi non venga mostrata nel menu di NetworkManager (device not managed) oppure se si tratta di collegarsi da un server. La mia scheda usb viene vista come wlx74da38c7a99b, ma per semplicità nella guida utilizzerò wlan1, e come sempre utilizzo Debian.

Pacchetti da installare:

sudo apt install rfkill wpasupplicant

verifica interfacce:

sudo rfkill list

nel mio caso viene mostrato:

0: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no
1: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no

Disabilitare NetworkManager:

sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

abilitare interfaccia:

sudo iwconfig
sudo ifconfig wlan1 up

ricerca ESSID:

sudo iwlist wlan1 scan | grep ESSID

connessione:

sudo wpa_passphrase NOME_RETE PASSWORD | sudo tee /etc/wpa_supplicant.conf

output:

network={
        ssid="NOME_RETE_WIFI"
        #psk="PASSWORD"
        psk=ddb754fd4fe6b22935cbae31e34873wreg586gscdf578hf986354jdg56bb
}

avvio:

sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan1
sudo dhclient wlan1
sudo ifconfig wlan1

output:

Connessione WPA2 WIFI da terminale con Wpa_Supplicant

Connessione WPA2 WIFI da terminale con Wpa_Supplicant

Abilitare connessione al boot:

sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
sudo nano /etc/systemd/system/wpa_supplicant.service

aggiungere nome interfaccia, quindi modificare il file da così:

ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant

a così:

ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlan1
sudo systemctl enable wpa_supplicant.service

Abilitare dhclient al boot:

sudo nano /etc/systemd/system/dhclient.service

ed incollare dentro:

[Unit]
Description= DHCP Client
Before=network.target

[Service]
Type=simple
ExecStart=/sbin/dhclient wlan1

[Install]
WantedBy=multi-user.target
sudo systemctl enable dhclient.service

 

enjoy 😉