Добавляем GPRS в домашнюю GSM сеть

в 10:37, , рубрики: calypso, gsm, infosec, open source, osmocom, Блог компании PentestIT, информационная безопасность, Разработка систем передачи данных

Третья статья из цикла покажет как исследовать работу пакетных данных в сетях GSM при помощи Osmocom. Другими словами мы будем раздавать интернет с ноутбука абонентам нашей домашней сети на основе двух osmocombb-совместимых телефонов и анализировать TCP/IP трафик.

Добавляем GPRS в домашнюю GSM сеть - 1

Подготовка

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

Для тех, кто еще не начинал строить инфраструктуру для домашней сети, я предлагаю не собирать все компоненты osmocom вручную, а попробовать установить уже готовые nightly builds пакеты. Они доступны для дистрибутивов Debian и Ubuntu. Репозитории указаны по ссылке выше. Теоретически установка таким методом должна проходить проще и без особых проблем, но сам я этого делать не пробовал.

Теория

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

Добавляем GPRS в домашнюю GSM сеть - 2

Разберем по порядку.

PDCH — это Packet Data Channel. Для передачи пакетных данных должен использоваться особый тип логического канала. До сих пор мы использовали TCH/H для обслуживания голосовых вызовов. Нам потребуется заменить TCH/H на PDCH. Мы потеряем возможность звонить, но зато нам не понадобиться докупать еще телефоны.

nanoBTS — мы будем использовать OsmoBTS в связке с двумя osmocombb-совместимыми телефонами для создания базовой станции, как и делали раньше.

osmo-nitb — Здесь потребуется минимальная конфигурация для активации GPRS сервиса, а так же придется пересобрать osmo-nitb с поддержкой osmo-sgsn.

osmo-sgsn — Serving GPRS Support Node. По сути ядро GPRS сети, аналог MSC для голосовых вызовов.
Скопирую из Википедии список функций:

  • контроль доставки пакетов данных пользователям;
  • взаимодействие с реестром собственных абонентов сети HLR или аутентификация (проверка разрешения на запрос пользователями услуги); механизм совпадает с механизмом аутентификации в GSM;
  • мониторинг находящихся в режиме online пользователей;
  • преобразование кадров GSM в форматы, используемые протоколами TCP/IP глобальной компьютерной сети Internet;
  • регистрация или «прикрепление» (attachment) абонентов, вновь «появившихся» в зоне действия сети;
  • шифрование данных; алгоритм шифрования в технологии GPRS (GEA1, GEA2, GEA3) отличаются от алгоритмов шифрования в GSM (A5/1, A5/2, A5/3), но разработаны на их основе;
  • сбор поступающей биллинговой информации, пересылка её в главный офис и т. п.

ggsn — GPRS Gateway Support Node. Данный узел стоит на границе между GPRS Core network (GTP) и Интернетом. Легко собирается и подключается к остальным модулям osmocom.

На данной схеме пропущен еще один компонент PCU — Packet Control Unit.
PCU выполняет некоторые функции BSC, но только для пакетных данных. Для его реализации будет использован osmo-pcu.

На схеме ниже PCU присутствует:

Добавляем GPRS в домашнюю GSM сеть - 3

Модифицируем сеть

Напоминаю, что мои конфигурационные файлы хранятся в /root/.osmocom. Как и в первой статье они будут прикреплены в конце. Прежде чем использовать конфигурационные файлы, нужно ввести корректные IP адреса вместо ВИРТУАЛЬНЫЙ_IP и ОСНОВНОЙ_IP, а так же GSM900 или DCS1800 вместо ДИАПАЗОН и номер ARFCN вместо КАНАЛ.

Предполагается, что все компоненты будут работать на одном устройстве, так что нам потребуется создать виртуальный интерфейс для сетевого адаптера. IP адреса для GGSN и SGSN должны отличаться. Моя домашняя сеть 192.168.1.0/24, IP адрес моего основного Wi-Fi интерфейса 192.168.1.37 и IP адрес 192.168.1.250 не занят, так что я задаю его как виртуальный.

ifconfig wlan0:0 192.168.1.250

