= Εργασία Εξαμήνου
Ασφάλεια Δικτύων και Επικοινωνιών
Βαλαγκούτη Ηρώ - Αθηνά
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:sectnums:
:icons: font
:tabs:


toc::[]
== Docker
=== Λίγα λόγια για το Docker

Το Docker είναι μία πλατφόρμα λογισμικού ανοιχτού κώδικα με την οποία μπορούμε να κάνουμε virtualization σε επίπεδο λειτουργικού συστήματος. Δίνεται δηλαδή η δυνατότητα να εγκατασταθεί μόνο η εφαρμογή/υπηρεσία που θέλουμε, σε ένα απομονωμένο περιβάλλον από κανονικό σύστημα. Αυτό έχει ως συνέπεια την εξοικονόμηση CPU, GPU και RAM του υπολογιστή. Ακόμη, μπορεί να
χρησιμοποιηθεί για να δοκιμαστούν άγνωστες εφαρμογές, χωρίς να κινδυνέψει το υπόλοιπο σύστημα.

=== Οδηγός εγκατάστασης (Ubuntu)

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update

sudo apt install -y docker-ce 
echo   "or" 
sudo apt install docker*

sudo systemctl status docker 
sudo usermod -aG docker username     #οπου username το όνομα του χρήστη που θα δουλεύει με docker

