Browse Source

changes

master
cse242017107 4 years ago
parent
commit
6302ec945c
  1. 429
      project.adoc
  2. 546
      project.html
  3. 2
      src/worker_scripts/detect_ssh_brute_force.sh

429
project.adoc

@ -61,7 +61,7 @@ nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '('
* Εγκαθιστεί το εργαλείο ansible * Εγκαθιστεί το εργαλείο ansible
* Εγκαθιστεί το εργαλείο sshpass * Εγκαθιστεί το εργαλείο sshpass
* Παραμετροποιεί κατάλληλα το config αρχείο του προγράμματος ansible * Παραμετροποιεί κατάλληλα το config αρχείο του προγράμματος ansible
* Εισάγει στο αρχείο inventory(το οποίο θα χρησιμοιηθεί από το ansible) δύο κατηγορίες χρηστών. Η πρώτη κατηγορία απευθύνεται στους workers του Σμήνους * Εισάγει στο αρχείο inventory(το οποίο θα χρησιμοποιηθεί από το ansible) δύο κατηγορίες χρηστών. Η πρώτη κατηγορία απευθύνεται στους workers του Σμήνους
ενώ η δεύτερη απευθύνεται σε όλους τους hosts ενώ η δεύτερη απευθύνεται σε όλους τους hosts
{empty} + {empty} +
@ -359,14 +359,14 @@ target prot opt source destination
=== Εγκατάσταση Εργαλείου THC-Hydra === Εγκατάσταση Εργαλείου THC-Hydra
Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο HTC-Hydra στον master κόμβο με την εντολή *sudo apt-get install hydra*. Σε αυτό το σενάριο ο master θα αποτελέσει τον Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο THC-Hydra στον master κόμβο με την εντολή *sudo apt-get install hydra*. Σε αυτό το σενάριο ο master θα αποτελέσει τον
επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης. επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης.
{empty} + {empty} +
=== Εκτέλεση SSH Brute Force Attack === Εκτέλεση SSH Brute Force Attack
Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς. Στη συνέχεια εκτελούμε το script ssh_brute_force.sh. Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς και εκτελούμε το script ssh_brute_force.sh.
.ssh_brute_force.sh .ssh_brute_force.sh
---- ----
@ -396,12 +396,13 @@ Hydra (http://www.thc.org/thc-hydra) starting at 2021-01-24 20:47:32
[ERROR] 16 targets did not complete [ERROR] 16 targets did not complete
Hydra (http://www.thc.org/thc-hydra) finished at 2021-01-24 20:47:59 Hydra (http://www.thc.org/thc-hydra) finished at 2021-01-24 20:47:59
---- ----
Παρατηρούμε ότι η επίθεση ολοκληρώθηκε με επιτυχία.
{empty} + {empty} +
=== Ανίχνευση SSH Brute Force Attack === Ανίχνευση SSH Brute Force Attack
Για την ανίχνευση του SSH Bruce Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh Για την ανίχνευση του SSH Brute Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh.
.detect_ssh_brute_force.sh .detect_ssh_brute_force.sh
---- ----
@ -425,12 +426,14 @@ do
sleep 1 sleep 1
done done
---- ----
Το script detect_ssh_brute_force.sh ελέγχει επαννελημένα το αποτέλεσμα της εντολής *netstat -tn* και όταν ο αριθμός συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι πάνω από 20 Το script detect_ssh_brute_force.sh ελέγχει επαννελημένα το αποτέλεσμα της εντολής *netstat -tn* και όταν το πλήθος συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι μεγαλύτερο του 20
σταματάει την εκτέλεση του προγράμματος και εμφανίζει πληροφορίες σχετικά με την επίθεση. σταματάει την εκτέλεση του προγράμματος και εμφανίζει πληροφορίες σχετικά με την επίθεση.
---- ----
Starting scan for SSH Brute Force Attacks Starting scan for SSH Brute Force Attacks
SSH Bruce Force Attack detected!!! SSH Brute Force Attack detected!!!
172.19.0.2 made 22 SSH connections at the same time 172.19.0.2 made 22 SSH connections at the same time
Data collected: Data collected:
@ -461,24 +464,430 @@ tcp 0 0 172.19.0.3:22 172.19.0.2:34512 ESTABLISHED
---- ----
{empty} + {empty} +
=== Αντιμετώπιση SSH Brute Force Attack === Αντιμετώπιση SSH Brute Force Attack
NOTE: Η αντιμετώπιση της επίθεσης θα γίνει μέσω ενός script που υλοποιήσαμε καθώς δεν καταφέραμε να παραμετροποιήσουμε κατάλληλα το εργαλείο fail2ban.
{empty} +
.block_ssh_brute_force.sh
----
#!/bin/bash
# must run with sudo!!!
while [ 1 ]
do
count=$(netstat -tn | awk '{print $4}' | grep :22 | wc -l)
if [ $count -gt 10 ]
then
attacker=$(netstat -tn | awk '{print $5}' | grep -v :22 | cut -d ':' -f1 | tail -1)
iptables -I INPUT -p tcp --dport 22 -s $attacker -m state --state NEW -j DROP
sleep 90
iptables -D INPUT -p tcp --dport 22 -s $attacker -m state --state NEW -j DROP
fi
sleep 1
done
----
Το script block_ssh_brute_force.sh έχει σκοπό την αντιμετώπιση της επίθεσης SSH Brute Force. Ελέγχει επαννελημένα το αποτέλεσμα της εντολής *netstat -tn* και όταν το πλήθος συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι μεγαλύτερο του 10 προσθέτει κατάλληλο κανόνα στο iptalbes ώστε να μην επιτρέπει στο επιτιθέμενο να πραγματοποιήσει καινούργιες συνδέσεις. Τέλος μετά από ένα διάστημα 90 δευτερολέπτων διαγράφει τον κανόνα από το iptables και συνεχίσει τον έλεγχο ώστε να εντοπίσει τυχόν νέες επιθέσεις.
Εκτελούμε το script block_ssh_brute_force.sh και ξεκινάμε την επίθεση από τον master στον worker_1.
----
Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (http://www.thc.org/thc-hydra) starting at 2021-01-25 00:55:05
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 200 login tries (l:1/p:200), ~13 tries per task
[DATA] attacking ssh://172.27.0.3:22/
[STATUS] 139.00 tries/min, 139 tries in 00:01h, 94 to do in 00:01h, 16 active
1 of 1 target completed, 0 valid passwords found
[WARNING] Writing restore file because 1 final worker threads did not complete until end.
[ERROR] 1 target did not resolve or could not be connected
[ERROR] 16 targets did not complete
Hydra (http://www.thc.org/thc-hydra) finished at 2021-01-25 00:56:43
----
Παρατηρούμε ότι η επίθεση ήταν ανεπιτυχής.
----
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- project_master_1.project_net anywhere tcp dpt:22 state NEW
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----
Επίσης στο iptables έχει προστεθεί κανόνας για τον αποκλεισμό του επιτιθέμενου.
{empty} + {empty} +
=== Τροποποίηση ssh-server στους workers === Τροποποίηση ssh-server στους workers
.generate_keys.sh
----
#!/bin/bash
ssh-keygen -t rsa
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
hosts=$(nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
for ip in $hosts
do
ssh-copy-id docker@$ip
done
----
Αρχικά ο master δημιουργεί και μεταφέρει τα SSH κλειδιά στους workers του Σμήνους.
{empty} + {empty} +
== SSH Tunelling .configure_ssh.sh
----
#!/bin/bash
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
service ssh restart
----
Ένα από τα scripts που μεταφέρθηκαν στους workers μέσω του ansible ήταν το configure_ssh.sh. Το συγκεκριμένο script τροποποιεί κατάλληλα το config αρχείο του SSH ώστε να επιτρέπει
συνδέσεις μόνο με κλειδί και επανεκκινεί την υπηρεσία ώστε να λάβουν χώρα οι αλλαγές.
Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 5 με αποτέλεσμα το ansible να εκτελέσει το playbook configure_ssh.yml.
.configure_ssh.yml
----
---
- name: Configure ssh on workers
hosts: workers
become: true
become_user: root
tasks:
- name: Configuring ssh
command: sh /home/docker/configure_ssh.sh
----
Το playbook configure_ssh.yml αναλαμβάνει να εκτελέσει το script configure_ssh.sh σε όλους τους workers. Επομένως πραγματοποιείται ταυτόχρονη παραμετροποίηση των ssh-server στους workers.
Εκτελούμε για μία τελευταία φορά την επίθεση.
----
Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (http://www.thc.org/thc-hydra) starting at 2021-01-24 23:07:20
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 200 login tries (l:1/p:200), ~13 tries per task
[DATA] attacking ssh://172.19.0.3:22/
[ERROR] target ssh://172.19.0.3:22/ does not support password authentication.
----
Παρατηρούμε πως το εργαλείο THC-Hydra εμφανίζει μήνυμα ότι η επίθεση δεν ήταν επιτυχής καθώς ο στόχος επιτρέπει σύνδεση μόνο με κλειδί.
{empty} +
== SSH Forwarding
todo === Local SSH Forwarding
Σκοπός του Local SSH Forwarding είναι η προώθηση μίας υπηρεσίας στον client(worker_1) από τον Server(master) μέσω μιας πόρτας δημιουργώντας ένα tunnel μέχρι τον Server.
.start_local_ssh_forwarding.sh
----
#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
target=$(nmap -sP $network | grep master | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
ssh -fNT -L 8080:$target:8000 docker@$target
----
Αρχικά ο worker βρίσκει δυναμικά την IP διεύθυνση του server και πραγματοποιεί Local SSH Forwarding από την πόρτα 8000 του server στην τοπική του πόρτα 8080.
Εκτελούμε το script στον worker_1 και πραγματοποιούμε HTTP request με το εργαλείο curl.
----
docker@73e8f80f638f:~$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<body>
<h1>*Beep boop* the server is up and running</h1>
</body>
</html>
----
{empty} +
=== Remote SSH Forwarding
Σκοπός του Remote SSH Forwarding είναι η προώθηση μίας υπηρεσίας μέσω πόρτας από τον Server(master) στον client(worker_1) δημιουργώντας ένα tunnel μέχρι τον client.
.start_remote_ssh_forwarding.sh
----
#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
target=$(nmap -sP $network | grep worker_1 | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
ssh -fNT -R 8080:localhost:8000 docker@$target
----
Αρχικά ο master βρίσκει δυναμικά την IP διεύθυνση του worker_1 και πραγματοποιεί Remote SSH Forwarding από την πόρτα 8000 του server στην πόρτα 8080 του client.
Εκτελούμε το script στον master και πραγματοποιούμε HTTP request από τον worker_1 με το εργαλείο curl.
----
docker@73e8f80f638f:~$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<body>
<h1>*Beep boop* the server is up and running</h1>
</body>
</html>
----
{empty} + {empty} +
== VPN == VPN
todo Σκοπός του ζητούμενου είναι η δημιουργία Virtual Private Network καθώς και η σύνδεση των μελών του Σμήνους σε αυτό.
NOTE: Τα πρώτα βήματα για την υλοποίηση του VPN εκτελούνται στο σύστημα που φιλοξενεί το docker και όχι μέσα στο Σμήνος.
Αρχικά τροποποιούμε το αρχείο extra_lines κατάλληλα.
----
client
nobind
dev tun
comp-lzo
resolv-retry infinite
keepalive 15 60
remote-cert-tls server
remote 192.168.1.169 1194 udp <-- Αλλάζουμε την IP σε αυτήν του κανονικού μας συστήματος.
float
----
Στην συνέχεια εκτελούμε από το δικό μας σύστημα το script initiate-vpn.sh το οποίο έχει συνταχθεί σύμφωνα με τις http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/ex-5_iptables.adoc.html[οδηγίες] του εργαστηρίου
.initiate-vpn.sh
----
#!/bin/bash
IP=127.0.0.1 # Server IP
P=1194 # Server Port
OVPN_SERVER='10.80.0.0/16' # VPN Network
#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/ # Dir to save data ** this must exist **
vpn_data=$PWD/openvpn-services/
if [ ! -d $vpn_data ]; then
mkdir -p $vpn_data
fi
NAME=swarmlab-vpn-services # name of docker service
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
# create pki see ovpn_initpki
docker run --net=none -v $vpn_data:/etc/openvpn --rm -it $docker ovpn_initpki
# 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
sudo sysctl -w net.ipv4.ip_forward=1
#show created
docker ps
echo -e "\nEnter the full path of the directory you want to copy the .ovpn files to: "
read path
for USERNAME in master worker_1 worker_2 worker_3 worker_4
do
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
tail -n +8 $USERNAME.ovpn > temp && cat temp > $USERNAME.ovpn
cat $USERNAME.ovpn > temp && cat extra_lines > $USERNAME.ovpn && cat temp >> $USERNAME.ovpn
mv $USERNAME.ovpn $path
done
----
Το script initiate-vpn.sh αναλαμβάνει την κατασκευή του VPN καθώς και την δημιουργία χρηστών για αυτό. Δημιουργούνται συνολικά πέντε χρήστες που αντιστοιχούν στα μέλη του σμήνους ενώ στην
συνέχεια πραγματοποιούνται οι κατάλληλες τροποποιήσεις πάνω στα .ovpn αρχεία του καθενός. Τέλος τα .ovpn αρχεία μεταφέρονται στον κοινόχρηστο φάκελο του Σμήνους.
{empty} +
NOTE: Τα επόμενα βήματα εκτελούνται από τα μέλη του Σμήνους
.transfer_vpn_files.sh
----
#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
cp /project/vpn_files/master.ovpn /home/docker/myvpn.ovpn
for host in worker_1 worker_2 worker_3 worker_4
do
ip=$(nmap -sP $network | grep $host | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
scp /project/vpn_files/$host.ovpn docker@$ip:/home/docker/myvpn.ovpn
done
----
Ο master κόμβος αναλαμβάνει τον διαμοιρασμό των .ovpn αρχείων στα μέλη του Σμήνους με τέτοιο τρόπο ώστε κάθε host να έχει στο δικό του home directory το μοναδικό .ovpn αρχείο που
του αντιστοιχεί. Αξίζει να σημειωθεί ότι τα αρχεία μαζί με την μεταφορά τους μετονομάζονται σε myvpn.ovpn ώστε να είναι δυνατή η σύνδεση όλων των host στο VPN με μία μόνο εκτέλεση μέσω ansible.
{empty} +
Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 6 με αποτέλεσμα το ansible να εκτελέσει το playbook install_openvpn.yml
.install_openvpn.yml
----
---
- name: Install openvpn on all hosts
hosts: all_hosts
become: true
become_user: root
tasks:
- name: Installing openvpn
apt:
name: openvpn
state: present
----
Το playbook install_openvpn.yml αναλαμβάνει την εγκατάσταση του εργαλείου openvpn σε όλα τα μέλη του σμήνους(συμπεραλαμβανομένου του master).
{empty} +
.connect_to_vpn.sh
----
#!/bin/bash
nohup openvpn --config /home/docker/myvpn.ovpn &
----
Το script connect_to_vpn.sh συνδέει τον host που το εκτελεί στο VPN χρησιμοποιώντας το .ovpn file του.
{empty} +
Στη συνέχεια εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 7 με αποτέλεσμα το ansible να εκτελέσει το playbook connect_to_vpn.yml.
.connect_to_vpn.yml
----
- name: Connect to VPN
hosts: all_hosts
become: true
become_user: root
tasks:
- name: Transferring script connect_to_vpn.sh to every host
copy: src=/project/worker_scripts/connect_to_vpn.sh dest=/home/docker mode=0777
- name: Connecting to VPN
command: sh /home/docker/connect_to_vpn.sh
----
Το playbook connect_to_vpn.yml αναλαμβάνει την μεταφορά του script connect_to_vpn.sh στο οποίο αναφερθήκαμε νωρίτερα σε όλους τους hosts του σμήνους και το εκτελεί. Αποτέλεσμα είναι
η σύνδεση όλων των μελών στο VPN με αυτοματοποιημένο τρόπο.
{empty} +
Εκτελούμε την εντολή *ifconfig* στον master
----
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:1b:00:02 txqueuelen 0 (Ethernet)
RX packets 26486 bytes 44006148 (44.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29110 bytes 9171697 (9.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 21670 bytes 2146681 (2.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21670 bytes 2146681 (2.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.80.0.2 netmask 255.255.0.0 destination 10.80.0.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
----
Παρατηρούμε πως έχει δημιουργηθεί νέα κάρτα δικτύου τύπου tun και ότι ο master κατέχει την IP 10.80.0.2 στο VPN.
{empty} +
Στη συνέχεια εκτελούμε την εντολή *ifconfig* στον worker_1
----
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.3 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:1b:00:03 txqueuelen 0 (Ethernet)
RX packets 28626 bytes 32895662 (32.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14334 bytes 1342048 (1.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 10 bytes 877 (877.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 877 (877.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.80.0.5 netmask 255.255.0.0 destination 10.80.0.5
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
----
Πραγματοποιούμε ping ανάμεσα στους δύο host.
----
docker@7953b53e4903:~$ ping 10.80.0.2
PING 10.80.0.2 (10.80.0.2) 56(84) bytes of data.
64 bytes from 10.80.0.2: icmp_seq=1 ttl=64 time=0.312 ms
64 bytes from 10.80.0.2: icmp_seq=2 ttl=64 time=1.38 ms
64 bytes from 10.80.0.2: icmp_seq=3 ttl=64 time=0.704 ms
64 bytes from 10.80.0.2: icmp_seq=4 ttl=64 time=0.696 ms
64 bytes from 10.80.0.2: icmp_seq=5 ttl=64 time=0.409 ms
64 bytes from 10.80.0.2: icmp_seq=6 ttl=64 time=1.32 ms
64 bytes from 10.80.0.2: icmp_seq=7 ttl=64 time=0.659 ms
64 bytes from 10.80.0.2: icmp_seq=8 ttl=64 time=0.515 ms
64 bytes from 10.80.0.2: icmp_seq=9 ttl=64 time=1.27 ms
64 bytes from 10.80.0.2: icmp_seq=10 ttl=64 time=1.34 ms
----
Επομένως το VPN έχει υλοποιηθεί με επιτυχία.

546
project.html

@ -469,7 +469,12 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_τροποποίηση_ssh_server_στους_workers">3.5. Τροποποίηση ssh-server στους workers</a></li> <li><a href="#_τροποποίηση_ssh_server_στους_workers">3.5. Τροποποίηση ssh-server στους workers</a></li>
</ul> </ul>
</li> </li>
<li><a href="#_ssh_tunelling">4. SSH Tunelling</a></li> <li><a href="#_ssh_forwarding">4. SSH Forwarding</a>
<ul class="sectlevel2">
<li><a href="#_local_ssh_forwarding">4.1. Local SSH Forwarding</a></li>
<li><a href="#_remote_ssh_forwarding">4.2. Remote SSH Forwarding</a></li>
</ul>
</li>
<li><a href="#_vpn">5. VPN</a></li> <li><a href="#_vpn">5. VPN</a></li>
</ul> </ul>
</div> </div>
@ -563,7 +568,7 @@ nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '('
<p>Παραμετροποιεί κατάλληλα το config αρχείο του προγράμματος ansible</p> <p>Παραμετροποιεί κατάλληλα το config αρχείο του προγράμματος ansible</p>
</li> </li>
<li> <li>
<p>Εισάγει στο αρχείο inventory(το οποίο θα χρησιμοιηθεί από το ansible) δύο κατηγορίες χρηστών. Η πρώτη κατηγορία απευθύνεται στους workers του Σμήνους <p>Εισάγει στο αρχείο inventory(το οποίο θα χρησιμοποιηθεί από το ansible) δύο κατηγορίες χρηστών. Η πρώτη κατηγορία απευθύνεται στους workers του Σμήνους
ενώ η δεύτερη απευθύνεται σε όλους τους hosts</p> ενώ η δεύτερη απευθύνεται σε όλους τους hosts</p>
</li> </li>
</ul> </ul>
@ -966,7 +971,7 @@ target prot opt source destination</pre>
<div class="sect2"> <div class="sect2">
<h3 id="_εγκατάσταση_εργαλείου_thc_hydra">3.1. Εγκατάσταση Εργαλείου THC-Hydra</h3> <h3 id="_εγκατάσταση_εργαλείου_thc_hydra">3.1. Εγκατάσταση Εργαλείου THC-Hydra</h3>
<div class="paragraph"> <div class="paragraph">
<p>Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο HTC-Hydra στον master κόμβο με την εντολή <strong>sudo apt-get install hydra</strong>. Σε αυτό το σενάριο ο master θα αποτελέσει τον <p>Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο THC-Hydra στον master κόμβο με την εντολή <strong>sudo apt-get install hydra</strong>. Σε αυτό το σενάριο ο master θα αποτελέσει τον
επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης.</p> επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης.</p>
</div> </div>
<div class="paragraph"> <div class="paragraph">
@ -976,7 +981,7 @@ target prot opt source destination</pre>
<div class="sect2"> <div class="sect2">
<h3 id="_εκτέλεση_ssh_brute_force_attack">3.2. Εκτέλεση SSH Brute Force Attack</h3> <h3 id="_εκτέλεση_ssh_brute_force_attack">3.2. Εκτέλεση SSH Brute Force Attack</h3>
<div class="paragraph"> <div class="paragraph">
<p>Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς. Στη συνέχεια εκτελούμε το script ssh_brute_force.sh.</p> <p>Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς και εκτελούμε το script ssh_brute_force.sh.</p>
</div> </div>
<div class="listingblock"> <div class="listingblock">
<div class="title">ssh_brute_force.sh</div> <div class="title">ssh_brute_force.sh</div>
@ -1019,13 +1024,16 @@ Hydra (http://www.thc.org/thc-hydra) finished at 2021-01-24 20:47:59</pre>
</div> </div>
</div> </div>
<div class="paragraph"> <div class="paragraph">
<p>Παρατηρούμε ότι η επίθεση ολοκληρώθηκε με επιτυχία.</p>
</div>
<div class="paragraph">
<p><br></p> <p><br></p>
</div> </div>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_ανίχνευση_ssh_brute_force_attack">3.3. Ανίχνευση SSH Brute Force Attack</h3> <h3 id="_ανίχνευση_ssh_brute_force_attack">3.3. Ανίχνευση SSH Brute Force Attack</h3>
<div class="paragraph"> <div class="paragraph">
<p>Για την ανίχνευση του SSH Bruce Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh</p> <p>Για την ανίχνευση του SSH Brute Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh.</p>
</div> </div>
<div class="listingblock"> <div class="listingblock">
<div class="title">detect_ssh_brute_force.sh</div> <div class="title">detect_ssh_brute_force.sh</div>
@ -1052,13 +1060,13 @@ done</pre>
</div> </div>
</div> </div>
<div class="paragraph"> <div class="paragraph">
<p>Το script detect_ssh_brute_force.sh ελέγχει επαννελημένα το αποτέλεσμα της εντολής <strong>netstat -tn</strong> και όταν ο αριθμός συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι πάνω από 20 <p>Το script detect_ssh_brute_force.sh ελέγχει επαννελημένα το αποτέλεσμα της εντολής <strong>netstat -tn</strong> και όταν το πλήθος συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι μεγαλύτερο του 20
σταματάει την εκτέλεση του προγράμματος και εμφανίζει πληροφορίες σχετικά με την επίθεση.</p> σταματάει την εκτέλεση του προγράμματος και εμφανίζει πληροφορίες σχετικά με την επίθεση.</p>
</div> </div>
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre>Starting scan for SSH Brute Force Attacks <pre>Starting scan for SSH Brute Force Attacks
SSH Bruce Force Attack detected!!! SSH Brute Force Attack detected!!!
172.19.0.2 made 22 SSH connections at the same time 172.19.0.2 made 22 SSH connections at the same time
Data collected: Data collected:
@ -1094,12 +1102,162 @@ tcp 0 0 172.19.0.3:22 172.19.0.2:34512 ESTABLISHED<
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_αντιμετώπιση_ssh_brute_force_attack">3.4. Αντιμετώπιση SSH Brute Force Attack</h3> <h3 id="_αντιμετώπιση_ssh_brute_force_attack">3.4. Αντιμετώπιση SSH Brute Force Attack</h3>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Η αντιμετώπιση της επίθεσης θα γίνει μέσω ενός script που υλοποιήσαμε καθώς δεν καταφέραμε να παραμετροποιήσουμε κατάλληλα το εργαλείο fail2ban.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="listingblock">
<div class="title">block_ssh_brute_force.sh</div>
<div class="content">
<pre>#!/bin/bash
# must run with sudo!!!
while [ 1 ]
do
count=$(netstat -tn | awk '{print $4}' | grep :22 | wc -l)
if [ $count -gt 10 ]
then
attacker=$(netstat -tn | awk '{print $5}' | grep -v :22 | cut -d ':' -f1 | tail -1)
iptables -I INPUT -p tcp --dport 22 -s $attacker -m state --state NEW -j DROP
sleep 90
iptables -D INPUT -p tcp --dport 22 -s $attacker -m state --state NEW -j DROP
fi
sleep 1
done</pre>
</div>
</div>
<div class="paragraph">
<p>Το script block_ssh_brute_force.sh έχει σκοπό την αντιμετώπιση της επίθεσης SSH Brute Force. Ελέγχει επαννελημένα το αποτέλεσμα της εντολής <strong>netstat -tn</strong> και όταν το πλήθος συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι μεγαλύτερο του 10 προσθέτει κατάλληλο κανόνα στο iptalbes ώστε να μην επιτρέπει στο επιτιθέμενο να πραγματοποιήσει καινούργιες συνδέσεις. Τέλος μετά από ένα διάστημα 90 δευτερολέπτων διαγράφει τον κανόνα από το iptables και συνεχίσει τον έλεγχο ώστε να εντοπίσει τυχόν νέες επιθέσεις.</p>
</div>
<div class="paragraph">
<p>Εκτελούμε το script block_ssh_brute_force.sh και ξεκινάμε την επίθεση από τον master στον worker_1.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (http://www.thc.org/thc-hydra) starting at 2021-01-25 00:55:05
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 200 login tries (l:1/p:200), ~13 tries per task
[DATA] attacking ssh://172.27.0.3:22/
[STATUS] 139.00 tries/min, 139 tries in 00:01h, 94 to do in 00:01h, 16 active
1 of 1 target completed, 0 valid passwords found
[WARNING] Writing restore file because 1 final worker threads did not complete until end.
[ERROR] 1 target did not resolve or could not be connected
[ERROR] 16 targets did not complete
Hydra (http://www.thc.org/thc-hydra) finished at 2021-01-25 00:56:43</pre>
</div>
</div>
<div class="paragraph">
<p>Παρατηρούμε ότι η επίθεση ήταν ανεπιτυχής.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- project_master_1.project_net anywhere tcp dpt:22 state NEW
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination</pre>
</div>
</div>
<div class="paragraph">
<p>Επίσης στο iptables έχει προστεθεί κανόνας για τον αποκλεισμό του επιτιθέμενου.</p>
</div>
<div class="paragraph"> <div class="paragraph">
<p><br></p> <p><br></p>
</div> </div>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_τροποποίηση_ssh_server_στους_workers">3.5. Τροποποίηση ssh-server στους workers</h3> <h3 id="_τροποποίηση_ssh_server_στους_workers">3.5. Τροποποίηση ssh-server στους workers</h3>
<div class="listingblock">
<div class="title">generate_keys.sh</div>
<div class="content">
<pre>#!/bin/bash
ssh-keygen -t rsa
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
hosts=$(nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
for ip in $hosts
do
ssh-copy-id docker@$ip
done</pre>
</div>
</div>
<div class="paragraph">
<p>Αρχικά ο master δημιουργεί και μεταφέρει τα SSH κλειδιά στους workers του Σμήνους.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="listingblock">
<div class="title">configure_ssh.sh</div>
<div class="content">
<pre>#!/bin/bash
echo "PasswordAuthentication no" &gt;&gt; /etc/ssh/sshd_config
echo "PubkeyAuthentication yes" &gt;&gt; /etc/ssh/sshd_config
service ssh restart</pre>
</div>
</div>
<div class="paragraph">
<p>Ένα από τα scripts που μεταφέρθηκαν στους workers μέσω του ansible ήταν το configure_ssh.sh. Το συγκεκριμένο script τροποποιεί κατάλληλα το config αρχείο του SSH ώστε να επιτρέπει
συνδέσεις μόνο με κλειδί και επανεκκινεί την υπηρεσία ώστε να λάβουν χώρα οι αλλαγές.</p>
</div>
<div class="paragraph">
<p>Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 5 με αποτέλεσμα το ansible να εκτελέσει το playbook configure_ssh.yml.</p>
</div>
<div class="listingblock">
<div class="title">configure_ssh.yml</div>
<div class="content">
<pre>---
- name: Configure ssh on workers
hosts: workers
become: true
become_user: root
tasks:
- name: Configuring ssh
command: sh /home/docker/configure_ssh.sh</pre>
</div>
</div>
<div class="paragraph">
<p>Το playbook configure_ssh.yml αναλαμβάνει να εκτελέσει το script configure_ssh.sh σε όλους τους workers. Επομένως πραγματοποιείται ταυτόχρονη παραμετροποίηση των ssh-server στους workers.</p>
</div>
<div class="paragraph">
<p>Εκτελούμε για μία τελευταία φορά την επίθεση.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (http://www.thc.org/thc-hydra) starting at 2021-01-24 23:07:20
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 200 login tries (l:1/p:200), ~13 tries per task
[DATA] attacking ssh://172.19.0.3:22/
[ERROR] target ssh://172.19.0.3:22/ does not support password authentication.</pre>
</div>
</div>
<div class="paragraph">
<p>Παρατηρούμε πως το εργαλείο THC-Hydra εμφανίζει μήνυμα ότι η επίθεση δεν ήταν επιτυχής καθώς ο στόχος επιτρέπει σύνδεση μόνο με κλειδί.</p>
</div>
<div class="paragraph"> <div class="paragraph">
<p><br></p> <p><br></p>
</div> </div>
@ -1107,28 +1265,394 @@ tcp 0 0 172.19.0.3:22 172.19.0.2:34512 ESTABLISHED<
</div> </div>
</div> </div>
<div class="sect1"> <div class="sect1">
<h2 id="_ssh_tunelling">4. SSH Tunelling</h2> <h2 id="_ssh_forwarding">4. SSH Forwarding</h2>
<div class="sectionbody"> <div class="sectionbody">
<div class="sect2">
<h3 id="_local_ssh_forwarding">4.1. Local SSH Forwarding</h3>
<div class="paragraph">
<p>Σκοπός του Local SSH Forwarding είναι η προώθηση μίας υπηρεσίας στον client(worker_1) από τον Server(master) μέσω μιας πόρτας δημιουργώντας ένα tunnel μέχρι τον Server.</p>
</div>
<div class="listingblock">
<div class="title">start_local_ssh_forwarding.sh</div>
<div class="content">
<pre>#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
target=$(nmap -sP $network | grep master | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
ssh -fNT -L 8080:$target:8000 docker@$target</pre>
</div>
</div>
<div class="paragraph">
<p>Αρχικά ο worker βρίσκει δυναμικά την IP διεύθυνση του server και πραγματοποιεί Local SSH Forwarding από την πόρτα 8000 του server στην τοπική του πόρτα 8080.</p>
</div>
<div class="paragraph">
<p>Εκτελούμε το script στον worker_1 και πραγματοποιούμε HTTP request με το εργαλείο curl.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker@73e8f80f638f:~$ curl http://localhost:8080
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;*Beep boop* the server is up and running&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
</div>
<div class="paragraph">
<p><br></p>
</div>
</div>
<div class="sect2">
<h3 id="_remote_ssh_forwarding">4.2. Remote SSH Forwarding</h3>
<div class="paragraph">
<p>Σκοπός του Remote SSH Forwarding είναι η προώθηση μίας υπηρεσίας μέσω πόρτας από τον Server(master) στον client(worker_1) δημιουργώντας ένα tunnel μέχρι τον client.</p>
</div>
<div class="listingblock">
<div class="title">start_remote_ssh_forwarding.sh</div>
<div class="content">
<pre>#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
target=$(nmap -sP $network | grep worker_1 | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
ssh -fNT -R 8080:localhost:8000 docker@$target</pre>
</div>
</div>
<div class="paragraph"> <div class="paragraph">
<p>todo</p> <p>Αρχικά ο master βρίσκει δυναμικά την IP διεύθυνση του worker_1 και πραγματοποιεί Remote SSH Forwarding από την πόρτα 8000 του server στην πόρτα 8080 του client.</p>
</div>
<div class="paragraph">
<p>Εκτελούμε το script στον master και πραγματοποιούμε HTTP request από τον worker_1 με το εργαλείο curl.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker@73e8f80f638f:~$ curl http://localhost:8080
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;*Beep boop* the server is up and running&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
</div> </div>
<div class="paragraph"> <div class="paragraph">
<p><br></p> <p><br></p>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="sect1"> <div class="sect1">
<h2 id="_vpn">5. VPN</h2> <h2 id="_vpn">5. VPN</h2>
<div class="sectionbody"> <div class="sectionbody">
<div class="paragraph"> <div class="paragraph">
<p>todo</p> <p>Σκοπός του ζητούμενου είναι η δημιουργία Virtual Private Network καθώς και η σύνδεση των μελών του Σμήνους σε αυτό.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Τα πρώτα βήματα για την υλοποίηση του VPN εκτελούνται στο σύστημα που φιλοξενεί το docker και όχι μέσα στο Σμήνος.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Αρχικά τροποποιούμε το αρχείο extra_lines κατάλληλα.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>client
nobind
dev tun
comp-lzo
resolv-retry infinite
keepalive 15 60
remote-cert-tls server
remote 192.168.1.169 1194 udp &lt;-- Αλλάζουμε την IP σε αυτήν του κανονικού μας συστήματος.
float</pre>
</div>
</div>
<div class="paragraph">
<p>Στην συνέχεια εκτελούμε από το δικό μας σύστημα το script initiate-vpn.sh το οποίο έχει συνταχθεί σύμφωνα με τις <a href="http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/ex-5_iptables.adoc.html">οδηγίες</a> του εργαστηρίου</p>
</div>
<div class="listingblock">
<div class="title">initiate-vpn.sh</div>
<div class="content">
<pre>#!/bin/bash
IP=127.0.0.1 # Server IP
P=1194 # Server Port
OVPN_SERVER='10.80.0.0/16' # VPN Network
#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/ # Dir to save data ** this must exist **
vpn_data=$PWD/openvpn-services/
if [ ! -d $vpn_data ]; then
mkdir -p $vpn_data
fi
NAME=swarmlab-vpn-services # name of docker service
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
# create pki see ovpn_initpki
docker run --net=none -v $vpn_data:/etc/openvpn --rm -it $docker ovpn_initpki
# 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
sudo sysctl -w net.ipv4.ip_forward=1
#show created
docker ps
echo -e "\nEnter the full path of the directory you want to copy the .ovpn files to: "
read path
for USERNAME in master worker_1 worker_2 worker_3 worker_4
do
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 &gt; $USERNAME.ovpn
tail -n +8 $USERNAME.ovpn &gt; temp &amp;&amp; cat temp &gt; $USERNAME.ovpn
cat $USERNAME.ovpn &gt; temp &amp;&amp; cat extra_lines &gt; $USERNAME.ovpn &amp;&amp; cat temp &gt;&gt; $USERNAME.ovpn
mv $USERNAME.ovpn $path
done</pre>
</div>
</div>
<div class="paragraph">
<p>Το script initiate-vpn.sh αναλαμβάνει την κατασκευή του VPN καθώς και την δημιουργία χρηστών για αυτό. Δημιουργούνται συνολικά πέντε χρήστες που αντιστοιχούν στα μέλη του σμήνους ενώ στην
συνέχεια πραγματοποιούνται οι κατάλληλες τροποποιήσεις πάνω στα .ovpn αρχεία του καθενός. Τέλος τα .ovpn αρχεία μεταφέρονται στον κοινόχρηστο φάκελο του Σμήνους.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Τα επόμενα βήματα εκτελούνται από τα μέλη του Σμήνους
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">transfer_vpn_files.sh</div>
<div class="content">
<pre>#!/bin/bash
network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
network="$network.*"
cp /project/vpn_files/master.ovpn /home/docker/myvpn.ovpn
for host in worker_1 worker_2 worker_3 worker_4
do
ip=$(nmap -sP $network | grep $host | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
scp /project/vpn_files/$host.ovpn docker@$ip:/home/docker/myvpn.ovpn
done</pre>
</div>
</div>
<div class="paragraph">
<p>Ο master κόμβος αναλαμβάνει τον διαμοιρασμό των .ovpn αρχείων στα μέλη του Σμήνους με τέτοιο τρόπο ώστε κάθε host να έχει στο δικό του home directory το μοναδικό .ovpn αρχείο που
του αντιστοιχεί. Αξίζει να σημειωθεί ότι τα αρχεία μαζί με την μεταφορά τους μετονομάζονται σε myvpn.ovpn ώστε να είναι δυνατή η σύνδεση όλων των host στο VPN με μία μόνο εκτέλεση μέσω ansible.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="paragraph">
<p>Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 6 με αποτέλεσμα το ansible να εκτελέσει το playbook install_openvpn.yml</p>
</div>
<div class="listingblock">
<div class="title">install_openvpn.yml</div>
<div class="content">
<pre>---
- name: Install openvpn on all hosts
hosts: all_hosts
become: true
become_user: root
tasks:
- name: Installing openvpn
apt:
name: openvpn
state: present</pre>
</div>
</div>
<div class="paragraph">
<p>Το playbook install_openvpn.yml αναλαμβάνει την εγκατάσταση του εργαλείου openvpn σε όλα τα μέλη του σμήνους(συμπεραλαμβανομένου του master).</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="listingblock">
<div class="title">connect_to_vpn.sh</div>
<div class="content">
<pre>#!/bin/bash
nohup openvpn --config /home/docker/myvpn.ovpn &amp;</pre>
</div>
</div>
<div class="paragraph">
<p>Το script connect_to_vpn.sh συνδέει τον host που το εκτελεί στο VPN χρησιμοποιώντας το .ovpn file του.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="paragraph">
<p>Στη συνέχεια εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 7 με αποτέλεσμα το ansible να εκτελέσει το playbook connect_to_vpn.yml.</p>
</div>
<div class="listingblock">
<div class="title">connect_to_vpn.yml</div>
<div class="content">
<pre>- name: Connect to VPN
hosts: all_hosts
become: true
become_user: root
tasks:
- name: Transferring script connect_to_vpn.sh to every host
copy: src=/project/worker_scripts/connect_to_vpn.sh dest=/home/docker mode=0777
- name: Connecting to VPN
command: sh /home/docker/connect_to_vpn.sh</pre>
</div>
</div>
<div class="paragraph">
<p>Το playbook connect_to_vpn.yml αναλαμβάνει την μεταφορά του script connect_to_vpn.sh στο οποίο αναφερθήκαμε νωρίτερα σε όλους τους hosts του σμήνους και το εκτελεί. Αποτέλεσμα είναι
η σύνδεση όλων των μελών στο VPN με αυτοματοποιημένο τρόπο.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="paragraph">
<p>Εκτελούμε την εντολή <strong>ifconfig</strong> στον master</p>
</div>
<div class="listingblock">
<div class="content">
<pre>eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500
inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:1b:00:02 txqueuelen 0 (Ethernet)
RX packets 26486 bytes 44006148 (44.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29110 bytes 9171697 (9.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt; mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 21670 bytes 2146681 (2.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21670 bytes 2146681 (2.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun0: flags=4305&lt;UP,POINTOPOINT,RUNNING,NOARP,MULTICAST&gt; mtu 1500
inet 10.80.0.2 netmask 255.255.0.0 destination 10.80.0.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</pre>
</div>
</div>
<div class="paragraph">
<p>Παρατηρούμε πως έχει δημιουργηθεί νέα κάρτα δικτύου τύπου tun και ότι ο master κατέχει την IP 10.80.0.2 στο VPN.</p>
</div>
<div class="paragraph">
<p><br></p>
</div>
<div class="paragraph">
<p>Στη συνέχεια εκτελούμε την εντολή <strong>ifconfig</strong> στον worker_1</p>
</div>
<div class="listingblock">
<div class="content">
<pre>eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500
inet 172.19.0.3 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:1b:00:03 txqueuelen 0 (Ethernet)
RX packets 28626 bytes 32895662 (32.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14334 bytes 1342048 (1.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt; mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 10 bytes 877 (877.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 877 (877.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun0: flags=4305&lt;UP,POINTOPOINT,RUNNING,NOARP,MULTICAST&gt; mtu 1500
inet 10.80.0.5 netmask 255.255.0.0 destination 10.80.0.5
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</pre>
</div>
</div>
<div class="paragraph">
<p>Πραγματοποιούμε ping ανάμεσα στους δύο host.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker@7953b53e4903:~$ ping 10.80.0.2
PING 10.80.0.2 (10.80.0.2) 56(84) bytes of data.
64 bytes from 10.80.0.2: icmp_seq=1 ttl=64 time=0.312 ms
64 bytes from 10.80.0.2: icmp_seq=2 ttl=64 time=1.38 ms
64 bytes from 10.80.0.2: icmp_seq=3 ttl=64 time=0.704 ms
64 bytes from 10.80.0.2: icmp_seq=4 ttl=64 time=0.696 ms
64 bytes from 10.80.0.2: icmp_seq=5 ttl=64 time=0.409 ms
64 bytes from 10.80.0.2: icmp_seq=6 ttl=64 time=1.32 ms
64 bytes from 10.80.0.2: icmp_seq=7 ttl=64 time=0.659 ms
64 bytes from 10.80.0.2: icmp_seq=8 ttl=64 time=0.515 ms
64 bytes from 10.80.0.2: icmp_seq=9 ttl=64 time=1.27 ms
64 bytes from 10.80.0.2: icmp_seq=10 ttl=64 time=1.34 ms</pre>
</div>
</div>
<div class="paragraph">
<p>Επομένως το VPN έχει υλοποιηθεί με επιτυχία.</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Last updated 2021-01-24 23:14:47 +0200 Last updated 2021-01-25 02:49:07 +0200
</div> </div>
</div> </div>
</body> </body>

2
src/worker_scripts/detect_ssh_brute_force.sh

@ -7,7 +7,7 @@ do
if [ $count -gt 20 ] if [ $count -gt 20 ]
then then
attacker=$(netstat -tn | awk '{print $5}' | grep -v :22 | cut -d ':' -f1 | tail -1) attacker=$(netstat -tn | awk '{print $5}' | grep -v :22 | cut -d ':' -f1 | tail -1)
echo "SSH Bruce Force Attack detected!!!" echo "SSH Brute Force Attack detected!!!"
echo "$attacker made $count SSH connections at the same time" echo "$attacker made $count SSH connections at the same time"
echo -e echo -e

Loading…
Cancel
Save