Так же вам потребуется разрешить транзитные пакеты и настроить NAT, так как мы будем «раздавать» Интернет всем абонентам сети. (Сеть 192.168.0.0/24 менять не нужно, она будет закреплена за интерфейсом tun0, который появится при запуске всех компонентов GPRS инфраструктуры)

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -s 192.168.0.0/24 -t nat -o wlan0 -j MASQUERADE

Понятно, что такая конфигурация не переживет перезагрузки, но есть способы, которые легко ищутся в поисковике, чтобы закрепить эти настройки.

Устанавливаем osmo-pcu

git clone git://git.osmocom.org/osmo-pcu.git
cd osmo-pcu
autoreconf -i
./configure
make
make install
cd ..
ldconfig

osmo-pcu -h

Конфигурируем osmo-nitb

Запускаем osmo-nitb, подключаемся к VTY и выполняем команды.

telnet 127.0.0.1 4242
en
conf t
network
bts 0
gprs mode gprs
gprs routing area 0
gprs cell bvci 2
gprs nsei 101
gprs nsvc 0 nsvci 101
gprs nsvc 0 local udp port 23000
gprs nsvc 0 remote udp port 23000
gprs nsvc 0 remote ip 192.168.1.250
trx 0
timeslot 1
phys_chan_config pdch
end
write file

Останавливаем osmo-nitb.

Устанавливаем ggsn

git clone git://git.osmocom.org/openggsn.git
cd openggsn
autoreconf -i
./configure
make
make install
ldconfig

Устанавливаем osmo-sgsn

Установите зависимости и пересоберите osmo-nitb чтобы включить поддержку osmo-sgsn.

apt-get install libc-ares-dev
cd openbsc/openbsc/
make clean
autoreconf -fi
./configure
make
make install
ldconfig
cd ../..

ggsn -h
osmo-sgsn -h

Настраиваем osmo-sgsn

cd /root/.osmocom
touch osmo_sgsn.cfg
osmo-sgsn
telnet localhost 4245
en
conf t
sgsn
gtp local-ip 192.168.1.250
ggsn 0 remote-ip 192.168.1.37
ggsn 0 gtp-version 1
auth-policy accept-all
end
conf t
ns
encapsulation udp local-ip 192.168.1.250
encapsulation udp local-port 23000
encapsulation framerelay-gre enabled 0
end
write file
exit

Настраиваем ggsn

cd /root/.osmocom
touch ggsn.conf
vi ggsn.conf
#TAG: listen
# Specifies the local IP address to listen to
listen 192.168.1.37
# TAG: dynip
# Dynamic IP address pool.
# Used for allocation of dynamic IP address when address is not given
# by HLR.
# If this option is not given then the net option is used as a substitute.
# dynip 192.168.254.0/24

# TAG: pcodns1/pcodns2
# Protocol configuration option domain name system server 1 & 2.
pcodns1 8.8.8.8
pcodns2 8.8.4.4

Настраиваем osmo-pcu

cd /root/.osmocom
touch osmo-pcu.conf
osmo-pcu -c /root/.osmocom/osmo-pcu.conf
telnet localhost 4240
en
conf t
pcu
flow-control-interval 10
cs 2
alloc-algorithm dynamic
alpha 0
gamma 0
write file
exit

Возможные проблемы

Говорят, что могут быть проблемы с DNS трафиком, тогда рекомендуется добавить еще одно правило в iptables. У меня таких проблем не возникало.

iptables -t nat -I PREROUTING -i tun0 -p udp --dport 53 -j DNAT --to-dest 8.8.8.8

Так же убедитесь, что у вашего устройства добавлена хотя бы одна APN точка доступа в настройках GPRS, иначе телефон может вовсе не пытаться получить GPRS сервис от оператора.

Запуск

Запускаем osmo-nitb

cd /root/.osmocom
osmo-nitb -s -c /root/.osmocom/open-bsc.cfg -l /root/.osmocom/hlr.sqlite3 -P -C --debug=DSQL:DLSMS:DRLL:DCC:DMM:DRR:DMSC:DHO:DGPRS:DNS:DLLC:DCTRL

Запускаем ggsn

cd /root/.osmocom
ggsn -c /root/.osmocom/ggsn.conf -f -d

Запускаем sgsn

cd /root/.osmocom
osmo-sgsn -c /root/.osmocom/osmo_sgsn.cfg -d DRLL:DCC:DMM:DRR:DNM:DMSC:DHO:DGPRS:DNS:DLLC:DCTRL

