Wyszukiwanie adresów MAC

Tekst przeniesiony z like-a-geek.jogger.pl.

Ostatnio napisałem, w jaki sposób można zmienić adres IP na wybrany przez siebie (w granicach jednej podsieci).

Widocznie wiedza ta jest publicznie dostępna, bo odzew nie był najlepszy, ale jednak był – w sumie to nie spodziewałem się tych 11 komentarzy po pierwszym poście na joggerze. Mimo to, postanowiłem kontynuować – cóż, jeśli dla was poruszana tematyka to banał proszę o konstruktywną krytykę (jak ostatnio night) albo niezawracanie sobie głowy tym wpisem – podkreślam, że nie każdy zna na pamięć wszystkie opcje nmapa.

Jak pisałem ostatnio, żeby podszyć się pod wybrane IP potrzebny jest numer MAC karty sieciowej znajdującej się w danym urządzeniu i służący do identyfikacji go w sieci. Do wyszukania adresów użyjemy popularnego programu nmap, służącego głównie do skanowania portów, chociaż nam przyda się jedna z dodatkowych opcji programu – właśnie wyświetlenie maka. Kod przedstawia się następująco:

  1. #!/bin/bash
  2. #skrypt pobrany ze strony www.like-a-geek.jogger.pl
  3. #prosze nie usuwac komentarzy
  4. TWOJEIP=”1.2.3.”
  5. znane=`cat input | sed -e „s/ .*//g” | sed -e „s/$TWOJEIP//g” | tr ‚12’ ‚ ‚`
  6. znane=($znane)
  7. ilosc=${#znane[@]}
  8. i=1
  9. while [ $i -lt 255 ]; do
  10.  j=0
  11.  znam=0
  12.  while [ $j -lt ${ilosc} -a $znam -eq 0 ]; do
  13.   if [ $i -eq ${znane[$j]} ];
  14.   then
  15.    znam=1
  16.   else
  17.    znam=0
  18.   fi
  19.  j=$[j+1]
  20.  done
  21. if [ $znam -eq 0 ];
  22. then
  23.  mac=`arping -c 1 -I eth0 ${TWOJEIP}$i | grep ${TWOJEIP}$i | sed -e „s/.*[//” | sed -e „s/].*//”`
  24.  if [ ${#mac} -gt 50 ];
  25.  then
  26.   mac=`echo $mac | sed -e „s/.*00/00/”`
  27.   echo -n ${TWOJEIP}$i’ ‚ >> input
  28.   echo $mac >> input
  29.   #echo -e -n ‚E[32;49m’
  30.   #echo -n ${TWOJEIP}$i’ ‚
  31.   #echo $mac
  32.   #echo -e -n ‚E[0m’
  33.  fi
  34. fi
  35. i=$[i+1]
  36. done

Uwaga! Należy podać początek własnego IP w czwartej linii. Skrypt zacznie wyszukiwanie nowych adresów, których nie ma jeszcze w pliku input i doda je do tego pliku. Aby zobaczyć na konsoli znalezione adresy należy odkomentować linijki 21-34. Głównym elementem skryptu jest komenda nmap – to ona odczytuje za nas adresy kart sieciowych. Niestety, nmap generuje bardzo dużo ruchu w sieci, więc nie jest lubiony przez administratorów – i ani trochę im się nie dziwię. Żeby nie przeciążać za bardzo sieci i jednocześnie nie zwracać na siebie uwagi dodałem do nmapa kilka opcji:

  • –host-timeout 60s – maksymalny czas, jaki może zająć skanowanie. Dlaczego tak długo? Nie zależy nam na szybkości, a część maszyn odpowiada koszmarnie długo (zdarzały mi się nawet odpowiedzi pięciominutowe)
  • -sS – standardowy tryb pracy
  • -p $port – port, na którym skanujemy. Port jest losowy, żeby nie generować zbyt nienaturalnego ruchu, a tylko jeden z prostego powodu – to wystarczające dla naszych celów minimum. Nie obchodzi nas co jest uruchomione na komputerach, ani jakie porty mają otwarte, tylko ich maki.
  • –data-length $dlugosc – długość przesyłanych danych również będzie losowa, żeby wyglądoło to w miarę naturalnie.

Dodam jeszcze, że parametry, z którymi uruchamiamy nmapa nie muszą być specjalnie losowe, więc sposób ich „losowania” jest bardzo prosty – pobieramy aktualny czas (w nanosekunach). Poza tym szkoda mi marnować liczb z /dev/random na takie rzeczy. Jestem prawie pewien, że przeprowadzane skanowanie nie jest nielegalne ani nawet zabronione przez administratorów, ale mimo to nie ma sensu za bardzo przeciążać sieci. Jeśli macie jakieś propozycje, żeby jeszcze bardziej zoptymalizować skanowanie piszcie, na pewno ustalimy, które parametry są najbardziej przydatne – jest ich dobre kilkadziesiąt, ale właśnie taka konfiguracja sprawdza się całkiem nieźle.

Aktualizacja:

Po widocznej w komentarzach dyskusji, przejrzeniu manuali i paru próbach doszedłem do innej, bezpieczniejszej wersji skryptu. Początek jest taki sam, więc zamieniam tylko nmap na arping i jedną linijkę odpowiedzialną za zapisywanie wyników. Dla zainteresowanych poprzednia wersja linii od 23 w górę:

  • .
  • .
  • .
  •  port=`echo $(date +%N)`
  •  port=${port:5:4}
  •  dlugosc=${port:2:2}
  •  mac=`sudo nmap –host-timeout 300s -sS -p $port –data-length $dlugosc ${TWOJEIP}$i | grep MAC | cut -b 14-30`
  •  if [ ${#mac} -gt 0 ];
  •  then
  •   echo -n ${TWOJEIP}$i’ ‚ >> input
  •   echo $mac >> input
  •  fi
  • fi
  • sleep 1
  • i=$[i+1]
  • done

Uwaga!Nie zalecam tej wersji, przedstawiona wyżej jest trudniejsza do wykrycia i generalnie prostsza