```

==== docker-compose
====
----
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose 
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
----
====
==== error
====
----
Get https ://registry.vlabs.uniwa.gr:5080/v2/: x509: certificate
Pulling  ...
ERROR: Get https://registry.vlabs.uniwa.gr:5080/v2/: x509: certificate signed by unknown authority
----
====

* run

====
----
$ sudo su 
# touch set-ca.sh
----
====

* copy-paste into file
====
----
registry_address=registry.vlabs.uniwa.gr
registry_port=5043
mkdir -p /etc/docker/certs.d/$registry_address:$registry_port
openssl s_client -showcerts -connect $registry_address:$registry_port < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/$registry_address:$registry_port/ca.crt
registry_port=5080
mkdir -p /etc/docker/certs.d/$registry_address:$registry_port
openssl s_client -showcerts -connect $registry_address:$registry_port < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/$registry_address:$registry_port/ca.crt

registry_address=hub.swarmlab.io
registry_port=5443
mkdir -p /etc/docker/certs.d/$registry_address:$registry_port
openssl s_client -showcerts -connect $registry_address:$registry_port < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/$registry_address:$registry_port/ca.crt

registry_port=5480
mkdir -p /etc/docker/certs.d/$registry_address:$registry_port
openssl s_client -showcerts -connect $registry_address:$registry_port < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/$registry_address:$registry_port/ca.crt
----
====
* exec file
====
----
sudo bash ./set-ca.sh
----
====
=== Δημιουργία σμήνους (swarm) από Docker
==== Δημιουργία cluster
* Make a new directory to store the project +
====
----
mkdir myproject
cd myproject
../install/usr/share/swarmlab.io/sec/swarmlab-sec create
----
====

* Spin up the cluster (5 clusters shown here) +
====
----
cd myproject #if not already on the directory 
../install/usr/share/swarmlab.io/sec/swarmlab-sec up size=5
----
====

* Login to the cluster +
====
----
cd myproject #if not already on the directory
../install/usr/share/swarmlab.io/sec/swarmlab-sec login
----
NOTE: When you are inside a container: +
`ssh docker@<IP>` +
User password: docker +
sudo password: docker +
====

== Υλοποίηση συστήματος για την προσομοίωση Dos/DDos Attack
Για να επιτευχθεί ένα D(d)os Attack, χρειάζεται να γνωρίζουμε την IP και την port του μηχανήματος που θέλουμε να χτυπήσουμε.

=== Βρίσκοντας την IP
====
----
ifconfig
----
image:images/if_config.png[]

TIP: IP: 172.19.0.2
====

=== Βρίσκοντας τους ενεργούς hosts
====
----
nmap -sP <IP>
----
image:images/nmap_p.png[]

TIP: Αν η IP είναι π.χ. 172.19.0.2, αντί για το τελευταίο νούμερο βάζουμε *.

====

=== Ενεργές πόρτες
====
----
nmap –p– <IP of worker>
----
image:images/nmap_for_ports.png[]

TIP: Εδώ φαίνεται ανοιχτή η πόρτα 22
====

=== Εγκατάσταση hping3
====
----
sudo apt update 
sudo apt install hping3
----
====

=== Εκτέλεση
====
----
sudo hping3 -S <source IP> -a <target IP> -p <portno> --flood
----
image:images/1st_hping3.png[] +

ή +
----
sudo hping3 -S --flood -V -p <portno> <target IP>
----
image:images/2nd_hping3.png[]

Όπου: +
-a: spoof source address +
-S: specifies SYN packets +
--flood: shoot at discretion, replies will be ignored and packets will be sent fast as possible. +
-V: Verbosity. +
-p: port number +

SYN packets flood: +
----
sudo hping3 <target host> -q -n -d 120 -S -p <portno> --flood --rand-source
----
image:images/3rd_hping3.png[]

Όπου: +
-q: brief output +
-n: show target ip instead of host +
-d 120: packet size +
--rand-source: hide IP address
====

=== Βλέποντας το flood
====
----
sudo tcpdump  -ni <interface>
----
ή +
----
sudo tcpdump src <IP>
----
Πρώτο attack: +
image:images/1st_flood.png[] +
Δεύτερο attack: +
image:images/2nd_flood.png[] +
Τρίτο attack: +
image:images/3rd_flood.png[] +
Στα παραπάνω screenshots φαίνεται ο διαφορετικός τύπος μηνυμάτων.
====

=== IP tables
Ένας τρόπος για να αποφευχθούν τα attacks είναι με χρήση των iptables. Είναι κάποιοι κανόνες που μπορούμε να δηλώσουμε ώστε να απαγορεύσουμε/επιτρέψουμε την διέλευση πακέτων. Παρακάτω χρησιμοποιήθηκε κανόνας που κόβει την κίνηση από μία συγκεκριμένη IP.
====
Τα παρακάτω χρειάζονται sudo: +
----
iptables -I INPUT -s <IP address we want to block> -j DROP
----
Για να δούμε τους κανόνες: +
----
iptables -L
----
image:images/ip_tables.png[] +
Με την iptables -nvL μπορούμε να δούμε και στατιστικά, όπως πόσα πακέτα έχουν απορριφθεί από τον κάθε κανόνα.
====

== SSH Brute Force Attacks
=== SSH Attack with Hydra
* Εγκατάσταση hydra +
====
----
apt-get install hydra 
----
====
* Password list +
====
----
wget https://downloads.skullsecurity.org/passwords/500-worst-passwords.txt.bz2

bzip2 -d 500-worst-passwords.txt.bz2
----

TIP: Μπορούμε να επεξεργαστούμε το αρχείο και να προσθέσουμε και δικά μας passwords
====

* Find IP address of docker: +
====
----
ifconfig
----
image:images/ssh_find_ip.png[] +

TIP:  Είναι 172.19.0.1 +
====

* Network range: +
====
----
ipcalc <IP address>
----
image:images/ssh_ipcalc.png[] +

====

* Scan for open ssh ports: +
====
----
nmap <IP address/subnet> -p 22 --open
----
image:images/ssh_open_ports.png[] +
====

* Execute SSH brute force attack: +
====
Η γενική σύνταξη της εντολής είναι (επειδή γνωρίζουμε το username): +
----
hydra -l username -P passwords_file.txt ssh://IP -t no_of_tasks
----
Άρα γίνεται: +
----
hydra -l docker -P '/home/iro/Desktop/500-worst-passwords.txt' ssh://172.19.0.3 -t 8
----
image:images/ssh_success.png[] +

TIP:  Password: docker +
Αν δεν γνωρίζουμε ούτε το username, μπορούμε να ψάξουμε με βάση κάποιο αρχείο που περιέχει πιθανά ονόματα ως εξής:
hydra -L usernames.txt -P passwords.txt ssh://172.19.0.3 -t 8
====

=== Fail2Ban
Το Fail2Ban είναι ένα open-source εργαλείο που αποσκοπεί στο να προστατεύει τα συστήματα από ssh brute force attacks. +

* Εγκατάσταση:
====
----
sudo apt-get install fail2ban
sudo apt-get -y install rsyslog

sudo rsyslogd
----
====

* Backup Fail2Ban main configuration file (just in case)
====
----
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
----
====

* Configure Fail2Ban
====
----
nano /etc/fail2ban/jail.local
----
====

* Φτιάχνουμε ένα ssh section και αλλάζουμε τις τιμές ανάλογα με τις προτιμίσεις μας. Δεν ξεχνάμε να κάνουμε restart την υπηρεσία στο τέλος.
====
image:images/ssh_jail.png[] +
----
service fail2ban restart
----
image:images/fail2ban_running.png[] +
====

* Κάνουμε ξανά επίθεση
====
Η καινούρια επίθεση αποτυγχάνει +

image:images/ssh_attack_fail.png[] +

Ο επιτιθέμενος έχει μπλοκαριστεί +
image:images/docker_iptables_with_fail2ban.png[] +
====

=== Συνδέσεις μέσω Key
* Aν έχουμε κάνει τα προηγούμενα: +
====
Κάνουμε unban +
----
sudo fail2ban-client unban --all
----
Σταματάμε το fail2ban +
----
sudo service fail2ban stop
----
====
* Βρίσκουμε το αρχείο sshd_config και το ανοίγουμε +
====
----
sudo nano /etc/ssh/sshd_config
----
Βγάζουμε από σχόλια και αλλάζουμε τις τιμές στα: +
LogLevel VERBOSE +
PermitRootLogin prohibit-password +
PasswordAuthentication no +

Restart the ssh service +
----
sudo service ssh restart
----
Παρατηρούμε ότι πλέον δεν μπορούμε να μπούμε με κωδικό +
image:images/ssh_denied_password.png[] +
====
=== Για το κλειδί
* Αν έχουμε κάνει τα παραπάνω: +
====
Αλλάζουμε σε σχόλιο το PasswordAuthentication στο αρχείο sshd_config +
----
sudo nano /etc/ssh/sshd_config
----

Σε νέο terminal στον υπολογιστή μας γράφουμε: +
----
ssh-keygen
----
Δίνουμε όνομα αρχείου/κωδικό (αν θέλουμε) +

image:images/ssh_keygen.png[] +

Δίνουμε την εντολή +
----
ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer

ssh-copy-id -i ~/.ssh/id_rsa.pub docker@172.19.0.3
----

Βγάζουμε από comment το PasswordAuthentication και κάνουμε restart το ssh +
----
sudo service ssh restart
----

Αν πάμε να συνδεθούμε, πλέον θα χρειάζεται το κλειδί που δώσαμε στο ssh-keygen +

====
== SSH Forwarding
=== Εγκατάσταση υπηρεσίας (apache)
====
----
sudo apt-get update
sudo apt install apache2

----
TIP: Αν έχουμε ήδη κάποια άλλη υπηρεσία, μπορούμε να χρησιμοποιήσουμε αυτή.
====

Για να τρέξουμε την υπηρεσία:
====
----
sudo apachectl start
sudo netstat -antlupe
----
image:images/apache_is_running.png[] +
Η υπηρεσία μας τρέχει! +
====
=== Local port forwarding
Η πρώτη συράγγωση είναι μεταξύ ενός container στον υπολογιστή μας. Για να επιτευχθεί αυτό χρειάζεται ο υπολογιστής μας να έχει και την server side υπηρεσία του ssh. Η port μετά το localhost θα πρέπει να είναι εκείνη που έχει την υπηρεσία που θέλουμε. Αλλάζουμε username και IP ανάλογα. +
====
Σε ένα οποιοδήποτε container γράφουμε: +
----
ssh -nNT -L 8081:localhost:80 iro@192.168.64.128
----

image:images/local_port_forwarding.png[] +

image:images/apache_page.png[] +
Εάν κάνουμε curl localhost:8081 βλέπουμε την σελίδα του apache +
====

=== Remote port forwarding
====
Στον υπολογιστή μας γράφουμε: +
----
ssh -nNT -R 8082:localhost:80 docker@172.21.0.6
----
image:images/remote_ssh.png[] +

image:images/remote_ssh_apache.png[] +
Εάν κάνουμε curl localhost:8082 βλέπουμε την σελίδα του apache +
====

== VPN
Δημιουργούμε ένα νέο κατάλογο μέσα στο swarmlab-sec με όνομα π.χ. vpn +

=== Δημιουργία αρχείου (create-vpn.sh)

* copy-paste
====
[source,bash]
----
#!/bin/bash 
IP=127.0.0.1                                            # Server IP  # <1> 
P=1194                                                  # Server Port  # <2>   
OVPN_SERVER='10.80.0.0/16'                              # VPN Network  # <3>  

#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/   # Dir to save data ** this must exist ** 
vpn_data=$PWD/openvpn-services/                              # <4>             
if [ ! -d $vpn_data ]; then 
 mkdir -p $vpn_data 
fi 

NAME=swarmlab-vpn-services                              # name of docker service  # <5>
DOCKERnetwork=swarmlab-vpn-services-network             # docker network 
docker=registry.vlabs.uniwa.gr:5080/myownvpn            # docker image 

docker stop  $NAME					      #stop container 
sleep 1 
docker container rm  $NAME				#rm container 

# rm config files 
rm -f $vpn_data/openvpn.conf.*.bak 
rm -f $vpn_data/openvpn.conf 
rm -f $vpn_data/ovpn_env.sh.*.bak 
rm -f $vpn_data/ovpn_env.sh 

# create network 
sleep 1 
docker network create --attachable=true --driver=bridge --subnet=172.50.0.0/16 --gateway=172.50.0.1 $DOCKERnetwork 

#run container        see ovpn_genconfig 
docker run --net=none -it -v $vpn_data:/etc/openvpn  -p 1194:1194 --rm $docker ovpn_genconfig  -u udp://$IP:1194 \
-N -d -c -p "route 172.50.20.0 255.255.255.0" -e "topology subnet" -s $OVPN_SERVER   # <6>

# create pki          see ovpn_initpki 
docker run --net=none -v $vpn_data:/etc/openvpn  --rm -it $docker ovpn_initpki     # <7>

#                     see ovpn_copy_server_files 
#docker run --net=none -v $vpn_data:/etc/openvpn  --rm $docker ovpn_copy_server_files 

#create vpn           see --cap-add=NET_ADMIN 
sleep 1 
docker run --detach --name $NAME -v $vpn_data:/etc/openvpn --net=$DOCKERnetwork --ip=172.50.0.2 -p $P:1194/udp --cap-add=NET_ADMIN $docker  # <8>

sudo sysctl -w net.ipv4.ip_forward=1 

#show created 
docker ps 
----
<1> localhost inside of a container will resolve to the network stack of this container
<2> Port
<3> Specify Addresses and Netmasks for VPN Clients
<4> Directory to mount data
<5> Name of docker services
<6> Create config
<7> keys
<8> Run docker vpn service
====
Τρέχουμε το αρχείο. (προσοχή στα δικαιώματα). Θα ζητηθεί ένα passphrase, μπορούμε να εισάγουμε ότι θέλουμε. Όταν η διαδικασία ολοκληρωθεί, θα πρέπει στα NAMES να δούμε το όνομα swarmlab-vpn-services (ή το αντίστοιχο που έχουμε επιλέξει εμείς). +
image:images/vpn_success.png[] +
Μπορούμε να το επιβεβαιώσουμε και με netstat +
image:images/vpn_success_2.png[] +

=== Δημιουργία χρήστη
Για να μπορέσει να συνδεθεί ένας χρήστης, χρειάζεται ένα config αρχείο.
====
----
Η δομή της εντολής είναι:
docker run -v $vpn_data:/etc/openvpn --rm -it $docker easyrsa build-client-full $USERNAME nopass

docker run -v $vpn_data:/etc/openvpn --log-driver=none --rm $docker ovpn_getclient $USERNAME  > $USERNAME.ovpn

όπου:
USERNAME=sec1
vpn_data=$PWD/openvpn-services/
docker=registry.vlabs.uniwa.gr:5080/myownvpn
όπως δόθηκαν στο αρχείο για το vpn

Άρα
docker run -v $PWD/openvpn-services:/etc/openvpn --rm -it registry.vlabs.uniwa.gr:5080/myownvpn easyrsa build-client-full sec1 nopass

docker run -v $PWD/openvpn-services:/etc/openvpn --rm --log-driver=none -it registry.vlabs.uniwa.gr:5080/myownvpn ovpn_getclient sec1  > sec1.ovpn
----
Θα πρέπει να επιστρέψει την παρακάτω οθόνη (αφού εισάγουμε τον κωδικό) +
image:images/user_config_create_1.png[] +
====
Ανοίγουμε το αρχείο του χρήστη και κάνουμε copy-paste αντικαθιστώντας την host machine IP με την δική μας, δηλαδή το μηχανάκι που τρέχει το docker. Το 1194 είναι η πόρτα που έχουμε δώσει στο create-vpn.sh
====
----
client
nobind
dev tun
comp-lzo
resolv-retry infinite
keepalive 15 60

remote-cert-tls server
remote <HOST MACHINE IP> 1194 udp 
float
----

Αντιγράφουμε το αρχείο στον φάκελο που έχουμε το project
----
cp sec* ../test/project/
----

image:images/sec_on_project_folder.png[] +
====
=== Εγκατάσταση openvpn
Για να μπορέσουμε να συνδεθούμε στο vpn, χρειαζόμαστε το openvpn. Το εγκαθιστούμε τόσο στα containers όσο και στο docker (τον master)
====
----
apt update
apt install openvpn
----
====
=== Λειτουργία
Εκτελούμε την παρακάτω εντολή σε κάποιο container:
====
----
openvpn --config ./sec1.ovpn
----
image:images/init_sequence_complete.png[] +
Εδώ βλέπουμε ότι το container πήρε την IP 10.80.0.2, η οποία είναι εντός του VPN nertwork που ορίστηκε στο create-vpn.sh αρχείο (10.80.0.0/16). +

image:images/worker_ip_after_vpn.png[] +
Το interface tun0 με τη IP του VPN. +
====