隐藏在办公室打印机中的GSM基站


GSM基站

世界各地的特殊服务和情报部门都使用伪基站(IMSI陷阱,美国人称为StingRay),它们以被动或主动模式工作在被动模式下,伪造站仅分析来自周围基站的信号。当设备进入活动模式时,它会更加有趣。在这种情况下,IMSI陷阱会迫使周围的蜂窝客户端设备连接到自身,从而使它们与运营商的基站(MTS,VimpelCom等)断开连接。该任务是通过广播比周围站点更强大的信号来执行的(有关虚假基站操作的更多详细信息,请参见文章“ Cell-Site Simulator的勇敢新世界” (阿尔巴尼法学院:11-12。土井:10.2139 / ssrn.2440982)。

伪基站不仅用于特殊服务,还用于其他人。例如,在先生的最后一个季节机器人黑客正好在联邦调查局办公室安装了一个毫微微蜂窝基站(一种低功耗的微型蜂窝通信站),有机会听他们的谈话。在业务中,竞争对手可以使用这样的设备来静静地听对方的对话。在俄罗斯,Natalya Kasperskaya 建议在商业公司的办公室中安装间谍毫微微小区,以便管理层可以平静地记录员工与访客之间的对话。


该设备已连接到伪造的PRISM基站:信标架。作为研究项目的一部分,该电台将有关连接的通知发送到订户的电话。特殊服务的实际基础结构无需发送通知即可工作,

这种小工具在现代非常流行,因为如此多的人不断使用蜂窝通信,通过这些渠道传输机密信息,而没有使用端到端加密。通过电话号码识别人员非常方便。

系列英雄先生。机械手将飞蜂窝放在路由器旁边的桌子下面。显然,以这种形式,它不能长时间工作,因为清洁工或弯腰的清洁工或早或晚会注意到“额外”设备。此外,毫微微小区的范围非常小,因此不太可能为相邻楼层的订户设备中断真实基站的信号。保证可以工作,除非在同一办公室,然后再幸运。

要解决此缺陷,办公室需要安装功能更强大的基站。但是如何伪装呢?新西兰工程师朱利安·奥利弗(Julian Oliver)提出了一个极好的解决方案。他设计了伪装成HP办公打印机基站

在街道上,基站将自己伪装成环境物体- 树木或灯笼


蜂窝站伪装成一棵棕榈树。摩洛哥马拉喀什


由于某种原因,一个伪装成灯笼的牢房站在一个真正的灯笼旁边。英国米尔顿·凯恩斯(Milton Keynes)

惠普Laserjet 1320办公打印机看起来像路灯一样自然。他不会引起怀疑。至少只要它继续正常工作即可。出于演示目的,在Oliver项目中,将打印机配置为自动打印有关截获的呼叫和SMS消息的元数据以及这些消息的文本。



作者详细解释了伪基站的工作原理。 BladeRF可编程SDR收发器放置在打印机外壳中(此精美的设备已在Habré上进行了描述)。在照片中,它固定在右上角。收发器连接到微型Raspberry Pi 3板(左下),所有黑客电子设备都连接到打印机的主板(照片中最大的板)。



为了获得电源,使用了车载USB适配器,该适配器将打印机的21-22 V转换为5 V,这是收发器和树莓所必需的。通常将此类适配器插入汽车的点烟器(12-24 V)中,以为便携式电子设备供电。



盒式磁带仓经过了稍微修改,以适合通过SMA电缆连接到BladeRF收发器的两个全向天线(TX和AX)。

该作品的作者说,他们选择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

另一个脚本会随机选择一个连接到基站的电话号码,然后调用它,然后播放Stevie Wonder的经典歌曲“我刚刚打电话说我爱你”

#!/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

祝您实验顺利!

Source: https://habr.com/ru/post/zh-CN398893/


All Articles