Запускаем трансиверы и osmo-bts

cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -s /tmp/osmocom_l2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99

cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB1 -s /tmp/osmocom_l2.2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99

cd /root/osmocom/trx/src/host/layer23/src/transceiver/
./transceiver -a SCH_КАНАЛ -2 -r 99

cd /root/.osmocom
osmo-bts-trx --debug DRSL:DOML:DLAPDM -r 99

Вместо SCH_КАНАЛ нужно как и раньше задать ARFCN где располагается beacon channel коммерческой базовой станции с устойчивым сигналом.

Запускаем osmo-pcu

cd /root/.osmocom
osmo-pcu -c /root/.osmocom/osmo-pcu.conf

Вы должны увидеть в консоли osmo-pcu нечто подобное

Добавляем GPRS в домашнюю GSM сеть - 4

А в консоли osmo-nitb это

Добавляем GPRS в домашнюю GSM сеть - 5

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

Теперь, при подключении к сети вы должны увидеть подобные записи в консоли с osmo-pcu

Добавляем GPRS в домашнюю GSM сеть - 6

И запись об авторизации в консоли osmo-sgsn

Добавляем GPRS в домашнюю GSM сеть - 7

А при активации GRPS сервиса в телефоне вы увидите, что передача данных началась

Добавляем GPRS в домашнюю GSM сеть - 8

Обратите внимание на тот факт, что скорость передачи данных в GPRS очень низкая, в то же время современные телефоны при получении доступа к сети тут же начинают процесс проверки обновлений, почты, новостей. Все ваши приложения начинают обновлять свои данные. Это может привести к тому, что вам будет затруднительно открыть что-то в браузере, так как, помимо низкой пропускной способности, могут происходить потери пакетов.
Вы можете исправить положение ограничив доступ на машине, которая раздает Интеренет для подсети 192.168.0.0/24 (tun0), оставив доступными только некоторые ресурсы.

Анализ трафика в Wireshark

Чтобы wireshark автоматически разбирал GPRS трафик, нужно в настройках протокола GPRS-NS добавить порт 23000.

Добавляем GPRS в домашнюю GSM сеть - 9

Подключившись к сети, я буду прослушивать интерфейс wlan0 и изучать трафик.

Добавляем GPRS в домашнюю GSM сеть - 10

Мы видим GSM пакеты (обратите внимание на ASCII представление данных. Видно, что это HTTP запрос)

Добавляем GPRS в домашнюю GSM сеть - 11

Здесь можно найти так же классический TCP/IP трафик, например HTTP или DNS запросы. Можно использовать фильтр gprs-ns. Обратите внимание на вложенность TCP/IP протоколов в GSM протоколы.

DNS
Добавляем GPRS в домашнюю GSM сеть - 12

HTTP
Добавляем GPRS в домашнюю GSM сеть - 13

Естественно, нам доступен и классический TCP/IP трафик, который уже идет непосредственно от wlan0 в Интернет

Добавляем GPRS в домашнюю GSM сеть - 14

И на это этапе мы получаем полный контроль над трафиком и можем провести полный спектр MitM атак против абонентов нашей GSM сети.

В случае создания фейковой базовой станции, подключившийся абонент становится недоступен для звонков извне и в стандартной конфигурации сам не может больше позвонить кому-то из своей телефонной книги, но зато у него будет доступен Интернет и высока вероятность, что он попытается им воспользоваться. Здесь он и может быть атакован злоумышленником.

В следующей статье мы рассмотрим практические примеры атак на абонентов GSM сети, подключившихся к поддельной базовой станции.

Конфигурационные файлы

ggsn.conf

#TAG: listen
# Specifies the local IP address to listen to
listen ОСНОВНОЙ_IP
# TAG: dynip
# Dynamic IP address pool.
# Used for allocation of dynamic IP address when address is not given
# by HLR.
# If this option is not given then the net option is used as a substitute.
# dynip 192.168.254.0/24

# TAG: pcodns1/pcodns2
# Protocol configuration option domain name system server 1 & 2.
pcodns1 8.8.8.8
pcodns2 8.8.4.4

open-bsc.cfg

!
! OpenBSC (0.15.0.796-8254) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level rll everything
logging level cc everything
logging level mm everything
logging level rr everything
logging level rsl everything
logging level nm everything
logging level mncc notice
logging level pag notice
logging level meas notice
logging level sccp notice
logging level msc notice
logging level mgcp notice
logging level ho notice
logging level db notice
logging level ref notice
logging level gprs debug
logging level ns info
logging level bssgp debug
logging level llc debug
logging level sndcp debug
logging level nat notice
logging level ctrl notice
logging level smpp debug
logging level filter debug
logging level ranap debug
logging level sua debug
logging level pcu debug
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
log file OsmoBSC.log
logging filter all 0
logging color 1
logging print category 0
logging timestamp 1
logging level all info
logging level rll notice
logging level cc notice
logging level mm notice
logging level rr notice
logging level rsl notice
logging level nm info
logging level mncc notice
logging level pag notice
logging level meas notice
logging level sccp notice
logging level msc notice
logging level mgcp notice
logging level ho notice
logging level db notice
logging level ref notice
logging level gprs debug
logging level ns info
logging level bssgp debug
logging level llc debug
logging level sndcp debug
logging level nat notice
logging level ctrl notice
logging level smpp debug
logging level filter debug
logging level ranap debug
logging level sua debug
logging level pcu debug
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
stats interval 5
!
line vty
no login
!
e1_input
e1_line 0 driver ipa
e1_line 0 port 0
no e1_line 0 keepalive
network
network country code 1
mobile network code 1
short name Pentestit
long name Pentestit
auth policy accept-all
authorized-regexp .*
location updating reject cause 13
encryption a5 0
neci 1
paging any use tch 0
rrlp mode none
mm info 1
handover 0
handover window rxlev averaging 10
handover window rxqual averaging 1
handover window rxlev neighbor averaging 10
handover power budget interval 6
handover power budget hysteresis 3
handover maximum distance 9999
timer t3101 10
timer t3103 0
timer t3105 40
timer t3107 0
timer t3109 0
timer t3111 0
timer t3113 60
timer t3115 0
timer t3117 0
timer t3119 0
timer t3122 10
timer t3141 0
dyn_ts_allow_tch_f 0
subscriber-keep-in-ram 0
bts 0
type sysmobts
description calypso
band ДИАПАЗОН
cell_identity 0
location_area_code 1
base_station_id_code 63
ms max power 0
cell reselection hysteresis 4
rxlev access min 0
periodic location update 30
radio-link-timeout 32
channel allocator ascending
rach tx integer 9
rach max transmission 7
channel-descrption attach 1
channel-descrption bs-pa-mfrms 5
channel-descrption bs-ag-blks-res 1
early-classmark-sending forbidden
ip.access unit_id 1801 0
oml ip.access stream_id 255 line 0
neighbor-list mode automatic
codec-support fr amr
amr tch-h modes 0
amr tch-h start-mode 1
gprs mode gprs
gprs 11bit_rach_support_for_egprs 0
gprs routing area 0
gprs network-control-order nc0
gprs cell bvci 2
gprs cell timer blocking-timer 3
gprs cell timer blocking-retries 3
gprs cell timer unblocking-retries 3
gprs cell timer reset-timer 3
gprs cell timer reset-retries 3
gprs cell timer suspend-timer 10
gprs cell timer suspend-retries 3
gprs cell timer resume-timer 10
gprs cell timer resume-retries 3
gprs cell timer capability-update-timer 10
gprs cell timer capability-update-retries 3
gprs nsei 101
gprs ns timer tns-block 3
gprs ns timer tns-block-retries 3
gprs ns timer tns-reset 3
gprs ns timer tns-reset-retries 3
gprs ns timer tns-test 30
gprs ns timer tns-alive 3
gprs ns timer tns-alive-retries 10
gprs nsvc 0 nsvci 101
gprs nsvc 0 local udp port 23000
gprs nsvc 0 remote udp port 23000
gprs nsvc 0 remote ip ВИРТУАЛЬНЫЙ_IP
gprs nsvc 1 nsvci 0
gprs nsvc 1 local udp port 0
gprs nsvc 1 remote udp port 0
gprs nsvc 1 remote ip 0.0.0.0
no force-combined-si
trx 0
rf_locked 0
arfcn КАНАЛ
nominal power 23
max_power_red 99
rsl e1 tei 0
timeslot 0
phys_chan_config CCCH+SDCCH4
hopping enabled 0
timeslot 1
phys_chan_config PDCH
hopping enabled 0
timeslot 2
phys_chan_config TCH/H
hopping enabled 0
timeslot 3
phys_chan_config TCH/H
hopping enabled 0
timeslot 4
phys_chan_config TCH/H
hopping enabled 0
timeslot 5
phys_chan_config TCH/H
hopping enabled 0
timeslot 6
phys_chan_config TCH/H
hopping enabled 0
timeslot 7
phys_chan_config TCH/H
hopping enabled 0
mncc-int
default-codec tch-f amr
default-codec tch-h amr
nitb
subscriber-create-on-demand
assign-tmsi
osmo_sgsn.cfg

