Как стать автором
Обновить

Базовую станцию GSM спрятали в офисном принтере

Время на прочтение5 мин
Количество просмотров42K

Базовая станция GSM

Спецслужбы и разведка в разных странах мира используют фальшивые базовые станции (IMSI-ловушки, у американцев называются StingRay), которые работают в пассивном или активном режиме. В пассивном режиме фальшивая станция просто анализирует сигнал с окружающих базовых станций. Гораздо интереснее, когда устройство переводят в активный режим. В этом случае IMSI-ловушка заставляет подключиться к себе окружающие клиентские устройства сотовой связи, отключая их от базовой станции оператора (МТС, «Вымпелком» и т.д.). Задача осуществляется с помощью трансляции более мощного сигнала, чем окружающие станции (более подробно о работе фальшивых базовых станций см. в статье "The Brave New World of Cell-Site Simulators" (Albany Law School: 11–12. doi: 10.2139/ssrn.2440982).

Фальшивые базовые станции используют не только спецслужбы, но и другие лица. Например, в последнем сезоне Mr. Robot хакеры установили фемтосоту (маломощная и миниатюрная станция сотовой связи) прямо в офисе ФБР, получив возможность прослушивать их разговоры. В бизнесе конкуренты могут использовать такое устройство, чтобы незаметно прослушивать разговоры другой стороны. В России Наталья Касперская предлагает устанавливать шпионские фемтосоты в офисах коммерческих компаний, чтобы руководство могло спокойно записывать разговоры сотрудников и посетителей.


Аппарат подключился к фальшивой сотовой станции PRISM: The Beacon Frame. В рамках исследовательского проекта станция высылает уведомление о подключении на телефон абонента. Настоящая инфраструктура спецслужб работает без рассылки уведомлений

Подобные гаджеты очень востребованы в современную эпоху, потому что очень многие люди постоянно пользуются сотовой связью, передавая по этим каналам конфиденциальную информацию, не используя end-to-end шифрование. Очень удобно идентифицировать людей по их телефонным номерам.

Герои сериала Mr. Robot положили фемтосоту под стол рядом с маршрутизатором. Очевидно, что в таком виде она не может работать долго, потому что рано или поздно «лишний» прибор заметит уборщица или случайный агент, который наклонится вниз. К тому же, фемтосота обладает совсем небольшим радиусом действия, так что вряд ли она сможет перебить сигнал настоящей базовой станции для абонентских устройств на соседних этажах. Она гарантированно будет работать разве что в пределах одного офиса, а дальше — как повезёт.

Чтобы исправить этот недостаток, в офисе требуется устанавливать более мощную базовую станцию. Но как её замаскировать? Отличное решение предложил новозеландский инженер Джулиан Оливер (Julian Oliver). Он разработал конструкцию базовой станции, замаскированной под офисный принтер HP.

На улицах базовые станции маскируют под объекты окружающей среды — деревья или фонари.


Сотовая станция, плохо замаскированная под пальму. Марракеш, Марокко


Сотовая станция, замаскированная под фонарь, зачем-то поставлена рядом с настоящем фонарём. Милтон-Кинс, Великобритания

Лазерный принтер Hewlett-Packard Laserjet 1320 для офисного пространства выглядит так же естественно, как фонарь на улице. Он не вызовет подозрений. По крайней мере до тех пор, пока продолжает исправно работать. В демонстрационных целях в проекте Оливера принтер настроен на автоматическую печать метаданных о перехваченных звонках и сообщениях SMS, вместе с текстом этих сообщений.



Автор подробно разъяснил, как устроена фальшивая базовая станция. В корпус принтера поместили программируемый SDR-трансивер BladeRF (об этом замечательном приборе рассказывали на Хабре). На фото он закреплён справа вверху. Трансивер подключается к миниатюрной плате Raspberry Pi 3 (слева внизу), и вся хакерская электроника подключена к материнской плате принтера (самая большая плата на фотографии).



Для питания используется автомобильный USB-адаптер, преобразующий принтерные 21−22 В в 5 В, необходимые для трансивера и «малинки». Такие адаптеры обычно вставляют в прикуриватель автомобиля (12−24 В) для питания портативной электроники.



Отсек для картриджа слегка модифицирован, чтобы поместились две всенаправленные антенны (TX и AX), подключенные кабелем SMA к трансиверу BladeRF.

Автор работы говорит, что выбрали принтер Hewlett-Packard Laserjet 1320 по нескольким причинам. Во-первых, у него поразительно неприметный внешний вид — совершенно безликий дизайн, который не привлекает к себе внимания. Во-вторых, внутренние полости в корпусе идеально подходят для размещения всей электроники и кабелей. Ни одна деталь не выходит наружу и не видна извне, кроме стандартного кабеля питания. При подключении USB-адаптера в стандартный разъём Hewlett-Packard Laserjet 1320 нормально функционирует как обычный офисный принтер.

Raspberry Pi 3 выбрали после безуспешных попыток обеспечить стабильную работу программы-контроллера базовых станций YateBTS под Intel Edison, Beaglebone Black и даже I-MX6 Marsboard. В отличие от древней OpenBTS, программа YateBTS более требовательна к производительности процессора.

Программное обеспечение фальшивой базовой станции в принтере работает поверх открытого кода YateBTS. В демонстрационных целях разработано несколько скриптов. Например, один из них фильтрует лог, формирует документ PDF и отправляет его на печать.

#!/bin/bash

readonly FH=/home/pi/yate.log
rm -f $FH
# Start the BTS, log to $FH and background
yate 2>&1 -l $FH &
sleep 1
echo "Starting up..."
last=" "

while true;
    do
        # Poll every 10 seconds
        sleep 10
        # Check log for new sniffed 'call route' entries and do some subbing
        cur=$(cat $FH | grep -A 16 "Sniffed\ 'call.route'" | sed -e "s/param\['//" \
        -e "s/'\]//" -e 's/thread.*//' -e 's/time\=[0-9].*//' \
        -e 's/\ data=(.*//' -e 's/\ retval=.*//' \
        -e 's/\ tmsi.*//' -e 's/ybts/Stealth\ Cell\ Tower/' \
        -e 's/Sniffed/Monitored\ =/' -e '/^\s*$/d' \
        -e 's/^\s*//' | tail -n 13)
        if [ "$cur" != "$last" ]; then
            if [ ${#cur} -gt 1 ]; then 
                echo "New SMS events detected"
                # Test to see if an IMSI is in the string. If not, look it up and put it in
                if [[ $cur != *imsi* ]]; then
                    caller=$(echo "$cur" | grep "caller" | awk '{ print $3 }' | sed "s/'//g" \
                    | tr -cd '[:print:]')
                    imsi=$(cat /usr/local/etc/yate/tmsidata.conf | grep "$caller" \
                    | cut -d '=' -f 1)
                    cur=$(echo "$cur" | sed -e "s/\ called\ .*/imsi\ =\ '$imsi'/" )
                fi
                # Make it all uppercase
                event=$(echo -e \\n"$cur" | tr 'a-z' 'A-Z')
                echo "printing file..."
                echo "$event" > printme
                # Format a postscript file with enscript
                enscript -r --header='SMS EVENT RECORD|%W|%* UTC' -i2cm --margins=10:10:30:10 \
                -o printme.ps -f Courier@15/12 printme
                # Convert to PDF
                ps2pdfwr printme.ps printme.pdf
                # Send it to the print queue for immediate processing
                lp -U pi -o a4 -q 100 -d hp_LaserJet_1320_2 printme.pdf 
            fi
            last=$cur
        fi
done

Другой скрипт случайным образом выбирает один из телефонных номеров, которые подключились к базовой станции, звонит ему и воспроизводит классический хит Стиви Уандера "I Just Called To Say I Love You".

#!/bin/bash

readonly HOST=127.0.0.1
readonly PORT=5038
readonly DATA=/usr/local/share/yate/sounds/stevie.au
readonly TMSI=/usr/local/etc/yate/tmsidata.conf
readonly CC=49 #MSISDN prefix, matching that of definition in yate conf.

callone () {
  # Play "I Just Called To Say I Love You" by Stevie Wonder, on pickup 
  echo "call wave/play/$DATA $mt" | netcat -i 1 -q 1 $HOST $PORT
  # Or, setup channel and route to IAX/SIP
  # echo "call 'iax/iax:$PORT@11.22.33.44/$PORT' $mt" | netcat -q 1 $HOST $PORT
}

callall() {
  for mt in ${UES[@]} #override $mt
    do
      echo "calling $mt"
      callone
  done
}

while true;
  do

    tmsilen=$(wc -l $TMSI | awk '{ print $1 }')
    ues=($(cat $TMSI | grep -A $tmsilen ues | sed 's/\[ues\]//' | cut -d ',' -f 3))
    if [ ! -z $ues ]; then
      ueslen=${#ues}
      RANGE=$ueslen
      select=$RANDOM
      let "select%=$RANGE"
      mt=${ues[$select]} 
      callone
    fi
    sleep 30
done

Скомпилированные бинарники для Raspberry Pi 3: yate_r-pi3_4.4.11-v7_debian-8.0.tar.gz.

Удачи в экспериментах!
Теги:
Хабы:
Всего голосов 33: ↑31 и ↓2+29
Комментарии77

Публикации

Истории

Ближайшие события

2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань