Alerty i komunikaty serwerów QNAP wysyłane za pośrednictwem darmowych bramek SMS polskich operatorów komórkowych.
2013, Silas Mariusz
2013, Silas Mariusz
UWAGA! Artykuł niekompletny - cdn.!
[Wstęp; Powiadomienia i Plus GSM]
Użytkownicy sieci Plus GSM przez długi okres czasu mogli cieszyć się komunikatami alertów dostarczanymi na ich telefony komórkowe SMS’em za pośrednictwem oferowanej przez sieć darmowej usłudze E-mail to SMS. Wystarczyło w ustawieniach powiadomień serwera QNAP NAS wprowadzić, jako drugi adres email odbiorcy +48xxxxxxxxx@text.plusgsm.pl zawierający poprawny numer telefonu. Cała treść alertu była dostarczana błyskawicznie na wskazany numer telefonu komórkowego. Niestety po przeprowadzonej przez sieć modernizacji, alerty z serwerów QNAP wysyłane na adres usługi Email2SMS przestały być dostarczane - i tak jest do dziś! Ale z kolei email wsłany z programu Outlook zostanie dostarczony poprawnie!
Co się stało? Dotychczas usługa Email przez SMS wymagała, aby w nagłówku źródłowym wiadomości email znajdowały się wyłącznie podstawowe informacje niezbędne do skomponowania wiadomości.
Kod:
From: "Silas Mariusz" <silas@qnaphacking.pl>
To: <qnap@syndicat.pl>
Subject: Temat przesylanej wiadomości
Można przypuszczać, że sieć Plus GSM, aby ustrzec się przed nadmiernym wykorzystywaniem usługi wprowadziła modyfikacje wymagającą unikalne ID dla każdej nadawanej treści. A więc, aby korzystać z powiadomień SMS, należałoby dodać brakujący nagłówek w wysyłanym z serwera emailu:
Kod:
Message-ID: <$DATESTAMP.$MID@qnaphacking.pl>
[Konkluzja]
Modyfikujemy sendmail. Ale skoro brniemy tak daleko i będziemy nadawać wiadomościom unikalny identyfikator to, dlaczego od razu nie połączyć tego z programem obsługującym bramki SMS polskich sieci komórkowych GSM?
[Teoria]
Przechwycić przekazywaną wiadomość do linux’owego programu sendmail będącego klientem SMTP ustalonego przez nas serwera poczty wychodzącej i:
- zmodyfikować w locie treść wiadomości nadając jej dodatkowy identyfikator umożliwiający ponowne korzystanie z usługi Email przez SMS w sieci Plus GSM,
- oraz treść komunikatu przekazać do zewnętrznego programu obsługującego bramki internetowe SMS i nadać na wybrane numery telefonów.
[Zadanie]
- podmienić sendmail na własny skrypt,
- napisać skrypt zastępujący sendmail i do przechwyconej wiadomości dodać unikalny identyfikator z domeną maila nadawcy SMTP
- w skrypcie przesłać zmodyfikowaną wiadomość email do prawidłowego sendmail
- przekazać treść wiadomości do programu wysyłającego SMS za pośrednictwem bramek internetowych
- dodać do autostartu serwera skrypt podmieniający sendmail na własny oraz wysłać powiadomienie Hello world!
[Wymagania]
- Znajomość podstaw linux’a,
- Serwer QNAP NAS
- PuTTY lub inny klient SSH,
- zainstalowane i uruchomione Optware (z Centrum Aplikacji).
[Ćwiczenie]
- Zainstalować i uruchomić Optware.
- Za pomocą PuTTY połączyć się przez SSH z serwerem QNAP NAS.
- Aby ułatwić sobie pracę w konsoli zaczniemy od instalacji niezbędnych narzędzi:
Bash:ipkg update ipkg upgrade ipkg install mc tmux screen tree zip unrar dtach bash htop atop
- Następnie szukamy ścieżki do zamontowanego woluminu dysku twardego, na którym utworzymy modyfikacje.
Bash:SHAREPUBLIC=$(/sbin/getcfg Public path -f /etc/config/smb.conf) VOLROOT=$(cd $SHAREPUBLIC ; cd .. ; pwd) cd $VOLROOT
- Na zamontowanym woluminie (np. /share/HDA_DATA albo /share/MD0_DATA) tworzymy strukturę katalogów, w których umieścimy nasze programy:
Bash:mkdir -p rootils rootils/autorun-delegated rootils/smssender cd $VOLROOT/rootils
- Piszemy program sendmail-mod, który będzie działał jako tzw. catcher wiadomości i przekazywał zmodyfikowaną w nagłówkach wiadomość do prawidłowego sendmail. Zaczniemy od tworzenia pliku oraz nadania odpowiednich praw (+x execute / wykonywalny)
Bash:mkdir -p sendmail-alt cd sendmail-alt touch sendmail-mod chmod +x sendmail-mod
- Edytujemy utworzony plik za pomocą ulubionego edytora (np. mcedit) lub za pomocą klasycznego vi. Alternatywnym jak nasz sendmail słownikiem mówiąc, w konsoli klepiemy:
Bash:vi sendmail-mod
Bash:#!/usr/bin/env sh : ${DEBUG:=1} ## ########################################################################### ## (SENDMAIL) MAIL CONTENT MODIFIER ## ########################################################################### ## Version: v1.1 ## Author: Silas Mariusz ## Contact: silas [-_-] qnap.com | silas [-_-] qnapclub.pl ## Web: https://forum.qnap | https://forum.qnap.com ## ########################################################################### ## My QPKG name? ## ########################################################### MYNAME ######## MY_QPKG_NAME=rootils RETVAL=0 ## Get my name and locate me ## ########################################################### INITIAL ####### PROGNAME=`type $0 | awk '{print $3}'` # search for executable on path PROGDIR=`dirname $PROGNAME` # extract directory of program PROGNAME=`basename $PROGNAME` # base name of program ORIGDIR=`pwd` # original directory (builtin) PROGDIR=`cd $PROGDIR && pwd || echo $PROGDIR` # program directory PUBLIC=$(/sbin/getcfg Public path -f /etc/config/smb.conf) # get Public path #VOLROOT=$(cd $SHAREPUBLIC ; cd .. ; pwd) # get volume path QPKG_CONF=/etc/config/qpkg.conf ROOTILS=`/sbin/getcfg ${MY_QPKG_NAME} Install_Path -d "$PROGDIR" -f $QPKG_CONF` PATH="/bin:/usr/bin:/sbin:/usr/sbin:$PATH" ; export PUBLIC ROOTILS PATH if [ $DEBUG -eq 1 ]; then echo -e "$PROGNAME:-- ORIGDIR: (executed from) \033[36m$ORIGDIR\033[0m" echo -e "$PROGNAME:-- PROGDIR: (where m i?) \033[36m$PROGDIR\033[0m" echo -e "$PROGNAME:-- PUBLIC SHARE: (smb.conf) \033[36m$PUBLIC\033[0m" echo -e "$PROGNAME:-- ROOTILS: (get from qpkg conf) \033[36m$ROOTILS\033[0m" fi ## Common Paths ## ########################################################### COMMONS ####### DELEGATE="$ROOTILS/smsgateway/sendsms" # Mail delegate (SMS gateway) MAILSENDER="/usr/sbin/ssmtp" # SMTP mail sender MAILFILE="/tmp/ssmtp.tmp" # Temporary mail file SH_EXEC="$PUBLIC/mailsender.log" # Cmds execution log LOG_DELEGATE="$PUBLIC/maildelegate.log" # Delegated execution log [ -f $MAILFILE ] && rm -f $MAILFILE ## Make unique message ID from random numbers ## ########################################################### RANDOMS ####### DATESTAMP="`date '+%Y%m%d%H%M%S'`" # Get current date and time MID_RAND=`md5sum <<EOF $RANDOM EOF` # Generate random string MID="`echo $MID_RAND | awk '// { print $1 }'`" # Get exact str from MID_RAND ## Parse STDIN (mail content), adds custom header string and save msg to file ## ########################################################### PARSE MAIL #### { echo "Message-ID: <$DATESTAMP.$MID@syndicat.pl>"; while IFS= read LINE; do echo ${LINE} done } > $MAILFILE # prints modified mail content to output file ## Send E-mail! ## ########################################################### PARSE MAIL #### $SSMTP $@ < "$MAILFILE" # pass all arguments and content of mail to sender RETVAL=$? # get Sender Exit status code ## Write Debug ## ########################################################### DEBUG ######### if [ $DEBUG -eq 1 ]; then echo "[SENDER] $SSMTP $@" >> $SH_EXEC # Write args passed to sender echo "[STDIN] ----------------------------------------" >> $SH_EXEC cat "$MAILFILE" >> $SH_EXEC # Write modified mail to log echo "[END--] ----------------------------------------" >> $SH_EXEC echo ":-----STDIN `cat $MAILFILE` ------ENDIN :-----ARGUMENTS $@ ------END OF DELEGATES :-----DUMP FROM DELEGATE EXECUTION:" >> $LOG_DELEGATE # Write delegates fi ## Mail content delegate ## ########################################################### DELEGATE ###### if [ -f "$DELEGATE" ]; then if [ $DEBUG -eq 1 ]; then echo "sh $DELEGATE $@ < $MAILFILE >> ${LOG_DELEGATE}" sh $DELEGATE $@ < $MAILFILE >> ${LOG_DELEGATE}.tmp cat ${LOG_DELEGATE}.tmp ; cat ${LOG_DELEGATE}.tmp >> ${LOG_DELEGATE} rm -f ${LOG_DELEGATE}.tmp else sh $DELEGATE $@ < $MAILFILE fi _RETVAL=$? else RETVAL=1 echo -e "[ \033[91mSENDMAIL \033[91mERROR\033[0m ] \033[91mDelegate program file not found.\033[0m" echo -e "[ \033[33mEXECUTIVE PATH\033[0m ] ! path error: \033[33m${DELEGATE}\033[0m ($0:$LINENO)" fi [ $RETVAL -eq 0 ] && RETVAL=$_RETVAL #rm -rf $MAILFILE # Remove temporary file exit $RETVAL
- Piszemy installer naszego zmodyfikowanego sendmaila. A więc tworzymy plik:
Bash:
touch install-sendmail.sh chmod +x install-sendmail.sh # edytujemy zawartosc pliku vi install-sendmail.sh
- Wklejamy poniższy kod:
Bash:#!/usr/bin/env sh : ${DEBUG:=0} ## ########################################################################### ## SENDMAIL REPLACER ## ########################################################################### ## Version: v1.0 ## Author: Silas Mariusz ## Contact: silas [-_-] qnap.com | silas [-_-] qnapclub.pl ## Web: https://forum.qnap | https://forum.qnap.com ## ########################################################################### ## Get my name and locate me ## ########################################################### INITIAL ####### PROGNAME=`type $0 | awk '{print $3}'` # search for executable on path PROGDIR=`dirname $PROGNAME` # extract directory of program PROGNAME=`basename $PROGNAME` # base name of program ORIGDIR=`pwd` # original directory (builtin) PROGDIR=`cd $PROGDIR && pwd || echo $PROGDIR` # program directory PATH="/bin:/usr/bin:/sbin:/usr/sbin:$PATH" ; export PUBLIC ROOTILS PATH ## Replace sendmail ## ########################################################### INITIAL ####### [ -x "/usr/sbin/sendmail" ] && rm /usr/sbin/sendmail # Delete old sendmail sync ; sleep 1 [ $DEBUG -eq 1 ] && echo "copy: $PROGDIR/sendmail-mod > /usr/sbin/sendmail" cp -f $PROGDIR/sendmail-mod /usr/sbin/sendmail # Copy new sendmail RETVAL=$? if [ $RETVAL -eq 0 ]; then echo "Sendmail program installed successfully." else echo -e "[ -- -\033[91mERROR!\033[0m- -- ] Sendmail install failed! ($0:$LINENO)" fi
Artykuł niekompletny - cdn.!
Uwaga!
W związku z opublikowaniem rozwiązania powiadomień za pomocą metody pośredniczej, artykuł zaniechany. https://forum.qnap.net.pl/threads/serwer-smsc-powiadomienia-o-alertach-bramki-sms.3684/