Базовая станция 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.
Удачи в экспериментах!