Jak skonfigurować automatyczną wysyłkę / odbiór SMS-ów pod Linuksem?

24 czerwca 2013, 10:15 | Narzędzia, Teksty | komentarzy 6
Tagi: ,
: zin o bezpieczeństwie - pobierz w pdf/epub/mobi.

Wstęp

Na jedno z moich szkoleń z bezpieczeństwa przygotowałem swego czasu ćwiczenie, polegające na wykorzystaniu pewnych błędów aplikacyjnych używając w tym celu realnych SMS-ów (to znaczy uczestnicy aby rozwiązać ćwiczenie muszą użyć swoich komórek – również tych szarych ;-). Jak jednak zorganizować niewielkim kosztem w LAB infrastrukturę umożliwiającą na żywo wysyłkę / odbiór SMS-ów, a także ich przetwarzanie i odpowiednie reagowanie jeśli zajdzie określona sytuacja?

Pierwsze co mi przyszło do głowy, to darmowe rozwiązanie gammu. Jakie ma możliwości to oprogramowanie? Sami twórcy opisują je tak:

Gammu command line utility provides access to wide range of phone features, however support level differs from phone to phone (…) Generally following features are supported:

  • Call listing, initiating and handling
  • SMS retrieval, backup and sending
  • MMS retrieval
  • Phonebook listing, export and import (also from standard formats such as vCard)
  • Calendar and tasks listing, export and import (also from standard formats such as vCalendar or iCalendar)
  • Retrieval of phone and network information
  • Access to phone file system (note that some phones work also as USB storage devices and those are not accessible through Gammu)

Opcja dotycząca SMS-ów wydaje się być idealna pod nasze potrzeby. Co więcej w ramach gammu dostępny jest monitor komunikacji SMS o nazwie smsd:

Gammu SMS Daemon is a program that periodically scans GSM modem for received messages, stores them in defined storage and also sends messages enqueued in this storage. It is perfect tool for managing big amounts of received or sent messages and automatically process them.

Wskazanym w powyższym cytacie ‚storage’ może być bazą danych (np. MySQL). Finalnie, kiedy więc przyjdzie na nasz numer wiadomość SMS, smsd automatycznie wpisuje odpowiedni rekord do bazy (zawierający dane SMS-a). Z kolei gdy chcemy SMS-a wysłać, po prostu robimy jednego INSERT-a do konkretnej tabeli – reszta dzieje się automatycznie. Proste? Wydaje się że tak :-) Architektura rozwiązania wygląda tak:

gammu

Zabieramy się do pracy

Akurat pod ręką miałem stary telefon Nokia 6300, który jest na liście wspieranego przez gammu sprzętu. Wyposażyłem go w prepaidową kartę SIM za 5 zł, dającą własny numer oraz możliwość wysłania w tej kwocie dość dużej liczby SMS-ów.

Po podłączeniu telefonu kablem USB do komputera zacząłem testy. Tu niestety napotkałem na pewne problemy. O ile działało wysyłanie SMS-ów z konsoli:

…to z odbieraniem nie było już tak różowo. Ściągnąłem więc wersję deweloperską gammu, po skompilowaniu której… pomogło :-) W tym momencie byłem w stanie zarówno wysyłać jak i odbierać SMS-y. Wystarczyło tylko uruchomić oraz skonfigurować smsd.

Tutaj niestety pojawiły się kolejne schody (oszczędzę na razie szczegółów konfiguracyjnych) – smsd był w stanie tylko wysyłać SMS-y (bez możliwości odbioru). W końcu, po spędzeniu dłuższego czasu na listach dyskusyjnych gammu, stwierdziłem że prawdopodobnie jest to bug w obsłudze telefonu Nokia 6300 i prościej niż patchować smsd będzie poszukać innego sprzętu.

Stanęło tym razem na popularnym modemie Huavei E173, który akurat miałem pod ręką (jest dość popularnym urządzeniem w ofercie jednego z operatorów GSM). Sprzęt miał już z 2 lata więc miałem nadzieję, że jeszcze działa :-)

W systemie modem został wykryty:

Jak wydać powyżej parametry modemu to  12d1:1446 (tj. productID = 12d1, vendorID = 1446). Szczegóły wyglądają tak:

Problem w tym, że nie byłem go w żaden sposób zmusić do współpracy z gammu. Okazuje się, że domyślnie urządzenie to działa pod Linuksem w trybie storage USB – czyli jako pendrive, a nie jako potrzebny mi modem. Szybkie googlanie pokazało rozwiązanie problemu. Użyjmy więc polecanego wyżej narzędzia usb_modeswitch:

I wykorzystajmy taki plik konfiguracyjny:

Pozostaje tylko wypróbować ustawienia:

Ostatnia linijka wygląda zachęcająco, zobaczmy czy posiadamy już wirtualne urządzenie, przez które moglibyśmy się odwołać do modemu:

Spróbujemy więc przygotować odpowiednio .gammurc:

Z tymi ustawieniami wysyłka SMSów…działa! :-)

Teraz pozostaje nam konfiguracja i przetestowanie smsd. Do zbudowania bazy MySQL użyłem schematu dostępnego tutaj: gammu-1.32.0/docs/sql/mysql.sql

Z kolei moja konfiguracja smsd wygląda tak:

Po starcie smsd, jego logi wyglądają zachęcająco:

Czas teraz na finalne testy:

Pokazana wyżej tabela outbox jest skanowana cyklicznie przez smsd w poszukiwaniu nowych rekordów. Jeśli takowy zostanie znaleziony – SMS jest wysyłany. Jak więc wysłać SMS-a? Na przykład tak:

Tak można z kolei odczytać SMS-y, które ktoś do nas przysłał (poniżej SMS o treści „Aaa”):

 

Pozostało mi już tylko wykonać skrypty łączące się bazą i realizujące logikę, którą zaplanowałem do realizacji jednego z ćwiczeń :-)

Całość w działaniu wygląda całkiem niepozornie…:j2

 

Użyte w tekście numery GSM są „losowe” – we własnych testach należy użyć własnych numerów :-)

PS

Zmianę trybu można zautomatyzować poprzez stworzenie pliku: /etc/usb_modeswitch.d/12d1:1446 o zawartości:

 

–michal.sajdak<at>securitum.pl

 

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Adam
    Odpowiedz
    • @Adam – wygląda ciekawie, choć nie widzę czegoś jak smsd (+ połączenie jego z bazą)?
      –ms

      Odpowiedz
  2. p

    Przy niektórych modemach zamiast usb_modeswitch można (a nawet trzeba) użyć polecenia… eject z odpowiednimi parametrami.

    Odpowiedz
  3. Odpowiedz
  4. gammu-smsd najlepiej do kompletu pilnować przy pomocy monit, bo jeśli jednocześnie używamy gammu-smsdi np. okazyjnie wvdial do wdzwaniania się do netu, gammu-smsd lubi się wysypać z powodu braku dostępu do /dev/ttyUSB0.

    Odpowiedz
  5. Emil

    Mam pytanie. Robię tak jak w poradniku czyli przełączam mój ZTE w tryb modemu. Wywala error, ale się urządzenie przełącza w tryb modemu (zaczyna świecić na niebiesko). Ale wyświetla się jako ttyACM0, ttyACM1 i ttyACM2. To normalne?

    A i da się to jakoś zautomatyzować po restarcie komputera? Czasem muszę robić to jeszcze raz a gdy usługa ma działać cały czas bez ingerencji muszę to jakoś albo scalić na stałe albo monitorwać. Macie jakiś pomysł?

    Odpowiedz

Odpowiedz