!
! OsmoSGSN (0.15.0.796-8254) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level mm notice
logging level pag notice
logging level meas notice
logging level ref notice
logging level gprs debug
logging level ns info
logging level bssgp debug
logging level llc debug
logging level sndcp debug
logging level slhc debug
logging level ranap debug
logging level sua debug
logging level v42bis debug
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
stats interval 5
!
line vty
no login
!
ns
timer tns-block 3
timer tns-block-retries 3
timer tns-reset 3
timer tns-reset-retries 3
timer tns-test 30
timer tns-alive 3
timer tns-alive-retries 10
encapsulation udp local-ip ВИРТУАЛЬНЫЙ_IP
encapsulation udp local-port 23000
encapsulation framerelay-gre enabled 0
bssgp
sgsn
gtp local-ip ВИРТУАЛЬНЫЙ_IP
ggsn 0 remote-ip ОСНОВНОЙ_IP
ggsn 0 gtp-version 1
auth-policy accept-all
gsup oap-id 0
! apn * ggsn 0
no cdr filename
cdr interval 600
timer t3312 600
timer t3322 6
timer t3350 6
timer t3360 6
timer t3370 6
timer t3313 30
timer t3314 44
timer t3316 44
timer t3385 8
timer t3386 8
timer t3395 8
timer t3397 8
no compression rfc1144
no compression v42bis
osmo-bts.cfg

!
! OsmoBTS (0.4.0.463-e91c) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level pcu notice
logging level ho notice
logging level trx notice
logging level loop notice
logging level abis notice
logging level rtp notice
logging level sum notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
log file OsmoBTS.log
logging filter all 0
logging color 1
logging print category 0
logging timestamp 1
logging level all everything
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level pcu notice
logging level ho notice
logging level trx notice
logging level loop notice
logging level abis notice
logging level rtp notice
logging level sum notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
line vty
no login
!
e1_input
e1_line 0 driver ipa
e1_line 0 port 0
no e1_line 0 keepalive
phy 0
osmotrx ip 127.0.0.1
osmotrx fn-advance 30
osmotrx rts-advance 5
instance 0
slotmask 1 1 0 0 0 0 0 0
bts 0
band ДИАПАЗОН
ipa unit-id 1801 0
oml remote-ip 127.0.0.1
rtp jitter-buffer 0
paging queue-size 200
paging lifetime 0
uplink-power-target -75
min-qual-rach 50
min-qual-norm -5
ms-power-loop -65
timing-advance-loop
setbsic
trx 0
power-ramp max-initial 0 mdBm
power-ramp step-size 2000 mdB
power-ramp step-interval 1
ms-power-control dsp
phy 0 instance 0
osmo-pcu.conf

!
! Osmo-PCU (0.2.915-241f5) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level csn1 info
logging level l1if info
logging level rlcmac notice
logging level rlcmacdata notice
logging level rlcmacdl notice
logging level rlcmacul notice
logging level rlcmacsched notice
logging level rlcmacmeas info
logging level ns info
logging level bssgp info
logging level pcu notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
stats interval 5
!
line vty
no login
!
pcu
flow-control-interval 10
cs 2
cs max 4
cs threshold 10 33
cs downgrade-threshold 200
cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
mcs max 9
window-size 64 0
queue idle-ack-delay 10
queue codel
alloc-algorithm dynamic
alpha 0
gamma 0
dl-tbf-idle-time 2000

Автор: Pentestit

Источник

Поделиться

* - обязательные к заполнению поля